[openlayers] 01/41: Imported Upstream version 2.10+ds1

Bas Couwenberg sebastic at xs4all.nl
Fri Dec 26 02:41:30 UTC 2014


This is an automated email from the git hooks/post-receive script.

sebastic-guest pushed a commit to branch master
in repository openlayers.

commit 3e553a961ebabd98b37f3d08191319518b4415f7
Author: David Paleino <dapal at debian.org>
Date:   Fri Mar 18 21:20:41 2011 +0100

    Imported Upstream version 2.10+ds1
---
 apidoc_config/Data/ClassHierarchy.nd               |  Bin 0 -> 30562 bytes
 apidoc_config/Data/ConfigFileInfo.nd               |    1 +
 apidoc_config/Data/FileInfo.nd                     |  289 ++
 apidoc_config/Data/ImageFileInfo.nd                |  Bin 0 -> 216 bytes
 apidoc_config/Data/ImageReferenceTable.nd          |  Bin 0 -> 252 bytes
 apidoc_config/Data/IndexInfo.nd                    |  Bin 0 -> 267 bytes
 apidoc_config/Data/PreviousMenuState.nd            |  Bin 0 -> 23434 bytes
 apidoc_config/Data/PreviousSettings.nd             |  Bin 0 -> 115 bytes
 apidoc_config/Data/SymbolTable.nd                  |  Bin 0 -> 502126 bytes
 apidoc_config/Languages.txt                        |  113 +
 apidoc_config/Menu.txt                             |  480 ++
 apidoc_config/OL.css                               |   20 +
 apidoc_config/Topics.txt                           |  105 +
 art/arrows.svg                                     |  127 +
 art/layer-switcher-maximize.svg                    |  128 +
 art/layer-switcher-minimize.svg                    |  142 +
 art/marker.svg                                     |   25 +
 art/measuring-stick-off.svg                        |   36 +
 art/measuring-stick-on.svg                         |   36 +
 art/panning-hand-off.svg                           |   44 +
 art/panning-hand-on.svg                            |   44 +
 art/slider.svg                                     |   71 +
 art/zoom-world.svg                                 |  193 +
 art/zoombar.svg                                    |   73 +
 build/README.txt                                   |   14 +
 build/build.py                                     |   54 +
 build/buildUncompressed.py                         |   25 +
 build/full.cfg                                     |   32 +
 build/library.cfg                                  |   68 +
 build/license.txt                                  |   92 +
 build/lite.cfg                                     |   22 +
 doc/apidocs/files/OpenLayers-js.html               |   43 +
 doc/apidocs/files/OpenLayers/Ajax-js.html          |   65 +
 doc/apidocs/files/OpenLayers/BaseTypes-js.html     |  108 +
 .../files/OpenLayers/BaseTypes/Bounds-js.html      |   92 +
 .../files/OpenLayers/BaseTypes/Class-js.html       |   49 +
 .../files/OpenLayers/BaseTypes/Element-js.html     |   57 +
 .../files/OpenLayers/BaseTypes/LonLat-js.html      |   63 +
 .../files/OpenLayers/BaseTypes/Pixel-js.html       |   59 +
 .../files/OpenLayers/BaseTypes/Size-js.html        |   55 +
 doc/apidocs/files/OpenLayers/Console-js.html       |   75 +
 doc/apidocs/files/OpenLayers/Control-js.html       |   85 +
 .../files/OpenLayers/Control/ArgParser-js.html     |   47 +
 .../files/OpenLayers/Control/Attribution-js.html   |   47 +
 .../files/OpenLayers/Control/Button-js.html        |   42 +
 .../files/OpenLayers/Control/DragFeature-js.html   |   63 +
 .../files/OpenLayers/Control/DragPan-js.html       |   43 +
 .../files/OpenLayers/Control/DrawFeature-js.html   |   55 +
 .../OpenLayers/Control/EditingToolbar-js.html      |   43 +
 .../files/OpenLayers/Control/GetFeature-js.html    |   75 +
 .../files/OpenLayers/Control/Graticule-js.html     |   75 +
 .../OpenLayers/Control/KeyboardDefaults-js.html    |   53 +
 .../files/OpenLayers/Control/LayerSwitcher-js.html |   55 +
 .../files/OpenLayers/Control/Measure-js.html       |   57 +
 .../files/OpenLayers/Control/ModifyFeature-js.html |   84 +
 .../files/OpenLayers/Control/MouseDefaults-js.html |   47 +
 .../files/OpenLayers/Control/MousePosition-js.html |   67 +
 .../files/OpenLayers/Control/MouseToolbar-js.html  |   51 +
 .../files/OpenLayers/Control/NavToolbar-js.html    |   43 +
 .../files/OpenLayers/Control/Navigation-js.html    |   57 +
 .../OpenLayers/Control/NavigationHistory-js.html   |   69 +
 .../files/OpenLayers/Control/OverviewMap-js.html   |   75 +
 doc/apidocs/files/OpenLayers/Control/Pan-js.html   |   47 +
 .../files/OpenLayers/Control/PanPanel-js.html      |   49 +
 .../files/OpenLayers/Control/PanZoom-js.html       |   59 +
 .../files/OpenLayers/Control/PanZoomBar-js.html    |   57 +
 doc/apidocs/files/OpenLayers/Control/Panel-js.html |   69 +
 .../files/OpenLayers/Control/Permalink-js.html     |   57 +
 .../files/OpenLayers/Control/SLDSelect-js.html     |   83 +
 doc/apidocs/files/OpenLayers/Control/Scale-js.html |   47 +
 .../files/OpenLayers/Control/ScaleLine-js.html     |   47 +
 .../files/OpenLayers/Control/SelectFeature-js.html |   75 +
 .../files/OpenLayers/Control/Snapping-js.html      |   57 +
 doc/apidocs/files/OpenLayers/Control/Split-js.html |   71 +
 .../OpenLayers/Control/TransformFeature-js.html    |   88 +
 .../OpenLayers/Control/WMSGetFeatureInfo-js.html   |   62 +
 .../OpenLayers/Control/WMTSGetFeatureInfo-js.html  |   64 +
 .../files/OpenLayers/Control/ZoomBox-js.html       |   39 +
 .../files/OpenLayers/Control/ZoomIn-js.html        |   39 +
 .../files/OpenLayers/Control/ZoomOut-js.html       |   39 +
 .../files/OpenLayers/Control/ZoomPanel-js.html     |   45 +
 .../OpenLayers/Control/ZoomToMaxExtent-js.html     |   39 +
 doc/apidocs/files/OpenLayers/Events-js.html        |  125 +
 doc/apidocs/files/OpenLayers/Feature-js.html       |   47 +
 .../files/OpenLayers/Feature/Vector-js.html        |   57 +
 doc/apidocs/files/OpenLayers/Feature/WFS-js.html   |   43 +
 doc/apidocs/files/OpenLayers/Filter-js.html        |   51 +
 .../files/OpenLayers/Filter/Comparison-js.html     |   63 +
 .../files/OpenLayers/Filter/FeatureId-js.html      |   53 +
 .../files/OpenLayers/Filter/Logical-js.html        |   57 +
 .../files/OpenLayers/Filter/Spatial-js.html        |   59 +
 doc/apidocs/files/OpenLayers/Format-js.html        |   57 +
 doc/apidocs/files/OpenLayers/Format/ArcXML-js.html |   51 +
 .../OpenLayers/Format/ArcXML/Features-js.html      |   47 +
 doc/apidocs/files/OpenLayers/Format/Atom-js.html   |   55 +
 .../files/OpenLayers/Format/CSWGetDomain-js.html   |   39 +
 .../OpenLayers/Format/CSWGetDomain/v2_0_2-js.html  |   55 +
 .../files/OpenLayers/Format/CSWGetRecords-js.html  |   39 +
 .../OpenLayers/Format/CSWGetRecords/v2_0_2-js.html |   67 +
 .../files/OpenLayers/Format/Context-js.html        |   57 +
 doc/apidocs/files/OpenLayers/Format/Filter-js.html |   55 +
 .../files/OpenLayers/Format/Filter/v1-js.html      |   43 +
 .../files/OpenLayers/Format/Filter/v1_0_0-js.html  |   47 +
 .../files/OpenLayers/Format/Filter/v1_1_0-js.html  |   47 +
 doc/apidocs/files/OpenLayers/Format/GML-js.html    |   71 +
 .../files/OpenLayers/Format/GML/Base-js.html       |   57 +
 doc/apidocs/files/OpenLayers/Format/GML/v2-js.html |   43 +
 doc/apidocs/files/OpenLayers/Format/GML/v3-js.html |   43 +
 doc/apidocs/files/OpenLayers/Format/GPX-js.html    |   57 +
 .../files/OpenLayers/Format/GeoJSON-js.html        |   53 +
 doc/apidocs/files/OpenLayers/Format/GeoRSS-js.html |   63 +
 doc/apidocs/files/OpenLayers/Format/JSON-js.html   |   57 +
 doc/apidocs/files/OpenLayers/Format/KML-js.html    |   67 +
 doc/apidocs/files/OpenLayers/Format/OSM-js.html    |   53 +
 .../files/OpenLayers/Format/OWSCommon/v1-js.html   |   39 +
 .../OpenLayers/Format/OWSCommon/v1_0_0-js.html     |   39 +
 .../OpenLayers/Format/OWSCommon/v1_1_0-js.html     |   39 +
 .../files/OpenLayers/Format/OWSContext-js.html     |   43 +
 .../OpenLayers/Format/OWSContext/v0_3_1-js.html    |   59 +
 doc/apidocs/files/OpenLayers/Format/SLD-js.html    |   57 +
 doc/apidocs/files/OpenLayers/Format/SLD/v1-js.html |   49 +
 .../files/OpenLayers/Format/SLD/v1_0_0-js.html     |   47 +
 .../OpenLayers/Format/SOSCapabilities-js.html      |   53 +
 .../Format/SOSCapabilities/v1_0_0-js.html          |   47 +
 .../Format/SOSGetFeatureOfInterest-js.html         |   51 +
 .../OpenLayers/Format/SOSGetObservation-js.html    |   47 +
 doc/apidocs/files/OpenLayers/Format/Text-js.html   |   53 +
 doc/apidocs/files/OpenLayers/Format/WFS-js.html    |   51 +
 .../OpenLayers/Format/WFSCapabilities-js.html      |   53 +
 .../OpenLayers/Format/WFSCapabilities/v1-js.html   |   47 +
 .../Format/WFSCapabilities/v1_0_0-js.html          |   43 +
 .../Format/WFSCapabilities/v1_1_0-js.html          |   43 +
 .../Format/WFSDescribeFeatureType-js.html          |   39 +
 doc/apidocs/files/OpenLayers/Format/WFST-js.html   |   39 +
 .../files/OpenLayers/Format/WFST/v1-js.html        |   55 +
 .../files/OpenLayers/Format/WFST/v1_0_0-js.html    |   47 +
 .../files/OpenLayers/Format/WFST/v1_1_0-js.html    |   43 +
 doc/apidocs/files/OpenLayers/Format/WKT-js.html    |   43 +
 doc/apidocs/files/OpenLayers/Format/WMC-js.html    |   43 +
 doc/apidocs/files/OpenLayers/Format/WMC/v1-js.html |   43 +
 .../files/OpenLayers/Format/WMC/v1_0_0-js.html     |   47 +
 .../files/OpenLayers/Format/WMC/v1_1_0-js.html     |   47 +
 .../OpenLayers/Format/WMSCapabilities-js.html      |   53 +
 .../OpenLayers/Format/WMSCapabilities/v1-js.html   |   47 +
 .../OpenLayers/Format/WMSCapabilities/v1_1-js.html |   39 +
 .../Format/WMSCapabilities/v1_1_0-js.html          |   43 +
 .../Format/WMSCapabilities/v1_1_1-js.html          |   43 +
 .../OpenLayers/Format/WMSCapabilities/v1_3-js.html |   39 +
 .../Format/WMSCapabilities/v1_3_0-js.html          |   39 +
 .../OpenLayers/Format/WMSDescribeLayer-js.html     |   53 +
 .../Format/WMSDescribeLayer/v1_1-js.html           |   47 +
 .../OpenLayers/Format/WMSGetFeatureInfo-js.html    |   53 +
 .../OpenLayers/Format/WMTSCapabilities-js.html     |   57 +
 .../Format/WMTSCapabilities/v1_0_0-js.html         |   47 +
 doc/apidocs/files/OpenLayers/Format/XML-js.html    |   79 +
 doc/apidocs/files/OpenLayers/Geometry-js.html      |   57 +
 .../files/OpenLayers/Geometry/Collection-js.html   |   85 +
 .../files/OpenLayers/Geometry/Curve-js.html        |   49 +
 .../files/OpenLayers/Geometry/LineString-js.html   |   53 +
 .../files/OpenLayers/Geometry/LinearRing-js.html   |   67 +
 .../OpenLayers/Geometry/MultiLineString-js.html    |   43 +
 .../files/OpenLayers/Geometry/MultiPoint-js.html   |   49 +
 .../files/OpenLayers/Geometry/MultiPolygon-js.html |   43 +
 .../files/OpenLayers/Geometry/Point-js.html        |   71 +
 .../files/OpenLayers/Geometry/Polygon-js.html      |   55 +
 .../files/OpenLayers/Geometry/Rectangle-js.html    |   49 +
 doc/apidocs/files/OpenLayers/Handler-js.html       |   70 +
 doc/apidocs/files/OpenLayers/Handler/Box-js.html   |   47 +
 doc/apidocs/files/OpenLayers/Handler/Click-js.html |   61 +
 doc/apidocs/files/OpenLayers/Handler/Drag-js.html  |   47 +
 .../files/OpenLayers/Handler/Feature-js.html       |   43 +
 doc/apidocs/files/OpenLayers/Handler/Hover-js.html |   55 +
 .../files/OpenLayers/Handler/Keyboard-js.html      |   47 +
 .../files/OpenLayers/Handler/MouseWheel-js.html    |   43 +
 doc/apidocs/files/OpenLayers/Handler/Path-js.html  |   43 +
 doc/apidocs/files/OpenLayers/Handler/Point-js.html |   57 +
 .../files/OpenLayers/Handler/Polygon-js.html       |   43 +
 .../OpenLayers/Handler/RegularPolygon-js.html      |   69 +
 doc/apidocs/files/OpenLayers/Icon-js.html          |   47 +
 doc/apidocs/files/OpenLayers/Lang-js.html          |   53 +
 doc/apidocs/files/OpenLayers/Lang/ar-js.html       |   39 +
 .../files/OpenLayers/Lang/be-tarask-js.html        |   39 +
 doc/apidocs/files/OpenLayers/Lang/bg-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/br-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/ca-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/cs-CZ-js.html    |   39 +
 doc/apidocs/files/OpenLayers/Lang/da-DK-js.html    |   39 +
 doc/apidocs/files/OpenLayers/Lang/de-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/el-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/en-CA-js.html    |   39 +
 doc/apidocs/files/OpenLayers/Lang/en-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/es-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/fi-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/fr-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/fur-js.html      |   39 +
 doc/apidocs/files/OpenLayers/Lang/gl-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/gsw-js.html      |   39 +
 doc/apidocs/files/OpenLayers/Lang/hr-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/hsb-js.html      |   39 +
 doc/apidocs/files/OpenLayers/Lang/hu-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/ia-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/id-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/io-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/is-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/it-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/ja-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/km-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/ksh-js.html      |   39 +
 doc/apidocs/files/OpenLayers/Lang/nb-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/nds-js.html      |   39 +
 doc/apidocs/files/OpenLayers/Lang/nl-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/nn-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/oc-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/pt-BR-js.html    |   39 +
 doc/apidocs/files/OpenLayers/Lang/pt-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/ru-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/sk-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/sv-SE-js.html    |   39 +
 doc/apidocs/files/OpenLayers/Lang/te-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/vi-js.html       |   39 +
 doc/apidocs/files/OpenLayers/Lang/zh-CN-js.html    |   39 +
 doc/apidocs/files/OpenLayers/Lang/zh-TW-js.html    |   39 +
 doc/apidocs/files/OpenLayers/Layer-js.html         |  147 +
 .../files/OpenLayers/Layer/ArcGIS93Rest-js.html    |   59 +
 doc/apidocs/files/OpenLayers/Layer/ArcIMS-js.html  |   77 +
 doc/apidocs/files/OpenLayers/Layer/Boxes-js.html   |   47 +
 .../files/OpenLayers/Layer/EventPane-js.html       |   55 +
 .../files/OpenLayers/Layer/FixedZoomLevels-js.html |   49 +
 doc/apidocs/files/OpenLayers/Layer/GML-js.html     |   53 +
 doc/apidocs/files/OpenLayers/Layer/GeoRSS-js.html  |   53 +
 doc/apidocs/files/OpenLayers/Layer/Google-js.html  |  111 +
 .../files/OpenLayers/Layer/Google/v3-js.html       |   76 +
 doc/apidocs/files/OpenLayers/Layer/Grid-js.html    |   69 +
 .../files/OpenLayers/Layer/HTTPRequest-js.html     |   63 +
 doc/apidocs/files/OpenLayers/Layer/Image-js.html   |   51 +
 doc/apidocs/files/OpenLayers/Layer/KaMap-js.html   |   61 +
 .../files/OpenLayers/Layer/KaMapCache-js.html      |   49 +
 .../files/OpenLayers/Layer/MapGuide-js.html        |   67 +
 .../files/OpenLayers/Layer/MapServer-js.html       |   47 +
 .../OpenLayers/Layer/MapServer/Untiled-js.html     |   47 +
 doc/apidocs/files/OpenLayers/Layer/Markers-js.html |   61 +
 .../files/OpenLayers/Layer/MultiMap-js.html        |   81 +
 .../files/OpenLayers/Layer/PointTrack-js.html      |   51 +
 .../OpenLayers/Layer/SphericalMercator-js.html     |   47 +
 doc/apidocs/files/OpenLayers/Layer/TMS-js.html     |   61 +
 doc/apidocs/files/OpenLayers/Layer/Text-js.html    |   54 +
 .../files/OpenLayers/Layer/TileCache-js.html       |   55 +
 doc/apidocs/files/OpenLayers/Layer/Vector-js.html  |   93 +
 .../OpenLayers/Layer/Vector/RootContainer-js.html  |   47 +
 .../files/OpenLayers/Layer/VirtualEarth-js.html    |   89 +
 doc/apidocs/files/OpenLayers/Layer/WFS-js.html     |   79 +
 doc/apidocs/files/OpenLayers/Layer/WMS-js.html     |   65 +
 .../files/OpenLayers/Layer/WMS/Post-js.html        |   50 +
 .../files/OpenLayers/Layer/WMS/Untiled-js.html     |   47 +
 doc/apidocs/files/OpenLayers/Layer/WMTS-js.html    |   85 +
 .../files/OpenLayers/Layer/WorldWind-js.html       |   51 +
 doc/apidocs/files/OpenLayers/Layer/XYZ-js.html     |   60 +
 doc/apidocs/files/OpenLayers/Layer/Yahoo-js.html   |   95 +
 doc/apidocs/files/OpenLayers/Layer/Zoomify-js.html |   53 +
 doc/apidocs/files/OpenLayers/Map-js.html           |  240 +
 doc/apidocs/files/OpenLayers/Marker-js.html        |   56 +
 doc/apidocs/files/OpenLayers/Marker/Box-js.html    |   43 +
 doc/apidocs/files/OpenLayers/Popup-js.html         |   69 +
 .../files/OpenLayers/Popup/Anchored-js.html        |   55 +
 .../files/OpenLayers/Popup/AnchoredBubble-js.html  |   55 +
 doc/apidocs/files/OpenLayers/Popup/Framed-js.html  |   59 +
 .../files/OpenLayers/Popup/FramedCloud-js.html     |   63 +
 doc/apidocs/files/OpenLayers/Projection-js.html    |   53 +
 doc/apidocs/files/OpenLayers/Protocol-js.html      |   63 +
 doc/apidocs/files/OpenLayers/Protocol/HTTP-js.html |   59 +
 doc/apidocs/files/OpenLayers/Protocol/SOS-js.html  |   39 +
 .../files/OpenLayers/Protocol/SOS/v1_0_0-js.html   |   53 +
 doc/apidocs/files/OpenLayers/Protocol/SQL-js.html  |   55 +
 .../files/OpenLayers/Protocol/SQL/Gears-js.html    |   59 +
 doc/apidocs/files/OpenLayers/Protocol/WFS-js.html  |   39 +
 .../files/OpenLayers/Protocol/WFS/v1-js.html       |   47 +
 .../files/OpenLayers/Protocol/WFS/v1_0_0-js.html   |   43 +
 .../files/OpenLayers/Protocol/WFS/v1_1_0-js.html   |   43 +
 doc/apidocs/files/OpenLayers/Renderer-js.html      |   61 +
 .../files/OpenLayers/Renderer/Canvas-js.html       |   51 +
 .../files/OpenLayers/Renderer/Elements-js.html     |   79 +
 doc/apidocs/files/OpenLayers/Renderer/SVG-js.html  |   59 +
 doc/apidocs/files/OpenLayers/Renderer/VML-js.html  |   53 +
 doc/apidocs/files/OpenLayers/Request-js.html       |   63 +
 .../OpenLayers/Request/XMLHttpRequest-js.html      |   39 +
 doc/apidocs/files/OpenLayers/Rule-js.html          |   59 +
 doc/apidocs/files/OpenLayers/Strategy-js.html      |   47 +
 doc/apidocs/files/OpenLayers/Strategy/BBOX-js.html |   47 +
 .../files/OpenLayers/Strategy/Cluster-js.html      |   55 +
 .../files/OpenLayers/Strategy/Filter-js.html       |   55 +
 .../files/OpenLayers/Strategy/Fixed-js.html        |   51 +
 .../files/OpenLayers/Strategy/Paging-js.html       |   59 +
 .../files/OpenLayers/Strategy/Refresh-js.html      |   51 +
 doc/apidocs/files/OpenLayers/Strategy/Save-js.html |   59 +
 doc/apidocs/files/OpenLayers/Style-js.html         |   65 +
 doc/apidocs/files/OpenLayers/Style2-js.html        |   63 +
 doc/apidocs/files/OpenLayers/StyleMap-js.html      |   43 +
 doc/apidocs/files/OpenLayers/Symbolizer-js.html    |   51 +
 .../files/OpenLayers/Symbolizer/Line-js.html       |   53 +
 .../files/OpenLayers/Symbolizer/Point-js.html      |   75 +
 .../files/OpenLayers/Symbolizer/Polygon-js.html    |   57 +
 .../files/OpenLayers/Symbolizer/Raster-js.html     |   43 +
 .../files/OpenLayers/Symbolizer/Text-js.html       |   53 +
 doc/apidocs/files/OpenLayers/Tile-js.html          |   53 +
 doc/apidocs/files/OpenLayers/Tile/Image-js.html    |   43 +
 .../files/OpenLayers/Tile/Image/IFrame-js.html     |   43 +
 doc/apidocs/files/OpenLayers/Tile/WFS-js.html      |   43 +
 doc/apidocs/files/OpenLayers/Tween-js.html         |   73 +
 doc/apidocs/files/OpenLayers/Util-js.html          |   59 +
 doc/apidocs/index.html                             |    1 +
 doc/apidocs/index/Classes.html                     |   34 +
 doc/apidocs/index/Classes2.html                    |   34 +
 doc/apidocs/index/Constants.html                   |  102 +
 doc/apidocs/index/Constructor.html                 |   90 +
 doc/apidocs/index/Constructor2.html                |   54 +
 doc/apidocs/index/Constructor3.html                |   46 +
 doc/apidocs/index/Files.html                       |   46 +
 doc/apidocs/index/Functions.html                   |   38 +
 doc/apidocs/index/Functions2.html                  |   34 +
 doc/apidocs/index/Functions3.html                  |   34 +
 doc/apidocs/index/Functions4.html                  |   38 +
 doc/apidocs/index/Functions5.html                  |   34 +
 doc/apidocs/index/Functions6.html                  |   62 +
 doc/apidocs/index/Functions7.html                  |   34 +
 doc/apidocs/index/Functions8.html                  |   50 +
 doc/apidocs/index/General.html                     |   34 +
 doc/apidocs/index/General10.html                   |   38 +
 doc/apidocs/index/General11.html                   |   34 +
 doc/apidocs/index/General12.html                   |   34 +
 doc/apidocs/index/General13.html                   |   34 +
 doc/apidocs/index/General14.html                   |   34 +
 doc/apidocs/index/General15.html                   |   34 +
 doc/apidocs/index/General16.html                   |   38 +
 doc/apidocs/index/General17.html                   |   34 +
 doc/apidocs/index/General18.html                   |   46 +
 doc/apidocs/index/General2.html                    |   34 +
 doc/apidocs/index/General3.html                    |   34 +
 doc/apidocs/index/General4.html                    |   34 +
 doc/apidocs/index/General5.html                    |   34 +
 doc/apidocs/index/General6.html                    |   34 +
 doc/apidocs/index/General7.html                    |   34 +
 doc/apidocs/index/General8.html                    |   46 +
 doc/apidocs/index/General9.html                    |   34 +
 doc/apidocs/index/Properties.html                  |   46 +
 doc/apidocs/index/Properties2.html                 |   46 +
 doc/apidocs/index/Properties3.html                 |   46 +
 doc/apidocs/index/Properties4.html                 |   50 +
 doc/apidocs/index/Properties5.html                 |   46 +
 doc/apidocs/index/Properties6.html                 |   46 +
 doc/apidocs/javascript/main.js                     |  835 ++++
 doc/apidocs/javascript/searchdata.js               |  212 +
 doc/apidocs/search/ClassesO.html                   |   20 +
 doc/apidocs/search/ClassesU.html                   |   20 +
 doc/apidocs/search/ConstantsB.html                 |   20 +
 doc/apidocs/search/ConstantsC.html                 |   20 +
 doc/apidocs/search/ConstantsD.html                 |   20 +
 doc/apidocs/search/ConstantsE.html                 |   20 +
 doc/apidocs/search/ConstantsF.html                 |   20 +
 doc/apidocs/search/ConstantsI.html                 |   20 +
 doc/apidocs/search/ConstantsK.html                 |   20 +
 doc/apidocs/search/ConstantsL.html                 |   20 +
 doc/apidocs/search/ConstantsM.html                 |   20 +
 doc/apidocs/search/ConstantsO.html                 |   20 +
 doc/apidocs/search/ConstantsR.html                 |   20 +
 doc/apidocs/search/ConstantsS.html                 |   20 +
 doc/apidocs/search/ConstantsT.html                 |   20 +
 doc/apidocs/search/ConstantsU.html                 |   20 +
 doc/apidocs/search/ConstantsV.html                 |   20 +
 doc/apidocs/search/ConstantsX.html                 |   20 +
 doc/apidocs/search/ConstantsY.html                 |   20 +
 doc/apidocs/search/ConstantsZ.html                 |   20 +
 doc/apidocs/search/ConstructorA.html               |   20 +
 doc/apidocs/search/ConstructorB.html               |   20 +
 doc/apidocs/search/ConstructorC.html               |   20 +
 doc/apidocs/search/ConstructorD.html               |   20 +
 doc/apidocs/search/ConstructorE.html               |   20 +
 doc/apidocs/search/ConstructorF.html               |   20 +
 doc/apidocs/search/ConstructorG.html               |   20 +
 doc/apidocs/search/ConstructorH.html               |   20 +
 doc/apidocs/search/ConstructorI.html               |   20 +
 doc/apidocs/search/ConstructorJ.html               |   20 +
 doc/apidocs/search/ConstructorK.html               |   20 +
 doc/apidocs/search/ConstructorL.html               |   20 +
 doc/apidocs/search/ConstructorM.html               |   20 +
 doc/apidocs/search/ConstructorN.html               |   20 +
 doc/apidocs/search/ConstructorO.html               |   20 +
 doc/apidocs/search/ConstructorP.html               |   20 +
 doc/apidocs/search/ConstructorR.html               |   20 +
 doc/apidocs/search/ConstructorS.html               |   20 +
 doc/apidocs/search/ConstructorT.html               |   20 +
 doc/apidocs/search/ConstructorU.html               |   20 +
 doc/apidocs/search/ConstructorV.html               |   20 +
 doc/apidocs/search/ConstructorW.html               |   20 +
 doc/apidocs/search/ConstructorX.html               |   20 +
 doc/apidocs/search/ConstructorY.html               |   20 +
 doc/apidocs/search/ConstructorZ.html               |   20 +
 doc/apidocs/search/FilesA.html                     |   20 +
 doc/apidocs/search/FilesC.html                     |   20 +
 doc/apidocs/search/FilesO.html                     |   20 +
 doc/apidocs/search/FilesV.html                     |   20 +
 doc/apidocs/search/FunctionsA.html                 |   20 +
 doc/apidocs/search/FunctionsB.html                 |   20 +
 doc/apidocs/search/FunctionsC.html                 |   20 +
 doc/apidocs/search/FunctionsD.html                 |   20 +
 doc/apidocs/search/FunctionsE.html                 |   20 +
 doc/apidocs/search/FunctionsF.html                 |   20 +
 doc/apidocs/search/FunctionsG.html                 |   20 +
 doc/apidocs/search/FunctionsH.html                 |   20 +
 doc/apidocs/search/FunctionsI.html                 |   20 +
 doc/apidocs/search/FunctionsL.html                 |   20 +
 doc/apidocs/search/FunctionsM.html                 |   20 +
 doc/apidocs/search/FunctionsN.html                 |   20 +
 doc/apidocs/search/FunctionsO.html                 |   20 +
 doc/apidocs/search/FunctionsP.html                 |   20 +
 doc/apidocs/search/FunctionsR.html                 |   20 +
 doc/apidocs/search/FunctionsS.html                 |   20 +
 doc/apidocs/search/FunctionsT.html                 |   20 +
 doc/apidocs/search/FunctionsU.html                 |   20 +
 doc/apidocs/search/FunctionsV.html                 |   20 +
 doc/apidocs/search/FunctionsW.html                 |   20 +
 doc/apidocs/search/FunctionsZ.html                 |   20 +
 doc/apidocs/search/GeneralA.html                   |   20 +
 doc/apidocs/search/GeneralB.html                   |   20 +
 doc/apidocs/search/GeneralC.html                   |   20 +
 doc/apidocs/search/GeneralD.html                   |   20 +
 doc/apidocs/search/GeneralE.html                   |   20 +
 doc/apidocs/search/GeneralF.html                   |   20 +
 doc/apidocs/search/GeneralG.html                   |   20 +
 doc/apidocs/search/GeneralH.html                   |   20 +
 doc/apidocs/search/GeneralI.html                   |   20 +
 doc/apidocs/search/GeneralJ.html                   |   20 +
 doc/apidocs/search/GeneralK.html                   |   20 +
 doc/apidocs/search/GeneralL.html                   |   20 +
 doc/apidocs/search/GeneralM.html                   |   20 +
 doc/apidocs/search/GeneralN.html                   |   20 +
 doc/apidocs/search/GeneralO.html                   |   20 +
 doc/apidocs/search/GeneralP.html                   |   20 +
 doc/apidocs/search/GeneralQ.html                   |   20 +
 doc/apidocs/search/GeneralR.html                   |   20 +
 doc/apidocs/search/GeneralS.html                   |   20 +
 doc/apidocs/search/GeneralT.html                   |   20 +
 doc/apidocs/search/GeneralU.html                   |   20 +
 doc/apidocs/search/GeneralV.html                   |   20 +
 doc/apidocs/search/GeneralW.html                   |   20 +
 doc/apidocs/search/GeneralX.html                   |   20 +
 doc/apidocs/search/GeneralY.html                   |   20 +
 doc/apidocs/search/GeneralZ.html                   |   20 +
 doc/apidocs/search/NoResults.html                  |   15 +
 doc/apidocs/search/PropertiesA.html                |   20 +
 doc/apidocs/search/PropertiesB.html                |   20 +
 doc/apidocs/search/PropertiesC.html                |   20 +
 doc/apidocs/search/PropertiesD.html                |   20 +
 doc/apidocs/search/PropertiesE.html                |   20 +
 doc/apidocs/search/PropertiesF.html                |   20 +
 doc/apidocs/search/PropertiesG.html                |   20 +
 doc/apidocs/search/PropertiesH.html                |   20 +
 doc/apidocs/search/PropertiesI.html                |   20 +
 doc/apidocs/search/PropertiesK.html                |   20 +
 doc/apidocs/search/PropertiesL.html                |   20 +
 doc/apidocs/search/PropertiesM.html                |   20 +
 doc/apidocs/search/PropertiesN.html                |   20 +
 doc/apidocs/search/PropertiesO.html                |   20 +
 doc/apidocs/search/PropertiesP.html                |   20 +
 doc/apidocs/search/PropertiesQ.html                |   20 +
 doc/apidocs/search/PropertiesR.html                |   20 +
 doc/apidocs/search/PropertiesS.html                |   20 +
 doc/apidocs/search/PropertiesT.html                |   20 +
 doc/apidocs/search/PropertiesU.html                |   20 +
 doc/apidocs/search/PropertiesV.html                |   20 +
 doc/apidocs/search/PropertiesW.html                |   20 +
 doc/apidocs/search/PropertiesX.html                |   20 +
 doc/apidocs/search/PropertiesY.html                |   20 +
 doc/apidocs/search/PropertiesZ.html                |   20 +
 doc/apidocs/styles/1.css                           |  759 +++
 doc/apidocs/styles/2.css                           |   20 +
 doc/apidocs/styles/main.css                        |    2 +
 doc/authors.txt                                    |   50 +
 doc/customization                                  |   49 +
 doc/devdocs/files/OpenLayers-js.html               |   51 +
 doc/devdocs/files/OpenLayers/Ajax-js.html          |  141 +
 doc/devdocs/files/OpenLayers/BaseTypes-js.html     |  122 +
 .../files/OpenLayers/BaseTypes/Bounds-js.html      |  112 +
 .../files/OpenLayers/BaseTypes/Class-js.html       |   53 +
 .../files/OpenLayers/BaseTypes/Element-js.html     |   65 +
 .../files/OpenLayers/BaseTypes/LonLat-js.html      |   67 +
 .../files/OpenLayers/BaseTypes/Pixel-js.html       |   61 +
 .../files/OpenLayers/BaseTypes/Size-js.html        |   57 +
 doc/devdocs/files/OpenLayers/Console-js.html       |   75 +
 doc/devdocs/files/OpenLayers/Control-js.html       |  119 +
 .../files/OpenLayers/Control/ArgParser-js.html     |   55 +
 .../files/OpenLayers/Control/Attribution-js.html   |   55 +
 .../files/OpenLayers/Control/Button-js.html        |   50 +
 .../files/OpenLayers/Control/DragFeature-js.html   |   89 +
 .../files/OpenLayers/Control/DragPan-js.html       |   57 +
 .../files/OpenLayers/Control/DrawFeature-js.html   |   65 +
 .../OpenLayers/Control/EditingToolbar-js.html      |   47 +
 .../files/OpenLayers/Control/GetFeature-js.html    |  115 +
 .../files/OpenLayers/Control/Graticule-js.html     |   81 +
 .../OpenLayers/Control/KeyboardDefaults-js.html    |   57 +
 .../files/OpenLayers/Control/LayerSwitcher-js.html |  101 +
 .../files/OpenLayers/Control/Measure-js.html       |   85 +
 .../files/OpenLayers/Control/ModifyFeature-js.html |  130 +
 .../files/OpenLayers/Control/MouseDefaults-js.html |   79 +
 .../files/OpenLayers/Control/MousePosition-js.html |   81 +
 .../files/OpenLayers/Control/MouseToolbar-js.html  |   81 +
 .../files/OpenLayers/Control/NavToolbar-js.html    |   47 +
 .../files/OpenLayers/Control/Navigation-js.html    |   91 +
 .../OpenLayers/Control/NavigationHistory-js.html   |  101 +
 .../files/OpenLayers/Control/OverviewMap-js.html   |  115 +
 doc/devdocs/files/OpenLayers/Control/Pan-js.html   |   55 +
 .../files/OpenLayers/Control/PanPanel-js.html      |   49 +
 .../files/OpenLayers/Control/PanZoom-js.html       |   75 +
 .../files/OpenLayers/Control/PanZoomBar-js.html    |   91 +
 doc/devdocs/files/OpenLayers/Control/Panel-js.html |   83 +
 .../files/OpenLayers/Control/Permalink-js.html     |   65 +
 .../files/OpenLayers/Control/SLDSelect-js.html     |  101 +
 doc/devdocs/files/OpenLayers/Control/Scale-js.html |   53 +
 .../files/OpenLayers/Control/ScaleLine-js.html     |   69 +
 .../files/OpenLayers/Control/SelectFeature-js.html |  125 +
 .../files/OpenLayers/Control/Snapping-js.html      |   95 +
 doc/devdocs/files/OpenLayers/Control/Split-js.html |   91 +
 .../OpenLayers/Control/TransformFeature-js.html    |  104 +
 .../OpenLayers/Control/WMSGetFeatureInfo-js.html   |  110 +
 .../OpenLayers/Control/WMTSGetFeatureInfo-js.html  |  108 +
 .../files/OpenLayers/Control/ZoomBox-js.html       |   53 +
 .../files/OpenLayers/Control/ZoomIn-js.html        |   47 +
 .../files/OpenLayers/Control/ZoomOut-js.html       |   47 +
 .../files/OpenLayers/Control/ZoomPanel-js.html     |   45 +
 .../OpenLayers/Control/ZoomToMaxExtent-js.html     |   47 +
 doc/devdocs/files/OpenLayers/Events-js.html        |  173 +
 doc/devdocs/files/OpenLayers/Feature-js.html       |   73 +
 .../files/OpenLayers/Feature/Vector-js.html        |   89 +
 doc/devdocs/files/OpenLayers/Feature/WFS-js.html   |   49 +
 doc/devdocs/files/OpenLayers/Filter-js.html        |   51 +
 .../files/OpenLayers/Filter/Comparison-js.html     |   67 +
 .../files/OpenLayers/Filter/FeatureId-js.html      |   53 +
 .../files/OpenLayers/Filter/Logical-js.html        |   57 +
 .../files/OpenLayers/Filter/Spatial-js.html        |   61 +
 doc/devdocs/files/OpenLayers/Format-js.html        |   63 +
 doc/devdocs/files/OpenLayers/Format/ArcXML-js.html |   73 +
 .../OpenLayers/Format/ArcXML/Features-js.html      |   47 +
 doc/devdocs/files/OpenLayers/Format/Atom-js.html   |   79 +
 .../files/OpenLayers/Format/CSWGetDomain-js.html   |   47 +
 .../OpenLayers/Format/CSWGetDomain/v2_0_2-js.html  |   67 +
 .../files/OpenLayers/Format/CSWGetRecords-js.html  |   47 +
 .../OpenLayers/Format/CSWGetRecords/v2_0_2-js.html |   83 +
 .../files/OpenLayers/Format/Context-js.html        |   71 +
 doc/devdocs/files/OpenLayers/Format/Filter-js.html |   57 +
 .../files/OpenLayers/Format/Filter/v1-js.html      |   69 +
 .../files/OpenLayers/Format/Filter/v1_0_0-js.html  |   61 +
 .../files/OpenLayers/Format/Filter/v1_1_0-js.html  |   61 +
 doc/devdocs/files/OpenLayers/Format/GML-js.html    |  113 +
 .../files/OpenLayers/Format/GML/Base-js.html       |   81 +
 doc/devdocs/files/OpenLayers/Format/GML/v2-js.html |   55 +
 doc/devdocs/files/OpenLayers/Format/GML/v3-js.html |   65 +
 doc/devdocs/files/OpenLayers/Format/GPX-js.html    |   61 +
 .../files/OpenLayers/Format/GeoJSON-js.html        |  105 +
 doc/devdocs/files/OpenLayers/Format/GeoRSS-js.html |   77 +
 doc/devdocs/files/OpenLayers/Format/JSON-js.html   |   85 +
 doc/devdocs/files/OpenLayers/Format/KML-js.html    |  145 +
 doc/devdocs/files/OpenLayers/Format/OSM-js.html    |   71 +
 .../files/OpenLayers/Format/OWSCommon/v1-js.html   |   47 +
 .../OpenLayers/Format/OWSCommon/v1_0_0-js.html     |   47 +
 .../OpenLayers/Format/OWSCommon/v1_1_0-js.html     |   45 +
 .../files/OpenLayers/Format/OWSContext-js.html     |   49 +
 .../OpenLayers/Format/OWSContext/v0_3_1-js.html    |   89 +
 doc/devdocs/files/OpenLayers/Format/SLD-js.html    |   59 +
 doc/devdocs/files/OpenLayers/Format/SLD/v1-js.html |   77 +
 .../files/OpenLayers/Format/SLD/v1_0_0-js.html     |   51 +
 .../OpenLayers/Format/SOSCapabilities-js.html      |   55 +
 .../Format/SOSCapabilities/v1_0_0-js.html          |   57 +
 .../Format/SOSGetFeatureOfInterest-js.html         |   67 +
 .../OpenLayers/Format/SOSGetObservation-js.html    |   71 +
 doc/devdocs/files/OpenLayers/Format/Text-js.html   |   53 +
 doc/devdocs/files/OpenLayers/Format/WFS-js.html    |   65 +
 .../OpenLayers/Format/WFSCapabilities-js.html      |   53 +
 .../OpenLayers/Format/WFSCapabilities/v1-js.html   |   59 +
 .../Format/WFSCapabilities/v1_0_0-js.html          |   71 +
 .../Format/WFSCapabilities/v1_1_0-js.html          |   43 +
 .../Format/WFSDescribeFeatureType-js.html          |   57 +
 doc/devdocs/files/OpenLayers/Format/WFST-js.html   |   47 +
 .../files/OpenLayers/Format/WFST/v1-js.html        |   77 +
 .../files/OpenLayers/Format/WFST/v1_0_0-js.html    |   57 +
 .../files/OpenLayers/Format/WFST/v1_1_0-js.html    |   55 +
 doc/devdocs/files/OpenLayers/Format/WKT-js.html    |   49 +
 doc/devdocs/files/OpenLayers/Format/WMC-js.html    |   51 +
 doc/devdocs/files/OpenLayers/Format/WMC/v1-js.html |  147 +
 .../files/OpenLayers/Format/WMC/v1_0_0-js.html     |   55 +
 .../files/OpenLayers/Format/WMC/v1_1_0-js.html     |   59 +
 .../OpenLayers/Format/WMSCapabilities-js.html      |   55 +
 .../OpenLayers/Format/WMSCapabilities/v1-js.html   |   61 +
 .../OpenLayers/Format/WMSCapabilities/v1_1-js.html |   43 +
 .../Format/WMSCapabilities/v1_1_0-js.html          |   51 +
 .../Format/WMSCapabilities/v1_1_1-js.html          |   51 +
 .../OpenLayers/Format/WMSCapabilities/v1_3-js.html |   43 +
 .../Format/WMSCapabilities/v1_3_0-js.html          |   43 +
 .../OpenLayers/Format/WMSDescribeLayer-js.html     |   53 +
 .../Format/WMSDescribeLayer/v1_1-js.html           |   47 +
 .../OpenLayers/Format/WMSGetFeatureInfo-js.html    |   67 +
 .../OpenLayers/Format/WMTSCapabilities-js.html     |   59 +
 .../Format/WMTSCapabilities/v1_0_0-js.html         |   61 +
 doc/devdocs/files/OpenLayers/Format/XML-js.html    |  107 +
 doc/devdocs/files/OpenLayers/Geometry-js.html      |   85 +
 .../files/OpenLayers/Geometry/Collection-js.html   |   93 +
 .../files/OpenLayers/Geometry/Curve-js.html        |   53 +
 .../files/OpenLayers/Geometry/LineString-js.html   |   61 +
 .../files/OpenLayers/Geometry/LinearRing-js.html   |   73 +
 .../OpenLayers/Geometry/MultiLineString-js.html    |   53 +
 .../files/OpenLayers/Geometry/MultiPoint-js.html   |   53 +
 .../files/OpenLayers/Geometry/MultiPolygon-js.html |   47 +
 .../files/OpenLayers/Geometry/Point-js.html        |   75 +
 .../files/OpenLayers/Geometry/Polygon-js.html      |   61 +
 .../files/OpenLayers/Geometry/Rectangle-js.html    |   61 +
 doc/devdocs/files/OpenLayers/Handler-js.html       |   92 +
 doc/devdocs/files/OpenLayers/Handler/Box-js.html   |   71 +
 doc/devdocs/files/OpenLayers/Handler/Click-js.html |   85 +
 doc/devdocs/files/OpenLayers/Handler/Drag-js.html  |   95 +
 .../files/OpenLayers/Handler/Feature-js.html       |   91 +
 doc/devdocs/files/OpenLayers/Handler/Hover-js.html |   69 +
 .../files/OpenLayers/Handler/Keyboard-js.html      |   61 +
 .../files/OpenLayers/Handler/MouseWheel-js.html    |   69 +
 doc/devdocs/files/OpenLayers/Handler/Path-js.html  |   79 +
 doc/devdocs/files/OpenLayers/Handler/Point-js.html |   95 +
 .../files/OpenLayers/Handler/Polygon-js.html       |   57 +
 .../OpenLayers/Handler/RegularPolygon-js.html      |   99 +
 doc/devdocs/files/OpenLayers/Icon-js.html          |   79 +
 doc/devdocs/files/OpenLayers/Lang-js.html          |   55 +
 doc/devdocs/files/OpenLayers/Lang/ar-js.html       |   39 +
 .../files/OpenLayers/Lang/be-tarask-js.html        |   39 +
 doc/devdocs/files/OpenLayers/Lang/bg-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/br-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/ca-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/cs-CZ-js.html    |   39 +
 doc/devdocs/files/OpenLayers/Lang/da-DK-js.html    |   39 +
 doc/devdocs/files/OpenLayers/Lang/de-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/el-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/en-CA-js.html    |   39 +
 doc/devdocs/files/OpenLayers/Lang/en-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/es-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/fi-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/fr-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/fur-js.html      |   39 +
 doc/devdocs/files/OpenLayers/Lang/gl-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/gsw-js.html      |   39 +
 doc/devdocs/files/OpenLayers/Lang/hr-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/hsb-js.html      |   39 +
 doc/devdocs/files/OpenLayers/Lang/hu-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/ia-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/id-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/io-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/is-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/it-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/ja-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/km-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/ksh-js.html      |   39 +
 doc/devdocs/files/OpenLayers/Lang/nb-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/nds-js.html      |   39 +
 doc/devdocs/files/OpenLayers/Lang/nl-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/nn-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/oc-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/pt-BR-js.html    |   39 +
 doc/devdocs/files/OpenLayers/Lang/pt-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/ru-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/sk-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/sv-SE-js.html    |   39 +
 doc/devdocs/files/OpenLayers/Lang/te-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/vi-js.html       |   39 +
 doc/devdocs/files/OpenLayers/Lang/zh-CN-js.html    |   39 +
 doc/devdocs/files/OpenLayers/Lang/zh-TW-js.html    |   39 +
 doc/devdocs/files/OpenLayers/Layer-js.html         |  187 +
 .../files/OpenLayers/Layer/ArcGIS93Rest-js.html    |   71 +
 doc/devdocs/files/OpenLayers/Layer/ArcIMS-js.html  |  101 +
 doc/devdocs/files/OpenLayers/Layer/Boxes-js.html   |   49 +
 .../files/OpenLayers/Layer/EventPane-js.html       |   85 +
 .../files/OpenLayers/Layer/FixedZoomLevels-js.html |   57 +
 doc/devdocs/files/OpenLayers/Layer/GML-js.html     |   65 +
 doc/devdocs/files/OpenLayers/Layer/GeoRSS-js.html  |   73 +
 doc/devdocs/files/OpenLayers/Layer/Google-js.html  |  137 +
 .../files/OpenLayers/Layer/Google/v3-js.html       |   84 +
 doc/devdocs/files/OpenLayers/Layer/Grid-js.html    |  101 +
 .../files/OpenLayers/Layer/HTTPRequest-js.html     |   71 +
 doc/devdocs/files/OpenLayers/Layer/Image-js.html   |   75 +
 doc/devdocs/files/OpenLayers/Layer/KaMap-js.html   |   67 +
 .../files/OpenLayers/Layer/KaMapCache-js.html      |   53 +
 .../files/OpenLayers/Layer/MapGuide-js.html        |   85 +
 .../files/OpenLayers/Layer/MapServer-js.html       |   57 +
 .../OpenLayers/Layer/MapServer/Untiled-js.html     |   51 +
 doc/devdocs/files/OpenLayers/Layer/Markers-js.html |   69 +
 .../files/OpenLayers/Layer/MultiMap-js.html        |   83 +
 .../files/OpenLayers/Layer/PointTrack-js.html      |   51 +
 .../OpenLayers/Layer/SphericalMercator-js.html     |   59 +
 doc/devdocs/files/OpenLayers/Layer/TMS-js.html     |   65 +
 doc/devdocs/files/OpenLayers/Layer/Text-js.html    |   68 +
 .../files/OpenLayers/Layer/TileCache-js.html       |   59 +
 doc/devdocs/files/OpenLayers/Layer/Vector-js.html  |  135 +
 .../OpenLayers/Layer/Vector/RootContainer-js.html  |   65 +
 .../files/OpenLayers/Layer/VirtualEarth-js.html    |   93 +
 doc/devdocs/files/OpenLayers/Layer/WFS-js.html     |  103 +
 doc/devdocs/files/OpenLayers/Layer/WMS-js.html     |   77 +
 .../files/OpenLayers/Layer/WMS/Post-js.html        |   58 +
 .../files/OpenLayers/Layer/WMS/Untiled-js.html     |   51 +
 doc/devdocs/files/OpenLayers/Layer/WMTS-js.html    |  105 +
 .../files/OpenLayers/Layer/WorldWind-js.html       |   59 +
 doc/devdocs/files/OpenLayers/Layer/XYZ-js.html     |   64 +
 doc/devdocs/files/OpenLayers/Layer/Yahoo-js.html   |  101 +
 doc/devdocs/files/OpenLayers/Layer/Zoomify-js.html |   77 +
 doc/devdocs/files/OpenLayers/Map-js.html           |  302 ++
 doc/devdocs/files/OpenLayers/Marker-js.html        |   84 +
 doc/devdocs/files/OpenLayers/Marker/Box-js.html    |   61 +
 doc/devdocs/files/OpenLayers/Popup-js.html         |  159 +
 .../files/OpenLayers/Popup/Anchored-js.html        |   63 +
 .../files/OpenLayers/Popup/AnchoredBubble-js.html  |   69 +
 doc/devdocs/files/OpenLayers/Popup/Framed-js.html  |   77 +
 .../files/OpenLayers/Popup/FramedCloud-js.html     |   67 +
 doc/devdocs/files/OpenLayers/Projection-js.html    |   67 +
 doc/devdocs/files/OpenLayers/Protocol-js.html      |   97 +
 doc/devdocs/files/OpenLayers/Protocol/HTTP-js.html |   97 +
 doc/devdocs/files/OpenLayers/Protocol/SOS-js.html  |   47 +
 .../files/OpenLayers/Protocol/SOS/v1_0_0-js.html   |   59 +
 doc/devdocs/files/OpenLayers/Protocol/SQL-js.html  |   59 +
 .../files/OpenLayers/Protocol/SQL/Gears-js.html    |   97 +
 doc/devdocs/files/OpenLayers/Protocol/WFS-js.html  |   49 +
 .../files/OpenLayers/Protocol/WFS/v1-js.html       |   81 +
 .../files/OpenLayers/Protocol/WFS/v1_0_0-js.html   |   47 +
 .../files/OpenLayers/Protocol/WFS/v1_1_0-js.html   |   47 +
 doc/devdocs/files/OpenLayers/Renderer-js.html      |  105 +
 .../files/OpenLayers/Renderer/Canvas-js.html       |   91 +
 .../files/OpenLayers/Renderer/Elements-js.html     |  157 +
 doc/devdocs/files/OpenLayers/Renderer/SVG-js.html  |  127 +
 doc/devdocs/files/OpenLayers/Renderer/VML-js.html  |  107 +
 doc/devdocs/files/OpenLayers/Request-js.html       |   65 +
 .../OpenLayers/Request/XMLHttpRequest-js.html      |   39 +
 doc/devdocs/files/OpenLayers/Rule-js.html          |   77 +
 doc/devdocs/files/OpenLayers/Strategy-js.html      |   65 +
 doc/devdocs/files/OpenLayers/Strategy/BBOX-js.html |   75 +
 .../files/OpenLayers/Strategy/Cluster-js.html      |   77 +
 .../files/OpenLayers/Strategy/Filter-js.html       |   63 +
 .../files/OpenLayers/Strategy/Fixed-js.html        |   59 +
 .../files/OpenLayers/Strategy/Paging-js.html       |   75 +
 .../files/OpenLayers/Strategy/Refresh-js.html      |   65 +
 doc/devdocs/files/OpenLayers/Strategy/Save-js.html |   67 +
 doc/devdocs/files/OpenLayers/Style-js.html         |   95 +
 doc/devdocs/files/OpenLayers/Style2-js.html        |   65 +
 doc/devdocs/files/OpenLayers/StyleMap-js.html      |   57 +
 doc/devdocs/files/OpenLayers/Symbolizer-js.html    |   51 +
 .../files/OpenLayers/Symbolizer/Line-js.html       |   55 +
 .../files/OpenLayers/Symbolizer/Point-js.html      |   77 +
 .../files/OpenLayers/Symbolizer/Polygon-js.html    |   59 +
 .../files/OpenLayers/Symbolizer/Raster-js.html     |   43 +
 .../files/OpenLayers/Symbolizer/Text-js.html       |   55 +
 doc/devdocs/files/OpenLayers/Tile-js.html          |   83 +
 doc/devdocs/files/OpenLayers/Tile/Image-js.html    |   83 +
 .../files/OpenLayers/Tile/Image/IFrame-js.html     |   65 +
 doc/devdocs/files/OpenLayers/Tile/WFS-js.html      |   63 +
 doc/devdocs/files/OpenLayers/Tween-js.html         |  105 +
 doc/devdocs/files/OpenLayers/Util-js.html          |  153 +
 doc/devdocs/index.html                             |    1 +
 doc/devdocs/index/Classes.html                     |   34 +
 doc/devdocs/index/Classes2.html                    |   34 +
 doc/devdocs/index/Constants.html                   |  102 +
 doc/devdocs/index/Constructor.html                 |   90 +
 doc/devdocs/index/Constructor2.html                |   54 +
 doc/devdocs/index/Constructor3.html                |   46 +
 doc/devdocs/index/Files.html                       |   54 +
 doc/devdocs/index/Functions.html                   |   38 +
 doc/devdocs/index/Functions10.html                 |   34 +
 doc/devdocs/index/Functions11.html                 |   38 +
 doc/devdocs/index/Functions12.html                 |   34 +
 doc/devdocs/index/Functions13.html                 |   34 +
 doc/devdocs/index/Functions14.html                 |   34 +
 doc/devdocs/index/Functions15.html                 |   34 +
 doc/devdocs/index/Functions16.html                 |   38 +
 doc/devdocs/index/Functions17.html                 |   38 +
 doc/devdocs/index/Functions2.html                  |   34 +
 doc/devdocs/index/Functions3.html                  |   34 +
 doc/devdocs/index/Functions4.html                  |   34 +
 doc/devdocs/index/Functions5.html                  |   34 +
 doc/devdocs/index/Functions6.html                  |   34 +
 doc/devdocs/index/Functions7.html                  |   34 +
 doc/devdocs/index/Functions8.html                  |   34 +
 doc/devdocs/index/Functions9.html                  |   38 +
 doc/devdocs/index/General.html                     |   38 +
 doc/devdocs/index/General10.html                   |   38 +
 doc/devdocs/index/General11.html                   |   34 +
 doc/devdocs/index/General12.html                   |   34 +
 doc/devdocs/index/General13.html                   |   34 +
 doc/devdocs/index/General14.html                   |   34 +
 doc/devdocs/index/General15.html                   |   34 +
 doc/devdocs/index/General16.html                   |   34 +
 doc/devdocs/index/General17.html                   |   34 +
 doc/devdocs/index/General18.html                   |   34 +
 doc/devdocs/index/General19.html                   |   34 +
 doc/devdocs/index/General2.html                    |   34 +
 doc/devdocs/index/General20.html                   |   34 +
 doc/devdocs/index/General21.html                   |   34 +
 doc/devdocs/index/General22.html                   |   34 +
 doc/devdocs/index/General23.html                   |   42 +
 doc/devdocs/index/General3.html                    |   34 +
 doc/devdocs/index/General4.html                    |   34 +
 doc/devdocs/index/General5.html                    |   34 +
 doc/devdocs/index/General6.html                    |   34 +
 doc/devdocs/index/General7.html                    |   34 +
 doc/devdocs/index/General8.html                    |   34 +
 doc/devdocs/index/General9.html                    |   34 +
 doc/devdocs/index/Properties.html                  |   42 +
 doc/devdocs/index/Properties10.html                |   42 +
 doc/devdocs/index/Properties11.html                |   34 +
 doc/devdocs/index/Properties12.html                |   34 +
 doc/devdocs/index/Properties13.html                |   38 +
 doc/devdocs/index/Properties14.html                |   50 +
 doc/devdocs/index/Properties2.html                 |   34 +
 doc/devdocs/index/Properties3.html                 |   34 +
 doc/devdocs/index/Properties4.html                 |   34 +
 doc/devdocs/index/Properties5.html                 |   34 +
 doc/devdocs/index/Properties6.html                 |   38 +
 doc/devdocs/index/Properties7.html                 |   42 +
 doc/devdocs/index/Properties8.html                 |   34 +
 doc/devdocs/index/Properties9.html                 |   38 +
 doc/devdocs/javascript/main.js                     |  835 ++++
 doc/devdocs/javascript/searchdata.js               |  212 +
 doc/devdocs/search/ClassesO.html                   |   20 +
 doc/devdocs/search/ClassesU.html                   |   20 +
 doc/devdocs/search/ConstantsB.html                 |   20 +
 doc/devdocs/search/ConstantsC.html                 |   20 +
 doc/devdocs/search/ConstantsD.html                 |   20 +
 doc/devdocs/search/ConstantsE.html                 |   20 +
 doc/devdocs/search/ConstantsF.html                 |   20 +
 doc/devdocs/search/ConstantsI.html                 |   20 +
 doc/devdocs/search/ConstantsK.html                 |   20 +
 doc/devdocs/search/ConstantsL.html                 |   20 +
 doc/devdocs/search/ConstantsM.html                 |   20 +
 doc/devdocs/search/ConstantsO.html                 |   20 +
 doc/devdocs/search/ConstantsR.html                 |   20 +
 doc/devdocs/search/ConstantsS.html                 |   20 +
 doc/devdocs/search/ConstantsT.html                 |   20 +
 doc/devdocs/search/ConstantsU.html                 |   20 +
 doc/devdocs/search/ConstantsV.html                 |   20 +
 doc/devdocs/search/ConstantsX.html                 |   20 +
 doc/devdocs/search/ConstantsY.html                 |   20 +
 doc/devdocs/search/ConstantsZ.html                 |   20 +
 doc/devdocs/search/ConstructorA.html               |   20 +
 doc/devdocs/search/ConstructorB.html               |   20 +
 doc/devdocs/search/ConstructorC.html               |   20 +
 doc/devdocs/search/ConstructorD.html               |   20 +
 doc/devdocs/search/ConstructorE.html               |   20 +
 doc/devdocs/search/ConstructorF.html               |   20 +
 doc/devdocs/search/ConstructorG.html               |   20 +
 doc/devdocs/search/ConstructorH.html               |   20 +
 doc/devdocs/search/ConstructorI.html               |   20 +
 doc/devdocs/search/ConstructorJ.html               |   20 +
 doc/devdocs/search/ConstructorK.html               |   20 +
 doc/devdocs/search/ConstructorL.html               |   20 +
 doc/devdocs/search/ConstructorM.html               |   20 +
 doc/devdocs/search/ConstructorN.html               |   20 +
 doc/devdocs/search/ConstructorO.html               |   20 +
 doc/devdocs/search/ConstructorP.html               |   20 +
 doc/devdocs/search/ConstructorR.html               |   20 +
 doc/devdocs/search/ConstructorS.html               |   20 +
 doc/devdocs/search/ConstructorT.html               |   20 +
 doc/devdocs/search/ConstructorU.html               |   20 +
 doc/devdocs/search/ConstructorV.html               |   20 +
 doc/devdocs/search/ConstructorW.html               |   20 +
 doc/devdocs/search/ConstructorX.html               |   20 +
 doc/devdocs/search/ConstructorY.html               |   20 +
 doc/devdocs/search/ConstructorZ.html               |   20 +
 doc/devdocs/search/FilesA.html                     |   20 +
 doc/devdocs/search/FilesC.html                     |   20 +
 doc/devdocs/search/FilesO.html                     |   20 +
 doc/devdocs/search/FilesS.html                     |   20 +
 doc/devdocs/search/FilesV.html                     |   20 +
 doc/devdocs/search/FilesW.html                     |   20 +
 doc/devdocs/search/FunctionsA.html                 |   20 +
 doc/devdocs/search/FunctionsB.html                 |   20 +
 doc/devdocs/search/FunctionsC.html                 |   20 +
 doc/devdocs/search/FunctionsD.html                 |   20 +
 doc/devdocs/search/FunctionsE.html                 |   20 +
 doc/devdocs/search/FunctionsF.html                 |   20 +
 doc/devdocs/search/FunctionsG.html                 |   20 +
 doc/devdocs/search/FunctionsH.html                 |   20 +
 doc/devdocs/search/FunctionsI.html                 |   20 +
 doc/devdocs/search/FunctionsL.html                 |   20 +
 doc/devdocs/search/FunctionsM.html                 |   20 +
 doc/devdocs/search/FunctionsN.html                 |   20 +
 doc/devdocs/search/FunctionsO.html                 |   20 +
 doc/devdocs/search/FunctionsP.html                 |   20 +
 doc/devdocs/search/FunctionsR.html                 |   20 +
 doc/devdocs/search/FunctionsS.html                 |   20 +
 doc/devdocs/search/FunctionsSymbols.html           |   20 +
 doc/devdocs/search/FunctionsT.html                 |   20 +
 doc/devdocs/search/FunctionsU.html                 |   20 +
 doc/devdocs/search/FunctionsV.html                 |   20 +
 doc/devdocs/search/FunctionsW.html                 |   20 +
 doc/devdocs/search/FunctionsZ.html                 |   20 +
 doc/devdocs/search/GeneralA.html                   |   20 +
 doc/devdocs/search/GeneralB.html                   |   20 +
 doc/devdocs/search/GeneralC.html                   |   20 +
 doc/devdocs/search/GeneralD.html                   |   20 +
 doc/devdocs/search/GeneralE.html                   |   20 +
 doc/devdocs/search/GeneralF.html                   |   20 +
 doc/devdocs/search/GeneralG.html                   |   20 +
 doc/devdocs/search/GeneralH.html                   |   20 +
 doc/devdocs/search/GeneralI.html                   |   20 +
 doc/devdocs/search/GeneralJ.html                   |   20 +
 doc/devdocs/search/GeneralK.html                   |   20 +
 doc/devdocs/search/GeneralL.html                   |   20 +
 doc/devdocs/search/GeneralM.html                   |   20 +
 doc/devdocs/search/GeneralN.html                   |   20 +
 doc/devdocs/search/GeneralO.html                   |   20 +
 doc/devdocs/search/GeneralP.html                   |   20 +
 doc/devdocs/search/GeneralQ.html                   |   20 +
 doc/devdocs/search/GeneralR.html                   |   20 +
 doc/devdocs/search/GeneralS.html                   |   20 +
 doc/devdocs/search/GeneralSymbols.html             |   20 +
 doc/devdocs/search/GeneralT.html                   |   20 +
 doc/devdocs/search/GeneralU.html                   |   20 +
 doc/devdocs/search/GeneralV.html                   |   20 +
 doc/devdocs/search/GeneralW.html                   |   20 +
 doc/devdocs/search/GeneralX.html                   |   20 +
 doc/devdocs/search/GeneralY.html                   |   20 +
 doc/devdocs/search/GeneralZ.html                   |   20 +
 doc/devdocs/search/NoResults.html                  |   15 +
 doc/devdocs/search/PropertiesA.html                |   20 +
 doc/devdocs/search/PropertiesB.html                |   20 +
 doc/devdocs/search/PropertiesC.html                |   20 +
 doc/devdocs/search/PropertiesD.html                |   20 +
 doc/devdocs/search/PropertiesE.html                |   20 +
 doc/devdocs/search/PropertiesF.html                |   20 +
 doc/devdocs/search/PropertiesG.html                |   20 +
 doc/devdocs/search/PropertiesH.html                |   20 +
 doc/devdocs/search/PropertiesI.html                |   20 +
 doc/devdocs/search/PropertiesJ.html                |   20 +
 doc/devdocs/search/PropertiesK.html                |   20 +
 doc/devdocs/search/PropertiesL.html                |   20 +
 doc/devdocs/search/PropertiesM.html                |   20 +
 doc/devdocs/search/PropertiesN.html                |   20 +
 doc/devdocs/search/PropertiesO.html                |   20 +
 doc/devdocs/search/PropertiesP.html                |   20 +
 doc/devdocs/search/PropertiesQ.html                |   20 +
 doc/devdocs/search/PropertiesR.html                |   20 +
 doc/devdocs/search/PropertiesS.html                |   20 +
 doc/devdocs/search/PropertiesSymbols.html          |   20 +
 doc/devdocs/search/PropertiesT.html                |   20 +
 doc/devdocs/search/PropertiesU.html                |   20 +
 doc/devdocs/search/PropertiesV.html                |   20 +
 doc/devdocs/search/PropertiesW.html                |   20 +
 doc/devdocs/search/PropertiesX.html                |   20 +
 doc/devdocs/search/PropertiesY.html                |   20 +
 doc/devdocs/search/PropertiesZ.html                |   20 +
 doc/devdocs/styles/1.css                           |  759 +++
 doc/devdocs/styles/2.css                           |   20 +
 doc/devdocs/styles/main.css                        |    2 +
 doc/licenses/APACHE-2.0.txt                        |  202 +
 doc/licenses/BSD-LICENSE.txt                       |   28 +
 doc/licenses/MIT-LICENSE.txt                       |   18 +
 doc/readme.txt                                     |    7 +
 doc/walkthru.html                                  |   96 +
 doc_config/Data/ClassHierarchy.nd                  |  Bin 0 -> 30562 bytes
 doc_config/Data/ConfigFileInfo.nd                  |    1 +
 doc_config/Data/FileInfo.nd                        |  289 ++
 doc_config/Data/ImageFileInfo.nd                   |  Bin 0 -> 216 bytes
 doc_config/Data/ImageReferenceTable.nd             |  Bin 0 -> 252 bytes
 doc_config/Data/IndexInfo.nd                       |  Bin 0 -> 267 bytes
 doc_config/Data/PreviousMenuState.nd               |  Bin 0 -> 23441 bytes
 doc_config/Data/PreviousSettings.nd                |  Bin 0 -> 115 bytes
 doc_config/Data/SymbolTable.nd                     |  Bin 0 -> 974754 bytes
 doc_config/Languages.txt                           |  113 +
 doc_config/Menu.txt                                |  480 ++
 doc_config/OL.css                                  |   20 +
 doc_config/Topics.txt                              |  102 +
 examples/GMLParser.html                            |   43 +
 examples/Jugl.js                                   |   84 +
 examples/KMLParser.html                            |   47 +
 examples/SLDSelect.html                            |  196 +
 examples/WMSDescribeLayerParser.html               |   41 +
 examples/WMSPost.html                              |  175 +
 examples/accessible.html                           |  139 +
 examples/all-overlays-google.html                  |   29 +
 examples/all-overlays-google.js                    |   19 +
 examples/all-overlays.html                         |   69 +
 examples/animated_panning.html                     |   92 +
 examples/animator.js                               |  670 +++
 examples/arcgis93rest.html                         |   64 +
 examples/arcims-thematic.html                      |   77 +
 examples/arcims.html                               |   52 +
 examples/attribution.html                          |   54 +
 examples/baseLayers.html                           |   96 +
 examples/behavior-fixed-http-gml.html              |   49 +
 examples/bing.html                                 |   49 +
 examples/boxes-vector.html                         |   54 +
 examples/boxes.html                                |   53 +
 examples/browser-name.html                         |   89 +
 examples/buffer.html                               |   49 +
 examples/canvas.html                               |   28 +
 examples/canvas.js                                 |   62 +
 examples/click-handler.html                        |  227 +
 examples/click.html                                |   81 +
 examples/controls.html                             |   63 +
 examples/custom-control-point.html                 |   56 +
 examples/custom-control.html                       |   59 +
 examples/custom-style.html                         |   61 +
 examples/data/line.json                            |   10 +
 examples/data/point.json                           |    8 +
 examples/data/poly.json                            |    9 +
 examples/data/roads.json                           |  349 ++
 examples/debug.html                                |   73 +
 examples/document-drag.html                        |   37 +
 examples/doubleSetCenter.html                      |   32 +
 examples/drag-feature.html                         |  102 +
 examples/draw-feature.html                         |  109 +
 examples/dynamic-text-layer.html                   |   90 +
 examples/editingtoolbar-outside.html               |   52 +
 examples/editingtoolbar.html                       |   47 +
 examples/events.html                               |  150 +
 examples/example-list.html                         |  239 +
 examples/example.html                              |   55 +
 examples/filter-strategy.html                      |   48 +
 examples/filter-strategy.js                        |   89 +
 examples/filter.html                               |   99 +
 examples/fractional-zoom.html                      |   67 +
 examples/fullScreen.html                           |   66 +
 examples/geojson.html                              |   62 +
 examples/georss-flickr.html                        |  100 +
 examples/georss-markers.html                       |   39 +
 examples/georss.html                               |   57 +
 examples/georss.xml                                |  378 ++
 examples/getfeature-wfs.html                       |   83 +
 examples/getfeatureinfo-control.html               |  216 +
 examples/getfeatureinfo-popup.html                 |   90 +
 examples/getfeatureinfo.html                       |   62 +
 examples/gml-layer.html                            |   36 +
 examples/gml/line.xml                              |   42 +
 examples/gml/multipoint.xml                        |   70 +
 examples/gml/multipolygon.xml                      |  106 +
 examples/gml/owls.xml                              |  156 +
 examples/gml/point.xml                             |   42 +
 examples/gml/polygon.xml                           |   89 +
 examples/google-reproject.html                     |   57 +
 examples/google-v3-alloverlays.html                |   28 +
 examples/google-v3-alloverlays.js                  |   35 +
 examples/google-v3.html                            |   32 +
 examples/google-v3.js                              |   32 +
 examples/google.html                               |   63 +
 examples/graphic-name.html                         |   89 +
 examples/graticule.html                            |  111 +
 examples/gutter.html                               |   54 +
 examples/highlight-feature.html                    |   80 +
 examples/hover-handler.html                        |  211 +
 examples/image-layer.html                          |   69 +
 examples/intersects.html                           |  183 +
 examples/kamap.html                                |   39 +
 examples/kamap.txt                                 |  508 ++
 examples/kml-layer.html                            |   43 +
 examples/kml-track.html                            |   36 +
 examples/kml-track.js                              |   40 +
 examples/kml-track.kml                             | 3359 +++++++++++++
 examples/kml/lines.kml                             |  275 ++
 examples/kml/styles.kml                            |   21 +
 examples/kml/sundials.kml                          | 2273 +++++++++
 examples/late-render.html                          |   42 +
 examples/layer-opacity.html                        |   89 +
 examples/layerLoadMonitoring.html                  |  129 +
 examples/layerswitcher.html                        |   55 +
 examples/lite.html                                 |   32 +
 examples/mapguide.html                             |  150 +
 examples/mapserver.html                            |   35 +
 examples/mapserver_untiled.html                    |   35 +
 examples/marker-shadow.html                        |  142 +
 examples/markerResize.html                         |   51 +
 examples/marker_shadow.png                         |  Bin 0 -> 374 bytes
 examples/markers.html                              |   53 +
 examples/markersTextLayer.html                     |   34 +
 examples/measure.html                              |  173 +
 examples/mm.html                                   |   60 +
 examples/modify-feature.html                       |  172 +
 examples/mouse-position.html                       |   40 +
 examples/mousewheel-interval.html                  |   57 +
 examples/multimap-mercator.html                    |   64 +
 examples/multiserver.html                          |   41 +
 examples/mvs.html                                  |  125 +
 examples/navigation-control.html                   |   34 +
 examples/navigation-history.html                   |   57 +
 examples/navtoolbar-alwaysZoom.html                |   78 +
 examples/navtoolbar-outsidemap.html                |   49 +
 examples/navtoolbar.html                           |   39 +
 examples/notile.html                               |   39 +
 examples/ordering.html                             |  211 +
 examples/osm-google.html                           |   27 +
 examples/osm-google.js                             |   28 +
 examples/osm-layer.html                            |  119 +
 examples/osm.html                                  |   35 +
 examples/osm/sutton_coldfield.osm                  |  662 +++
 examples/outOfRangeMarkers.html                    |   61 +
 examples/outOfRangeMarkers.txt                     |    3 +
 examples/overviewmap.html                          |  115 +
 examples/pan-zoom-panels.html                      |   91 +
 examples/panel.html                                |  102 +
 examples/point-track-markers.html                  |   64 +
 examples/popupMatrix.html                          |  904 ++++
 examples/popupMatrix.jpg                           |  Bin 0 -> 46095 bytes
 examples/popups.html                               |  129 +
 examples/projected-map.html                        |   67 +
 examples/protocol-gears.html                       |  257 +
 examples/proxy.cgi                                 |   80 +
 examples/regular-polygons.html                     |  170 +
 examples/resize-features.html                      |   94 +
 examples/restricted-extent.html                    |   70 +
 examples/rotate-features.html                      |  108 +
 examples/select-feature-multilayer.html            |  116 +
 examples/select-feature-openpopup.html             |   99 +
 examples/select-feature.html                       |  156 +
 examples/setextent.html                            |   34 +
 examples/sld-parser.html                           |   65 +
 examples/sld.html                                  |  116 +
 examples/small.jpg                                 |  Bin 0 -> 16415 bytes
 examples/snap-split.html                           |  267 +
 examples/snapping.html                             |  314 ++
 examples/sos.html                                  |  179 +
 examples/spherical-mercator.html                   |  146 +
 examples/split-feature.html                        |  108 +
 examples/strategy-bbox.html                        |   65 +
 examples/strategy-cluster-threshold.html           |  145 +
 examples/strategy-cluster.html                     |  202 +
 examples/strategy-paging.html                      |   79 +
 examples/style-rules.html                          |   43 +
 examples/style-rules.js                            |   99 +
 examples/style.css                                 |   86 +
 examples/stylemap.html                             |   94 +
 examples/styles-context.html                       |  105 +
 examples/styles-rotation.html                      |   86 +
 examples/styles-unique.html                        |  103 +
 examples/sundials-spherical-mercator.html          |  128 +
 examples/sundials.html                             |   98 +
 examples/symbolizers-fill-stroke-graphic.html      |  134 +
 examples/tasmania/TasmaniaCities.xml               |   40 +
 examples/tasmania/TasmaniaRoads.xml                |  204 +
 examples/tasmania/TasmaniaStateBoundaries.xml      |   92 +
 examples/tasmania/TasmaniaWaterBodies.xml          |  162 +
 examples/tasmania/sld-tasmania.xml                 |  594 +++
 examples/teleportation.html                        |   70 +
 examples/textfile.txt                              |    4 +
 examples/thinlong.jpg                              |  Bin 0 -> 60996 bytes
 examples/tilecache.html                            |   63 +
 examples/tms.html                                  |   56 +
 examples/transform-feature.html                    |  105 +
 examples/transition.html                           |   63 +
 examples/urban.html                                |   45 +
 examples/ve-novibrate.html                         |   62 +
 examples/ve.html                                   |   68 +
 examples/vector-features-with-text.html            |  130 +
 examples/vector-features.html                      |  136 +
 examples/vector-formats.html                       |  226 +
 examples/web-mercator.html                         |   46 +
 examples/web-mercator.js                           |   45 +
 examples/wfs-filter.html                           |   29 +
 examples/wfs-filter.js                             |   48 +
 examples/wfs-protocol-transactions.html            |   89 +
 examples/wfs-protocol-transactions.js              |  107 +
 examples/wfs-protocol.html                         |   48 +
 examples/wfs-reprojection.html                     |   37 +
 examples/wfs-reprojection.js                       |   65 +
 examples/wfs-snap-split.html                       |  288 ++
 examples/wfs-states.html                           |   27 +
 examples/wfs-states.js                             |   24 +
 examples/widelong.jpg                              |  Bin 0 -> 214964 bytes
 examples/wideshort.jpg                             |  Bin 0 -> 48477 bytes
 examples/wmc.html                                  |  154 +
 examples/wms-untiled.html                          |   45 +
 examples/wms-v13.html                              |   52 +
 examples/wms.html                                  |   43 +
 examples/wmst.html                                 |   55 +
 examples/wmts-capabilities.html                    |   38 +
 examples/wmts-capabilities.js                      |   64 +
 examples/wmts-getfeatureinfo.html                  |   69 +
 examples/wmts-getfeatureinfo.js                    |   99 +
 examples/wmts.html                                 |   36 +
 examples/wmts.js                                   |   40 +
 examples/worldwind.html                            |   47 +
 examples/wrapDateLine.html                         |   70 +
 examples/xhtml.html                                |   38 +
 examples/xml.html                                  |  155 +
 examples/xml/features.xml                          |    2 +
 examples/xml/georss-flickr.xml                     |  730 +++
 examples/xml/track1.xml                            |   98 +
 examples/xml/wmsdescribelayer.xml                  |    5 +
 examples/xyz-esri.html                             |   34 +
 examples/xyz-offset.html                           |   33 +
 examples/xyz-offset.js                             |   37 +
 examples/yahoo.html                                |   46 +
 examples/yelp-georss.xml                           |  147 +
 examples/zoomLevels.html                           |   76 +
 examples/zoomify.html                              |   70 +
 img/blank.gif                                      |  Bin 0 -> 42 bytes
 img/cloud-popup-relative.png                       |  Bin 0 -> 3177 bytes
 img/drag-rectangle-off.png                         |  Bin 0 -> 1202 bytes
 img/drag-rectangle-on.png                          |  Bin 0 -> 1218 bytes
 img/east-mini.png                                  |  Bin 0 -> 451 bytes
 img/layer-switcher-maximize.png                    |  Bin 0 -> 451 bytes
 img/layer-switcher-minimize.png                    |  Bin 0 -> 249 bytes
 img/marker-blue.png                                |  Bin 0 -> 992 bytes
 img/marker-gold.png                                |  Bin 0 -> 831 bytes
 img/marker-green.png                               |  Bin 0 -> 967 bytes
 img/marker.png                                     |  Bin 0 -> 606 bytes
 img/measuring-stick-off.png                        |  Bin 0 -> 3343 bytes
 img/measuring-stick-on.png                         |  Bin 0 -> 3816 bytes
 img/north-mini.png                                 |  Bin 0 -> 484 bytes
 img/panning-hand-off.png                           |  Bin 0 -> 3875 bytes
 img/panning-hand-on.png                            |  Bin 0 -> 3977 bytes
 img/slider.png                                     |  Bin 0 -> 285 bytes
 img/south-mini.png                                 |  Bin 0 -> 481 bytes
 img/west-mini.png                                  |  Bin 0 -> 453 bytes
 img/zoom-minus-mini.png                            |  Bin 0 -> 359 bytes
 img/zoom-plus-mini.png                             |  Bin 0 -> 489 bytes
 img/zoom-world-mini.png                            |  Bin 0 -> 1072 bytes
 img/zoombar.png                                    |  Bin 0 -> 463 bytes
 lib/Firebug/errorIcon.png                          |  Bin 0 -> 457 bytes
 lib/Firebug/firebug.css                            |  209 +
 lib/Firebug/firebug.html                           |   23 +
 lib/Firebug/firebug.js                             |  674 +++
 lib/Firebug/firebugx.js                            |    9 +
 lib/Firebug/infoIcon.png                           |  Bin 0 -> 524 bytes
 lib/Firebug/license.txt                            |   30 +
 lib/Firebug/readme.txt                             |   13 +
 lib/Firebug/warningIcon.png                        |  Bin 0 -> 516 bytes
 lib/Gears/gears_init.js                            |   88 +
 lib/OpenLayers.js                                  |  348 ++
 lib/OpenLayers/Ajax.js                             |  678 +++
 lib/OpenLayers/BaseTypes.js                        |  682 +++
 lib/OpenLayers/BaseTypes/Bounds.js                 |  681 +++
 lib/OpenLayers/BaseTypes/Class.js                  |  116 +
 lib/OpenLayers/BaseTypes/Element.js                |  251 +
 lib/OpenLayers/BaseTypes/LonLat.js                 |  190 +
 lib/OpenLayers/BaseTypes/Pixel.js                  |  125 +
 lib/OpenLayers/BaseTypes/Size.js                   |   85 +
 lib/OpenLayers/Console.js                          |  246 +
 lib/OpenLayers/Control.js                          |  368 ++
 lib/OpenLayers/Control/ArgParser.js                |  166 +
 lib/OpenLayers/Control/Attribution.js              |   97 +
 lib/OpenLayers/Control/Button.js                   |   44 +
 lib/OpenLayers/Control/DragFeature.js              |  303 ++
 lib/OpenLayers/Control/DragPan.js                  |   94 +
 lib/OpenLayers/Control/DrawFeature.js              |  126 +
 lib/OpenLayers/Control/EditingToolbar.js           |   63 +
 lib/OpenLayers/Control/GetFeature.js               |  595 +++
 lib/OpenLayers/Control/Graticule.js                |  373 ++
 lib/OpenLayers/Control/KeyboardDefaults.js         |  127 +
 lib/OpenLayers/Control/LayerSwitcher.js            |  620 +++
 lib/OpenLayers/Control/Measure.js                  |  321 ++
 lib/OpenLayers/Control/ModifyFeature.js            |  777 +++
 lib/OpenLayers/Control/MouseDefaults.js            |  368 ++
 lib/OpenLayers/Control/MousePosition.js            |  213 +
 lib/OpenLayers/Control/MouseToolbar.js             |  406 ++
 lib/OpenLayers/Control/NavToolbar.js               |   55 +
 lib/OpenLayers/Control/Navigation.js               |  303 ++
 lib/OpenLayers/Control/NavigationHistory.js        |  423 ++
 lib/OpenLayers/Control/OverviewMap.js              |  720 +++
 lib/OpenLayers/Control/Pan.js                      |   86 +
 lib/OpenLayers/Control/PanPanel.js                 |   63 +
 lib/OpenLayers/Control/PanZoom.js                  |  246 +
 lib/OpenLayers/Control/PanZoomBar.js               |  396 ++
 lib/OpenLayers/Control/Panel.js                    |  371 ++
 lib/OpenLayers/Control/Permalink.js                |  220 +
 lib/OpenLayers/Control/SLDSelect.js                |  570 +++
 lib/OpenLayers/Control/Scale.js                    |   99 +
 lib/OpenLayers/Control/ScaleLine.js                |  223 +
 lib/OpenLayers/Control/SelectFeature.js            |  613 +++
 lib/OpenLayers/Control/Snapping.js                 |  547 +++
 lib/OpenLayers/Control/Split.js                    |  498 ++
 lib/OpenLayers/Control/TransformFeature.js         |  579 +++
 lib/OpenLayers/Control/WMSGetFeatureInfo.js        |  524 ++
 lib/OpenLayers/Control/WMTSGetFeatureInfo.js       |  442 ++
 lib/OpenLayers/Control/ZoomBox.js                  |   95 +
 lib/OpenLayers/Control/ZoomIn.js                   |   35 +
 lib/OpenLayers/Control/ZoomOut.js                  |   35 +
 lib/OpenLayers/Control/ZoomPanel.js                |   54 +
 lib/OpenLayers/Control/ZoomToMaxExtent.js          |   40 +
 lib/OpenLayers/Events.js                           |  855 ++++
 lib/OpenLayers/Feature.js                          |  227 +
 lib/OpenLayers/Feature/Vector.js                   |  454 ++
 lib/OpenLayers/Feature/WFS.js                      |   80 +
 lib/OpenLayers/Filter.js                           |   68 +
 lib/OpenLayers/Filter/Comparison.js                |  258 +
 lib/OpenLayers/Filter/FeatureId.js                 |   81 +
 lib/OpenLayers/Filter/Logical.js                   |  119 +
 lib/OpenLayers/Filter/Spatial.js                   |  128 +
 lib/OpenLayers/Format.js                           |  123 +
 lib/OpenLayers/Format/ArcXML.js                    | 1028 ++++
 lib/OpenLayers/Format/ArcXML/Features.js           |   49 +
 lib/OpenLayers/Format/Atom.js                      |  727 +++
 lib/OpenLayers/Format/CSWGetDomain.js              |   34 +
 lib/OpenLayers/Format/CSWGetDomain/v2_0_2.js       |  243 +
 lib/OpenLayers/Format/CSWGetRecords.js             |   34 +
 lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js      |  440 ++
 lib/OpenLayers/Format/Context.js                   |  334 ++
 lib/OpenLayers/Format/Filter.js                    |  115 +
 lib/OpenLayers/Format/Filter/v1.js                 |  426 ++
 lib/OpenLayers/Format/Filter/v1_0_0.js             |  169 +
 lib/OpenLayers/Format/Filter/v1_1_0.js             |  182 +
 lib/OpenLayers/Format/GML.js                       |  924 ++++
 lib/OpenLayers/Format/GML/Base.js                  |  578 +++
 lib/OpenLayers/Format/GML/v2.js                    |  193 +
 lib/OpenLayers/Format/GML/v3.js                    |  462 ++
 lib/OpenLayers/Format/GPX.js                       |  184 +
 lib/OpenLayers/Format/GeoJSON.js                   |  716 +++
 lib/OpenLayers/Format/GeoRSS.js                    |  420 ++
 lib/OpenLayers/Format/JSON.js                      |  389 ++
 lib/OpenLayers/Format/KML.js                       | 1429 ++++++
 lib/OpenLayers/Format/OSM.js                       |  457 ++
 lib/OpenLayers/Format/OWSCommon/v1.js              |  256 +
 lib/OpenLayers/Format/OWSCommon/v1_0_0.js          |   50 +
 lib/OpenLayers/Format/OWSCommon/v1_1_0.js          |   64 +
 lib/OpenLayers/Format/OWSContext.js                |   81 +
 lib/OpenLayers/Format/OWSContext/v0_3_1.js         |  589 +++
 lib/OpenLayers/Format/SLD.js                       |  131 +
 lib/OpenLayers/Format/SLD/v1.js                    | 1100 +++++
 lib/OpenLayers/Format/SLD/v1_0_0.js                |   51 +
 lib/OpenLayers/Format/SOSCapabilities.js           |   83 +
 lib/OpenLayers/Format/SOSCapabilities/v1_0_0.js    |  158 +
 lib/OpenLayers/Format/SOSGetFeatureOfInterest.js   |  193 +
 lib/OpenLayers/Format/SOSGetObservation.js         |  262 +
 lib/OpenLayers/Format/Text.js                      |  152 +
 lib/OpenLayers/Format/WFS.js                       |  220 +
 lib/OpenLayers/Format/WFSCapabilities.js           |   80 +
 lib/OpenLayers/Format/WFSCapabilities/v1.js        |  126 +
 lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js    |  157 +
 lib/OpenLayers/Format/WFSCapabilities/v1_1_0.js    |   36 +
 lib/OpenLayers/Format/WFSDescribeFeatureType.js    |  198 +
 lib/OpenLayers/Format/WFST.js                      |   34 +
 lib/OpenLayers/Format/WFST/v1.js                   |  368 ++
 lib/OpenLayers/Format/WFST/v1_0_0.js               |  150 +
 lib/OpenLayers/Format/WFST/v1_1_0.js               |  161 +
 lib/OpenLayers/Format/WKT.js                       |  358 ++
 lib/OpenLayers/Format/WMC.js                       |  152 +
 lib/OpenLayers/Format/WMC/v1.js                    |  835 ++++
 lib/OpenLayers/Format/WMC/v1_0_0.js                |   76 +
 lib/OpenLayers/Format/WMC/v1_1_0.js                |  127 +
 lib/OpenLayers/Format/WMSCapabilities.js           |   82 +
 lib/OpenLayers/Format/WMSCapabilities/v1.js        |  418 ++
 lib/OpenLayers/Format/WMSCapabilities/v1_1.js      |  118 +
 lib/OpenLayers/Format/WMSCapabilities/v1_1_0.js    |   62 +
 lib/OpenLayers/Format/WMSCapabilities/v1_1_1.js    |   58 +
 lib/OpenLayers/Format/WMSCapabilities/v1_3.js      |  128 +
 lib/OpenLayers/Format/WMSCapabilities/v1_3_0.js    |   30 +
 lib/OpenLayers/Format/WMSDescribeLayer.js          |   91 +
 lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js     |  100 +
 lib/OpenLayers/Format/WMSGetFeatureInfo.js         |  284 ++
 lib/OpenLayers/Format/WMTSCapabilities.js          |  162 +
 lib/OpenLayers/Format/WMTSCapabilities/v1_0_0.js   |  221 +
 lib/OpenLayers/Format/XML.js                       |  881 ++++
 lib/OpenLayers/Geometry.js                         |  456 ++
 lib/OpenLayers/Geometry/Collection.js              |  546 +++
 lib/OpenLayers/Geometry/Curve.js                   |   93 +
 lib/OpenLayers/Geometry/LineString.js              |  552 +++
 lib/OpenLayers/Geometry/LinearRing.js              |  417 ++
 lib/OpenLayers/Geometry/MultiLineString.js         |  262 +
 lib/OpenLayers/Geometry/MultiPoint.js              |   70 +
 lib/OpenLayers/Geometry/MultiPolygon.js            |   46 +
 lib/OpenLayers/Geometry/Point.js                   |  283 ++
 lib/OpenLayers/Geometry/Polygon.js                 |  259 +
 lib/OpenLayers/Geometry/Rectangle.js               |   99 +
 lib/OpenLayers/Geometry/Surface.js                 |   17 +
 lib/OpenLayers/Handler.js                          |  287 ++
 lib/OpenLayers/Handler/Box.js                      |  221 +
 lib/OpenLayers/Handler/Click.js                    |  325 ++
 lib/OpenLayers/Handler/Drag.js                     |  420 ++
 lib/OpenLayers/Handler/Feature.js                  |  388 ++
 lib/OpenLayers/Handler/Hover.js                    |  183 +
 lib/OpenLayers/Handler/Keyboard.js                 |  109 +
 lib/OpenLayers/Handler/MouseWheel.js               |  283 ++
 lib/OpenLayers/Handler/Path.js                     |  302 ++
 lib/OpenLayers/Handler/Point.js                    |  373 ++
 lib/OpenLayers/Handler/Polygon.js                  |  144 +
 lib/OpenLayers/Handler/RegularPolygon.js           |  421 ++
 lib/OpenLayers/Icon.js                             |  227 +
 lib/OpenLayers/Lang.js                             |  133 +
 lib/OpenLayers/Lang/ar.js                          |   38 +
 lib/OpenLayers/Lang/be-tarask.js                   |   80 +
 lib/OpenLayers/Lang/bg.js                          |   29 +
 lib/OpenLayers/Lang/br.js                          |   79 +
 lib/OpenLayers/Lang/ca.js                          |  128 +
 lib/OpenLayers/Lang/cs-CZ.js                       |   69 +
 lib/OpenLayers/Lang/da-DK.js                       |  119 +
 lib/OpenLayers/Lang/de.js                          |   81 +
 lib/OpenLayers/Lang/el.js                          |   19 +
 lib/OpenLayers/Lang/en-CA.js                       |   21 +
 lib/OpenLayers/Lang/en.js                          |  128 +
 lib/OpenLayers/Lang/es.js                          |  129 +
 lib/OpenLayers/Lang/fi.js                          |   34 +
 lib/OpenLayers/Lang/fr.js                          |   80 +
 lib/OpenLayers/Lang/fur.js                         |   35 +
 lib/OpenLayers/Lang/gl.js                          |   79 +
 lib/OpenLayers/Lang/gsw.js                         |   79 +
 lib/OpenLayers/Lang/hr.js                          |   61 +
 lib/OpenLayers/Lang/hsb.js                         |   79 +
 lib/OpenLayers/Lang/hu.js                          |   80 +
 lib/OpenLayers/Lang/ia.js                          |   79 +
 lib/OpenLayers/Lang/id.js                          |   80 +
 lib/OpenLayers/Lang/io.js                          |   19 +
 lib/OpenLayers/Lang/is.js                          |   37 +
 lib/OpenLayers/Lang/it.js                          |  116 +
 lib/OpenLayers/Lang/ja.js                          |   80 +
 lib/OpenLayers/Lang/km.js                          |   25 +
 lib/OpenLayers/Lang/ksh.js                         |   79 +
 lib/OpenLayers/Lang/nb.js                          |  118 +
 lib/OpenLayers/Lang/nds.js                         |   61 +
 lib/OpenLayers/Lang/nl.js                          |   79 +
 lib/OpenLayers/Lang/nn.js                          |   27 +
 lib/OpenLayers/Lang/oc.js                          |   79 +
 lib/OpenLayers/Lang/pt-BR.js                       |   80 +
 lib/OpenLayers/Lang/pt.js                          |   81 +
 lib/OpenLayers/Lang/ru.js                          |   82 +
 lib/OpenLayers/Lang/sk.js                          |   71 +
 lib/OpenLayers/Lang/sv-SE.js                       |   71 +
 lib/OpenLayers/Lang/te.js                          |   27 +
 lib/OpenLayers/Lang/vi.js                          |   79 +
 lib/OpenLayers/Lang/zh-CN.js                       |  116 +
 lib/OpenLayers/Lang/zh-TW.js                       |  117 +
 lib/OpenLayers/Layer.js                            | 1304 +++++
 lib/OpenLayers/Layer/ArcGIS93Rest.js               |  253 +
 lib/OpenLayers/Layer/ArcIMS.js                     |  466 ++
 lib/OpenLayers/Layer/Boxes.js                      |   76 +
 lib/OpenLayers/Layer/EventPane.js                  |  418 ++
 lib/OpenLayers/Layer/FixedZoomLevels.js            |  315 ++
 lib/OpenLayers/Layer/GML.js                        |  174 +
 lib/OpenLayers/Layer/GeoRSS.js                     |  266 +
 lib/OpenLayers/Layer/Google.js                     |  795 +++
 lib/OpenLayers/Layer/Google/v3.js                  |  419 ++
 lib/OpenLayers/Layer/Grid.js                       |  755 +++
 lib/OpenLayers/Layer/HTTPRequest.js                |  230 +
 lib/OpenLayers/Layer/Image.js                      |  254 +
 lib/OpenLayers/Layer/KaMap.js                      |  206 +
 lib/OpenLayers/Layer/KaMapCache.js                 |  148 +
 lib/OpenLayers/Layer/MapGuide.js                   |  489 ++
 lib/OpenLayers/Layer/MapServer.js                  |  199 +
 lib/OpenLayers/Layer/MapServer/Untiled.js          |   72 +
 lib/OpenLayers/Layer/Markers.js                    |  187 +
 lib/OpenLayers/Layer/MultiMap.js                   |  284 ++
 lib/OpenLayers/Layer/PointTrack.js                 |  103 +
 lib/OpenLayers/Layer/SphericalMercator.js          |  196 +
 lib/OpenLayers/Layer/TMS.js                        |  167 +
 lib/OpenLayers/Layer/Text.js                       |  264 +
 lib/OpenLayers/Layer/TileCache.js                  |  165 +
 lib/OpenLayers/Layer/Vector.js                     |  947 ++++
 lib/OpenLayers/Layer/Vector/RootContainer.js       |  157 +
 lib/OpenLayers/Layer/VirtualEarth.js               |  368 ++
 lib/OpenLayers/Layer/WFS.js                        |  609 +++
 lib/OpenLayers/Layer/WMS.js                        |  268 +
 lib/OpenLayers/Layer/WMS/Post.js                   |   99 +
 lib/OpenLayers/Layer/WMS/Untiled.js                |   72 +
 lib/OpenLayers/Layer/WMTS.js                       |  476 ++
 lib/OpenLayers/Layer/WorldWind.js                  |  120 +
 lib/OpenLayers/Layer/XYZ.js                        |  196 +
 lib/OpenLayers/Layer/Yahoo.js                      |  430 ++
 lib/OpenLayers/Layer/Zoomify.js                    |  308 ++
 lib/OpenLayers/Map.js                              | 2417 +++++++++
 lib/OpenLayers/Marker.js                           |  242 +
 lib/OpenLayers/Marker/Box.js                       |  120 +
 lib/OpenLayers/Popup.js                            | 1052 ++++
 lib/OpenLayers/Popup/Anchored.js                   |  198 +
 lib/OpenLayers/Popup/AnchoredBubble.js             |  190 +
 lib/OpenLayers/Popup/Framed.js                     |  343 ++
 lib/OpenLayers/Popup/FramedCloud.js                |  231 +
 lib/OpenLayers/Projection.js                       |  178 +
 lib/OpenLayers/Protocol.js                         |  272 ++
 lib/OpenLayers/Protocol/HTTP.js                    |  655 +++
 lib/OpenLayers/Protocol/SOS.js                     |   33 +
 lib/OpenLayers/Protocol/SOS/v1_0_0.js              |  132 +
 lib/OpenLayers/Protocol/SQL.js                     |   88 +
 lib/OpenLayers/Protocol/SQL/Gears.js               |  561 +++
 lib/OpenLayers/Protocol/WFS.js                     |   71 +
 lib/OpenLayers/Protocol/WFS/v1.js                  |  342 ++
 lib/OpenLayers/Protocol/WFS/v1_0_0.js              |   44 +
 lib/OpenLayers/Protocol/WFS/v1_1_0.js              |   48 +
 lib/OpenLayers/Renderer.js                         |  362 ++
 lib/OpenLayers/Renderer/Canvas.js                  |  494 ++
 lib/OpenLayers/Renderer/Elements.js                | 1010 ++++
 lib/OpenLayers/Renderer/SVG.js                     |  995 ++++
 lib/OpenLayers/Renderer/VML.js                     |  999 ++++
 lib/OpenLayers/Request.js                          |  358 ++
 lib/OpenLayers/Request/XMLHttpRequest.js           |  384 ++
 lib/OpenLayers/Rule.js                             |  240 +
 lib/OpenLayers/SingleFile.js                       |   10 +
 lib/OpenLayers/Strategy.js                         |  117 +
 lib/OpenLayers/Strategy/BBOX.js                    |  278 ++
 lib/OpenLayers/Strategy/Cluster.js                 |  280 ++
 lib/OpenLayers/Strategy/Filter.js                  |  164 +
 lib/OpenLayers/Strategy/Fixed.js                   |  138 +
 lib/OpenLayers/Strategy/Paging.js                  |  236 +
 lib/OpenLayers/Strategy/Refresh.js                 |  140 +
 lib/OpenLayers/Strategy/Save.js                    |  229 +
 lib/OpenLayers/Style.js                            |  443 ++
 lib/OpenLayers/Style2.js                           |  111 +
 lib/OpenLayers/StyleMap.js                         |  160 +
 lib/OpenLayers/Symbolizer.js                       |   51 +
 lib/OpenLayers/Symbolizer/Line.js                  |   69 +
 lib/OpenLayers/Symbolizer/Point.js                 |  141 +
 lib/OpenLayers/Symbolizer/Polygon.js               |   81 +
 lib/OpenLayers/Symbolizer/Raster.js                |   34 +
 lib/OpenLayers/Symbolizer/Text.js                  |   65 +
 lib/OpenLayers/Tile.js                             |  281 ++
 lib/OpenLayers/Tile/Image.js                       |  578 +++
 lib/OpenLayers/Tile/Image/IFrame.js                |  262 +
 lib/OpenLayers/Tile/WFS.js                         |  192 +
 lib/OpenLayers/Tween.js                            |  318 ++
 lib/OpenLayers/Util.js                             | 1797 +++++++
 lib/Rico/Color.js                                  |  244 +
 lib/Rico/Corner.js                                 |  330 ++
 license.txt                                        |   38 +
 news.txt                                           |   59 +
 readme.txt                                         |   72 +
 release-license.txt                                |    3 +
 repository-license.txt                             |    3 +
 tests/Ajax.html                                    |   27 +
 tests/BaseTypes.html                               |  518 ++
 tests/BaseTypes/Bounds.html                        |  637 +++
 tests/BaseTypes/Class.html                         |  315 ++
 tests/BaseTypes/Element.html                       |  237 +
 tests/BaseTypes/LonLat.html                        |  178 +
 tests/BaseTypes/Pixel.html                         |  111 +
 tests/BaseTypes/Size.html                          |   67 +
 tests/Console.html                                 |   39 +
 tests/Control.html                                 |  106 +
 tests/Control/Attribution.html                     |   59 +
 tests/Control/Button.html                          |   17 +
 tests/Control/DragFeature.html                     |  279 ++
 tests/Control/DragPan.html                         |  104 +
 tests/Control/DrawFeature.html                     |  111 +
 tests/Control/GetFeature.html                      |  177 +
 tests/Control/Graticule.html                       |   66 +
 tests/Control/KeyboardDefaults.html                |  172 +
 tests/Control/LayerSwitcher.html                   |  199 +
 tests/Control/Measure.html                         |  122 +
 tests/Control/ModifyFeature.html                   |  708 +++
 tests/Control/MousePosition.html                   |  109 +
 tests/Control/MouseToolbar.html                    |   59 +
 tests/Control/NavToolbar.html                      |   34 +
 tests/Control/Navigation.html                      |  153 +
 tests/Control/NavigationHistory.html               |  245 +
 tests/Control/OverviewMap.html                     |  181 +
 tests/Control/PanPanel.html                        |   23 +
 tests/Control/PanZoom.html                         |  230 +
 tests/Control/PanZoomBar.html                      |   89 +
 tests/Control/Panel.html                           |  236 +
 tests/Control/Permalink.html                       |  237 +
 tests/Control/SLDSelect.html                       |  182 +
 tests/Control/Scale.html                           |   53 +
 tests/Control/ScaleLine.html                       |  187 +
 tests/Control/SelectFeature.html                   |  418 ++
 tests/Control/Snapping.html                        |  334 ++
 tests/Control/Split.html                           |  296 ++
 tests/Control/TransformFeature.html                |   83 +
 tests/Control/WMSGetFeatureInfo.html               |  511 ++
 tests/Control/WMTSGetFeatureInfo.html              |  334 ++
 tests/Events.html                                  |  457 ++
 tests/Extras.html                                  |   21 +
 tests/Feature.html                                 |  200 +
 tests/Feature/Vector.html                          |  170 +
 tests/Filter.html                                  |   21 +
 tests/Filter/Comparison.html                       |  317 ++
 tests/Filter/FeatureId.html                        |   67 +
 tests/Filter/Logical.html                          |  144 +
 tests/Filter/Spatial.html                          |  112 +
 tests/Format.html                                  |   23 +
 tests/Format/ArcXML.html                           |  277 ++
 tests/Format/ArcXML/Features.html                  |   69 +
 tests/Format/Atom.html                             |  450 ++
 tests/Format/CSWGetDomain.html                     |   23 +
 tests/Format/CSWGetDomain/v2_0_2.html              |   56 +
 tests/Format/CSWGetDomain/v2_0_2.js                |   18 +
 tests/Format/CSWGetRecords.html                    |   23 +
 tests/Format/CSWGetRecords/v2_0_2.html             |   81 +
 tests/Format/CSWGetRecords/v2_0_2.js               |   44 +
 tests/Format/Filter.html                           |   21 +
 tests/Format/Filter/v1.html                        |  174 +
 tests/Format/Filter/v1_0_0.html                    |  160 +
 tests/Format/Filter/v1_1_0.html                    |  210 +
 tests/Format/GML.html                              |  462 ++
 tests/Format/GML/cases.js                          |  227 +
 tests/Format/GML/v2.html                           |  668 +++
 tests/Format/GML/v3.html                           |  790 +++
 tests/Format/GPX.html                              |   41 +
 tests/Format/GeoJSON.html                          |  428 ++
 tests/Format/GeoRSS.html                           |  105 +
 tests/Format/JSON.html                             |   53 +
 tests/Format/KML.html                              | 1215 +++++
 tests/Format/OSM.html                              |  103 +
 tests/Format/OWSContext/v0_3_1.html                |  240 +
 tests/Format/SLD.html                              |   36 +
 tests/Format/SLD/v1_0_0.html                       |  865 ++++
 tests/Format/SOSCapabilities/v1_0_0.html           |   80 +
 tests/Format/SOSCapabilities/v1_0_0.js             |  484 ++
 tests/Format/SOSGetFeatureOfInterest.html          |   80 +
 tests/Format/SOSGetObservation.html                |   68 +
 tests/Format/Text.html                             |   49 +
 tests/Format/WFS.html                              |   81 +
 tests/Format/WFSCapabilities.html                  |   43 +
 tests/Format/WFSCapabilities/v1.html               |  153 +
 tests/Format/WFSDescribeFeatureType.html           |  381 ++
 tests/Format/WFST.html                             |   23 +
 tests/Format/WFST/v1.html                          |  236 +
 tests/Format/WFST/v1_0_0.html                      |  122 +
 tests/Format/WFST/v1_1_0.html                      |  138 +
 tests/Format/WKT.html                              |  244 +
 tests/Format/WMC.html                              |  153 +
 tests/Format/WMC/v1.html                           |  207 +
 tests/Format/WMC/v1_1_0.html                       |   86 +
 tests/Format/WMSCapabilities.html                  |   20 +
 tests/Format/WMSCapabilities/v1_1_1.html           | 5140 ++++++++++++++++++++
 tests/Format/WMSCapabilities/v1_3_0.html           |  578 +++
 tests/Format/WMSDescribeLayer.html                 |   41 +
 tests/Format/WMSGetFeatureInfo.html                |  278 ++
 tests/Format/WMTSCapabilities.html                 |   20 +
 tests/Format/WMTSCapabilities/v1_0_0.html          |  323 ++
 tests/Format/XML.html                              |  858 ++++
 tests/Geometry.html                                |  344 ++
 tests/Geometry/Collection.html                     |  414 ++
 tests/Geometry/Curve.html                          |  157 +
 tests/Geometry/LineString.html                     |  383 ++
 tests/Geometry/LinearRing.html                     |  258 +
 tests/Geometry/MultiLineString.html                |  267 +
 tests/Geometry/MultiPoint.html                     |  130 +
 tests/Geometry/MultiPolygon.html                   |   34 +
 tests/Geometry/Point.html                          |  214 +
 tests/Geometry/Polygon.html                        |  381 ++
 tests/Geometry/Rectangle.html                      |   76 +
 tests/Geometry/Surface.html                        |   22 +
 tests/Handler.html                                 |  261 +
 tests/Handler/Click.html                           |  299 ++
 tests/Handler/Drag.html                            |  390 ++
 tests/Handler/Feature.html                         |  484 ++
 tests/Handler/Hover.html                           |  136 +
 tests/Handler/Keyboard.html                        |  106 +
 tests/Handler/MouseWheel.html                      |  182 +
 tests/Handler/Path.html                            |  186 +
 tests/Handler/Point.html                           |  227 +
 tests/Handler/Polygon.html                         |  201 +
 tests/Handler/RegularPolygon.html                  |  228 +
 tests/Icon.html                                    |   68 +
 tests/Lang.html                                    |  106 +
 tests/Layer.html                                   |  836 ++++
 tests/Layer/ArcGIS93Rest.html                      |  363 ++
 tests/Layer/ArcIMS.html                            |  123 +
 tests/Layer/EventPane.html                         |  168 +
 tests/Layer/FixedZoomLevels.html                   |  109 +
 tests/Layer/GML.html                               |   60 +
 tests/Layer/GeoRSS.html                            |  210 +
 tests/Layer/Google.html                            |  360 ++
 tests/Layer/Google/v3.html                         |  364 ++
 tests/Layer/Grid.html                              |  642 +++
 tests/Layer/HTTPRequest.html                       |  226 +
 tests/Layer/Image.html                             |  164 +
 tests/Layer/KaMap.html                             |  287 ++
 tests/Layer/MapGuide.html                          |  177 +
 tests/Layer/MapServer.html                         |  472 ++
 tests/Layer/Markers.html                           |  156 +
 tests/Layer/MultiMap.html                          |  106 +
 tests/Layer/PointTrack.html                        |   79 +
 tests/Layer/SphericalMercator.html                 |   95 +
 tests/Layer/TMS.html                               |  268 +
 tests/Layer/Text.html                              |  211 +
 tests/Layer/TileCache.html                         |  203 +
 tests/Layer/Vector.html                            |  786 +++
 tests/Layer/Vector/RootContainer.html              |   63 +
 tests/Layer/WFS.html                               |  177 +
 tests/Layer/WMS.html                               |  496 ++
 tests/Layer/WMS/Post.html                          |   86 +
 tests/Layer/WMTS.html                              | 1424 ++++++
 tests/Layer/WrapDateLine.html                      |  182 +
 tests/Layer/XYZ.html                               |  236 +
 tests/Layer/Yahoo.html                             |  120 +
 tests/Layer/atom-1.0.xml                           |   34 +
 tests/Layer/data_Layer_Text_textfile.txt           |    3 +
 tests/Layer/data_Layer_Text_textfile_2.txt         |    3 +
 tests/Layer/data_Layer_Text_textfile_overflow.txt  |    3 +
 tests/Layer/georss.txt                             |  378 ++
 tests/Layer/mice.xml                               |  156 +
 tests/Layer/owls.xml                               |  156 +
 tests/Map.html                                     | 1627 +++++++
 tests/Marker.html                                  |  163 +
 tests/Marker/Box.html                              |  183 +
 tests/OpenLayers.html                              |   31 +
 tests/Popup.html                                   |  213 +
 tests/Popup/Anchored.html                          |   37 +
 tests/Popup/AnchoredBubble.html                    |   59 +
 tests/Popup/FramedCloud.html                       |   18 +
 tests/Projection.html                              |   30 +
 tests/Protocol.html                                |   63 +
 tests/Protocol/HTTP.html                           | 1087 +++++
 tests/Protocol/SOS.html                            |   57 +
 tests/Protocol/SQL.html                            |   23 +
 tests/Protocol/SQL/Gears.html                      |  473 ++
 tests/Protocol/WFS.html                            |  302 ++
 tests/README.txt                                   |   16 +
 tests/Renderer.html                                |   80 +
 tests/Renderer/Canvas.html                         |   86 +
 tests/Renderer/Elements.html                       |  571 +++
 tests/Renderer/SVG.html                            |  489 ++
 tests/Renderer/VML.html                            |  468 ++
 tests/Request.html                                 |  394 ++
 tests/Request/XMLHttpRequest.html                  |   14 +
 tests/Rule.html                                    |  123 +
 tests/Strategy.html                                |   94 +
 tests/Strategy/BBOX.html                           |  278 ++
 tests/Strategy/Cluster.html                        |  130 +
 tests/Strategy/Filter.html                         |  108 +
 tests/Strategy/Fixed.html                          |  193 +
 tests/Strategy/Paging.html                         |  113 +
 tests/Strategy/Refresh.html                        |  162 +
 tests/Strategy/Save.html                           |  127 +
 tests/Style.html                                   |  395 ++
 tests/Style2.html                                  |   56 +
 tests/StyleMap.html                                |   44 +
 tests/Symbolizer.html                              |   31 +
 tests/Symbolizer/Line.html                         |   32 +
 tests/Symbolizer/Point.html                        |   32 +
 tests/Symbolizer/Polygon.html                      |   32 +
 tests/Symbolizer/Raster.html                       |   32 +
 tests/Symbolizer/Text.html                         |   32 +
 tests/Tile.html                                    |   95 +
 tests/Tile/Image.html                              |  302 ++
 tests/Tile/Image/IFrame.html                       |  225 +
 tests/Tile/WFS.html                                |  173 +
 tests/Tween.html                                   |   68 +
 tests/Util.html                                    | 1083 +++++
 tests/atom-1.0.xml                                 |   34 +
 tests/auto-tests.html                              | 2447 ++++++++++
 tests/data/geos_wkt_intersects.js                  |  495 ++
 tests/data/osm.js                                  |   14 +
 tests/data_Layer_Text_textfile.txt                 |    3 +
 tests/data_Layer_Text_textfile_2.txt               |    3 +
 tests/data_Layer_Text_textfile_overflow.txt        |    3 +
 tests/geom_eq.js                                   |  110 +
 tests/georss.txt                                   |  378 ++
 tests/grid_inittiles.html                          |   30 +
 tests/index.html                                   |    6 +
 tests/list-tests.html                              |  202 +
 tests/manual/ajax.html                             |   49 +
 tests/manual/ajax.txt                              |    1 +
 tests/manual/arcims-2117.html                      |  103 +
 tests/manual/arkansas.rss                          |    9 +
 tests/manual/big-georss.html                       |   27 +
 tests/manual/clip-features-svg.html                |  128 +
 tests/manual/draw-feature.html                     |   73 +
 tests/manual/feature-handler.html                  |  126 +
 tests/manual/geodesic.html                         |  160 +
 tests/manual/geojson-geomcoll-reprojection.html    |   74 +
 tests/manual/google-panning.html                   |  122 +
 tests/manual/google-resize.html                    |   55 +
 tests/manual/memory/Marker-2258.html               |   60 +
 tests/manual/memory/PanZoom-2323.html              |   41 +
 tests/manual/memory/RemoveChild-2170.html          |   56 +
 tests/manual/memory/VML-2170.html                  |   49 +
 tests/manual/multiple-google-layers.html           |  135 +
 tests/manual/overviewmap-projection.html           |   70 +
 tests/manual/pan-redraw-svg.html                   |   58 +
 tests/manual/popup-keepInMap.html                  |  100 +
 tests/manual/reflow.html                           |   59 +
 tests/manual/rendered-dimensions.html              |   48 +
 tests/manual/renderedDimensions.html               |  113 +
 tests/manual/select-feature.html                   |   75 +
 tests/manual/tiles-loading.html                    |  122 +
 tests/manual/tween.html                            |   82 +
 tests/manual/ve-opacity.html                       |   61 +
 tests/manual/vector-features-performance.html      |  142 +
 tests/manual/vector-layer-zindex.html              |  143 +
 tests/mice.xml                                     |  156 +
 tests/owls.xml                                     |  156 +
 tests/run-tests.html                               | 2413 +++++++++
 tests/selenium/remotecontrol/config.cfg            |   48 +
 tests/selenium/remotecontrol/selenium.py           | 1846 +++++++
 tests/selenium/remotecontrol/setup.txt             |    8 +
 tests/selenium/remotecontrol/test_ol.py            |   95 +
 tests/speed/geometry.html                          |   43 +
 tests/speed/string_format.html                     |   29 +
 tests/speed/wmc_speed.html                         |   30 +
 tests/speed/wmscaps.html                           |   52 +
 tests/speed/wmscaps.js                             | 4956 +++++++++++++++++++
 tests/speed/wmscaps.xml                            | 4954 +++++++++++++++++++
 tests/throws.js                                    |   82 +
 tests/xml_eq.js                                    |  311 ++
 theme/default/framedCloud.css                      |    0
 theme/default/google.css                           |   10 +
 theme/default/ie6-style.css                        |    7 +
 theme/default/img/add_point_off.png                |  Bin 0 -> 1616 bytes
 theme/default/img/add_point_on.png                 |  Bin 0 -> 1464 bytes
 theme/default/img/blank.gif                        |  Bin 0 -> 42 bytes
 theme/default/img/close.gif                        |  Bin 0 -> 1078 bytes
 theme/default/img/drag-rectangle-off.png           |  Bin 0 -> 1202 bytes
 theme/default/img/drag-rectangle-on.png            |  Bin 0 -> 1218 bytes
 theme/default/img/draw_line_off.png                |  Bin 0 -> 1567 bytes
 theme/default/img/draw_line_on.png                 |  Bin 0 -> 1399 bytes
 theme/default/img/draw_point_off.png               |  Bin 0 -> 1612 bytes
 theme/default/img/draw_point_on.png                |  Bin 0 -> 1460 bytes
 theme/default/img/draw_polygon_off.png             |  Bin 0 -> 1546 bytes
 theme/default/img/draw_polygon_on.png              |  Bin 0 -> 1407 bytes
 theme/default/img/editing_tool_bar.png             |  Bin 0 -> 3901 bytes
 theme/default/img/move_feature_off.png             |  Bin 0 -> 1543 bytes
 theme/default/img/move_feature_on.png              |  Bin 0 -> 1379 bytes
 theme/default/img/navigation_history.png           |  Bin 0 -> 7021 bytes
 theme/default/img/overview_replacement.gif         |  Bin 0 -> 79 bytes
 theme/default/img/pan-panel-NOALPHA.png            |  Bin 0 -> 566 bytes
 theme/default/img/pan-panel.png                    |  Bin 0 -> 1287 bytes
 theme/default/img/pan_off.png                      |  Bin 0 -> 1696 bytes
 theme/default/img/pan_on.png                       |  Bin 0 -> 1568 bytes
 theme/default/img/panning-hand-off.png             |  Bin 0 -> 3875 bytes
 theme/default/img/panning-hand-on.png              |  Bin 0 -> 3977 bytes
 theme/default/img/remove_point_off.png             |  Bin 0 -> 1612 bytes
 theme/default/img/remove_point_on.png              |  Bin 0 -> 1464 bytes
 theme/default/img/ruler.png                        |  Bin 0 -> 1211 bytes
 theme/default/img/save_features_off.png            |  Bin 0 -> 357 bytes
 theme/default/img/save_features_on.png             |  Bin 0 -> 364 bytes
 theme/default/img/view_next_off.png                |  Bin 0 -> 1644 bytes
 theme/default/img/view_next_on.png                 |  Bin 0 -> 1686 bytes
 theme/default/img/view_previous_off.png            |  Bin 0 -> 1553 bytes
 theme/default/img/view_previous_on.png             |  Bin 0 -> 1592 bytes
 theme/default/img/zoom-panel-NOALPHA.png           |  Bin 0 -> 1173 bytes
 theme/default/img/zoom-panel.png                   |  Bin 0 -> 1624 bytes
 theme/default/style.css                            |  397 ++
 tools/README.txt                                   |   14 +
 tools/mergejs.py                                   |  252 +
 tools/oldot.py                                     |   43 +
 tools/release.sh                                   |   29 +
 tools/toposort.py                                  |  260 +
 1822 files changed, 231626 insertions(+)

diff --git a/apidoc_config/Data/ClassHierarchy.nd b/apidoc_config/Data/ClassHierarchy.nd
new file mode 100644
index 0000000..c2257f2
Binary files /dev/null and b/apidoc_config/Data/ClassHierarchy.nd differ
diff --git a/apidoc_config/Data/ConfigFileInfo.nd b/apidoc_config/Data/ConfigFileInfo.nd
new file mode 100644
index 0000000..6372818
--- /dev/null
+++ b/apidoc_config/Data/ConfigFileInfo.nd
@@ -0,0 +1 @@
+$
L��#GX�pL��#GX�pL��#
\ No newline at end of file
diff --git a/apidoc_config/Data/FileInfo.nd b/apidoc_config/Data/FileInfo.nd
new file mode 100644
index 0000000..72e9569
--- /dev/null
+++ b/apidoc_config/Data/FileInfo.nd
@@ -0,0 +1,289 @@
+Development Release 12-07-2007 (1.35 base)
+JavaScript
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomToMaxExtent.js	1283463805	1	OpenLayers.Control.ZoomToMaxExtent
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tween.js	1283463805	1	OpenLayers.Tween
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Marker/Box.js	1283463805	1	OpenLayers.Marker.Box
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/vi.js	1283463805	1	OpenLayers.Lang["vi"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Box.js	1283463805	1	OpenLayers.Handler.Box
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS/v1_0_0.js	1283463805	1	OpenLayers.Protocol.WFS.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OSM.js	1283463805	1	OpenLayers.Format.OSM
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS.js	1283463805	1	OpenLayers.Protocol.WFS.DEFAULTS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/gl.js	1283463805	1	OpenLayers.Lang["gl"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/nn.js	1283463805	1	OpenLayers.Lang["nn"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Filter/v1_1_0.js	1283463805	1	OpenLayers.Format.Filter.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFS.js	1283463805	1	OpenLayers.Format.WFS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js	1283463805	1	OpenLayers.Format.WFSCapabilities/v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/VirtualEarth.js	1283463805	1	OpenLayers.Layer.VirtualEarth
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WMS/Post.js	1283463805	1	OpenLayers.Layer.WMS.Post
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomIn.js	1283463805	1	OpenLayers.Control.ZoomIn
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_1_0.js	1283463805	1	OpenLayers.Format.WMSCapabilities/v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GPX.js	1283463805	1	OpenLayers.Format.GPX
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities.js	1283463805	1	OpenLayers.Format.WMSCapabilities
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Filter/v1.js	1283463805	1	OpenLayers.Format.Filter.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WMS.js	1283463805	1	OpenLayers.Layer.WMS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Boxes.js	1283463805	1	OpenLayers.Layer.Boxes
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Text.js	1283463805	1	OpenLayers.Format.Text
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Scale.js	1283463805	1	OpenLayers.Control.Scale
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Click.js	1283463805	1	OpenLayers.Handler.Click
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SOSCapabilities/v1_0_0.js	1283463805	1	OpenLayers.Format.SOSCapabilities.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/MultiPolygon.js	1283463805	1	OpenLayers.Geometry.MultiPolygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes.js	1283463805	1	OpenLayers Base Types
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/FixedZoomLevels.js	1283463805	1	OpenLayers.Layer.FixedZoomLevels
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry.js	1283463805	1	OpenLayers.Geometry
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter/FeatureId.js	1283463805	1	OpenLayers.Filter.FeatureId
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter.js	1283463805	1	OpenLayers.Filter
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/RegularPolygon.js	1283463805	1	OpenLayers.Handler.RegularPolygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Panel.js	1283463805	1	OpenLayers.Control.Panel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/MultiLineString.js	1283463805	1	OpenLayers.Geometry.MultiLineString
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ModifyFeature.js	1283463805	1	OpenLayers.Control.ModifyFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Refresh.js	1283463805	1	OpenLayers.Strategy.Refresh
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Attribution.js	1283463805	1	OpenLayers.Control.Attribution
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers.js	1284024673	1	OpenLayers
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/SelectFeature.js	1283463805	1	OpenLayers.Control.SelectFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/es.js	1283463805	1	OpenLayers.Lang["es"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/te.js	1283463805	1	OpenLayers.Lang["te"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/hsb.js	1283463805	1	OpenLayers.Lang["hsb"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Grid.js	1283463805	1	OpenLayers.Layer.Grid
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/da-DK.js	1283463805	1	OpenLayers.Lang["da-DK"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomOut.js	1283463805	1	OpenLayers.Control.ZoomOut
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Polygon.js	1283463805	1	OpenLayers.Geometry.Polygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSCommon/v1_1_0.js	1283463805	1	OpenLayers.Format.OWSCommon.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ar.js	1283463805	1	OpenLayers.Lang["ar"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SOSCapabilities.js	1283463805	1	OpenLayers.Format.SOSCapabilities
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Style.js	1283463805	1	OpenLayers.Style
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/XYZ.js	1283463805	1	OpenLayers.Layer.XYZ
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/hu.js	1283463805	1	OpenLayers.Lang["hu"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer.js	1283463805	1	OpenLayers.Symbolizer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Feature.js	1283463805	1	OpenLayers.Handler.Feature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ja.js	1283463805	1	OpenLayers.Lang["ja"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/is.js	1283463805	1	OpenLayers.Lang["is"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer/Canvas.js	1283463805	1	OpenLayers.Renderer.Canvas
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Filter/v1_0_0.js	1283463805	1	OpenLayers.Format.Filter.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/TMS.js	1283463805	1	OpenLayers.Layer.TMS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/OverviewMap.js	1283463805	1	OpenLayers.Control.OverviewMap
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/WMSGetFeatureInfo.js	1283463805	1	OpenLayers.Control.WMSGetFeatureInfo
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/hr.js	1283463805	1	OpenLayers.Lang["hr"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/bg.js	1283463805	1	OpenLayers.Lang["bg"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ca.js	1283463805	1	OpenLayers.Lang["ca"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSCapabilities/v1_1_0.js	1283463805	1	OpenLayers.Format.WFSCapabilities/v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/en-CA.js	1283463805	1	OpenLayers.Lang["en-CA"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/LinearRing.js	1283463805	1	OpenLayers.Geometry.LinearRing
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/MultiPoint.js	1283463805	1	OpenLayers.Geometry.MultiPoint
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Navigation.js	1283463805	1	OpenLayers.Control.Navigation
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSContext/v0_3_1.js	1283463805	1	OpenLayers.Format.OWSContext.v0_3_1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/MapServer/Untiled.js	1283463805	1	OpenLayers.Layer.MapServer.Untiled
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMTSCapabilities/v1_0_0.js	1283463805	1	OpenLayers.Format.WMTSCapabilities.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/license.txt	1181603869	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/license.txt
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Line.js	1283463805	1	OpenLayers.Symbolizer.Line
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/GeoRSS.js	1283463805	1	OpenLayers.Layer.GeoRSS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Events.js	1283463805	1	OpenLayers.Event
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Atom.js	1283463805	1	OpenLayers.Format.Atom
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SOSGetObservation.js	1283463805	1	OpenLayers.Format.SOSGetObservation
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Cluster.js	1283463805	1	OpenLayers.Strategy.Cluster
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/fur.js	1283463805	1	OpenLayers.Lang["fur"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ksh.js	1283463805	1	OpenLayers.Lang["ksh"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/JSON.js	1283463805	1	OpenLayers.Format.JSON
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/firebugx.js	1202500315	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/firebugx.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSCommon/v1.js	1283463805	1	OpenLayers.Format.OWSCommon.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Vector/RootContainer.js	1283463805	1	OpenLayers.Layer.Vector.RootContainer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SOS/v1_0_0.js	1283463805	1	OpenLayers.Protocol.SOS.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SLD/v1.js	1283463805	1	OpenLayers.Format.SLD.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Save.js	1283463805	1	OpenLayers.Strategy.Save
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/PanZoom.js	1283463805	1	OpenLayers.Control.PanZoom
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer/VML.js	1283463805	1	OpenLayers.Renderer.VML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Pixel.js	1283463805	1	OpenLayers.Pixel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/be-tarask.js	1283463805	1	OpenLayers.Lang["be-tarask"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GML/v2.js	1283463805	1	OpenLayers.Format.GML.v2
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/br.js	1283463805	1	OpenLayers.Lang["br"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMC/v1.js	1283463805	1	OpenLayers.Format.WMC.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Text.js	1283463805	1	OpenLayers.Symbolizer.Text
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tile.js	1283463805	1	OpenLayers.Tile
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/ArcXML.js	1283463805	1	OpenLayers.Format.ArcXML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Rule.js	1283463805	1	OpenLayers.Rule
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/oc.js	1283463805	1	OpenLayers.Lang["oc"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS/v1_1_0.js	1283463805	1	OpenLayers.Protocol.WFS.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SOS.js	1283463805	1	OpenLayers.Protocol.SOS.DEFAULTS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter/Spatial.js	1283463805	1	OpenLayers.Filter.Spatial
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/zh-TW.js	1283463805	1	OpenLayers.Lang["zh-TW"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST.js	1283463805	1	OpenLayers.Format.WFST.DEFAULTS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/GML.js	1283463805	1	OpenLayers.Layer.GML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/MultiMap.js	1283463805	1	OpenLayers.Layer.MultiMap
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format.js	1283463805	1	OpenLayers.Format
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST/v1_0_0.js	1283463805	1	OpenLayers.Format.WFST.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Class.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Class.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer.js	1283463805	1	OpenLayers.Layer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMC/v1_1_0.js	1283463805	1	OpenLayers.Format.WMC.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Element.js	1283463805	1	OpenLayers.Element
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/WMTSGetFeatureInfo.js	1283463805	1	OpenLayers.Control.WMTSGetFeatureInfo
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMC/v1_0_0.js	1283463805	1	OpenLayers.Format.WMC.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Markers.js	1283463805	1	OpenLayers.Layer.Markers
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/LonLat.js	1283463805	1	OpenLayers.LonLat
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Permalink.js	1283463805	1	OpenLayers.Control.Permalink
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/MouseToolbar.js	1283463805	1	OpenLayers.Control.MouseToolbar
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/zh-CN.js	1283463805	1	OpenLayers.Lang["zh-CN"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Pan.js	1283463805	1	OpenLayers.Control.Pan
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/EventPane.js	1283463805	1	OpenLayers.Layer.EventPane
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSCommon/v1_0_0.js	1283463805	1	OpenLayers.Format.OWSCommon.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1.js	1283463805	1	OpenLayers.Format.WMSCapabilities.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Yahoo.js	1283463805	1	OpenLayers.Layer.Yahoo
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetRecords.js	1283463805	1	OpenLayers.Format.CSWGetRecords.DEFAULTS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol.js	1283463805	1	OpenLayers.Protocol
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_1.js	1283463805	1	OpenLayers.Format.WMSCapabilities.v1_1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetDomain/v2_0_2.js	1283463805	1	OpenLayers.Format.CSWGetDomain.v2_0_2
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/firebug.js	1202500315	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/firebug.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Keyboard.js	1283463805	1	OpenLayers.handler.Keyboard
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/km.js	1283463805	1	OpenLayers.Lang["km"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/nds.js	1283463805	1	OpenLayers.Lang["nds"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/MapGuide.js	1283463805	1	OpenLayers.Layer.MapGuide
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup/Framed.js	1283463805	1	OpenLayers.Popup.Framed
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/ArcGIS93Rest.js	1283463805	1	OpenLayers.Layer.ArcGIS93Rest
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Curve.js	1283463805	1	OpenLayers.Geometry.Curve
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Raster.js	1283463805	1	OpenLayers.Symbolizer.Raster
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Style2.js	1283463805	1	OpenLayers.Style2
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Vector.js	1283463805	1	OpenLayers.Layer.Vector
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSCapabilities/v1.js	1283463805	1	OpenLayers.Format.WFSCapabilities.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ru.js	1283463805	1	OpenLayers.Lang["ru"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GeoRSS.js	1283463805	1	OpenLayers.Format.GeoRSS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomBox.js	1283463805	1	OpenLayers.Control.ZoomBox
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/ArcXML/Features.js	1283463805	1	OpenLayers.Format.ArcXML.Features
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/gsw.js	1283463805	1	OpenLayers.Lang["gsw"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/io.js	1283463805	1	OpenLayers.Lang["io"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/readme.txt	1181603869	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/readme.txt
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/BBOX.js	1283463805	1	OpenLayers.Strategy.BBOX
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMC.js	1283463805	1	OpenLayers.Format.WMC
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SOSGetFeatureOfInterest.js	1283463805	1	OpenLayers.Format.SOSGetFeatureOfInterest
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Request.js	1283463805	1	OpenLayers.Request
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WKT.js	1283463805	1	OpenLayers.Format.WKT
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SQL.js	1283463805	1	OpenLayers.Protocol.SQL
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Util.js	1283463805	1	Util
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSGetFeatureInfo.js	1283463805	1	OpenLayers.Format.WMSGetFeatureInfo
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSDescribeLayer.js	1283463805	1	OpenLayers.Format.WMSDescribeLayer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GeoJSON.js	1283463805	1	OpenLayers.Format.GeoJSON
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Projection.js	1283463805	1	OpenLayers.Projection
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Ajax.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Ajax.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/MousePosition.js	1283463805	1	OpenLayers.Control.MousePosition
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/it.js	1283463805	1	OpenLayers.Lang["it"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/PanZoomBar.js	1283463805	1	OpenLayers.Control.PanZoomBar
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/KeyboardDefaults.js	1283463805	1	OpenLayers.Control.KeyboardDefaults
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/HTTP.js	1283463805	1	OpenLayers.Protocol.HTTP
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/HTTPRequest.js	1283463805	1	OpenLayers.Layer.HTTPRequest
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/fr.js	1283463805	1	OpenLayers.Lang["fr"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WFS.js	1283463805	1	OpenLayers.Layer.WFS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Map.js	1283463805	1	OpenLayers.Map
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/nl.js	1283463805	1	OpenLayers.Lang["nl"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SLD.js	1283463805	1	OpenLayers.Format.SLD
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SLD/v1_0_0.js	1283463805	1	OpenLayers.Format.SLD.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WMS/Untiled.js	1283463805	1	OpenLayers.Layer.WMS.Untiled
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/PointTrack.js	1283463805	1	OpenLayers.Layer.PointTrack
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMTSCapabilities.js	1283463805	1	OpenLayers.Format.WMTSCapabilities
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/fi.js	1283463805	1	OpenLayers.Lang["fi"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Surface.js	1283463805	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Surface.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control.js	1283463805	1	OpenLayers.Control
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST/v1.js	1283463805	1	OpenLayers.Format.WFST.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/TileCache.js	1283463805	1	OpenLayers.Layer.TileCache
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Rico/Color.js	1201963564	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Rico/Color.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSCapabilities.js	1283463805	1	OpenLayers.Format.WFSCapabilities
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang.js	1283463805	1	OpenLayers.Lang
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Request/XMLHttpRequest.js	1277709397	1	OpenLayers.Request.XMLHttpRequest
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tile/Image.js	1283463805	1	OpenLayers.Tile.Image
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetDomain.js	1283463805	1	OpenLayers.Format.CSWGetDomain.DEFAULTS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/TransformFeature.js	1283463805	1	OpenLayers.Control.TransformFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSContext.js	1283463805	1	OpenLayers.Format.OWSContext
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Image.js	1283463805	1	OpenLayers.Layer.Image
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/DrawFeature.js	1283463805	1	OpenLayers.Control.DrawFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WMTS.js	1283463805	1	OpenLayers.Layer.WMTS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Feature/WFS.js	1283463805	1	OpenLayers.Feature.WFS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy.js	1283463805	1	OpenLayers.Strategy
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ArgParser.js	1283463805	1	OpenLayers.Control.ArgParser
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter/Comparison.js	1283463805	1	OpenLayers.Filter.Comparison
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/sk.js	1283463805	1	OpenLayers.Lang["sk"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Gears/gears_init.js	1221231425	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Gears/gears_init.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Snapping.js	1283463805	1	OpenLayers.Control.Snapping
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer/Elements.js	1283463805	1	OpenLayers.ElementsIndexer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Button.js	1283463805	1	OpenLayers.Control.Button
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/NavToolbar.js	1283463805	1	OpenLayers.Control.NavToolbar
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/NavigationHistory.js	1283463805	1	OpenLayers.Control.NavigationHistory
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/KaMap.js	1283463805	1	OpenLayers.Layer.KaMap
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Collection.js	1283463805	1	OpenLayers.Geometry.Collection
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Google/v3.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Google/v3.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Zoomify.js	1283463805	1	OpenLayers.Layer.Zoomify
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ScaleLine.js	1283463805	1	OpenLayers.Control.ScaleLine
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/el.js	1283463805	1	OpenLayers.Lang["el"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Console.js	1283463805	1	OpenLayers.Console
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Bounds.js	1283463805	1	OpenLayers.Bounds
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Icon.js	1283463805	1	OpenLayers.Icon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer/SVG.js	1283463805	1	OpenLayers.Renderer.SVG
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Hover.js	1283463805	1	OpenLayers.Handler.Hover
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tile/Image/IFrame.js	1283463805	1	OpenLayers.Tile.Image.IFrame
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GML/Base.js	1283463805	1	OpenLayers.Format.GML.Base
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ia.js	1283463805	1	OpenLayers.Lang["ia"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/DragFeature.js	1283463805	1	OpenLayers.Control.DragFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Filter.js	1283463805	1	OpenLayers.Strategy.Filter
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Text.js	1283463805	1	OpenLayers.Layer.Text
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Context.js	1283463805	1	OpenLayers.Format.Context
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/LayerSwitcher.js	1283463805	1	OpenLayers.Control.LayerSwitcher
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/de.js	1283463805	1	OpenLayers.Lang["de"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Point.js	1283463805	1	OpenLayers.Geometry.Point
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/nb.js	1283463805	1	OpenLayers.Lang["nb"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SQL/Gears.js	1283463805	1	OpenLayers.Protocol.SQL.Gears
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/pt-BR.js	1283463805	1	OpenLayers.Lang["pt-br"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/ArcIMS.js	1283463805	1	OpenLayers.Layer.ArcIMS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST/v1_1_0.js	1283463805	1	OpenLayers.Format.WFST.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Google.js	1283463805	1	OpenLayers.Layer.Google
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/PanPanel.js	1283463805	1	OpenLayers.Control.PanPanel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GML.js	1283463805	1	OpenLayers.Format.GML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/SingleFile.js	1283463805	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/SingleFile.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/SphericalMercator.js	1283463805	1	OpenLayers.Layer.SphericalMercator
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Measure.js	1283463805	1	OpenLayers.Control.Measure
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Split.js	1283463805	1	OpenLayers.Control.Split
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/LineString.js	1283463805	1	OpenLayers.Geometry.LineString
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/id.js	1283463805	1	OpenLayers.Lang["id"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup/AnchoredBubble.js	1283463805	1	OpenLayers.Popup.AnchoredBubble
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSDescribeFeatureType.js	1283463805	1	OpenLayers.Format.WFSDescribeFeatureType
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomPanel.js	1283463805	1	OpenLayers.Control.ZoomPanel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tile/WFS.js	1283463805	1	OpenLayers.Tile.WFS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_3.js	1283463805	1	OpenLayers.Format.WMSCapabilities/v1_3
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Size.js	1283463805	1	OpenLayers.Size
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Polygon.js	1283463805	1	OpenLayers.Symbolizer.Polygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_1_1.js	1283463805	1	OpenLayers.Format.WMSCapabilities/v1_1_1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/EditingToolbar.js	1283463805	1	OpenLayers.Control.EditingToolbar
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js	1283463805	1	OpenLayers.Format.CSWGetRecords.v2_0_2
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/KaMapCache.js	1283463805	1	OpenLayers.Layer.KaMapCache
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/GetFeature.js	1283463805	1	OpenLayers.Control.GetFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/MouseDefaults.js	1283463805	1	OpenLayers.Control.MouseDefaults
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Drag.js	1283463805	1	OpenLayers.Handler.Drag
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_3_0.js	1283463805	1	OpenLayers.Format.WMSCapabilities/v1_3_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup/FramedCloud.js	1283463805	1	OpenLayers.Popup.FramedCloud
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Paging.js	1283463805	1	OpenLayers.Strategy.Paging
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Polygon.js	1283463805	1	OpenLayers.Handler.Polygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Point.js	1283463805	1	OpenLayers.Symbolizer.Point
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Rico/Corner.js	1201963564	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Rico/Corner.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Feature.js	1283463805	1	OpenLayers.Feature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/en.js	1283463805	1	OpenLayers.Lang["en"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Marker.js	1283463805	1	OpenLayers.Marker
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler.js	1283463805	1	OpenLayers.Handler
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Rectangle.js	1283463805	1	OpenLayers.Geometry.Rectangle
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/sv-SE.js	1283463805	1	OpenLayers.Lang["sv"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/MouseWheel.js	1283463805	1	OpenLayers.Handler.MouseWheel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/cs-CZ.js	1283463805	1	OpenLayers.Lang["cs-CZ"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Fixed.js	1283463805	1	OpenLayers.Strategy.Fixed
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WorldWind.js	1283463805	1	OpenLayers.Layer.WorldWind
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup/Anchored.js	1283463805	1	OpenLayers.Popup.Anchored
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup.js	1283463805	1	OpenLayers.Popup
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Point.js	1283463805	1	OpenLayers.Handler.Point
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/StyleMap.js	1283463805	1	OpenLayers.StyleMap
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/KML.js	1283463805	1	OpenLayers.Format.KML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter/Logical.js	1283463805	1	OpenLayers.Filter.Logical
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/XML.js	1283463805	1	OpenLayers.Format.XML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/DragPan.js	1283463805	1	OpenLayers.Control.DragPan
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer.js	1283463805	1	OpenLayers.Renderer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/MapServer.js	1283463805	1	OpenLayers.Layer.MapServer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Path.js	1283463805	1	OpenLayers.Handler.Path
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Filter.js	1283463805	1	OpenLayers.Format.Filter
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/pt.js	1283463805	1	OpenLayers.Lang["pt"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Graticule.js	1283463805	1	OpenLayers.Control.Graticule
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS/v1.js	1283463805	1	OpenLayers.Protocol.WFS.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js	1283463805	1	OpenLayers.Format.WMSDescribeLayer.v1_1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Feature/Vector.js	1283463805	1	OpenLayers.Feature.Vector
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/SLDSelect.js	1283463805	1	OpenLayers.Control.SLDSelect
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GML/v3.js	1283463805	1	OpenLayers.Format.GML.v3
diff --git a/apidoc_config/Data/ImageFileInfo.nd b/apidoc_config/Data/ImageFileInfo.nd
new file mode 100644
index 0000000..550e24b
Binary files /dev/null and b/apidoc_config/Data/ImageFileInfo.nd differ
diff --git a/apidoc_config/Data/ImageReferenceTable.nd b/apidoc_config/Data/ImageReferenceTable.nd
new file mode 100644
index 0000000..a3ed9fa
Binary files /dev/null and b/apidoc_config/Data/ImageReferenceTable.nd differ
diff --git a/apidoc_config/Data/IndexInfo.nd b/apidoc_config/Data/IndexInfo.nd
new file mode 100644
index 0000000..d9186e3
Binary files /dev/null and b/apidoc_config/Data/IndexInfo.nd differ
diff --git a/apidoc_config/Data/PreviousMenuState.nd b/apidoc_config/Data/PreviousMenuState.nd
new file mode 100644
index 0000000..6b4c7bf
Binary files /dev/null and b/apidoc_config/Data/PreviousMenuState.nd differ
diff --git a/apidoc_config/Data/PreviousSettings.nd b/apidoc_config/Data/PreviousSettings.nd
new file mode 100644
index 0000000..0f9a7b2
Binary files /dev/null and b/apidoc_config/Data/PreviousSettings.nd differ
diff --git a/apidoc_config/Data/SymbolTable.nd b/apidoc_config/Data/SymbolTable.nd
new file mode 100644
index 0000000..958465b
Binary files /dev/null and b/apidoc_config/Data/SymbolTable.nd differ
diff --git a/apidoc_config/Languages.txt b/apidoc_config/Languages.txt
new file mode 100644
index 0000000..ce0f107
--- /dev/null
+++ b/apidoc_config/Languages.txt
@@ -0,0 +1,113 @@
+Format: Development Release 12-07-2007 (1.35 base)
+
+# This is the Natural Docs languages file for this project.  If you change
+# anything here, it will apply to THIS PROJECT ONLY.  If you'd like to change
+# something for all your projects, edit the Languages.txt in Natural Docs'
+# Config directory instead.
+
+
+# You can prevent certain file extensions from being scanned like this:
+# Ignore Extensions: [extension] [extension] ...
+
+
+#-------------------------------------------------------------------------------
+# SYNTAX:
+#
+# Unlike other Natural Docs configuration files, in this file all comments
+# MUST be alone on a line.  Some languages deal with the # character, so you
+# cannot put comments on the same line as content.
+#
+# Also, all lists are separated with spaces, not commas, again because some
+# languages may need to use them.
+#
+# Language: [name]
+# Alter Language: [name]
+#    Defines a new language or alters an existing one.  Its name can use any
+#    characters.  If any of the properties below have an add/replace form, you
+#    must use that when using Alter Language.
+#
+#    The language Shebang Script is special.  It's entry is only used for
+#    extensions, and files with those extensions have their shebang (#!) lines
+#    read to determine the real language of the file.  Extensionless files are
+#    always treated this way.
+#
+#    The language Text File is also special.  It's treated as one big comment
+#    so you can put Natural Docs content in them without special symbols.  Also,
+#    if you don't specify a package separator, ignored prefixes, or enum value
+#    behavior, it will copy those settings from the language that is used most
+#    in the source tree.
+#
+# Extensions: [extension] [extension] ...
+# [Add/Replace] Extensions: [extension] [extension] ...
+#    Defines the file extensions of the language's source files.  You can
+#    redefine extensions found in the main languages file.  You can use * to
+#    mean any undefined extension.
+#
+# Shebang Strings: [string] [string] ...
+# [Add/Replace] Shebang Strings: [string] [string] ...
+#    Defines a list of strings that can appear in the shebang (#!) line to
+#    designate that it's part of the language.  You can redefine strings found
+#    in the main languages file.
+#
+# Ignore Prefixes in Index: [prefix] [prefix] ...
+# [Add/Replace] Ignored Prefixes in Index: [prefix] [prefix] ...
+#
+# Ignore [Topic Type] Prefixes in Index: [prefix] [prefix] ...
+# [Add/Replace] Ignored [Topic Type] Prefixes in Index: [prefix] [prefix] ...
+#    Specifies prefixes that should be ignored when sorting symbols in an
+#    index.  Can be specified in general or for a specific topic type.
+#
+#------------------------------------------------------------------------------
+# For basic language support only:
+#
+# Line Comments: [symbol] [symbol] ...
+#    Defines a space-separated list of symbols that are used for line comments,
+#    if any.
+#
+# Block Comments: [opening sym] [closing sym] [opening sym] [closing sym] ...
+#    Defines a space-separated list of symbol pairs that are used for block
+#    comments, if any.
+#
+# Package Separator: [symbol]
+#    Defines the default package separator symbol.  The default is a dot.
+#
+# [Topic Type] Prototype Enders: [symbol] [symbol] ...
+#    When defined, Natural Docs will attempt to get a prototype from the code
+#    immediately following the topic type.  It stops when it reaches one of
+#    these symbols.  Use \n for line breaks.
+#
+# Line Extender: [symbol]
+#    Defines the symbol that allows a prototype to span multiple lines if
+#    normally a line break would end it.
+#
+# Enum Values: [global|under type|under parent]
+#    Defines how enum values are referenced.  The default is global.
+#    global       - Values are always global, referenced as 'value'.
+#    under type   - Values are under the enum type, referenced as
+#               'package.enum.value'.
+#    under parent - Values are under the enum's parent, referenced as
+#               'package.value'.
+#
+# Perl Package: [perl package]
+#    Specifies the Perl package used to fine-tune the language behavior in ways
+#    too complex to do in this file.
+#
+#------------------------------------------------------------------------------
+# For full language support only:
+#
+# Full Language Support: [perl package]
+#    Specifies the Perl package that has the parsing routines necessary for full
+#    language support.
+#
+#-------------------------------------------------------------------------------
+
+# The following languages are defined in the main file, if you'd like to alter
+# them:
+#
+#    Text File, Shebang Script, C/C++, C#, Java, JavaScript, Perl, Python,
+#    PHP, SQL, Visual Basic, Pascal, Assembly, Ada, Tcl, Ruby, Makefile,
+#    ActionScript, ColdFusion, R, Fortran
+
+# If you add a language that you think would be useful to other developers
+# and should be included in Natural Docs by default, please e-mail it to
+# languages [at] naturaldocs [dot] org.
diff --git a/apidoc_config/Menu.txt b/apidoc_config/Menu.txt
new file mode 100644
index 0000000..07b290e
--- /dev/null
+++ b/apidoc_config/Menu.txt
@@ -0,0 +1,480 @@
+Format: Development Release 12-07-2007 (1.35 base)
+
+
+Title: OpenLayers
+SubTitle: JavaScript Mapping Library
+
+# You can add a footer to your documentation like this:
+# Footer: [text]
+# If you want to add a copyright notice, this would be the place to do it.
+
+# You can add a timestamp to your documentation like one of these:
+# Timestamp: Generated on month day, year
+# Timestamp: Updated mm/dd/yyyy
+# Timestamp: Last updated mon day
+#
+#   m     - One or two digit month.  January is "1"
+#   mm    - Always two digit month.  January is "01"
+#   mon   - Short month word.  January is "Jan"
+#   month - Long month word.  January is "January"
+#   d     - One or two digit day.  1 is "1"
+#   dd    - Always two digit day.  1 is "01"
+#   day   - Day with letter extension.  1 is "1st"
+#   yy    - Two digit year.  2006 is "06"
+#   yyyy  - Four digit year.  2006 is "2006"
+#   year  - Four digit year.  2006 is "2006"
+
+
+# --------------------------------------------------------------------------
+# 
+# Cut and paste the lines below to change the order in which your files
+# appear on the menu.  Don't worry about adding or removing files, Natural
+# Docs will take care of that.
+# 
+# You can further organize the menu by grouping the entries.  Add a
+# "Group: [name] {" line to start a group, and add a "}" to end it.
+# 
+# You can add text and web links to the menu by adding "Text: [text]" and
+# "Link: [name] ([URL])" lines, respectively.
+# 
+# The formatting and comments are auto-generated, so don't worry about
+# neatness when editing the file.  Natural Docs will clean it up the next
+# time it is run.  When working with groups, just deal with the braces and
+# forget about the indentation and comments.
+# 
+# --------------------------------------------------------------------------
+
+
+Group: OpenLayers  {
+
+   File: OpenLayers  (no auto-title, OpenLayers.js)
+
+   Group: BaseTypes  {
+
+      File: Base Types  (no auto-title, OpenLayers/BaseTypes.js)
+      File: Bounds  (no auto-title, OpenLayers/BaseTypes/Bounds.js)
+      File: Class  (no auto-title, OpenLayers/BaseTypes/Class.js)
+      File: Element  (no auto-title, OpenLayers/BaseTypes/Element.js)
+      File: LonLat  (no auto-title, OpenLayers/BaseTypes/LonLat.js)
+      File: Pixel  (no auto-title, OpenLayers/BaseTypes/Pixel.js)
+      File: Size  (no auto-title, OpenLayers/BaseTypes/Size.js)
+      }  # Group: BaseTypes
+
+   Group: Control  {
+
+      File: Control  (no auto-title, OpenLayers/Control.js)
+
+      Group: Control  {
+
+         File: ArgParser  (no auto-title, OpenLayers/Control/ArgParser.js)
+         File: Attribution  (no auto-title, OpenLayers/Control/Attribution.js)
+         File: Button  (no auto-title, OpenLayers/Control/Button.js)
+         File: DragFeature  (no auto-title, OpenLayers/Control/DragFeature.js)
+         File: DragPan  (no auto-title, OpenLayers/Control/DragPan.js)
+         File: DrawFeature  (no auto-title, OpenLayers/Control/DrawFeature.js)
+         File: EditingToolbar  (no auto-title, OpenLayers/Control/EditingToolbar.js)
+         File: GetFeature  (no auto-title, OpenLayers/Control/GetFeature.js)
+         File: Graticule  (OpenLayers/Control/Graticule.js)
+         File: KeyboardDefaults  (no auto-title, OpenLayers/Control/KeyboardDefaults.js)
+         File: LayerSwitcher  (no auto-title, OpenLayers/Control/LayerSwitcher.js)
+         File: Measure  (no auto-title, OpenLayers/Control/Measure.js)
+         File: ModifyFeature  (no auto-title, OpenLayers/Control/ModifyFeature.js)
+         File: MouseDefaults  (no auto-title, OpenLayers/Control/MouseDefaults.js)
+         File: MousePosition  (no auto-title, OpenLayers/Control/MousePosition.js)
+         File: MouseToolbar  (no auto-title, OpenLayers/Control/MouseToolbar.js)
+         File: Navigation  (no auto-title, OpenLayers/Control/Navigation.js)
+         File: NavigationHistory  (no auto-title, OpenLayers/Control/NavigationHistory.js)
+         File: NavToolbar  (no auto-title, OpenLayers/Control/NavToolbar.js)
+         File: OverviewMap  (no auto-title, OpenLayers/Control/OverviewMap.js)
+         File: Pan  (no auto-title, OpenLayers/Control/Pan.js)
+         File: Panel  (no auto-title, OpenLayers/Control/Panel.js)
+         File: PanPanel  (no auto-title, OpenLayers/Control/PanPanel.js)
+         File: PanZoom  (no auto-title, OpenLayers/Control/PanZoom.js)
+         File: PanZoomBar  (no auto-title, OpenLayers/Control/PanZoomBar.js)
+         File: Permalink  (no auto-title, OpenLayers/Control/Permalink.js)
+         File: Scale  (no auto-title, OpenLayers/Control/Scale.js)
+         File: ScaleLine  (no auto-title, OpenLayers/Control/ScaleLine.js)
+         File: SelectFeature  (no auto-title, OpenLayers/Control/SelectFeature.js)
+         File: SLDSelect  (OpenLayers/Control/SLDSelect.js)
+         File: Snapping  (no auto-title, OpenLayers/Control/Snapping.js)
+         File: Split  (no auto-title, OpenLayers/Control/Split.js)
+         File: TransformFeature  (OpenLayers/Control/TransformFeature.js)
+         File: WMSGetFeatureInfo  (OpenLayers/Control/WMSGetFeatureInfo.js)
+         File: WMTSGetFeatureInfo  (OpenLayers/Control/WMTSGetFeatureInfo.js)
+         File: ZoomBox  (no auto-title, OpenLayers/Control/ZoomBox.js)
+         File: ZoomIn  (no auto-title, OpenLayers/Control/ZoomIn.js)
+         File: ZoomOut  (no auto-title, OpenLayers/Control/ZoomOut.js)
+         File: ZoomPanel  (no auto-title, OpenLayers/Control/ZoomPanel.js)
+         File: ZoomToMaxExtent  (no auto-title, OpenLayers/Control/ZoomToMaxExtent.js)
+         }  # Group: Control
+
+      }  # Group: Control
+
+   Group: Feature  {
+
+      File: Feature  (no auto-title, OpenLayers/Feature.js)
+      File: Vector  (no auto-title, OpenLayers/Feature/Vector.js)
+      File: WFS  (no auto-title, OpenLayers/Feature/WFS.js)
+      }  # Group: Feature
+
+   Group: Filter  {
+
+      File: Filter  (no auto-title, OpenLayers/Filter.js)
+      File: Comparison  (no auto-title, OpenLayers/Filter/Comparison.js)
+      File: FeatureId  (no auto-title, OpenLayers/Filter/FeatureId.js)
+      File: Logical  (no auto-title, OpenLayers/Filter/Logical.js)
+      File: Spatial  (no auto-title, OpenLayers/Filter/Spatial.js)
+      }  # Group: Filter
+
+   Group: Format  {
+
+      File: Format  (no auto-title, OpenLayers/Format.js)
+
+      Group: Filter  {
+
+         File: Filter  (no auto-title, OpenLayers/Format/Filter.js)
+         File: v1  (no auto-title, OpenLayers/Format/Filter/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Format/Filter/v1_0_0.js)
+         File: v1_1_0  (OpenLayers/Format/Filter/v1_1_0.js)
+         }  # Group: Filter
+
+      Group: GML  {
+
+         File: GML  (no auto-title, OpenLayers/Format/GML.js)
+         File: Base  (no auto-title, OpenLayers/Format/GML/Base.js)
+         File: v2  (no auto-title, OpenLayers/Format/GML/v2.js)
+         File: v3  (no auto-title, OpenLayers/Format/GML/v3.js)
+         }  # Group: GML
+
+      Group: SLD  {
+
+         File: SLD  (no auto-title, OpenLayers/Format/SLD.js)
+         File: v1  (no auto-title, OpenLayers/Format/SLD/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Format/SLD/v1_0_0.js)
+         }  # Group: SLD
+
+      Group: WFSCapabilities  {
+
+         File: WFSCapabilities  (no auto-title, OpenLayers/Format/WFSCapabilities.js)
+         File: v1  (no auto-title, OpenLayers/Format/WFSCapabilities/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Format/WFSCapabilities/v1_0_0.js)
+         File: v1_1_0  (no auto-title, OpenLayers/Format/WFSCapabilities/v1_1_0.js)
+         }  # Group: WFSCapabilities
+
+      Group: WFST  {
+
+         File: WFST  (no auto-title, OpenLayers/Format/WFST.js)
+         File: v1  (OpenLayers/Format/WFST/v1.js)
+         File: v1_0_0  (OpenLayers/Format/WFST/v1_0_0.js)
+         File: v1_1_0  (OpenLayers/Format/WFST/v1_1_0.js)
+         }  # Group: WFST
+
+      Group: WMC  {
+
+         File: WMC  (no auto-title, OpenLayers/Format/WMC.js)
+         File: v1  (no auto-title, OpenLayers/Format/WMC/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Format/WMC/v1_0_0.js)
+         File: v1_1_0  (no auto-title, OpenLayers/Format/WMC/v1_1_0.js)
+         }  # Group: WMC
+
+      Group: WMSCapabilities  {
+
+         File: WMSCapabilities  (no auto-title, OpenLayers/Format/WMSCapabilities.js)
+         File: v1  (no auto-title, OpenLayers/Format/WMSCapabilities/v1.js)
+         File: v1_1  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1.js)
+         File: v1_1_0  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1_0.js)
+         File: v1_1_1  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1_1.js)
+         File: v1_3  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_3.js)
+         File: v1_3_0  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_3_0.js)
+         }  # Group: WMSCapabilities
+
+      Group: WMSDescribeLayer  {
+
+         File: WMSDescribeLayer  (no auto-title, OpenLayers/Format/WMSDescribeLayer.js)
+         File: v1_1  (no auto-title, OpenLayers/Format/WMSDescribeLayer/v1_1.js)
+         }  # Group: WMSDescribeLayer
+
+      Group: Format  {
+
+         File: ArcXML  (no auto-title, OpenLayers/Format/ArcXML.js)
+         File: ArcXML.Features  (no auto-title, OpenLayers/Format/ArcXML/Features.js)
+         File: Atom  (no auto-title, OpenLayers/Format/Atom.js)
+         File: Context  (OpenLayers/Format/Context.js)
+         File: CSWGetDomain.DEFAULTS  (no auto-title, OpenLayers/Format/CSWGetDomain.js)
+         File: CSWGetDomain.v2_0_2  (no auto-title, OpenLayers/Format/CSWGetDomain/v2_0_2.js)
+         File: CSWGetRecords.DEFAULTS  (no auto-title, OpenLayers/Format/CSWGetRecords.js)
+         File: CSWGetRecords.v2_0_2  (no auto-title, OpenLayers/Format/CSWGetRecords/v2_0_2.js)
+         File: GeoJSON  (no auto-title, OpenLayers/Format/GeoJSON.js)
+         File: GeoRSS  (no auto-title, OpenLayers/Format/GeoRSS.js)
+         File: GPX  (no auto-title, OpenLayers/Format/GPX.js)
+         File: JSON  (no auto-title, OpenLayers/Format/JSON.js)
+         File: KML  (no auto-title, OpenLayers/Format/KML.js)
+         File: OSM  (no auto-title, OpenLayers/Format/OSM.js)
+
+         Group: OWSCommon  {
+
+            File: v1  (OpenLayers/Format/OWSCommon/v1.js)
+            File: v1_0_0  (OpenLayers/Format/OWSCommon/v1_0_0.js)
+            File: v1_1_0  (OpenLayers/Format/OWSCommon/v1_1_0.js)
+            }  # Group: OWSCommon
+
+         File: OWSContext  (OpenLayers/Format/OWSContext.js)
+         File: OWSContext.v0_3_1  (OpenLayers/Format/OWSContext/v0_3_1.js)
+         File: SOSCapabilities  (OpenLayers/Format/SOSCapabilities.js)
+         File: SOSCapabilities.v1_0_0  (OpenLayers/Format/SOSCapabilities/v1_0_0.js)
+         File: SOSGetFeatureOfInterest  (OpenLayers/Format/SOSGetFeatureOfInterest.js)
+         File: SOSGetObservation  (OpenLayers/Format/SOSGetObservation.js)
+         File: Text  (no auto-title, OpenLayers/Format/Text.js)
+         File: WFS  (no auto-title, OpenLayers/Format/WFS.js)
+         File: WFSDescribeFeatureType  (no auto-title, OpenLayers/Format/WFSDescribeFeatureType.js)
+         File: WKT  (no auto-title, OpenLayers/Format/WKT.js)
+         File: WMSGetFeatureInfo  (no auto-title, OpenLayers/Format/WMSGetFeatureInfo.js)
+         File: WMTSCapabilities  (OpenLayers/Format/WMTSCapabilities.js)
+         File: WMTSCapabilities.v1_0_0  (OpenLayers/Format/WMTSCapabilities/v1_0_0.js)
+         File: XML  (no auto-title, OpenLayers/Format/XML.js)
+         }  # Group: Format
+
+      }  # Group: Format
+
+   Group: Geometry  {
+
+      File: Geometry  (no auto-title, OpenLayers/Geometry.js)
+      File: Collection  (no auto-title, OpenLayers/Geometry/Collection.js)
+      File: Curve  (no auto-title, OpenLayers/Geometry/Curve.js)
+      File: LinearRing  (no auto-title, OpenLayers/Geometry/LinearRing.js)
+      File: LineString  (no auto-title, OpenLayers/Geometry/LineString.js)
+      File: MultiLineString  (no auto-title, OpenLayers/Geometry/MultiLineString.js)
+      File: MultiPoint  (no auto-title, OpenLayers/Geometry/MultiPoint.js)
+      File: MultiPolygon  (no auto-title, OpenLayers/Geometry/MultiPolygon.js)
+      File: Point  (no auto-title, OpenLayers/Geometry/Point.js)
+      File: Polygon  (no auto-title, OpenLayers/Geometry/Polygon.js)
+      File: Rectangle  (no auto-title, OpenLayers/Geometry/Rectangle.js)
+      }  # Group: Geometry
+
+   Group: Handler  {
+
+      File: Handler  (no auto-title, OpenLayers/Handler.js)
+      File: Box  (no auto-title, OpenLayers/Handler/Box.js)
+      File: Click  (no auto-title, OpenLayers/Handler/Click.js)
+      File: Drag  (no auto-title, OpenLayers/Handler/Drag.js)
+      File: Feature  (no auto-title, OpenLayers/Handler/Feature.js)
+      File: Hover  (no auto-title, OpenLayers/Handler/Hover.js)
+      File: Keyboard  (no auto-title, OpenLayers/Handler/Keyboard.js)
+      File: MouseWheel  (no auto-title, OpenLayers/Handler/MouseWheel.js)
+      File: Path  (no auto-title, OpenLayers/Handler/Path.js)
+      File: Point  (no auto-title, OpenLayers/Handler/Point.js)
+      File: Polygon  (no auto-title, OpenLayers/Handler/Polygon.js)
+      File: RegularPolygon  (no auto-title, OpenLayers/Handler/RegularPolygon.js)
+      }  # Group: Handler
+
+   Group: Lang  {
+
+      File: Lang  (no auto-title, OpenLayers/Lang.js)
+      File: ar  (no auto-title, OpenLayers/Lang/ar.js)
+      File: be-tarask  (no auto-title, OpenLayers/Lang/be-tarask.js)
+      File: bg  (no auto-title, OpenLayers/Lang/bg.js)
+      File: br  (no auto-title, OpenLayers/Lang/br.js)
+      File: ca  (no auto-title, OpenLayers/Lang/ca.js)
+      File: cs-CZ  (no auto-title, OpenLayers/Lang/cs-CZ.js)
+      File: da-DK  (no auto-title, OpenLayers/Lang/da-DK.js)
+      File: de  (no auto-title, OpenLayers/Lang/de.js)
+      File: en  (no auto-title, OpenLayers/Lang/en.js)
+      File: en-CA  (no auto-title, OpenLayers/Lang/en-CA.js)
+      File: es  (no auto-title, OpenLayers/Lang/es.js)
+      File: el  (no auto-title, OpenLayers/Lang/el.js)
+      File: fi  (no auto-title, OpenLayers/Lang/fi.js)
+      File: fr  (no auto-title, OpenLayers/Lang/fr.js)
+      File: fur  (no auto-title, OpenLayers/Lang/fur.js)
+      File: gl  (no auto-title, OpenLayers/Lang/gl.js)
+      File: gsw  (no auto-title, OpenLayers/Lang/gsw.js)
+      File: hr  (no auto-title, OpenLayers/Lang/hr.js)
+      File: hsb  (no auto-title, OpenLayers/Lang/hsb.js)
+      File: hu  (no auto-title, OpenLayers/Lang/hu.js)
+      File: ia  (no auto-title, OpenLayers/Lang/ia.js)
+      File: id  (no auto-title, OpenLayers/Lang/id.js)
+      File: io  (no auto-title, OpenLayers/Lang/io.js)
+      File: is  (no auto-title, OpenLayers/Lang/is.js)
+      File: it  (no auto-title, OpenLayers/Lang/it.js)
+      File: ja  (no auto-title, OpenLayers/Lang/ja.js)
+      File: km  (no auto-title, OpenLayers/Lang/km.js)
+      File: ksh  (no auto-title, OpenLayers/Lang/ksh.js)
+      File: nds  (no auto-title, OpenLayers/Lang/nds.js)
+      File: nb  (no auto-title, OpenLayers/Lang/nb.js)
+      File: nl  (no auto-title, OpenLayers/Lang/nl.js)
+      File: nn  (no auto-title, OpenLayers/Lang/nn.js)
+      File: oc  (no auto-title, OpenLayers/Lang/oc.js)
+      File: pt  (no auto-title, OpenLayers/Lang/pt.js)
+      File: pt-BR  (no auto-title, OpenLayers/Lang/pt-BR.js)
+      File: ru  (no auto-title, OpenLayers/Lang/ru.js)
+      File: sk  (no auto-title, OpenLayers/Lang/sk.js)
+      File: sv-SE  (no auto-title, OpenLayers/Lang/sv-SE.js)
+      File: te  (no auto-title, OpenLayers/Lang/te.js)
+      File: vi  (no auto-title, OpenLayers/Lang/vi.js)
+      File: zh-CN  (no auto-title, OpenLayers/Lang/zh-CN.js)
+      File: zh-TW  (no auto-title, OpenLayers/Lang/zh-TW.js)
+      }  # Group: Lang
+
+   Group: Layer  {
+
+      File: Layer  (no auto-title, OpenLayers/Layer.js)
+
+      Group: Layer  {
+
+         File: ArcGIS93Rest  (no auto-title, OpenLayers/Layer/ArcGIS93Rest.js)
+         File: ArcIMS  (no auto-title, OpenLayers/Layer/ArcIMS.js)
+         File: Boxes  (no auto-title, OpenLayers/Layer/Boxes.js)
+         File: EventPane  (no auto-title, OpenLayers/Layer/EventPane.js)
+         File: FixedZoomLevels  (no auto-title, OpenLayers/Layer/FixedZoomLevels.js)
+         File: GeoRSS  (no auto-title, OpenLayers/Layer/GeoRSS.js)
+         File: GML  (no auto-title, OpenLayers/Layer/GML.js)
+         File: Google  (no auto-title, OpenLayers/Layer/Google.js)
+         File: Grid  (no auto-title, OpenLayers/Layer/Grid.js)
+         File: HTTPRequest  (no auto-title, OpenLayers/Layer/HTTPRequest.js)
+         File: Image  (no auto-title, OpenLayers/Layer/Image.js)
+         File: KaMap  (no auto-title, OpenLayers/Layer/KaMap.js)
+         File: KaMapCache  (no auto-title, OpenLayers/Layer/KaMapCache.js)
+         File: MapGuide  (no auto-title, OpenLayers/Layer/MapGuide.js)
+         File: MapServer  (no auto-title, OpenLayers/Layer/MapServer.js)
+         File: MapServer.Untiled  (no auto-title, OpenLayers/Layer/MapServer/Untiled.js)
+         File: Markers  (no auto-title, OpenLayers/Layer/Markers.js)
+         File: MultiMap  (no auto-title, OpenLayers/Layer/MultiMap.js)
+         File: PointTrack  (no auto-title, OpenLayers/Layer/PointTrack.js)
+         File: SphericalMercator  (no auto-title, OpenLayers/Layer/SphericalMercator.js)
+         File: Text  (no auto-title, OpenLayers/Layer/Text.js)
+         File: TileCache  (no auto-title, OpenLayers/Layer/TileCache.js)
+         File: TMS  (no auto-title, OpenLayers/Layer/TMS.js)
+         File: Vector  (no auto-title, OpenLayers/Layer/Vector.js)
+         File: Vector.RootContainer  (no auto-title, OpenLayers/Layer/Vector/RootContainer.js)
+         File: VirtualEarth  (no auto-title, OpenLayers/Layer/VirtualEarth.js)
+         File: WFS  (no auto-title, OpenLayers/Layer/WFS.js)
+         File: WMS  (no auto-title, OpenLayers/Layer/WMS.js)
+         File: WMS.Untiled  (no auto-title, OpenLayers/Layer/WMS/Untiled.js)
+         File: WMS.Post  (no auto-title, OpenLayers/Layer/WMS/Post.js)
+         File: WorldWind  (no auto-title, OpenLayers/Layer/WorldWind.js)
+         File: Yahoo  (no auto-title, OpenLayers/Layer/Yahoo.js)
+         File: XYZ  (no auto-title, OpenLayers/Layer/XYZ.js)
+         File: Google/v3.js  (OpenLayers/Layer/Google/v3.js)
+         File: WMTS  (OpenLayers/Layer/WMTS.js)
+         File: Zoomify  (OpenLayers/Layer/Zoomify.js)
+         }  # Group: Layer
+
+      }  # Group: Layer
+
+   Group: Marker  {
+
+      File: Marker  (no auto-title, OpenLayers/Marker.js)
+      File: Box  (no auto-title, OpenLayers/Marker/Box.js)
+      }  # Group: Marker
+
+   Group: Popup  {
+
+      File: Popup  (no auto-title, OpenLayers/Popup.js)
+      File: Anchored  (no auto-title, OpenLayers/Popup/Anchored.js)
+      File: AnchoredBubble  (no auto-title, OpenLayers/Popup/AnchoredBubble.js)
+      File: Framed  (no auto-title, OpenLayers/Popup/Framed.js)
+      File: FramedCloud  (no auto-title, OpenLayers/Popup/FramedCloud.js)
+      }  # Group: Popup
+
+   Group: Protocol  {
+
+      File: Protocol  (no auto-title, OpenLayers/Protocol.js)
+      File: HTTP  (no auto-title, OpenLayers/Protocol/HTTP.js)
+
+      Group: SQL  {
+
+         File: SQL  (no auto-title, OpenLayers/Protocol/SQL.js)
+         File: Gears  (no auto-title, OpenLayers/Protocol/SQL/Gears.js)
+         }  # Group: SQL
+
+      Group: WFS  {
+
+         File: WFS  (no auto-title, OpenLayers/Protocol/WFS.js)
+         File: v1  (no auto-title, OpenLayers/Protocol/WFS/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Protocol/WFS/v1_0_0.js)
+         File: v1_1_0  (no auto-title, OpenLayers/Protocol/WFS/v1_1_0.js)
+         }  # Group: WFS
+
+      File: DEFAULTS  (OpenLayers/Protocol/SOS.js)
+      File: v1_0_0  (OpenLayers/Protocol/SOS/v1_0_0.js)
+      }  # Group: Protocol
+
+   Group: Renderer  {
+
+      File: Renderer  (no auto-title, OpenLayers/Renderer.js)
+      File: Canvas  (no auto-title, OpenLayers/Renderer/Canvas.js)
+      File: Elements  (no auto-title, OpenLayers/Renderer/Elements.js)
+      File: SVG  (no auto-title, OpenLayers/Renderer/SVG.js)
+      File: VML  (no auto-title, OpenLayers/Renderer/VML.js)
+      }  # Group: Renderer
+
+   Group: Request  {
+
+      File: Request  (no auto-title, OpenLayers/Request.js)
+      File: XMLHttpRequest  (no auto-title, OpenLayers/Request/XMLHttpRequest.js)
+      }  # Group: Request
+
+   Group: Strategy  {
+
+      File: Strategy  (no auto-title, OpenLayers/Strategy.js)
+
+      Group: Strategy  {
+
+         File: BBOX  (no auto-title, OpenLayers/Strategy/BBOX.js)
+         File: Cluster  (no auto-title, OpenLayers/Strategy/Cluster.js)
+         File: Filter  (OpenLayers/Strategy/Filter.js)
+         File: Fixed  (no auto-title, OpenLayers/Strategy/Fixed.js)
+         File: Paging  (no auto-title, OpenLayers/Strategy/Paging.js)
+         File: Refresh  (OpenLayers/Strategy/Refresh.js)
+         File: Save  (OpenLayers/Strategy/Save.js)
+         }  # Group: Strategy
+
+      }  # Group: Strategy
+
+   Group: Tile  {
+
+      File: Tile  (no auto-title, OpenLayers/Tile.js)
+      File: Image  (no auto-title, OpenLayers/Tile/Image.js)
+      File: WFS  (no auto-title, OpenLayers/Tile/WFS.js)
+      File: IFrame  (OpenLayers/Tile/Image/IFrame.js)
+      }  # Group: Tile
+
+   Group: OpenLayers  {
+
+      File: Ajax  (no auto-title, OpenLayers/Ajax.js)
+      File: Console  (no auto-title, OpenLayers/Console.js)
+      File: Events  (no auto-title, OpenLayers/Events.js)
+      File: Icon  (no auto-title, OpenLayers/Icon.js)
+      File: Map  (no auto-title, OpenLayers/Map.js)
+      File: Projection  (no auto-title, OpenLayers/Projection.js)
+      File: Rule  (no auto-title, OpenLayers/Rule.js)
+      File: Style  (no auto-title, OpenLayers/Style.js)
+      File: Style2  (OpenLayers/Style2.js)
+      File: StyleMap  (no auto-title, OpenLayers/StyleMap.js)
+      File: Symbolizer  (OpenLayers/Symbolizer.js)
+
+      Group: Symbolizer  {
+
+         File: Line  (OpenLayers/Symbolizer/Line.js)
+         File: Point  (OpenLayers/Symbolizer/Point.js)
+         File: Polygon  (OpenLayers/Symbolizer/Polygon.js)
+         File: Raster  (OpenLayers/Symbolizer/Raster.js)
+         File: Text  (OpenLayers/Symbolizer/Text.js)
+         }  # Group: Symbolizer
+
+      File: Tween  (no auto-title, OpenLayers/Tween.js)
+      File: Util  (no auto-title, OpenLayers/Util.js)
+      }  # Group: OpenLayers
+
+   }  # Group: OpenLayers
+
+Group: Index  {
+
+   Index: Everything
+   Class Index: Classes
+   Constant Index: Constants
+   Function Index: Functions
+   Property Index: Properties
+   File Index: Files
+   Constructor Index: Constructor
+   }  # Group: Index
+
diff --git a/apidoc_config/OL.css b/apidoc_config/OL.css
new file mode 100644
index 0000000..a397119
--- /dev/null
+++ b/apidoc_config/OL.css
@@ -0,0 +1,20 @@
+p {
+    text-indent: 0; margin-bottom: 1em;
+}
+
+.MGroup {
+    font-variant: normal;
+    margin: 0.4em 0 0em 10px
+}
+
+.MTitle {
+    font-variant: normal;
+}
+
+.CGroup .CTitle {
+    font-variant: normal;
+}
+
+.SGroup .SEntry {
+    font-variant: normal;
+}
\ No newline at end of file
diff --git a/apidoc_config/Topics.txt b/apidoc_config/Topics.txt
new file mode 100644
index 0000000..9c8580c
--- /dev/null
+++ b/apidoc_config/Topics.txt
@@ -0,0 +1,105 @@
+Format: Development Release 12-07-2007 (1.35 base)
+
+# This is the Natural Docs topics file for this project.  If you change anything
+# here, it will apply to THIS PROJECT ONLY.  If you'd like to change something
+# for all your projects, edit the Topics.txt in Natural Docs' Config directory
+# instead.
+
+
+Ignore Keywords: 
+   function, functions
+   func, funcs
+   procedure, procedures
+   proc, procs
+   routine, routines
+   subroutine, subroutines
+   sub, subs
+   method, methods
+   callback, callbacks
+   property, properties
+   prop, props
+
+
+#-------------------------------------------------------------------------------
+# SYNTAX:
+#
+# Topic Type: [name]
+# Alter Topic Type: [name]
+#    Creates a new topic type or alters one from the main file.  Each type gets
+#    its own index and behavior settings.  Its name can have letters, numbers,
+#    spaces, and these charaters: - / . '
+#
+# Plural: [name]
+#    Sets the plural name of the topic type, if different.
+#
+# Keywords:
+#    [keyword]
+#    [keyword], [plural keyword]
+#    ...
+#    Defines or adds to the list of keywords for the topic type.  They may only
+#    contain letters, numbers, and spaces and are not case sensitive.  Plural
+#    keywords are used for list topics.  You can redefine keywords found in the
+#    main topics file.
+#
+# Index: [yes|no]
+#    Whether the topics get their own index.  Defaults to yes.  Everything is
+#    included in the general index regardless of this setting.
+#
+# Scope: [normal|start|end|always global]
+#    How the topics affects scope.  Defaults to normal.
+#    normal        - Topics stay within the current scope.
+#    start         - Topics start a new scope for all the topics beneath it,
+#                    like class topics.
+#    end           - Topics reset the scope back to global for all the topics
+#                    beneath it.
+#    always global - Topics are defined as global, but do not change the scope
+#                    for any other topics.
+#
+# Class Hierarchy: [yes|no]
+#    Whether the topics are part of the class hierarchy.  Defaults to no.
+#
+# Page Title If First: [yes|no]
+#    Whether the topic's title becomes the page title if it's the first one in
+#    a file.  Defaults to no.
+#
+# Break Lists: [yes|no]
+#    Whether list topics should be broken into individual topics in the output.
+#    Defaults to no.
+#
+# Can Group With: [type], [type], ...
+#    Defines a list of topic types that this one can possibly be grouped with.
+#    Defaults to none.
+#-------------------------------------------------------------------------------
+
+# The following topics are defined in the main file, if you'd like to alter
+# their behavior or add keywords:
+#
+#    Generic, Class, Interface, Section, File, Group, Function, Variable,
+#    Property, Type, Constant, Enumeration, Event, Delegate, Macro,
+#    Database, Database Table, Database View, Database Index, Database
+#    Cursor, Database Trigger, Cookie, Build Target
+
+# If you add something that you think would be useful to other developers
+# and should be included in Natural Docs by default, please e-mail it to
+# topics [at] naturaldocs [dot] org.
+
+
+Topic Type: Constructor
+
+   Class Hierarchy: Yes
+   Keywords:
+      constructor
+      initialize
+
+
+Alter Topic Type: Function
+
+   Add Keywords:
+      apimethod
+      apifunction
+
+
+Alter Topic Type: Property
+
+   Add Keywords:
+      apiproperty
diff --git a/art/arrows.svg b/art/arrows.svg
new file mode 100644
index 0000000..d40712d
--- /dev/null
+++ b/art/arrows.svg
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="18.000000px"
+   height="18.000000px"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.42"
+   sodipodi:docbase="/Users/phil/Documents/work/metacarta/2svn.openlayers.net/follower/code/b-edits-1/openlayers/assets/ui_elements"
+   sodipodi:docname="pan_icons.svg"
+   inkscape:export-filename="/Users/phil/Documents/work/metacarta/2svn.openlayers.net/follower/code/b-edits-1/openlayers/assets/ui_elements/zoom-minus-mini.png"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-ydpi="90.000000">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0000000"
+     inkscape:cx="9.0000000"
+     inkscape:cy="9.0000000"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="1226"
+     inkscape:window-height="800"
+     inkscape:window-x="42"
+     inkscape:window-y="22" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="background"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g2110">
+      <path
+         transform="matrix(0.000000,-1.003160,1.003160,0.000000,-2.844000e-2,18.02844)"
+         d="M 17.971654 9.0000000 A 8.9716539 8.9716539 0 1 1  0.028346062,9.0000000 A 8.9716539 8.9716539 0 1 1  17.971654 9.0000000 z"
+         sodipodi:ry="8.9716539"
+         sodipodi:rx="8.9716539"
+         sodipodi:cy="9.0000000"
+         sodipodi:cx="9.0000000"
+         id="path2059"
+         style="fill:#00008b;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+         sodipodi:type="arc" />
+      <rect
+         transform="matrix(0.000000,-1.000000,1.000000,0.000000,0.000000,0.000000)"
+         y="4.3599998e-06"
+         x="-9.0000048"
+         height="18.000000"
+         width="9.0000000"
+         id="rect2061"
+         style="fill:#00008b;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="zoom"
+     style="display:inline">
+    <text
+       xml:space="preserve"
+       style="font-size:18.000000px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1.0000000;font-family:Helvetica"
+       x="3.7485352"
+       y="-3.4077148"
+       id="text2114"
+       sodipodi:linespacing="125.00000%"
+       transform="scale(1.000000,-1.000000)"><tspan
+         sodipodi:role="line"
+         id="tspan2118"
+         x="3.7485352"
+         y="-3.4077148">−</tspan></text>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="overlay"
+     style="display:none">
+    <path
+       style="font-size:12.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Verdana"
+       d="M 2.9678210,9.0332227 C 2.9678314,9.5015070 3.1752531,9.8938504 3.5900866,10.210254 C 3.6463464,10.254553 3.9451742,10.453889 4.4865710,10.808262 L 8.1568835,13.247754 C 8.2693886,13.323691 8.4240759,13.393300 8.6209460,13.456582 C 8.8107943,13.519862 9.0041535,13.551503 9.2010240,13.551504 C 9.5736843,13.551503 9.8936056,13.431269 10.160789,13.190801 C 10.427980,12.950332 10.561574,12.659238 10.561572,12.317520 C 10.561574,11.861896 10.322511,11.488536 9.8443836,11.197442 L 8. [...]
+       id="text2082"
+       sodipodi:nodetypes="csccsssscccssscccssssccscc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="pan triangle"
+     style="display:none">
+    <path
+       sodipodi:type="star"
+       style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+       id="path2107"
+       sodipodi:sides="3"
+       sodipodi:cx="6.8031497"
+       sodipodi:cy="5.1874018"
+       sodipodi:r1="5.0880113"
+       sodipodi:r2="2.5440056"
+       sodipodi:arg1="1.0471976"
+       sodipodi:arg2="2.0943951"
+       inkscape:flatsided="false"
+       inkscape:rounded="0.0000000"
+       inkscape:randomized="0.0000000"
+       d="M 9.3471551,9.5937489 L 5.5311469,7.3905753 L 1.7151384,5.1874015 L 5.5311469,2.9842283 L 9.3471555,0.78105489 L 9.3471553,5.1874018 L 9.3471551,9.5937489 z "
+       transform="matrix(0.000000,-1.331000,1.331000,0.000000,2.038879,16.92102)" />
+  </g>
+</svg>
diff --git a/art/layer-switcher-maximize.svg b/art/layer-switcher-maximize.svg
new file mode 100644
index 0000000..6b9f0d3
--- /dev/null
+++ b/art/layer-switcher-maximize.svg
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="18.000000px"
+   height="18.000000px"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.43"
+   sodipodi:docbase="/home/sderle/projects/openlayers/layerswitcher/art"
+   sodipodi:docname="layer-switcher-maximize.svg"
+   inkscape:export-filename="/Users/phil/Documents/work/metacarta/2svn.openlayers.net/follower/code/b-edits-1/openlayers/assets/ui_elements/zoom-minus-mini.png"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-ydpi="90.000000">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="16"
+     inkscape:cx="9"
+     inkscape:cy="9"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer4"
+     inkscape:window-width="1226"
+     inkscape:window-height="800"
+     inkscape:window-x="42"
+     inkscape:window-y="25" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="background"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g2110"
+       transform="matrix(-7.849624e-17,1,-1,-7.849624e-17,18,0)">
+      <path
+         transform="matrix(0,-1.00316,1.00316,0,-2.844e-2,18.02844)"
+         d="M 17.971654 9 A 8.9716539 8.9716539 0 1 1  0.028346062,9 A 8.9716539 8.9716539 0 1 1  17.971654 9 z"
+         sodipodi:ry="8.9716539"
+         sodipodi:rx="8.9716539"
+         sodipodi:cy="9"
+         sodipodi:cx="9"
+         id="path2059"
+         style="fill:#00008b;fill-opacity:1;stroke:none;stroke-width:39.98414612;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         sodipodi:type="arc" />
+      <rect
+         transform="matrix(0,-1,1,0,0,0)"
+         y="4.3599998e-06"
+         x="-9.0000048"
+         height="18"
+         width="9"
+         id="rect2061"
+         style="fill:#00008b;fill-opacity:1;stroke:none;stroke-width:39.98414612;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="zoom"
+     style="display:inline">
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline;font-family:Helvetica"
+       x="1.5214844"
+       y="-3.2949219"
+       id="text2114"
+       sodipodi:linespacing="125%"
+       transform="scale(1,-1)"><tspan
+         sodipodi:role="line"
+         id="tspan2118"
+         x="1.5214844"
+         y="-3.2949219">+</tspan></text>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="overlay"
+     style="display:none">
+    <path
+       style="font-size:12.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Verdana"
+       d="M 2.9678210,9.0332227 C 2.9678314,9.5015070 3.1752531,9.8938504 3.5900866,10.210254 C 3.6463464,10.254553 3.9451742,10.453889 4.4865710,10.808262 L 8.1568835,13.247754 C 8.2693886,13.323691 8.4240759,13.393300 8.6209460,13.456582 C 8.8107943,13.519862 9.0041535,13.551503 9.2010240,13.551504 C 9.5736843,13.551503 9.8936056,13.431269 10.160789,13.190801 C 10.427980,12.950332 10.561574,12.659238 10.561572,12.317520 C 10.561574,11.861896 10.322511,11.488536 9.8443836,11.197442 L 8. [...]
+       id="text2082"
+       sodipodi:nodetypes="csccsssscccssscccssssccscc" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="pan triangle"
+     style="display:none">
+    <path
+       sodipodi:type="star"
+       style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+       id="path2107"
+       sodipodi:sides="3"
+       sodipodi:cx="6.8031497"
+       sodipodi:cy="5.1874018"
+       sodipodi:r1="5.0880113"
+       sodipodi:r2="2.5440056"
+       sodipodi:arg1="1.0471976"
+       sodipodi:arg2="2.0943951"
+       inkscape:flatsided="false"
+       inkscape:rounded="0.0000000"
+       inkscape:randomized="0.0000000"
+       d="M 9.3471551,9.5937489 L 5.5311469,7.3905753 L 1.7151384,5.1874015 L 5.5311469,2.9842283 L 9.3471555,0.78105489 L 9.3471553,5.1874018 L 9.3471551,9.5937489 z "
+       transform="matrix(0.000000,-1.331000,1.331000,0.000000,2.038879,16.92102)" />
+  </g>
+</svg>
diff --git a/art/layer-switcher-minimize.svg b/art/layer-switcher-minimize.svg
new file mode 100644
index 0000000..70fcb8c
--- /dev/null
+++ b/art/layer-switcher-minimize.svg
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="90.000000"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-filename="/home/sderle/projects/openlayers/layerswitcher/img/layer-switcher-minimize.png"
+   sodipodi:docname="layer-switcher-minimize.svg"
+   sodipodi:docbase="/home/sderle/projects/openlayers/layerswitcher/art"
+   inkscape:version="0.43"
+   sodipodi:version="0.32"
+   id="svg2"
+   height="18.000000px"
+   width="18.000000px">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     inkscape:window-y="26"
+     inkscape:window-x="42"
+     inkscape:window-height="800"
+     inkscape:window-width="1226"
+     inkscape:current-layer="layer1"
+     inkscape:document-units="px"
+     inkscape:cy="9.3025513"
+     inkscape:cx="9"
+     inkscape:zoom="16"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     style="display:inline"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="background">
+    <rect
+       style="fill:#00008b;fill-opacity:0;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+       id="rect2061"
+       width="18.014498"
+       height="18.000000"
+       x="-18.014502"
+       y="4.3599998e-06"
+       transform="matrix(0.000000,-1.000000,1.000000,0.000000,0.000000,0.000000)"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90"
+       inkscape:export-filename="/home/sderle/projects/openlayers/layerswitcher/art/layer-switcher-minimize.png" />
+  </g>
+  <g
+     inkscape:label="graticule"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <text
+       xml:space="preserve"
+       style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline;font-family:Helvetica"
+       x="5.2802601"
+       y="-3.8032362"
+       id="text1432"
+       sodipodi:linespacing="125%"
+       transform="scale(1,-1)"><tspan
+         sodipodi:role="line"
+         id="tspan1434"
+         x="5.2802601"
+         y="-3.8032362">-</tspan></text>
+    <rect
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99699599px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
+       id="rect1438"
+       width="13.003004"
+       height="13.002999"
+       x="2.498498"
+       y="2.4984975" />
+  </g>
+  <g
+     style="display:none"
+     inkscape:label="zoom"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <text
+       transform="scale(1.000000,-1.000000)"
+       sodipodi:linespacing="125.00000%"
+       id="text2114"
+       y="-3.4077148"
+       x="3.7485352"
+       style="font-size:18.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#ffffff;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1.0000000;font-family:Helvetica;text-anchor:start;writing-mode:lr-tb"
+       xml:space="preserve"><tspan
+         y="-3.4077148"
+         x="3.7485352"
+         id="tspan2118"
+         sodipodi:role="line">−</tspan></text>
+  </g>
+  <g
+     style="display:none"
+     inkscape:label="overlay"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:nodetypes="csccsssscccssscccssssccscc"
+       id="text2082"
+       d="M 2.9678210,9.0332227 C 2.9678314,9.5015070 3.1752531,9.8938504 3.5900866,10.210254 C 3.6463464,10.254553 3.9451742,10.453889 4.4865710,10.808262 L 8.1568835,13.247754 C 8.2693886,13.323691 8.4240759,13.393300 8.6209460,13.456582 C 8.8107943,13.519862 9.0041535,13.551503 9.2010240,13.551504 C 9.5736843,13.551503 9.8936056,13.431269 10.160789,13.190801 C 10.427980,12.950332 10.561574,12.659238 10.561572,12.317520 C 10.561574,11.861896 10.322511,11.488536 9.8443836,11.197442 L 8. [...]
+       style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Verdana;text-anchor:start;writing-mode:lr-tb" />
+  </g>
+  <g
+     style="display:none"
+     inkscape:label="pan triangle"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <path
+       transform="matrix(0.000000,-1.331000,1.331000,0.000000,2.038879,16.92102)"
+       d="M 9.3471551,9.5937489 L 5.5311469,7.3905753 L 1.7151384,5.1874015 L 5.5311469,2.9842283 L 9.3471555,0.78105489 L 9.3471553,5.1874018 L 9.3471551,9.5937489 z "
+       inkscape:randomized="0.0000000"
+       inkscape:rounded="0.0000000"
+       inkscape:flatsided="false"
+       sodipodi:arg2="2.0943951"
+       sodipodi:arg1="1.0471976"
+       sodipodi:r2="2.5440056"
+       sodipodi:r1="5.0880113"
+       sodipodi:cy="5.1874018"
+       sodipodi:cx="6.8031497"
+       sodipodi:sides="3"
+       id="path2107"
+       style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+       sodipodi:type="star" />
+  </g>
+</svg>
diff --git a/art/marker.svg b/art/marker.svg
new file mode 100644
index 0000000..9f0d8dc
--- /dev/null
+++ b/art/marker.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
+]>
+<svg  version="1.1" id="Layer_1" xmlns:i="&ns_ai;" 
+	 xmlns="&ns_svg;" width="20.5" height="24.5" viewBox="0 0 20.5 24.5"
+	 overflow="visible" enable-background="new 0 0 20.5 24.5" xml:space="preserve">
+	<g i:extraneous="self">
+		<rect x="0.25" y="0.25" opacity="0" stroke="#000000" stroke-width="1" width="20" height="24"/>
+		<g id="XMLID_2_">
+			<g>
+				<polygon fill="#FF0000" points="10.12,0.6 19.93,7.71 10.06,24.03 0.6,7.58 				"/>
+			</g>
+			<g>
+				<polyline fill="none" stroke="#000000" stroke-width="1" points="9.98,24.16 10.06,24.03 19.93,7.71 20.06,7.49 				"/>
+				<polyline fill="none" stroke="#000000" stroke-width="1" points="10.13,24.16 10.06,24.03 0.6,7.58 0.5,7.41 				"/>
+				<polyline fill="none" stroke="#000000" stroke-width="1" points="0.41,7.72 0.6,7.58 10.12,0.6 10.29,0.47 				"/>
+				<polyline fill="none" stroke="#000000" stroke-width="1" points="9.94,0.47 10.12,0.6 19.93,7.71 20.06,7.8 				"/>
+			</g>
+		</g>
+		<ellipse stroke="#000000" stroke-width="1" cx="10.125" cy="9.25" rx="1.5" ry="1.5"/>
+	</g>
+</svg>
diff --git a/art/measuring-stick-off.svg b/art/measuring-stick-off.svg
new file mode 100644
index 0000000..2e47a2f
--- /dev/null
+++ b/art/measuring-stick-off.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
+	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg  version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="28.375" height="28" viewBox="0 0 28.375 28"
+	 overflow="visible" enable-background="new 0 0 28.375 28" xml:space="preserve">
+	<g i:extraneous="self">
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M27.875,1.375"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M0,1.375"/>
+		<path fill="none" stroke="#FFFFFF" d="M0,27.475"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,27.645"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,0.544"/>
+		<line fill="none" stroke="#00008B" x1="0.875" y1="27.5" x2="27.875" y2="27.475"/>
+		<rect x="0.875" y="1.045" fill="#00008B" width="27.125" height="26"/>
+		<line fill="none" stroke="#00008B" x1="27.875" y1="26.925" x2="27.875" y2="0.925"/>
+		<line fill="none" stroke="#FFFFFF" x1="1.375" y1="0.5" x2="27.375" y2="0.5"/>
+		<line fill="none" stroke="#FFFFFF" x1="0.875" y1="1" x2="0.875" y2="27"/>
+		
+			<rect x="5.252" y="11.157" transform="matrix(0.7933 -0.6088 0.6088 0.7933 -5.1621 12.1086)" fill="#FFBF00" width="20" height="5"/>
+		<line fill="#FFBF00" stroke="#000000" x1="8.376" y1="15.783" x2="10.717" y2="18.766"/>
+		<line fill="#FFBF00" stroke="#000000" x1="11.946" y1="13.043" x2="14.288" y2="16.027"/>
+		<line fill="#FFBF00" stroke="#000000" x1="15.342" y1="10.437" x2="17.684" y2="13.42"/>
+		<line fill="#FFBF00" stroke="#000000" x1="18.69" y1="7.869" x2="21.03" y2="10.852"/>
+	</g>
+</svg>
diff --git a/art/measuring-stick-on.svg b/art/measuring-stick-on.svg
new file mode 100644
index 0000000..ca0c18c
--- /dev/null
+++ b/art/measuring-stick-on.svg
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
+	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg  version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="28.375" height="28" viewBox="0 0 28.375 28"
+	 overflow="visible" enable-background="new 0 0 28.375 28" xml:space="preserve">
+	<g i:extraneous="self">
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M27.875,1.375"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M0,1.375"/>
+		<path fill="none" stroke="#FFFFFF" d="M0,27.475"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,27.645"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,0.544"/>
+		<line fill="none" stroke="#FFFFFF" x1="0.875" y1="27.5" x2="27.875" y2="27.475"/>
+		<rect x="0.875" y="1.045" fill="#ADD8E6" width="27.125" height="26"/>
+		<line fill="none" stroke="#FFFFFF" x1="27.875" y1="26.925" x2="27.875" y2="0.925"/>
+		<line fill="none" stroke="#00008B" x1="1.375" y1="0.5" x2="27.375" y2="0.5"/>
+		<line fill="none" stroke="#00008B" x1="0.875" y1="1" x2="0.875" y2="27"/>
+		
+			<rect x="4.252" y="12.157" transform="matrix(0.7933 -0.6088 0.6088 0.7933 -5.9776 11.7065)" fill="#FFBF00" width="20" height="5"/>
+		<line fill="#FFBF00" stroke="#000000" x1="7.376" y1="16.783" x2="9.717" y2="19.766"/>
+		<line fill="#FFBF00" stroke="#000000" x1="10.946" y1="14.043" x2="13.288" y2="17.027"/>
+		<line fill="#FFBF00" stroke="#000000" x1="14.342" y1="11.437" x2="16.684" y2="14.42"/>
+		<line fill="#FFBF00" stroke="#000000" x1="17.69" y1="8.869" x2="20.03" y2="11.852"/>
+	</g>
+</svg>
diff --git a/art/panning-hand-off.svg b/art/panning-hand-off.svg
new file mode 100644
index 0000000..bf2e40b
--- /dev/null
+++ b/art/panning-hand-off.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
+	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg  version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="28.375" height="28" viewBox="0 0 28.375 28"
+	 overflow="visible" enable-background="new 0 0 28.375 28" xml:space="preserve">
+	<g i:extraneous="self">
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M27.875,1.375"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M0,1.375"/>
+		<path fill="none" stroke="#FFFFFF" d="M0,27.475"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,27.645"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,0.544"/>
+		<line fill="none" stroke="#00008B" x1="0.875" y1="27.5" x2="27.875" y2="27.475"/>
+		<rect x="0.875" y="1.045" fill="#00008B" width="27.125" height="26"/>
+		<line fill="none" stroke="#00008B" x1="27.875" y1="26.925" x2="27.875" y2="0.925"/>
+		<line fill="none" stroke="#FFFFFF" x1="1.375" y1="0.5" x2="27.375" y2="0.5"/>
+		<line fill="none" stroke="#FFFFFF" x1="0.875" y1="1" x2="0.875" y2="27"/>
+		<path fill="#FFFFFF" stroke="#000000" d="M9.458,22.458c-0.473-0.168-1.02-1.269-1.363-1.695
+			c-0.479-0.595-0.894-1.245-1.377-1.829c-0.733-0.887-1.356-1.729-1.854-2.764c-0.375-0.782-0.884-1.997-0.005-2.648
+			c1.036-0.767,2.095-0.162,2.934,0.479c0.844,0.646,1.729,1.18,2.526,1.869c-0.372-0.305-0.548-0.986-0.778-1.421
+			c-0.253-0.477-0.565-0.906-0.822-1.375c-0.359-0.657-0.767-1.201-1.21-1.823c-0.544-0.763-1.051-1.74-0.925-2.709
+			c0.133-1.025,0.972-1.527,1.924-1.207c1.202,0.405,1.969,1.692,2.627,2.698c0.636,0.971,1.201,2.159,1.938,3.042
+			c-0.222-0.209-0.148-0.508-0.155-0.782c-0.01-0.37-0.097-0.626-0.219-0.967c-0.162-0.455-0.219-0.972-0.24-1.45
+			c-0.034-0.776-0.25-1.465-0.25-2.247c0-0.988-0.14-1.963,0.71-2.631c0.666-0.523,1.649-0.764,2.381-0.248
+			c1.385,0.976,1.057,2.999,1.209,4.458c0.079,0.759,0.165,1.489,0.2,2.263c0.022,0.496,0.209,1.067,0.168,1.558
+			c-0.146-0.269-0.113-0.749-0.127-1.057c-0.022-0.502-0.041-0.982-0.115-1.47c-0.114-0.743-0.188-1.564-0.25-2.324
+			c-0.152-1.877,2.054-3.17,3.301-1.469c0.884,1.206,0.773,2.643,0.773,4.085c0,0.698-0.034,1.251-0.22,1.91
+			c-0.13,0.459-0.293,1.222-0.239,1.638c0-0.902,0.334-1.697,0.334-2.588c0-0.678-0.272-2.099,0.581-2.334
+			c1.065-0.294,2.008,0.875,2.428,1.66c0.458,0.855,0.555,1.901,0.409,2.882c-0.318,2.154-0.845,4.227-2.096,6.072
+			c-0.268,0.396-0.485,0.838-0.79,1.22c-0.361,0.452-0.923,0.772-1.416,1.071c-0.381,0.232-0.764,0.53-1.176,0.604
+			c-0.822,0.149-1.725,0.157-2.565,0.157c-1.29,0-2.564-0.068-3.832-0.251c-0.799-0.115-2.12,0.153-2.668-0.54"/>
+	</g>
+</svg>
diff --git a/art/panning-hand-on.svg b/art/panning-hand-on.svg
new file mode 100644
index 0000000..139ce97
--- /dev/null
+++ b/art/panning-hand-on.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+	<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+	<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+	<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+	<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+	<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+	<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+	<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+	<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
+	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg  version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+	 xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="28.375" height="28" viewBox="0 0 28.375 28"
+	 overflow="visible" enable-background="new 0 0 28.375 28" xml:space="preserve">
+	<g i:extraneous="self">
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M27.875,1.375"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M0,1.375"/>
+		<path fill="none" stroke="#FFFFFF" d="M0,27.475"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,27.645"/>
+		<path fill="none" stroke="#00008B" stroke-width="1.5" d="M1,0.544"/>
+		<line fill="none" stroke="#FFFFFF" x1="0.875" y1="27.5" x2="27.875" y2="27.475"/>
+		<rect x="0.875" y="1.045" fill="#ADD8E6" width="27.125" height="26"/>
+		<line fill="none" stroke="#FFFFFF" x1="27.875" y1="26.925" x2="27.875" y2="0.925"/>
+		<line fill="none" stroke="#00008B" x1="1.375" y1="0.5" x2="27.375" y2="0.5"/>
+		<line fill="none" stroke="#00008B" x1="0.875" y1="1" x2="0.875" y2="27"/>
+		<path fill="#FFFFFF" stroke="#000000" d="M8.458,23.458c-0.473-0.168-1.02-1.269-1.363-1.695
+			c-0.479-0.595-0.894-1.245-1.377-1.829c-0.733-0.887-1.356-1.729-1.854-2.764c-0.375-0.782-0.884-1.997-0.005-2.648
+			c1.036-0.767,2.095-0.161,2.934,0.479c0.844,0.646,1.729,1.18,2.526,1.869c-0.372-0.305-0.548-0.986-0.778-1.421
+			c-0.253-0.477-0.565-0.906-0.822-1.375c-0.359-0.657-0.767-1.201-1.21-1.823c-0.544-0.763-1.051-1.74-0.925-2.709
+			c0.133-1.025,0.972-1.527,1.924-1.207c1.202,0.405,1.969,1.692,2.627,2.698c0.636,0.971,1.201,2.159,1.938,3.042
+			c-0.222-0.21-0.148-0.509-0.155-0.783c-0.01-0.37-0.097-0.626-0.219-0.967c-0.162-0.455-0.219-0.972-0.24-1.45
+			c-0.034-0.776-0.25-1.465-0.25-2.247c0-0.988-0.14-1.963,0.71-2.631c0.666-0.523,1.649-0.764,2.381-0.248
+			c1.385,0.976,1.057,2.999,1.209,4.458c0.079,0.759,0.165,1.489,0.2,2.263c0.022,0.496,0.209,1.068,0.168,1.558
+			c-0.146-0.27-0.113-0.75-0.127-1.058c-0.022-0.502-0.041-0.982-0.115-1.47c-0.114-0.743-0.188-1.564-0.25-2.324
+			c-0.152-1.877,2.054-3.17,3.301-1.469c0.884,1.206,0.773,2.643,0.773,4.085c0,0.698-0.034,1.251-0.22,1.91
+			c-0.13,0.459-0.293,1.222-0.239,1.639c0-0.902,0.334-1.697,0.334-2.589c0-0.678-0.272-2.099,0.581-2.334
+			c1.065-0.294,2.008,0.875,2.428,1.66c0.458,0.855,0.555,1.901,0.409,2.883c-0.318,2.153-0.845,4.227-2.096,6.071
+			c-0.268,0.396-0.485,0.838-0.79,1.22c-0.361,0.452-0.923,0.772-1.416,1.071c-0.381,0.232-0.764,0.53-1.176,0.604
+			c-0.822,0.149-1.725,0.157-2.565,0.157c-1.29,0-2.564-0.068-3.832-0.251c-0.799-0.115-2.12,0.153-2.668-0.54"/>
+	</g>
+</svg>
diff --git a/art/slider.svg b/art/slider.svg
new file mode 100644
index 0000000..9fa435d
--- /dev/null
+++ b/art/slider.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="210mm"
+   height="297mm"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.41.1"
+   sodipodi:docbase="/afs/metacarta.com/user/sderle/public_html/ol.zoombar/art"
+   sodipodi:docname="slider.svg"
+   inkscape:export-filename="/afs/metacarta.com/user/sderle/public_html/ol.zoombar/img/slider.png"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-ydpi="90.000000">
+  <defs
+     id="defs3" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="39.870978"
+     inkscape:cx="140.00732"
+     inkscape:cy="695.49796"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1010"
+     inkscape:window-height="538"
+     inkscape:window-x="20"
+     inkscape:window-y="107" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF
+       id="RDF5">
+      <cc:Work
+         rdf:about=""
+         id="Work6">
+        <dc:format
+           id="format7">image/svg+xml</dc:format>
+        <dc:type
+           id="type9"
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:#00008b;fill-opacity:1.0000000;stroke:#000080;stroke-width:4.9999957;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+       id="rect1291"
+       x="132.50000"
+       y="354.86218"
+       width="15.014628"
+       height="4.0040474" />
+    <path
+       style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+       d="M 134.08880,356.89603 L 146.00000,356.87002"
+       id="path2052" />
+  </g>
+</svg>
diff --git a/art/zoom-world.svg b/art/zoom-world.svg
new file mode 100644
index 0000000..749e7c7
--- /dev/null
+++ b/art/zoom-world.svg
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:xml="http://www.w3.org/XML/1998/namespace"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="90.000000"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-filename="/Users/phil/Documents/work/metacarta/2svn.openlayers.net/follower/code/b-edits-1/openlayers/assets/ui_elements/zoom-minus-mini.png"
+   sodipodi:docname="zoom-world.svg"
+   sodipodi:docbase="/afs/metacarta.com/user/sderle/OL/openlayers/assets/ui_elements"
+   inkscape:version="0.41.1"
+   sodipodi:version="0.32"
+   id="svg2"
+   height="18.000000px"
+   width="18.000000px">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     inkscape:window-y="26"
+     inkscape:window-x="42"
+     inkscape:window-height="800"
+     inkscape:window-width="1226"
+     inkscape:current-layer="layer5"
+     inkscape:document-units="px"
+     inkscape:cy="9.3025513"
+     inkscape:cx="9.0000000"
+     inkscape:zoom="1.0000000"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF
+       id="RDF1295">
+      <cc:Work
+         id="Work1297"
+         rdf:about="">
+        <dc:format
+           id="format1299">image/svg+xml</dc:format>
+        <dc:type
+           id="type1301"
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     style="display:inline"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="background">
+    <rect
+       style="fill:#00008b;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+       id="rect2061"
+       width="18.014498"
+       height="18.000000"
+       x="-18.014502"
+       y="4.3599998e-06"
+       transform="matrix(0.000000,-1.000000,1.000000,0.000000,0.000000,0.000000)" />
+  </g>
+  <g
+     inkscape:label="graticule"
+     id="layer5"
+     inkscape:groupmode="layer">
+    <g
+       transform="translate(0.000000,-4.419417e-2)"
+       id="g2876">
+      <path
+         transform="matrix(1.155321,0.000000,0.000000,1.155321,-2.292065,-1.751761)"
+         d="M 16.869573 9.3188362 A 7.0579743 7.0579743 0 1 1  2.7536244,9.3188362 A 7.0579743 7.0579743 0 1 1  16.869573 9.3188362 z"
+         sodipodi:ry="7.0579743"
+         sodipodi:rx="7.0579743"
+         sodipodi:cy="9.3188362"
+         sodipodi:cx="9.8115988"
+         id="path1321"
+         style="fill:none;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:0.50000000;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2086"
+         d="M 8.1145142,1.1289949 C 15.315267,9.5238831 8.3963197,17.101449 8.3963197,17.057255"
+         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2846"
+         d="M 11.588885,1.3666059 C 18.922222,9.5405232 11.605526,16.764536 11.605526,16.764536"
+         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2848"
+         d="M 5.2258471,2.0593951 C 11.080923,9.7405585 5.3432210,16.278941 5.3432210,16.278941"
+         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2850"
+         d="M 2.7388198,3.7571959 C 6.3686281,9.1817837 2.9127331,14.361601 2.9127331,14.361601"
+         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+    </g>
+    <g
+       transform="matrix(-6.269315e-2,0.998033,-0.998033,-6.269315e-2,18.62352,0.612232)"
+       id="g2883">
+      <path
+         transform="matrix(1.155321,0.000000,0.000000,1.155321,-2.292065,-1.751761)"
+         d="M 16.869573 9.3188362 A 7.0579743 7.0579743 0 1 1  2.7536244,9.3188362 A 7.0579743 7.0579743 0 1 1  16.869573 9.3188362 z"
+         sodipodi:ry="7.0579743"
+         sodipodi:rx="7.0579743"
+         sodipodi:cy="9.3188362"
+         sodipodi:cx="9.8115988"
+         id="path2885"
+         style="fill:none;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:0.50000000;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2887"
+         d="M 8.1145142,1.1289949 C 15.315267,9.5238831 8.3963197,17.101449 8.3963197,17.057255"
+         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2889"
+         d="M 11.588885,1.3666059 C 18.922222,9.5405232 11.605526,16.764536 11.605526,16.764536"
+         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2891"
+         d="M 5.2258471,2.0593951 C 11.080923,9.7405585 5.3432210,16.278941 5.3432210,16.278941"
+         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+      <path
+         sodipodi:nodetypes="cc"
+         id="path2893"
+         d="M 2.7388198,3.7571959 C 6.3686281,9.1817837 2.9127331,14.361601 2.9127331,14.361601"
+         style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000" />
+    </g>
+  </g>
+  <g
+     style="display:none"
+     inkscape:label="zoom"
+     id="layer4"
+     inkscape:groupmode="layer">
+    <text
+       transform="scale(1.000000,-1.000000)"
+       sodipodi:linespacing="125.00000%"
+       id="text2114"
+       y="-3.4077148"
+       x="3.7485352"
+       style="font-size:18.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#ffffff;fill-opacity:1.0000000;stroke:#ffffff;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1.0000000;font-family:Helvetica;text-anchor:start;writing-mode:lr-tb"
+       xml:space="preserve"><tspan
+         y="-3.4077148"
+         x="3.7485352"
+         id="tspan2118"
+         sodipodi:role="line">−</tspan></text>
+  </g>
+  <g
+     style="display:none"
+     inkscape:label="overlay"
+     id="layer2"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:nodetypes="csccsssscccssscccssssccscc"
+       id="text2082"
+       d="M 2.9678210,9.0332227 C 2.9678314,9.5015070 3.1752531,9.8938504 3.5900866,10.210254 C 3.6463464,10.254553 3.9451742,10.453889 4.4865710,10.808262 L 8.1568835,13.247754 C 8.2693886,13.323691 8.4240759,13.393300 8.6209460,13.456582 C 8.8107943,13.519862 9.0041535,13.551503 9.2010240,13.551504 C 9.5736843,13.551503 9.8936056,13.431269 10.160789,13.190801 C 10.427980,12.950332 10.561574,12.659238 10.561572,12.317520 C 10.561574,11.861896 10.322511,11.488536 9.8443836,11.197442 L 8. [...]
+       style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Verdana;text-anchor:start;writing-mode:lr-tb" />
+  </g>
+  <g
+     style="display:none"
+     inkscape:label="pan triangle"
+     id="layer3"
+     inkscape:groupmode="layer">
+    <path
+       transform="matrix(0.000000,-1.331000,1.331000,0.000000,2.038879,16.92102)"
+       d="M 9.3471551,9.5937489 L 5.5311469,7.3905753 L 1.7151384,5.1874015 L 5.5311469,2.9842283 L 9.3471555,0.78105489 L 9.3471553,5.1874018 L 9.3471551,9.5937489 z "
+       inkscape:randomized="0.0000000"
+       inkscape:rounded="0.0000000"
+       inkscape:flatsided="false"
+       sodipodi:arg2="2.0943951"
+       sodipodi:arg1="1.0471976"
+       sodipodi:r2="2.5440056"
+       sodipodi:r1="5.0880113"
+       sodipodi:cy="5.1874018"
+       sodipodi:cx="6.8031497"
+       sodipodi:sides="3"
+       id="path2107"
+       style="fill:#ffffff;fill-opacity:1.0000000;stroke:none;stroke-width:39.984146;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
+       sodipodi:type="star" />
+  </g>
+</svg>
diff --git a/art/zoombar.svg b/art/zoombar.svg
new file mode 100644
index 0000000..a88ff36
--- /dev/null
+++ b/art/zoombar.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="18"
+   height="18"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.43"
+   version="1.0"
+   inkscape:export-filename="C:\Documents and Settings\crschmidt\Desktop\zoombar.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90"
+   sodipodi:docbase="C:\Documents and Settings\crschmidt\Desktop"
+   sodipodi:docname="zoombar.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="-117.50597"
+     inkscape:cy="65.94562"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showguides="false"
+     showgrid="false"
+     inkscape:window-width="1024"
+     inkscape:window-height="721"
+     inkscape:window-x="-4"
+     inkscape:window-y="-4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="opacity:0.5;fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000012;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect1307"
+       width="16.999998"
+       height="10.000004"
+       x="-125.51302"
+       y="-52.420002" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999958;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196078"
+       d="M -125.54176,-52.415494 L -125.54176,-42.415495"
+       id="path8297" />
+    <path
+       style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999982;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.50196078"
+       d="M -108.48157,-52.418044 L -108.48157,-42.418046"
+       id="path12667" />
+  </g>
+</svg>
diff --git a/build/README.txt b/build/README.txt
new file mode 100644
index 0000000..6c482cf
--- /dev/null
+++ b/build/README.txt
@@ -0,0 +1,14 @@
+
+## HowTo: Build & deploy "Shrunk" Single File Library version of OpenLayers ##
+
+ * Build:
+
+     cd build
+     ./build.py
+     cd ..
+
+ * Upload the result to the server: e.g.
+
+  scp build/OpenLayers.js openlayers at openlayers.org:openlayers.org/htdocs/code/
+
+
diff --git a/build/build.py b/build/build.py
new file mode 100755
index 0000000..0f46a03
--- /dev/null
+++ b/build/build.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python
+
+import sys
+sys.path.append("../tools")
+import mergejs
+
+def build():
+    have_compressor = None
+    try:
+        import jsmin
+        have_compressor = "jsmin"
+    except ImportError:
+        try:
+            import minimize
+            have_compressor = "minimize"
+        except Exception, E:
+            print E
+            pass
+
+    sourceDirectory = "../lib"
+    configFilename = "full.cfg"
+    outputFilename = "OpenLayers.js"
+
+    if len(sys.argv) > 1:
+        configFilename = sys.argv[1]
+        extension = configFilename[-4:]
+
+        if extension  != ".cfg":
+            configFilename = sys.argv[1] + ".cfg"
+
+    if len(sys.argv) > 2:
+        outputFilename = sys.argv[2]
+
+    print "Merging libraries."
+    merged = mergejs.run(sourceDirectory, None, configFilename)
+    if have_compressor == "jsmin":
+        print "Compressing using jsmin."
+        minimized = jsmin.jsmin(merged)
+    elif have_compressor == "minimize":
+        print "Compressing using minimize."
+        minimized = minimize.minimize(merged)
+    else: # fallback
+        print "Not compressing."
+        minimized = merged 
+    print "Adding license file."
+    minimized = file("license.txt").read() + minimized
+
+    print "Writing to %s." % outputFilename
+    file(outputFilename, "w").write(minimized)
+
+    print "Done."
+
+if __name__ == '__main__':
+  build()
\ No newline at end of file
diff --git a/build/buildUncompressed.py b/build/buildUncompressed.py
new file mode 100755
index 0000000..fd38aa7
--- /dev/null
+++ b/build/buildUncompressed.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+
+import sys
+sys.path.append("../tools")
+
+import jsmin, mergejs
+
+sourceDirectory = "../lib"
+configFilename = "full.cfg"
+outputFilename = "OpenLayers.js"
+
+if len(sys.argv) > 1:
+    configFilename = sys.argv[1] + ".cfg"
+if len(sys.argv) > 2:
+    outputFilename = sys.argv[2]
+
+print "Merging libraries."
+merged = mergejs.run(sourceDirectory, None, configFilename)
+print "Adding license file."
+merged = file("license.txt").read() + merged
+
+print "Writing to %s." % outputFilename
+file(outputFilename, "w").write(merged)
+
+print "Done."
diff --git a/build/full.cfg b/build/full.cfg
new file mode 100644
index 0000000..2e4df52
--- /dev/null
+++ b/build/full.cfg
@@ -0,0 +1,32 @@
+# This is the full build with all files: this includes the vector-related files
+# like Renderers and Formats.
+
+[first]
+OpenLayers/SingleFile.js
+OpenLayers.js
+OpenLayers/BaseTypes.js
+OpenLayers/BaseTypes/Class.js
+OpenLayers/Util.js
+Rico/Corner.js
+
+[last]
+
+[include]
+
+[exclude]
+Firebug/firebug.js
+Firebug/firebugx.js
+OpenLayers/Lang/ca.js
+OpenLayers/Lang/cs-CZ.js
+OpenLayers/Lang/da-DK.js
+OpenLayers/Lang/de.js
+OpenLayers/Lang/en-CA.js
+OpenLayers/Lang/es.js
+OpenLayers/Lang/fr.js
+OpenLayers/Lang/it.js
+OpenLayers/Lang/nb.js
+OpenLayers/Lang/nl.js
+OpenLayers/Lang/pt-BR.js
+OpenLayers/Lang/sv-SE.js
+OpenLayers/Lang/zh-TW.js
+OpenLayers/Lang/zh-CN.js
diff --git a/build/library.cfg b/build/library.cfg
new file mode 100644
index 0000000..a4fcf95
--- /dev/null
+++ b/build/library.cfg
@@ -0,0 +1,68 @@
+# This file includes the OpenLayers code to create a build for everything that 
+# does not require vector support. build.py uses this profile if no other one
+# is specified.
+
+[first]
+OpenLayers/SingleFile.js
+OpenLayers.js
+OpenLayers/BaseTypes.js
+OpenLayers/BaseTypes/Class.js
+OpenLayers/Util.js
+Rico/Corner.js
+
+[last]
+
+[include]
+
+[exclude]
+Firebug/firebug.js
+Firebug/firebugx.js
+OpenLayers/Format/GeoRSS.js
+OpenLayers/Format/GML.js
+OpenLayers/Format/WKT.js
+OpenLayers/Format/KML.js
+OpenLayers/Format/WFS.js
+OpenLayers/Format.js
+OpenLayers/Handler/Path.js
+OpenLayers/Handler/Point.js
+OpenLayers/Handler/Polygon.js
+OpenLayers/Handler/Select.js
+OpenLayers/Geometry/Collection.js
+OpenLayers/Geometry/Curve.js
+OpenLayers/Geometry/LinearRing.js
+OpenLayers/Geometry/LineString.js
+OpenLayers/Geometry/MultiLineString.js
+OpenLayers/Geometry/MultiPoint.js
+OpenLayers/Geometry/MultiPolygon.js
+OpenLayers/Geometry/Point.js
+OpenLayers/Geometry/Polygon.js
+OpenLayers/Geometry/Rectangle.js
+OpenLayers/Geometry/Surface.js
+OpenLayers/Geometry.js
+OpenLayers/Layer/GML.js
+OpenLayers/Layer/Vector.js
+OpenLayers/Control/DrawFeature.js
+OpenLayers/Control/EditingToolbar.js
+OpenLayers/Control/SelectFeature.js
+OpenLayers/Feature/Vector.js
+OpenLayers/Renderer
+OpenLayers/Renderer/Elements.js
+OpenLayers/Renderer/SVG.js
+OpenLayers/Renderer/VML.js
+OpenLayers/Renderer.js
+OpenLayers/Lang/ca.js
+OpenLayers/Lang/cs-CZ.js
+OpenLayers/Lang/da-DK.js
+OpenLayers/Lang/de.js
+OpenLayers/Lang/en-CA.js
+OpenLayers/Lang/es.js
+OpenLayers/Lang/fr.js
+OpenLayers/Lang/it.js
+OpenLayers/Lang/nb.js
+OpenLayers/Lang/nl.js
+OpenLayers/Lang/pt-BR.js
+OpenLayers/Lang/sv-SE.js
+OpenLayers/Lang/zh-TW.js
+OpenLayers/Lang/zh-CN.js
+
+
diff --git a/build/license.txt b/build/license.txt
new file mode 100644
index 0000000..cb99f12
--- /dev/null
+++ b/build/license.txt
@@ -0,0 +1,92 @@
+/*
+
+  OpenLayers.js -- OpenLayers Map Viewer Library
+
+  Copyright 2005-2010 OpenLayers Contributors, released under the Clear BSD
+  license. Please see http://svn.openlayers.org/trunk/openlayers/license.txt
+  for the full text of the license.
+
+  Includes compressed code under the following licenses:
+
+  (For uncompressed versions of the code used please see the
+  OpenLayers SVN repository: <http://openlayers.org/>)
+
+*/
+
+/* Contains portions of Prototype.js:
+ *
+ * Prototype JavaScript framework, version 1.4.0
+ *  (c) 2005 Sam Stephenson <sam at conio.net>
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+ *--------------------------------------------------------------------------*/
+
+/**  
+*  
+*  Contains portions of Rico <http://openrico.org/>
+* 
+*  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  
+*  
+*  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. 
+*
+**/
+
+/**
+ * Contains XMLHttpRequest.js <http://code.google.com/p/xmlhttprequest/>
+ * Copyright 2007 Sergey Ilinsky (http://www.ilinsky.com)
+ *
+ * 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
+ */
+
+/**
+ * Contains portions of Gears <http://code.google.com/apis/gears/>
+ *
+ * Copyright 2007, Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ *  3. Neither the name of Google Inc. nor the names of its contributors may be
+ *     used to endorse or promote products derived from this software without
+ *     specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Sets up google.gears.*, which is *the only* supported way to access Gears.
+ *
+ * Circumvent this file at your own risk!
+ *
+ * In the future, Gears may automatically define google.gears.* without this
+ * file. Gears may use these objects to transparently fix bugs and compatibility
+ * issues. Applications that use the code below will continue to work seamlessly
+ * when that happens.
+ */
diff --git a/build/lite.cfg b/build/lite.cfg
new file mode 100644
index 0000000..48454dc
--- /dev/null
+++ b/build/lite.cfg
@@ -0,0 +1,22 @@
+# This file includes a small subset of OpenLayers code, designed to be
+# integrated into another application. It includes only the Layer types
+# neccesary to create tiled or untiled WMS, and does not include any Controls.
+# This is the result of what was at the time called "Webmap.js" at the FOSS4G
+# Web Mapping BOF.
+
+[first]
+OpenLayers/SingleFile.js
+OpenLayers.js
+OpenLayers/BaseTypes.js
+OpenLayers/BaseTypes/Class.js
+OpenLayers/Util.js
+
+[last]
+
+[include]
+OpenLayers/Map.js
+OpenLayers/Layer/WMS.js
+
+[exclude]
+
+
diff --git a/doc/apidocs/files/OpenLayers-js.html b/doc/apidocs/files/OpenLayers-js.html
new file mode 100644
index 0000000..cf87cca
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers"></a>OpenLayers</h1><div class=CBody><p>The OpenLayers object provides a namespace for all things OpenLayers</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers" >OpenLayers</a></td><td class=SDescription>The OpenLayers object provi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.VERSION_NUMBER"></a>VERSION_NUMBER</h3></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile id=MSelected>OpenLayers</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=MEntry><div class=MFile> [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Ajax-js.html b/doc/apidocs/files/OpenLayers/Ajax-js.html
new file mode 100644
index 0000000..20e0026
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Ajax-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Ajax.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="Ajax.js"></a>Ajax.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#Ajax.js" >Ajax.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.loadURL"></a>OpenLayers.<span class=HB> </span>loadURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.loadURL = function(</td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>params,</td></tr><tr><td></td><td class=PParameter nowrap [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax"></a>OpenLayers.Ajax</h2><div class=CBody></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax.Responders"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Responders</h2><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax.Base"></a>OpenLayers.<span class=HB> </span>Ajax.Base</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Ajax.Base.Constructor" >Constructor</a></td><td class=SDescription></td></tr><tr class="SConstructor SIndent1 SMarked"><td class=SE [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Base.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Base.OpenLayers.Ajax.Base"></a>OpenLayers.<span class=HB> </span>Ajax.Base</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax.Request"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Request</h2><div class=CBody><p><b>Deprecated</b>.   Use <a href="Request-js.html#OpenLayers.Request" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')">OpenLayers.Request</a> method instead.</p><h4 class=CHeading>Inherit</h4><ul><li><a href="#OpenLayers.Ajax.Base" class=LClass >OpenLaye [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.OpenLayers.Ajax.Request"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Request</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax.Response"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Response</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Ajax.Response.Constructor" >Constructor</a></td><td class=SDescription></td></tr><tr class="SConstru [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.OpenLayers.Ajax.Response"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Response</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>request</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.loadURL = function(</td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>params,</td></tr><tr><td></td><td class=PParameter nowrap>caller,</td></tr><tr><td></td><td class=PParameter nowrap>onComplete,</td></tr><tr><td></td><td class=P [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/BaseTypes-js.html b/doc/apidocs/files/OpenLayers/BaseTypes-js.html
new file mode 100644
index 0000000..c095463
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/BaseTypes-js.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers Base Types - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers_Base_Types"></a>OpenLayers Base Types</h1><div class=CBody><p>OpenLayers custom string, number and function functions are described here.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers_Base_Types" >OpenLayers Base Types</a></td> [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.String"></a>OpenLayers.<span class=HB> </span>String</h2><div class=CBody><p>Contains convenience functions for string manipulation.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.String.Functions" >Functions</a></td><td class=SDescription></td></tr><tr c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.startsWith"></a>startsWith</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>startsWith: function(</td><td class=PParameter nowrap>str,</td></tr><tr><td></td><td class=PParameter nowrap>sub</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockq [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.contains"></a>contains</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>contains: function(</td><td class=PParameter nowrap>str,</td></tr><tr><td></td><td class=PParameter nowrap>sub</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.trim"></a>trim</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>trim: function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Removes leading and trailing whitespace characters from a string. [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.camelize"></a>camelize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>camelize: function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Camel-case a hyphenated string.  Ex.  &ldqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.format"></a>format</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>format: function(</td><td class=PParameter nowrap>template,</td></tr><tr><td></td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>args</td><td class=PAfterParameters [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.OpenLayers.String.isNumeric"></a>OpenLayers.<span class=HB> </span>String.<span class=HB> </span>isNumeric</h3><div class=CBody><p>Determine whether a string contains only a numeric value.</p><h4 class=CHeading>Examples</h4><blockquote><pre>OpenLayers.String.isNumeric("6.02e23") // true
+OpenLayers.String.isNumeric("12 dozen") // false
+OpenLayers.String.isNumeric("4") // true
+OpenLayers.String.isNumeric(" 4 ") // false</pre></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} String contains only a number.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.numericIf"></a>numericIf</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>numericIf: function(</td><td class=PParameter nowrap>value</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Converts a string that appears to be a numeric v [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.String.startsWith"></a>String.<span class=HB> </span>startsWith</h3><div class=CBody><p><b>Deprecated</b>.  Whether or not a string starts with another string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>sStart</td><td class=CDLDescription>{Sring} The string we’re testing for.</td></tr></table><h4 class=CHeading [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.String.contains"></a>String.<span class=HB> </span>contains</h3><div class=CBody><p><b>Deprecated</b>.  Whether or not a string contains another string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>str</td><td class=CDLDescription>{String} The string that we’re testing for.</td></tr></table><h4 class=CHeading>Ret [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.String.trim"></a>String.trim</h3><div class=CBody><p><b>Deprecated</b>.  Removes leading and trailing whitespace characters from a string.</p><h4 class=CHeading>Returns</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{String} A trimmed version of the string</td><td class=CDLDescription>all leading and trailing spaces removed</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.String.camelize"></a>String.<span class=HB> </span>camelize</h3><div class=CBody><p><b>Deprecated</b>.  Camel-case a hyphenated string.  Ex.  “chicken-head” becomes “chickenHead”, and “-chicken-head” becomes “ChickenHead”.</p><h4 class=CHeading>Returns</h4><p>{String} The string, camelized</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Number"></a>OpenLayers.<span class=HB> </span>Number</h2><div class=CBody><p>Contains convenience functions for manipulating numbers.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Number.Functions" >Functions</a></td><td class=SDescription></td></tr><tr  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.limitSigDigs"></a>limitSigDigs</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>limitSigDigs: function(</td><td class=PParameter nowrap>num,</td></tr><tr><td></td><td class=PParameter nowrap>sig</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.format"></a>format</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>format: function(</td><td class=PParameter nowrap>num,</td></tr><tr><td></td><td class=PParameter nowrap>dec,</td></tr><tr><td></td><td class=PParameter nowrap>tsep,</td></tr><tr><td></td><td class=PParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.Number.limitSigDigs"></a>Number.<span class=HB> </span>limitSigDigs</h3><div class=CBody><p><b>Deprecated</b>.  Limit the number of significant digits on an integer.  Does <b>not</b> work with floats!</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>sig</td><td class=CDLDescription>{Integer}</td></tr></table><h4 class [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Function"></a>OpenLayers.<span class=HB> </span>Function</h2><div class=CBody><p>Contains convenience functions for function manipulation.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Function.Functions" >Functions</a></td><td class=SDescription></td></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.bind"></a>bind</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Bind [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.bindAsEventListener"></a>bindAsEventListener</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bindAsEventListener: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.False"></a>False</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>False : function()</td></tr></table></blockquote><p>A simple function to that just does “return false”.  We use this to avoid attaching anonymous functions to DOM event handlers, which causes “issues” on IE<8.</p><h4 class=CHeading>Usage</h4><p>document.o [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.True"></a>True</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>True : function()</td></tr></table></blockquote><p>A simple function to that just does “return true”.  We use this to avoid attaching anonymous functions to DOM event handlers, which causes “issues” on IE<8.</p><h4 class=CHeading>Usage</h4><p>document.oncli [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.Function.bind"></a>Function.bind</h3><div class=CBody><p><b>Deprecated</b>.  Bind a function to an object.  Method to easily create closures with ‘this’ altered.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} the this parameter</td></tr></table><h4 class=CHe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.Function.bindAsEventListener"></a>Function.<span class=HB> </span>bindAsEventListener</h3><div class=CBody><p><b>Deprecated</b>.  Bind a function to an object, and configure it to receive the event object as first parameter when called.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription> [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Array"></a>OpenLayers.<span class=HB> </span>Array</h2><div class=CBody><p>Contains convenience functions for array manipulation.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Array.Functions" >Functions</a></td><td class=SDescription></td></tr><tr class [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Array.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Array.filter"></a>filter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>filter: function(</td><td class=PParameter nowrap>array,</td></tr><tr><td></td><td class=PParameter nowrap>callback,</td></tr><tr><td></td><td class=PParameter nowrap>caller</td><td class=PAfterParameters  [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Date"></a>OpenLayers.Date</h2><div class=CBody><p>Contains implementations of Date.parse and date.toISOString that match the ECMAScript 5 specification for parsing RFC 3339 dates.  <a href="http://tools.ietf.org/html/rfc3339" class=LURL target=_top>http://tools.ietf.org/html/rfc3339</a></p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Date.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Date.toISOString"></a>toISOString</h3><div class=CBody><p>Generates a string representing a date.   The format of the string follows the profile of ISO 8601 for date and time on the Internet <img mode="link" target="
url target=”http://tools.ietf.org/html/rfc3339” name=”http://tools.ietf.org/html/rfc3339”>” original=”(see <url target=”http://tools.ietf.org/html/rfc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Date.parse"></a>parse</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parse: function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Generate a date object from a string.   The format for the  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>startsWith: function(</td><td class=PParameter nowrap>str,</td></tr><tr><td></td><td class=PParameter nowrap>sub</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Test whether a string starts with another string.</div></div><div class=CToolT [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/BaseTypes/Bounds-js.html b/doc/apidocs/files/OpenLayers/BaseTypes/Bounds-js.html
new file mode 100644
index 0000000..7d0e533
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/BaseTypes/Bounds-js.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Bounds - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Bounds"></a>OpenLayers.<span class=HB> </span>Bounds</h1><div class=CBody><p>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.</p><h4 class=CHeading>Possible use case</h4><blockquote><pre>bounds = new OpenLayer [...]
+bounds.extend(new OpenLayers.LonLat(4,5));
+bounds.extend(new OpenLayers.LonLat(5,6));
+bounds.toBBOX(); // returns 4,5,5,6</pre></blockquote><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Bounds" >OpenLayers.<span class=HB> </span>Bounds</a></td><td class=SDescription>Instances of this class represent bounding boxes. </td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#OpenLayers.Bounds.Constructor" >Const [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.OpenLayers.Bounds"></a>OpenLayers.<span class=HB> </span>Bounds</h3><div class=CBody><p>Construct a new bounds object.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>left</td><td class=CDLDescription>{Number} The left bounds of the box.   Note that for width calculations, this is assumed to be less than the right valu [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.toString"></a>toString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String representation of bounds object.  (ex.<i>”left-bottom=(5,42) right-top=(10,45)”</i>)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.toArray"></a>toArray</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toArray: function(</td><td class=PParameter nowrap>reverseAxisOrder</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table borde [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.toBBOX"></a>toBBOX</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toBBOX:function(</td><td class=PParameter nowrap>decimal,</td></tr><tr><td></td><td class=PParameter nowrap>reverseAxisOrder</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.toGeometry"></a>toGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toGeometry: function()</td></tr></table></blockquote><p>Create a new polygon geometry based on this bounds.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Geometry/Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id=link26 onMouseOver="ShowTip(event, 'tt26', 'link26' [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getWidth"></a>getWidth</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWidth:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The width of the bounds</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getHeight"></a>getHeight</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getHeight:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The height of the bounds (top minus bottom).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getSize"></a>getSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getSize:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="Size-js.html#OpenLayers.Size" class=LClass id=link27 onMouseOver="ShowTip(event, 'tt8', 'link27')" onMouseOut="HideTip('tt8')">OpenLayers.Size</a>} The size of the box.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getCenterPixel"></a>getCenterPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCenterPixel:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="Pixel-js.html#OpenLayers.Pixel" class=LClass id=link28 onMouseOver="ShowTip(event, 'tt10', 'link28')" onMouseOut="HideTip('tt10')">OpenLayers.Pixel</a>} The center of the  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getCenterLonLat"></a>getCenterLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCenterLonLat:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="LonLat-js.html#OpenLayers.LonLat" class=LClass id=link29 onMouseOver="ShowTip(event, 'tt12', 'link29')" onMouseOut="HideTip('tt12')">OpenLayers.LonLat</a>} The center o [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.add"></a>add</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>add:function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Pa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.extend"></a>extend</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extend:function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Extend the bounds to include the point, lonlat, or bounds [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.containsLonLat"></a>containsLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>containsLonLat:function(</td><td class=PParameter nowrap>ll,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.containsPixel"></a>containsPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>containsPixel:function(</td><td class=PParameter nowrap>px,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.contains"></a>contains</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>contains:function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td><td class=PAfterParameters no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.intersectsBounds"></a>intersectsBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersectsBounds:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td><td class=PAfterParameters nowrap>)</td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.containsBounds"></a>containsBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>containsBounds:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>partial,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.determineQuadrant"></a>determineQuadrant</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>determineQuadrant: function(</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>wrapDateLine: function(</td><td class=PParameter nowrap>maxExtent,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.fromString"></a>fromString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Bounds.fromString = function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Alternative constructor that [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.fromArray"></a>fromArray</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Bounds.fromArray = function(</td><td class=PParameter nowrap>bbox</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Alternative constructor that b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.fromSize"></a>fromSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Bounds.fromSize = function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Alternative constructor that buil [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote>{String} String representation of bounds object. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toArray: function(</td><td class=PPara [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/BaseTypes/Class-js.html b/doc/apidocs/files/OpenLayers/BaseTypes/Class-js.html
new file mode 100644
index 0000000..12a733b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/BaseTypes/Class-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Class.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="Class.js"></a>Class.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#Class.js" >Class.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Constructor" >Constructor</a></td><td class=SDescriptio [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Class"></a>OpenLayers.<span class=HB> </span>Class</h3><div class=CBody><p>Base class used to construct all other classes.  Includes support for multiple inheritance.</p><p>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.</p><h4 class=CHeading>To create a new OpenLayers-style class, use the following sy [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.create"></a>OpenLayers.<span class=HB> </span>create</h3><div class=CBody><p><b>Deprecated</b>.   Old method to create an OpenLayers style class.   Use the <a href="#OpenLayers.Class" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Class</a> constructor instead.</p><h4 class=CHeading>Returns</h4><p>An OpenLayers class</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="inherit"></a>inherit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Class.inherit = function ()</td></tr></table></blockquote><p><b>Deprecated</b>.   Old method to inherit from one or more OpenLayers style classes.   Use the <a href="#OpenLayers.Class" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt2', 'link3')" onMouseOut="HideTip('tt2 [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Class.inherit = function ()</td></tr></table></blockquote><b>Deprecated</b>. </div></div><div class=CToolTip id="tt2"><div class=CConstructor>Base class used to construct all other classes. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/BaseTypes/Element-js.html b/doc/apidocs/files/OpenLayers/BaseTypes/Element-js.html
new file mode 100644
index 0000000..98efde2
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/BaseTypes/Element-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Element - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Element"></a>OpenLayers.<span class=HB> </span>Element</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Element" >OpenLayers.<span class=HB> </span>Element</a></td><td class=SDescription></td></tr><tr class="SGr [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.visible"></a>visible</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>visible: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cell [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.toggle"></a>toggle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toggle: function()</td></tr></table></blockquote><p>Toggle the visibility of element(s) passed in</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement} Actually us [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.hide"></a>hide</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>hide: function()</td></tr></table></blockquote><p>Hide element(s) passed in</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement} Actually user can pass any number of  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.show"></a>show</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote><p>Show element(s) passed in</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement} Actually user can pass any number of  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.remove"></a>remove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>remove: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove the specified element from the DOM.</p><h4 clas [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.getHeight"></a>getHeight</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getHeight: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.getDimensions"></a>getDimensions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getDimensions: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p><b>Deprecated</b>.  Returns  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.getStyle"></a>getStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getStyle: function(</td><td class=PParameter nowrap>element,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>visible: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototyp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/BaseTypes/LonLat-js.html b/doc/apidocs/files/OpenLayers/BaseTypes/LonLat-js.html
new file mode 100644
index 0000000..b85ebc5
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/BaseTypes/LonLat-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.LonLat - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.LonLat"></a>OpenLayers.<span class=HB> </span>LonLat</h1><div class=CBody><p>This class represents a longitude and latitude pair</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.LonLat" >OpenLayers.<span class=HB> </span>LonLat</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.lon"></a>lon</h3><div class=CBody><p>{Float} The x-axis coodinate in map units</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.lat"></a>lat</h3><div class=CBody><p>{Float} The y-axis coordinate in map units</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.OpenLayers.LonLat"></a>OpenLayers.<span class=HB> </span>LonLat</h3><div class=CBody><p>Create a new map location.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>lon</td><td class=CDLDescription>{Number} The x-axis coordinate in map units.   If your map is in a geographic projection, this will be the Longitude.   [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.toShortString"></a>toShortString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toShortString:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} Shortened String representation of OpenLayers.LonLat object.  (ex.  <i>”5, 42”</i>)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.LonLat.OpenLayers.LonLat" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt3', 'link8')" onMouseOut="HideTip('tt3')">OpenLayers.LonLat</a>} New OpenLayers.LonLat object with th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.add"></a>add</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>add:function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>ll</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>wrapDateLine: function(</td><td class=PParameter nowrap>maxExtent</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><tab [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toShortString:function()</td></tr></table></blockquote>{String} Shortened String representation of OpenLayers.LonLat object. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote>{OpenLayers.LonLat} New OpenLayers.LonLat object [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/BaseTypes/Pixel-js.html b/doc/apidocs/files/OpenLayers/BaseTypes/Pixel-js.html
new file mode 100644
index 0000000..2b05155
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/BaseTypes/Pixel-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Pixel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Pixel"></a>OpenLayers.<span class=HB> </span>Pixel</h1><div class=CBody><p>This class represents a screen coordinate, in x and y coordinates</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Pixel" >OpenLayers.<span class=HB> </sp [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.x"></a>x</h3><div class=CBody><p>{Number} The x coordinate</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.y"></a>y</h3><div class=CBody><p>{Number} The y coordinate</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.OpenLayers.Pixel"></a>OpenLayers.<span class=HB> </span>Pixel</h3><div class=CBody><p>Create a new OpenLayers.Pixel instance</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>x</td><td class=CDLDescription>{Number} The x coordinate</td></tr><tr><td class=CDLEntry>y</td><td class=CDLDescription>{Number} The y coordinate</td></t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote><p>Return a clone of this pixel object</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Pixel.OpenLayers.Pixel" class=LConstructor id=link6 onMouseOver="ShowTip(event, 'tt5', 'link6')" onMouseOut="HideTip('tt5')">OpenLayers.Pixel</a> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether one pixel is equivalent to another</p><h4 cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.add"></a>add</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>add:function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.offset"></a>offset</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>offset:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parameters px - {<a href="#OpenLayers.Pixel.OpenLayers.Pixel"  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote>Return a clone of this pixel object</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>px</td [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/BaseTypes/Size-js.html b/doc/apidocs/files/OpenLayers/BaseTypes/Size-js.html
new file mode 100644
index 0000000..2424e7e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/BaseTypes/Size-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Size - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Size"></a>OpenLayers.Size</h1><div class=CBody><p>Instances of this class represent a width/height pair</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Size" >OpenLayers.Size</a></td><td class=SDescription>Instances of this clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.w"></a>w</h3><div class=CBody><p>{Number} width</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.h"></a>h</h3><div class=CBody><p>{Number} height</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.OpenLayers.Size"></a>OpenLayers.Size</h3><div class=CBody><p>Create an instance of OpenLayers.Size</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>w</td><td class=CDLDescription>{Number} width</td></tr><tr><td class=CDLEntry>h</td><td class=CDLDescription>{Number} height</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote><p>Create a clone of this size object</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Size.OpenLayers.Size" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Size</a>} A n [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>sz</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine where this size is equal to another</p><h4 class=CHea [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote>Create a clone of this size object</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>sz</td> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Console-js.html b/doc/apidocs/files/OpenLayers/Console-js.html
new file mode 100644
index 0000000..099d9de
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Console-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Console - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Console"></a>OpenLayers.<span class=HB> </span>Console</h1><div class=CBody><p>The OpenLayers.Console namespace is used for debugging and error logging.  If the Firebug Lite (../Firebug/firebug.js) is included before this script, calls to OpenLayers.Console methods will get redirected to window.console.  This makes use of the Firebug extension where available and allows for c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.log"></a>log</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>log: function()</td></tr></table></blockquote><p>Log an object in the console.   The Firebug Lite console logs string representation of objects.   Given multiple arguments, they will be cast to strings and logged with a space delimiter.   If the first argument is a string with [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.debug"></a>debug</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>debug: function()</td></tr></table></blockquote><p>Writes a message to the console, including a hyperlink to the line where it was called.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cell [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.info"></a>info</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>info: function()</td></tr></table></blockquote><p>Writes a message to the console with the visual “info” icon and color coding and a hyperlink to the line where it was called.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeading>Pa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.warn"></a>warn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>warn: function()</td></tr></table></blockquote><p>Writes a message to the console with the visual “warning” icon and color coding and a hyperlink to the line where it was called.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeading [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.error"></a>error</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>error: function()</td></tr></table></blockquote><p>Writes a message to the console with the visual “error” icon and color coding and a hyperlink to the line where it was called.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.userError"></a>userError</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>userError: function(</td><td class=PParameter nowrap>error</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>A single interface for showing error messages t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.assert"></a>assert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>assert: function()</td></tr></table></blockquote><p>Tests that an expression is true.  If not, it will write a message to the console and throw an exception.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeading>Parameters</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.dir"></a>dir</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>dir: function()</td></tr></table></blockquote><p>Prints an interactive listing of all properties of the object.  This looks identical to the view that you would see in the DOM tab.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.dirxml"></a>dirxml</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>dirxml: function()</td></tr></table></blockquote><p>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.</p><h4 class=CHeading>Parameters</h4><tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.trace"></a>trace</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trace: function()</td></tr></table></blockquote><p>Prints an interactive stack trace of JavaScript execution at the point where it is called.   The stack trace details the functions on the stack, as well as the values that were passed as arguments to each function.  You can cli [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.group"></a>group</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>group: function()</td></tr></table></blockquote><p>Writes a message to the console and opens a nested block to indent all future messages sent to the console.  Call OpenLayers.Console.groupEnd() to close the block.</p><p>May be called with multiple arguments as with OpenLayers.Conso [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.groupEnd"></a>groupEnd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>groupEnd: function()</td></tr></table></blockquote><p>Closes the most recently opened block created by a call to OpenLayers.Console.group</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.time"></a>time</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>time: function()</td></tr></table></blockquote><p>Creates a new timer under the given name.  Call OpenLayers.Console.timeEnd(name) with the same name to stop the timer and print the time elapsed.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CD [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.timeEnd"></a>timeEnd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>timeEnd: function()</td></tr></table></blockquote><p>Stops a timer created by a call to OpenLayers.Console.time(name) and writes the time elapsed.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.profile"></a>profile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>profile: function()</td></tr></table></blockquote><p>Turns on the JavaScript profiler.  The optional argument title would contain the text to be printed in the header of the profile report.</p><p>This function is not currently implemented in Firebug Lite.</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.profileEnd"></a>profileEnd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>profileEnd: function()</td></tr></table></blockquote><p>Turns off the JavaScript profiler and prints its report.</p><p>This function is not currently implemented in Firebug Lite.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.count"></a>count</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>count: function()</td></tr></table></blockquote><p>Writes the number of times that the line of code where count was called was executed.  The optional argument title will print a message in addition to the number of the count.</p><p>This function is not currently implemented in Fire [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>log: function()</td></tr></table></blockquote>Log an object in the console. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>debug: function()</td></tr></table></blockquote>Writes a message to the console, including a hyperlink to the line where it was called.</div></d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control-js.html b/doc/apidocs/files/OpenLayers/Control-js.html
new file mode 100644
index 0000000..b17f12a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control"></a>OpenLayers.<span class=HB> </span>Control</h1><div class=CBody><p>Controls affect the display or behavior of the map.  They allow everything 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 param [...]
+
+map.addControl(new OpenLayers.Control.PanZoomBar());
+map.addControl(new OpenLayers.Control.MouseToolbar());
+map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));
+map.addControl(new OpenLayers.Control.Permalink());
+map.addControl(new OpenLayers.Control.Permalink('permalink'));
+map.addControl(new OpenLayers.Control.MousePosition());
+map.addControl(new OpenLayers.Control.OverviewMap());
+map.addControl(new OpenLayers.Control.KeyboardDefaults());</pre></blockquote><p>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 example:</p><blockquote><pre>var control = new OpenLayers.Control();
+OpenLayers.Util.extend(control, {
+    draw: function () {
+        // this Handler.Box will intercept the shift-mousedown
+        // before Control.MouseDefault gets to see it
+        this.box = new OpenLayers.Handler.Box( control,
+            {"done": this.notice},
+            {keyMask: OpenLayers.Handler.MOD_SHIFT});
+        this.box.activate();
+    },
+
+    notice: function (bounds) {
+        OpenLayers.Console.userError(bounds);
+    }
+});
+map.addControl(control);</pre></blockquote><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Control" >OpenLayers.<span class=HB> </span>Control</a></td><td class=SDescription>Controls affect the display or behavior of the map. </td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#OpenLayers.Control.Properties" >Properties</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.eventListeners"></a>eventListeners</h3><div class=CBody><p>{Object} If set as an option at construction, the eventListeners object will be registered with <a href="Events-js.html#OpenLayers.Events.on" class=LFunction id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')">OpenLayers.Events.on</a>.   Object structure must be a listeners object as shown in the example for th [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.</p><h4 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OpenLayers.Control"></a>OpenLayers.<span class=HB> </span>Control</h3><div class=CBody><p>Create an OpenLayers Control.   The options passed as a parameter directly extend the control.   For example passing the following:</p><blockquote><pre>var control = new OpenLayers.Control({div: myDiv});</pre></blockquote><p>Overrides the default div attribute value of null.</p><h4 class=CHeading>Param [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OpenLayers.Control.TYPE_BUTTON"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TYPE_BUTTON</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OpenLayers.Control.TYPE_TOGGLE"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TYPE_TOGGLE</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OpenLayers.Control.TYPE_TOOL"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TYPE_TOOL</h3></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>on: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Convenience method for registering listeners with a common scope. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/ArgParser-js.html b/doc/apidocs/files/OpenLayers/Control/ArgParser-js.html
new file mode 100644
index 0000000..15237ff
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/ArgParser-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ArgParser - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ArgParser"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ArgParser</h1><div class=CBody><p>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.</p><h4 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.displayProjection"></a>displayProjection</h3><div class=CBody><p>{<a href="../Projection-js.html#OpenLayers.Projection" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} Requires proj4js support.  Projection used when reading the coordinates from the URL.  This will</p><p>reproject the map coordinates from the UR [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.OpenLayers.Control.ArgParser"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ArgParser</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Attribution-js.html b/doc/apidocs/files/OpenLayers/Control/Attribution-js.html
new file mode 100644
index 0000000..d3d9011
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Attribution-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Attribution - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Attribution"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Attribution</h1><div class=CBody><p>The attribution control adds attribution from layers to the map display.  It uses ‘attribution’ property of each layer.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link1 onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.seperator"></a>seperator</h3><div class=CBody><p>{String} String used to seperate layers.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.OpenLayers.Control.Attribution"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Attribution</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Options for control.</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Button-js.html b/doc/apidocs/files/OpenLayers/Control/Button-js.html
new file mode 100644
index 0000000..4202427
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Button-js.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Button - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Button"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Button</h1><div class=CBody><p>The Button control is a very simple push-button, for use with <a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Control.Panel</a>.  When clicked, the function tri [...]
+    displayClass: "MyButton", trigger: myFunction
+});
+panel.addControls([button]);</pre></blockquote><p>Will create a button with CSS class MyButtonItemInactive, that will call the function MyFunction() when clicked.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/DragFeature-js.html b/doc/apidocs/files/OpenLayers/Control/DragFeature-js.html
new file mode 100644
index 0000000..64130ce
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/DragFeature-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.DragFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.DragFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DragFeature</h1><div class=CBody><p>The DragFeature control moves a feature with a drag of the mouse.  Create a new control with the <a href="#OpenLayers.Control.DragFeature.OpenLayers.Control.DragFeature" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="Hi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Array(String)} To restrict dragging to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.onStart"></a>onStart</h3><div class=CBody><p>{Function} Define this function if you want to know when a drag starts.  The function should expect to receive two arguments: the feature that is about to be dragged and the pixel location of the mouse.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>feature</td><t [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.onDrag"></a>onDrag</h3><div class=CBody><p>{Function} Define this function if you want to know about each move of a feature.  The function should expect to receive two arguments: the feature that is being dragged and the pixel location of the mouse.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>feature</td> [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.onComplete"></a>onComplete</h3><div class=CBody><p>{Function} Define this function if you want to know when a feature is done dragging.  The function should expect to receive two arguments: the feature that is being dragged and the pixel location of the mouse.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>f [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.documentDrag"></a>documentDrag</h3><div class=CBody><p>{Boolean} If set to true, mouse dragging will continue even if the mouse cursor leaves the map viewport.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.OpenLayers.Control.DragFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DragFeature</h3><div class=CBody><p>Create a new control to drag features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Ve [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Take care of things that are not handled in superclass</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control and the feature handler.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Successfully activated the control and feature handler.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control and all handlers.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Successfully deactivated the control.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Take care of things that are not handled in superclass</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the control and the feature handler.</div></div><div cla [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/DragPan-js.html b/doc/apidocs/files/OpenLayers/Control/DragPan-js.html
new file mode 100644
index 0000000..f7521bc
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/DragPan-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.DragPan - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.DragPan"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DragPan</h1><div class=CBody><p>The DragPan control pans the map with a drag of the mouse.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Control</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.documentDrag"></a>documentDrag</h3><div class=CBody><p>{Boolean} If set to true, mouse dragging will continue even if the mouse cursor leaves the map viewport.  Default is false.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/DrawFeature-js.html b/doc/apidocs/files/OpenLayers/Control/DrawFeature-js.html
new file mode 100644
index 0000000..8ff9ed5
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/DrawFeature-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.DrawFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.DrawFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DrawFeature</h1><div class=CBody><p>The DrawFeature control draws point, line or polygon features on a vector layer when active.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMous [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>featureadded</td><td class=CDLDescription>Triggered when a feature is added</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.multi"></a>multi</h3><div class=CBody><p>{Boolean} Cast features to multi-part geometries before passing to the layer.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.featureAdded"></a>featureAdded</h3><div class=CBody><p>{Function} Called after each feature is added</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Used to set non-default properties on the control’s handler</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.OpenLayers.Control.DrawFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DrawFeature</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link2 onMouseOver="Show [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt3"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/EditingToolbar-js.html b/doc/apidocs/files/OpenLayers/Control/EditingToolbar-js.html
new file mode 100644
index 0000000..4c9dbdd
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/EditingToolbar-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.EditingToolbar - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.EditingToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>EditingToolbar</h1><div class=CBody><p>The EditingToolbar is a panel of 4 controls to draw polygons, lines, points, or to navigate the map by panning.  By default it appears in the upper right corner of the map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Panel-js.html#OpenLay [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.EditingToolbar.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.EditingToolbar.OpenLayers.Control.EditingToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>EditingToolbar</h3><div class=CBody><p>Create an editing toolbar for a given layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#Open [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/GetFeature-js.html b/doc/apidocs/files/OpenLayers/Control/GetFeature-js.html
new file mode 100644
index 0000000..43e4afc
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/GetFeature-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.GetFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.GetFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>GetFeature</h1><div class=CBody><p>Gets vector features for locations underneath the mouse cursor.  Can be configured to act on click, hover or dragged boxes.  Uses an <a href="../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.protocol"></a>protocol</h3><div class=CBody><p>{<a href="../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Protocol</a>} Required.  The protocol used for fetching features.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.multipleKey"></a>multipleKey</h3><div class=CBody><p>{String} An event modifier (‘altKey’ or ‘shiftKey’) that temporarily sets the <a href="#OpenLayers.Control.GetFeature.multiple" class=LProperty id=link8 onMouseOver="ShowTip(event, 'tt2', 'link8')" onMouseOut="HideTip('tt2')">multiple</a> property to true.   Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.toggleKey"></a>toggleKey</h3><div class=CBody><p>{String} An event modifier (‘altKey’ or ‘shiftKey’) that temporarily sets the <a href="#OpenLayers.Control.GetFeature.toggle" class=LProperty id=link9 onMouseOver="ShowTip(event, 'tt3', 'link9')" onMouseOut="HideTip('tt3')">toggle</a> property to true.   Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.multiple"></a>multiple</h3><div class=CBody><p>{Boolean} Allow selection of multiple geometries.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.click"></a>click</h3><div class=CBody><p>{Boolean} Use a click handler for selecting/unselecting features.  If both <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link10 onMouseOver="ShowTip(event, 'tt6', 'link10')" onMouseOut="HideTip('tt6')">click</a> and <a href="#OpenLayers.Control.GetFeature.box" class=LProperty id=link11 onMouseOver="ShowTip(event, 'tt7', 'link11 [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.single"></a>single</h3><div class=CBody><p>{Boolean} Tells whether select by click should select a single feature.  If set to false, all matching features are selected.  If set to true, only the best matching feature is selected.  This option has an effect only of the <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link12 onMouseOver="ShowTip(event, 'tt6', 'li [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.clickout"></a>clickout</h3><div class=CBody><p>{Boolean} Unselect features when clicking outside any feature.  Applies only if <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link13 onMouseOver="ShowTip(event, 'tt6', 'link13')" onMouseOut="HideTip('tt6')">click</a> is true.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.toggle"></a>toggle</h3><div class=CBody><p>{Boolean} Unselect a selected feature on click.   Applies only if <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link14 onMouseOver="ShowTip(event, 'tt6', 'link14')" onMouseOut="HideTip('tt6')">click</a> is true.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.clickTolerance"></a>clickTolerance</h3><div class=CBody><p>{Integer} Tolerance for the filter query in pixels.  This has the same effect as the tolerance parameter on WMS GetFeatureInfo requests.   Will be ignored for box selections.   Applies only if <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link15 onMouseOver="ShowTip(event, 'tt6', 'link15')" onMouseOu [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.hover"></a>hover</h3><div class=CBody><p>{Boolean} Send feature requests on mouse moves.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.box"></a>box</h3><div class=CBody><p>{Boolean} Allow feature selection by drawing a box.  If set to true set <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link17 onMouseOver="ShowTip(event, 'tt6', 'link17')" onMouseOut="HideTip('tt6')">click</a> to false to disable the click handler and rely on the box handler only, even for “zero extent” boxes.  See  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.maxFeatures"></a>maxFeatures</h3><div class=CBody><p>{Integer} Maximum number of features to return from a query in single mode if supported by the <a href="#OpenLayers.Control.GetFeature.protocol" class=LProperty id=link19 onMouseOver="ShowTip(event, 'tt4', 'link19')" onMouseOut="HideTip('tt4')">protocol</a>.  This set of features is then used to determine the best match client-side.&nb [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Additional options for the handlers used by this control.  This is a hash with the keys “click”, “box” and “hover”.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>beforefeatureselected</td><td class=CDLDescription>Triggered when <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link20 onMouseOver="ShowTip(event, 'tt6', 'link20')" onMouseOut="HideTip('tt6' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.OpenLayers.Control.GetFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>GetFeature</h3><div class=CBody><p>Create a new control for fetching remote features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} A configuration object which at l [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract vector layer protocol class. </div></div><div class=CToolTip id="tt2"><div class=CProperty>{Boolean} Allow selection of multiple geometries. </div></div><div class=CToolTip id="tt3"><div class=CProperty>{Boolean} Unselect a selected feature on click. </div></div><div class=CToolTip id="tt4"><div class=CProperty>{OpenLayers.Protocol} Required. </div></div><div class=CToolTip id="tt5"><div class=CClass>Controls affect the display or b [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Graticule-js.html b/doc/apidocs/files/OpenLayers/Control/Graticule-js.html
new file mode 100644
index 0000000..2dc80c4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Graticule-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Graticule - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Graticule"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Graticule</h1><div class=CBody><p>The Graticule displays a grid of latitude/longitude lines reprojected on the map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip(' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.  Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.intervals"></a>intervals</h3><div class=CBody><p>{Array(Float)} A list of possible graticule widths in degrees.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.displayInLayerSwitcher"></a>displayInLayerSwitcher</h3><div class=CBody><p>{Boolean} Allows the Graticule control to be switched on and off by LayerSwitcher control.  Defaults is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.visible"></a>visible</h3><div class=CBody><p>{Boolean} should the graticule be initially visible (default=true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.numPoints"></a>numPoints</h3><div class=CBody><p>{Integer} The number of points to use in each graticule line.   Higher numbers result in a smoother curve for projected maps</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.targetSize"></a>targetSize</h3><div class=CBody><p>{Integer} The maximum size of the grid in pixels on the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.layerName"></a>layerName</h3><div class=CBody><p>{String} The name to be displayed in the layer switcher, default is set by {<a href="../Lang-js.html#OpenLayers.Lang" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Lang</a>}.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.labelled"></a>labelled</h3><div class=CBody><p>{Boolean} Should the graticule lines be labelled?. default=true</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.labelFormat"></a>labelFormat</h3><div class=CBody><p>{String} the format of the labels, default = ‘dm’.  See <OpenLayers.Util.getFormattedLonLat> for other options.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.lineSymbolizer"></a>lineSymbolizer</h3><div class=CBody><p>{symbolizer} the symbolizer used to render lines</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.labelSymbolizer"></a>labelSymbolizer</h3><div class=CBody><p>{symbolizer} the symbolizer used to render labels</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.OpenLayers.Control.Graticule"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Graticule</h3><div class=CBody><p>Create a new graticule control to display a grid of latitude longitude lines.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An option [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Internationalization namespace. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div><div class=CTool [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/KeyboardDefaults-js.html b/doc/apidocs/files/OpenLayers/Control/KeyboardDefaults-js.html
new file mode 100644
index 0000000..1569828
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/KeyboardDefaults-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.KeyboardDefaults - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>KeyboardDefaults</h1><div class=CBody><p>The KeyboardDefaults control adds panning and zooming functions, controlled with the keyboard.  By default arrow keys pan, +/- keys zoom & Page Up/Page Down/Home/End scroll by three quarters of a page.</p><p>This control has no visible appeara [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.slideFactor"></a>slideFactor</h3><div class=CBody><p>Pixels to slide by.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.OpenLayers.Control.KeyboardDefaults"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>KeyboardDefaults</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/LayerSwitcher-js.html b/doc/apidocs/files/OpenLayers/Control/LayerSwitcher-js.html
new file mode 100644
index 0000000..b97a689
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/LayerSwitcher-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.LayerSwitcher - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.LayerSwitcher"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>LayerSwitcher</h1><div class=CBody><p>The LayerSwitcher control displays a table of contents for the map.  This allows the user interface to switch between BaseLasyers and to show or hide Overlays.  By default the switcher is shown minimized on the right edge of the map, the user may e [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.roundedCorner"></a>roundedCorner</h3><div class=CBody><p>{Boolean} If true the Rico library is used for rounding the corners of the layer switcher div, defaults to true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.roundedCornerColor"></a>roundedCornerColor</h3><div class=CBody><p>{String} The color of the rounded corners, only applies if roundedCorner is true, defaults to “darkblue”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.ascending"></a>ascending</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.OpenLayers.Control.LayerSwitcher"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>LayerSwitcher</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Measure-js.html b/doc/apidocs/files/OpenLayers/Control/Measure-js.html
new file mode 100644
index 0000000..61a687f
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Measure-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Measure - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Measure"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Measure</h1><div class=CBody><p>Allows for drawing of features for measurements.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Control</a></li></u [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Used to set non-default properties on the control’s handler</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.persist"></a>persist</h3><div class=CBody><p>{Boolean} Keep the temporary measurement sketch drawn after the measurement is complete.   The geometry will persist until a new measurement is started, the control is deactivated, or <a href="#OpenLayers.Control.Measure.cancel" class=LFunction id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">cancel</a> is called. [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.OpenLayers.Control.Measure"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Measure</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>handler</td><td class=CDLDescription>{<a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt3', 'l [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.cancel"></a>cancel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote><p>Stop the control from measuring.   If <a href="#OpenLayers.Control.Measure.persist" class=LProperty id=link6 onMouseOver="ShowTip(event, 'tt4', 'link6')" onMouseOut="HideTip('tt4')">persist</a> is true, the temporary sket [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote>Stop the control from measuring. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt3"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt4">< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/ModifyFeature-js.html b/doc/apidocs/files/OpenLayers/Control/ModifyFeature-js.html
new file mode 100644
index 0000000..6d897b9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/ModifyFeature-js.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ModifyFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ModifyFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ModifyFeature</h1><div class=CBody><p>Control to modify features.   When activated, a click renders the vertices of a feature - these vertices can then be dragged.   By default, the delete key will delete the vertex under the mouse.   New features are added by dragging “virt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Array(String)} To restrict modification to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.clickout"></a>clickout</h3><div class=CBody><p>{Boolean} Unselect features when clicking outside any feature.  Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.toggle"></a>toggle</h3><div class=CBody><p>{Boolean} Unselect a selected feature on click.  Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.standalone"></a>standalone</h3><div class=CBody><p>{Boolean} Set to true to create a control without SelectFeature capabilities.  Default is false.   If standalone is true, to modify a feature, call the <selectFeature> method with the target feature.  Note that you must call the <unselectFeature> method to finish feature modification in standalone mode (before st [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.deleteCodes"></a>deleteCodes</h3><div class=CBody><p>{Array(Integer)} Keycodes for deleting verticies.   Set to null to disable vertex deltion by keypress.   If non-null, keypresses with codes in this array will delete vertices under the mouse.  Default is 46 and 68, the ‘delete’ and lowercase ‘d’ keys.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.virtualStyle"></a>virtualStyle</h3><div class=CBody><p>{Object} A symbolizer to be used for virtual vertices.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.mode"></a>mode</h3><div class=CBody><p>{Integer} Bitfields specifying the modification mode.  Defaults to OpenLayers.Control.ModifyFeature.RESHAPE.  To set the mode to a combination of options, use the | operator.  For example, to allow the control to both resize and rotate features, use the following syntax</p><blockquote><pre>control.mode = OpenLayers.Control.ModifyFeature [...]
+               OpenLayers.Control.ModifyFeature.ROTATE;</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.onModificationStart"></a>onModificationStart</h3><div class=CBody><p>{Function} <b>Deprecated</b>.   Register for “beforefeaturemodified” instead.  The “beforefeaturemodified” event is triggered on the layer before any modification begins.</p><p>Optional function to be called when a feature is selected to be modified.  The function should expect to be [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.onModification"></a>onModification</h3><div class=CBody><p>{Function} <b>Deprecated</b>.   Register for “featuremodified” instead.  The “featuremodified” event is triggered on the layer with each feature modification.</p><p>Optional function to be called when a feature has been modified.   The function should expect to be called with a feature.</p></d [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.onModificationEnd"></a>onModificationEnd</h3><div class=CBody><p>{Function} <b>Deprecated</b>.   Register for “afterfeaturemodified” instead.  The “afterfeaturemodified” event is triggered on the layer after a feature has been modified.</p><p>Optional function to be called when a feature is finished being modified.   The function should expect to be c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.OpenLayers.Control.ModifyFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ModifyFeature</h3><div class=CBody><p>Create a new modify feature control.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#OpenLayers.Laye [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Take care of things that are not handled in superclass.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Successfully activated the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Successfully deactivated the control.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.RESHAPE"></a>RESHAPE</h3><div class=CBody><p>{Integer} Constant used to make the control work in reshape mode</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.RESIZE"></a>RESIZE</h3><div class=CBody><p>{Integer} Constant used to make the control work in resize mode</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.ROTATE"></a>ROTATE</h3><div class=CBody><p>{Integer} Constant used to make the control work in rotate mode</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.DRAG"></a>DRAG</h3><div class=CBody><p>{Integer} Constant used to make the control work in drag mode</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Take care of things that are not handled in superclass.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the control.</div></div><div class=CToolTip id="tt3"><d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/MouseDefaults-js.html b/doc/apidocs/files/OpenLayers/Control/MouseDefaults-js.html
new file mode 100644
index 0000000..3f17415
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/MouseDefaults-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.MouseDefaults - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.MouseDefaults"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseDefaults</h1><div class=CBody><p>This class is DEPRECATED in 2.4 and will be removed by 3.0.  If you need this functionality, use <a href="Navigation-js.html#OpenLayers.Control.Navigation" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">Op [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.OpenLayers.Control.MouseDefaults"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseDefaults</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CClass>The navigation control handles map browsing with mouse events (dragging, double-clicking, and scrolling the wheel). </div></div><div class=CToolTip id="tt3"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOO [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/MousePosition-js.html b/doc/apidocs/files/OpenLayers/Control/MousePosition-js.html
new file mode 100644
index 0000000..5bc3e65
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/MousePosition-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.MousePosition - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.MousePosition"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MousePosition</h1><div class=CBody><p>The MousePosition control displays geographic coordinates of the mouse pointer, as it is moved about the map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link4 onMouseOver="ShowTip(event, 't [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.prefix"></a>prefix</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.separator"></a>separator</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.suffix"></a>suffix</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.numDigits"></a>numDigits</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.granularity"></a>granularity</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.emptyString"></a>emptyString</h3><div class=CBody><p>{String} Set this to some value to set when the mouse is outside the map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.displayProjection"></a>displayProjection</h3><div class=CBody><p>{<a href="../Projection-js.html#OpenLayers.Projection" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} The projection in which the mouse position is displayed</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.OpenLayers.Control.MousePosition"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MousePosition</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Options for control.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/MouseToolbar-js.html b/doc/apidocs/files/OpenLayers/Control/MouseToolbar-js.html
new file mode 100644
index 0000000..432bbd6
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/MouseToolbar-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.MouseToolbar - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.MouseToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseToolbar</h1><div class=CBody><p>This class is DEPRECATED in 2.4 and will be removed by 3.0.  If you need this functionality, use <a href="NavToolbar-js.html#OpenLayers.Control.NavToolbar" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.direction"></a>direction</h3><div class=CBody><p>{String} ‘vertical’ or ‘horizontal’</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.OpenLayers.Control.MouseToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseToolbar</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>position</td><td class=CDLDescription>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link3 onMouseOver="Sh [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CClass>This Toolbar is an alternative to the Navigation control that displays the state of the control, and provides a UI for changing state to use the zoomBox via a Panel control.</div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/NavToolbar-js.html b/doc/apidocs/files/OpenLayers/Control/NavToolbar-js.html
new file mode 100644
index 0000000..e827bd2
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/NavToolbar-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.NavToolbar - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.NavToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavToolbar</h1><div class=CBody><p>This Toolbar is an alternative to the Navigation control that displays the state of the control, and provides a UI for changing state to use the zoomBox via a Panel control.</p><p>If you wish to change the properties of the Navigation control used in the NavToolba [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavToolbar.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavToolbar.OpenLayers.Control.NavToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavToolbar</h3><div class=CBody><p>Add our two mousedefaults controls.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The Panel control is a container for other controls. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Navigation-js.html b/doc/apidocs/files/OpenLayers/Control/Navigation-js.html
new file mode 100644
index 0000000..bad4bc0
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Navigation-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Navigation - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Navigation"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Navigation</h1><div class=CBody><p>The navigation control handles map browsing with mouse events (dragging, double-clicking, and scrolling the wheel).   Create a new navigation control with the <a href="#OpenLayers.Control.Navigation.OpenLayers.Control.Navigation" class=LConstructor id=link2 o [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.documentDrag"></a>documentDrag</h3><div class=CBody><p>{Boolean} Allow panning of the map by dragging outside map viewport.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.zoomBoxEnabled"></a>zoomBoxEnabled</h3><div class=CBody><p>{Boolean} Whether the user can draw a box to zoom</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.zoomWheelEnabled"></a>zoomWheelEnabled</h3><div class=CBody><p>{Boolean} Whether the mousewheel should zoom the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.handleRightClicks"></a>handleRightClicks</h3><div class=CBody><p>{Boolean} Whether or not to handle right clicks.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.zoomBoxKeyMask"></a>zoomBoxKeyMask</h3><div class=CBody><p>{Integer} <a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Handler</a> key code of the key, which has to be pressed, while drawing the zoom box with the mouse on the screen.  You should probably set handleRightClicks to true i [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.OpenLayers.Control.Navigation"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Navigation</h3><div class=CBody><p>Create a new navigation control</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new navigation control</div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt4"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/NavigationHistory-js.html b/doc/apidocs/files/OpenLayers/Control/NavigationHistory-js.html
new file mode 100644
index 0000000..5d25fdf
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/NavigationHistory-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.NavigationHistory - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.NavigationHistory"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavigationHistory</h1><div class=CBody><p>A navigation history control.   This is a meta-control, that creates two dependent controls: <a href="#OpenLayers.Control.NavigationHistory.previous" class=LProperty id=link10 onMouseOver="ShowTip(event, 'tt2', 'link10')" onMouseOut="HideTip('tt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.previous"></a>previous</h3><div class=CBody><p>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt1', 'link15')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>} A button type control whose trigger method restores the previous state managed by this control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.previousOptions"></a>previousOptions</h3><div class=CBody><p>{Object} Set this property on the options argument of the constructor to set optional properties on the <a href="#OpenLayers.Control.NavigationHistory.previous" class=LProperty id=link16 onMouseOver="ShowTip(event, 'tt2', 'link16')" onMouseOut="HideTip('tt2')">previous</a> control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.next"></a>next</h3><div class=CBody><p>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt1', 'link17')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>} A button type control whose trigger method restores the next state managed by this control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.nextOptions"></a>nextOptions</h3><div class=CBody><p>{Object} Set this property on the options argument of the constructor to set optional properties on the <a href="#OpenLayers.Control.NavigationHistory.next" class=LProperty id=link18 onMouseOver="ShowTip(event, 'tt3', 'link18')" onMouseOut="HideTip('tt3')">next</a> control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.limit"></a>limit</h3><div class=CBody><p>{Integer} Optional limit on the number of history items to retain.   If null, there is no limit.   Default is 50.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.OpenLayers.Control.NavigationHistory"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavigationHistory</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used to extend the contro [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.nextTrigger"></a>nextTrigger</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>nextTrigger: function()</td></tr></table></blockquote><p>Restore the next state.   If no items are in the next history stack, this has no effect.   The next history stack is populated as states are restored from the previous history stack.</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear history.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.   This registers any listeners.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Control successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.   This unregisters any listeners.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Control successfully deactivated.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CProperty>{OpenLayers.Control} A button type control whose trigger method restores the previous state managed by this control.</div></div><div class=CToolTip id="tt3"><div class=CProperty>{OpenLayers.Control} A button type control whose trigger method restores the next state managed by this control.</div></div><div class=CToolTip id="tt4"> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/OverviewMap-js.html b/doc/apidocs/files/OpenLayers/Control/OverviewMap-js.html
new file mode 100644
index 0000000..cbfcefc
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/OverviewMap-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.OverviewMap - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.OverviewMap"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>OverviewMap</h1><div class=CBody><p>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.  C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.ovmap"></a>ovmap</h3><div class=CBody><p>{<a href="../Map-js.html#OpenLayers.Map" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Map</a>} A reference to the overview map itself.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.size"></a>size</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt2', 'link8')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} The overvew map size in pixels.   Note that this is the size of the map itself - the element that contains the map (default class name olControlOverviewMapElement) may have padding  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>)} Ordered list of layers in the overview map.  If none are sent at construction, the base layer for the main map is used.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.minRectSize"></a>minRectSize</h3><div class=CBody><p>{Integer} The minimum width or height (in pixels) of the extent rectangle on the overview map.   When the extent rectangle reaches this size, it will be replaced depending on the value of the <a href="#OpenLayers.Control.OverviewMap.minRectDisplayClass" class=LProperty id=link9 onMouseOver="ShowTip(event, 'tt7', 'link9')" onMouseOut=" [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.minRectDisplayClass"></a>minRectDisplayClass</h3><div class=CBody><p>{String} Replacement style class name for the extent rectangle when <a href="#OpenLayers.Control.OverviewMap.minRectSize" class=LProperty id=link10 onMouseOver="ShowTip(event, 'tt3', 'link10')" onMouseOut="HideTip('tt3')">minRectSize</a> is reached.   This string will be suffixed on to the displayClass.   Default  [...]
+    overflow: hidden;
+    cursor: move;
+    background-image: url("img/overview_replacement.gif");
+    background-repeat: no-repeat;
+    background-position: center;
+}</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.minRatio"></a>minRatio</h3><div class=CBody><p>{Float} The ratio of the overview map resolution to the main map resolution at which to zoom farther out on the overview map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.maxRatio"></a>maxRatio</h3><div class=CBody><p>{Float} The ratio of the overview map resolution to the main map resolution at which to zoom farther in on the overview map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.mapOptions"></a>mapOptions</h3><div class=CBody><p>{Object} An object containing any non-default properties to be sent to the overview map’s map constructor.   These should include any non-default options that the main map was constructed with.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.autoPan"></a>autoPan</h3><div class=CBody><p>{Boolean} Always pan the overview map, so the extent marker remains in the center.   Default is false.   If true, when you drag the extent marker, the overview map will update itself so the marker returns to the center.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.maximized"></a>maximized</h3><div class=CBody><p>{Boolean} Start as maximized (visible).  Defaults to false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.OpenLayers.Control.OverviewMap"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>OverviewMap</h3><div class=CBody><p>Create a new overview map</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} Properties of this object will be set on the overview ma [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Deconstruct the control</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt3"><div class=CProperty>{Integer} The minimum width or height (in pixels) of the extent rectangle on the overview map. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Pan-js.html b/doc/apidocs/files/OpenLayers/Control/Pan-js.html
new file mode 100644
index 0000000..796af79
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Pan-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Pan - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Pan"></a>OpenLayers.<span class=HB> </span>Control.Pan</h1><div class=CBody><p>The Pan control is a single button to pan the map in one direction.  For a more complete control see <a href="PanPanel-js.html#OpenLayers.Control.PanPanel" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Control.PanPanel</a>.</p><h4 class [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.slideFactor"></a>slideFactor</h3><div class=CBody><p>{Integer} Number of pixels by which we’ll pan the map in any direction on clicking the arrow buttons, defaults to 50.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.OpenLayers.Control.Pan"></a>OpenLayers.<span class=HB> </span>Control.Pan</h3><div class=CBody><p>Control which handles the panning (in any of the cardinal directions) of the map by a set px distance.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>direction</td><td class=CDLDescription>{String} The direction this butt [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The PanPanel is visible control for panning the map North, South, East or West in small steps. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/PanPanel-js.html b/doc/apidocs/files/OpenLayers/Control/PanPanel-js.html
new file mode 100644
index 0000000..8a36b51
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/PanPanel-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.PanPanel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.PanPanel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanPanel</h1><div class=CBody><p>The PanPanel is visible control for panning the map North, South, East or West in small steps.  By default it is drawn in the top left corner of the map.</p><h4 class=CHeading>Note</h4><p>If you wish to use this class with the default images and you want it to lo [...]
+  <link rel="stylesheet" href="../theme/default/ie6-style.css" type="text/css" />
+<![endif]--></pre></blockquote><h4 class=CHeading>Inherits from</h4><ul><li><a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Control.Panel</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Control.PanPanel" >Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanPanel.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanPanel.slideFactor"></a>slideFactor</h3><div class=CBody><p>{Integer} Number of pixels by which we’ll pan the map in any direction on clicking the arrow buttons, defaults to 50.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanPanel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanPanel.OpenLayers.Control.PanPanel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanPanel</h3><div class=CBody><p>Add the four directional pan buttons.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used to  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The Panel control is a container for other controls. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/PanZoom-js.html b/doc/apidocs/files/OpenLayers/Control/PanZoom-js.html
new file mode 100644
index 0000000..13442e8
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/PanZoom-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.PanZoom - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.PanZoom"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoom</h1><div class=CBody><p>The PanZoom is a visible control, composed of a <a href="PanPanel-js.html#OpenLayers.Control.PanPanel" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Control.PanPanel</a> and a <a href="ZoomPanel-js.html#OpenLay [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.slideFactor"></a>slideFactor</h3><div class=CBody><p>{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 <a href="#OpenLayers.Control.PanZoom.slideRatio" class=LProperty id=link7 onMouseOver="ShowTip(event, 'tt5', 'link7')" onMouseOut="HideTip('tt5')">slideRatio</a> instead. [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.slideRatio"></a>slideRatio</h3><div class=CBody><p>{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 <a href="#OpenLayers.Control.PanZoom.slideFactor" class=LProperty id=link8 onMouseOver="ShowTip(event, 'tt6', 'link8')" onMouseOut="HideTip('tt6')">slideFactor</a>.  E.g. if slideRati [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.OpenLayers.Control.PanZoom"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoom</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.X"></a>X</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Y"></a>Y</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The PanPanel is visible control for panning the map North, South, East or West in small steps. </div></div><div class=CToolTip id="tt2"><div class=CClass>The ZoomPanel control is a compact collecton of 3 zoom controls: a OpenLayers.Control.ZoomIn, a OpenLayers.Control.ZoomToMaxExtent, and a OpenLayers.Control.ZoomOut. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=P [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/PanZoomBar-js.html b/doc/apidocs/files/OpenLayers/Control/PanZoomBar-js.html
new file mode 100644
index 0000000..c470e5c
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/PanZoomBar-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.PanZoomBar - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.PanZoomBar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoomBar</h1><div class=CBody><p>The PanZoomBar is a visible control composed of a <a href="PanPanel-js.html#OpenLayers.Control.PanPanel" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">OpenLayers.Control.PanPanel</a> and a <OpenLayers.Control.Zoo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomStopWidth"></a>zoomStopWidth</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomStopHeight"></a>zoomStopHeight</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomWorldIcon"></a>zoomWorldIcon</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.forceFixedZoomLevel"></a>forceFixedZoomLevel</h3><div class=CBody><p>{Boolean} Force a fixed zoom level even though the map has fractionalZoom</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.OpenLayers.Control.PanZoomBar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoomBar</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The PanPanel is visible control for panning the map North, South, East or West in small steps. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CClass>The PanZoom is a visible control, composed of a OpenLayers.Control.PanPanel and a OpenLayers.Contro [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Panel-js.html b/doc/apidocs/files/OpenLayers/Control/Panel-js.html
new file mode 100644
index 0000000..d8d0279
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Panel-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Panel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Panel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Panel</h1><div class=CBody><p>The Panel control is a container for other controls.  With it toolbars may be composed.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt1', 'link10')" onMouseOut="Hide [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.defaultControl"></a>defaultControl</h3><div class=CBody><p>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>} The control which is activated when the control is activated (turned on), which also happens at instantiation.  If <a href="#OpenLayers.Control.Panel.saveState" class [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.saveState"></a>saveState</h3><div class=CBody><p>{Boolean} If set to true, the active state of this panel’s controls will be stored on panel deactivation, and restored on reactivation.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.OpenLayers.Control.Panel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Panel</h3><div class=CBody><p>Create a new control panel.</p><p>Each control in the panel is represented by an icon.  When clicking on an icon, the <a href="#OpenLayers.Control.Panel.activateControl" class=LFunction id=link14 onMouseOver="ShowTip(event, 'tt5', 'link14')" onMouseOut="HideTip('tt5' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.activateControl"></a>activateControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>activateControl: function (</td><td class=PParameter nowrap>control</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This method is calle [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.addControls"></a>addControls</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addControls: function(</td><td class=PParameter nowrap>controls</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>To build a toolbar, you add a se [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.getControlsBy"></a>getControlsBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsBy: function(</td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.getControlsByName"></a>getControlsByName</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsByName: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of con [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.getControlsByClass"></a>getControlsByClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsByClass: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Permalink-js.html b/doc/apidocs/files/OpenLayers/Control/Permalink-js.html
new file mode 100644
index 0000000..19cddea
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Permalink-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Permalink - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Permalink"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Permalink</h1><div class=CBody><p>The Permalink control is hyperlink that will return the user to the current map view.  By default it is drawn in the lower right corner of the map.  The href is updated as the map is zoomed, panned and whilst layers are switched.  ` Inherits from:</p> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.argParserClass"></a>argParserClass</h3><div class=CBody><p>{Class} The ArgParser control class (not instance) to use with this control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.base"></a>base</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.displayProjection"></a>displayProjection</h3><div class=CBody><p>{<a href="../Projection-js.html#OpenLayers.Projection" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} Requires proj4js support.   Projection used when creating the coordinates in the link.  This will reproject the map coordinates into display coo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.OpenLayers.Control.Permalink"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Permalink</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement}</td></tr><tr><td class=CDLEntry>base</td><td class=CDLDescription>{String}</td></tr><tr>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.createParams"></a>createParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createParams: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom,</td></tr><tr><td></td><td class=PParameter nowrap>layers</td> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/SLDSelect-js.html b/doc/apidocs/files/OpenLayers/Control/SLDSelect-js.html
new file mode 100644
index 0000000..78d5bb2
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/SLDSelect-js.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.SLDSelect - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.SLDSelect"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SLDSelect</h1><div class=CBody><p>Perform selections on WMS layers using Styled Layer Descriptor (SLD)</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">OpenLa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happen [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.clearOnDeactivate"></a>clearOnDeactivate</h3><div class=CBody><p>{Boolean} Should the selection be cleared when the control is deactivated.  Default value is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="../Layer/WMS-js.html#OpenLayers.Layer.WMS" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt1', 'link8')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.WMS</a>)} The WMS layers this control will work on.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.selectionSymbolizer"></a>selectionSymbolizer</h3><div class=CBody><p>{Object} Determines the styling of the selected objects.  Default is a selection in red.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.layerOptions"></a>layerOptions</h3><div class=CBody><p>{Object} The options to apply to the selection layer, by default the selection layer will be kept out of the layer switcher.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Used to set non-default properties on the control’s handler</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.sketchStyle"></a>sketchStyle</h3><div class=CBody><p>{<OpenLayers.Style>|Object} Style or symbolizer to use for the sketch handler.  The recommended way of styling the sketch layer, however, is to configure an <a href="../StyleMap-js.html#OpenLayers.StyleMap" class=LClass >OpenLayers.StyleMap</a> in the layerOptions of the <a href="#OpenLayers.Control.SLDSelect.handlerOptions" class [...]
+    handlerOptions: {
+        layerOptions: {
+            styleMap: new OpenLayers.StyleMap({
+                "default": {strokeColor: "yellow"}
+            });
+        }
+    }
+});</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.wfsCache"></a>wfsCache</h3><div class=CBody><p>{Object} Cache to use for storing parsed results from <OpenLayers.Format.WFSDescribeFeatureType.read>.  If not provided, these will be cached on the prototype.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.layerCache"></a>layerCache</h3><div class=CBody><p>{Object} Cache to use for storing references to the selection layers.  Normally each source layer will have exactly 1 selection layer of type OpenLayers.Layer.WMS.Post.  If not provided, layers will be cached on the prototype.  Note that if <a href="#OpenLayers.Control.SLDSelect.clearOnDeactivate" class=LProperty id=link10 onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.OpenLayers.Control.SLDSelect"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SLDSelect</h3><div class=CBody><p>Create a new control for selecting features in WMS layers using Styled Layer Descriptor (SLD).</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>handler</td><td class=CDLDescription>{ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Take care of things that are not handled in superclass.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.  Activating the control will perform a SLD WMS DescribeLayer request followed by a WFS DescribeFeatureType request so that the proper symbolizers can be chosen based on the geometry type.</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.  If clearOnDeactivate is true, remove the selection layer(s).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.setLayers"></a>setLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayers: function(</td><td class=PParameter nowrap>layers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the layers on which the selectio [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.WMS are used to display data from OGC Web Mapping Services. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Take care of things that are not handled in superclass.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cell [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Scale-js.html b/doc/apidocs/files/OpenLayers/Control/Scale-js.html
new file mode 100644
index 0000000..c9f4e71
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Scale-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Scale - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Scale"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Scale</h1><div class=CBody><p>The Scale control displays the current map scale as a ratio (e.g.  Scale = 1:1M).  By default it is displayed in the lower right corner of the map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.geodesic"></a>geodesic</h3><div class=CBody><p>{Boolean} Use geodesic measurement.  Default is false.  The recommended setting for maps in EPSG:4326 is false, and true EPSG:900913.  If set to true, the scale will be calculated based on the horizontal size of the pixel in the center of the map viewport.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.OpenLayers.Control.Scale"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Scale</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/ScaleLine-js.html b/doc/apidocs/files/OpenLayers/Control/ScaleLine-js.html
new file mode 100644
index 0000000..a1c1222
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/ScaleLine-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ScaleLine - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ScaleLine"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ScaleLine</h1><div class=CBody><p>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.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.geodesic"></a>geodesic</h3><div class=CBody><p>{Boolean} Use geodesic measurement.  Default is false.  The recommended setting for maps in EPSG:4326 is false, and true EPSG:900913.  If set to true, the scale will be calculated based on the horizontal size of the pixel in the center of the map viewport.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.OpenLayers.Control.ScaleLine"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ScaleLine</h3><div class=CBody><p>Create a new scale line control.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used to ex [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>The Scale control displays the current map scale as a ratio (e.g. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/SelectFeature-js.html b/doc/apidocs/files/OpenLayers/Control/SelectFeature-js.html
new file mode 100644
index 0000000..0a79d6e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/SelectFeature-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.SelectFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.SelectFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SelectFeature</h1><div class=CBody><p>The SelectFeature control selects vector features from a given layer on click or hover.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types</h4><ul><li><b>beforefeaturehighlighted</b> Triggered before a feature is highlighted</li><li><b>featurehighlighted</b> Triggered when a feature is highlighted</li><li><b>featureunhighlighted</b> Triggered when a feature is unhighlighted</li></ul></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.multiple"></a>multiple</h3><div class=CBody><p>{Boolean} Allow selection of multiple geometries.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.clickout"></a>clickout</h3><div class=CBody><p>{Boolean} Unselect features when clicking outside any feature.  Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.toggle"></a>toggle</h3><div class=CBody><p>{Boolean} Unselect a selected feature on click.   Default is false.   Only has meaning if hover is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.hover"></a>hover</h3><div class=CBody><p>{Boolean} Select on mouse over and deselect on mouse out.   If true, this ignores clicks and only listens to mouse moves.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.highlightOnly"></a>highlightOnly</h3><div class=CBody><p>{Boolean} If true do not actually select features (i.e. place them in the layer’s selected features array), just highlight them.  This property has no effect if hover is false.  Defaults to false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.box"></a>box</h3><div class=CBody><p>{Boolean} Allow feature selection by drawing a box.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.onSelect"></a>onSelect</h3><div class=CBody><p>{Function} Optional function to be called when a feature is selected.  The function should expect to be called with a feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.onUnselect"></a>onUnselect</h3><div class=CBody><p>{Function} Optional function to be called when a feature is unselected.  The function should expect to be called with a feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Array(String)} To restrict selecting to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.callbacks"></a>callbacks</h3><div class=CBody><p>{Object} The functions that are sent to the handlers.feature for callback</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.selectStyle"></a>selectStyle</h3><div class=CBody><p>{Object} Hash of styles</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.OpenLayers.Control.SelectFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SelectFeature</h3><div class=CBody><p>Create a new control for selecting features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layers</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#OpenLa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.setLayer"></a>setLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayer: function(</td><td class=PParameter nowrap>layers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Attach a new layer to the control,  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayer: function(</td><td class=PParameter nowrap>layers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Attach a new layer to the control, overriding any existing layers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Control [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Snapping-js.html b/doc/apidocs/files/OpenLayers/Control/Snapping-js.html
new file mode 100644
index 0000000..1850316
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Snapping-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Snapping - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Snapping"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Snapping</h1><div class=CBody><p>Acts as a snapping agent while editing vector features.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Control</a [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happene [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.DEFAULTS"></a>DEFAULTS</h3><div class=CBody><p>Default target properties.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.OpenLayers.Control.Snapping"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Snapping</h3><div class=CBody><p>Creates a new snapping control.  A control is constructed with an editable layer and a set of configuration objects for target layers.  While the control is active, dragging vertices while drawing new features or modifying existing features on the edita [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.setLayer"></a>setLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayer: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the editable layer.   Call the s [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.   Activating the control registers listeners for editing related events so that during feature creation and modification, moving vertices will trigger snapping.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.   Deactivating the control unregisters listeners so feature editing may proceed without engaging the snapping agent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayer: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Set the editable layer. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/Split-js.html b/doc/apidocs/files/OpenLayers/Control/Split-js.html
new file mode 100644
index 0000000..1cf866b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/Split-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Split - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Split"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Split</h1><div class=CBody><p>Acts as a split feature agent while editing vector features.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Control</a> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>} The target layer with features to be split.  Set at construction or after construction with <setLayer>.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.tolerance"></a>tolerance</h3><div class=CBody><p>{Number} Distance between the calculated intersection and a vertex on the source geometry below which the existing vertex will be used for the split.   Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.edge"></a>edge</h3><div class=CBody><p>{Boolean} Allow splits given intersection of edges only.   Default is true.   If false, a vertex on the source must be within the <a href="#OpenLayers.Control.Split.tolerance" class=LProperty id=link8 onMouseOver="ShowTip(event, 'tt6', 'link8')" onMouseOut="HideTip('tt6')">tolerance</a> distance of the calculated intersection for a split to occur.</ [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.deferDelete"></a>deferDelete</h3><div class=CBody><p>{Boolean} Instead of removing features from the layer, set feature states of split features to DELETE.   This assumes a save strategy or other component is in charge of removing features from the layer.   Default is false.   If false, split features will be immediately deleted from the layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.mutual"></a>mutual</h3><div class=CBody><p>{Boolean} If source and target layers are the same, split source features and target features where they intersect.   Default is true.   If false, only target features will be split.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.targetFilter"></a>targetFilter</h3><div class=CBody><p>{OpenLayers.Filter} Optional filter that will be evaluated to determine if a feature from the target layer is eligible for splitting.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.sourceFilter"></a>sourceFilter</h3><div class=CBody><p>{OpenLayers.Filter} Optional filter that will be evaluated to determine if a feature from the target layer is eligible for splitting.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.OpenLayers.Control.Split"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Split</h3><div class=CBody><p>Creates a new split control.  A control is constructed with a target layer and an optional source layer.  While the control is active, creating new features or modifying existing features on the source layer will result in splitting any eligible features on the  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.setSource"></a>setSource</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSource: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the source layer for edits layer.</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.   Activating the control registers listeners for editing related events so that during feature creation and modification, features in the target will be considered for splitting.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.   Deactivating the control unregisters listeners so feature editing may proceed without engaging the split agent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSource: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/TransformFeature-js.html b/doc/apidocs/files/OpenLayers/Control/TransformFeature-js.html
new file mode 100644
index 0000000..73b6789
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/TransformFeature-js.html
@@ -0,0 +1,88 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.TransformFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.TransformFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TransformFeature</h1><div class=CBody><p>Control to transform features with a standard transformation box.</p><h4 class=CHeading>Inherits From</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt7', 'link10')" onMouseOut="HideTip(' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types</h4><ul><li><b>beforesetfeature</b> Triggered before a feature is set for tranformation.  The feature will not be set if a listener returns false.  Listeners receive a <b>feature</b> property, with the feature that will be set for transformation.  Listeners are allowed to set the co [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Array(String)} To restrict transformation to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.preserveAspectRatio"></a>preserveAspectRatio</h3><div class=CBody><p>{Boolean} set to true to not change the feature’s aspect ratio.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.rotate"></a>rotate</h3><div class=CBody><p>{Boolean} set to false if rotation should be disabled.  Default is true.  To be passed with the constructor or set when the control is not active.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.feature"></a>feature</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>} Feature currently available for transformation.  Read-only, use <a href="#OpenLayers.Control.TransformFeature.setFeature" class=LFunction id=link15  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.renderIntent"></a>renderIntent</h3><div class=CBody><p>{String|Object} Render intent for the transformation box and handles.  A symbolizer object can also be provided here.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.rotationHandleSymbolizer"></a>rotationHandleSymbolizer</h3><div class=CBody><p>{Object|String} Optional.  A custom symbolizer for the rotation handles.  A render intent can also be provided here.  Defaults to</p><blockquote><pre>{
+    stroke: false,
+    pointRadius: 10,
+    fillOpacity: 0,
+    cursor: "pointer"
+}</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.box"></a>box</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>} The transformation box rectangle.  Read-only.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.center"></a>center</h3><div class=CBody><p>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt2', 'link17')" onMouseOut="HideTip('tt2')">OpenLayers.Geometry.Point</a>} The center of the feature bounds.  Read-only.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.scale"></a>scale</h3><div class=CBody><p>{Float} The scale of the feature, relative to the scale the time the feature was set.  Read-only, except for <b>beforesetfeature</b> listeners.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.ratio"></a>ratio</h3><div class=CBody><p>{Float} The ratio of the feature relative to the ratio the time the feature was set.  Read-only, except for <b>beforesetfeature</b> listeners.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.handles"></a>handles</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt1', 'link18')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>)} The 8 handles currently available for scaling/resizing.  Numbered counterclockwise, starting from the southwest corner.  Read-only.</p>< [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.rotationHandles"></a>rotationHandles</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt1', 'link19')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>)} The 4 rotation handles currently available for rotating.  Numbered counterclockwise, starting from the southwest corner.&nbsp [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.OpenLayers.Control.TransformFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TransformFeature</h3><div class=CBody><p>Create a new transform feature control.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#Ope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activates the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivates the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.setFeature"></a>setFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setFeature: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>initialParams</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Take care of things that are not handled in superclass.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CClass>Point geometry class.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activates the control.</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/WMSGetFeatureInfo-js.html b/doc/apidocs/files/OpenLayers/Control/WMSGetFeatureInfo-js.html
new file mode 100644
index 0000000..18410ea
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/WMSGetFeatureInfo-js.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.WMSGetFeatureInfo - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>WMSGetFeatureInfo</h1><div class=CBody><p>The WMSGetFeatureInfo control uses a WMS query to get information about a point on the map.   The information may be in a display-friendly format such as HTML, or a machine-friendly format such as GML, depending on the server’s capabilitie [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.hover"></a>hover</h3><div class=CBody><p>{Boolean} Send GetFeatureInfo requests when mouse stops moving.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.drillDown"></a>drillDown</h3><div class=CBody><p>{Boolean} Drill down over all WMS layers in the map.  When using drillDown mode, hover is not possible, and an infoFormat that returns parseable features is required.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.maxFeatures"></a>maxFeatures</h3><div class=CBody><p>{Integer} Maximum number of features to return from a WMS query.  This sets the feature_count parameter on WMS GetFeatureInfo requests.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.clickCallback"></a>clickCallback</h3><div class=CBody><p>{String} The click callback to register in the {<a href="../Handler/Click-js.html#OpenLayers.Handler.Click" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">OpenLayers.Handler.Click</a>} object created when the hover option is set to false.  Default is “click”.</p></d [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Additional options for the handlers used by this control, e.g.</p><blockquote><pre>{
+    "click": {delay: 100},
+    "hover": {delay: 300}
+}</pre></blockquote></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types (in addition to those from <a href="../Control-js.html#OpenLayers.Control" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')">OpenLayers.Control</a>)</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>beforeget [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.OpenLayers.Control.WMSGetFeatureInfo"></a><OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>WMSGetFeatureInfo></h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A handler for mouse clicks. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/WMTSGetFeatureInfo-js.html b/doc/apidocs/files/OpenLayers/Control/WMTSGetFeatureInfo-js.html
new file mode 100644
index 0000000..bc6ef20
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/WMTSGetFeatureInfo-js.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.WMTSGetFeatureInfo - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>WMTSGetFeatureInfo</h1><div class=CBody><p>The WMTSGetFeatureInfo control uses a WMTS query to get information about a point on the map.   The information may be in a display-friendly format such as HTML, or a machine-friendly format such as GML, depending on the server’s capabil [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.hover"></a>hover</h3><div class=CBody><p>{Boolean} Send GetFeatureInfo requests when mouse stops moving.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.drillDown"></a>drillDown</h3><div class=CBody><p>{Boolean} Drill down over all WMTS layers in the map.  When using drillDown mode, hover is not possible.   A getfeatureinfo event will be fired for each layer queried.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.maxFeatures"></a>maxFeatures</h3><div class=CBody><p>{Integer} Maximum number of features to return from a WMTS query.  This sets the feature_count parameter on WMTS GetFeatureInfo requests.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.clickCallback"></a>clickCallback</h3><div class=CBody><p>{String} The click callback to register in the {<a href="../Handler/Click-js.html#OpenLayers.Handler.Click" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">OpenLayers.Handler.Click</a>} object created when the hover option is set to false.  Default is “click”.</p></ [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.queryVisible"></a>queryVisible</h3><div class=CBody><p>{Boolean} Filter out hidden layers when searching the map for layers to query.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Additional options for the handlers used by this control, e.g.</p><blockquote><pre>{
+    "click": {delay: 100},
+    "hover": {delay: 300}
+}</pre></blockquote></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types (in addition to those from <a href="../Control-js.html#OpenLayers.Control" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')">OpenLayers.Control</a>)</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>beforege [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.OpenLayers.Control.WMTSGetFeatureInfo"></a><OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>WMTSGetFeatureInfo></h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A handler for mouse clicks. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/ZoomBox-js.html b/doc/apidocs/files/OpenLayers/Control/ZoomBox-js.html
new file mode 100644
index 0000000..a7176f7
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/ZoomBox-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomBox - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomBox"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomBox</h1><div class=CBody><p>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.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LC [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/ZoomIn-js.html b/doc/apidocs/files/OpenLayers/Control/ZoomIn-js.html
new file mode 100644
index 0000000..0f0dde9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/ZoomIn-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomIn - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomIn"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomIn</h1><div class=CBody><p>The ZoomIn control is a button to increase the zoom level of a map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Co [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/ZoomOut-js.html b/doc/apidocs/files/OpenLayers/Control/ZoomOut-js.html
new file mode 100644
index 0000000..0adb5b4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/ZoomOut-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomOut - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomOut"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomOut</h1><div class=CBody><p>The ZoomOut control is a button to decrease the zoom level of a map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/ZoomPanel-js.html b/doc/apidocs/files/OpenLayers/Control/ZoomPanel-js.html
new file mode 100644
index 0000000..64bb7b4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/ZoomPanel-js.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomPanel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomPanel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomPanel</h1><div class=CBody><p>The ZoomPanel control is a compact collecton of 3 zoom controls: a <a href="ZoomIn-js.html#OpenLayers.Control.ZoomIn" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Control.ZoomIn</a>, a <a href="ZoomToMaxEx [...]
+  <link rel="stylesheet" href="../theme/default/ie6-style.css" type="text/css" />
+<![endif]--></pre></blockquote><h4 class=CHeading>Inherits from</h4><ul><li><a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt4', 'link7')" onMouseOut="HideTip('tt4')">OpenLayers.Control.Panel</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Control.ZoomPanel" >Ope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomPanel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomPanel.OpenLayers.Control.ZoomPanel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomPanel</h3><div class=CBody><p>Add the three zooming controls.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used to ext [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The ZoomIn control is a button to increase the zoom level of a map.</div></div><div class=CToolTip id="tt2"><div class=CClass>The ZoomToMaxExtent control is a button that zooms out to the maximum extent of the map. </div></div><div class=CToolTip id="tt3"><div class=CClass>The ZoomOut control is a button to decrease the zoom level of a map.</div></div><div class=CToolTip id="tt4"><div class=CClass>The Panel control is a container for other c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Control/ZoomToMaxExtent-js.html b/doc/apidocs/files/OpenLayers/Control/ZoomToMaxExtent-js.html
new file mode 100644
index 0000000..169479e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Control/ZoomToMaxExtent-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomToMaxExtent - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomToMaxExtent"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomToMaxExtent</h1><div class=CBody><p>The ZoomToMaxExtent control is a button that zooms out to the maximum extent of the map.  It is designed to be used with a <a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Events-js.html b/doc/apidocs/files/OpenLayers/Events-js.html
new file mode 100644
index 0000000..ac3fcfc
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Events-js.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Event - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Event"></a>OpenLayers.<span class=HB> </span>Event</h1><div class=CBody><p>Utility functions for event handling.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Event" >OpenLayers.<span class=HB> </span>Event</a></td><td class=S [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_BACKSPACE"></a>KEY_BACKSPACE</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_TAB"></a>KEY_TAB</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_RETURN"></a>KEY_RETURN</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_ESC"></a>KEY_ESC</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_LEFT"></a>KEY_LEFT</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_UP"></a>KEY_UP</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_RIGHT"></a>KEY_RIGHT</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_DOWN"></a>KEY_DOWN</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_DELETE"></a>KEY_DELETE</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Events"></a>OpenLayers.<span class=HB> </span>Events</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Events.Constants" >Constants</a></td><td class=SDescription></td></tr><tr class="SConstant SIndent1 SMarked"><td class=SEntry><a href="#O [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.BROWSER_EVENTS"></a>BROWSER_EVENTS</h3><div class=CBody><p>{Array(String)} supported events</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.fallThrough"></a>fallThrough</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.includeXY"></a>includeXY</h3><div class=CBody><p>{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 event object that is passed.  (Prior to OpenLayers 2.7, this was true by default.)  Otherwise, you can call the getMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.OpenLayers.Events"></a>OpenLayers.<span class=HB> </span>Events</h3><div class=CBody><p>Construct an OpenLayers.Events object.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} The js object to which this Events object  is being</td></tr><tr><td class=CDLEntry>added element</td><td [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.addEventType"></a>addEventType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addEventType: function(</td><td class=PParameter nowrap>eventName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add a new event type to this events [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.on"></a>on</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>on: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Convenience method for registering listeners with a common scope.&nb [...]
+events.on({"loadstart", loadStartListener});
+
+// this is equivalent to the following
+events.register("loadstart", undefined, loadStartListener);
+
+// register multiple listeners to be called with the same `this` object
+events.on({
+    "loadstart": loadStartListener,
+    "loadend": loadEndListener,
+    scope: object
+});
+
+// this is equivalent to the following
+events.register("loadstart", object, loadStartListener);
+events.register("loadstart", object, loadEndListener);</pre></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.register"></a>register</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>register: function (</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>func</td><td class=PAfterParameters  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.registerPriority"></a>registerPriority</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>registerPriority: function (</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>func</td><td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.un"></a>un</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>un: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Convenience method for unregistering listeners with a common scope.& [...]
+events.un({"loadstart", loadStartListener});
+
+// this is equivalent to the following
+events.unregister("loadstart", undefined, loadStartListener);
+
+// unregister multiple listeners with the same `this` object
+events.un({
+    "loadstart": loadStartListener,
+    "loadend": loadEndListener,
+    scope: object
+});
+
+// this is equivalent to the following
+events.unregister("loadstart", object, loadStartListener);
+events.unregister("loadstart", object, loadEndListener);</pre></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.unregister"></a>unregister</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unregister: function (</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>func</td><td class=PAfterParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.triggerEvent"></a>triggerEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>triggerEvent: function (</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.clearMouseCache"></a>clearMouseCache</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearMouseCache: function()</td></tr></table></blockquote><p>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.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addEventType: function(</td><td class=PParameter nowrap>eventName</td><td class=PAfter [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Feature-js.html b/doc/apidocs/files/OpenLayers/Feature-js.html
new file mode 100644
index 0000000..e2ffc5a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Feature-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Feature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Feature"></a>OpenLayers.<span class=HB> </span>Feature</h1><div class=CBody><p>Features are combinations of geography and attributes.  The OpenLayers.Feature class specifically combines a marker and a lonlat.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.popupClass"></a>popupClass</h3><div class=CBody><p>{<a href="BaseTypes/Class-js.html#OpenLayers.Class" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')">OpenLayers.Class</a>} The class which will be used to instantiate a new Popup.  Default is <a href="Popup/AnchoredBubble-js.html#OpenLayers.Popup.AnchoredBubble" class=LClass >OpenLayers.Popup.Anch [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.OpenLayers.Feature"></a>OpenLayers.<span class=HB> </span>Feature</h3><div class=CBody><p>Constructor for features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>}</td></tr><tr><td class=CDLEntry>lonlat</td><td  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([4, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Base class used to construct all other classes. </div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt3"><div class=CConstructor>Constructor for features.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Feature/Vector-js.html b/doc/apidocs/files/OpenLayers/Feature/Vector-js.html
new file mode 100644
index 0000000..7c580ed
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Feature/Vector-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Feature.Vector - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Feature.Vector"></a>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>Vector</h1><div class=CBody><p>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 <a href="#OpenLayers.Feature.Vec [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.geometry"></a>geometry</h3><div class=CBody><p>{<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.attributes"></a>attributes</h3><div class=CBody><p>{Object} This object holds arbitrary, serializable properties that describe the feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.style"></a>style</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.url"></a>url</h3><div class=CBody><p>{String} If this property is set it will be taken into account by {<OpenLayers.HTTP>} when upadting or deleting the feature.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.OpenLayers.Feature.Vector"></a>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>Vector</h3><div class=CBody><p>Create a vector feature.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link5 onMous [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.OpenLayers.Feature.Vector.style"></a>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>Vector.<span class=HB> </span>style</h3><div class=CBody><p>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 [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([4, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A Geometry is a description of a geographic object. </div></div><div class=CToolTip id="tt2"><div class=CConstant>OpenLayers features can have a number of style attributes. </div></div><div class=CToolTip id="tt3"><div class=CClass>Features are combinations of geography and attributes. </div></div><div class=CToolTip id="tt4"><div class=CProperty>{Object} This object holds arbitrary, serializable properties that describe the feature.</div></ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Feature/WFS-js.html b/doc/apidocs/files/OpenLayers/Feature/WFS-js.html
new file mode 100644
index 0000000..d285bb4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Feature/WFS-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Feature.WFS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Feature.WFS"></a>OpenLayers.<span class=HB> </span>Feature.WFS</h1><div class=CBody><p>WFS handling class, for use as a featureClass on the WFS layer for handling ‘point’ WFS types.  Good for subclassing when creating a custom WFS like XML application.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link1  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.WFS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.WFS.OpenLayers.Feature.WFS"></a>OpenLayers.<span class=HB> </span>Feature.WFS</h3><div class=CBody><p>Create a WFS feature.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>}</td></tr><tr><td class=CDLEntry>xmlN [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([4, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Features are combinations of geography and attributes. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Filter-js.html b/doc/apidocs/files/OpenLayers/Filter-js.html
new file mode 100644
index 0000000..a0b3037
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Filter-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter"></a>OpenLayers.<span class=HB> </span>Filter</h1><div class=CBody><p>This class represents an OGC Filter.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Filter" >OpenLayers.<span class=HB> </span>Filter</a></td><td clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.OpenLayers.Filter"></a>OpenLayers.<span class=HB> </span>Filter</h3><div class=CBody><p>This is an abstract class.   Create an instance of a filter subclass.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Remove reference to anything added.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Evaluates this filter in a specific context.&nbsp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.  Should be implementted by subclasses.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.OpenLayers.Filter" class=LConstructor id=link5 onMouseOver="ShowTip(event, 'tt4', 'link5')" onMouseOut="Hide [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Remove reference to anything added.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Filter/Comparison-js.html b/doc/apidocs/files/OpenLayers/Filter/Comparison-js.html
new file mode 100644
index 0000000..ded2f5d
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Filter/Comparison-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter.Comparison - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter.Comparison"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Comparison</h1><div class=CBody><p>This class represents a comparison filter.</p><p>Inherits from</p><ul><li><a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Filter</a></li></ul><!--START_ND_SUMMARY [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.type"></a>type</h3><div class=CBody><p>{String} type: type of the comparison.  This is one of</p><ul><li>OpenLayers.Filter.Comparison.EQUAL_TO                 = “==”;</li><li>OpenLayers.Filter.Comparison.NOT_EQUAL_TO             = “!=”;</li><li>OpenLayers.Filter.Comparison.LESS_THAN                = “<”;</li><li>OpenLayers.Filter.Comparison.GREATER_T [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.property"></a>property</h3><div class=CBody><p>{String} name of the context property to compare</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.value"></a>value</h3><div class=CBody><p>{Number} or {String} comparison value for binary comparisons.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.lowerBoundary"></a>lowerBoundary</h3><div class=CBody><p>{Number} or {String} lower boundary for between comparisons.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.upperBoundary"></a>upperBoundary</h3><div class=CBody><p>{Number} or {String} upper boundary for between comparisons.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.OpenLayers.Filter.Comparison"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Comparison</h3><div class=CBody><p>Creates a comparison rule.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the rule</td></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Evaluates this filter in a specific co [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.value2regex"></a>value2regex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>value2regex: function(</td><td class=PParameter nowrap>wildCard,</td></tr><tr><td></td><td class=PParameter nowrap>singleChar,</td></tr><tr><td></td><td class=PParameter nowrap>escape [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.Comparison.OpenLayers.Filter.Comparison" class=LConstructor id=link6 onMouseOver="ShowTip(event, 'tt5', 'link6')" onMouseOut="HideTip('tt5')" [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Evaluates this filter in a specific context.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Filter/FeatureId-js.html b/doc/apidocs/files/OpenLayers/Filter/FeatureId-js.html
new file mode 100644
index 0000000..e343603
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Filter/FeatureId-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter.FeatureId - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter.FeatureId"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>FeatureId</h1><div class=CBody><p>This class represents a ogc:FeatureId Filter, as being used for rule-based SLD styling</p><p>Inherits from</p><ul><li><a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayer [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.fids"></a>fids</h3><div class=CBody><p>{Array(String)} Feature Ids to evaluate this rule against.  To be passed To be passed inside the params object.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.OpenLayers.Filter.FeatureId"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>FeatureId</h3><div class=CBody><p>Creates an ogc:FeatureId rule.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the rule</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>evaluates this rule for a specific feat [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.FeatureId.OpenLayers.Filter.FeatureId" class=LConstructor id=link6 onMouseOver="ShowTip(event, 'tt4', 'link6')" onMouseOut="HideTip('tt4')">Op [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>evaluates this rule for a specific feature</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Filter/Logical-js.html b/doc/apidocs/files/OpenLayers/Filter/Logical-js.html
new file mode 100644
index 0000000..c551f7f
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Filter/Logical-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter.Logical - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter.Logical"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Logical</h1><div class=CBody><p>This class represents ogc:And, ogc:Or and ogc:Not rules.</p><p>Inherits from</p><ul><li><a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Filter</a></li></ul><!--START_ND [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.filters"></a>filters</h3><div class=CBody><p>{Array(<a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Filter</a>)} Child filters for this filter.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.type"></a>type</h3><div class=CBody><h4 class=CHeading>{String} type of logical operator.  Available types are</h4><ul><li>OpenLayers.Filter.Logical.AND = “&&”;</li><li>OpenLayers.Filter.Logical.OR  = “||”;</li><li>OpenLayers.Filter.Logical.NOT = “!”;</li></ul></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.OpenLayers.Filter.Logical"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Logical</h3><div class=CBody><p>Creates a logical filter (And, Or, Not).</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the filter [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Remove reference to child filters.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Evaluates this filter in a specific conte [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.Logical.OpenLayers.Filter.Logical" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt5', 'link8')" onMouseOut="HideTip('tt5')">OpenLaye [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents an OGC Filter.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Remove reference to child filters.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Filter/Spatial-js.html b/doc/apidocs/files/OpenLayers/Filter/Spatial-js.html
new file mode 100644
index 0000000..7de2ed6
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Filter/Spatial-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter.Spatial - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter.Spatial"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Spatial</h1><div class=CBody><p>This class represents a spatial filter.  Currently implemented: BBOX, DWithin and Intersects</p><p>Inherits from</p><ul><li><a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">Op [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.type"></a>type</h3><div class=CBody><p>{String} Type of spatial filter.</p><h4 class=CHeading>The type should be one of</h4><ul><li>OpenLayers.Filter.Spatial.BBOX</li><li>OpenLayers.Filter.Spatial.INTERSECTS</li><li>OpenLayers.Filter.Spatial.DWITHIN</li><li>OpenLayers.Filter.Spatial.WITHIN</li><li>OpenLayers.Filter.Spatial.CONTAINS</li></ul></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.property"></a>property</h3><div class=CBody><p>{String} Name of the context property to compare.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.value"></a>value</h3><div class=CBody><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Bounds</a> || <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt2', 'link6')" onMouseOut="HideTip('tt2')">OpenLayers.Geometry</a>} The bounds  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.distance"></a>distance</h3><div class=CBody><p>{Number} The distance to use in a DWithin spatial filter.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.distanceUnits"></a>distanceUnits</h3><div class=CBody><p>{String} The units to use for the distance, e.g.  ‘m’.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.OpenLayers.Filter.Spatial"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Spatial</h3><div class=CBody><p>Creates a spatial filter.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the filter.</td></tr></ta [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.Spatial.OpenLayers.Filter.Spatial" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt5', 'link8')" onMouseOut="HideTip('tt5')">OpenLaye [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt2"><div class=CClass>A Geometry is a description of a geographic object. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote>Clones this filter.</div></div><div class=CToolTip id="tt4"><div class=CClass>This class repre [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format-js.html b/doc/apidocs/files/OpenLayers/Format-js.html
new file mode 100644
index 0000000..4b3c6ee
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format"></a>OpenLayers.<span class=HB> </span>Format</h1><div class=CBody><p>Base class for format reading/writing a variety of formats.   Subclasses of OpenLayers.Format are expected to have read and write methods.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMai [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.externalProjection"></a>externalProjection</h3><div class=CBody><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} When passed a externalProjection and internalProjection, the format will reproject the geometries it reads or writes.  The externalProjection is the projection u [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.internalProjection"></a>internalProjection</h3><div class=CBody><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt1', 'link8')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} When passed a externalProjection and internalProjection, the format will reproject the geometries it reads or writes.  The internalProjection is the projection u [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.data"></a>data</h3><div class=CBody><p>{Object} When <a href="#OpenLayers.Format.keepData" class=LProperty id=link10 onMouseOver="ShowTip(event, 'tt2', 'link10')" onMouseOut="HideTip('tt2')">keepData</a> is true, this is the parsed string sent to <read>.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.keepData"></a>keepData</h3><div class=CBody><p>{Object} Maintain a reference (<a href="#OpenLayers.Format.data" class=LProperty id=link11 onMouseOver="ShowTip(event, 'tt3', 'link11')" onMouseOut="HideTip('tt3')">data</a>) to the most recently read data.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OpenLayers.Format"></a>OpenLayers.<span class=HB> </span>Format</h3><div class=CBody><p>Instances of this class are not useful.   See one of the subclasses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the format</td></tr></ta [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt2"><div class=CProperty>{Object} Maintain a reference (data) to the most recently read data. </div></div><div class=CToolTip id="tt3"><div class=CProperty>{Object} When keepData is true, this is the parsed string sent to read.</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 cla [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/ArcXML-js.html b/doc/apidocs/files/OpenLayers/Format/ArcXML-js.html
new file mode 100644
index 0000000..eab2e42
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/ArcXML-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.ArcXML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.ArcXML"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>ArcXML</h1><div class=CBody><p>Read/Wite ArcXML.  Create a new instance with the <a href="#OpenLayers.Format.ArcXML.OpenLayers.Format.ArcXML" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Format.ArcXML</a> constructor.</p><h4 class=CH [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.OpenLayers.Format.ArcXML"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>ArcXML</h3><div class=CBody><p>Create a new parser/writer for ArcXML.   Create an instance of this class to begin authoring a request to an ArcIMS service.   This is used primarily by the ArcIMS layer, but could be used to do other wild stuff, like geocoding.</p><h4 class=CHeading>Parameters< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.iserror"></a>iserror</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>iserror: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Check to see if the response from the server was [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string, and return an response.</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Generate an ArcXml document string for sending to a [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>iserror: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Check to see if the response from the server was an error.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><ta [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/ArcXML/Features-js.html b/doc/apidocs/files/OpenLayers/Format/ArcXML/Features-js.html
new file mode 100644
index 0000000..27e541b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/ArcXML/Features-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.ArcXML.Features - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.ArcXML.Features"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>ArcXML.<span class=HB> </span>Features</h1><div class=CBody><p>Read/Wite ArcXML features.  Create a new instance with the <a href="#OpenLayers.Format.ArcXML.Features.OpenLayers.Format.ArcXML.Features" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideT [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Features.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Features.OpenLayers.Format.ArcXML.Features"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>ArcXML.<span class=HB> </span>Features</h3><div class=CBody><p>Create a new parser/writer for ArcXML Features.   Create an instance of this class to get a set of features from an ArcXML response.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 cla [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Features.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Features.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string of ArcXML, and return a  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read data from a string of ArcXML, and return a set of OpenLayers features.</div></div><div class=CToolTip id="tt2"><div class=CConstructo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/Atom-js.html b/doc/apidocs/files/OpenLayers/Format/Atom-js.html
new file mode 100644
index 0000000..d7504c3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/Atom-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Atom - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Atom"></a>OpenLayers.<span class=HB> </span>Format.Atom</h1><div class=CBody><p>Read/write Atom feeds.  Create a new instance with the <OpenLayers.Format.AtomFeed> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.feedTitle"></a>feedTitle</h3><div class=CBody><p>{String} Atom feed elements require a title.   Default is “untitled”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.defaultEntryTitle"></a>defaultEntryTitle</h3><div class=CBody><p>{String} Atom entry elements require a title.   In cases where one is not provided in the feature attributes, this will be used.   Default is “untitled”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x) For GeoRSS the default is (y,x), therefore: false</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.OpenLayers.Format.AtomEntry"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>AtomEntry</h3><div class=CBody><p>Create a new parser for Atom.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance. [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Serialize or more feature nodes to Atom documents.</ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Serialize or more feature nodes to Atom documents.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and write XML. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/CSWGetDomain-js.html b/doc/apidocs/files/OpenLayers/Format/CSWGetDomain-js.html
new file mode 100644
index 0000000..63c522e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/CSWGetDomain-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.CSWGetDomain.DEFAULTS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CConstant"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetDomain.<span class=HB> </span>DEFAULTS</h1><div class=CBody><p>{Object} Default properties for the CSWGetDomain format.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/CSWGetDomain/v2_0_2-js.html b/doc/apidocs/files/OpenLayers/Format/CSWGetDomain/v2_0_2-js.html
new file mode 100644
index 0000000..b9bd47b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/CSWGetDomain/v2_0_2-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.CSWGetDomain.v2_0_2 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetDomain.<span class=HB> </span>v2_0_2</h1><div class=CBody><p>A format for creating CSWGetDomain v2.0.2 transactions.  Create a new instance with the <a href="#OpenLayers.Format.CSWGetDomain.v2_0_2.OpenLayers.Format.CSWGetDomain.v2_0_2" class=LConstructor id=link3 onMouseOver="Show [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.PropertyName"></a>PropertyName</h3><div class=CBody><p>{String} Value of the csw:PropertyName element, used when writing a GetDomain document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.ParameterName"></a>ParameterName</h3><div class=CBody><p>{String} Value of the csw:ParameterName element, used when writing a GetDomain document.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.OpenLayers.Format.CSWGetDomain.v2_0_2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetDomain.<span class=HB> </span>v2_0_2</h3><div class=CBody><p>A class for parsing and generating CSWGetDomain v2.0.2 transactions.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse the response from a GetDomain request. [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given an configuration js object, writ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parse the response from a GetDomain request.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cell [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/CSWGetRecords-js.html b/doc/apidocs/files/OpenLayers/Format/CSWGetRecords-js.html
new file mode 100644
index 0000000..db6d986
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/CSWGetRecords-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.CSWGetRecords.DEFAULTS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CConstant"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>DEFAULTS</h1><div class=CBody><p>{Object} Default properties for the CSWGetRecords format.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html b/doc/apidocs/files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html
new file mode 100644
index 0000000..13f58a8
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.CSWGetRecords.v2_0_2 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>v2_0_2</h1><div class=CBody><p>A format for creating CSWGetRecords v2.0.2 transactions.  Create a new instance with the <a href="#OpenLayers.Format.CSWGetRecords.v2_0_2.OpenLayers.Format.CSWGetRecords.v2_0_2" class=LConstructor id=link2 onMouseOver= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.requestId"></a>requestId</h3><div class=CBody><p>{String} Value of the requestId attribute of the GetRecords element.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.resultType"></a>resultType</h3><div class=CBody><p>{String} Value of the resultType attribute of the GetRecords element, specifies the result type in the GetRecords response, “hits” is the default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.outputFormat"></a>outputFormat</h3><div class=CBody><p>{String} Value of the outputFormat attribute of the GetRecords element, specifies the format of the GetRecords response, “application/xml” is the default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.outputSchema"></a>outputSchema</h3><div class=CBody><p>{String} Value of the outputSchema attribute of the GetRecords element, specifies the schema of the GetRecords response.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.startPosition"></a>startPosition</h3><div class=CBody><p>{String} Value of the startPosition attribute of the GetRecords element, specifies the start position (offset+1) for the GetRecords response, 1 is the default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.maxRecords"></a>maxRecords</h3><div class=CBody><p>{String} Value of the maxRecords attribute of the GetRecords element, specifies the maximum number of records in the GetRecords response, 10 is the default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.DistributedSearch"></a>DistributedSearch</h3><div class=CBody><p>{String} Value of the csw:DistributedSearch element, used when writing a csw:GetRecords document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.ResponseHandler"></a>ResponseHandler</h3><div class=CBody><p>{Array({String})} Values of the csw:ResponseHandler elements, used when writting a csw:GetRecords document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.Query"></a>Query</h3><div class=CBody><p>{String} Value of the csw:Query element, used when writing a csw:GetRecords document.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.OpenLayers.Format.CSWGetRecords.v2_0_2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>v2_0_2</h3><div class=CBody><p>A class for parsing and generating CSWGetRecords v2.0.2 transactions.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse the response from a GetRecords reques [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parse the response from a GetRecords request.</div></div><div class=CToolTip id="tt2"><div class=CConstructor>A class for parsing and gene [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/Context-js.html b/doc/apidocs/files/OpenLayers/Format/Context-js.html
new file mode 100644
index 0000000..d444dee
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/Context-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Context - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Context"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Context</h1><div class=CBody><p>Base class for both Format.WMC and Format.OWSContext</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Format.Cont [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.OpenLayers.Format.Context"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Context</h3><div class=CBody><p>Create a new parser for Context documents.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on th [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.OpenLayers.Format.Context.serviceTypes"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Context.<span class=HB> </span>serviceTypes</h3><div class=CBody><p>Enumeration for service types</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read Context data from a string, and return an object with map properties and a [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/Filter-js.html b/doc/apidocs/files/OpenLayers/Format/Filter-js.html
new file mode 100644
index 0000000..18a176f
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/Filter-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Filter - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Filter"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter</h1><div class=CBody><p>Read/Wite ogc:Filter.  Create a new instance with the <a href="#OpenLayers.Format.Filter.OpenLayers.Format.Filter" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.Filter</a> constructor.</p><h4 clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.OpenLayers.Format.Filter"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter</h3><div class=CBody><p>Create a new parser for Filter.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read and Filter doc and return an object representing the [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([6, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Write an ogc:Filter given a filter object.</div></div><div class=CToolTip id [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/Filter/v1-js.html b/doc/apidocs/files/OpenLayers/Format/Filter/v1-js.html
new file mode 100644
index 0000000..430a6a9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/Filter/v1-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Filter.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Filter.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.v1</h1><div class=CBody><p>Superclass for Filter version 1 parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.XML</a></li></ul><! [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.OpenLayers.Format.Filter.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.v1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../Filter-js.html#OpenLayers.Format.Filter" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.Filter</a> constructor instead.< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([6, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read and write XML. </div></div><div class=CToolTip id="tt2"><div class=CClass>Read/Wite ogc:Filter. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/Filter/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Format/Filter/v1_0_0-js.html
new file mode 100644
index 0000000..338ac62
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/Filter/v1_0_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Filter.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Write ogc:Filter version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../GML/v2-js.html#OpenLayers.Format.GML.v2" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayer [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.OpenLayers.Format.Filter.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../Filter-js.html#OpenLayers.Format.Filter" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Form [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([6, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Parses GML version 2.</div></div><div class=CToolTip id="tt2"><div class=CClass>Superclass for Filter version 1 parsers.</div></div><div class=CToolTip id="tt3"><div class=CClass>Read/Wite ogc:Filter. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/Filter/v1_1_0-js.html b/doc/apidocs/files/OpenLayers/Format/Filter/v1_1_0-js.html
new file mode 100644
index 0000000..411e6aa
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/Filter/v1_1_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Filter.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Write ogc:Filter version 1.1.0.</p><h4 class=CHeading>Differences from the v1.0.0 parser</h4><ul><li>uses GML v3 instead of GML v2</li><li>reads matchCase attribute on ogc:PropertyIsEqual and ogc:PropertyIsNotEqualelements.</li><li>write [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.1.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.OpenLayers.Format.Filter.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../Filter-js.html#OpenLayers.Format.Filter" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Form [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([6, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Superclass for Filter version 1 parsers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read/Wite ogc:Filter. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/GML-js.html b/doc/apidocs/files/OpenLayers/Format/GML-js.html
new file mode 100644
index 0000000..fd05ef3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/GML-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GML"></a>OpenLayers.<span class=HB> </span>Format.GML</h1><div class=CBody><p>Read/Wite GML.  Create a new instance with the <a href="#OpenLayers.Format.GML.OpenLayers.Format.GML" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Format.GML</a> constructor.   Supports the GML simple features profile.</p><h4  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.featureNS"></a>featureNS</h3><div class=CBody><p>{String} Namespace used for feature attributes.   Default is “<a href="http://mapserver.gis.umn.edu/mapserver" class=LURL target=_top>http://mapserver.gis.umn.edu/mapserver</a>”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.featurePrefix"></a>featurePrefix</h3><div class=CBody><p>{String} Namespace alias (or prefix) for feature nodes.   Default is “feature”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.featureName"></a>featureName</h3><div class=CBody><p>{String} Element name for features.  Default is “featureMember”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.layerName"></a>layerName</h3><div class=CBody><p>{String} Name of data layer.  Default is “features”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.geometryName"></a>geometryName</h3><div class=CBody><p>{String} Name of geometry element.   Defaults to “geometry”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.collectionName"></a>collectionName</h3><div class=CBody><p>{String} Name of featureCollection element.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.gmlns"></a>gmlns</h3><div class=CBody><p>{String} GML Namespace.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from GML.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) Changing is not recommended, a new Format should be instantiated.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.OpenLayers.Format.GML"></a>OpenLayers.<span class=HB> </span>Format.GML</h3><div class=CBody><p>Create a new parser for GML.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string, and return a list of features.</p>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Generate a GML document string given a list of featur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometryNode"></a>buildGeometryNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildGeometryNode: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([7, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read data from a string, and return a list of features.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table bo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/GML/Base-js.html b/doc/apidocs/files/OpenLayers/Format/GML/Base-js.html
new file mode 100644
index 0000000..d40d9a6
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/GML/Base-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GML.Base - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GML.Base"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.Base</h1><div class=CBody><p>Superclass for GML parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.XML</a></li></ul><!--START_ND_SUMM [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.featureType"></a>featureType</h3><div class=CBody><p>{Array(String) or String} The local (without prefix) feature typeName(s).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.featureNS"></a>featureNS</h3><div class=CBody><p>{String} The feature namespace.   Must be set in the options at construction.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.geometry"></a>geometry</h3><div class=CBody><p>{String} Name of geometry element.   Defaults to “geometry”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from GML.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.srsName"></a>srsName</h3><div class=CBody><p>{String} URI for spatial reference system.   This is optional for single part geometries and mandatory for collections and multis.  If set, the srsName attribute will be written for all geometries.  Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) Changing is not recommended, a new Format should be instantiated.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.OpenLayers.Format.GML.Base"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.Base</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="v2-js.html#OpenLayers.Format.GML.v2" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.GML.v2</a> or <a href="v3-js.html#OpenLaye [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([7, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read and write XML. </div></div><div class=CToolTip id="tt2"><div class=CClass>Parses GML version 2.</div></div><div class=CToolTip id="tt3"><div class=CClass>Parses GML version 3.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/GML/v2-js.html b/doc/apidocs/files/OpenLayers/Format/GML/v2-js.html
new file mode 100644
index 0000000..7a8ee72
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/GML/v2-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GML.v2 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GML.v2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.v2</h1><div class=CBody><p>Parses GML version 2.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Base-js.html#OpenLayers.Format.GML.Base" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.GML.Base</a></li></ul><!--START_ND_SUMMAR [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.OpenLayers.Format.GML.v2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.v2</h3><div class=CBody><p>Create a parser for GML v2.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td>< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([7, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Superclass for GML parsers.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/GML/v3-js.html b/doc/apidocs/files/OpenLayers/Format/GML/v3-js.html
new file mode 100644
index 0000000..6ad4aa3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/GML/v3-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GML.v3 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GML.v3"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.v3</h1><div class=CBody><p>Parses GML version 3.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Base-js.html#OpenLayers.Format.GML.Base" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.GML.Base</a></li></ul><!--START_ND_SUMMAR [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.OpenLayers.Format.GML.v3"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.v3</h3><div class=CBody><p>Create a parser for GML v3.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td>< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([7, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Superclass for GML parsers.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/GPX-js.html b/doc/apidocs/files/OpenLayers/Format/GPX-js.html
new file mode 100644
index 0000000..f0b9e40
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/GPX-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GPX - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GPX"></a>OpenLayers.<span class=HB> </span>Format.GPX</h1><div class=CBody><p>Read/write GPX parser.  Create a new instance with the <a href="#OpenLayers.Format.GPX.OpenLayers.Format.GPX" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.GPX</a> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractWaypoints"></a>extractWaypoints</h3><div class=CBody><p>{Boolean} Extract waypoints from GPX.  (default: true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractTracks"></a>extractTracks</h3><div class=CBody><p>{Boolean} Extract tracks from GPX.  (default: true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractRoutes"></a>extractRoutes</h3><div class=CBody><p>{Boolean} Extract routes from GPX.  (default: true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract feature attributes from GPX.  (default: true) NOTE: Attributes as part of extensions to the GPX standard may not be extracted.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.OpenLayers.Format.GPX"></a>OpenLayers.<span class=HB> </span>Format.GPX</h3><div class=CBody><p>Create a new parser for GPX.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>doc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of features from a GPX doc</p><h4 class=CHeadin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>doc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Return a list of features from a GPX doc</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new parser for GPX.</div> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/GeoJSON-js.html b/doc/apidocs/files/OpenLayers/Format/GeoJSON-js.html
new file mode 100644
index 0000000..cc1ae0b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/GeoJSON-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GeoJSON - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GeoJSON"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoJSON</h1><div class=CBody><p>Read and write GeoJSON.  Create a new parser with the <a href="#OpenLayers.Format.GeoJSON.OpenLayers.Format.GeoJSON" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.GeoJSON</a> constructor.</p><h4 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.ignoreExtraDims"></a>ignoreExtraDims</h3><div class=CBody><p>{Boolean} Ignore dimensions higher than 2 when reading geometry coordinates.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.OpenLayers.Format.GeoJSON"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoJSON</h3><div class=CBody><p>Create a new parser for GeoJSON.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instanc [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>json,</td></tr><tr><td></td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>pretty</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>json,</td></tr><tr><td></td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Deserialize a GeoJSON st [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/GeoRSS-js.html b/doc/apidocs/files/OpenLayers/Format/GeoRSS-js.html
new file mode 100644
index 0000000..c90248d
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/GeoRSS-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GeoRSS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GeoRSS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoRSS</h1><div class=CBody><p>Read/write GeoRSS parser.  Create a new instance with the <a href="#OpenLayers.Format.GeoRSS.OpenLayers.Format.GeoRSS" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.GeoRSS</a> constructor.</p><h4  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.rssns"></a>rssns</h3><div class=CBody><p>{String} RSS namespace to use.  Defaults to “<a href="http://backend.userland.com/rss2" class=LURL target=_top>http://backend.userland.com/rss2</a>”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.featurens"></a>featurens</h3><div class=CBody><p>{String} Feature Attributes namespace.   Defaults to “<a href="http://mapserver.gis.umn.edu/mapserver" class=LURL target=_top>http://mapserver.gis.umn.edu/mapserver</a>”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.georssns"></a>georssns</h3><div class=CBody><p>{String} GeoRSS namespace to use.   Defaults to “<a href="http://www.georss.org/georss" class=LURL target=_top>http://www.georss.org/georss</a>”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.geons"></a>geons</h3><div class=CBody><p>{String} W3C Geo namespace to use.   Defaults to “<a href="http://www.w3.org/2003/01/geo/wgs84_pos#" class=LURL target=_top>http://www.w3.org/2003/01/geo/wgs84_pos#</a>”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.featureTitle"></a>featureTitle</h3><div class=CBody><p>{String} Default title for features.   Defaults to “Untitled”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.featureDescription"></a>featureDescription</h3><div class=CBody><p>{String} Default description for features.   Defaults to “No Description”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x) For GeoRSS the default is (y,x), therefore: false</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.OpenLayers.Format.GeoRSS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoRSS</h3><div class=CBody><p>Create a new parser for GeoRSS.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Accept Feature Collection, and return a string.</p [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Accept Feature Collection, and return a string.</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new parser f [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/JSON-js.html b/doc/apidocs/files/OpenLayers/Format/JSON-js.html
new file mode 100644
index 0000000..d1d1067
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/JSON-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.JSON - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.JSON"></a>OpenLayers.<span class=HB> </span>Format.JSON</h1><div class=CBody><p>A parser to read/write JSON safely.   Create a new instance with the <a href="#OpenLayers.Format.JSON.OpenLayers.Format.JSON" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.JSON</a> constructor.</p><h4 class=CHeading>Inherit [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.indent"></a>indent</h3><div class=CBody><p>{String} For “pretty” printing, the indent string will be used once for each indentation level.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.space"></a>space</h3><div class=CBody><p>{String} For “pretty” printing, the space string will be used after the “:” separating a name/value pair.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.newline"></a>newline</h3><div class=CBody><p>{String} For “pretty” printing, the newline string will be used at the end of each name/value pair or array item.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.OpenLayers.Format.JSON"></a>OpenLayers.<span class=HB> </span>Format.JSON</h3><div class=CBody><p>Create a new parser for JSON.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>json,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>D [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>value,</td></tr><tr><td></td><td class=PParameter nowrap>pretty</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>json,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Deserialize a json string.</div></div><div class=CToolTip id="tt2"><div class=CF [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/KML-js.html b/doc/apidocs/files/OpenLayers/Format/KML-js.html
new file mode 100644
index 0000000..7a41a6d
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/KML-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.KML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.KML"></a>OpenLayers.<span class=HB> </span>Format.KML</h1><div class=CBody><p>Read/Write KML.  Create a new instance with the <a href="#OpenLayers.Format.KML.OpenLayers.Format.KML" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Format.KML</a> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.kmlns"></a>kmlns</h3><div class=CBody><p>{String} KML Namespace to use.  Defaults to 2.0 namespace.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.placemarksDesc"></a>placemarksDesc</h3><div class=CBody><p>{String} Name of the placemarks.   Default is “No description available”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.foldersName"></a>foldersName</h3><div class=CBody><p>{String} Name of the folders.   Default is “OpenLayers export”.  If set to null, no name element will be created.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.foldersDesc"></a>foldersDesc</h3><div class=CBody><p>{String} Description of the folders.  Default is “Exported on [date].”  If set to null, no description element will be created.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from KML.   Default is true.  Extracting styleUrls requires this to be set to true</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.extractTracks"></a>extractTracks</h3><div class=CBody><p>{Boolean} Extract gx:Track elements from Placemark elements.   Default is false.   If true, features will be generated for all points in all gx:Track elements.   Features will have a when (Date) attribute based on when elements in the track.   If tracks include angle elements, features will have heading, tilt, and roll attri [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.trackAttributes"></a>trackAttributes</h3><div class=CBody><p>{Array} If <a href="#OpenLayers.Format.KML.extractTracks" class=LProperty id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">extractTracks</a> is true, points within gx:Track elements will be parsed as features with when, heading, tilt, and roll attributes.  Any additional attribute names can be provided  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.maxDepth"></a>maxDepth</h3><div class=CBody><p>{Integer} Maximum depth for recursive loading external KML URLs Defaults to 0: do no external fetching</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.OpenLayers.Format.KML"></a>OpenLayers.<span class=HB> </span>Format.KML</h3><div class=CBody><p>Create a new parser for KML.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string, and return a list of features.</p>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Accept Feature Collection, and return a string.</p><h [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>{Boolean} Extract gx:Track elements from Placemark elements. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read data from  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/OSM-js.html b/doc/apidocs/files/OpenLayers/Format/OSM-js.html
new file mode 100644
index 0000000..fe0c6b4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/OSM-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OSM - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OSM"></a>OpenLayers.<span class=HB> </span>Format.OSM</h1><div class=CBody><p>OSM parser.  Create a new instance with the <a href="#OpenLayers.Format.OSM.OpenLayers.Format.OSM" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.OSM</a> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XM [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.checkTags"></a>checkTags</h3><div class=CBody><p>{Boolean} Should tags be checked to determine whether something should be treated as a seperate node.  Will slow down parsing.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.areaTags"></a>areaTags</h3><div class=CBody><p>{Array} List of tags indicating that something is an area.  Must be set when creating the format.  Will only be used if checkTags is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.OpenLayers.Format.OSM"></a>OpenLayers.<span class=HB> </span>Format.OSM</h3><div class=CBody><p>Create a new parser for OSM.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a list of features, returns a serialized OSM fo [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Takes a list of features, returns a serialized OSM format file for use in tools like JOSM.</div></div><div class=CToolTip id="tt2"><d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1-js.html b/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1-js.html
new file mode 100644
index 0000000..2e5806a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSCommon.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSCommon.v1</h1><div class=CBody><p>Common readers and writers for OWSCommon v1.X formats</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([14, 15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1_0_0-js.html
new file mode 100644
index 0000000..a0d7b80
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1_0_0-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSCommon.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSCommon.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Parser for OWS Common version 1.0.0 which can be used by other parsers.  It is not intended to be used on its own.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([14, 15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1_1_0-js.html b/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1_1_0-js.html
new file mode 100644
index 0000000..38f9d68
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/OWSCommon/v1_1_0-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSCommon.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSCommon.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Parser for OWS Common version 1.1.0 which can be used by other parsers.  It is not intended to be used on its own.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([14, 15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/OWSContext-js.html b/doc/apidocs/files/OpenLayers/Format/OWSContext-js.html
new file mode 100644
index 0000000..1736ef9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/OWSContext-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSContext - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSContext"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext</h1><div class=CBody><p>Read and write OWS Context documents.  OWS Context documents are a preliminary OGC (Open Geospatial Consortium) standard for storing the state of a web mapping application.  In a way it is the successor to Web Map Context (WMC), since it is more generic an [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “0.3.1”.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/OWSContext/v0_3_1-js.html b/doc/apidocs/files/OpenLayers/Format/OWSContext/v0_3_1-js.html
new file mode 100644
index 0000000..932c46a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/OWSContext/v0_3_1-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSContext.v0_3_1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext.<span class=HB> </span>v0_3_1</h1><div class=CBody><p>Read and write OWSContext version 0.3.1.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3') [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 0.3.1</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from GML.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) Changing is not recommended, a new Format should be instantiated.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.OpenLayers.Format.OWSContext.v0_3_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext.<span class=HB> </span>v0_3_1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../OWSContext-js.html#OpenLayers.Format.OWSContext" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read OWS context data from a string or DOMElem [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read OWS context data from a string or DOMElement, and return a list of layers.</div></div><div class=CToolTip id="tt2"><div class=CFuncti [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/SLD-js.html b/doc/apidocs/files/OpenLayers/Format/SLD-js.html
new file mode 100644
index 0000000..aee4e6c
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/SLD-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SLD - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SLD"></a>OpenLayers.<span class=HB> </span>Format.SLD</h1><div class=CBody><p>Read/Wite SLD.  Create a new instance with the <a href="#OpenLayers.Format.SLD.OpenLayers.Format.SLD" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.SLD</a> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.namedLayersAsArray"></a>namedLayersAsArray</h3><div class=CBody><p>{Boolean} Generate a namedLayers array.   If false, the namedLayers property value will be an object keyed by layer name.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.OpenLayers.Format.SLD"></a>OpenLayers.<span class=HB> </span>Format.SLD</h3><div class=CBody><p>Create a new parser for SLD.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>sld,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>R [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([8, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>sld,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Write a SLD document given a list of styles.</div></div><div class=CToolTip id= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/SLD/v1-js.html b/doc/apidocs/files/OpenLayers/Format/SLD/v1-js.html
new file mode 100644
index 0000000..5458099
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/SLD/v1-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SLD.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SLD.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SLD.v1</h1><div class=CBody><p>Superclass for SLD version 1 parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Filter/v1_0_0-js.html#OpenLayers.Format.Filter.v1_0_0" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.Filter.v [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.multipleSymbolizers"></a>multipleSymbolizers</h3><div class=CBody><p>{Boolean} Support multiple symbolizers per rule.   Default is false.   if true, an OpenLayers.Style2 instance will be created to represent user styles instead of an OpenLayers.Style instace.   The OpenLayers.Style2 class allows collections of rules with multiple symbolizers, but is not currently useful for client s [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.defaultSymbolizer"></a>defaultSymbolizer.</h3><div class=CBody><p>{Object} A symbolizer with the SLD defaults.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.OpenLayers.Format.SLD.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SLD.v1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../SLD-js.html#OpenLayers.Format.SLD" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.SLD</a> constructor instead.</p><h4 class=CHead [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([8, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Write ogc:Filter version 1.0.0.</div></div><div class=CToolTip id="tt2"><div class=CProperty>{Object} A symbolizer with the SLD defaults.</div></div><div class=CToolTip id="tt3"><div class=CClass>Read/Wite SLD. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/SLD/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Format/SLD/v1_0_0-js.html
new file mode 100644
index 0000000..2a0e0fa
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/SLD/v1_0_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SLD.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SLD.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Write SLD version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1-js.html#OpenLayers.Format.SLD.v1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.SLD.v1</a>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.OpenLayers.Format.SLD.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SLD.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../SLD-js.html#OpenLayers.Format.SLD" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.SLD</a> cons [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([8, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Superclass for SLD version 1 parsers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read/Wite SLD. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/SOSCapabilities-js.html b/doc/apidocs/files/OpenLayers/Format/SOSCapabilities-js.html
new file mode 100644
index 0000000..ee32adc
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/SOSCapabilities-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SOSCapabilities - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SOSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSCapabilities</h1><div class=CBody><p>Read SOS Capabilities.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.XML</a></li></ul><!--START_N [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.OpenLayers.Format.SOSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSCapabilities</h3><div class=CBody><p>Create a new parser for SOS capabilities.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose prope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and return [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return information about the service (offering and observedProperty mostly).</div></div><div cla [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/SOSCapabilities/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Format/SOSCapabilities/v1_0_0-js.html
new file mode 100644
index 0000000..26c1ac0
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/SOSCapabilities/v1_0_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SOSCapabilities.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSCapabilities.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Read SOS Capabilities version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../SOSCapabilities-js.html#OpenLayers.Format.SOSCapabilities" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.OpenLayers.Format.SOSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSCapabilities.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Create a new parser for SOS capabilities version 1.0.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return info about the SOS.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read SOS Ca [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/SOSGetFeatureOfInterest-js.html b/doc/apidocs/files/OpenLayers/Format/SOSGetFeatureOfInterest-js.html
new file mode 100644
index 0000000..78fee79
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/SOSGetFeatureOfInterest-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SOSGetFeatureOfInterest - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSGetFeatureOfInterest</h1><div class=CBody><p>Read and write SOS GetFeatureOfInterest.  This is used to get to the location of the features (stations).  The stations can have 1 or more sensors.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Fo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.OpenLayers.Format.SOSGetFeatureOfInterest"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSGetFeatureOfInterest</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on thi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse a GetFeatureOfInterest response an [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parse a GetFeatureOfInterest response and return an array of features</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and w [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/SOSGetObservation-js.html b/doc/apidocs/files/OpenLayers/Format/SOSGetObservation-js.html
new file mode 100644
index 0000000..68f5dd1
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/SOSGetObservation-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SOSGetObservation - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SOSGetObservation"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSGetObservation</h1><div class=CBody><p>Read and write SOS GetObersation (to get the actual values from a sensor) version 1.0.0</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.OpenLayers.Format.SOSGetObservation"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSGetObservation</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read and write XML. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/Text-js.html b/doc/apidocs/files/OpenLayers/Format/Text-js.html
new file mode 100644
index 0000000..89850a4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/Text-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Text - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Text"></a>OpenLayers.<span class=HB> </span>Format.Text</h1><div class=CBody><p>Read Text format.  Create a new instance with the <a href="#OpenLayers.Format.Text.OpenLayers.Format.Text" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.Text</a> constructor.  This reads text which is formatted like CS [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.defaultStyle"></a>defaultStyle</h3><div class=CBody><p>defaultStyle allows one to control the default styling of the features.  It should be a symbolizer hash.  By default, this is set to match the Layer.Text behavior, which is to use the default OpenLayers Icon.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.extractStyles"></a>extractStyles</h3><div class=CBody><p>set to true to extract styles from the TSV files, using information from the image or icon, iconSize and iconOffset fields.  This will result in features with a symbolizer (style) property set, using the default symbolizer specified in <a href="#OpenLayers.Format.Text.defaultStyle" class=LProperty id=link5 onMouseOver="ShowTip(event, 'tt5 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.OpenLayers.Format.Text"></a>OpenLayers.<span class=HB> </span>Format.Text</h3><div class=CBody><p>Create a new parser for TSV Text.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>text</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of features from a Tab Seperated Values text  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>text</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Return a list of features from a Tab Seperated Values text string.</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFS-js.html b/doc/apidocs/files/OpenLayers/Format/WFS-js.html
new file mode 100644
index 0000000..aa7bc4a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFS-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFS"></a>OpenLayers.<span class=HB> </span>Format.WFS</h1><div class=CBody><p>Read/Write WFS.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="GML-js.html#OpenLayers.Format.GML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.GML</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.wfsns"></a>wfsns</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.OpenLayers.Format.WFS"></a>OpenLayers.<span class=HB> </span>Format.WFS</h3><div class=CBody><p>Create a WFS-T formatter.  This requires a layer: that layer should have two properties: geometry_column and typename.  The parser for this format is subclassed entirely from GML: There is a writer only, which uses most of the code from the GML layer, and wraps it in transactional elements.</p [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Remove ciruclar ref to layer</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Remove ciruclar ref to layer</div></div><div class=CToolTip id="tt2"><div class=CClass>Read/Wite GML. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFSCapabilities-js.html b/doc/apidocs/files/OpenLayers/Format/WFSCapabilities-js.html
new file mode 100644
index 0000000..ad4edb9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFSCapabilities-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSCapabilities - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities</h1><div class=CBody><p>Read WFS Capabilities.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.XML</a></li></ul><!--START_N [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.1.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.OpenLayers.Format.WFSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities</h3><div class=CBody><p>Create a new parser for WFS capabilities.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose prope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and return [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([9, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return a list of layers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and writ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1-js.html b/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1-js.html
new file mode 100644
index 0000000..8671cec
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSCapabilities.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities.v1</h1><div class=CBody><p>Abstract class not to be instantiated directly.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.F [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.OpenLayers.Format.WFSCapabilities.v1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities.v1_1</h3><div class=CBody><p>Create an instance of one of the subclasses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional ob [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and ret [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([9, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return a list of layers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and writ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1_0_0-js.html
new file mode 100644
index 0000000..37dd1ab
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1_0_0-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSCapabilities/v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities/<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Read WMS Capabilities version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../WFSCapabilities-js.html#OpenLayers.Format.WFSCapabilities" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.OpenLayers.Format.WFSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Create a new parser for WFS capabilities version 1.0.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([9, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read WFS Capabilities.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1_1_0-js.html b/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1_1_0-js.html
new file mode 100644
index 0000000..f5c0855
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFSCapabilities/v1_1_0-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSCapabilities/v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities/<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Read WFS Capabilities version 1.1.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../WFSCapabilities-js.html#OpenLayers.Format.WFSCapabilities" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_1_0.OpenLayers.Format.WFSCapabilities.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>Create a new parser for WFS capabilities version 1.1.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([9, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read WFS Capabilities.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFSDescribeFeatureType-js.html b/doc/apidocs/files/OpenLayers/Format/WFSDescribeFeatureType-js.html
new file mode 100644
index 0000000..91e92c3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFSDescribeFeatureType-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSDescribeFeatureType - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CConstructor"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSDescribeFeatureType"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSDescribeFeatureType</h1><div class=CBody><p>Create a new parser for WFS DescribeFeatureType responses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An o [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFST-js.html b/doc/apidocs/files/OpenLayers/Format/WFST-js.html
new file mode 100644
index 0000000..0e8fae3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFST-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFST.DEFAULTS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CConstant"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFST.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>DEFAULTS</h1><div class=CBody><p>{Object} Default properties for the WFST format.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([10, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFST/v1-js.html b/doc/apidocs/files/OpenLayers/Format/WFST/v1-js.html
new file mode 100644
index 0000000..9b82d92
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFST/v1-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFST.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFST.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.v1</h1><div class=CBody><p>Superclass for WFST parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.XML</a></li></ul><!--START_ND_SUMMA [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.srsName"></a>srsName</h3><div class=CBody><p>{String} URI for spatial reference system.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from GML.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) Changing is not recommended, a new Format should be instantiated.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.OpenLayers.Format.WFST.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.v1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="v1_0_0-js.html#OpenLayers.Format.WFST.v1_0_0" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.WFST.v1_0_0</a> or <a href="v1_1_0-j [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([10, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parse the response from a transaction. </div></div><div class=CToolTip id="tt2" [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFST/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Format/WFST/v1_0_0-js.html
new file mode 100644
index 0000000..3e65049
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFST/v1_0_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFST.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>A format for creating WFS v1.0.0 transactions.   Create a new instance with the <a href="#OpenLayers.Format.WFST.v1_0_0.OpenLayers.Format.WFST.v1_0_0" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut=" [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.srsNameInQuery"></a>srsNameInQuery</h3><div class=CBody><p>{Boolean} If true the reference system is passed in Query requests via the “srsName” attribute to the “wfs:Query” element, this property defaults to false as it isn’t WFS 1.0.0 compliant.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.OpenLayers.Format.WFST.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>A class for parsing and generating WFS v1.0.0 transactions.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} O [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([10, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>A class for parsing and generating WFS v1.0.0 transactions.</div></div><div class=CToolTip id="tt2"><div class=CClass>Write ogc:Filter version 1.0.0.</div></div><div class=CToolTip id="tt3"><div class=CClass>Superclass for WFST parsers.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WFST/v1_1_0-js.html b/doc/apidocs/files/OpenLayers/Format/WFST/v1_1_0-js.html
new file mode 100644
index 0000000..0902eca
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WFST/v1_1_0-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFST.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>A format for creating WFS v1.1.0 transactions.   Create a new instance with the <a href="#OpenLayers.Format.WFST.v1_1_0.OpenLayers.Format.WFST.v1_1_0" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut=" [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.OpenLayers.Format.WFST.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>A class for parsing and generating WFS v1.1.0 transactions.</p><p>To read additional information like hit count (numberOfFeatures) from the  FeatureCollection, call the <a href="v1-js.html#OpenLayers.Format.WFST.v1.read" class=LFuncti [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([10, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>A class for parsing and generating WFS v1.1.0 transactions.</div></div><div class=CToolTip id="tt2"><div class=CClass>Write ogc:Filter version 1.1.0.</div></div><div class=CToolTip id="tt3"><div class=CClass>Superclass for WFST parsers.</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBe [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WKT-js.html b/doc/apidocs/files/OpenLayers/Format/WKT-js.html
new file mode 100644
index 0000000..107ab88
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WKT-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WKT - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WKT"></a>OpenLayers.<span class=HB> </span>Format.WKT</h1><div class=CBody><p>Class for reading and writing Well-Known Text.   Create a new instance with the <a href="#OpenLayers.Format.WKT.OpenLayers.Format.WKT" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.WKT</a> constructor.</p><h4 class=CHeading>I [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WKT.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WKT.OpenLayers.Format.WKT"></a>OpenLayers.<span class=HB> </span>Format.WKT</h3><div class=CBody><p>Create a new parser for WKT</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance</td></tr></table><h4 class=CHeading>Re [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Create a new parser for WKT</div></div><div class=CToolTip id="tt2"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMC-js.html b/doc/apidocs/files/OpenLayers/Format/WMC-js.html
new file mode 100644
index 0000000..326e771
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMC-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMC - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMC"></a>OpenLayers.<span class=HB> </span>Format.WMC</h1><div class=CBody><p>Read and write Web Map Context documents.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.XML</a></li></ul><!--START_ND_SUMMARY--><div class=Summa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.1.0”.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([11, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read and write XML. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMC/v1-js.html b/doc/apidocs/files/OpenLayers/Format/WMC/v1-js.html
new file mode 100644
index 0000000..4fc04ce
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMC/v1-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMC.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMC.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.v1</h1><div class=CBody><p>Superclass for WMC version 1 parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.XML</a></li></ul><!--START_N [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.OpenLayers.Format.WMC.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.v1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../WMC-js.html#OpenLayers.Format.WMC" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.WMC</a> constructor instead.</p><h4 class=CHead [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([11, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read and write XML. </div></div><div class=CToolTip id="tt2"><div class=CClass>Read and write Web Map Context documents.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMC/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Format/WMC/v1_0_0-js.html
new file mode 100644
index 0000000..844b79a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMC/v1_0_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMC.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Read and write WMC version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1-js.html#OpenLayers.Format.WMC.v1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.WM [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.OpenLayers.Format.WMC.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../WMC-js.html#OpenLayers.Format.WMC" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.WMC</a> cons [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([11, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Superclass for WMC version 1 parsers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and write Web Map Context documents.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMC/v1_1_0-js.html b/doc/apidocs/files/OpenLayers/Format/WMC/v1_1_0-js.html
new file mode 100644
index 0000000..780beba
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMC/v1_1_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMC.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Read and write WMC version 1.1.0.</p><h4 class=CHeading>Differences between 1.1.0 and 1.0.0</h4><ul><li>1.1.0 Layers have optional sld:MinScaleDenominator and sld:MaxScaleDenominator</li></ul><h4 class=CHeading>Inherits from</h4><ul><li><a hre [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.1.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.OpenLayers.Format.WMC.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../WMC-js.html#OpenLayers.Format.WMC" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.WMC</a> cons [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([11, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Superclass for WMC version 1 parsers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and write Web Map Context documents.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSCapabilities-js.html b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities-js.html
new file mode 100644
index 0000000..f0f8347
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities</h1><div class=CBody><p>Read WMS Capabilities.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.XML</a></li></ul><!--START_N [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.1.1”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.OpenLayers.Format.WMSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities</h3><div class=CBody><p>Create a new parser for WMS capabilities.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose prope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and return [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return a list of layers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and writ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1-js.html b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1-js.html
new file mode 100644
index 0000000..519f0f7
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.v1</h1><div class=CBody><p>Abstract class not to be instantiated directly.  Creates the common parts for both WMS 1.1.X and WMS 1.3.X.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.OpenLayers.Format.WMSCapabilities.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.v1</h3><div class=CBody><p>Create an instance of one of the subclasses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and ret [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return a list of layers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and writ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1-js.html b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1-js.html
new file mode 100644
index 0000000..2ab63fb
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities.v1_1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.v1_1</h1><div class=CBody><p>Abstract class not to be instantiated directly.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1-js.html#OpenLayers.Format.WMSCapabilities.v1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1' [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract class not to be instantiated directly. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1_0-js.html b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1_0-js.html
new file mode 100644
index 0000000..40d14c8
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1_0-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities/v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities/<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Read WMS Capabilities version 1.1.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1_1-js.html#OpenLayers.Format.WMSCapabilities.v1_1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0.OpenLayers.Format.WMSCapabilities.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>Create a new parser for WMS capabilities version 1.1.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract class not to be instantiated directly.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1_1-js.html b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1_1-js.html
new file mode 100644
index 0000000..f9c8fb2
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_1_1-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities/v1_1_1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities/<span class=HB> </span>v1_1_1</h1><div class=CBody><p>Read WMS Capabilities version 1.1.1.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1_1-js.html#OpenLayers.Format.WMSCapabilities.v1_1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1.OpenLayers.Format.WMSCapabilities.v1_1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.<span class=HB> </span>v1_1_1</h3><div class=CBody><p>Create a new parser for WMS capabilities version 1.1.1.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract class not to be instantiated directly.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_3-js.html b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_3-js.html
new file mode 100644
index 0000000..a6e3765
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_3-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities/v1_3 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_3"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities/<span class=HB> </span>v1_3</h1><div class=CBody><p>Abstract base class for WMS Capabilities version 1.3.X.  SLD 1.1.0 adds in the extra operations DescribeLayer and GetLegendGraphic, see: <a href="http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd" class=LURL ta [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract class not to be instantiated directly. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_3_0-js.html b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_3_0-js.html
new file mode 100644
index 0000000..2dd6e0a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSCapabilities/v1_3_0-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities/v1_3_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_3_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities/<span class=HB> </span>v1_3_0</h1><div class=CBody><p>Read WMS Capabilities version 1.3.0.  SLD 1.1.0 adds in the extra operations DescribeLayer and GetLegendGraphic, see: <a href="http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd" class=LURL target=_top>http: [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSDescribeLayer-js.html b/doc/apidocs/files/OpenLayers/Format/WMSDescribeLayer-js.html
new file mode 100644
index 0000000..c5c6c57
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSDescribeLayer-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSDescribeLayer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSDescribeLayer</h1><div class=CBody><p>Read SLD WMS DescribeLayer response DescribeLayer is meant to couple WMS to WFS and WCS</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.1.1”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.OpenLayers.Format.WMSDescribeLayer"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSDescribeLayer</h3><div class=CBody><p>Create a new parser for WMS DescribeLayer responses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional obje [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read DescribeLayer data from a string, and retu [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([13, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read DescribeLayer data from a string, and return the response. </div></div><div class=CToolTip id="tt2"><div class=CClass>Read and write  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSDescribeLayer/v1_1-js.html b/doc/apidocs/files/OpenLayers/Format/WMSDescribeLayer/v1_1-js.html
new file mode 100644
index 0000000..6cff059
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSDescribeLayer/v1_1-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSDescribeLayer.v1_1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSDescribeLayer.v1_1</h1><div class=CBody><p>Read SLD WMS DescribeLayer response for WMS 1.1.X WMS 1.1.X is tightly coupled to SLD 1.0.0</p><h4 class=CHeading>Example DescribeLayer request</h4><p><a href="http://demo.opengeo.org/geoserver/wms?request=DescribeLayer&version=1.1.1&la [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1.OpenLayers.Format.WMSDescribeLayer"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSDescribeLayer</h3><div class=CBody><p>Create a new parser for WMS DescribeLayer responses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read DescribeLayer data from a string, and [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([13, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read DescribeLayer data from a string, and return the response. </div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMSGetFeatureInfo-js.html b/doc/apidocs/files/OpenLayers/Format/WMSGetFeatureInfo-js.html
new file mode 100644
index 0000000..78fca82
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMSGetFeatureInfo-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSGetFeatureInfo - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSGetFeatureInfo</h1><div class=CBody><p>Class to read GetFeatureInfo responses from Web Mapping Services</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')"> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.layerIdentifier"></a>layerIdentifier</h3><div class=CBody><p>{String} All xml nodes containing this search criteria will populate an internal array of layer nodes.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.featureIdentifier"></a>featureIdentifier</h3><div class=CBody><p>{String} All xml nodes containing this search criteria will populate an internal array of feature nodes for each layer node found.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.OpenLayers.Format.WMSGetFeatureInfo"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSGetFeatureInfo</h3><div class=CBody><p>Create a new parser for WMS GetFeatureInfo responses</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional o [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read WMS GetFeatureInfo data from a string, an [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read WMS GetFeatureInfo data from a string, and return an array of features</div></div><div class=CToolTip id="tt2"><div class=CClass>Read [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMTSCapabilities-js.html b/doc/apidocs/files/OpenLayers/Format/WMTSCapabilities-js.html
new file mode 100644
index 0000000..ae001d4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMTSCapabilities-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMTSCapabilities - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMTSCapabilities</h1><div class=CBody><p>Read WMTS Capabilities.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.XML</a></li></ul><!--STAR [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.yx"></a>yx</h3><div class=CBody><p>{Object} Members in the yx object are used to determine if a CRS URN corresponds to a CRS with y,x axis order.   Member names are CRS URNs and values are boolean.   By default, the following CRS URN are assumed to correspond to a CRS with y,x axis order:</p><ul><li>urn:ogc:def:crs:EPSG::4326</li></ul></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.OpenLayers.Format.WMTSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMTSCapabilities</h3><div class=CBody><p>Create a new parser for WMTS capabilities.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose p [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and retur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.createLayer"></a>createLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createLayer: function(</td><td class=PParameter nowrap>capabilities,</td></tr><tr><td></td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return information about the service (offering and observedProperty mostly).</div></div><div cla [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/WMTSCapabilities/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Format/WMTSCapabilities/v1_0_0-js.html
new file mode 100644
index 0000000..5d841fb
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/WMTSCapabilities/v1_0_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMTSCapabilities.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMTSCapabilities.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Read WMTS Capabilities version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../WMTSCapabilities-js.html#OpenLayers.Format.WMTSCapabilities" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', ' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.OpenLayers.Format.WMTSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMTSCapabilities.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Create a new parser for WMTS capabilities version 1.0.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, an [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return info about the WMTS.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read WMTS  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Format/XML-js.html b/doc/apidocs/files/OpenLayers/Format/XML-js.html
new file mode 100644
index 0000000..a6a1060
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Format/XML-js.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.XML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.XML"></a>OpenLayers.<span class=HB> </span>Format.XML</h1><div class=CBody><p>Read and write XML.   For cross-browser XML generation, use methods on an instance of the XML format class instead of on <code>document<end>.  The DOM creation and traversing methods exposed here all mimic the W3C XML DOM methods.   Create a new parser with the <a href="#Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.OpenLayers.Format.XML"></a>OpenLayers.<span class=HB> </span>Format.XML</h3><div class=CBody><p>Construct an XML parser.   The parser is used to read and write XML.  Reading XML from a string returns a DOM element.   Writing XML from a DOM element returns a string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Serialize a DOM node into a XML string.</p><h4 class=CHea [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.createElementNS"></a>createElementNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createElementNS: function(</td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.createTextNode"></a>createTextNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createTextNode: function(</td><td class=PParameter nowrap>text</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a text node.   Thi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getElementsByTagNameNS"></a>getElementsByTagNameNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getElementsByTagNameNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParamete [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getAttributeNodeNS"></a>getAttributeNodeNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getAttributeNodeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>nam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getAttributeNS"></a>getAttributeNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getAttributeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getChildValue"></a>getChildValue</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getChildValue: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>def</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.concatChildValues"></a>concatChildValues</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>concatChildValues: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>def</td><td class=PAfterParameters nowrap>)</td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.isSimpleContent"></a>isSimpleContent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isSimpleContent: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test if the given node has  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.contentType"></a>contentType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>contentType: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine the content type for a given  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.hasAttributeNS"></a>hasAttributeNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>hasAttributeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.setAttributeNS"></a>setAttributeNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setAttributeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getChildEl"></a>getChildEl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getChildEl: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>uri</td><td class=PAfterPa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getNextEl"></a>getNextEl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNextEl: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>uri</td><td class=PAfterParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.lookupNamespaceURI"></a>lookupNamespaceURI</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>lookupNamespaceURI: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>prefix</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.OpenLayers.Format.XML.lookupNamespaceURI"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>XML.<span class=HB> </span>lookupNamespaceURI</h3><div class=CBody><p>Takes a prefix and returns the namespace URI associated with it on the given node if found (and null if not).  Supplying null for the prefix will return the default namespace.</p><p>For browsers that support it, this c [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>node</td><td class=PAfterPara [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry-js.html b/doc/apidocs/files/OpenLayers/Geometry-js.html
new file mode 100644
index 0000000..8fbe7ef
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry"></a>OpenLayers.<span class=HB> </span>Geometry</h1><div class=CBody><p>A Geometry is a description of a geographic object.   Create an instance of this class with the <a href="#OpenLayers.Geometry.OpenLayers.Geometry" class=LConstructor id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt7')">OpenLayers.Geometry</a> constructor.   This is a  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.OpenLayers.Geometry"></a>OpenLayers.<span class=HB> </span>Geometry</h3><div class=CBody><p>Creates a geometry object.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Create a clone of this geometry.   Does not set any non-standard properties of the cloned geometry.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Geometry.OpenLayers.Geometry" class=LConstructor id=link8 onMouseOver="S [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.getBounds"></a>getBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getBounds: function()</td></tr></table></blockquote><p>Get the bounds for this Geometry.  If bounds is not set, it is calculated again, this makes queries faster.</p><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.calculateBounds"></a>calculateBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote><p>Recalculate the bounds for the geometry.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points in this geom [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.getCentroid"></a>getCentroid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCentroid: function()</td></tr></table></blockquote><p>Calculate the centroid of this geometry.  This method is defined in subclasses.</p><h4 class=CHeading>Returns</h4><p>{<a href="Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link11 onMouseOver=" [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote>Create a clone of this geometry. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getBounds: function()</td></tr></table></blockquote>Get the bounds for this Geometry. </div></div><div class=CToolTip id="tt3"><div class=C [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/Collection-js.html b/doc/apidocs/files/OpenLayers/Geometry/Collection-js.html
new file mode 100644
index 0000000..710b754
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/Collection-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Collection - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Collection"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Collection</h1><div class=CBody><p>A Collection is exactly what it sounds like: A collection of different Geometries.  These are stored in the local parameter <a href="#OpenLayers.Geometry.Collection.components" class=LProperty id=link20 onMouseOver="ShowTip(event, 'tt20', 'link20')" onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.components"></a>components</h3><div class=CBody><p>{Array(<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt1', 'link25')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry</a>)} The component parts of this geometry</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.OpenLayers.Geometry.Collection"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Collection</h3><div class=CBody><p>Creates a Geometry Collection -- a list of geoms.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="../Geometry-js.html#O [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote><p>Destroy this geometry.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clone this geometry.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Geometry.Collection.OpenLayers.Geometry.Collection" class=LConstructor id=link27 onMouseOver="ShowTip(event, 'tt21', 'link27')" onMouseOut="HideT [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.calculateBounds"></a>calculateBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote><p>Recalculate the bounds by iterating through the components and calling calling extendBounds() on each item.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.addComponents"></a>addComponents</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addComponents: function(</td><td class=PParameter nowrap>components</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add components to  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.removeComponents"></a>removeComponents</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponents: function(</td><td class=PParameter nowrap>components</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove co [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getLength"></a>getLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote><p>Calculate the length of this geometry</p><h4 class=CHeading>Returns</h4><p>{Float} The length of the geometry</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><p>Calculate the area of this geometry.  Note how this function is overridden in <a href="Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id=link30 onMouseOver="ShowTip(event, 'tt22', 'link30')" onMouseOut=" [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getGeodesicArea"></a>getGeodesicArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicArea: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getCentroid"></a>getCentroid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getCentroid: function(</td><td class=PParameter nowrap>weighted</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Compute the centroid for t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getGeodesicLength"></a>getGeodesicLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicLength: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calcul [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>M [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.rotate"></a>rotate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>rotate: function(</td><td class=PParameter nowrap>angle,</td></tr><tr><td></td><td class=PParameter nowrap>origin</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.resize"></a>resize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>resize: function(</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>origin,</td></tr><tr><td></td><td class=PParameter nowrap>ratio</td><td class=PAfter [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether another geometry is equ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine if the input geomet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points i [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A Geometry is a description of a geographic object. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote>Destroy this geometry.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/Curve-js.html b/doc/apidocs/files/OpenLayers/Geometry/Curve-js.html
new file mode 100644
index 0000000..05dced4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/Curve-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Curve - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Curve"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Curve</h1><div class=CBody><p>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.</p><h4 class=CHeading>Inherits</h4><ul><li><a href="MultiPoint-js. [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.OpenLayers.Geometry.Curve"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Curve</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>point</td><td class=CDLDescription>{Array(<a href="Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.getLength"></a>getLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The length of the curve</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.getGeodesicLength"></a>getGeodesicLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicLength: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote>{Float} The length of the curve</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicLength: function(</td><td class=PParameter  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/LineString-js.html b/doc/apidocs/files/OpenLayers/Geometry/LineString-js.html
new file mode 100644
index 0000000..a02997d
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/LineString-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.LineString - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.LineString"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>LineString</h1><div class=CBody><p>A LineString is a Curve which, once two points have been added to it, can never be less than two points long.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Curve-js.html#OpenLayers.Geometry.Curve" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.OpenLayers.Geometry.LineString"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>LineString</h3><div class=CBody><p>Create a new LineString geometry</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>points</td><td class=CDLDescription>{Array(<a href="Point-js.html#OpenLayers.Geometry.Point" c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.removeComponent"></a>removeComponent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponent: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Only allows remov [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test for instersection betwee [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points i [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponent: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Only allows removal of a point if there are three or more points in the linestring. </div></div><div class=CToolTip id="tt2">< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/LinearRing-js.html b/doc/apidocs/files/OpenLayers/Geometry/LinearRing-js.html
new file mode 100644
index 0000000..1c94f80
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/LinearRing-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.LinearRing - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.LinearRing"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>LinearRing</h1><div class=CBody><p>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.</p><p>Also, as it is the first in the line family to close itself, a getArea() functi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.OpenLayers.Geometry.LinearRing"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>LinearRing</h3><div class=CBody><p>Linear rings are constructed with an array of points.   This array can represent a closed or open ring.   If the ring is open (the last point does not equal the first point), the constructor will close the ring.   If the ring is already cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.addComponent"></a>addComponent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addComponent: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.removeComponent"></a>removeComponent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponent: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Removes a point f [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>M [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.rotate"></a>rotate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>rotate: function(</td><td class=PParameter nowrap>angle,</td></tr><tr><td></td><td class=PParameter nowrap>origin</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.resize"></a>resize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>resize: function(</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>origin,</td></tr><tr><td></td><td class=PParameter nowrap>ratio</td><td class=PAfter [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.getCentroid"></a>getCentroid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCentroid: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt8', 'link22')" onMouseOut="HideTip('tt8')">OpenLayers.Geometry.Point</a [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Note</td><td class=CDLDescription>The area is positive if the ring is oriented CW, otherwise it will be negative.</td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.getGeodesicArea"></a>getGeodesicArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicArea: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine if the input geomet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points i [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addComponent: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Adds a point to geometry components. </div></div><div class=CToolTip id= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/MultiLineString-js.html b/doc/apidocs/files/OpenLayers/Geometry/MultiLineString-js.html
new file mode 100644
index 0000000..dcfa315
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/MultiLineString-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.MultiLineString - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.MultiLineString"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiLineString</h1><div class=CBody><p>A MultiLineString is a geometry with multiple <a href="LineString-js.html#OpenLayers.Geometry.LineString" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry.LineString</a> components.</p>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.OpenLayers.Geometry.MultiLineString"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiLineString</h3><div class=CBody><p>Constructor for a MultiLineString Geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="LineString-j [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A LineString is a Curve which, once two points have been added to it, can never be less than two points long.</div></div><div class=CToolTip id="tt2"><div class=CClass>A Collection is exactly what it sounds like: A collection of different Geometries. </div></div><div class=CToolTip id="tt3"><div class=CClass>A Geometry is a description of a geographic object. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/MultiPoint-js.html b/doc/apidocs/files/OpenLayers/Geometry/MultiPoint-js.html
new file mode 100644
index 0000000..3da6aa0
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/MultiPoint-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.MultiPoint - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.MultiPoint"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiPoint</h1><div class=CBody><p>MultiPoint is a collection of Points.   Create a new instance with the <a href="#OpenLayers.Geometry.MultiPoint.OpenLayers.Geometry.MultiPoint" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.G [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.OpenLayers.Geometry.MultiPoint"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiPoint</h3><div class=CBody><p>Create a new MultiPoint Geometry</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="Point-js.html#OpenLayers.Geometry.Poin [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.addPoint"></a>addPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addPoint: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.removePoint"></a>removePoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removePoint: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Wrapper for <OpenLayers.Ge [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addPoint: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Wrapper for OpenLayers.Geometry.Collection.addComponent</div></div><div clas [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/MultiPolygon-js.html b/doc/apidocs/files/OpenLayers/Geometry/MultiPolygon-js.html
new file mode 100644
index 0000000..14cf4ef
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/MultiPolygon-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.MultiPolygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.MultiPolygon"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiPolygon</h1><div class=CBody><p>MultiPolygon is a geometry with multiple <a href="Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry.Polygon</a> components.   Create a new inst [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPolygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPolygon.OpenLayers.Geometry.MultiPolygon"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiPolygon</h3><div class=CBody><p>Create a new MultiPolygon geometry</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="Polygon-js.html#OpenLayers.Geo [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Polygon is a collection of Geometry.LinearRings.</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new MultiPolygon geometry</div></div><div class=CToolTip id="tt3"><div class=CClass>A Collection is exactly what it sounds like: A collection of different Geometries. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/Point-js.html b/doc/apidocs/files/OpenLayers/Geometry/Point-js.html
new file mode 100644
index 0000000..fad7e6e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/Point-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Point - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Point"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</h1><div class=CBody><p>Point geometry class.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt12', 'link13')" onMouseOut="HideTip('tt12')">OpenLayers.Geometry</a></li></ul><!--START_ND_SUMMARY [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.x"></a>x</h3><div class=CBody><p>{float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.y"></a>y</h3><div class=CBody><p>{float}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.OpenLayers.Geometry.Point"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</h3><div class=CBody><p>Construct a point geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>x</td><td class=CDLDescription>{float}</td></tr><tr><td class=CDLEntry>y</td><td class=CDLDescription>{float}</td> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.G [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals: function(</td><td class=PParameter nowrap>geom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether another geometry is equivalent t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Moves  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.rotate"></a>rotate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>rotate: function(</td><td class=PParameter nowrap>angle,</td></tr><tr><td></td><td class=PParameter nowrap>origin</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.getCentroid"></a>getCentroid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCentroid: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Geometry.Point.OpenLayers.Geometry.Point" class=LConstructor id=link18 onMouseOver="ShowTip(event, 'tt2', 'link18')" onMouseOut="HideTip('tt2')">OpenLayers.Geo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.resize"></a>resize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>resize: function(</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>origin,</td></tr><tr><td></td><td class=PParameter nowrap>ratio</td><td class=PAfterParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine if the input geometry in [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points in thi [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>{OpenLayers.Geometry.Point} An exact clone of this OpenLayers.Geometry.Point</div></div><div class=CToolTip id="tt2"><div class=CConstruct [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/Polygon-js.html b/doc/apidocs/files/OpenLayers/Geometry/Polygon-js.html
new file mode 100644
index 0000000..2ae424c
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/Polygon-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Polygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Polygon"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Polygon</h1><div class=CBody><p>Polygon is a collection of Geometry.LinearRings.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Collection-js.html#OpenLayers.Geometry.Collection" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">OpenLayers.Geome [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.OpenLayers.Geometry.Polygon"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Polygon</h3><div class=CBody><p>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.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><p>Calculated by subtracting the areas of the internal holes from the area of the outer hole.</p><h4 class=CHeading>Returns</h4><p>{float} The area of the geometry</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.getGeodesicArea"></a>getGeodesicArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicArea: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate the a [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine if the input geometry  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.createRegularPolygon"></a>createRegularPolygon</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Geometry.Polygon.createRegularPolygon = function(</td><td class=PParameter nowrap>origin,</td></tr><tr><td></td><td class=PParameter nowrap>radius,</td></t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote>Calculated by subtracting the areas of the internal holes from the area of the outer hole.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowr [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Geometry/Rectangle-js.html b/doc/apidocs/files/OpenLayers/Geometry/Rectangle-js.html
new file mode 100644
index 0000000..9771876
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Geometry/Rectangle-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Rectangle - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Rectangle"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Rectangle</h1><div class=CBody><p>This class is <b>not supported</b>, and probably isn’t what you’re looking for.  Instead, most users probably want something like:</p><blockquote><pre>var poly = new OpenLayers.Bounds(0,0,10,10).toGeometry();</pre></blockquote><p>This will create  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.OpenLayers.Geometry.Rectangle"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Rectangle</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>points</td><td class=CDLDescription>{Array(<a href="Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link4 onMouseOver="ShowTip( [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.getLength"></a>getLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The length of the geometry</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The area of the geometry</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote>{Float} The length of the geometry</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote>{Float} The area of the geometry</div></div><div class=CToolTip id="tt3"><div class= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler-js.html b/doc/apidocs/files/OpenLayers/Handler-js.html
new file mode 100644
index 0000000..07416ef
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler-js.html
@@ -0,0 +1,70 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler"></a>OpenLayers.<span class=HB> </span>Handler</h1><div class=CBody><p>Base class to construct a higher-level handler for event sequences.   All handlers have activate and deactivate methods.   In addition, they have methods named like browser events.   When a handler is activated, any additional methods named like a browser event is registered as a listener for  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.control"></a>control</h3><div class=CBody><p>{<a href="Control-js.html#OpenLayers.Control" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt1', 'link8')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>}.  The control that initialized this handler.   The control is assumed to have a valid map property - that map is used in the handler’s own setMap method.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.keyMask"></a>keyMask</h3><div class=CBody><p>{Integer} Use bitwise operators and one or more of the OpenLayers.Handler constants to construct a keyMask.   The keyMask is used by <checkModifiers>.   If the keyMask matches the combination of keys down on an event, checkModifiers returns true.</p><h4 class=CHeading>Example</h4><blockquote><pre>// handler only responds if the Shift key is down
+handler.keyMask = OpenLayers.Handler.MOD_SHIFT;
+
+// handler only responds if Ctrl-Shift is down
+handler.keyMask = OpenLayers.Handler.MOD_SHIFT |
+                  OpenLayers.Handler.MOD_CTRL;</pre></blockquote></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler"></a>OpenLayers.<span class=HB> </span>Handler</h3><div class=CBody><p>Construct a handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="Control-js.html#OpenLayers.Control" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="Hid [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Turn on the handler.   Returns false if the handler was already active.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Turn off the handler.   Returns false if the handler was already inactive.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was deactivated.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler.MOD_NONE"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MOD_NONE</h3><div class=CBody><p>If set as the <a href="#OpenLayers.Handler.keyMask" class=LProperty id=link10 onMouseOver="ShowTip(event, 'tt4', 'link10')" onMouseOut="HideTip('tt4')">keyMask</a>, <checkModifiers> returns false if any key is down.</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler.MOD_SHIFT"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MOD_SHIFT</h3><div class=CBody><p>If set as the <a href="#OpenLayers.Handler.keyMask" class=LProperty id=link11 onMouseOver="ShowTip(event, 'tt4', 'link11')" onMouseOut="HideTip('tt4')">keyMask</a>, <checkModifiers> returns false if Shift is down.</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler.MOD_CTRL"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MOD_CTRL</h3><div class=CBody><p>If set as the <a href="#OpenLayers.Handler.keyMask" class=LProperty id=link12 onMouseOver="ShowTip(event, 'tt4', 'link12')" onMouseOut="HideTip('tt4')">keyMask</a>, <checkModifiers> returns false if Ctrl is down.</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler.MOD_ALT"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MOD_ALT</h3><div class=CBody><p>If set as the <a href="#OpenLayers.Handler.keyMask" class=LProperty id=link13 onMouseOver="ShowTip(event, 'tt4', 'link13')" onMouseOut="HideTip('tt4')">keyMask</a>, <checkModifiers> returns false if Alt is down.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Turn on the handler. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></tab [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Box-js.html b/doc/apidocs/files/OpenLayers/Handler/Box-js.html
new file mode 100644
index 0000000..d0237f7
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Box-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Box - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Box"></a>OpenLayers.<span class=HB> </span>Handler.Box</h1><div class=CBody><p>Handler for dragging a rectangle across the map.   Box is displayed on mouse down, moves on mouse move, and is finished on mouse up.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')"  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.boxDivClassName"></a>boxDivClassName</h3><div class=CBody><p>{String} The CSS class to use for drawing the box.  Default is olHandlerBoxZoomBox</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.OpenLayers.Handler.Box"></a>OpenLayers.<span class=HB> </span>Handler.Box</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')" [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Click-js.html b/doc/apidocs/files/OpenLayers/Handler/Click-js.html
new file mode 100644
index 0000000..4066f48
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Click-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Click - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Click"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Click</h1><div class=CBody><p>A handler for mouse clicks.   The intention of this handler is to give controls more flexibility with handling clicks.   Browsers trigger click events twice for a double-click.   In addition, the mousedown, mousemove, mouseup sequence fires a click event.&nbs [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.delay"></a>delay</h3><div class=CBody><p>{Number} Number of milliseconds between clicks before the event is considered a double-click.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.single"></a>single</h3><div class=CBody><p>{Boolean} Handle single clicks.   Default is true.   If false, clicks will not be reported.   If true, single-clicks will be reported.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.double"></a>double</h3><div class=CBody><p>{Boolean} Handle double-clicks.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.pixelTolerance"></a>pixelTolerance</h3><div class=CBody><p>{Number} Maximum number of pixels between mouseup and mousedown for an event to be considered a click.   Default is 0.   If set to an integer value, clicks with a drag greater than the value will be ignored.   This property can only be set when the handler is constructed.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.stopSingle"></a>stopSingle</h3><div class=CBody><p>{Boolean} Stop other listeners from being notified of clicks.   Default is false.   If true, any click listeners registered before this one will not be notified of <b>any</b> click event (associated with double or single clicks).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.stopDouble"></a>stopDouble</h3><div class=CBody><p>{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 <b>any</b> double-click events.</p><p>The one caveat with stopDouble is that given a map with two click handlers, one with stopDouble true and the other with stopSingle  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.OpenLayers.Handler.Click"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Click</h3><div class=CBody><p>Create a new click handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link5 onMouseOv [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the handler.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was successfully deactivated.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the handler.</div></div><div class=CToolTip id="tt2"><div class=CProperty>{Number} Maximum number of pixels between mouseup and mousedown for an event to be considered a click. </div></div><div class=CToolTip id="tt3"><div class=CConstructor>Create a new click handler.</div></div><div class=CToolT [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Drag-js.html b/doc/apidocs/files/OpenLayers/Handler/Drag-js.html
new file mode 100644
index 0000000..2c4c909
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Drag-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Drag - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Drag"></a>OpenLayers.<span class=HB> </span>Handler.Drag</h1><div class=CBody><p>The drag handler is used to deal with sequences of browser events related to dragging.   The handler is used by controls that want to know when a drag sequence begins, when a drag is happening, and when it has finished.</p><p>Controls that use the drag handler typically construct it with callb [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.documentDrag"></a>documentDrag</h3><div class=CBody><p>{Boolean} If set to true, the handler will also handle mouse moves when the cursor has moved out of the map viewport.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.OpenLayers.Handler.Drag"></a>OpenLayers.<span class=HB> </span>Handler.Drag</h3><div class=CBody><p>Returns OpenLayers.Handler.Drag</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Returns OpenLayers.Handler.Drag</div></div><div class=CToolTip id="tt2"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt3"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Feature-js.html b/doc/apidocs/files/OpenLayers/Handler/Feature-js.html
new file mode 100644
index 0000000..20b8986
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Feature-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Feature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Feature"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Feature</h1><div class=CBody><p>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.</p><p>This handler stops event propagation for mousedown  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.OpenLayers.Handler.Feature"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Feature</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'l [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Hover-js.html b/doc/apidocs/files/OpenLayers/Handler/Hover-js.html
new file mode 100644
index 0000000..76bb2a6
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Hover-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Hover - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Hover"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Hover</h1><div class=CBody><p>The hover handler is to be used to emulate mouseovers on objects 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.</p><h4 class=CHeading>Inherits from</h4><ul>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.delay"></a>delay</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Integer}</td><td class=CDLDescription>Number of milliseconds between mousemoves before the event is considered a hover.  Default is 500.</td></tr></table></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.pixelTolerance"></a>pixelTolerance</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Integer}</td><td class=CDLDescription>Maximum number of pixels between mousemoves for an event to be considered a hover.  Default is null.</td></tr></table></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.stopMove"></a>stopMove</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Boolean}</td><td class=CDLDescription>Stop other listeners from being notified on mousemoves.  Default is false.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.OpenLayers.Handler.Hover"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Hover</h3><div class=CBody><p>Construct a hover handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link3 onMouseOve [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the handler.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was successfully deactivated.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the handler.</div></div><div class=CToolTip id="tt2"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt3"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Keyboard-js.html b/doc/apidocs/files/OpenLayers/Handler/Keyboard-js.html
new file mode 100644
index 0000000..55a8acf
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Keyboard-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.handler.Keyboard - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.handler.Keyboard"></a>OpenLayers.<span class=HB> </span>handler.<span class=HB> </span>Keyboard</h1><div class=CBody><p>A handler for keyboard events.   Create a new instance with the <a href="#OpenLayers.handler.Keyboard.OpenLayers.Handler.Keyboard" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Handler.Keyboard</a> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.KEY_EVENTS"></a>KEY_EVENTS</h3><div class=CBody><p>keydown, keypress, keyup</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.OpenLayers.Handler.Keyboard"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Keyboard</h3><div class=CBody><p>Returns a new keyboard handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=li [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Returns a new keyboard handler.</div></div><div class=CToolTip id="tt2"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt3"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/MouseWheel-js.html b/doc/apidocs/files/OpenLayers/Handler/MouseWheel-js.html
new file mode 100644
index 0000000..d598508
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/MouseWheel-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.MouseWheel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.MouseWheel"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MouseWheel</h1><div class=CBody><p>Handler for wheel up/down events.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Handler</a></li></ul><!--STA [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.OpenLayers.Handler.MouseWheel"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MouseWheel</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link2 onMouseOver="ShowTip(event,  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Path-js.html b/doc/apidocs/files/OpenLayers/Handler/Path-js.html
new file mode 100644
index 0000000..036b857
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Path-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Path - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Path"></a>OpenLayers.<span class=HB> </span>Handler.Path</h1><div class=CBody><p>Handler to draw a path on the map.   Path is displayed on mouse down, moves on mouse move, and is finished on mouse up.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Point-js.html#OpenLayers.Handler.Point" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.OpenLayers.Handler.Path"></a>OpenLayers.<span class=HB> </span>Handler.Path</h3><div class=CBody><p>Create a new path hander</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'li [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Handler to draw a point on the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Point-js.html b/doc/apidocs/files/OpenLayers/Handler/Point-js.html
new file mode 100644
index 0000000..b62f472
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Point-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Point - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Point"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Point</h1><div class=CBody><p>Handler to draw a point on the map.   Point is displayed on mouse down, moves on mouse move, and is finished on mouse up.   The handler triggers callbacks for ‘done’, ‘cancel’, and ‘modify’.   The modify callback is called  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.multi"></a>multi</h3><div class=CBody><p>{Boolean} Cast features to multi-part geometries before passing to the layer.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.persist"></a>persist</h3><div class=CBody><p>{Boolean} Leave the feature rendered until destroyFeature is called.  Default is false.   If set to true, the feature remains rendered until destroyFeature is called, typically by deactivating the handler or starting another drawing.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.OpenLayers.Handler.Point"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Point</h3><div class=CBody><p>Create a new point handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link6 onMouseOv [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>turn on the handler</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>turn off the handler</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.cancel"></a>cancel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote><p>Finish the geometry and call the “cancel” callback.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>turn on the handler</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>turn off the handler</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><ta [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/Polygon-js.html b/doc/apidocs/files/OpenLayers/Handler/Polygon-js.html
new file mode 100644
index 0000000..0cecf8d
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/Polygon-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Polygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Polygon"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Polygon</h1><div class=CBody><p>Handler to draw a polygon on the map.   Polygon is displayed on mouse down, moves on mouse move, and is finished on mouse up.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Path-js.html#OpenLayers.Handler.Path" class=LClass id=link1 onMouseOver="ShowTip(e [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.OpenLayers.Handler.Polygon"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Polygon</h3><div class=CBody><p>Create a Polygon Handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link3 onMou [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Handler to draw a path on the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt3"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Handler/RegularPolygon-js.html b/doc/apidocs/files/OpenLayers/Handler/RegularPolygon-js.html
new file mode 100644
index 0000000..c64d406
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Handler/RegularPolygon-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.RegularPolygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.RegularPolygon"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>RegularPolygon</h1><div class=CBody><p>Handler to draw a regular polygon on the map.   Polygon is displayed on mouse down, moves or is modified on mouse move, and is finished on mouse up.  The handler triggers callbacks for ‘done’ and ‘cancel’.   Create a  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.sides"></a>sides</h3><div class=CBody><p>{Integer} Number of sides for the regular polygon.   Needs to be greater than 2.   Defaults to 4.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.radius"></a>radius</h3><div class=CBody><p>{Float} Optional radius in map units of the regular polygon.   If this is set to some non-zero value, a polygon with a fixed radius will be drawn and dragged with mose movements.   If this property is not set, dragging changes the radius of the polygon.   Set to null by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.snapAngle"></a>snapAngle</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.snapToggle"></a>snapToggle</h3><div class=CBody><p>{String} If set, snapToggle is checked on mouse events and will set the snap mode to the opposite of what it currently is.   To disallow toggling between snap and non-snap mode, set freehandToggle to null.   Acceptable toggle values are ‘shiftKey’, ‘ctrlKey’, and ‘altKey’.  Snap mode is o [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.persist"></a>persist</h3><div class=CBody><p>{Boolean} Leave the feature rendered until clear is called.   Default is false.   If set to true, the feature remains rendered until clear is called, typically by deactivating the handler or starting another drawing.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.irregular"></a>irregular</h3><div class=CBody><p>{Boolean} Draw an irregular polygon instead of a regular polygon.  Default is false.   If true, the initial mouse down will represent one corner of the polygon bounds and with each mouse movement, the polygon will be stretched so the opposite corner of its bounds follows the mouse position.   This property takes precedence ov [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.OpenLayers.Handler.RegularPolygon"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>RegularPolygon</h3><div class=CBody><p>Create a new regular polygon handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Con [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.setOptions"></a>setOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOptions: function (</td><td class=PParameter nowrap>newOptions</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Turn on the handler.</p><h4 class=CHeading>Return</h4><p>{Boolean} The handler was successfully activated</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Turn off the handler.</p><h4 class=CHeading>Return</h4><p>{Boolean} The handler was successfully deactivated</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.cancel"></a>cancel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote><p>Finish the geometry and call the “cancel” callback.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear any rendered features on the temporary layer.   This is called when the handler is deactivated, canceled, or done (unless persist is true).</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOptions: function (</td><td class=PParameter nowrap>newOptions</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=P [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Icon-js.html b/doc/apidocs/files/OpenLayers/Icon-js.html
new file mode 100644
index 0000000..9641f8b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Icon-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Icon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Icon"></a>OpenLayers.Icon</h1><div class=CBody><p>The icon represents a graphical icon on the screen.   Typically used in conjunction with a <a href="Marker-js.html#OpenLayers.Marker" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Marker</a> to represent markers on a screen.</p><p>An icon has a url, size and position.&nbsp [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.OpenLayers.Icon"></a>OpenLayers.Icon</h3><div class=CBody><p>Creates an icon, which is an image tag in a div.</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>size</td><td class=CDLDescription>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link3 onMouseOver="ShowTip(ev [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.isDrawn"></a>isDrawn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>isDrawn: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the icon is drawn.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>isDrawn: function()</td></tr></table></blockquote>{Boolean} Whether or not the icon is drawn.</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Marker are a combination of a OpenLayers.LonLat and an OpenLayers.Icon.</div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of this class represent a width/height pair</d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang-js.html b/doc/apidocs/files/OpenLayers/Lang-js.html
new file mode 100644
index 0000000..cf93b42
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang"></a>OpenLayers.Lang</h1><div class=CBody><p>Internationalization namespace.   Contains dictionaries in various languages and methods to set and get the current language.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.defaultCode"></a>defaultCode</h3><div class=CBody><p>{String} Default language to use when a specific language can’t be found.   Default is “en”.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.getCode"></a>getCode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCode: function()</td></tr></table></blockquote><p>Get the current language code.</p><h4 class=CHeading>Returns</h4><p>The current language code.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.setCode"></a>setCode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setCode: function(</td><td class=PParameter nowrap>code</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the language code for string translation.   This [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.translate"></a>translate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.OpenLayers.i18n"></a>OpenLayers.i18n</h3><div class=CBody><p>Alias for <a href="#OpenLayers.Lang.translate" class=LFunction id=link10 onMouseOver="ShowTip(event, 'tt3', 'link10')" onMouseOut="HideTip('tt3')">OpenLayers.Lang.translate</a>.   Looks up a key from a dictionary based on the current language string.  The value of <a href="#OpenLayers.Lang.getCode" class=LFunction id=link11 onMouseOver= [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCode: function()</td></tr></table></blockquote>Get the current language code.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setCode: function(</td><td class=PParameter nowrap>code</ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/ar-js.html b/doc/apidocs/files/OpenLayers/Lang/ar-js.html
new file mode 100644
index 0000000..eaf8700
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/ar-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ar”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ar]"></a>OpenLayers.<span class=HB> </span>Lang[“ar”]</h1><div class=CBody><p>Dictionary for العربية.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/be-tarask-js.html b/doc/apidocs/files/OpenLayers/Lang/be-tarask-js.html
new file mode 100644
index 0000000..d914c3d
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/be-tarask-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“be-tarask”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[be-tarask]"></a>OpenLayers.<span class=HB> </span>Lang[“be-tarask”]</h1><div class=CBody><p>Dictionary for Беларуская (тарашкевіца).   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/bg-js.html b/doc/apidocs/files/OpenLayers/Lang/bg-js.html
new file mode 100644
index 0000000..c898c54
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/bg-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“bg”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[bg]"></a>OpenLayers.<span class=HB> </span>Lang[“bg”]</h1><div class=CBody><p>Dictionary for Български.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/br-js.html b/doc/apidocs/files/OpenLayers/Lang/br-js.html
new file mode 100644
index 0000000..6cdafdf
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/br-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“br”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[br]"></a>OpenLayers.<span class=HB> </span>Lang[“br”]</h1><div class=CBody><p>Dictionary for Brezhoneg.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/ca-js.html b/doc/apidocs/files/OpenLayers/Lang/ca-js.html
new file mode 100644
index 0000000..78991f7
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/ca-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ca”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ca]"></a>OpenLayers.<span class=HB> </span>Lang[“ca”]</h1><div class=CBody><p>Dictionary for Catalan, UTF8 encoding.  Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are norma [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/cs-CZ-js.html b/doc/apidocs/files/OpenLayers/Lang/cs-CZ-js.html
new file mode 100644
index 0000000..a51131e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/cs-CZ-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“cs-CZ”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[cs-CZ]"></a>OpenLayers.<span class=HB> </span>Lang[“cs-CZ”]</h1><div class=CBody><p>Dictionary for Česky.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/da-DK-js.html b/doc/apidocs/files/OpenLayers/Lang/da-DK-js.html
new file mode 100644
index 0000000..7bec721
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/da-DK-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“da-DK”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[da-DK]"></a>OpenLayers.<span class=HB> </span>Lang[“da-DK”]</h1><div class=CBody><p>Dictionary for Danish.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/de-js.html b/doc/apidocs/files/OpenLayers/Lang/de-js.html
new file mode 100644
index 0000000..a7e6229
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/de-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“de”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[de]"></a>OpenLayers.<span class=HB> </span>Lang[“de”]</h1><div class=CBody><p>Dictionary for Deutsch.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/el-js.html b/doc/apidocs/files/OpenLayers/Lang/el-js.html
new file mode 100644
index 0000000..e3d3eaf
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/el-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“el”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[el]"></a>OpenLayers.<span class=HB> </span>Lang[“el”]</h1><div class=CBody><p>Dictionary for Ελληνικά.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/en-CA-js.html b/doc/apidocs/files/OpenLayers/Lang/en-CA-js.html
new file mode 100644
index 0000000..2b94f6d
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/en-CA-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“en-CA”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[en-CA]"></a>OpenLayers.<span class=HB> </span>Lang[“en-CA”]</h1><div class=CBody><p>Dictionary for English-CA.   This dictionary inherits from the standard English dictionary.   Override only those entries with language specific to the CA region.</p><p>Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/en-js.html b/doc/apidocs/files/OpenLayers/Lang/en-js.html
new file mode 100644
index 0000000..18c7381
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/en-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“en”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[en]"></a>OpenLayers.<span class=HB> </span>Lang[“en”]</h1><div class=CBody><p>Dictionary for English.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/es-js.html b/doc/apidocs/files/OpenLayers/Lang/es-js.html
new file mode 100644
index 0000000..81c37ea
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/es-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“es”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[es]"></a>OpenLayers.<span class=HB> </span>Lang[“es”]</h1><div class=CBody><p>Dictionary for Spanish, UTF8 encoding.  Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are norma [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/fi-js.html b/doc/apidocs/files/OpenLayers/Lang/fi-js.html
new file mode 100644
index 0000000..9090e67
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/fi-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“fi”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[fi]"></a>OpenLayers.<span class=HB> </span>Lang[“fi”]</h1><div class=CBody><p>Dictionary for Suomi.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or str [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/fr-js.html b/doc/apidocs/files/OpenLayers/Lang/fr-js.html
new file mode 100644
index 0000000..21141fe
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/fr-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“fr”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[fr]"></a>OpenLayers.<span class=HB> </span>Lang[“fr”]</h1><div class=CBody><p>Dictionary for Français.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/fur-js.html b/doc/apidocs/files/OpenLayers/Lang/fur-js.html
new file mode 100644
index 0000000..6b7b369
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/fur-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“fur”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[fur]"></a>OpenLayers.<span class=HB> </span>Lang[“fur”]</h1><div class=CBody><p>Dictionary for Furlan.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/gl-js.html b/doc/apidocs/files/OpenLayers/Lang/gl-js.html
new file mode 100644
index 0000000..0ea9fc6
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/gl-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“gl”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[gl]"></a>OpenLayers.<span class=HB> </span>Lang[“gl”]</h1><div class=CBody><p>Dictionary for Galego.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/gsw-js.html b/doc/apidocs/files/OpenLayers/Lang/gsw-js.html
new file mode 100644
index 0000000..e7e35d1
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/gsw-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“gsw”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[gsw]"></a>OpenLayers.<span class=HB> </span>Lang[“gsw”]</h1><div class=CBody><p>Dictionary for Alemannisch.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal string [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/hr-js.html b/doc/apidocs/files/OpenLayers/Lang/hr-js.html
new file mode 100644
index 0000000..bd059db
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/hr-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“hr”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[hr]"></a>OpenLayers.<span class=HB> </span>Lang[“hr”]</h1><div class=CBody><p>Dictionary for Hrvatski.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/hsb-js.html b/doc/apidocs/files/OpenLayers/Lang/hsb-js.html
new file mode 100644
index 0000000..397c83e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/hsb-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“hsb”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[hsb]"></a>OpenLayers.<span class=HB> </span>Lang[“hsb”]</h1><div class=CBody><p>Dictionary for Hornjoserbsce.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal stri [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/hu-js.html b/doc/apidocs/files/OpenLayers/Lang/hu-js.html
new file mode 100644
index 0000000..5274579
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/hu-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“hu”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[hu]"></a>OpenLayers.<span class=HB> </span>Lang[“hu”]</h1><div class=CBody><p>Dictionary for Magyar.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/ia-js.html b/doc/apidocs/files/OpenLayers/Lang/ia-js.html
new file mode 100644
index 0000000..7a8dec9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/ia-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ia”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ia]"></a>OpenLayers.<span class=HB> </span>Lang[“ia”]</h1><div class=CBody><p>Dictionary for Interlingua.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/id-js.html b/doc/apidocs/files/OpenLayers/Lang/id-js.html
new file mode 100644
index 0000000..0fae761
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/id-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“id”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[id]"></a>OpenLayers.<span class=HB> </span>Lang[“id”]</h1><div class=CBody><p>Dictionary for Bahasa Indonesia.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal str [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/io-js.html b/doc/apidocs/files/OpenLayers/Lang/io-js.html
new file mode 100644
index 0000000..f62cf85
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/io-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“io”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[io]"></a>OpenLayers.<span class=HB> </span>Lang[“io”]</h1><div class=CBody><p>Dictionary for Ido.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or strin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/is-js.html b/doc/apidocs/files/OpenLayers/Lang/is-js.html
new file mode 100644
index 0000000..82dd749
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/is-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“is”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[is]"></a>OpenLayers.<span class=HB> </span>Lang[“is”]</h1><div class=CBody><p>Dictionary for Íslenska.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/it-js.html b/doc/apidocs/files/OpenLayers/Lang/it-js.html
new file mode 100644
index 0000000..c7575df
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/it-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“it”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[it]"></a>OpenLayers.<span class=HB> </span>Lang[“it”]</h1><div class=CBody><p>Dictionary for Italian.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/ja-js.html b/doc/apidocs/files/OpenLayers/Lang/ja-js.html
new file mode 100644
index 0000000..a090882
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/ja-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ja”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ja]"></a>OpenLayers.<span class=HB> </span>Lang[“ja”]</h1><div class=CBody><p>Dictionary for 日本語.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or strin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/km-js.html b/doc/apidocs/files/OpenLayers/Lang/km-js.html
new file mode 100644
index 0000000..d2689b2
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/km-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“km”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[km]"></a>OpenLayers.<span class=HB> </span>Lang[“km”]</h1><div class=CBody><p>Dictionary for ភាសាខ្មែរ.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/ksh-js.html b/doc/apidocs/files/OpenLayers/Lang/ksh-js.html
new file mode 100644
index 0000000..a7c7d7b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/ksh-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ksh”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ksh]"></a>OpenLayers.<span class=HB> </span>Lang[“ksh”]</h1><div class=CBody><p>Dictionary for Ripoarisch.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/nb-js.html b/doc/apidocs/files/OpenLayers/Lang/nb-js.html
new file mode 100644
index 0000000..1b034a7
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/nb-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“nb”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[nb]"></a>OpenLayers.<span class=HB> </span>Lang[“nb”]</h1><div class=CBody><p>Dictionary for norwegian bokmål (Norway).  Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are no [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/nds-js.html b/doc/apidocs/files/OpenLayers/Lang/nds-js.html
new file mode 100644
index 0000000..301c510
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/nds-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“nds”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[nds]"></a>OpenLayers.<span class=HB> </span>Lang[“nds”]</h1><div class=CBody><p>Dictionary for Plattdüütsch.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/nl-js.html b/doc/apidocs/files/OpenLayers/Lang/nl-js.html
new file mode 100644
index 0000000..93d7913
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/nl-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“nl”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[nl]"></a>OpenLayers.<span class=HB> </span>Lang[“nl”]</h1><div class=CBody><p>Dictionary for Nederlands.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings o [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/nn-js.html b/doc/apidocs/files/OpenLayers/Lang/nn-js.html
new file mode 100644
index 0000000..7833e80
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/nn-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“nn”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[nn]"></a>OpenLayers.<span class=HB> </span>Lang[“nn”]</h1><div class=CBody><p>Dictionary for ‪Norsk (nynorsk)‬.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/oc-js.html b/doc/apidocs/files/OpenLayers/Lang/oc-js.html
new file mode 100644
index 0000000..68e5408
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/oc-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“oc”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[oc]"></a>OpenLayers.<span class=HB> </span>Lang[“oc”]</h1><div class=CBody><p>Dictionary for Occitan.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/pt-BR-js.html b/doc/apidocs/files/OpenLayers/Lang/pt-BR-js.html
new file mode 100644
index 0000000..d4b57b6
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/pt-BR-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“pt-br”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[pt-br]"></a>OpenLayers.<span class=HB> </span>Lang[“pt-br”]</h1><div class=CBody><p>Dictionary for Português do Brasil.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are n [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/pt-js.html b/doc/apidocs/files/OpenLayers/Lang/pt-js.html
new file mode 100644
index 0000000..f4d39f5
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/pt-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“pt”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[pt]"></a>OpenLayers.<span class=HB> </span>Lang[“pt”]</h1><div class=CBody><p>Dictionary for Português.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/ru-js.html b/doc/apidocs/files/OpenLayers/Lang/ru-js.html
new file mode 100644
index 0000000..a5ca570
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/ru-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ru”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ru]"></a>OpenLayers.<span class=HB> </span>Lang[“ru”]</h1><div class=CBody><p>Dictionary for Русский.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/sk-js.html b/doc/apidocs/files/OpenLayers/Lang/sk-js.html
new file mode 100644
index 0000000..50173e4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/sk-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“sk”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[sk]"></a>OpenLayers.<span class=HB> </span>Lang[“sk”]</h1><div class=CBody><p>Dictionary for Slovenčina.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings o [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/sv-SE-js.html b/doc/apidocs/files/OpenLayers/Lang/sv-SE-js.html
new file mode 100644
index 0000000..73c8c09
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/sv-SE-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“sv”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[sv]"></a>OpenLayers.<span class=HB> </span>Lang[“sv”]</h1><div class=CBody><p>Dictionary for Svenska.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/te-js.html b/doc/apidocs/files/OpenLayers/Lang/te-js.html
new file mode 100644
index 0000000..bbe3de5
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/te-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“te”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[te]"></a>OpenLayers.<span class=HB> </span>Lang[“te”]</h1><div class=CBody><p>Dictionary for తెలుగు.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/vi-js.html b/doc/apidocs/files/OpenLayers/Lang/vi-js.html
new file mode 100644
index 0000000..a358f90
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/vi-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“vi”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[vi]"></a>OpenLayers.<span class=HB> </span>Lang[“vi”]</h1><div class=CBody><p>Dictionary for Tiếng Việt.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings o [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/zh-CN-js.html b/doc/apidocs/files/OpenLayers/Lang/zh-CN-js.html
new file mode 100644
index 0000000..863c41e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/zh-CN-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“zh-CN”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[zh-CN]"></a>OpenLayers.<span class=HB> </span>Lang[“zh-CN”]</h1><div class=CBody><p>Dictionary for Simplified Chinese.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are no [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Lang/zh-TW-js.html b/doc/apidocs/files/OpenLayers/Lang/zh-TW-js.html
new file mode 100644
index 0000000..9d18339
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Lang/zh-TW-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“zh-TW”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[zh-TW]"></a>OpenLayers.<span class=HB> </span>Lang[“zh-TW”]</h1><div class=CBody><p>Dictionary for Traditional Chinese.  (Used Mainly in Taiwan) Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.&nb [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer-js.html b/doc/apidocs/files/OpenLayers/Layer-js.html
new file mode 100644
index 0000000..d9aaa0c
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer-js.html
@@ -0,0 +1,147 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer"></a>OpenLayers.<span class=HB> </span>Layer</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Layer" >OpenLayers.<span class=HB> </span>Layer</a></td><td class=SDescription></td></tr><tr class="SGroup SInd [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.id"></a>id</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.name"></a>name</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.div"></a>div</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.alwaysInRange"></a>alwaysInRange</h3><div class=CBody><p>{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.</p><p>If not explicitly specified for a layer, its value will be determined on startup in initResolutions() based [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>layer.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.</p><h4 cla [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.RESOLUTION_PROPERTIES"></a>RESOLUTION_PROPERTIES</h3><div class=CBody><p>{Array} The properties that are used for calculating resolutions information.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.map"></a>map</h3><div class=CBody><p>{<a href="Map-js.html#OpenLayers.Map" class=LClass id=link29 onMouseOver="ShowTip(event, 'tt1', 'link29')" onMouseOut="HideTip('tt1')">OpenLayers.Map</a>} This variable is set when the layer is added to the map, via the accessor function setMap().</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Whether or not the layer is a base layer.  This should be set individually by all subclasses.  Default is false</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.displayInLayerSwitcher"></a>displayInLayerSwitcher</h3><div class=CBody><p>{Boolean} Display the layer’s name in the layer switcher.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.visibility"></a>visibility</h3><div class=CBody><p>{Boolean} The layer should be displayed in the map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.attribution"></a>attribution</h3><div class=CBody><p>{String} Attribution string, displayed when an <a href="Control/Attribution-js.html#OpenLayers.Control.Attribution" class=LClass id=link30 onMouseOver="ShowTip(event, 'tt2', 'link30')" onMouseOut="HideTip('tt2')">OpenLayers.Control.Attribution</a> has been added to the map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.eventListeners"></a>eventListeners</h3><div class=CBody><p>{Object} If set as an option at construction, the eventListeners object will be registered with <a href="Events-js.html#OpenLayers.Events.on" class=LFunction id=link31 onMouseOver="ShowTip(event, 'tt3', 'link31')" onMouseOut="HideTip('tt3')">OpenLayers.Events.on</a>.   Object structure must be a listeners object as shown in the example for th [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.gutter"></a>gutter</h3><div class=CBody><p>{Integer} Determines the width (in pixels) of the gutter around image tiles to ignore.   By setting this property to a non-zero value, images will be requested that are wider and taller than the tile size by a value of 2 x gutter.   This allows artifacts of rendering at tile edges to be ignored.   Set a gutter value that is equal to half the size o [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.projection"></a>projection</h3><div class=CBody><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link32 onMouseOver="ShowTip(event, 'tt4', 'link32')" onMouseOut="HideTip('tt4')">OpenLayers.Projection</a>} or {<a href="BaseTypes-js.html#OpenLayers.String" class=LClass id=link33 onMouseOver="ShowTip(event, 'tt5', 'link33')" onMouseOut="HideTip('tt5')">String</a>} Set in the layer optio [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.units"></a>units</h3><div class=CBody><p>{String} The layer map units.   Defaults to ‘degrees’.   Possible values are ‘degrees’ (or ‘dd’), ‘m’, ‘ft’, ‘km’, ‘mi’, ‘inches’.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.scales"></a>scales</h3><div class=CBody><p>{Array}  An array of map scales in descending order.   The values in the array correspond to the map scale denominator.   Note that these values only make sense if the display (monitor) resolution of the client is correctly guessed by whomever is configuring the application.   In addition, the units property must also be set.  Use <a href="#Op [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.resolutions"></a>resolutions</h3><div class=CBody><p>{Array} 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.).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.maxExtent"></a>maxExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link36 onMouseOver="ShowTip(event, 'tt6', 'link36')" onMouseOut="HideTip('tt6')">OpenLayers.Bounds</a>}  The center of these bounds will not stray outside of the viewport extent during panning.   In addition, if <a href="#OpenLayers.Layer.displayOutsideMaxExtent" class=LProperty id=l [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.minExtent"></a>minExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link38 onMouseOver="ShowTip(event, 'tt6', 'link38')" onMouseOut="HideTip('tt6')">OpenLayers.Bounds</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.maxResolution"></a>maxResolution</h3><div class=CBody><p>{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 displaying the whole world.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.minResolution"></a>minResolution</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.numZoomLevels"></a>numZoomLevels</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.minScale"></a>minScale</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.maxScale"></a>maxScale</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.displayOutsideMaxExtent"></a>displayOutsideMaxExtent</h3><div class=CBody><p>{Boolean} Request map tiles that are completely outside of the max extent for this layer.  Defaults to false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><p>{Boolean} #487 for more info.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.transitionEffect"></a>transitionEffect</h3><div class=CBody><p>{String} The transition effect to use when the map is panned or zoomed.</p><h4 class=CHeading>There are currently two supported values</h4><ul><li><b>null</b> No transition effect (the default).</li><li><b>resize</b>  Existing tiles are resized on zoom to provide a visual effect of the zoom having taken place immediately.   As the new til [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.OpenLayers.Layer"></a>OpenLayers.<span class=HB> </span>Layer</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} The layer name</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Hashtable of extra options to tag onto the layer</td></tr></ta [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setName"></a>setName</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setName: function(</td><td class=PParameter nowrap>newName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the new layer name for this layer.   Can tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.addOptions"></a>addOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addOptions: function (</td><td class=PParameter nowrap>newOptions</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote><p>This function can be implemented by subclasses</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>redraw: function()</td></tr></table></blockquote><p>Redraws the layer.   Returns true if the layer was redrawn, false if not.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The layer was redrawn.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.removeMap"></a>removeMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Just as setMap() allows each layer the possibility  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getImageSize"></a>getImageSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getImageSize: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setTileSize"></a>setTileSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setTileSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the tile size based on the map size.&nbs [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getVisibility"></a>getVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getVisibility: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} The layer should be displayed (if in range).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setVisibility"></a>setVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visibility</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the visibility flag for the  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>display</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the Layer</p><h4 class=CHeading>Paramete [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.calculateInRange"></a>calculateInRange</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateInRange: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} The layer is displayable at the current map’s current resolution.  Note that if ‘alwaysInRange’ is true for the layer, this function will alwa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setIsBaseLayer"></a>setIsBaseLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setIsBaseLayer: function(</td><td class=PParameter nowrap>isBaseLayer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getResolution"></a>getResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The currently selected resolution of the map, taken from the resolutions array, indexed by current zoom level.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getExtent"></a>getExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link43 onMouseOver="ShowTip(event, 'tt6', 'link43')" onMouseOut="HideTip('tt6')">OpenLayers.Bounds</a>} A Bounds object which  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getZoomForExtent"></a>getZoomForExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForExtent: function(</td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getResolutionForZoom"></a>getResolutionForZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getResolutionForZoom: function(</td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getZoomForResolution"></a>getZoomForResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForResolution: function(</td><td class=PParameter nowrap>resolution,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getLonLatFromViewPortPx"></a>getLonLatFromViewPortPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromViewPortPx: function (</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getViewPortPxFromLonLat"></a>getViewPortPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getViewPortPxFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Retur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the opacity for the entire layer (all i [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt2"><div class=CClass>The attribution control adds attribution from layers to the map display. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>on: function(</ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/ArcGIS93Rest-js.html b/doc/apidocs/files/OpenLayers/Layer/ArcGIS93Rest-js.html
new file mode 100644
index 0000000..3bdbc28
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/ArcGIS93Rest-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.ArcGIS93Rest - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcGIS93Rest</h1><div class=CBody><p>Instances of OpenLayers.Layer.ArcGIS93Rest are used to display data from ESRI ArcGIS Server 9.3 (and up?)  Mapping Services using the REST API.  Create a new ArcGIS93Rest layer with the <a href="#OpenLayers.Layer.ArcGIS93Rest.OpenLayers.Layer.ArcGIS93Res [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Default is true for ArcGIS93Rest layer</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.OpenLayers.Layer.ArcGIS93Rest"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcGIS93Rest</h3><div class=CBody><p>Create a new ArcGIS93Rest layer object.</p><h4 class=CHeading>Example</h4><blockquote><pre>var arcims = new OpenLayers.Layer.ArcGIS93Rest("MyName",
+                                   "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/export",
+                                   {
+                                     layers: "0,1,2"
+                                   });</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base url for the ArcGIS server REST service</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An object with key/value pairs representing the opt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Catch changeParams [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Catch changeParams and uppercase the new params to be merged in before calling changeParams on the super class.</div></div>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/ArcIMS-js.html b/doc/apidocs/files/OpenLayers/Layer/ArcIMS-js.html
new file mode 100644
index 0000000..d8c7abd
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/ArcIMS-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.ArcIMS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.ArcIMS"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcIMS</h1><div class=CBody><p>Instances of OpenLayers.Layer.ArcIMS are used to display data from ESRI ArcIMS Mapping Services.  Create a new ArcIMS layer with the <a href="#OpenLayers.Layer.ArcIMS.OpenLayers.Layer.ArcIMS" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMous [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Default query string parameters.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.tileSize"></a>tileSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Size for tiles.   Default is 512x512.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.featureCoordSys"></a>featureCoordSys</h3><div class=CBody><p>{String} Code for feature coordinate system.   Default is “4326”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.filterCoordSys"></a>filterCoordSys</h3><div class=CBody><p>{String} Code for filter coordinate system.   Default is “4326”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.layers"></a>layers</h3><div class=CBody><p>{Array} An array of objects with layer properties.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.async"></a>async</h3><div class=CBody><p>{Boolean} Request images asynchronously.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.name"></a>name</h3><div class=CBody><p>{String} Layer name.   Default is “ArcIMS”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} The layer is a base layer.   Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.DEFAULT_OPTIONS"></a>DEFAULT_OPTIONS</h3><div class=CBody><p>{Object} Default layers properties.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.OpenLayers.Layer.ArcIMS"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcIMS</h3><div class=CBody><p>Create a new ArcIMS layer object.</p><h4 class=CHeading>Example</h4><blockquote><pre>var arcims = new OpenLayers.Layer.ArcIMS(
+    "Global Sample",
+    "http://sample.avencia.com/servlet/com.esri.esrimap.Esrimap",
+    {
+        service: "OpenLayers_Sample",
+        layers: [
+            // layers to manipulate
+            {id: "1", visible: true}
+        ]
+    }
+);</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base url for the ArcIMS server</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object with properties to be set on the layer.</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new ArcIMS layer object.</div></div><div class=CToolTip id="tt3"><div class=CClass>Base class for layers that use a lattice of tiles. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Boxes-js.html b/doc/apidocs/files/OpenLayers/Layer/Boxes-js.html
new file mode 100644
index 0000000..23e5910
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Boxes-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Boxes - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Boxes"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Boxes</h1><div class=CBody><p>Draw divs as ‘boxes’ on the layer.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Markers-js.html#OpenLayers.Layer.Markers" class=LClass >OpenLayers.Layer.Markers</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.OpenLayers.Layer.Boxes"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Boxes</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Hashtable of extra options to tag on [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.removeMarker"></a>removeMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/EventPane-js.html b/doc/apidocs/files/OpenLayers/Layer/EventPane-js.html
new file mode 100644
index 0000000..0a17c59
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/EventPane-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.EventPane - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.EventPane"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>EventPane</h1><div class=CBody><p>Base class for 3rd party layers.   Create a new event pane layer with the <a href="#OpenLayers.Layer.EventPane.OpenLayers.Layer.EventPane" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Layer.EventPan [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.smoothDragPan"></a>smoothDragPan</h3><div class=CBody><p>{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 n [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.isFixed"></a>isFixed</h3><div class=CBody><p>{Boolean} EventPaned layers are fixed by default.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.OpenLayers.Layer.EventPane"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>EventPane</h3><div class=CBody><p>Create a new event pane layer</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescripti [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Deconstruct this layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.removeMap"></a>removeMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>On being removed from the map, we’l [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Deconstruct this layer.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/FixedZoomLevels-js.html b/doc/apidocs/files/OpenLayers/Layer/FixedZoomLevels-js.html
new file mode 100644
index 0000000..fff05df
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/FixedZoomLevels-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.FixedZoomLevels - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>FixedZoomLevels</h1><div class=CBody><p>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.</p><h4 class=CHeading>When you subcla [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.OpenLayers.Layer.FixedZoomLevels"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>FixedZoomLevels</h3><div class=CBody><p>Create a new fixed zoom levels layer.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.getResolution"></a>getResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function()</td></tr></table></blockquote><p>Get the current map resolution</p><h4 class=CHeading>Returns</h4><p>{Float} Map units per Pixel</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.getExtent"></a>getExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function ()</td></tr></table></blockquote><p>Calculates using px-> lonlat translation functions on tl and br corners of viewport</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link3 onMouse [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function()</td></tr></table></blockquote>Get the current map resolution</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function ()</td></tr></table></blockquote>Calculates using px-> lonlat translation functions on tl and br corners of vie [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/GML-js.html b/doc/apidocs/files/OpenLayers/Layer/GML-js.html
new file mode 100644
index 0000000..7b81d2f
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/GML-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.GML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.GML"></a>OpenLayers.<span class=HB> </span>Layer.GML</h1><div class=CBody><p>Create a vector layer by parsing a GML file.  The GML file is passed in as a parameter.  <b>Deprecated</b>.   To be removed in 3.0.   Instead use OpenLayers.Layer.Vector with Protocol.HTTP and Strategy.Fixed.  Provide the protocol with a format parameter to get the parser you wan [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.format"></a>format</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} The format you want the data to be parsed with.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Hash of options which should be passed to the format when it is created.  Must be passed in the constructor.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.OpenLayers.Layer.GML"></a>OpenLayers.<span class=HB> </span>Layer.GML</h3><div class=CBody><p>Load and parse a single file on the web, according to the format provided via the ‘format’ option, defaulting to GML.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.setVisibility"></a>setVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visibility,</td></tr><tr><td></td><td class=PParameter nowrap>noEvent</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visibility,</td></tr><tr><td></td><td class=PParameter nowrap>noEvent</td><td class=PAfterParameters no [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/GeoRSS-js.html b/doc/apidocs/files/OpenLayers/Layer/GeoRSS-js.html
new file mode 100644
index 0000000..fd1fb6d
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/GeoRSS-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.GeoRSS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.GeoRSS"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>GeoRSS</h1><div class=CBody><p>Add GeoRSS Point features to your map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Markers-js.html#OpenLayers.Layer.Markers" class=LClass >OpenLayers.Layer.Markers</a></li><li><a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a></li></ul [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Hash of options which should be passed to the format when it is created.  Must be passed in the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.icon"></a>icon</h3><div class=CBody><p>{<a href="../Icon-js.html#OpenLayers.Icon" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">OpenLayers.Icon</a>}.  This determines the Icon to be used on the map for this GeoRSS layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.popupSize"></a>popupSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} This determines the size of GeoRSS popups.  If not provided, defaults to 250px by 120px.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.useFeedTitle"></a>useFeedTitle</h3><div class=CBody><p>{Boolean} Set layer.name to the first <title> element in the feed.  Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.OpenLayers.Layer.GeoRSS"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>GeoRSS</h3><div class=CBody><p>Create a GeoRSS Layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>location</td><td class=CDLDescription>{String}</td [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The icon represents a graphical icon on the screen. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent a width/height pair</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Google-js.html b/doc/apidocs/files/OpenLayers/Layer/Google-js.html
new file mode 100644
index 0000000..b5bbe9b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Google-js.html
@@ -0,0 +1,111 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Google - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Google"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="SphericalMercator-js.html#OpenLayers.Layer.SphericalMercator" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt23', 'link23')" onMouseOut="HideTip('tt23')">OpenLayers.Layer.SphericalMercator</a></li><li><a href="EventPan [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.MIN_ZOOM_LEVEL"></a>MIN_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 0</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.MAX_ZOOM_LEVEL"></a>MAX_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 21</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.RESOLUTIONS"></a>RESOLUTIONS</h3><div class=CBody><p>{Array(Float)} Hardcode these resolutions so that they are more closely tied with the standard wms projection</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.type"></a>type</h3><div class=CBody><p>{GMapType}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><p>{Boolean} Allow user to pan forever east/west.   Default is true.  Setting this to false only restricts panning if <a href="#OpenLayers.Layer.Google.sphericalMercator" class=LProperty id=link26 onMouseOver="ShowTip(event, 'tt26', 'link26')" onMouseOut="HideTip('tt26')">sphericalMercator</a> is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.sphericalMercator"></a>sphericalMercator</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.OpenLayers.Layer.Google"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer.</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.setVisibility"></a>setVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visible</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the visibility flag for  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>visible</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the Layer</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the opacity for the entire layer [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up this layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.removeMap"></a>removeMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>On being removed from the map, also remove t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getOLBoundsFromMapObjectBounds"></a>getOLBoundsFromMapObjectBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getOLBoundsFromMapObjectBounds: function(</td><td class=PParameter nowrap>moBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectCenter"></a>getMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectCenter: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} The mapObject’s current center in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectZoom"></a>getMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectZoom: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The mapObject’s current zoom, in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getLongitudeFromMapObjectLonLat"></a>getLongitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLongitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getLatitudeFromMapObjectLonLat"></a>getLatitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLatitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getXFromMapObjectPixel"></a>getXFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getXFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getYFromMapObjectPixel"></a>getYFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getYFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.OpenLayers.Layer.Google.v2"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.v2</h3><div class=CBody><p>Mixin providing functionality specific to the Google Maps API v2.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectBoundsFromOLBounds"></a>getMapObjectBoundsFromOLBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectBoundsFromOLBounds: function(</td><td class=PParameter nowrap>olBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.dragPanMapObject"></a>dragPanMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragPanMapObject: function(</td><td class=PParameter nowrap>dX,</td></tr><tr><td></td><td class=PParameter nowrap>dY</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectZoomFromMapObjectBounds"></a>getMapObjectZoomFromMapObjectBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectZoomFromMapObjectBounds: function(</td><td class=PParameter nowrap>moBounds</td><td class=PAfterParameters nowrap>)</td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterPar [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visible</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Set the visibility flag for the layer and hide/show & redraw accordingly. </div></div><div class=CToolTip id="tt2"><div cl [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Google/v3-js.html b/doc/apidocs/files/OpenLayers/Layer/Google/v3-js.html
new file mode 100644
index 0000000..6d2672a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Google/v3-js.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Google/v3.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="v3.js"></a>v3.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#v3.js" >v3.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Constants" >Constants</a></td><td class=SDescription></td></tr><tr  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.v3"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.v3</h3><div class=CBody><p>Mixin providing functionality specific to the Google Maps API v3.  Note that this layer configures the google.maps.map object with the “disableDefaultUI” option set to true.  Using UI controls that the Google Maps API provides is not supported by the OpenLayers API.</p></di [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="DEFAULTS"></a>DEFAULTS</h3><div class=CBody><p>{Object} It is not recommended to change the properties set here.  Note that Google.v3 layers only work when sphericalMercator is set to true.</p><blockquote><pre>{
+    maxExtent: new OpenLayers.Bounds(
+        -128 * 156543.0339,
+        -128 * 156543.0339,
+        128 * 156543.0339,
+        128 * 156543.0339
+    ),
+    sphericalMercator: true,
+    maxResolution: 156543.0339,
+    units: "m",
+    projection: "EPSG:900913"
+}</pre></blockquote></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectBoundsFromOLBounds"></a>getMapObjectBoundsFromOLBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectBoundsFromOLBounds: function(</td><td class=PParameter nowrap>olBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectZoomFromMapObjectBounds"></a>getMapObjectZoomFromMapObjectBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectZoomFromMapObjectBounds: function(</td><td class=PParameter nowrap>moBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up this layer.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectBoundsFromOLBounds: function(</td><td class=PParameter nowrap>olBounds< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Grid-js.html b/doc/apidocs/files/OpenLayers/Layer/Grid-js.html
new file mode 100644
index 0000000..ee7ba80
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Grid-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Grid - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Grid"></a>OpenLayers.<span class=HB> </span>Layer.Grid</h1><div class=CBody><p>Base class for layers that use a lattice of tiles.   Create a new grid layer with the <a href="#OpenLayers.Layer.Grid.OpenLayers.Layer.Grid" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.Layer.Grid</a> constructor.</p><h4 class=CHea [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.tileSize"></a>tileSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.singleTile"></a>singleTile</h3><div class=CBody><p>{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 entire viewport, it is reloaded.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.ratio"></a>ratio</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.buffer"></a>buffer</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.numLoadingTiles"></a>numLoadingTiles</h3><div class=CBody><p>{Integer} How many tiles are still loading?</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.OpenLayers.Layer.Grid"></a>OpenLayers.<span class=HB> </span>Layer.Grid</h3><div class=CBody><p>Create a new grid layer</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>para [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Deconstruct the layer and clear the grid.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Parame [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.setTileSize"></a>setTileSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setTileSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Check if we are in singleTile mode and  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.getTilesBounds"></a>getTilesBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getTilesBounds: function()</td></tr></table></blockquote><p>Return the bounds of the tile grid.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt9', 'link12')" onMouseO [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bloc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.getTileBounds"></a>getTileBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getTileBounds: function(</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns The tile bounds for [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Deconstruct the layer and clear the grid.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/HTTPRequest-js.html b/doc/apidocs/files/OpenLayers/Layer/HTTPRequest-js.html
new file mode 100644
index 0000000..77bf582
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/HTTPRequest-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.HTTPRequest - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.HTTPRequest"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>HTTPRequest</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.URL_HASH_FACTOR"></a>URL_HASH_FACTOR</h3><div class=CBody><p>{Float} Used to hash URL param strings for multi-WMS server selection.  Set to the Golden Ratio per Knuth’s recommendation.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.reproject"></a>reproject</h3><div class=CBody><p><b>Deprecated</b>.  See <a href="http://trac.openlayers.org/wiki/SpatialMercator" class=LURL target=_top>http://trac.openlayers.org/wiki/SpatialMercator</a> for information on the replacement for this functionality.  {Boolean} Whether layer should reproject itself based on base layer locations.  This allows reprojection onto comme [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.OpenLayers.Layer.HTTPRequest"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>HTTPRequest</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{Array(String) or String}</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.setUrl"></a>setUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setUrl: function(</td><td class=PParameter nowrap>newUrl</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>redraw: function(</td><td class=PParameter nowrap>force</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Redraws the layer.   Returns true if the  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters no [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Image-js.html b/doc/apidocs/files/OpenLayers/Layer/Image-js.html
new file mode 100644
index 0000000..fb9c197
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Image-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Image - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Image"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Image</h1><div class=CBody><p>Instances of OpenLayers.Layer.Image are used to display data from a web accessible image as a map layer.   Create a new image layer with the <a href="#OpenLayers.Layer.Image.OpenLayers.Layer.Image" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" on [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.OpenLayers.Layer.Image"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Image</h3><div class=CBody><p>Create a new image layer</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer.</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescript [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.setUrl"></a>setUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setUrl: function(</td><td class=PParameter nowrap>newUrl</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cell [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>The url we return is always the same (the image its [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/KaMap-js.html b/doc/apidocs/files/OpenLayers/Layer/KaMap-js.html
new file mode 100644
index 0000000..634e0d3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/KaMap-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.KaMap - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.KaMap"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMap</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Layer.Grid</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>S [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} KaMap Layer is always a base layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.units"></a>units</h3><div class=CBody><p>{?}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.resolution"></a>resolution</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} parameters set by default.  The default parameters set the format via the ‘i’ parameter to ‘jpeg’.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.OpenLayers.Layer.KaMap"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMap</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>params</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspaci [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.getTileBounds"></a>getTileBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getTileBounds: function(</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns The tile bounds fo [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/KaMapCache-js.html b/doc/apidocs/files/OpenLayers/Layer/KaMapCache-js.html
new file mode 100644
index 0000000..53d71be
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/KaMapCache-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.KaMapCache - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.KaMapCache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMapCache</h1><div class=CBody><p>This class is designed to talk directly to a web-accessible ka-Map cache generated by the precache2.php script.</p><p>To create a a new KaMapCache layer, you must indicate also the “i” parameter (that will be used to calculate the file extension), and anot [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.IMAGE_EXTENSIONS"></a>IMAGE_EXTENSIONS</h3><div class=CBody><p>{Object} Simple hash map to convert format to extension.</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.DEFAULT_FORMAT"></a>DEFAULT_FORMAT</h3><div class=CBody><p>{Object} Simple hash map to convert format to extension.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.OpenLayers.Layer.KaMapCache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMapCache</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CD [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for layers that use a lattice of tiles. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/MapGuide-js.html b/doc/apidocs/files/OpenLayers/Layer/MapGuide-js.html
new file mode 100644
index 0000000..564b5ef
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/MapGuide-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.MapGuide - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.MapGuide"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapGuide</h1><div class=CBody><p>Instances of OpenLayers.Layer.MapGuide are used to display data from a MapGuide OS instance.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Treat this layer as a base layer.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.useHttpTile"></a>useHttpTile</h3><div class=CBody><p>{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 <a href="http://trac.osgeo.or [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.singleTile"></a>singleTile</h3><div class=CBody><p>{Boolean} use tile server or request single tile image.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.useOverlay"></a>useOverlay</h3><div class=CBody><p>{Boolean} flag to indicate if the layer should be retrieved using GETMAPIMAGE (default) or using GETDYNAMICOVERLAY requests.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.useAsyncOverlay"></a>useAsyncOverlay</h3><div class=CBody><p>{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 the map and offers styling options.</p><p>With olde [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.TILE_PARAMS"></a>TILE_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs for tiled layer</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.SINGLE_TILE_PARAMS"></a>SINGLE_TILE_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs for untiled layer</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.OVERLAY_PARAMS"></a>OVERLAY_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs for untiled layer</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.FOLDER_PARAMS"></a>FOLDER_PARAMS</h3><div class=CBody><p>{Object} Hashtable of parameter key/value pairs which describe the folder structure for tiles as configured in the mapguide serverconfig.ini section [TileServiceProperties]</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.OpenLayers.Layer.MapGuide"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapGuide</h3><div class=CBody><p>Create a new Mapguide layer, either tiled or untiled.</p><p>For tiled layers, the ‘groupName’ and ‘mapDefinition’ values must be specified as parameters in the constructor.</p><p>For untiled base layers, specify either combination of ‘mapN [...]
+
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.MapGuide_OS_uses_a_DPI_value_and_degrees_to_meters_conversion"></a>MapGuide OS uses a DPI value and degrees to meters conversion</h3><div class=CBody><p>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.</p><h4 class=CHeading>Parameters</h4><table border=0 ce [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for layers that use a lattice of tiles. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/MapServer-js.html b/doc/apidocs/files/OpenLayers/Layer/MapServer-js.html
new file mode 100644
index 0000000..d563d16
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/MapServer-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.MapServer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.MapServer"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer</h1><div class=CBody><p>Instances of OpenLayers.Layer.MapServer are used to display data from a MapServer CGI instance.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="Hi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.OpenLayers.Layer.MapServer"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer</h3><div class=CBody><p>Create a new MapServer layer object</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for layers that use a lattice of tiles. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/MapServer/Untiled-js.html b/doc/apidocs/files/OpenLayers/Layer/MapServer/Untiled-js.html
new file mode 100644
index 0000000..dacce94
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/MapServer/Untiled-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.MapServer.Untiled - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer.<span class=HB> </span>Untiled</h1><div class=CBody><p><b>Deprecated</b>.   To be removed in 3.0.   Instead use OpenLayers.Layer.MapServer and pass the option ‘singleTile’ as true.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../MapServer-js.html#OpenL [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.singleTile"></a>singleTile</h3><div class=CBody><p>{singleTile} Always true for untiled.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.OpenLayers.Layer.MapServer.Untiled"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer.<span class=HB> </span>Untiled</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDe [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.MapServer are used to display data from a MapServer CGI instance.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Markers-js.html b/doc/apidocs/files/OpenLayers/Layer/Markers-js.html
new file mode 100644
index 0000000..d88cbf0
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Markers-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Markers - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Markers"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Markers</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=ST [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Markers layer is never a base layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.markers"></a>markers</h3><div class=CBody><p>{Array(<a href="../Marker-js.html#OpenLayers.Marker" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Marker</a>)} internal marker list</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.OpenLayers.Layer.Markers"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Markers</h3><div class=CBody><p>Create a Markers layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the opacity for all the markers [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.addMarker"></a>addMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.removeMarker"></a>removeMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.getDataExtent"></a>getDataExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getDataExtent: function ()</td></tr></table></blockquote><p>Calculates the max extent which includes all of the markers.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link10 onMouseOver="ShowTip(event,  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Marker are a combination of a OpenLayers.LonLat and an OpenLayers.Icon.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/MultiMap-js.html b/doc/apidocs/files/OpenLayers/Layer/MultiMap-js.html
new file mode 100644
index 0000000..7dc20b9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/MultiMap-js.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.MultiMap - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.MultiMap"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MultiMap</h1><div class=CBody><p>Note that MultiMap does not fully support the sphericalMercator option.  See Ticket #953 for more details.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="EventPane-js.html#OpenLayers.Layer.EventPane" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt13' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.MIN_ZOOM_LEVEL"></a>MIN_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 1</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.MAX_ZOOM_LEVEL"></a>MAX_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 17</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.RESOLUTIONS"></a>RESOLUTIONS</h3><div class=CBody><p>{Array(Float)} Hardcode these resolutions so that they are more closely tied with the standard wms projection</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.type"></a>type</h3><div class=CBody><p>{?}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.OpenLayers.Layer.MultiMap"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MultiMap</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></di [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectCenter"></a>getMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectCenter: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} The mapObject’s current center in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectZoom"></a>getMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectZoom: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The mapObject’s current zoom, in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getLongitudeFromMapObjectLonLat"></a>getLongitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLongitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getLatitudeFromMapObjectLonLat"></a>getLatitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLatitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterP [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getXFromMapObjectPixel"></a>getXFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getXFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getYFromMapObjectPixel"></a>getYFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getYFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote>{String} String with information on why layer is broken, how to get it working.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>se [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/PointTrack-js.html b/doc/apidocs/files/OpenLayers/Layer/PointTrack-js.html
new file mode 100644
index 0000000..56159f5
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/PointTrack-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.PointTrack - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.PointTrack"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>PointTrack</h1><div class=CBody><p>Vector layer to display ordered point features as a line, creating one LineString feature for each pair of two points.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link2 onMouseOver="ShowTip(event, 't [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.OpenLayers.PointTrack"></a>OpenLayers.<span class=HB> </span>PointTrack</h3><div class=CBody><p>Constructor for a new OpenLayers.PointTrack instance.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} name of the layer</td></tr><tr><td class=CDLEntry>options</td><td class=CD [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.addNodes"></a>addNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addNodes: function(</td><td class=PParameter nowrap>pointFeatures</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Adds point features that will be  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.OpenLayers.Layer.PointTrack.dataFrom"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>PointTrack.<span class=HB> </span>dataFrom</h3><div class=CBody><p>{Object} with the following keys</p><ul><li>SOURCE_NODE: take data/attributes from the source node of the line</li><li>TARGET_NODE: take data/attributes from the target node of the line</li></ul></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addNodes: function(</td><td class=PParameter nowrap>pointFeatures</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Adds point features that will be used to create lines from, using point pairs. </div></div><div class=CToolTip id="tt2"><div  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/SphericalMercator-js.html b/doc/apidocs/files/OpenLayers/Layer/SphericalMercator-js.html
new file mode 100644
index 0000000..6f96a83
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/SphericalMercator-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.SphericalMercator - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.SphericalMercator"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>SphericalMercator</h1><div class=CBody><p>A mixin for layers that wraps up the pieces neccesary to have a coordinate conversion for working with commercial APIs which use a spherical mercator projection.   Using this layer as a base layer, additional layers can be used as overlays if they a [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.forwardMercator"></a>forwardMercator</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>forwardMercator: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.inverseMercator"></a>inverseMercator</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>inverseMercator: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.Two_transforms_declared"></a>Two transforms declared</h3><div class=CBody><p>Transforms from EPSG:4326 to EPSG:900913 and from EPSG:900913 to EPSG:4326 are set by this class.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>forwardMercator: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Given a lon,lat in EPSG:4326, return a point in Spherical Mercator.</div> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/TMS-js.html b/doc/apidocs/files/OpenLayers/Layer/TMS-js.html
new file mode 100644
index 0000000..59d1a6a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/TMS-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.TMS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.TMS"></a>OpenLayers.<span class=HB> </span>Layer.TMS</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Layer.Grid</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBor [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.serviceVersion"></a>serviceVersion</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.tileOrigin"></a>tileOrigin</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.serverResolutions"></a>serverResolutions</h3><div class=CBody><p>{Array} A list of all resolutions available on the server.   Only set this property if the map resolutions differs from the server.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.zoomOffset"></a>zoomOffset</h3><div class=CBody><p>{Number} If your cache has more zoom levels than you want to provide access to with this layer, supply a zoomOffset.   This zoom offset is added to the current map zoom level to determine the level for a requested tile.   For example, if you supply a zoomOffset of 3, when the map is at the zoom 0, tiles will be requested from level 3 of your [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.OpenLayers.Layer.TMS"></a>OpenLayers.<span class=HB> </span>Layer.TMS</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When the layer is added to a map, then we can fetch our  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Text-js.html b/doc/apidocs/files/OpenLayers/Layer/Text-js.html
new file mode 100644
index 0000000..2945998
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Text-js.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Text - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Text"></a>OpenLayers.<span class=HB> </span>Layer.Text</h1><div class=CBody><p>This layer creates markers given data in a text file.   The <a href="#OpenLayers.Layer.Text.location" class=LProperty id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">location</a> property of the layer (specified as a property of the options argument in the <a href [...]
+10   20  title   description 21,25       -10,-25     http://www.openlayers.org/dev/img/marker.png</pre></blockquote><h4 class=CHeading>Inherits from</h4><ul><li><a href="Markers-js.html#OpenLayers.Layer.Markers" class=LClass >OpenLayers.Layer.Markers</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Layer.Text" >OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.location"></a>location</h3><div class=CBody><p>{String} URL of text file.   Must be specified in the “options” argument of the constructor.  Can not be changed once passed in.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Hash of options which should be passed to the format when it is created.  Must be passed in the constructor.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.OpenLayers.Layer.Text"></a>OpenLayers.<span class=HB> </span>Layer.Text</h3><div class=CBody><p>Create a text layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Object with properties to be set on [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CProperty>{String} URL of text file. </div></div><div class=CToolTip id="tt3"><div class=CConstructor>Create a text layer.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/TileCache-js.html b/doc/apidocs/files/OpenLayers/Layer/TileCache-js.html
new file mode 100644
index 0000000..230b0a4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/TileCache-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.TileCache - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.TileCache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>TileCache</h1><div class=CBody><p>A read only TileCache layer.   Used to requests tiles cached by TileCache in a web accessible cache.   This means that you have to pre-populate your cache before this layer can be used.   It is meant only to read tiles created by TileCache, and not to mak [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Treat this layer as a base layer.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.format"></a>format</h3><div class=CBody><p>{String} Mime type of the images returned.   Default is image/png.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.serverResolutions"></a>serverResolutions</h3><div class=CBody><p>{Array} A list of all resolutions available on the server.   Only set this property if the map resolutions differs from the server.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.OpenLayers.Layer.TileCache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>TileCache</h3><div class=CBody><p>Create a new read only TileCache layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} Name of the layer displayed in the interface</td></tr><t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDesc [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new read only TileCache layer.</div></div><div class=CToolTip i [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Vector-js.html b/doc/apidocs/files/OpenLayers/Layer/Vector-js.html
new file mode 100644
index 0000000..b93df9c
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Vector-js.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Vector - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Vector"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Vector</h1><div class=CBody><p>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources.  Create a new vector layer with the <a href="#OpenLayers.Layer.Vector.OpenLayers.Layer.Vector" class=LConstructor id=link15 onMouseOver="ShowTip(event, 'tt15', 'link15')" onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>layer.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.</p> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} The layer is a base layer.   Default is false.   Set this property in the layer options.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.isFixed"></a>isFixed</h3><div class=CBody><p>{Boolean} Whether the layer remains in one place while dragging the map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.isVector"></a>isVector</h3><div class=CBody><p>{Boolean} Whether the layer is a vector layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.features"></a>features</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.reportError"></a>reportError</h3><div class=CBody><p>{Boolean} report friendly error message when loading of renderer fails.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.style"></a>style</h3><div class=CBody><p>{Object} Default style for the layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.rendererOptions"></a>rendererOptions</h3><div class=CBody><p>{Object} Options for the renderer.  See {<a href="../Renderer-js.html#OpenLayers.Renderer" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt16', 'link17')" onMouseOut="HideTip('tt16')">OpenLayers.Renderer</a>} for supported options.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.geometryType"></a>geometryType</h3><div class=CBody><p>{String} geometryType allows you to limit the types of geometries this layer supports.  This should be set to something like “OpenLayers.Geometry.Point” to limit types.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.OpenLayers.Layer.Vector"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Vector</h3><div class=CBody><p>Create a new vector layer</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>options</td><td class=CDLD [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>display</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the Layer</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.addFeatures"></a>addFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addFeatures: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.removeFeatures"></a>removeFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeFeatures: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.removeAllFeatures"></a>removeAllFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeAllFeatures: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove all featu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.destroyFeatures"></a>destroyFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>destroyFeatures: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.drawFeature"></a>drawFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawFeature: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getFeatureBy"></a>getFeatureBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureBy: function(</td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>value</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getFeatureById"></a>getFeatureById</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureById: function(</td><td class=PParameter nowrap>featureId</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a feature id, ret [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getFeatureByFid"></a>getFeatureByFid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureByFid: function(</td><td class=PParameter nowrap>featureFid</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a feature fid [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.onFeatureInsert"></a>onFeatureInsert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onFeatureInsert: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>method called after a  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.preFeatureInsert"></a>preFeatureInsert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>preFeatureInsert: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>method called befor [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getDataExtent"></a>getDataExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getDataExtent: function ()</td></tr></table></blockquote><p>Calculates the max extent which includes all of the features.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link28 onMouseOver="ShowTip(event,  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Destroy this layer</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Vector/RootContainer-js.html b/doc/apidocs/files/OpenLayers/Layer/Vector/RootContainer-js.html
new file mode 100644
index 0000000..e2d0894
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Vector/RootContainer-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Vector.RootContainer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Vector.<span class=HB> </span>RootContainer</h1><div class=CBody><p>A special layer type to combine multiple vector layers inside a single renderer root container.  This class is not supposed to be instantiated from user space, it is a helper class for controls that require event process [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.layers"></a>layers</h3><div class=CBody><p>Layers that are attached to this container.  Required config option.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.OpenLayers.Layer.Vector.RootContainer"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Vector.<span class=HB> </span>RootContainer</h3><div class=CBody><p>Create a new root container for multiple vector layer.  This constructor is not supposed to be used from user space, it is only to be used by controls that need feature selection across multiple vector lay [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new root container for multiple vector layer. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/VirtualEarth-js.html b/doc/apidocs/files/OpenLayers/Layer/VirtualEarth-js.html
new file mode 100644
index 0000000..6eeeca8
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/VirtualEarth-js.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.VirtualEarth - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.VirtualEarth"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>VirtualEarth</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="EventPane-js.html#OpenLayers.Layer.EventPane" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt14', 'link14')" onMouseOut="HideTip('tt14')">OpenLayers.Layer.EventPane</a></li><li><a href="FixedZoomLevels-js.h [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.MIN_ZOOM_LEVEL"></a>MIN_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 1</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.MAX_ZOOM_LEVEL"></a>MAX_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 19</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.RESOLUTIONS"></a>RESOLUTIONS</h3><div class=CBody><p>{Array(Float)} Hardcode these resolutions so that they are more closely tied with the standard wms projection</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.type"></a>type</h3><div class=CBody><p>{VEMapType}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><p>{Boolean} Allow user to pan forever east/west.   Default is true.  Setting this to false only restricts panning if <a href="#OpenLayers.Layer.VirtualEarth.sphericalMercator" class=LProperty id=link16 onMouseOver="ShowTip(event, 'tt16', 'link16')" onMouseOut="HideTip('tt16')">sphericalMercator</a> is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.sphericalMercator"></a>sphericalMercator</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.animationEnabled"></a>animationEnabled</h3><div class=CBody><p>{Boolean} If set to true, the transition between zoom levels will be animated.  Set to false to match the zooming experience of other layer types.  Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.OpenLayers.Layer.VirtualEarth"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>VirtualEarth</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></tabl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectCenter"></a>getMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectCenter: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} The mapObject’s current center in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.dragPanMapObject"></a>dragPanMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragPanMapObject: function(</td><td class=PParameter nowrap>dX,</td></tr><tr><td></td><td class=PParameter nowrap>dY</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectZoom"></a>getMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectZoom: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The mapObject’s current zoom, in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getLongitudeFromMapObjectLonLat"></a>getLongitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLongitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getLatitudeFromMapObjectLonLat"></a>getLatitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLatitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAf [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getXFromMapObjectPixel"></a>getXFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getXFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getYFromMapObjectPixel"></a>getYFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getYFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowra [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote>{String} String with information on why layer is broken, how to get it working.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>se [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/WFS-js.html b/doc/apidocs/files/OpenLayers/Layer/WFS-js.html
new file mode 100644
index 0000000..46c746b
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/WFS-js.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WFS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WFS"></a>OpenLayers.<span class=HB> </span>Layer.WFS</h1><div class=CBody><p><b>Deprecated</b>.   To be removed in 3.0.   Instead use OpenLayers.Layer.Vector with a Protocol.WFS and one or more Strategies.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt12', 'link12')" [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} WFS layer is not a base layer by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.ratio"></a>ratio</h3><div class=CBody><p>{Float} The ratio property determines the size of the serverside query relative to the map viewport size.  By default, we load an area twice as big as the map, to allow for panning without immediately reload.  Setting this to 1 will cause the area of the WFS request to match the map area exactly.  It is recommended to set this to some number at l [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.featureClass"></a>featureClass</h3><div class=CBody><p>{<a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt1', 'link13')" onMouseOut="HideTip('tt1')">OpenLayers.Feature</a>} If featureClass is defined, an old-style markers based WFS layer is created instead of a new-style vector layer.  If sent, this should be a subclass of OpenLayers.Feature</p> [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.format"></a>format</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt2', 'link14')" onMouseOut="HideTip('tt2')">OpenLayers.Format</a>} The format you want the data to be parsed with.  Must be passed in the constructor.  Should be a class, not an instance.  This option can only be used if no featureClass is passed [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Hash of options which should be passed to the format when it is created.  Must be passed in the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.encodeBBOX"></a>encodeBBOX</h3><div class=CBody><p>{Boolean} Should the BBOX commas be encoded?  The WMS spec says ‘no’, but some services want it that way.  Default false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Should the WFS layer parse attributes from the retrieved GML?  Defaults to false.  If enabled, parsing is slower, but attributes are available in the attributes property of layer features.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.OpenLayers.Layer.WFS"></a>OpenLayers.<span class=HB> </span>Layer.WFS</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>{ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Modify parameters for the l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.getFullRequestString"></a>getFullRequestString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFullRequestString:function(</td><td class=PParameter nowrap>newParams,</td></tr><tr><td></td><td class=PParameter nowrap>altUrl</td><td class=PAfterParameters nowrap>)</t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>commit: function()</td></tr></table></blockquote><p>Write out the data to a WFS server.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.commitReport"></a>commitReport</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commitReport: function(</td><td class=PParameter nowrap>string,</td></tr><tr><td></td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.refresh"></a>refresh</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>refresh: function()</td></tr></table></blockquote><p>Refreshes all the features of the layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.getDataExtent"></a>getDataExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getDataExtent: function ()</td></tr></table></blockquote><p>Calculates the max extent which includes all of the layer data.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link15 onMouseOver="ShowTip(event, ' [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function (</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Call the setOpacity method of the appro [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Features are combinations of geography and attributes. </div></div><div class=CToolTip id="tt2"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><tabl [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/WMS-js.html b/doc/apidocs/files/OpenLayers/Layer/WMS-js.html
new file mode 100644
index 0000000..722c600
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/WMS-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WMS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WMS"></a>OpenLayers.<span class=HB> </span>Layer.WMS</h1><div class=CBody><p>Instances of OpenLayers.Layer.WMS are used to display data from OGC Web Mapping Services.  Create a new WMS layer with the <a href="#OpenLayers.Layer.WMS.OpenLayers.Layer.WMS" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Layer.WMS</a [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Default is true for WMS layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.encodeBBOX"></a>encodeBBOX</h3><div class=CBody><p>{Boolean} Should the BBOX commas be encoded?  The WMS spec says ‘no’, but some services want it that way.  Default false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.noMagic"></a>noMagic</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.OpenLayers.Layer.WMS"></a>OpenLayers.<span class=HB> </span>Layer.WMS</h3><div class=CBody><p>Create a new WMS layer object</p><h4 class=CHeading>Example</h4><blockquote><pre>var wms = new OpenLayers.Layer.WMS("NASA Global Mosaic",
+                                   "http://wms.jpl.nasa.gov/wms.cgi",
+                                   {layers: "modis,global_mosaic"});</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base url for the WMS (e.g.  <a href="http://wms.jpl.nasa.gov/wms.cgi" class=LURL target=_top>http://wms.jpl.nasa.gov/wms.cgi</a> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.reverseAxisOrder"></a>reverseAxisOrder</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>reverseAxisOrder: function()</td></tr></table></blockquote><p>Returns true if the axis order is reversed for the WMS version and projection of the layer.</p><h4 class=CHeading>Returns</h4><p>{Boolean} true if the axis order is reversed, false otherwise.</p></div>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Catch changeParams and uppe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.getFullRequestString"></a>getFullRequestString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFullRequestString:function(</td><td class=PParameter nowrap>newParams,</td></tr><tr><td></td><td class=PParameter nowrap>altUrl</td><td class=PAfterParameters nowrap>)</t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>reverseAxisOrder: function()</td></tr></table></blockquote>Returns true if the axis order is reversed for the WMS version and projection of the layer.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParam [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/WMS/Post-js.html b/doc/apidocs/files/OpenLayers/Layer/WMS/Post-js.html
new file mode 100644
index 0000000..b5286df
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/WMS/Post-js.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WMS.Post - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WMS.Post"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WMS.Post</h1><div class=CBody><p>Instances of OpenLayers.Layer.WMS.Post are used to retrieve data from OGC Web Mapping Services via HTTP-POST (application/x-www-form-urlencoded).  Create a new WMS layer with the <a href="#OpenLayers.Layer.WMS.Post.OpenLayers.Layer.WMS.Post" class=LConstructor id=lin [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.unsupportedBrowsers"></a>unsupportedBrowsers</h3><div class=CBody><p>{Array} Array with browsers, which should use the HTTP-GET protocol instead of HTTP-POST for fetching tiles from a WMS . Defaults to [“mozilla”, “firefox”, “opera”], because Opera is not able to show transparent images in IFrames and Firefox/Mozilla has some ugly effects of viewport-shaking wh [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.OpenLayers.Layer.WMS.Post"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WMS.Post</h3><div class=CBody><p>Creates a new WMS layer object.</p><h4 class=CHeading>Example</h4><blockquote><pre>var wms = new OpenLayers.Layer.WMS.Post(
+ "NASA Global Mosaic",
+ "http://wms.jpl.nasa.gov/wms.cgi",
+ {layers: "modis, global_mosaic"});</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base url for the WMS (e.g.  <a href="http://wms.jpl.nasa.gov/wms.cgi" class=LURL target=_top>http://wms.jpl.nasa.gov/wms.cgi</a>)</td></tr><tr><td class=CDLEntry [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Creates a new WMS layer object.</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.WMS are used to display data from OGC Web Mapping Services. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/WMS/Untiled-js.html b/doc/apidocs/files/OpenLayers/Layer/WMS/Untiled-js.html
new file mode 100644
index 0000000..84ab335
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/WMS/Untiled-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WMS.Untiled - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WMS.<span class=HB> </span>Untiled</h1><div class=CBody><p><b>Deprecated</b>.   To be removed in 3.0.   Instead use OpenLayers.Layer.WMS and pass the option ‘singleTile’ as true.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../WMS-js.html#OpenLayers.Layer.WMS" class=L [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.singleTile"></a>singleTile</h3><div class=CBody><p>{singleTile} Always true for untiled.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.OpenLayers.Layer.WMS.Untiled"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WMS.<span class=HB> </span>Untiled</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.WMS are used to display data from OGC Web Mapping Services. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/WMTS-js.html b/doc/apidocs/files/OpenLayers/Layer/WMTS-js.html
new file mode 100644
index 0000000..c66f1b7
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/WMTS-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WMTS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WMTS"></a>OpenLayers.<span class=HB> </span>Layer.WMTS</h1><div class=CBody><p>Instances of the WMTS class allow viewing of tiles from a service that implements the OGC WMTS specification version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} The layer will be considered a base layer.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.requestEncoding"></a>requestEncoding</h3><div class=CBody><p>{String} Request encoding.   Can be “REST” or “KVP”.   Default is “KVP”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.url"></a>url</h3><div class=CBody><p>{String} The base URL for the WMTS service.   Must be provided.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.layer"></a>layer</h3><div class=CBody><p>{String} The layer identifier advertised by the WMTS service.   Must be provided.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.matrixSet"></a>matrixSet</h3><div class=CBody><p>{String} One of the advertised matrix set identifiers.   Must be provided.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.style"></a>style</h3><div class=CBody><p>{String} One of the advertised layer styles.   Must be provided.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.format"></a>format</h3><div class=CBody><p>{String} The image MIME type.   Default is “image/jpeg”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.tileOrigin"></a>tileOrigin</h3><div class=CBody><p>{<a href="../BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a>} The top-left corner of the tile matrix in map units.   If the tile origin for each matrix in a set is different, the <a href="#OpenLayers.Layer.WMTS.matrixIds" class=LPrope [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.tileFullExtent"></a>tileFullExtent</h3><div class=CBody><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt2', 'link10')" onMouseOut="HideTip('tt2')">OpenLayers.Bounds</a>}  The full extent of the tile set.   If not supplied, the layer’s <a href="../Layer-js.html#OpenLayers.Layer.maxExtent" class=LProperty id=link11 onMouseOver [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.formatSuffix"></a>formatSuffix</h3><div class=CBody><p>{String} For REST request encoding, an image format suffix must be included in the request.   If not provided, the suffix will be derived from the <a href="#OpenLayers.Layer.WMTS.format" class=LProperty id=link12 onMouseOver="ShowTip(event, 'tt9', 'link12')" onMouseOut="HideTip('tt9')">format</a> property.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.matrixIds"></a>matrixIds</h3><div class=CBody><p>{Array} A list of tile matrix identifiers.   If not provided, the matrix identifiers will be assumed to be integers corresponding to the map zoom level.   If a list of strings is provided, each item should be the matrix identifier that corresponds to the map zoom level.  Additionally, a list of objects can be provided.   Each object [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.dimensions"></a>dimensions</h3><div class=CBody><p>{Array} For RESTful request encoding, extra dimensions may be specified.  Items in this list should be property names in the <a href="#OpenLayers.Layer.WMTS.params" class=LProperty id=link15 onMouseOver="ShowTip(event, 'tt5', 'link15')" onMouseOut="HideTip('tt5')">params</a> object.  Values of extra dimensions will be determined from the co [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.params"></a>params</h3><div class=CBody><p>{Object} Extra parameters to include in tile requests.   For KVP <a href="#OpenLayers.Layer.WMTS.requestEncoding" class=LProperty id=link17 onMouseOver="ShowTip(event, 'tt11', 'link17')" onMouseOut="HideTip('tt11')">requestEncoding</a>, these properties will be encoded in the request query string.   For REST <a href="#OpenLayers.Layer.WMTS.requestE [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.zoomOffset"></a>zoomOffset</h3><div class=CBody><p>{Number} If your cache has more levels than you want to provide access to with this layer, supply a zoomOffset.   This zoom offset is added to the current map zoom level to determine the level for a requested tile.   For example, if you supply a zoomOffset of 3, when the map is at the zoom 0, tiles will be requested from level 3 of your cac [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.OpenLayers.Layer.WMTS"></a>OpenLayers.<span class=HB> </span>Layer.WMTS</h3><div class=CBody><p>Create a new WMTS layer.</p><h4 class=CHeading>Example</h4><blockquote><pre>var wmts = new OpenLayers.Layer.WMTS({
+    name: "My WMTS Layer",
+    url: "http://example.com/wmts",
+    layer: "layer_id",
+    style: "default",
+    matrixSet: "matrix_id"
+});</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} Configuration properties for the layer.</td></tr></table><h4 class=CHeading>Required configuration properties</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} The base url for the service.   See the <a href="# [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams: function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Extend the existing layer [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function(</td><td class=PParameter nowrap>obj</td><td [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/WorldWind-js.html b/doc/apidocs/files/OpenLayers/Layer/WorldWind-js.html
new file mode 100644
index 0000000..11340a9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/WorldWind-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WorldWind - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WorldWind"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WorldWind</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Grid</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>WorldWind layer is a base layer by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.lzd"></a>lzd</h3><div class=CBody><p>LevelZeroTileSizeDegrees</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.zoomLevels"></a>zoomLevels</h3><div class=CBody><p>Number of zoom levels.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.OpenLayers.Layer.WorldWind"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WorldWind</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} Name of Layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base URL</td>< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for layers that use a lattice of tiles. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/XYZ-js.html b/doc/apidocs/files/OpenLayers/Layer/XYZ-js.html
new file mode 100644
index 0000000..9d987ff
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/XYZ-js.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.XYZ - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.XYZ"></a>OpenLayers.<span class=HB> </span>Layer.XYZ</h1><div class=CBody><p>The XYZ class is designed to make it easier for people who have tiles arranged by a standard XYZ grid.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Lay [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>Default is true, as this is designed to be a base tile source.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.sphericalMecator"></a>sphericalMecator</h3><div class=CBody><p>Whether the tile extents should be set to the defaults for spherical mercator.  Useful for things like OpenStreetMap.  Default is false, except for the OSM subclass.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.zoomOffset"></a>zoomOffset</h3><div class=CBody><p>{Number} If your cache has more zoom levels than you want to provide access to with this layer, supply a zoomOffset.   This zoom offset is added to the current map zoom level to determine the level for a requested tile.   For example, if you supply a zoomOffset of 3, when the map is at the zoom 0, tiles will be requested from level 3 of your [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.OpenLayers.Layer.XYZ"></a>OpenLayers.<span class=HB> </span>Layer.XYZ</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When the layer is added to a map, then we can fetch our  [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Layer.OSM"></a>OpenLayers.<span class=HB> </span>Layer.OSM</h2><div class=CBody><p>A class to access OpenStreetMap tiles.  By default, uses the OpenStreetMap hosted tile.openstreetmap.org ‘Mapnik’ tileset.  If you wish to use tiles at home / osmarender layer instead, you can pass a layer like:</p><blockquote><pre>new OpenLayers.Layer.OSM("t at h",
+  "http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png");</pre></blockquote><p>This layer defaults to Spherical Mercator.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="#OpenLayers.Layer.XYZ" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Layer.XYZ</a></li></ul></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a clone of this layer</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Yahoo-js.html b/doc/apidocs/files/OpenLayers/Layer/Yahoo-js.html
new file mode 100644
index 0000000..9b10eee
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Yahoo-js.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Yahoo - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Yahoo"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Yahoo</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="EventPane-js.html#OpenLayers.Layer.EventPane" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt18', 'link18')" onMouseOut="HideTip('tt18')">OpenLayers.Layer.EventPane</a></li><li><a href="FixedZoomLevels-js.html#OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.MIN_ZOOM_LEVEL"></a>MIN_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 0</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.MAX_ZOOM_LEVEL"></a>MAX_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 17</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.RESOLUTIONS"></a>RESOLUTIONS</h3><div class=CBody><p>{Array(Float)} Hardcode these resolutions so that they are more closely tied with the standard wms projection</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.type"></a>type</h3><div class=CBody><p>{YahooMapType}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><p>{Boolean} Allow user to pan forever east/west.   Default is true.  Setting this to false only restricts panning if <a href="#OpenLayers.Layer.Yahoo.sphericalMercator" class=LProperty id=link20 onMouseOver="ShowTip(event, 'tt20', 'link20')" onMouseOut="HideTip('tt20')">sphericalMercator</a> is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.sphericalMercator"></a>sphericalMercator</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.OpenLayers.Layer.Yahoo"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Yahoo</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Overridden from EventPane because we need to remove th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getOLZoomFromMapObjectZoom"></a>getOLZoomFromMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getOLZoomFromMapObjectZoom: function(</td><td class=PParameter nowrap>moZoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectZoomFromOLZoom"></a>getMapObjectZoomFromOLZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectZoomFromOLZoom: function(</td><td class=PParameter nowrap>olZoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectCenter"></a>getMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectCenter: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} The mapObject’s current center in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.dragPanMapObject"></a>dragPanMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragPanMapObject: function(</td><td class=PParameter nowrap>dX,</td></tr><tr><td></td><td class=PParameter nowrap>dY</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectZoom"></a>getMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectZoom: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The mapObject’s current zoom, in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getLongitudeFromMapObjectLonLat"></a>getLongitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLongitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getLatitudeFromMapObjectLonLat"></a>getLatitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLatitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterPara [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getXFromMapObjectPixel"></a>getXFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getXFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getYFromMapObjectPixel"></a>getYFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getYFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectSizeFromOLSize"></a>getMapObjectSizeFromOLSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectSizeFromOLSize: function(</td><td class=PParameter nowrap>olSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Overridden from EventPane because we need to remove this yahoo event pane which prohibits our drag and drop, and we can only do this once [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Layer/Zoomify-js.html b/doc/apidocs/files/OpenLayers/Layer/Zoomify-js.html
new file mode 100644
index 0000000..9a89829
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Layer/Zoomify-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Zoomify - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Zoomify"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Zoomify</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Layer.Grid</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STit [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.OpenLayers.Layer.Zoomify"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Zoomify</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer.</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} - Relative o [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When the layer is added to a map, then we can fetch  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Map-js.html b/doc/apidocs/files/OpenLayers/Map-js.html
new file mode 100644
index 0000000..95766de
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Map-js.html
@@ -0,0 +1,240 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Map - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Map"></a>OpenLayers.Map</h1><div class=CBody><p>Instances of OpenLayers.Map are interactive maps embedded in a web page.  Create a new map with the <a href="#OpenLayers.Map.OpenLayers.Map" class=LConstructor id=link67 onMouseOver="ShowTip(event, 'tt62', 'link67')" onMouseOut="HideTip('tt62')">OpenLayers.Map</a> constructor.</p><p>On their own maps do not provide much functionality [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Z_INDEX_BASE"></a>Z_INDEX_BASE</h3><div class=CBody><p>{Object} Base z-indexes for different classes of thing</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>map.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.</p><h4 class=C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} An events object that handles all events on the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.allOverlays"></a>allOverlays</h3><div class=CBody><p>{Boolean} Allow the map to function with “overlays” only.   Defaults to false.   If true, the lowest layer in the draw order will act as the base layer.   In addition, if set to true, all layers will have isBaseLayer set to false when they are added to the map.</p><h4 class=CHeading>Note</h4><p>If you set map.allOverlays to true [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.div"></a>div</h3><div class=CBody><p>{DOMElement|String} The element that contains the map (or an id for that element).   If the <a href="#OpenLayers.Map.OpenLayers.Map" class=LConstructor id=link72 onMouseOver="ShowTip(event, 'tt62', 'link72')" onMouseOut="HideTip('tt62')">OpenLayers.Map</a> constructor is called with two arguments, this should be provided as the first argument.  Alternatively, t [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>)} Ordered list of layers in the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.baseLayer"></a>baseLayer</h3><div class=CBody><p>{<a href="Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>} The currently selected base layer.   This determines min/max zoom level, projection, etc.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.tileSize"></a>tileSize</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link77 onMouseOver="ShowTip(event, 'tt1', 'link77')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Set in the map options to override the default tile size for this map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.projection"></a>projection</h3><div class=CBody><p>{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”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.units"></a>units</h3><div class=CBody><p>{String} The map units.   Defaults to ‘degrees’.   Possible values are ‘degrees’ (or ‘dd’), ‘m’, ‘ft’, ‘km’, ‘mi’, ‘inches’.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.resolutions"></a>resolutions</h3><div class=CBody><p>{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.).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.maxResolution"></a>maxResolution</h3><div class=CBody><p>{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 displaying the whole world.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.minResolution"></a>minResolution</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.maxScale"></a>maxScale</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.minScale"></a>minScale</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.maxExtent"></a>maxExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link78 onMouseOver="ShowTip(event, 'tt2', 'link78')" onMouseOut="HideTip('tt2')">OpenLayers.Bounds</a>} The maximum extent for the map.   Defaults to the whole world in decimal degrees (-180, -90, 180, 90).   Specify a different extent in the map options if you are not using a geo [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.minExtent"></a>minExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link79 onMouseOver="ShowTip(event, 'tt2', 'link79')" onMouseOut="HideTip('tt2')">OpenLayers.Bounds</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.restrictedExtent"></a>restrictedExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link80 onMouseOver="ShowTip(event, 'tt2', 'link80')" onMouseOut="HideTip('tt2')">OpenLayers.Bounds</a>} Limit map navigation to this extent where possible.  If a non-null restrictedExtent is set, panning will be restricted to the given bounds.   In addition, zooming  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.numZoomLevels"></a>numZoomLevels</h3><div class=CBody><p>{Integer} Number of zoom levels for the map.   Defaults to 16.   Set a different value in the map options if needed.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.theme"></a>theme</h3><div class=CBody><p>{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 stylesheets or style declarations directly in your page.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.displayProjection"></a>displayProjection</h3><div class=CBody><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link81 onMouseOver="ShowTip(event, 'tt3', 'link81')" onMouseOut="HideTip('tt3')">OpenLayers.Projection</a>} 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 displ [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.fallThrough"></a>fallThrough</h3><div class=CBody><p>{Boolean} Should OpenLayers allow events on the map to fall through to other elements on the page, or should it swallow them?  (#457) Default is to fall through.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.eventListeners"></a>eventListeners</h3><div class=CBody><p>{Object} If set as an option at construction, the eventListeners object will be registered with <a href="Events-js.html#OpenLayers.Events.on" class=LFunction id=link82 onMouseOver="ShowTip(event, 'tt4', 'link82')" onMouseOut="HideTip('tt4')">OpenLayers.Events.on</a>.   Object structure must be a listeners object as shown in the example for the  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.panMethod"></a>panMethod</h3><div class=CBody><p>{Function} The Easing function to be used for tweening.   Default is OpenLayers.Easing.Expo.easeOut.  Setting this to ‘null’ turns off animated panning.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.OpenLayers.Map"></a>OpenLayers.Map</h3><div class=CBody><p>Constructor for a new OpenLayers.Map instance.   There are two possible ways to call the map constructor.   See the examples below.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>div</td><td class=CDLDescription>{DOMElement|String}  The element or id of an e [...]
+var map = new OpenLayers.Map("map1");
+
+// create a map with non-default options in an element with id "map2"
+var options = {
+    maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+    maxResolution: 156543,
+    units: 'm',
+    projection: "EPSG:41001"
+};
+var map = new OpenLayers.Map("map2", options);</pre></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Examples (method two</td><td class=CDLDescription>single argument):</td></tr></table><blockquote><pre>// create a map with non-default options
+var map = new OpenLayers.Map({
+    div: "map_id",
+    maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+    maxResolution: 156543,
+    units: 'm',
+    projection: "EPSG:41001"
+});
+
+// create a map without a reference to a container - call render later
+var map = new OpenLayers.Map({
+    maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+    maxResolution: 156543,
+    units: 'm',
+    projection: "EPSG:41001"
+});</pre></blockquote></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.render"></a>render</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>render: function(</td><td class=PParameter nowrap>div</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Render the map to a specified container.</p><h4 class=CHeading [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy:function()</td></tr></table></blockquote><p>Destroy this map</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setOptions"></a>setOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOptions: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Change the map options</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getTileSize"></a>getTileSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getTileSize: function()</td></tr></table></blockquote><p>Get the tile size for the map</p><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link85 onMouseOver="ShowTip(event, 'tt1', 'link85')" onMouseOut="HideTip('tt1')">OpenLayer [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getBy"></a>getBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getBy: function(</td><td class=PParameter nowrap>array,</td></tr><tr><td></td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayersBy"></a>getLayersBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayersBy: function(</td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayersByName"></a>getLayersByName</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayersByName: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of layers with names m [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayersByClass"></a>getLayersByClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayersByClass: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of layers of a give [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getControlsBy"></a>getControlsBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsBy: function(</td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getControlsByClass"></a>getControlsByClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsByClass: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of controls o [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayer"></a>getLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayer: function(</td><td class=PParameter nowrap>id</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a layer based on its id</p><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addLayer"></a>addLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addLayer: function (</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellsp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addLayers"></a>addLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addLayers: function (</td><td class=PParameter nowrap>layers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 ce [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.removeLayer"></a>removeLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeLayer: function(</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>setNewBaseLayer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getNumLayers"></a>getNumLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getNumLayers: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Int} The number of layers attached to the map.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayerIndex"></a>getLayerIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayerIndex: function (</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setLayerIndex"></a>setLayerIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayerIndex: function (</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>idx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.raiseLayer"></a>raiseLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>raiseLayer: function (</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>delta</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bloc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setBaseLayer"></a>setBaseLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBaseLayer: function(</td><td class=PParameter nowrap>newBaseLayer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Allows user to specify one of the c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addControl"></a>addControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addControl: function (</td><td class=PParameter nowrap>control,</td></tr><tr><td></td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addControls"></a>addControls</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addControls: function (</td><td class=PParameter nowrap>controls,</td></tr><tr><td></td><td class=PParameter nowrap>pixels</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getControl"></a>getControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControl: function (</td><td class=PParameter nowrap>id</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.removeControl"></a>removeControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeControl: function (</td><td class=PParameter nowrap>control</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove a control from the map.  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addPopup"></a>addPopup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addPopup: function(</td><td class=PParameter nowrap>popup,</td></tr><tr><td></td><td class=PParameter nowrap>exclusive</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.removePopup"></a>removePopup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removePopup: function(</td><td class=PParameter nowrap>popup</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getSize"></a>getSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getSize: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link96 onMouseOver="ShowTip(event, 'tt1', 'link96')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} An <a href="BaseTypes/Size-js.html# [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.updateSize"></a>updateSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateSize: function()</td></tr></table></blockquote><p>This function should be called by any external code which dynamically changes the size of the map div (because mozilla wont let us catch the “onresize” for an element)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getCenter"></a>getCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCenter: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link98 onMouseOver="ShowTip(event, 'tt33', 'link98')" onMouseOut="HideTip('tt33')">OpenLayers.LonLat</a>}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getZoom"></a>getZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getZoom: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.pan"></a>pan</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pan: function(</td><td class=PParameter nowrap>dx,</td></tr><tr><td></td><td class=PParameter nowrap>dy,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.panTo"></a>panTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>panTo: function(</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Allows user to pan to a new lonlat If the new lonlat is in the [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setCenter"></a>setCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setCenter: function(</td><td class=PParameter nowrap>lonlat,</td></tr><tr><td></td><td class=PParameter nowrap>zoom,</td></tr><tr><td></td><td class=PParameter nowrap>dragging,</td></tr><tr><td></td><t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getProjection"></a>getProjection</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getProjection: function()</td></tr></table></blockquote><p>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 projec [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getProjectionObject"></a>getProjectionObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getProjectionObject: function()</td></tr></table></blockquote><p>Returns the projection obect from the baselayer.</p><h4 class=CHeading>Returns</h4><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link100 onMouseOver="ShowTip(event, 'tt3', 'l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getMaxResolution"></a>getMaxResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMaxResolution: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} The Map’s Maximum Resolution</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getMaxExtent"></a>getMaxExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMaxExtent: function (</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getNumZoomLevels"></a>getNumZoomLevels</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getNumZoomLevels: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The total number of zoom levels that can be displayed by the current baseLayer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getExtent"></a>getExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link102 onMouseOver="ShowTip(event, 'tt2', 'link102')" onMouseOut="HideTip('tt2')">OpenLayers.Bounds</a>} A Bounds object which [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getResolution"></a>getResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The current resolution of the map.  If no baselayer is set, returns null.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getUnits"></a>getUnits</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getUnits: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The current units of the map.  If no baselayer is set, returns null.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getScale"></a>getScale</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getScale: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The current scale denominator of the map.  If no baselayer is set, returns null.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getZoomForExtent"></a>getZoomForExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForExtent: function (</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getResolutionForZoom"></a>getResolutionForZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getResolutionForZoom: function(</td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getZoomForResolution"></a>getZoomForResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForResolution: function(</td><td class=PParameter nowrap>resolution,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomTo"></a>zoomTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomTo: function(</td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Zoom to a specific zoom level</p><h4 class=CHeading>Parameter [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomIn"></a>zoomIn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>zoomIn: function()</td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>zoom</td><td class=CDLDescription>{int}</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomOut"></a>zoomOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>zoomOut: function()</td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>zoom</td><td class=CDLDescription>{int}</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomToExtent"></a>zoomToExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomToExtent: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomToMaxExtent"></a>zoomToMaxExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomToMaxExtent: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Zoom to the full extent and rec [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomToScale"></a>zoomToScale</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomToScale: function(</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getViewPortPxFromLonLat"></a>getViewPortPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getViewPortPxFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLonLatFromPixel"></a>getLonLatFromPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromPixel: function (</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getPixelFromLonLat"></a>getPixelFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getPixelFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns a pixel locati [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getViewPortPxFromLayerPx"></a>getViewPortPxFromLayerPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getViewPortPxFromLayerPx:function(</td><td class=PParameter nowrap>layerPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 clas [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayerPxFromViewPortPx"></a>getLayerPxFromViewPortPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayerPxFromViewPortPx:function(</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayerPxFromLonLat"></a>getLayerPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayerPxFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.TILE_WIDTH"></a>TILE_WIDTH</h3><div class=CBody><p>{Integer} 256 Default tile width (unless otherwise specified)</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.TILE_HEIGHT"></a>TILE_HEIGHT</h3><div class=CBody><p>{Integer} 256 Default tile height (unless otherwise specified)</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt3"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellsp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Marker-js.html b/doc/apidocs/files/OpenLayers/Marker-js.html
new file mode 100644
index 0000000..ef27039
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Marker-js.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Marker - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Marker"></a>OpenLayers.<span class=HB> </span>Marker</h1><div class=CBody><p>Instances of OpenLayers.Marker are a combination of a <a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a> and an <a href="Icon-js.html#OpenLayers.Icon" class=LClass id=link6 onMouseOver="ShowTi [...]
+map.addLayer(markers);
+
+var size = new OpenLayers.Size(21,25);
+var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
+var icon = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png', size, offset);
+markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon));
+markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon.clone()));</pre></blockquote><p>Note that if you pass an icon into the Marker constructor, it will take that icon and use it.  This means that you should not share icons between markers -- you use them once, but you should clone() for any additional markers using that same icon.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpaddin [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.OpenLayers.Marker"></a>OpenLayers.<span class=HB> </span>Marker</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>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 att [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.isDrawn"></a>isDrawn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>isDrawn: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the marker is drawn.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([22, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt2"><div class=CClass>The icon represents a graphical icon on the screen. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Destroy the marker. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Marker/Box-js.html b/doc/apidocs/files/OpenLayers/Marker/Box-js.html
new file mode 100644
index 0000000..c893a63
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Marker/Box-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Marker.Box - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Marker.Box"></a>OpenLayers.<span class=HB> </span>Marker.Box</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Marker-js.html#OpenLayers.Marker" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Marker</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBord [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.OpenLayers.Marker.Box"></a>OpenLayers.<span class=HB> </span>Marker.Box</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>bounds</td><td class=CDLDescription>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([22, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Marker are a combination of a OpenLayers.LonLat and an OpenLayers.Icon.</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent bounding boxes. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Popup-js.html b/doc/apidocs/files/OpenLayers/Popup-js.html
new file mode 100644
index 0000000..6870059
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Popup-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup"></a>OpenLayers.<span class=HB> </span>Popup</h1><div class=CBody><p>A popup is a small div that can opened and closed on the map.  Typically opened in response to clicking on a marker.  See <a href="Marker-js.html#OpenLayers.Marker" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt4', 'link5')" onMouseOut="HideTip('tt4')">OpenLayers.Marker</a>.   Popup’s [...]
+                   new OpenLayers.LonLat(5,40),
+                   new OpenLayers.Size(200,200),
+                   "example popup",
+                   true);
+
+map.addPopup(popup);</pre></blockquote><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Popup" >OpenLayers.<span class=HB> </span>Popup</a></td><td class=SDescription>A popup is a small div that can opened and closed on the map. </td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#OpenLayers.Popup.Properties" >Properties</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.autoSize"></a>autoSize</h3><div class=CBody><p>{Boolean} Resize the popup to auto-fit the contents.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.minSize"></a>minSize</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Minimum size allowed for the popup’s contents.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.maxSize"></a>maxSize</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt1', 'link8')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Maximum size allowed for the popup’s contents.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.panMapIfOutOfView"></a>panMapIfOutOfView</h3><div class=CBody><p>{Boolean} When drawn, pan map such that the entire popup is visible in the current viewport (if necessary).  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.keepInMap"></a>keepInMap</h3><div class=CBody><p>{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 [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.closeOnMove"></a>closeOnMove</h3><div class=CBody><p>{Boolean} When map pans, close the popup.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.OpenLayers.Popup"></a>OpenLayers.<span class=HB> </span>Popup</h3><div class=CBody><p>Create a popup.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String} a unqiue identifier for this popup.   If null is passed an identifier will be automatically generated.</td></tr><tr><td class=CDLE [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.updateSize"></a>updateSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateSize: function()</td></tr></table></blockquote><p>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</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.getSafeContentSize"></a>getSafeContentSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getSafeContentSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Paramet [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateSize: function()</td></tr></table></blockquote>Auto size the popup so that it precisely fits its contents (as determined by this.contentDiv.innerHTML). </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 ce [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Popup/Anchored-js.html b/doc/apidocs/files/OpenLayers/Popup/Anchored-js.html
new file mode 100644
index 0000000..14fb5d3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Popup/Anchored-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup.Anchored - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup.Anchored"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Anchored</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Popup-js.html#OpenLayers.Popup" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Popup</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>S [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.keepInMap"></a>keepInMap</h3><div class=CBody><p>{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 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.OpenLayers.Popup.Anchored"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Anchored</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="../BaseTypes/LonLat-js.html#O [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.show"></a>show</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote><p>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)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize:function(</td><td class=PParameter nowrap>contentSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bor [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote>Overridden from Popup since user might hide popup and then show() it in a new location (meaning we might want to update the [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Popup/AnchoredBubble-js.html b/doc/apidocs/files/OpenLayers/Popup/AnchoredBubble-js.html
new file mode 100644
index 0000000..2beea71
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Popup/AnchoredBubble-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup.AnchoredBubble - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>AnchoredBubble</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Anchored-js.html#OpenLayers.Popup.Anchored" class=LClass >OpenLayers.Popup.Anchored</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cell [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.OpenLayers.Popup.AnchoredBubble"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>AnchoredBubble</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="../BaseType [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize:function(</td><td class=PParameter nowrap>contentSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.setBackgroundColor"></a>setBackgroundColor</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBackgroundColor:function(</td><td class=PParameter nowrap>color</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=C [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity:function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.CORNER_SIZE"></a>CORNER_SIZE</h3><div class=CBody><p>{Integer} 5.  Border space for the RICO corners.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize:function(</td><td class=PParameter nowrap>contentSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Proto [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Popup/Framed-js.html b/doc/apidocs/files/OpenLayers/Popup/Framed-js.html
new file mode 100644
index 0000000..793fa89
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Popup/Framed-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup.Framed - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup.Framed"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Framed</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Anchored-js.html#OpenLayers.Popup.Anchored" class=LClass >OpenLayers.Popup.Anchored</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.isAlphaImage"></a>isAlphaImage</h3><div class=CBody><p>{Boolean} The image has some alpha and thus needs to use the alpha image hack.  Note that setting this to true will have no noticeable effect in FF or IE7 browsers, but will all but crush the ie6 browser.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.fixedRelativePosition"></a>fixedRelativePosition</h3><div class=CBody><p>{Boolean} We want the framed popup to work dynamically placed relative to its anchor but also in just one fixed position.  A well designed framed popup will have the pixels and logic to display itself in any of the four relative positions, but (understandably), this will not be the case for all of them.  By setting t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.OpenLayers.Popup.Framed"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Framed</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="../BaseTypes/LonLat-js.html#OpenLay [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.setBackgroundColor"></a>setBackgroundColor</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBackgroundColor:function(</td><td class=PParameter nowrap>color</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.setBorder"></a>setBorder</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setBorder:function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize:function(</td><td class=PParameter nowrap>contentSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Overridden here, because we need to update  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBackgroundColor:function(</td><td class=PParameter nowrap>color</td><td class=PAfter [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Popup/FramedCloud-js.html b/doc/apidocs/files/OpenLayers/Popup/FramedCloud-js.html
new file mode 100644
index 0000000..c1fe1a3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Popup/FramedCloud-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup.FramedCloud - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup.FramedCloud"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>FramedCloud</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Framed-js.html#OpenLayers.Popup.Framed" class=LClass >OpenLayers.Popup.Framed</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 ce [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.autoSize"></a>autoSize</h3><div class=CBody><p>{Boolean} Framed Cloud is autosizing by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.panMapIfOutOfView"></a>panMapIfOutOfView</h3><div class=CBody><p>{Boolean} Framed Cloud does pan into view by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.imageSize"></a>imageSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.isAlphaImage"></a>isAlphaImage</h3><div class=CBody><p>{Boolean} The FramedCloud does not use an alpha image (in honor of the good ie6 folk out there)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.fixedRelativePosition"></a>fixedRelativePosition</h3><div class=CBody><p>{Boolean} The Framed Cloud popup works in just one fixed position.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.minSize"></a>minSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.maxSize"></a>maxSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.OpenLayers.Popup.FramedCloud"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>FramedCloud</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="../BaseTypes/LonLat- [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt4"><div class=CClass>This class represents a screen  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Projection-js.html b/doc/apidocs/files/OpenLayers/Projection-js.html
new file mode 100644
index 0000000..7cc0520
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Projection-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Projection - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Projection"></a>OpenLayers.<span class=HB> </span>Projection</h1><div class=CBody><p>Class for coordinate transforms between coordinate systems.  Depends on the proj4js library.  If proj4js is not available, then this is just an empty stub.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.OpenLayers.Projection"></a>OpenLayers.<span class=HB> </span>Projection</h3><div class=CBody><p>This class offers several methods for interacting with a wrapped pro4js projection object.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>projCode</td><td class=CDLDescription>{String} A string identifying the Well Known Ide [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.getCode"></a>getCode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCode: function()</td></tr></table></blockquote><p>Get the string SRS code.</p><h4 class=CHeading>Returns</h4><p>{String} The SRS code.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.getUnits"></a>getUnits</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getUnits: function()</td></tr></table></blockquote><p>Get the units string for the projection -- returns null if proj4js is not available.</p><h4 class=CHeading>Returns</h4><p>{String} The units abbreviation.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.addTransform"></a>addTransform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Projection.addTransform = function(</td><td class=PParameter nowrap>from,</td></tr><tr><td></td><td class=PParameter nowrap>to,</td></tr><tr><td></td><td class=PParameter nowrap [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Projection.transform = function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>des [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCode: function()</td></tr></table></blockquote>Get the string SRS code.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getUnits: function()</td></tr></table></blockquote>Get the units string for the projection -- returns null if proj4js is not available.</div></div [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol-js.html b/doc/apidocs/files/OpenLayers/Protocol-js.html
new file mode 100644
index 0000000..66679b4
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol"></a>OpenLayers.<span class=HB> </span>Protocol</h1><div class=CBody><p>Abstract vector layer protocol class.   Not to be instantiated directly.   Use one of the protocol subclasses instead.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.OpenLayers.Protocol"></a>OpenLayers.<span class=HB> </span>Protocol</h3><div class=CBody><p>Abstract class for vector protocols.   Create instances of a subclass.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance. [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct a request for reading new features.</p><h4 class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.create"></a>create</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>create: function()</td></tr></table></blockquote><p>Construct a request for writing newly created features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>features</td><td class=CDLDescription>{Array({<a h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>update: function()</td></tr></table></blockquote><p>Construct a request updating modified features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>features</td><td class=CDLDescription>{Array({<a href="Fea [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.delete"></a>delete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>"delete": function()</td></tr></table></blockquote><p>Construct a request deleting a removed feature.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>feature</td><td class=CDLDescription>{<a href= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>commit: function()</td></tr></table></blockquote><p>Go over the features and for each take action based on the feature state.  Possible actions are create, update and delete.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList>< [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Protocol.Response"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>Response</h2><div class=CBody><p>Protocols return Response objects to their users.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Protocol.Response.Constructor" >Cons [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.OpenLayers.Protocol.Response"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>Response</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/HTTP-js.html b/doc/apidocs/files/OpenLayers/Protocol/HTTP-js.html
new file mode 100644
index 0000000..1fece19
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/HTTP-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.HTTP - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.HTTP"></a>OpenLayers.<span class=HB> </span>Protocol.HTTP</h1><div class=CBody><p>A basic HTTP protocol for vector layers.   Create a new instance with the <a href="#OpenLayers.Protocol.HTTP.OpenLayers.Protocol.HTTP" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.Protocol.HTTP</a> constructor.</p><h4 class=C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.OpenLayers.Protocol.HTTP"></a>OpenLayers.<span class=HB> </span>Protocol.HTTP</h3><div class=CBody><p>A class for giving layers generic HTTP protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct a request for reading new features.</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.create"></a>create</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>create: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>update: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.delete"></a>delete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>"delete": function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commit: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.abort"></a>abort</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>abort: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Abort an ongoing request, the response object pass [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/SOS-js.html b/doc/apidocs/files/OpenLayers/Protocol/SOS-js.html
new file mode 100644
index 0000000..e786387
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/SOS-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.SOS.DEFAULTS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CConstant"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.SOS.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SOS.<span class=HB> </span>DEFAULTS</h1><div class=CBody></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/SOS/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Protocol/SOS/v1_0_0-js.html
new file mode 100644
index 0000000..4505d72
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/SOS/v1_0_0-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.SOS.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SOS.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>An SOS v1.0.0 Protocol for vector layers.   Create a new instance with the <a href="#OpenLayers.Protocol.SOS.v1_0_0" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Protocol.SO [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.fois"></a>fois</h3><div class=CBody><p>{Array(String)} Array of features of interest (foi)</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.OpenLayers.Protocol.SOS"></a>OpenLayers.<span class=HB> </span>Protocol.SOS</h3><div class=CBody><p>A class for giving layers an SOS protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.  Valid o [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct a request for reading new sensor posit [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/SQL-js.html b/doc/apidocs/files/OpenLayers/Protocol/SQL-js.html
new file mode 100644
index 0000000..af0773e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/SQL-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.SQL - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.SQL"></a>OpenLayers.<span class=HB> </span>Protocol.SQL</h1><div class=CBody><p>Abstract SQL protocol class.   Not to be instantiated directly.   Use one of the SQL protocol subclasses instead.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.databaseName"></a>databaseName</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.tableName"></a>tableName</h3><div class=CBody><p>Name of the database table into which Features should be saved.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.OpenLayers.Protocol.SQL"></a>OpenLayers.<span class=HB> </span>Protocol.SQL</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><p>This should be overridden by specific subclasses</p><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the browser supports the SQL backend</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([24, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>This should be overridden by specific subclasses</div></div><div class=CToolTip id="tt3"><div cl [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/SQL/Gears-js.html b/doc/apidocs/files/OpenLayers/Protocol/SQL/Gears-js.html
new file mode 100644
index 0000000..aa4beb0
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/SQL/Gears-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.SQL.Gears - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears</h1><div class=CBody><p>This Protocol stores feature in the browser via the Gears Database module <a href="http://code.google.com/apis/gears/api_database.html" class=LURL target=_top>http://code.google.com<span class=HB>- </span>/apis<span class=HB>- </span>/gears< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.OpenLayers.Protocol.SQL.Gears"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><p>Determine whether a browser supports Gears</p><h4 class=CHeading>Returns</h4><p>{Boolean} The browser supports Gears</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read all features from the database and return a  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.create"></a>create</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>create: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>update: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.delete"></a>delete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>"delete": function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commit: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([24, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>Determine whether a browser supports Gears</div></div><div class=CToolTip id="tt3"><div class=CF [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/WFS-js.html b/doc/apidocs/files/OpenLayers/Protocol/WFS-js.html
new file mode 100644
index 0000000..f1fbc43
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/WFS-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.WFS.DEFAULTS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CConstant"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.WFS.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>DEFAULTS</h1><div class=CBody></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([25, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/WFS/v1-js.html b/doc/apidocs/files/OpenLayers/Protocol/WFS/v1-js.html
new file mode 100644
index 0000000..a24bc5f
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/WFS/v1-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.WFS.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.WFS.v1"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.v1</h1><div class=CBody><p>Abstract class for for v1.0.0 and v1.1.0 protocol.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Protocol</a> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.OpenLayers.Protocol.WFS"></a>OpenLayers.<span class=HB> </span>Protocol.WFS</h3><div class=CBody><p>A class for giving layers WFS protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></table><h4 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([25, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt2"><div class=CClass>Abstract vector layer protocol class. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/WFS/v1_0_0-js.html b/doc/apidocs/files/OpenLayers/Protocol/WFS/v1_0_0-js.html
new file mode 100644
index 0000000..0bbbc56
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/WFS/v1_0_0-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.WFS.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_0_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>A WFS v1.0.0 protocol for vector layers.   Create a new instance with the <a href="#OpenLayers.Protocol.WFS.v1_0_0.OpenLayers.Protocol.WFS.v1_0_0" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="Hi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_0_0.OpenLayers.Protocol.WFS.v1_0_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>A class for giving layers WFS v1.0.0 protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional ob [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([25, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>A class for giving layers WFS v1.0.0 protocol.</div></div><div class=CToolTip id="tt2"><div class=CClass>Abstract class for for v1.0.0 and v1.1.0 protocol.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Protocol/WFS/v1_1_0-js.html b/doc/apidocs/files/OpenLayers/Protocol/WFS/v1_1_0-js.html
new file mode 100644
index 0000000..3658a4c
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Protocol/WFS/v1_1_0-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.WFS.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_1_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>A WFS v1.1.0 protocol for vector layers.   Create a new instance with the <a href="#OpenLayers.Protocol.WFS.v1_1_0.OpenLayers.Protocol.WFS.v1_1_0" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="Hi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_1_0.OpenLayers.Protocol.WFS.v1_1_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>A class for giving layers WFS v1.1.0 protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional ob [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([25, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>A class for giving layers WFS v1.1.0 protocol.</div></div><div class=CToolTip id="tt2"><div class=CClass>Abstract class for for v1.0.0 and v1.1.0 protocol.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Renderer-js.html b/doc/apidocs/files/OpenLayers/Renderer-js.html
new file mode 100644
index 0000000..f5a6d42
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Renderer-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Renderer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Renderer"></a>OpenLayers.<span class=HB> </span>Renderer</h1><div class=CBody><p>This is the base class for all renderers.</p><p>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.</p><p>The functions that <b>are</b>  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.OpenLayers.Renderer"></a>OpenLayers.<span class=HB> </span>Renderer</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{<a href="BaseTypes-js.html#OpenLayers.String" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">String [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><p>This should be overridden by specific subclasses</p><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the browser supports the renderer class</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.OpenLayers.Renderer.defaultSymbolizer"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>defaultSymbolizer</h3><div class=CBody><p>{Object} Properties from this symbolizer will be applied to symbolizers with missing properties.  This can also be used to set a global symbolizer default in OpenLayers.  To be SLD 1.x compliant, add the following code before rendering any vect [...]
+    fillColor: "#808080",
+    fillOpacity: 1,
+    strokeColor: "#000000",
+    strokeOpacity: 1,
+    strokeWidth: 1,
+    pointRadius: 3,
+    graphicName: "square"
+};</pre></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>This should be overridden by specific subclasses</div></div><div class=CToolTip id="tt3"><div class=CClass>Contains co [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Renderer/Canvas-js.html b/doc/apidocs/files/OpenLayers/Renderer/Canvas-js.html
new file mode 100644
index 0000000..1981689
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Renderer/Canvas-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Renderer.Canvas - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Renderer.Canvas"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Canvas</h1><div class=CBody><p>A renderer based on the 2D ‘canvas’ drawing element.element</p><h4 class=CHeading>Inherits</h4><ul><li><a href="../Renderer-js.html#OpenLayers.Renderer" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.OpenLayers.Renderer.Canvas"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Canvas</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{<a href="../BaseTypes-js.html#OpenLayers.String" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the browser supports the renderer class</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.OpenLayers.Renderer.Canvas.LABEL_ALIGN"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Canvas.<span class=HB> </span>LABEL_ALIGN</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>{Boolean} Whether or not the browser supports the renderer class</div></div><div class=CToolTip id="tt2"><div class=CClass>This is the base class for all renderers.</div></div><div class=CToolTip id="tt3"><div class=CClass>Contains convenience functions for string manipulation.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Renderer/Elements-js.html b/doc/apidocs/files/OpenLayers/Renderer/Elements-js.html
new file mode 100644
index 0000000..57ea376
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Renderer/Elements-js.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.ElementsIndexer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.ElementsIndexer"></a>OpenLayers.<span class=HB> </span>ElementsIndexer</h1><div class=CBody><p>This class takes care of figuring out which order elements should be placed in the DOM based on given indexing methods.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.initialize"></a>initialize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>yOrdering</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a new indexer with</p><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.insert"></a>insert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>insert: function(</td><td class=PParameter nowrap>newNode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Insert a new node into the indexer.  In o [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.remove"></a>remove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>remove: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 ce [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.exists"></a>exists</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>exists: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><p>node- {DOMEleme [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.getZIndex"></a>getZIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZIndex: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get the z-index value for the current no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.getNextElement"></a>getNextElement</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNextElement: function(</td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get the next element in  [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods"></a>OpenLayers.<span class=HB> </span>ElementsIndexer.<span class=HB> </span>IndexingMethods</h2><div class=CBody><p>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.</p> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER"></a>Z_ORDER_DRAWING_ORDER</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER_DRAWING_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER"></a>Z_ORDER_Y_ORDER</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER_Y_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td></td><td class=PP [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Renderer.Elements"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Elements</h2><div class=CBody><p>This is another virtual class in that it should never be instantiated by itself as a Renderer.  It exists because there is <b>tons</b> of shared functionality between different vector libraries which use nodes/elements as a base for rendering vectors.</p><p>The highlevel bits of code that  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.BACKGROUND_ID_SUFFIX"></a>BACKGROUND_ID_SUFFIX</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.BACKGROUND_ID_SUFFIX"></a>BACKGROUND_ID_SUFFIX</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.OpenLayers.Renderer.Elements"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Elements</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} options for [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.OpenLayers.Renderer.symbol"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>symbol</h3><div class=CBody><p>Coordinate arrays for well known (named) symbols.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>yOrdering</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a new indexer with</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Renderer/SVG-js.html b/doc/apidocs/files/OpenLayers/Renderer/SVG-js.html
new file mode 100644
index 0000000..d9abf68
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Renderer/SVG-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Renderer.SVG - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Renderer.SVG"></a>OpenLayers.<span class=HB> </span>Renderer.SVG</h1><div class=CBody><h4 class=CHeading>Inherits</h4><ul><li><a href="Elements-js.html#OpenLayers.Renderer.Elements" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Renderer.Elements</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.MAX_PIXEL"></a>MAX_PIXEL</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.OpenLayers.Renderer.SVG"></a>OpenLayers.<span class=HB> </span>Renderer.SVG</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{String}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the browser supports the SVG renderer</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.OpenLayers.Renderer.SVG.LABEL_ALIGN"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>SVG.<span class=HB> </span>LABEL_ALIGN</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.OpenLayers.Renderer.SVG.LABEL_VSHIFT"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>SVG.<span class=HB> </span>LABEL_VSHIFT</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>{Boolean} Whether or not the browser supports the SVG renderer</div></div><div class=CToolTip id="tt3"><div class=CCla [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Renderer/VML-js.html b/doc/apidocs/files/OpenLayers/Renderer/VML-js.html
new file mode 100644
index 0000000..07e4a58
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Renderer/VML-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Renderer.VML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Renderer.VML"></a>OpenLayers.<span class=HB> </span>Renderer.VML</h1><div class=CBody><p>Render vector features in browsers with VML capability.   Construct a new VML renderer with the <a href="#OpenLayers.Renderer.VML.OpenLayers.Renderer.VML" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Renderer.VML</a> constructo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.OpenLayers.Renderer.VML"></a>OpenLayers.<span class=HB> </span>Renderer.VML</h3><div class=CBody><p>Create a new VML renderer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{String} The id for the element that contains the renderer</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Deconstruct the renderer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><p>Determine whether a browser supports this renderer.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The browser supports the VML renderer</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.OpenLayers.Renderer.VML.LABEL_SHIFT"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>VML.<span class=HB> </span>LABEL_SHIFT</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Deconstruct the renderer.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>Determine whether a browser supports this renderer.</div></div><div class=CToolTip id="tt3">< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Request-js.html b/doc/apidocs/files/OpenLayers/Request-js.html
new file mode 100644
index 0000000..ee576f9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Request-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Request - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Request"></a>OpenLayers.<span class=HB> </span>Request</h1><div class=CBody><p>The OpenLayers.Request namespace contains convenience methods for working with XMLHttpRequests.   These methods work with a cross-browser W3C compliant <a href="Request/XMLHttpRequest-js.html#OpenLayers.Request.XMLHttpRequest" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt9', 'link9')" onMouseOut [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.DEFAULT_CONFIG"></a>DEFAULT_CONFIG</h3><div class=CBody><p>{Object} Default configuration for all requests.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} An events object that handles all events on the {<a href="#OpenLayers.Request" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt1', 'link10')" onMouseOut="HideTip('tt1')">OpenLayers.Request</a>} object.</p><h4 class=CHeading>All event listeners will receive an event object wit [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.issue"></a>issue</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>issue: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a new XMLHttpRequest object, open it, set any heade [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.GET"></a>GET</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>GET: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP GET request.   Additional configuration proper [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.POST"></a>POST</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>POST: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send a POST request.   Additional configuration properti [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.PUT"></a>PUT</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>PUT: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP PUT request.   Additional configuration proper [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.DELETE"></a>DELETE</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>DELETE: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP DELETE request.   Additional configur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.HEAD"></a>HEAD</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>HEAD: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP HEAD request.   Additional configuration pr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.OPTIONS"></a>OPTIONS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OPTIONS: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP OPTIONS request.   Additional conf [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([28, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The OpenLayers.Request namespace contains convenience methods for working with XMLHttpRequests. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>issue: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Request/XMLHttpRequest-js.html b/doc/apidocs/files/OpenLayers/Request/XMLHttpRequest-js.html
new file mode 100644
index 0000000..3f5e20c
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Request/XMLHttpRequest-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Request.XMLHttpRequest - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Request.XMLHttpRequest"></a>OpenLayers.<span class=HB> </span>Request.<span class=HB> </span>XMLHttpRequest</h1><div class=CBody><p>Standard-compliant (W3C) cross-browser implementation of the XMLHttpRequest object.   From <a href="http://code.google.com/p/xmlhttprequest/" class=LURL target=_top>http://code.google.com/p/xmlhttprequest/</a>.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([28, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Rule-js.html b/doc/apidocs/files/OpenLayers/Rule-js.html
new file mode 100644
index 0000000..6edadc9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Rule-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Rule - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Rule"></a>OpenLayers.Rule</h1><div class=CBody><p>This class represents an SLD Rule, as being used for rule-based SLD styling.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Rule" >OpenLayers.Rule</a></td><td class=SDescription [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.name"></a>name</h3><div class=CBody><p>{String} name of this rule</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.minScaleDenominator"></a>minScaleDenominator</h3><div class=CBody><p>{Number} or {String} minimum scale at which to draw the feature.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.maxScaleDenominator"></a>maxScaleDenominator</h3><div class=CBody><p>{Number} or {String} maximum scale at which to draw the feature.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.OpenLayers.Rule"></a>OpenLayers.Rule</h3><div class=CBody><p>Creates a Rule.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the rule</td></tr></table><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Rule.OpenLayers.Rule" class=L [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>evaluates this rule for a specific feature</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this rule.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Rule.OpenLayers.Rule" class=LConstructor id=link6 onMouseOver="ShowTip(event, 'tt4', 'link6')" onMouseOut="HideTip('tt4')">OpenLayers.Rule</a>} Clone of this rule. [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory leaks</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Strategy-js.html b/doc/apidocs/files/OpenLayers/Strategy-js.html
new file mode 100644
index 0000000..58bb430
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Strategy-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy"></a>OpenLayers.<span class=HB> </span>Strategy</h1><div class=CBody><p>Abstract vector layer strategy class.   Not to be instantiated directly.   Use one of the strategy subclasses instead.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.OpenLayers.Strategy"></a>OpenLayers.<span class=HB> </span>Strategy</h3><div class=CBody><p>Abstract class for vector strategies.   Create instances of a subclass.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the strategy.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the strategy.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Strategy/BBOX-js.html b/doc/apidocs/files/OpenLayers/Strategy/BBOX-js.html
new file mode 100644
index 0000000..3e783a6
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Strategy/BBOX-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.BBOX - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.BBOX"></a>OpenLayers.<span class=HB> </span>Strategy.BBOX</h1><div class=CBody><p>A simple strategy that reads new features when the viewport invalidates some bounds.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Strategy [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.ratio"></a>ratio</h3><div class=CBody><p>{Float} The ratio of the data bounds to the viewport bounds (in each dimension).   Default is 2.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.OpenLayers.Strategy.BBOX"></a>OpenLayers.<span class=HB> </span>Strategy.BBOX</h3><div class=CBody><p>Create a new BBOX strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract vector layer strategy class. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Strategy/Cluster-js.html b/doc/apidocs/files/OpenLayers/Strategy/Cluster-js.html
new file mode 100644
index 0000000..e82ea9f
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Strategy/Cluster-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Cluster - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Cluster"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Cluster</h1><div class=CBody><p>Strategy for vector feature clustering.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Strategy</a></li></ul><! [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.distance"></a>distance</h3><div class=CBody><p>{Integer} Pixel distance between features that should be considered a single cluster.   Default is 20 pixels.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.threshold"></a>threshold</h3><div class=CBody><p>{Integer} Optional threshold below which original features will be added to the layer instead of clusters.   For example, a threshold of 3 would mean that any time there are 2 or fewer features in a cluster, those features will be added directly to the layer instead of a cluster representing those features.   Default is null (which is e [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.OpenLayers.Strategy.Cluster"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Cluster</h3><div class=CBody><p>Create a new clustering strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the inst [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully deactivated.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CClass>Abstract  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Strategy/Filter-js.html b/doc/apidocs/files/OpenLayers/Strategy/Filter-js.html
new file mode 100644
index 0000000..36b8627
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Strategy/Filter-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Filter - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Filter"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Filter</h1><div class=CBody><p>Strategy for limiting features that get added to a layer by evaluating a filter.   The strategy maintains a cache of all features until removeFeatures is called on the layer.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.St [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.filter"></a>filter</h3><div class=CBody><p>{<a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Filter</a>}  Filter for limiting features sent to the layer.  Use the <a href="#OpenLayers.Strategy.Filter.setFilter" class=LFunction id=link7 onMouseOver="ShowTip(event, 'tt4', 'link7')" onMouseOu [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.OpenLayers.Strategy.Filter"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Filter</h3><div class=CBody><p>Create a new filter strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.&n [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.  By default, this strategy automatically activates itself when a layer is added to a map.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Clear the feature cache.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully deactivated or false if the strategy was already inactive.</p></div></di [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.setFilter"></a>setFilter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setFilter: function(</td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Update the filter for this strategy.&n [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents an OGC Filter.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquot [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Strategy/Fixed-js.html b/doc/apidocs/files/OpenLayers/Strategy/Fixed-js.html
new file mode 100644
index 0000000..580f140
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Strategy/Fixed-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Fixed - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Fixed"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Fixed</h1><div class=CBody><p>A simple strategy that requests features once and never requests new data.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.preload"></a>preload</h3><div class=CBody><p>{Boolean} Load data before layer made visible.  Enabling this may result in considerable overhead if your application loads many data layers that are not visible by default.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.OpenLayers.Strategy.Fixed"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Fixed</h3><div class=CBody><p>Create a new Fixed strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the strategy.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the strategy.</div></div><div class=CToolTip id="tt2"><div class=CClass>Abstract vector layer strategy class. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Strategy/Paging-js.html b/doc/apidocs/files/OpenLayers/Strategy/Paging-js.html
new file mode 100644
index 0000000..875aeab
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Strategy/Paging-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Paging - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Paging"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging</h1><div class=CBody><p>Strategy for vector feature paging</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.Strategy</a></li></ul><!--START [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.OpenLayers.Strategy.Paging"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging</h3><div class=CBody><p>Create a new paging strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pageCount"></a>pageCount</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>pageCount: function()</td></tr></table></blockquote><p>Get the total count of pages given the current cache of features.</p><h4 class=CHeading>Returns</h4><p>{Integer} The page count.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pageNum"></a>pageNum</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>pageNum: function()</td></tr></table></blockquote><p>Get the zero based page number.</p><h4 class=CHeading>Returns</h4><p>{Integer} The current page number being displayed.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pageLength"></a>pageLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pageLength: function(</td><td class=PParameter nowrap>newLength</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Gets or sets page length.</p><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pageNext"></a>pageNext</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pageNext: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Display the next page of features.</p><h4  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pagePrevious"></a>pagePrevious</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>pagePrevious: function()</td></tr></table></blockquote><p>Display the previous page of features.</p><h4 class=CHeading>Returns</h4><p>{Boolean} A new page was displayed.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CFunction><block [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Strategy/Refresh-js.html b/doc/apidocs/files/OpenLayers/Strategy/Refresh-js.html
new file mode 100644
index 0000000..f9f628e
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Strategy/Refresh-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Refresh - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Refresh"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Refresh</h1><div class=CBody><p>A strategy that refreshes the layer.  By default the strategy waits for a call to <a href="#OpenLayers.Strategy.Refresh.refresh" class=LFunction id=link4 onMouseOver="ShowTip(event, 'tt3', 'link4')" onMouseOut="HideTip('tt3')">refresh</a> before refreshing.  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.OpenLayers.Strategy.Refresh"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Refresh</h3><div class=CBody><p>Create a new Refresh strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instanc [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.  Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.  Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.refresh"></a>refresh</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>refresh: function()</td></tr></table></blockquote><p>Tell the strategy to refresh which will refresh the layer.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CFunction><block [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Strategy/Save-js.html b/doc/apidocs/files/OpenLayers/Strategy/Save-js.html
new file mode 100644
index 0000000..0b33c58
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Strategy/Save-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Save - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Save"></a>OpenLayers.<span class=HB> </span>Strategy.Save</h1><div class=CBody><p>A strategy that commits newly created or modified features.   By default the strategy waits for a call to <a href="#OpenLayers.Strategy.Save.save" class=LFunction id=link4 onMouseOver="ShowTip(event, 'tt3', 'link4')" onMouseOut="HideTip('tt3')">save</a> before persisting changes.   By c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>strategy.events.register(type, obj, listener);</pre></blockquote><ul><li><b>start</b> Triggered before saving</li><li><b>success</b> Triggered after a successful transaction</li><li><b>fail</b> Trigg [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.auto"></a>auto</h3><div class=CBody><p>{Boolean | Number} Auto-save.   Default is false.   If true, features will be saved immediately after being added to the layer and with each modification or deletion.   If auto is a number, features will be saved on an interval provided by the value (in seconds).</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.OpenLayers.Strategy.Save"></a>OpenLayers.<span class=HB> </span>Strategy.Save</h3><div class=CBody><p>Create a new Save strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.save"></a>save</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>save: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Tell the layer protocol to commit unsaved features.&n [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CFunction><block [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Style-js.html b/doc/apidocs/files/OpenLayers/Style-js.html
new file mode 100644
index 0000000..84bf3a0
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Style-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Style - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Style"></a>OpenLayers.<span class=HB> </span>Style</h1><div class=CBody><p>This class represents a UserStyle obtained from a SLD, containing styling rules.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Style" >OpenLayers.<span [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.name"></a>name</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.layerName"></a>layerName</h3><div class=CBody><p>{<a href="BaseTypes-js.html#OpenLayers.String" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">String</a>} name of the layer that this style belongs to, usually according to the NamedLayer attribute of an SLD document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.isDefault"></a>isDefault</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.OpenLayers.Style"></a>OpenLayers.<span class=HB> </span>Style</h3><div class=CBody><p>Creates a UserStyle.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>style</td><td class=CDLDescription>{Object} Optional hash of style properties that will be used as default style for this style object.  This style applies if no rule [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.addRules"></a>addRules</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addRules: function(</td><td class=PParameter nowrap>rules</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Adds rules to this style.</p><h4 class=CHeading>Para [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.setDefaultStyle"></a>setDefaultStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setDefaultStyle: function(</td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the default style for this [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this style.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Style.OpenLayers.Style" class=LConstructor id=link10 onMouseOver="ShowTip(event, 'tt7', 'link10')" onMouseOut="HideTip('tt7')">OpenLayers.Style</a>} Clone of thi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.OpenLayers.Style.SYMBOLIZER_PREFIXES"></a>OpenLayers.<span class=HB> </span>Style.<span class=HB> </span>SYMBOLIZER_PREFIXES</h3><div class=CBody><p>{Array} prefixes of the sld symbolizers.  These are the same as the main geometry types</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Contains convenience functions for string manipulation.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory leaks</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototyp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Style2-js.html b/doc/apidocs/files/OpenLayers/Style2-js.html
new file mode 100644
index 0000000..ead993f
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Style2-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Style2 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Style2"></a>OpenLayers.<span class=HB> </span>Style2</h1><div class=CBody><p>This class represents a collection of rules for rendering features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Style2" >OpenLayers.<span class=HB> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.name"></a>name</h3><div class=CBody><p>{String} Style identifier.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.title"></a>title</h3><div class=CBody><p>{String} Title of this style.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.description"></a>description</h3><div class=CBody><p>{String} Description of this style.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.layerName"></a>layerName</h3><div class=CBody><p>{<a href="BaseTypes-js.html#OpenLayers.String" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">String</a>} Name of the layer that this style belongs to, usually according to the NamedLayer attribute of an SLD document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.isDefault"></a>isDefault</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.rules"></a>rules</h3><div class=CBody><p>{Array(<a href="Rule-js.html#OpenLayers.Rule" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt2', 'link6')" onMouseOut="HideTip('tt2')">OpenLayers.Rule</a>)} Collection of rendering rules.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.OpenLayers.Style2"></a>OpenLayers.<span class=HB> </span>Style2</h3><div class=CBody><p>Creates a style representing a collection of rendering rules.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the style.   Any documented prop [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this style.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Style2.OpenLayers.Style2" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt5', 'link8')" onMouseOut="HideTip('tt5')">OpenLayers.Style2</a>} Clone of t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Contains convenience functions for string manipulation.</div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents an SLD Rule, as being used for rule-based SLD styling.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory le [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/StyleMap-js.html b/doc/apidocs/files/OpenLayers/StyleMap-js.html
new file mode 100644
index 0000000..6423490
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/StyleMap-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.StyleMap - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.StyleMap"></a>OpenLayers.<span class=HB> </span>StyleMap</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.StyleMap" >OpenLayers.<span class=HB> </span>StyleMap</a></td><td class=SDescription></td></tr><tr class= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.OpenLayers.StyleMap"></a>OpenLayers.<span class=HB> </span>StyleMap</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>style</td><td class=CDLDescription>{Object} Optional.  Either a style hash, or a style object, or a hash of style objects (style hashes) keyed by rendering intent.  If just one st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Symbolizer-js.html b/doc/apidocs/files/OpenLayers/Symbolizer-js.html
new file mode 100644
index 0000000..f6b25a3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Symbolizer-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer"></a>OpenLayers.<span class=HB> </span>Symbolizer</h1><div class=CBody><p>Base class representing a symbolizer used for feature rendering.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer" >OpenLayers.<span  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.zIndex"></a>zIndex</h3><div class=CBody><p>{Number} The zIndex determines the rendering order for a symbolizer.  Symbolizers with larger zIndex values are rendered over symbolizers with smaller zIndex values.   Default is 0.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.OpenLayers.Symbolizer"></a>OpenLayers.<span class=HB> </span>Symbolizer</h3><div class=CBody><p>Instances of this class are not useful.   See one of the subclasses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the symbolize [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Create a copy of this symbolizer.</p><p>Returns a symbolizer of the same type with the same properties.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote>Create a copy of this symbolizer.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Symbolizer/Line-js.html b/doc/apidocs/files/OpenLayers/Symbolizer/Line-js.html
new file mode 100644
index 0000000..43f6ec0
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Symbolizer/Line-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Line - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Line"></a>OpenLayers.<span class=HB> </span>Symbolizer.Line</h1><div class=CBody><p>A symbolizer used to render line features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Line" >OpenLayers.<span class=H [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeColor"></a>strokeColor</h3><div class=CBody><p>{String} Color for line stroke.   This is a RGB hex value (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeOpacity"></a>strokeOpacity</h3><div class=CBody><p>{Number} Stroke opacity (0-1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeWidth"></a>strokeWidth</h3><div class=CBody><p>{Number} Pixel stroke width.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeLinecap"></a>strokeLinecap</h3><div class=CBody><p>{String} Stroke cap type (“butt”, “round”, or “square”).</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.OpenLayers.Symbolizer.Line"></a>OpenLayers.<span class=HB> </span>Symbolizer.Line</h3><div class=CBody><p>Create a symbolizer for rendering lines.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the symbolizer.   Any docu [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Symbolizer/Point-js.html b/doc/apidocs/files/OpenLayers/Symbolizer/Point-js.html
new file mode 100644
index 0000000..af07db5
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Symbolizer/Point-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Point - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Point"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Point</h1><div class=CBody><p>A symbolizer used to render point features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Point [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeColor"></a>strokeColor</h3><div class=CBody><p>{String} Color for line stroke.   This is a RGB hex value (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeOpacity"></a>strokeOpacity</h3><div class=CBody><p>{Number} Stroke opacity (0-1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeWidth"></a>strokeWidth</h3><div class=CBody><p>{Number} Pixel stroke width.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeLinecap"></a>strokeLinecap</h3><div class=CBody><p>{String} Stroke cap type (“butt”, “round”, or “square”).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.fillColor"></a>fillColor</h3><div class=CBody><p>{String} RGB hex fill color (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.fillOpacity"></a>fillOpacity</h3><div class=CBody><p>{Number} Fill opacity (0-1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.pointRadius"></a>pointRadius</h3><div class=CBody><p>{Number} Pixel point radius.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.externalGraphic"></a>externalGraphic</h3><div class=CBody><p>{String} Url to an external graphic that will be used for rendering points.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicWidth"></a>graphicWidth</h3><div class=CBody><p>{Number} Pixel width for sizing an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicHeight"></a>graphicHeight</h3><div class=CBody><p>{Number} Pixel height for sizing an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicOpacity"></a>graphicOpacity</h3><div class=CBody><p>{Number} Opacity (0-1) for an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicXOffset"></a>graphicXOffset</h3><div class=CBody><p>{Number} Pixel offset along the positive x axis for displacing an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicYOffset"></a>graphicYOffset</h3><div class=CBody><p>{Number} Pixel offset along the positive y axis for displacing an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.rotation"></a>rotation</h3><div class=CBody><p>{Number} The rotation of a graphic in the clockwise direction about its center point (or any point off center as specified by <a href="#OpenLayers.Symbolizer.Point.graphicXOffset" class=LProperty id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">graphicXOffset</a> and <a href="#OpenLayers.Symbolizer.Point.graphicYOff [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicName"></a>graphicName</h3><div class=CBody><p>{String} Named graphic to use when rendering points.   Supported values include “circle”, “square”, “star”, “x”, “cross”, and “triangle”.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.OpenLayers.Symbolizer.Point"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Point</h3><div class=CBody><p>Create a symbolizer for rendering points.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>{Number} Pixel offset along the positive x axis for displacing an external graphic.</div></div><div class=CToolTip id="tt2"><div class=CProperty>{Number} Pixel offset along the positive y axis for displacing an external graphic.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Symbolizer/Polygon-js.html b/doc/apidocs/files/OpenLayers/Symbolizer/Polygon-js.html
new file mode 100644
index 0000000..1f513d6
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Symbolizer/Polygon-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Polygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Polygon"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Polygon</h1><div class=CBody><p>A symbolizer used to render line features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Po [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeColor"></a>strokeColor</h3><div class=CBody><p>{String} Color for line stroke.   This is a RGB hex value (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeOpacity"></a>strokeOpacity</h3><div class=CBody><p>{Number} Stroke opacity (0-1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeWidth"></a>strokeWidth</h3><div class=CBody><p>{Number} Pixel stroke width.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeLinecap"></a>strokeLinecap</h3><div class=CBody><p>{String} Stroke cap type (“butt”, “round”, or “square”).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.fillColor"></a>fillColor</h3><div class=CBody><p>{String} RGB hex fill color (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.fillOpacity"></a>fillOpacity</h3><div class=CBody><p>{Number} Fill opacity (0-1).</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.OpenLayers.Symbolizer.Polygon"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Polygon</h3><div class=CBody><p>Create a symbolizer for rendering polygons.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Symbolizer/Raster-js.html b/doc/apidocs/files/OpenLayers/Symbolizer/Raster-js.html
new file mode 100644
index 0000000..be32c62
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Symbolizer/Raster-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Raster - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Raster"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Raster</h1><div class=CBody><p>A symbolizer used to render raster images.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Rast [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Raster.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Raster.OpenLayers.Symbolizer.Raster"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Raster</h3><div class=CBody><p>Create a symbolizer for rendering rasters.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Symbolizer/Text-js.html b/doc/apidocs/files/OpenLayers/Symbolizer/Text-js.html
new file mode 100644
index 0000000..90cc5e3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Symbolizer/Text-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Text - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Text"></a>OpenLayers.<span class=HB> </span>Symbolizer.Text</h1><div class=CBody><p>A symbolizer used to render text labels for features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Text" >OpenLayers.<s [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.label"></a>label</h3><div class=CBody><p>{String} The text for the label.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.fontFamily"></a>fontFamily</h3><div class=CBody><p>{String} The font family for the label.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.fontSize"></a>fontSize</h3><div class=CBody><p>{String} The font size for the label.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.fontWeight"></a>fontWeight</h3><div class=CBody><p>{String} The font weight for the label.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.OpenLayers.Symbolizer.Text"></a>OpenLayers.<span class=HB> </span>Symbolizer.Text</h3><div class=CBody><p>Create a symbolizer for rendering text labels.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the symbolizer.   An [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Tile-js.html b/doc/apidocs/files/OpenLayers/Tile-js.html
new file mode 100644
index 0000000..51cef4a
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Tile-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tile - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tile"></a>OpenLayers.Tile</h1><div class=CBody><p>This is a class designed to designate a single tile, however 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 <a href="#Ope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} An events object that handles all events on the tile.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.bounds"></a>bounds</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Bounds</a>} null</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy:function()</td></tr></table></blockquote><p>Nullify references to prevent circular references and memory leaks.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([31, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy:function()</td></tr></table></blockquote>Nullify references to prevent circular references and memory leaks.</div></div><div class=CToolTip id="tt3"><div class=CClass>This is a class designed to designate a single tile, however it is explicitly  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Tile/Image-js.html b/doc/apidocs/files/OpenLayers/Tile/Image-js.html
new file mode 100644
index 0000000..957c4c3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Tile/Image-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tile.Image - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tile.Image"></a>OpenLayers.<span class=HB> </span>Tile.<span class=HB> </span>Image</h1><div class=CBody><p>Instances of OpenLayers.Tile.Image are used to manage the image tiles used by various layers.   Create a new image tile with the <a href="#OpenLayers.Tile.Image" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Tile.Im [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([31, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory leaks</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Tile.Image are used to manage the image tiles used by various layers. </div></div><div class=CToolTip id="tt3"><div class=CClass>This is a class designed to design [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Tile/Image/IFrame-js.html b/doc/apidocs/files/OpenLayers/Tile/Image/IFrame-js.html
new file mode 100644
index 0000000..6cb2a86
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Tile/Image/IFrame-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tile.Image.IFrame - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tile.Image.IFrame"></a>OpenLayers.<span class=HB> </span>Tile.<span class=HB> </span>Image.<span class=HB> </span>IFrame</h1><div class=CBody><p>Instances of OpenLayers.Tile.Image.IFrame are used to manage the image tiles used by Layer.WMS.Post loaded via HTTP-POST-protocol.  Create a new image tile with the <a href="#OpenLayers.Tile.Image.IFrame.OpenLayers.Tile.Image.IFrame" clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.OpenLayers.Tile.Image.IFrame"></a>OpenLayers.<span class=HB> </span>Tile.<span class=HB> </span>Image.<span class=HB> </span>IFrame</h3><div class=CBody><p>Constructor for a new <a href="#OpenLayers.Tile.Image.IFrame.OpenLayers.Tile.Image.IFrame" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Tile.Image.IFrame</a> instance.</p [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([31, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Constructor for a new OpenLayers.Tile.Image.IFrame instance.</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Tile.Image are used to manage the image tiles used by various layers. </div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt4"><div class=CClass>Instances of this class represent bounding  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Tile/WFS-js.html b/doc/apidocs/files/OpenLayers/Tile/WFS-js.html
new file mode 100644
index 0000000..790ffd3
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Tile/WFS-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tile.WFS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tile.WFS"></a>OpenLayers.<span class=HB> </span>Tile.WFS</h1><div class=CBody><p>Instances of OpenLayers.Tile.WFS are used to manage the image tiles used by various layers.   Create a new image tile with the <a href="#OpenLayers.Tile.WFS" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Tile.WFS</a> constructor.</p><h4 class [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([31, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory leaks</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Tile.WFS are used to manage the image tiles used by various layers. </div></div><div class=CToolTip id="tt3"><div class=CClass>This is a class designed to designat [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Tween-js.html b/doc/apidocs/files/OpenLayers/Tween-js.html
new file mode 100644
index 0000000..55812e9
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Tween-js.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tween - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tween"></a>OpenLayers.<span class=HB> </span>Tween</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Tween" >OpenLayers.<span class=HB> </span>Tween</a></td><td class=SDescription></td></tr><tr class="SGroup SInd [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.INTERVAL"></a>INTERVAL</h3><div class=CBody><p>{int} Interval in milliseconds between 2 steps</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.easing"></a>easing</h3><div class=CBody><p>{<OpenLayers.Easing>(Function)} Easing equation used for the animation Defaultly set to OpenLayers.Easing.Expo.easeOut</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.begin"></a>begin</h3><div class=CBody><p>{Object} Values to start the animation with</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.finish"></a>finish</h3><div class=CBody><p>{Object} Values to finish the animation with</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.duration"></a>duration</h3><div class=CBody><p>{int} duration of the tween (number of steps)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.callbacks"></a>callbacks</h3><div class=CBody><p>{Object} An object with start, eachStep and done properties whose values are functions to be call during the animation.  They are passed the current computed value as argument.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.OpenLayers.Tween"></a>OpenLayers.<span class=HB> </span>Tween</h3><div class=CBody><p>Creates a Tween.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>easing</td><td class=CDLDescription>{<OpenLayers.Easing>(Function)} easing function method to use</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.start"></a>start</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>start: function(</td><td class=PParameter nowrap>begin,</td></tr><tr><td></td><td class=PParameter nowrap>finish,</td></tr><tr><td></td><td class=PParameter nowrap>duration,</td></tr><tr><td></td><td class=P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.stop"></a>stop</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>stop: function()</td></tr></table></blockquote><p>Stops the Tween, and calls the done callback Doesn’t do anything if animation is already finished</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Easing"></a>OpenLayers.<span class=HB> </span>Easing</h2><div class=CBody><h4 class=CHeading>Credits</h4><p>Easing Equations by Robert Penner, <a href="http://www.robertpenner.com/easing/" class=LURL target=_top>http://www.robertpenner.com/easing/</a></p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Easing.Linear"></a>OpenLayers.<span class=HB> </span>Easing.<span class=HB> </span>Linear</h2><div class=CBody></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Easing.Expo"></a>OpenLayers.<span class=HB> </span>Easing.Expo</h2><div class=CBody></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Easing.Quad"></a>OpenLayers.<span class=HB> </span>Easing.Quad</h2><div class=CBody></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>start: function(</td><td class=PParameter nowrap>begin,</td></tr><tr><td></td><td class=PParameter nowrap>finish,</td></tr><tr><td></td><td class=PParameter nowrap>duration,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/files/OpenLayers/Util-js.html b/doc/apidocs/files/OpenLayers/Util-js.html
new file mode 100644
index 0000000..e2f8c83
--- /dev/null
+++ b/doc/apidocs/files/OpenLayers/Util-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Util - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="Util"></a>Util</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#Util" >Util</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Util.Functions" >Functions</a></td><td class=SDescription></t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Util.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.extend"></a>extend</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.extend = function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.distVincenty"></a>distVincenty</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.distVincenty = function(</td><td class=PParameter nowrap>p1,</td></tr><tr><td></td><td class=PParameter nowrap>p2</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.destinationVincenty"></a>destinationVincenty</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.destinationVincenty = function(</td><td class=PParameter nowrap>lonlat,</td></tr><tr><td></td><td class=PParameter nowrap>brng,</td></tr><tr><td></td><td class=PParameter nowr [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Util.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="Util.INCHES_PER_UNIT"></a>INCHES_PER_UNIT</h3><div class=CBody><p>{Object} Constant inches per unit -- borrowed from MapServer mapscale.c derivation of nautical miles from <a href="http://en.wikipedia.org/wiki/Nautical_mile" class=LURL target=_top>http://en.wikipedia.org/wiki/Nautical_mile</a> Includes the full set of units supported by CS-MAP (<a href="http://trac.osgeo.org/csmap/" class=LURL target=_top>http://trac.osge [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="Util.DOTS_PER_INCH"></a>DOTS_PER_INCH</h3><div class=CBody><p>{Integer} 72 (A sensible default)</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Util.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getScrollbarWidth"></a>getScrollbarWidth</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.getScrollbarWidth = function()</td></tr></table></blockquote><p>This function has been modified by the OpenLayers from the original version, written by Matthew Eernisse and released under the Apache 2 license here:</p><p><a href="http://www.fleegix.org/articles/ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getFormattedLonLat"></a>getFormattedLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getFormattedLonLat = function(</td><td class=PParameter nowrap>coordinate,</td></tr><tr><td></td><td class=PParameter nowrap>axis,</td></tr><tr><td></td><td class=PParameter now [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.extend = function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Copy all properties of a source object to a destinatio [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index.html b/doc/apidocs/index.html
new file mode 100644
index 0000000..acf03fb
--- /dev/null
+++ b/doc/apidocs/index.html
@@ -0,0 +1 @@
+<html><head><meta http-equiv="Refresh" CONTENT="0; URL=files/OpenLayers-js.html"></head></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Classes.html b/doc/apidocs/index/Classes.html
new file mode 100644
index 0000000..e659eda
--- /dev/null
+++ b/doc/apidocs/index/Classes.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Class Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Class Index</div><div class=INavigationBar>$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · <a href="#O">O</a> · P · Q · R · S · T · <a href="Classes2.html#U">U</a> · V · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class= [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The OpenLayers object provides a namespace for all things OpenLayers</div></div><div class=CToolTip id="tt2"><div class=CClass><b>Deprecated</b>. </div></div><div class=CToolTip id="tt3"><div class=CClass>{Object}</div></div><div class=CToolTip id="tt4"><div class=CClass>Contains convenience functions for array manipulation.</div></div><div class=CToolTip id="tt5"><div class=CClass>Instances of this class represent bounding boxes. </div></di [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Classes2.html b/doc/apidocs/index/Classes2.html
new file mode 100644
index 0000000..476b478
--- /dev/null
+++ b/doc/apidocs/index/Classes2.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Class Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Class Index</div><div class=INavigationBar>$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · <a href="Classes.html#O">O</a> · P · Q · R · S · T · <a href="#U">U</a> · V · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class=I [...]
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Constants.html b/doc/apidocs/index/Constants.html
new file mode 100644
index 0000000..9ecb91a
--- /dev/null
+++ b/doc/apidocs/index/Constants.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Constant Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Constant Index</div><div class=INavigationBar>$#! · 0-9 · A · <a href="#B">B</a> · <a href="#C">C</a> · <a href="#D">D</a> · <a href="#E">E</a> · <a href="#F">F</a> · G · H · <a href="#I">I</a> · J · <a href="#K">K</a> · <a href="#L">L</a> · <a href="#M">M</a> · N · <a href="#O">O</a> · P · Q · <a href="#R">R</a> · [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstant>{String}</div></div><div class=CToolTip id="tt2"><div class=CConstant>{Array(String)} supported events</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3"><div class=CConstant>{Integer} 5. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt4"><div class=CConstant>{Object} with the following keys</div></div><div class=CToolTip id="tt5"><div class=CConstant>{Object} Default configuration for all requests.</div></div><div class=CToolTip id="tt6"><div class=CConstant>{Object} Simple hash map to convert format to extension.</div></div><div class=CToolTip id="tt7"><div class=CConstant>{Object} Default layers properties.</div></div><div class=CToolTip id="tt8"><div class=CConstant>{Object} Hashtable of d [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt21"><div class=CConstant>{Array(String)} Supported application event types. </div></div><div class=CToolTip id="tt22"><div class=CConstant>{Array(String)} Supported application event types. </div></div><div class=CToolTip id="tt23"><div class=CConstant>{Array(String)} Supported application event types. </div></div><div class=CToolTip id="tt24"><div class=CConstant>{Array(String)} Supported application event types. </div></div><div class=CToolTip id="tt25"><div c [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt31"><div class=CConstant>{Object} Hashtable of parameter key/value pairs which describe the folder structure for tiles as configured in the mapguide serverconfig.ini section [TileServiceProperties]</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt32"><div class=CConstant>{Object} Simple hash map to convert format to extension.</div></div><div class=CToolTip id="tt33"><div class=CConstant>{Object} Constant inches per unit -- borrowed from MapServer mapscale.c derivation of nautical miles from http://en.wikipedia.org/wiki/Nautical_mile Includes the full set of units supported by CS-MAP (http://trac.osgeo.org/csmap/) and PROJ.4 (http://trac.osgeo.org/proj/) The hardcoded table is maintain in a CS-MAP source [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt35"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt36"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt37"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt38"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt39"><div class=CConstant>keydown, keypress, keyup</div></div><div class=CToolTip id="tt40"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt41"><div class=CConstant>{int}</div></d [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt45"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt46"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt47"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt48"><div class=CConstant>{Object}</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt49"><div class=CConstant>{Integer} Firefox has a limitation where values larger or smaller than about 15000 in an SVG document lock the browser up. </div></div><div class=CToolTip id="tt50"><div class=CConstant>{Integer} 21</div></div><div class=CToolTip id="tt51"><div class=CConstant>{Integer} 17</div></div><div class=CToolTip id="tt52"><div class=CConstant>{Integer} 19</div></div><div class=CToolTip id="tt53"><div class=CConstant>{Integer} 17</div></div><div c [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt62"><div class=CConstant>{Object} Hashtable of default parameter key/value pairs for untiled layer</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt63"><div class=CConstant>{Integer} Constant used to make the control work in reshape mode</div></div><div class=CToolTip id="tt64"><div class=CConstant>{Integer} Constant used to make the control work in resize mode</div></div><div class=CToolTip id="tt65"><div class=CConstant>{Array} The properties that are used for calculating resolutions information.</div></div><div class=CToolTip id="tt66"><div class=CConstant>{Array(Float)} Hardcode these resolutions so tha [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt71"><div class=CConstant>Enumeration for service types</div></div><div class=CToolTip id="tt72"><div class=CConstant>{Object} Hashtable of default parameter key/value pairs for untiled layer</div></div><div class=CToolTip id="tt73"><div class=CConstant>OpenLayers features can have a number of style attributes. </div></div><div class=CToolTip id="tt74"><div class=CConstant>Coordinate arrays for well known (named) symbols.</div></div><div class=CToolTip id="tt75"> [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt76"><div class=CConstant>{Integer} 256 Default tile height (unless otherwise specified)</div></div><div class=CToolTip id="tt77"><div class=CConstant>{Object} Hashtable of default parameter key/value pairs for tiled layer</div></div><div class=CToolTip id="tt78"><div class=CConstant>{Integer} 256 Default tile width (unless otherwise specified)</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt79"><div class=CConstant>{Float} Used to hash URL param strings for multi-WMS server selection. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt80"><div class=CConstant>Mixin providing functionality specific to the Google Maps API v2.</div></div><div class=CToolTip id="tt81"><div class=CConstant>Mixin providing functionality specific to the Google Maps API v3. </div></div><div class=CToolTip id="tt82"><div class=CConstant>{String} 1.0.0</div></div><div class=CToolTip id="tt83"><div class=CConstant>{String} 1.1.0</div></div><div class=CToolTip id="tt84"><div class=CConstant>{String} 0.3.1</div></div><div [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt90"><div class=CConstant>{Integer}</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt91"><div class=CConstant>{Integer}</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt92"><div class=CConstant>{Object} Base z-indexes for different classes of thing</div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Constructor.html b/doc/apidocs/index/Constructor.html
new file mode 100644
index 0000000..fb89072
--- /dev/null
+++ b/doc/apidocs/index/Constructor.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Constructor Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Constructor Index</div><div class=INavigationBar>$#! · 0-9 · <a href="#A">A</a> · <a href="#B">B</a> · <a href="#C">C</a> · <a href="#D">D</a> · <a href="#E">E</a> · <a href="#F">F</a> · <a href="#G">G</a> · <a href="#H">H</a> · <a href="#I">I</a> · <a href="#J">J</a> · <a href="#K">K</a> · <a href="#L">L</a> · <a href="#M">M</a> · <a href="#N">N</a [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Create a new ArcGIS93Rest layer object.</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new ArcIMS layer object.</div></div><div class=CToolTip id="tt3"><div class=CConstructor>Create a new parser/writer for ArcXML. </div></div><div class=CToolTip id="tt4"><div class=CConstructor>Create a new parser for Atom.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt5"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt6"><div class=CConstructor>Create a new BBOX strategy.</div></div><div class=CToolTip id="tt7"><div class=CConstructor>Construct a new bounds object.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt8"><div class=CConstructor>Base class used to construct all other classes. </div></div><div class=CToolTip id="tt9"><div class=CConstructor>Create a new click handler.</div></div><div class=CToolTip id="tt10"><div class=CConstructor>Create a new clustering strategy.</div></div><div class=CToolTip id="tt11"><div class=CConstructor>Creates a Geometry Collection -- a list of geoms.</div></div><div class=CToolTip id="tt12"><div class=CConstructor>Creates a compariso [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt15"><div class=CConstructor>Returns OpenLayers.Handler.Drag</div></div><div class=CToolTip id="tt16"><div class=CConstructor>Create a new control to drag features.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt17"><div class=CConstructor>Create an editing toolbar for a given layer.</div></div><div class=CToolTip id="tt18"><div class=CConstructor>Create a new event pane layer</div></div><div class=CToolTip id="tt19"><div class=CConstructor>Construct an OpenLayers.Events object.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt20"><div class=CConstructor>Constructor for features.</div></div><div class=CToolTip id="tt21"><div class=CConstructor>Creates an ogc:FeatureId rule.</div></div><div class=CToolTip id="tt22"><div class=CConstructor>Create a new parser/writer for ArcXML Features. </div></div><div class=CToolTip id="tt23"><div class=CConstructor>This is an abstract class. </div></div><div class=CToolTip id="tt24"><div class=CConstructor>Create a new parser for Filter.</div></div>< [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt29"><div class=CConstructor>Create a new parser for GeoJSON.</div></div><div class=CToolTip id="tt30"><div class=CConstructor>Creates a geometry object.</div></div><div class=CToolTip id="tt31"><div class=CConstructor>Create a new parser for GeoRSS.</div></div><div class=CToolTip id="tt32"><div class=CConstructor>Create a GeoRSS Layer.</div></div><div class=CToolTip id="tt33"><div class=CConstructor>Create a new control for fetching remote features.</div></div>< [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt39"><div class=CConstructor>Construct a handler.</div></div><div class=CToolTip id="tt40"><div class=CConstructor>Construct a hover handler.</div></div><div class=CToolTip id="tt41"><div class=CConstructor>A class for giving layers generic HTTP protocol.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt42"><div class=CConstructor>Creates an icon, which is an image tag in a div.</div></div><div class=CToolTip id="tt43"><div class=CConstructor>Constructor for a new OpenLayers.Tile.Image.IFrame instance.</div></div><div class=CToolTip id="tt44"><div class=CConstructor>Create a new image layer</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt45"><div class=CConstructor>Create a new parser for JSON.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt46"><div class=CConstructor>Returns a new keyboard handler.</div></div><div class=CToolTip id="tt47"><div class=CConstructor>Create a new parser for KML.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt48"><div class=CConstructor>Create a symbolizer for rendering lines.</div></div><div class=CToolTip id="tt49"><div class=CConstructor>Linear rings are constructed with an array of points. </div></div><div class=CToolTip id="tt50"><div class=CConstructor>Create a new LineString geometry</div></div><div class=CToolTip id="tt51"><div class=CConstructor>Creates a logical filter (And, Or, Not).</div></div><div class=CToolTip id="tt52"><div class=CConstructor>Create a [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt53"><div class=CConstructor>Constructor for a new OpenLayers.Map instance. </div></div><div class=CToolTip id="tt54"><div class=CConstructor>Create a new Mapguide layer, either tiled or untiled.</div></div><div class=CToolTip id="tt55"><div class=CConstructor>Create a new MapServer layer object</div></div><div class=CToolTip id="tt56"><div class=CConstructor>Create a Markers layer.</div></div><div class=CToolTip id="tt57"><div class=CConstructor>Create a new mod [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt61"><div class=CConstructor>Create a new navigation control</div></div><div class=CToolTip id="tt62"><div class=CConstructor>Add our two mousedefaults controls.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt63"><div class=CConstructor>Create a new parser for OSM.</div></div><div class=CToolTip id="tt64"><div class=CConstructor>Create a new overview map</div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Constructor2.html b/doc/apidocs/index/Constructor2.html
new file mode 100644
index 0000000..0fc8306
--- /dev/null
+++ b/doc/apidocs/index/Constructor2.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Constructor Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Constructor Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Constructor.html#A">A</a> · <a href="Constructor.html#B">B</a> · <a href="Constructor.html#C">C</a> · <a href="Constructor.html#D">D</a> · <a href="Constructor.html#E">E</a> · <a href="Constructor.html#F">F</a> · <a href="Constructor.html#G">G</a> · <a href="Constructor.html#H">H</a> · <a href="Constructor.html#I"> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt65"><div class=CConstructor>Create a new paging strategy.</div></div><div class=CToolTip id="tt66"><div class=CConstructor>Control which handles the panning (in any of the cardinal directions) of the map by a set px distance.</div></div><div class=CToolTip id="tt67"><div class=CConstructor>Create a new control panel.</div></div><div class=CToolTip id="tt68"><div class=CConstructor>Add the four directional pan buttons.</div></div><div class=CToolTip id="tt69"><di [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt82"><div class=CConstructor>Create a symbolizer for rendering rasters.</div></div><div class=CToolTip id="tt83"><div class=CConstructor>Create a new Refresh strategy.</div></div><div class=CToolTip id="tt84"><div class=CConstructor>Create a new regular polygon handler.</div></div><div class=CToolTip id="tt85"><div class=CConstructor>Create a new root container for multiple vector layer. </div></div><div class=CToolTip id="tt86"><div class=CConstructor>Creates a  [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt87"><div class=CConstructor>Create a new Save strategy.</div></div><div class=CToolTip id="tt88"><div class=CConstructor>Create a new scale line control.</div></div><div class=CToolTip id="tt89"><div class=CConstructor>Create a new control for selecting features.</div></div><div class=CToolTip id="tt90"><div class=CConstructor>Create an instance of OpenLayers.Size</div></div><div class=CToolTip id="tt91"><div class=CConstructor>Create a new parser for SLD.</div> [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt102"><div class=CConstructor>Create a new parser for TSV Text.</div></div><div class=CToolTip id="tt103"><div class=CConstructor>Create a text layer.</div></div><div class=CToolTip id="tt104"><div class=CConstructor>Create a symbolizer for rendering text labels.</div></div><div class=CToolTip id="tt105"><div class=CConstructor>Create a new read only TileCache layer.</div></div><div class=CToolTip id="tt106"><div class=CConstructor>Create a new transform feature  [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt108"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt109"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt110"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt111"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id=" [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Constructor3.html b/doc/apidocs/index/Constructor3.html
new file mode 100644
index 0000000..62c90db
--- /dev/null
+++ b/doc/apidocs/index/Constructor3.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Constructor Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Constructor Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Constructor.html#A">A</a> · <a href="Constructor.html#B">B</a> · <a href="Constructor.html#C">C</a> · <a href="Constructor.html#D">D</a> · <a href="Constructor.html#E">E</a> · <a href="Constructor.html#F">F</a> · <a href="Constructor.html#G">G</a> · <a href="Constructor.html#H">H</a> · <a href="Constructor.html#I"> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt137"><div class=CConstructor>Create a WFS feature.</div></div><div class=CToolTip id="tt138"><div class=CConstructor>Create a WFS-T formatter. </div></div><div class=CToolTip id="tt139"><div class=CConstructor>A class for giving layers WFS protocol.</div></div><div class=CToolTip id="tt140"><div class=CConstructor>Create a new parser for WFS capabilities.</div></div><div class=CToolTip id="tt141"><div class=CConstructor>Create a new parser for WFS DescribeFeatur [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt150"><div class=CConstructor>Construct an XML parser. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt151"><div class=CConstructor>Add the three zooming controls.</div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Files.html b/doc/apidocs/index/Files.html
new file mode 100644
index 0000000..14f25a8
--- /dev/null
+++ b/doc/apidocs/index/Files.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>File Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>File Index</div><div class=INavigationBar>$#! · 0-9 · <a href="#A">A</a> · B · <a href="#C">C</a> · D · E · F · G · H · I · J · K · L · M · N · <a href="#O">O</a> · P · Q · R · S · T · U · <a href="#V">V</a> · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadd [...]
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFile>OpenLayers custom string, number and function functions are described here.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Functions.html b/doc/apidocs/index/Functions.html
new file mode 100644
index 0000000..e1e9fb6
--- /dev/null
+++ b/doc/apidocs/index/Functions.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · <a href="#A">A</a> · <a href="#B">B</a> · <a href="Functions2.html#C">C</a> · <a href="Functions3.html#D">D</a> · <a href="Functions4.html#E">E</a> · <a href="Functions4.html#F">F</a> · <a href="Functions5.html#G">G</a> · <a href="Functions6.html#H">H</a> · <a href="Functions6.html#I">I</a> · J · K · <a hr [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>abort: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Abort an ongoing request, the response object passed to this method must come from this HTTP protocol (as a result of a create, read, [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt42"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Bind a function to an object. </div></div><div class=CToolTip id="tt43"><div cl [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Functions2.html b/doc/apidocs/index/Functions2.html
new file mode 100644
index 0000000..1ae4e6f
--- /dev/null
+++ b/doc/apidocs/index/Functions2.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions.html#B">B</a> · <a href="#C">C</a> · <a href="Functions3.html#D">D</a> · <a href="Functions4.html#E">E</a> · <a href="Functions4.html#F">F</a> · <a href="Functions5.html#G">G</a> · <a href="Functions6.html#H">H</a> · <a href="Functions6.html#I">I</a> · J · K & [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt47"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote>Recalculate the bounds for the geometry.</div></div><div class=CToolTip id="tt48"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote>Recalculate the bounds by iterating through the components and [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Functions3.html b/doc/apidocs/index/Functions3.html
new file mode 100644
index 0000000..231490c
--- /dev/null
+++ b/doc/apidocs/index/Functions3.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions.html#B">B</a> · <a href="Functions2.html#C">C</a> · <a href="#D">D</a> · <a href="Functions4.html#E">E</a> · <a href="Functions4.html#F">F</a> · <a href="Functions5.html#G">G</a> · <a href="Functions6.html#H">H</a> · <a href="Functions6.html#I">I</a> · J · K & [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt106"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the control and all handlers.</div></div><div class=CToolTip id="tt107"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt108"><div class=CFunction><block [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Functions4.html b/doc/apidocs/index/Functions4.html
new file mode 100644
index 0000000..314dc4e
--- /dev/null
+++ b/doc/apidocs/index/Functions4.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions.html#B">B</a> · <a href="Functions2.html#C">C</a> · <a href="Functions3.html#D">D</a> · <a href="#E">E</a> · <a href="#F">F</a> · <a href="Functions5.html#G">G</a> · <a href="Functions6.html#H">H</a> · <a href="Functions6.html#I">I</a> · J · K · <a href [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt202"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Determine whether another geometry is equivalent to this one. </div></div><div class=CToolTip id="tt203"><div class=CFunction><blo [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt216"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>False : function()</td></tr></table></blockquote>A simple function to that just does “return false”. </div></div><div class=CToolTip id="tt217"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>filter: function(</t [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Functions5.html b/doc/apidocs/index/Functions5.html
new file mode 100644
index 0000000..d73a97b
--- /dev/null
+++ b/doc/apidocs/index/Functions5.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions.html#B">B</a> · <a href="Functions2.html#C">C</a> · <a href="Functions3.html#D">D</a> · <a href="Functions4.html#E">E</a> · <a href="Functions4.html#F">F</a> · <a href="#G">G</a> · <a href="Functions6.html#H">H</a> · <a href="Functions6.html#I">I</a> · J · K & [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt224"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>GET: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Send an HTTP GET request. </div></div><div class=CToolTip id="tt225"><div class=CFunction><blockquote><table border=0 cellspacing=0 cel [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Functions6.html b/doc/apidocs/index/Functions6.html
new file mode 100644
index 0000000..f144082
--- /dev/null
+++ b/doc/apidocs/index/Functions6.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions.html#B">B</a> · <a href="Functions2.html#C">C</a> · <a href="Functions3.html#D">D</a> · <a href="Functions4.html#E">E</a> · <a href="Functions4.html#F">F</a> · <a href="Functions5.html#G">G</a> · <a href="#H">H</a> · <a href="#I">I</a> · J · K · <a href [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt385"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>hasAttributeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Determine wheth [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt388"><div class=CFunction>Alias for OpenLayers.Lang.translate. </div></div><div class=CToolTip id="tt389"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>info: function()</td></tr></table></blockquote>Writes a message to the console with the visual “info” icon and color coding and a hyperlink to the line where it was called.</div></div><div class=CToolTip id="tt390"><div class=CFunction><blockquote [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt406"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>limitSigDigs: function(</td><td class=PParameter nowrap>num,</td></tr><tr><td></td><td class=PParameter nowrap>sig</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Limit the number of significant digits on a float.</div></div><div class=C [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt412"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Catch changeParams and uppercase the new params to be merged in before calling changeParams on the super class.</div></div [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt420"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>nextTrigger: function()</td></tr></table></blockquote>Restore the next state. </div></div><div class=CToolTip id="tt421"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>numericIf: function(</td><td class=PParameter nowrap>va [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt422"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>offset:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parameters px - {OpenLayers.Pixel}</div></div><div class=CToolTip id="tt423"><div class=CFunction><blockquote><table border=0 cellspacing [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt429"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>pageCount: function()</td></tr></table></blockquote>Get the total count of pages given the current cache of features.</div></div><div class=CToolTip id="tt430"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pageLength: func [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt442"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>raiseLayer: function (</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>delta</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Change the index of the given layer by delta. </div></div><div class=CT [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Functions7.html b/doc/apidocs/index/Functions7.html
new file mode 100644
index 0000000..7f71edc
--- /dev/null
+++ b/doc/apidocs/index/Functions7.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions.html#B">B</a> · <a href="Functions2.html#C">C</a> · <a href="Functions3.html#D">D</a> · <a href="Functions4.html#E">E</a> · <a href="Functions4.html#F">F</a> · <a href="Functions5.html#G">G</a> · <a href="Functions6.html#H">H</a> · <a href="Functions6.html#I">I</a> · [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt504"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>save: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Tell the layer protocol to commit unsaved features. </div></div><div class=CToolTip id="tt505"><div class=CFunction><blockquote><tab [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Functions8.html b/doc/apidocs/index/Functions8.html
new file mode 100644
index 0000000..2dfd0d2
--- /dev/null
+++ b/doc/apidocs/index/Functions8.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions.html#B">B</a> · <a href="Functions2.html#C">C</a> · <a href="Functions3.html#D">D</a> · <a href="Functions4.html#E">E</a> · <a href="Functions4.html#F">F</a> · <a href="Functions5.html#G">G</a> · <a href="Functions6.html#H">H</a> · <a href="Functions6.html#I">I</a> · [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt561"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>time: function()</td></tr></table></blockquote>Creates a new timer under the given name. </div></div><div class=CToolTip id="tt562"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>timeEnd: function()</td></tr></table></blockquote>Stops a timer created by a call to OpenLayers.Console.time(name) and writes t [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt582"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>un: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Convenience method for unregistering listeners with a common scope. </div></div><div class=CToolTip id="tt583"><div class=CFunction><blo [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt590"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>value2regex: function(</td><td class=PParameter nowrap>wildCard,</td></tr><tr><td></td><td class=PParameter nowrap>singleChar,</td></tr><tr><td></td><td class=PParameter nowrap>escapeChar</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>C [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt592"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>warn: function()</td></tr></table></blockquote>Writes a message to the console with the visual “warning” icon and color coding and a hyperlink to the line where it was called.</div></div><div class=CToolTip id="tt593"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt609"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER_DRAWING_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td></td><td class=PParameter nowrap>nextNode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquo [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General.html b/doc/apidocs/index/General.html
new file mode 100644
index 0000000..4686ef7
--- /dev/null
+++ b/doc/apidocs/index/General.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J">J</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>abort: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Abort an ongoing request, the response object passed to this method must come from this HTTP protocol (as a result of a create, read, [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General10.html b/doc/apidocs/index/General10.html
new file mode 100644
index 0000000..59789a9
--- /dev/null
+++ b/doc/apidocs/index/General10.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt766"><div class=CProperty>{OpenLayers.Map} This variable is set when the layer is added to the map, via the accessor function setMap().</div></div><div class=CToolTip id="tt767"><div class=CConstructor>Constructor for a new OpenLayers.Map instance. </div></div><div class=CToolTip id="tt768"><div class=CConstructor>Create a new Mapguide layer, either tiled or untiled.</div></div><div class=CToolTip id="tt769"><div class=CGeneric>factor that are different than the [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt837"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt838"><div class=CProperty>{String} Layer name. </div></div><div class=CToolTip id="tt839"><div class=CProperty>{String} name of this rule</div></div><div class=CToolTip id="tt840"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt841"><div class=CProperty>{String} Style identifier.</div></div><div class=CToolTip id="tt842"><div class=CProperty>{Boolean} Generate a namedLayer [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General11.html b/doc/apidocs/index/General11.html
new file mode 100644
index 0000000..ac20736
--- /dev/null
+++ b/doc/apidocs/index/General11.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt856"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>offset:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parameters px - {OpenLayers.Pixel}</div></div><div class=CToolTip id="tt857"><div class=CFunction><blockquote><table border=0 cellspacing [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General12.html b/doc/apidocs/index/General12.html
new file mode 100644
index 0000000..a727440
--- /dev/null
+++ b/doc/apidocs/index/General12.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1138"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>pageCount: function()</td></tr></table></blockquote>Get the total count of pages given the current cache of features.</div></div><div class=CToolTip id="tt1139"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pageLength: fu [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General13.html b/doc/apidocs/index/General13.html
new file mode 100644
index 0000000..1cbcf21
--- /dev/null
+++ b/doc/apidocs/index/General13.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1192"><div class=CProperty>{String} Value of the csw:Query element, used when writing a csw:GetRecords document.</div></div><div class=CToolTip id="tt1193"><div class=CProperty>{Boolean} Filter out hidden layers when searching the map for layers to query. </div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General14.html b/doc/apidocs/index/General14.html
new file mode 100644
index 0000000..55cda53
--- /dev/null
+++ b/doc/apidocs/index/General14.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1194"><div class=CProperty>{Float} Optional radius in map units of the regular polygon. </div></div><div class=CToolTip id="tt1195"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>raiseLayer: function (</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>delta</td><td class=PAfterParameters n [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General15.html b/doc/apidocs/index/General15.html
new file mode 100644
index 0000000..5caa4de
--- /dev/null
+++ b/doc/apidocs/index/General15.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1294"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>save: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Tell the layer protocol to commit unsaved features. </div></div><div class=CToolTip id="tt1295"><div class=CConstructor>Create a ne [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General16.html b/doc/apidocs/index/General16.html
new file mode 100644
index 0000000..61a34c8
--- /dev/null
+++ b/doc/apidocs/index/General16.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1427"><div class=CProperty>Name of the database table into which Features should be saved.</div></div><div class=CToolTip id="tt1428"><div class=CProperty>{OpenLayers.Filter} Optional filter that will be evaluated to determine if a feature from the target layer is eligible for splitting.</div></div><div class=CToolTip id="tt1429"><div class=CProperty>{Integer} The maximum size of the grid in pixels on the map</div></div><div class=CToolTip id="tt1430"><div class [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1483"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>un: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Convenience method for unregistering listeners with a common scope. </div></div><div class=CToolTip id="tt1484"><div class=CProperty>{S [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General17.html b/doc/apidocs/index/General17.html
new file mode 100644
index 0000000..a8ee3b5
--- /dev/null
+++ b/doc/apidocs/index/General17.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1503"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt1504"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt1505"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt1506"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip  [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General18.html b/doc/apidocs/index/General18.html
new file mode 100644
index 0000000..3497e42
--- /dev/null
+++ b/doc/apidocs/index/General18.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1557"><div class=CProperty>{Number} width</div></div><div class=CToolTip id="tt1558"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>warn: function()</td></tr></table></blockquote>Writes a message to the console with the visual “warning” icon and color coding and a hyperlink to the line where it was called.</div></div><div class=CToolTip id="tt1559"><div class=CConstructor>Create a WFS feature.</di [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1593"><div class=CProperty>{float}</div></div><div class=CToolTip id="tt1594"><div class=CProperty>{Number} The x coordinate</div></div><div class=CToolTip id="tt1595"><div class=CConstant>{Integer}</div></div><div class=CToolTip id="tt1596"><div class=CConstructor>Construct an XML parser. </div></div><div class=CToolTip id="tt1597"><div class=CProperty>{Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x) For GeoRSS the default is (y,x), therefore: f [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1603"><div class=CProperty>{float}</div></div><div class=CToolTip id="tt1604"><div class=CProperty>{Number} The y coordinate</div></div><div class=CToolTip id="tt1605"><div class=CConstant>{Integer}</div></div><div class=CToolTip id="tt1606"><div class=CProperty>{Object} Members in the yx object are used to determine if a CRS URN corresponds to a CRS with y,x axis order. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1607"><div class=CConstant>{Object} Base z-indexes for different classes of thing</div></div><div class=CToolTip id="tt1608"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER_DRAWING_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td></td><t [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General2.html b/doc/apidocs/index/General2.html
new file mode 100644
index 0000000..12767c6
--- /dev/null
+++ b/doc/apidocs/index/General2.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J">J</a> &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt66"><div class=CConstant>{String}</div></div><div class=CToolTip id="tt67"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt68"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt69"><div class=CProperty>{OpenLayers.Layer} The currently selected base layer. </div></div><div class=CToolTip id="tt70"><div class=CConstructor>Create a new BBOX strategy.</div></div><div class=CToolTip id=" [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General3.html b/doc/apidocs/index/General3.html
new file mode 100644
index 0000000..3bdfbf7
--- /dev/null
+++ b/doc/apidocs/index/General3.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J">J</a> &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt85"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote>Recalculate the bounds for the geometry.</div></div><div class=CToolTip id="tt86"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote>Recalculate the bounds by iterating through the components and [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General4.html b/doc/apidocs/index/General4.html
new file mode 100644
index 0000000..61870c6
--- /dev/null
+++ b/doc/apidocs/index/General4.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J">J</a> &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt168"><div class=CProperty>{Object} When keepData is true, this is the parsed string sent to read.</div></div><div class=CToolTip id="tt169"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt170"><div class=CConstant>{Object} with the following keys</div></div><div class=CToolTip id="tt171"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deac [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General5.html b/doc/apidocs/index/General5.html
new file mode 100644
index 0000000..a34ec20
--- /dev/null
+++ b/doc/apidocs/index/General5.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J">J</a> &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt326"><div class=CProperty>{<OpenLayers.Easing>(Function)} Easing equation used for the animation Defaultly set to OpenLayers.Easing.Expo.easeOut</div></div><div class=CToolTip id="tt327"><div class=CProperty>{Boolean} Allow splits given intersection of edges only. </div></div><div class=CToolTip id="tt328"><div class=CConstructor>Create an editing toolbar for a given layer.</div></div><div class=CToolTip id="tt329"><div class=CProperty>{String} Set this to [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General6.html b/doc/apidocs/index/General6.html
new file mode 100644
index 0000000..6ea7157
--- /dev/null
+++ b/doc/apidocs/index/General6.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J">J</a> &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt379"><div class=CProperty>{Boolean}</div></div><div class=CToolTip id="tt380"><div class=CProperty>{Boolean} Should OpenLayers allow events on the map to fall through to other elements on the page, or should it swallow them?  </div></div><div class=CToolTip id="tt381"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>False : function()</td></tr></table></blockquote>A simple function to that just does &ldquo [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General7.html b/doc/apidocs/index/General7.html
new file mode 100644
index 0000000..2b60bee
--- /dev/null
+++ b/doc/apidocs/index/General7.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J">J</a> &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt441"><div class=CProperty>{Boolean} Use geodesic measurement. </div></div><div class=CToolTip id="tt442"><div class=CProperty>{Boolean} Use geodesic measurement. </div></div><div class=CToolTip id="tt443"><div class=CConstructor>Create a new parser for GeoJSON.</div></div><div class=CToolTip id="tt444"><div class=CProperty>{OpenLayers.Geometry}</div></div><div class=CToolTip id="tt445"><div class=CProperty>{String} Name of geometry element. </div></div><div clas [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General8.html b/doc/apidocs/index/General8.html
new file mode 100644
index 0000000..1e723d0
--- /dev/null
+++ b/doc/apidocs/index/General8.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="#H">H</a> · <a href="#I">I</a> · <a href="#J">J</a> · <a href="#K">K</a> &mid [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt633"><div class=CProperty>{Number} height</div></div><div class=CToolTip id="tt634"><div class=CConstructor>Construct a handler.</div></div><div class=CToolTip id="tt635"><div class=CProperty>{Boolean} Whether or not to handle right clicks. </div></div><div class=CToolTip id="tt636"><div class=CProperty>{Object} Used to set non-default properties on the control’s handler</div></div><div class=CToolTip id="tt637"><div class=CProperty>{Object} Additional opt [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt653"><div class=CFunction>Alias for OpenLayers.Lang.translate. </div></div><div class=CToolTip id="tt654"><div class=CProperty>{OpenLayers.Icon}. </div></div><div class=CToolTip id="tt655"><div class=CConstructor>Creates an icon, which is an image tag in a div.</div></div><div class=CToolTip id="tt656"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt657"><div class=CConstructor>Constructor for a new OpenLayers.Tile.Image.IFrame instance.</div> [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt708"><div class=CConstructor>Create a new parser for JSON.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt709"><div class=CProperty>{Object} Maintain a reference (data) to the most recently read data. </div></div><div class=CToolTip id="tt710"><div class=CProperty>{Boolean} If panMapIfOutOfView is false, and this property is true, contrain the popup such that it always fits in the available map space. </div></div><div class=CToolTip id="tt711"><div class=CProperty>{Boolean} If panMapIfOutOfView is false, and this property is true, contrain the popup such that it alw [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/General9.html b/doc/apidocs/index/General9.html
new file mode 100644
index 0000000..e6a8ccc
--- /dev/null
+++ b/doc/apidocs/index/General9.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar>$#! · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General8.html#I">I</a> · <a href="General8.html#J" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt726"><div class=CProperty>{String} The text for the label.</div></div><div class=CToolTip id="tt727"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt728"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt729"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt730"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt731"><div class=CProperty>{String} the format of the labels, default = ‘dm&r [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Properties.html b/doc/apidocs/index/Properties.html
new file mode 100644
index 0000000..d783ef7
--- /dev/null
+++ b/doc/apidocs/index/Properties.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar>$#! · 0-9 · <a href="#A">A</a> · <a href="#B">B</a> · <a href="#C">C</a> · <a href="#D">D</a> · <a href="Properties2.html#E">E</a> · <a href="Properties2.html#F">F</a> · <a href="Properties2.html#G">G</a> · <a href="Properties2.html#H">H</a> · <a href="Properties3.html#I">I</a> · J · <a href="Properties3.html#K">K</a> &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>{Boolean} Allow the map to function with “overlays” only. </div></div><div class=CToolTip id="tt2"><div class=CProperty>{Boolean} If a layer’s display should not be scale-based, this should be set to true. </div></div><div class=CToolTip id="tt3"><div class=CProperty>{Boolean} If set to true, the transition between zoom levels will be animated. </div></div><div class=CToolTip id="tt4"><div class=CProperty>{Array} List of [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt21"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt22"><div class=CProperty>{OpenLayers.Layer} The currently selected base layer. </div></div><div class=CToolTip id="tt23"><div class=CProperty>{Object} Values to start the animation with</div></div><div class=CToolTip id="tt24"><div class=CProperty>{OpenLayers.Bounds} null</div></div><div class=CToolTip id="tt25"><div class=CProperty>{Boolean} Allow feature selection by drawing a box. </div></ [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt30"><div class=CProperty>{Object} The functions that are sent to the handlers.feature for callback</div></div><div class=CToolTip id="tt31"><div class=CProperty>{Object} An object with start, eachStep and done properties whose values are functions to be call during the animation. </div></div><div class=CToolTip id="tt32"><div class=CProperty>{OpenLayers.Geometry.Point} The center of the feature bounds. </div></div><div class=CToolTip id="tt33"><div class=CProper [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt46"><div class=CProperty>{Object} When keepData is true, this is the parsed string sent to read.</div></div><div class=CToolTip id="tt47"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt48"><div class=CProperty>{String} Default language to use when a specific language can’t be found. </div></div><div class=CToolTip id="tt49"><div class=CProperty>{OpenLayers.Control} The control which is activated when the control is activated (turned on) [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Properties2.html b/doc/apidocs/index/Properties2.html
new file mode 100644
index 0000000..b92898b
--- /dev/null
+++ b/doc/apidocs/index/Properties2.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties.html#C">C</a> · <a href="Properties.html#D">D</a> · <a href="#E">E</a> · <a href="#F">F</a> · <a href="#G">G</a> · <a href="#H">H</a> · <a href="Properties3.html#I">I</a> · J · <a href="Properties3.html#K">K</a> · < [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt89"><div class=CProperty>{<OpenLayers.Easing>(Function)} Easing equation used for the animation Defaultly set to OpenLayers.Easing.Expo.easeOut</div></div><div class=CToolTip id="tt90"><div class=CProperty>{Boolean} Allow splits given intersection of edges only. </div></div><div class=CToolTip id="tt91"><div class=CProperty>{String} Set this to some value to set when the mouse is outside the map.</div></div><div class=CToolTip id="tt92"><div class=CPropert [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt115"><div class=CProperty>{Boolean}</div></div><div class=CToolTip id="tt116"><div class=CProperty>{Boolean} Should OpenLayers allow events on the map to fall through to other elements on the page, or should it swallow them?  </div></div><div class=CToolTip id="tt117"><div class=CProperty>{OpenLayers.Feature.Vector} Feature currently available for transformation. </div></div><div class=CToolTip id="tt118"><div class=CProperty>{Function} Called after each fe [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt159"><div class=CProperty>{Boolean} Use geodesic measurement. </div></div><div class=CToolTip id="tt160"><div class=CProperty>{Boolean} Use geodesic measurement. </div></div><div class=CToolTip id="tt161"><div class=CProperty>{OpenLayers.Geometry}</div></div><div class=CToolTip id="tt162"><div class=CProperty>{String} Name of geometry element. </div></div><div class=CToolTip id="tt163"><div class=CProperty>{String} Name of geometry element. </div></div><div clas [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt180"><div class=CProperty>{Number} height</div></div><div class=CToolTip id="tt181"><div class=CProperty>{Boolean} Whether or not to handle right clicks. </div></div><div class=CToolTip id="tt182"><div class=CProperty>{Object} Used to set non-default properties on the control’s handler</div></div><div class=CToolTip id="tt183"><div class=CProperty>{Object} Additional options for the handlers used by this control. </div></div><div class=CToolTip id="tt184"> [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Properties3.html b/doc/apidocs/index/Properties3.html
new file mode 100644
index 0000000..0491fa5
--- /dev/null
+++ b/doc/apidocs/index/Properties3.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties.html#C">C</a> · <a href="Properties.html#D">D</a> · <a href="Properties2.html#E">E</a> · <a href="Properties2.html#F">F</a> · <a href="Properties2.html#G">G</a> · <a href="Properties2.html#H">H</a> · <a href="#I">I</a> · J &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt194"><div class=CProperty>{OpenLayers.Icon}. </div></div><div class=CToolTip id="tt195"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt196"><div class=CProperty>{Boolean} Ignore dimensions higher than 2 when reading geometry coordinates.</div></div><div class=CToolTip id="tt197"><div class=CProperty>{OpenLayers.Size}</div></div><div class=CToolTip id="tt198"><div class=CProperty>{Boolean} Should the .xy property automatically be created for b [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt225"><div class=CProperty>{Object} Maintain a reference (data) to the most recently read data. </div></div><div class=CToolTip id="tt226"><div class=CProperty>{Boolean} If panMapIfOutOfView is false, and this property is true, contrain the popup such that it always fits in the available map space. </div></div><div class=CToolTip id="tt227"><div class=CProperty>{Boolean} If panMapIfOutOfView is false, and this property is true, contrain the popup such that it alw [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt230"><div class=CProperty>{String} The text for the label.</div></div><div class=CToolTip id="tt231"><div class=CProperty>{String} the format of the labels, default = ‘dm’. </div></div><div class=CToolTip id="tt232"><div class=CProperty>{Boolean} Should the graticule lines be labelled?. </div></div><div class=CToolTip id="tt233"><div class=CProperty>{symbolizer} the symbolizer used to render labels</div></div><div class=CToolTip id="tt234"><div class [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt255"><div class=CProperty>{OpenLayers.Map} This variable is set when the layer is added to the map, via the accessor function setMap().</div></div><div class=CToolTip id="tt256"><div class=CProperty>{Object} An object containing any non-default properties to be sent to the overview map’s map constructor. </div></div><div class=CToolTip id="tt257"><div class=CProperty>{Array(OpenLayers.Marker)} internal marker list</div></div><div class=CToolTip id="tt258"> [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Properties4.html b/doc/apidocs/index/Properties4.html
new file mode 100644
index 0000000..af3ac51
--- /dev/null
+++ b/doc/apidocs/index/Properties4.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties.html#C">C</a> · <a href="Properties.html#D">D</a> · <a href="Properties2.html#E">E</a> · <a href="Properties2.html#F">F</a> · <a href="Properties2.html#G">G</a> · <a href="Properties2.html#H">H</a> · <a href="Properties3.html#I">I</a> & [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt296"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt297"><div class=CProperty>{String} Layer name. </div></div><div class=CToolTip id="tt298"><div class=CProperty>{String} name of this rule</div></div><div class=CToolTip id="tt299"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt300"><div class=CProperty>{String} Style identifier.</div></div><div class=CToolTip id="tt301"><div class=CProperty>{Boolean} Generate a namedLayer [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt311"><div class=CProperty>{Function} Define this function if you want to know when a feature is done dragging. </div></div><div class=CToolTip id="tt312"><div class=CProperty>{Function} Define this function if you want to know about each move of a feature. </div></div><div class=CToolTip id="tt313"><div class=CProperty>{Function} <b>Deprecated</b>. </div></div><div class=CToolTip id="tt314"><div class=CProperty>{Function} <b>Deprecated</b>. </div></div><div clas [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt322"><div class=CProperty>{Boolean} When drawn, pan map such that the entire popup is visible in the current viewport (if necessary). </div></div><div class=CToolTip id="tt323"><div class=CProperty>{Boolean} Framed Cloud does pan into view by default.</div></div><div class=CToolTip id="tt324"><div class=CProperty>{Function} The Easing function to be used for tweening. </div></div><div class=CToolTip id="tt325"><div class=CProperty>{String} Value of the csw:Param [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt346"><div class=CProperty>{String} Value of the csw:Query element, used when writing a csw:GetRecords document.</div></div><div class=CToolTip id="tt347"><div class=CProperty>{Boolean} Filter out hidden layers when searching the map for layers to query. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt348"><div class=CProperty>{Float} Optional radius in map units of the regular polygon. </div></div><div class=CToolTip id="tt349"><div class=CProperty>{Float} The ratio of the feature relative to the ratio the time the feature was set. </div></div><div class=CToolTip id="tt350"><div class=CProperty>{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.</div></div><div class=CToolTip id="tt351"> [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Properties5.html b/doc/apidocs/index/Properties5.html
new file mode 100644
index 0000000..fb9fc1e
--- /dev/null
+++ b/doc/apidocs/index/Properties5.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties.html#C">C</a> · <a href="Properties.html#D">D</a> · <a href="Properties2.html#E">E</a> · <a href="Properties2.html#F">F</a> · <a href="Properties2.html#G">G</a> · <a href="Properties2.html#H">H</a> · <a href="Properties3.html#I">I</a> & [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt373"><div class=CProperty>{Boolean} If set to true, the active state of this panel’s controls will be stored on panel deactivation, and restored on reactivation. </div></div><div class=CToolTip id="tt374"><div class=CProperty>{Float} The scale of the feature, relative to the scale the time the feature was set. </div></div><div class=CToolTip id="tt375"><div class=CProperty>{Array}  An array of map scales in descending order. </div></div><div class=CToolTip [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt429"><div class=CProperty>Name of the database table into which Features should be saved.</div></div><div class=CToolTip id="tt430"><div class=CProperty>{OpenLayers.Filter} Optional filter that will be evaluated to determine if a feature from the target layer is eligible for splitting.</div></div><div class=CToolTip id="tt431"><div class=CProperty>{Integer} The maximum size of the grid in pixels on the map</div></div><div class=CToolTip id="tt432"><div class=CPr [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt454"><div class=CProperty>{String} The layer map units. </div></div><div class=CToolTip id="tt455"><div class=CProperty>{?}</div></div><div class=CToolTip id="tt456"><div class=CProperty>{String} The map units. </div></div><div class=CToolTip id="tt457"><div class=CProperty>{Array} Array with browsers, which should use the HTTP-GET protocol instead of HTTP-POST for fetching tiles from a WMS . </div></div><div class=CToolTip id="tt458"><div class=CProperty>{Numbe [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt465"><div class=CProperty>{Number} or {String} comparison value for binary comparisons. </div></div><div class=CToolTip id="tt466"><div class=CProperty>{OpenLayers.Bounds || OpenLayers.Geometry} The bounds or geometry to be used by the filter. </div></div><div class=CToolTip id="tt467"><div class=CProperty>{String} Specify a version string if one is known.</div></div><div class=CToolTip id="tt468"><div class=CProperty>{String} Specify a version string if one is  [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/index/Properties6.html b/doc/apidocs/index/Properties6.html
new file mode 100644
index 0000000..61b878b
--- /dev/null
+++ b/doc/apidocs/index/Properties6.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties.html#C">C</a> · <a href="Properties.html#D">D</a> · <a href="Properties2.html#E">E</a> · <a href="Properties2.html#F">F</a> · <a href="Properties2.html#G">G</a> · <a href="Properties2.html#H">H</a> · <a href="Properties3.html#I">I</a> & [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt478"><div class=CProperty>{Number} width</div></div><div class=CToolTip id="tt479"><div class=CProperty>{Object} Cache to use for storing parsed results from OpenLayers.Format.WFSDescribeFeatureType.read. </div></div><div class=CToolTip id="tt480"><div class=CProperty>{Boolean} #487 for more info.</div></div><div class=CToolTip id="tt481"><div class=CProperty>{Boolean} Allow user to pan forever east/west. </div></div><div class=CToolTip id="tt482"><div class=CPr [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt484"><div class=CProperty>{float}</div></div><div class=CToolTip id="tt485"><div class=CProperty>{Number} The x coordinate</div></div><div class=CToolTip id="tt486"><div class=CProperty>{Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x) For GeoRSS the default is (y,x), therefore: false</div></div><div class=CToolTip id="tt487"><div class=CProperty>{Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x) For GeoRSS the default is (y,x), ther [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt492"><div class=CProperty>{float}</div></div><div class=CToolTip id="tt493"><div class=CProperty>{Number} The y coordinate</div></div><div class=CToolTip id="tt494"><div class=CProperty>{Object} Members in the yx object are used to determine if a CRS URN corresponds to a CRS with y,x axis order. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt495"><div class=CProperty>{Number} The zIndex determines the rendering order for a symbolizer. </div></div><div class=CToolTip id="tt496"><div class=CProperty>{Boolean} Whether the user can draw a box to zoom</div></div><div class=CToolTip id="tt497"><div class=CProperty>{Integer} OpenLayers.Handler key code of the key, which has to be pressed, while drawing the zoom box with the mouse on the screen. </div></div><div class=CToolTip id="tt498"><div class=CPropert [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/javascript/main.js b/doc/apidocs/javascript/main.js
new file mode 100644
index 0000000..d9b8d3a
--- /dev/null
+++ b/doc/apidocs/javascript/main.js
@@ -0,0 +1,835 @@
+// This file is part of Natural Docs, which is Copyright (C) 2003-2005 Greg Valure
+// Natural Docs is licensed under the GPL
+
+
+//
+//  Browser Styles
+// ____________________________________________________________________________
+
+var agt=navigator.userAgent.toLowerCase();
+var browserType;
+var browserVer;
+
+if (agt.indexOf("opera") != -1)
+    {
+    browserType = "Opera";
+
+    if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1)
+        {  browserVer = "Opera7";  }
+    else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1)
+        {  browserVer = "Opera8";  }
+    else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1)
+        {  browserVer = "Opera9";  }
+    }
+
+else if (agt.indexOf("applewebkit") != -1)
+    {
+    browserType = "Safari";
+
+    if (agt.indexOf("version/3") != -1)
+        {  browserVer = "Safari3";  }
+    else if (agt.indexOf("safari/4") != -1)
+        {  browserVer = "Safari2";  }
+    }
+
+else if (agt.indexOf("khtml") != -1)
+    {
+    browserType = "Konqueror";
+    }
+
+else if (agt.indexOf("msie") != -1)
+    {
+    browserType = "IE";
+
+    if (agt.indexOf("msie 6") != -1)
+        {  browserVer = "IE6";  }
+    else if (agt.indexOf("msie 7") != -1)
+        {  browserVer = "IE7";  }
+    }
+
+else if (agt.indexOf("gecko") != -1)
+    {
+    browserType = "Firefox";
+
+    if (agt.indexOf("rv:1.7") != -1)
+        {  browserVer = "Firefox1";  }
+    else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1)
+        {  browserVer = "Firefox15";  }
+    else if (agt.indexOf("rv:1.8.1") != -1)
+        {  browserVer = "Firefox2";  }
+    }
+
+
+//
+//  Support Functions
+// ____________________________________________________________________________
+
+
+function GetXPosition(item)
+    {
+    var position = 0;
+
+    if (item.offsetWidth != null)
+        {
+        while (item != document.body && item != null)
+            {
+            position += item.offsetLeft;
+            item = item.offsetParent;
+            };
+        };
+
+    return position;
+    };
+
+
+function GetYPosition(item)
+    {
+    var position = 0;
+
+    if (item.offsetWidth != null)
+        {
+        while (item != document.body && item != null)
+            {
+            position += item.offsetTop;
+            item = item.offsetParent;
+            };
+        };
+
+    return position;
+    };
+
+
+function MoveToPosition(item, x, y)
+    {
+    // Opera 5 chokes on the px extension, so it can use the Microsoft one instead.
+
+    if (item.style.left != null)
+        {
+        item.style.left = x + "px";
+        item.style.top = y + "px";
+        }
+    else if (item.style.pixelLeft != null)
+        {
+        item.style.pixelLeft = x;
+        item.style.pixelTop = y;
+        };
+    };
+
+
+//
+//  Menu
+// ____________________________________________________________________________
+
+
+function ToggleMenu(id)
+    {
+    if (!window.document.getElementById)
+        {  return;  };
+
+    var display = window.document.getElementById(id).style.display;
+
+    if (display == "none")
+        {  display = "block";  }
+    else
+        {  display = "none";  }
+
+    window.document.getElementById(id).style.display = display;
+    }
+
+function HideAllBut(ids, max)
+    {
+    if (document.getElementById)
+        {
+        ids.sort( function(a,b) { return a - b; } );
+        var number = 1;
+
+        while (number < max)
+            {
+            if (ids.length > 0 && number == ids[0])
+                {  ids.shift();  }
+            else
+                {
+                document.getElementById("MGroupContent" + number).style.display = "none";
+                };
+
+            number++;
+            };
+        };
+    }
+
+
+//
+//  Tooltips
+// ____________________________________________________________________________
+
+
+var tooltipTimer = 0;
+
+function ShowTip(event, tooltipID, linkID)
+    {
+    if (tooltipTimer)
+        {  clearTimeout(tooltipTimer);  };
+
+    var docX = event.clientX + window.pageXOffset;
+    var docY = event.clientY + window.pageYOffset;
+
+    var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")";
+
+    tooltipTimer = setTimeout(showCommand, 1000);
+    }
+
+function ReallyShowTip(tooltipID, linkID, docX, docY)
+    {
+    tooltipTimer = 0;
+
+    var tooltip;
+    var link;
+
+    if (document.getElementById)
+        {
+        tooltip = document.getElementById(tooltipID);
+        link = document.getElementById(linkID);
+        }
+/*    else if (document.all)
+        {
+        tooltip = eval("document.all['" + tooltipID + "']");
+        link = eval("document.all['" + linkID + "']");
+        }
+*/
+    if (tooltip)
+        {
+        var left = GetXPosition(link);
+        var top = GetYPosition(link);
+        top += link.offsetHeight;
+
+
+        // The fallback method is to use the mouse X and Y relative to the document.  We use a separate if and test if its a number
+        // in case some browser snuck through the above if statement but didn't support everything.
+
+        if (!isFinite(top) || top == 0)
+            {
+            left = docX;
+            top = docY;
+            }
+
+        // Some spacing to get it out from under the cursor.
+
+        top += 10;
+
+        // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the
+        // page.  We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right.
+
+        if (tooltip.offsetWidth != null)
+            {
+            var width = tooltip.offsetWidth;
+            var docWidth = document.body.clientWidth;
+
+            if (left + width > docWidth)
+                {  left = docWidth - width - 1;  }
+
+            // If there's a horizontal scroll bar we could go past zero because it's using the page width, not the window width.
+            if (left < 0)
+                {  left = 0;  };
+            }
+
+        MoveToPosition(tooltip, left, top);
+        tooltip.style.visibility = "visible";
+        }
+    }
+
+function HideTip(tooltipID)
+    {
+    if (tooltipTimer)
+        {
+        clearTimeout(tooltipTimer);
+        tooltipTimer = 0;
+        }
+
+    var tooltip;
+
+    if (document.getElementById)
+        {  tooltip = document.getElementById(tooltipID); }
+    else if (document.all)
+        {  tooltip = eval("document.all['" + tooltipID + "']");  }
+
+    if (tooltip)
+        {  tooltip.style.visibility = "hidden";  }
+    }
+
+
+//
+//  Blockquote fix for IE
+// ____________________________________________________________________________
+
+
+function NDOnLoad()
+    {
+    if (browserVer == "IE6")
+        {
+        var scrollboxes = document.getElementsByTagName('blockquote');
+
+        if (scrollboxes.item(0))
+            {
+            NDDoResize();
+            window.onresize=NDOnResize;
+            };
+        };
+    };
+
+
+var resizeTimer = 0;
+
+function NDOnResize()
+    {
+    if (resizeTimer != 0)
+        {  clearTimeout(resizeTimer);  };
+
+    resizeTimer = setTimeout(NDDoResize, 250);
+    };
+
+
+function NDDoResize()
+    {
+    var scrollboxes = document.getElementsByTagName('blockquote');
+
+    var i;
+    var item;
+
+    i = 0;
+    while (item = scrollboxes.item(i))
+        {
+        item.style.width = 100;
+        i++;
+        };
+
+    i = 0;
+    while (item = scrollboxes.item(i))
+        {
+        item.style.width = item.parentNode.offsetWidth;
+        i++;
+        };
+
+    clearTimeout(resizeTimer);
+    resizeTimer = 0;
+    }
+
+
+
+/* ________________________________________________________________________________________________________
+
+    Class: SearchPanel
+    ________________________________________________________________________________________________________
+
+    A class handling everything associated with the search panel.
+
+    Parameters:
+
+        name - The name of the global variable that will be storing this instance.  Is needed to be able to set timeouts.
+        mode - The mode the search is going to work in.  Pass <NaturalDocs::Builder::Base->CommandLineOption()>, so the
+                   value will be something like "HTML" or "FramedHTML".
+
+    ________________________________________________________________________________________________________
+*/
+
+
+function SearchPanel(name, mode, resultsPath)
+    {
+    if (!name || !mode || !resultsPath)
+        {  alert("Incorrect parameters to SearchPanel.");  };
+
+
+    // Group: Variables
+    // ________________________________________________________________________
+
+    /*
+        var: name
+        The name of the global variable that will be storing this instance of the class.
+    */
+    this.name = name;
+
+    /*
+        var: mode
+        The mode the search is going to work in, such as "HTML" or "FramedHTML".
+    */
+    this.mode = mode;
+
+    /*
+        var: resultsPath
+        The relative path from the current HTML page to the results page directory.
+    */
+    this.resultsPath = resultsPath;
+
+    /*
+        var: keyTimeout
+        The timeout used between a keystroke and when a search is performed.
+    */
+    this.keyTimeout = 0;
+
+    /*
+        var: keyTimeoutLength
+        The length of <keyTimeout> in thousandths of a second.
+    */
+    this.keyTimeoutLength = 500;
+
+    /*
+        var: lastSearchValue
+        The last search string executed, or an empty string if none.
+    */
+    this.lastSearchValue = "";
+
+    /*
+        var: lastResultsPage
+        The last results page.  The value is only relevant if <lastSearchValue> is set.
+    */
+    this.lastResultsPage = "";
+
+    /*
+        var: deactivateTimeout
+
+        The timeout used between when a control is deactivated and when the entire panel is deactivated.  Is necessary
+        because a control may be deactivated in favor of another control in the same panel, in which case it should stay
+        active.
+    */
+    this.deactivateTimout = 0;
+
+    /*
+        var: deactivateTimeoutLength
+        The length of <deactivateTimeout> in thousandths of a second.
+    */
+    this.deactivateTimeoutLength = 200;
+
+
+
+
+    // Group: DOM Elements
+    // ________________________________________________________________________
+
+
+    // Function: DOMSearchField
+    this.DOMSearchField = function()
+        {  return document.getElementById("MSearchField");  };
+
+    // Function: DOMSearchType
+    this.DOMSearchType = function()
+        {  return document.getElementById("MSearchType");  };
+
+    // Function: DOMPopupSearchResults
+    this.DOMPopupSearchResults = function()
+        {  return document.getElementById("MSearchResults");  };
+
+    // Function: DOMPopupSearchResultsWindow
+    this.DOMPopupSearchResultsWindow = function()
+        {  return document.getElementById("MSearchResultsWindow");  };
+
+    // Function: DOMSearchPanel
+    this.DOMSearchPanel = function()
+        {  return document.getElementById("MSearchPanel");  };
+
+
+
+
+    // Group: Event Handlers
+    // ________________________________________________________________________
+
+
+    /*
+        Function: OnSearchFieldFocus
+        Called when focus is added or removed from the search field.
+    */
+    this.OnSearchFieldFocus = function(isActive)
+        {
+        this.Activate(isActive);
+        };
+
+
+    /*
+        Function: OnSearchFieldChange
+        Called when the content of the search field is changed.
+    */
+    this.OnSearchFieldChange = function()
+        {
+        if (this.keyTimeout)
+            {
+            clearTimeout(this.keyTimeout);
+            this.keyTimeout = 0;
+            };
+
+        var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+        if (searchValue != this.lastSearchValue)
+            {
+            if (searchValue != "")
+                {
+                this.keyTimeout = setTimeout(this.name + ".Search()", this.keyTimeoutLength);
+                }
+            else
+                {
+                if (this.mode == "HTML")
+                    {  this.DOMPopupSearchResultsWindow().style.display = "none";  };
+                this.lastSearchValue = "";
+                };
+            };
+        };
+
+
+    /*
+        Function: OnSearchTypeFocus
+        Called when focus is added or removed from the search type.
+    */
+    this.OnSearchTypeFocus = function(isActive)
+        {
+        this.Activate(isActive);
+        };
+
+
+    /*
+        Function: OnSearchTypeChange
+        Called when the search type is changed.
+    */
+    this.OnSearchTypeChange = function()
+        {
+        var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+        if (searchValue != "")
+            {
+            this.Search();
+            };
+        };
+
+
+
+    // Group: Action Functions
+    // ________________________________________________________________________
+
+
+    /*
+        Function: CloseResultsWindow
+        Closes the results window.
+    */
+    this.CloseResultsWindow = function()
+        {
+        this.DOMPopupSearchResultsWindow().style.display = "none";
+        this.Activate(false, true);
+        };
+
+
+    /*
+        Function: Search
+        Performs a search.
+    */
+    this.Search = function()
+        {
+        this.keyTimeout = 0;
+
+        var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+        var searchTopic = this.DOMSearchType().value;
+
+        var pageExtension = searchValue.substr(0,1);
+
+        if (pageExtension.match(/^[a-z]/i))
+            {  pageExtension = pageExtension.toUpperCase();  }
+        else if (pageExtension.match(/^[0-9]/))
+            {  pageExtension = 'Numbers';  }
+        else
+            {  pageExtension = "Symbols";  };
+
+        var resultsPage;
+        var resultsPageWithSearch;
+        var hasResultsPage;
+
+        // indexSectionsWithContent is defined in searchdata.js
+        if (indexSectionsWithContent[searchTopic][pageExtension] == true)
+            {
+            resultsPage = this.resultsPath + '/' + searchTopic + pageExtension + '.html';
+            resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+            hasResultsPage = true;
+            }
+        else
+            {
+            resultsPage = this.resultsPath + '/NoResults.html';
+            resultsPageWithSearch = resultsPage;
+            hasResultsPage = false;
+            };
+
+        var resultsFrame;
+        if (this.mode == "HTML")
+            {  resultsFrame = window.frames.MSearchResults;  }
+        else if (this.mode == "FramedHTML")
+            {  resultsFrame = window.top.frames['Content'];  };
+
+
+        if (resultsPage != this.lastResultsPage ||
+
+            // Bug in IE.  If everything becomes hidden in a run, none of them will be able to be reshown in the next for some
+            // reason.  It counts the right number of results, and you can even read the display as "block" after setting it, but it
+            // just doesn't work in IE 6 or IE 7.  So if we're on the right page but the previous search had no results, reload the
+            // page anyway to get around the bug.
+            (browserType == "IE" && hasResultsPage && resultsFrame.searchResults.lastMatchCount == 0) )
+
+            {
+            resultsFrame.location.href = resultsPageWithSearch;
+            }
+
+        // So if the results page is right and there's no IE bug, reperform the search on the existing page.  We have to check if there
+        // are results because NoResults.html doesn't have any JavaScript, and it would be useless to do anything on that page even
+        // if it did.
+        else if (hasResultsPage)
+            {
+            // We need to check if this exists in case the frame is present but didn't finish loading.
+            if (resultsFrame.searchResults)
+                {  resultsFrame.searchResults.Search(searchValue);  }
+
+            // Otherwise just reload instead of waiting.
+            else
+                {  resultsFrame.location.href = resultsPageWithSearch;  };
+            };
+
+
+        var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+        if (this.mode == "HTML" && domPopupSearchResultsWindow.style.display != "block")
+            {
+            var domSearchType = this.DOMSearchType();
+
+            var left = GetXPosition(domSearchType);
+            var top = GetYPosition(domSearchType) + domSearchType.offsetHeight;
+
+            MoveToPosition(domPopupSearchResultsWindow, left, top);
+            domPopupSearchResultsWindow.style.display = 'block';
+            };
+
+
+        this.lastSearchValue = searchValue;
+        this.lastResultsPage = resultsPage;
+        };
+
+
+
+    // Group: Activation Functions
+    // Functions that handle whether the entire panel is active or not.
+    // ________________________________________________________________________
+
+
+    /*
+        Function: Activate
+
+        Activates or deactivates the search panel, resetting things to their default values if necessary.  You can call this on every
+        control's OnBlur() and it will handle not deactivating the entire panel when focus is just switching between them transparently.
+
+        Parameters:
+
+            isActive - Whether you're activating or deactivating the panel.
+            ignoreDeactivateDelay - Set if you're positive the action will deactivate the panel and thus want to skip the delay.
+    */
+    this.Activate = function(isActive, ignoreDeactivateDelay)
+        {
+        // We want to ignore isActive being false while the results window is open.
+        if (isActive || (this.mode == "HTML" && this.DOMPopupSearchResultsWindow().style.display == "block"))
+            {
+            if (this.inactivateTimeout)
+                {
+                clearTimeout(this.inactivateTimeout);
+                this.inactivateTimeout = 0;
+                };
+
+            this.DOMSearchPanel().className = 'MSearchPanelActive';
+
+            var searchField = this.DOMSearchField();
+
+            if (searchField.value == 'Search')
+                 {  searchField.value = "";  }
+            }
+        else if (!ignoreDeactivateDelay)
+            {
+            this.inactivateTimeout = setTimeout(this.name + ".InactivateAfterTimeout()", this.inactivateTimeoutLength);
+            }
+        else
+            {
+            this.InactivateAfterTimeout();
+            };
+        };
+
+
+    /*
+        Function: InactivateAfterTimeout
+
+        Called by <inactivateTimeout>, which is set by <Activate()>.  Inactivation occurs on a timeout because a control may
+        receive OnBlur() when focus is really transferring to another control in the search panel.  In this case we don't want to
+        actually deactivate the panel because not only would that cause a visible flicker but it could also reset the search value.
+        So by doing it on a timeout instead, there's a short period where the second control's OnFocus() can cancel the deactivation.
+    */
+    this.InactivateAfterTimeout = function()
+        {
+        this.inactivateTimeout = 0;
+
+        this.DOMSearchPanel().className = 'MSearchPanelInactive';
+        this.DOMSearchField().value = "Search";
+
+	    this.lastSearchValue = "";
+	    this.lastResultsPage = "";
+        };
+    };
+
+
+
+
+/* ________________________________________________________________________________________________________
+
+   Class: SearchResults
+   _________________________________________________________________________________________________________
+
+   The class that handles everything on the search results page.
+   _________________________________________________________________________________________________________
+*/
+
+
+function SearchResults(name, mode)
+    {
+    /*
+        var: mode
+        The mode the search is going to work in, such as "HTML" or "FramedHTML".
+    */
+    this.mode = mode;
+
+    /*
+        var: lastMatchCount
+        The number of matches from the last run of <Search()>.
+    */
+    this.lastMatchCount = 0;
+
+
+    /*
+        Function: Toggle
+        Toggles the visibility of the passed element ID.
+    */
+    this.Toggle = function(id)
+        {
+        if (this.mode == "FramedHTML")
+            {  return;  };
+
+        var parentElement = document.getElementById(id);
+
+        var element = parentElement.firstChild;
+
+        while (element && element != parentElement)
+            {
+            if (element.nodeName == 'DIV' && element.className == 'ISubIndex')
+                {
+                if (element.style.display == 'block')
+                    {  element.style.display = "none";  }
+                else
+                    {  element.style.display = 'block';  }
+                };
+
+            if (element.nodeName == 'DIV' && element.hasChildNodes())
+                {  element = element.firstChild;  }
+            else if (element.nextSibling)
+                {  element = element.nextSibling;  }
+            else
+                {
+                do
+                    {
+                    element = element.parentNode;
+                    }
+                while (element && element != parentElement && !element.nextSibling);
+
+                if (element && element != parentElement)
+                    {  element = element.nextSibling;  };
+                };
+            };
+        };
+
+
+    /*
+        Function: Search
+
+        Searches for the passed string.  If there is no parameter, it takes it from the URL query.
+
+        Always returns true, since other documents may try to call it and that may or may not be possible.
+    */
+    this.Search = function(search)
+        {
+        if (!search)
+            {
+            search = window.location.search;
+            search = search.substring(1);  // Remove the leading ?
+            search = unescape(search);
+            };
+
+        search = search.replace(/^ +/, "");
+        search = search.replace(/ +$/, "");
+        search = search.toLowerCase();
+
+        if (search.match(/[^a-z0-9]/)) // Just a little speedup so it doesn't have to go through the below unnecessarily.
+            {
+            search = search.replace(/\_/g, "_und");
+            search = search.replace(/\ +/gi, "_spc");
+            search = search.replace(/\~/g, "_til");
+            search = search.replace(/\!/g, "_exc");
+            search = search.replace(/\@/g, "_att");
+            search = search.replace(/\#/g, "_num");
+            search = search.replace(/\$/g, "_dol");
+            search = search.replace(/\%/g, "_pct");
+            search = search.replace(/\^/g, "_car");
+            search = search.replace(/\&/g, "_amp");
+            search = search.replace(/\*/g, "_ast");
+            search = search.replace(/\(/g, "_lpa");
+            search = search.replace(/\)/g, "_rpa");
+            search = search.replace(/\-/g, "_min");
+            search = search.replace(/\+/g, "_plu");
+            search = search.replace(/\=/g, "_equ");
+            search = search.replace(/\{/g, "_lbc");
+            search = search.replace(/\}/g, "_rbc");
+            search = search.replace(/\[/g, "_lbk");
+            search = search.replace(/\]/g, "_rbk");
+            search = search.replace(/\:/g, "_col");
+            search = search.replace(/\;/g, "_sco");
+            search = search.replace(/\"/g, "_quo");
+            search = search.replace(/\'/g, "_apo");
+            search = search.replace(/\</g, "_lan");
+            search = search.replace(/\>/g, "_ran");
+            search = search.replace(/\,/g, "_com");
+            search = search.replace(/\./g, "_per");
+            search = search.replace(/\?/g, "_que");
+            search = search.replace(/\//g, "_sla");
+            search = search.replace(/[^a-z0-9\_]i/gi, "_zzz");
+            };
+
+        var resultRows = document.getElementsByTagName("div");
+        var matches = 0;
+
+        var i = 0;
+        while (i < resultRows.length)
+            {
+            var row = resultRows.item(i);
+
+            if (row.className == "SRResult")
+                {
+                var rowMatchName = row.id.toLowerCase();
+                rowMatchName = rowMatchName.replace(/^sr\d*_/, '');
+
+                if (search.length <= rowMatchName.length && rowMatchName.substr(0, search.length) == search)
+                    {
+                    row.style.display = "block";
+                    matches++;
+                    }
+                else
+                    {  row.style.display = "none";  };
+                };
+
+            i++;
+            };
+
+        document.getElementById("Searching").style.display="none";
+
+        if (matches == 0)
+            {  document.getElementById("NoMatches").style.display="block";  }
+        else
+            {  document.getElementById("NoMatches").style.display="none";  }
+
+        this.lastMatchCount = matches;
+
+        return true;
+        };
+    };
+
diff --git a/doc/apidocs/javascript/searchdata.js b/doc/apidocs/javascript/searchdata.js
new file mode 100644
index 0000000..a41936c
--- /dev/null
+++ b/doc/apidocs/javascript/searchdata.js
@@ -0,0 +1,212 @@
+var indexSectionsWithContent = {
+   "General": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": true,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": true,
+      "H": true,
+      "I": true,
+      "J": true,
+      "K": true,
+      "L": true,
+      "M": true,
+      "N": true,
+      "O": true,
+      "P": true,
+      "Q": true,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": true,
+      "X": true,
+      "Y": true,
+      "Z": true
+      },
+   "Constructor": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": true,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": true,
+      "H": true,
+      "I": true,
+      "J": true,
+      "K": true,
+      "L": true,
+      "M": true,
+      "N": true,
+      "O": true,
+      "P": true,
+      "Q": false,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": true,
+      "X": true,
+      "Y": true,
+      "Z": true
+      },
+   "Functions": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": true,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": true,
+      "H": true,
+      "I": true,
+      "J": false,
+      "K": false,
+      "L": true,
+      "M": true,
+      "N": true,
+      "O": true,
+      "P": true,
+      "Q": false,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": true,
+      "X": false,
+      "Y": false,
+      "Z": true
+      },
+   "Files": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": true,
+      "B": false,
+      "C": true,
+      "D": false,
+      "E": false,
+      "F": false,
+      "G": false,
+      "H": false,
+      "I": false,
+      "J": false,
+      "K": false,
+      "L": false,
+      "M": false,
+      "N": false,
+      "O": true,
+      "P": false,
+      "Q": false,
+      "R": false,
+      "S": false,
+      "T": false,
+      "U": false,
+      "V": true,
+      "W": false,
+      "X": false,
+      "Y": false,
+      "Z": false
+      },
+   "Constants": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": false,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": false,
+      "H": false,
+      "I": true,
+      "J": false,
+      "K": true,
+      "L": true,
+      "M": true,
+      "N": false,
+      "O": true,
+      "P": false,
+      "Q": false,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": false,
+      "X": true,
+      "Y": true,
+      "Z": true
+      },
+   "Classes": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": false,
+      "B": false,
+      "C": false,
+      "D": false,
+      "E": false,
+      "F": false,
+      "G": false,
+      "H": false,
+      "I": false,
+      "J": false,
+      "K": false,
+      "L": false,
+      "M": false,
+      "N": false,
+      "O": true,
+      "P": false,
+      "Q": false,
+      "R": false,
+      "S": false,
+      "T": false,
+      "U": true,
+      "V": false,
+      "W": false,
+      "X": false,
+      "Y": false,
+      "Z": false
+      },
+   "Properties": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": true,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": true,
+      "H": true,
+      "I": true,
+      "J": false,
+      "K": true,
+      "L": true,
+      "M": true,
+      "N": true,
+      "O": true,
+      "P": true,
+      "Q": true,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": true,
+      "X": true,
+      "Y": true,
+      "Z": true
+      }
+   }
\ No newline at end of file
diff --git a/doc/apidocs/search/ClassesO.html b/doc/apidocs/search/ClassesO.html
new file mode 100644
index 0000000..ef84745
--- /dev/null
+++ b/doc/apidocs/search/ClassesO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_OpenLayers><div class=IEntry><a href="../files/OpenLayers-js.html#OpenLayers" target=_parent class=ISymbol>OpenLayers</a></div></div><div class=SRResult id=SR_OpenLayers_perAjax><div class=IEntry><a href="../files/OpenLayers/Ajax-js.html#OpenLayers.Ajax" target=_parent class=ISymbol>OpenLayers.Ajax</a></div></div><div class=SRResult id=SR_OpenLayers_perAjax_p [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ClassesU.html b/doc/apidocs/search/ClassesU.html
new file mode 100644
index 0000000..798b8f9
--- /dev/null
+++ b/doc/apidocs/search/ClassesU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Util><div class=IEntry><a href="../files/OpenLayers/Util-js.html#Util" target=_parent class=ISymbol>Util</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsB.html b/doc/apidocs/search/ConstantsB.html
new file mode 100644
index 0000000..b655329
--- /dev/null
+++ b/doc/apidocs/search/ConstantsB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_BACKGROUND_undID_undSUFFIX><div class=IEntry><a href="../files/OpenLayers/Renderer/Elements-js.html#OpenLayers.Renderer.Elements.BACKGROUND_ID_SUFFIX" target=_parent class=ISymbol>BACKGROUND_ID_SUFFIX</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Elements</span></div></div><div class=SRResult id=SR_BROWSER_undEVENT [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsC.html b/doc/apidocs/search/ConstantsC.html
new file mode 100644
index 0000000..2ee37f5
--- /dev/null
+++ b/doc/apidocs/search/ConstantsC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_CORNER_undSIZE><div class=IEntry><a href="../files/OpenLayers/Popup/AnchoredBubble-js.html#OpenLayers.Popup.AnchoredBubble.CORNER_SIZE" target=_parent class=ISymbol>CORNER_SIZE</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>AnchoredBubble</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsD.html b/doc/apidocs/search/ConstantsD.html
new file mode 100644
index 0000000..18281fb
--- /dev/null
+++ b/doc/apidocs/search/ConstantsD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_dataFrom><div class=IEntry><a href="../files/OpenLayers/Layer/PointTrack-js.html#OpenLayers.Layer.PointTrack.OpenLayers.Layer.PointTrack.dataFrom" target=_parent class=ISymbol>dataFrom</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>PointTrack.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer.<span class=HB [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsE.html b/doc/apidocs/search/ConstantsE.html
new file mode 100644
index 0000000..860c350
--- /dev/null
+++ b/doc/apidocs/search/ConstantsE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_EVENT_undTYPES><div class=IEntry><a href="javascript:searchResults.Toggle('SR_EVENT_undTYPES')" class=ISymbol>EVENT_TYPES</a><div class=ISubIndex><a href="../files/OpenLayers/Control-js.html#OpenLayers.Control.EVENT_TYPES" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control</a><a href="../files/OpenLayers/Control/DrawFeature-js.html#OpenLay [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsF.html b/doc/apidocs/search/ConstantsF.html
new file mode 100644
index 0000000..247d8d9
--- /dev/null
+++ b/doc/apidocs/search/ConstantsF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_FOLDER_undPARAMS><div class=IEntry><a href="../files/OpenLayers/Layer/MapGuide-js.html#OpenLayers.Layer.MapGuide.FOLDER_PARAMS" target=_parent class=ISymbol>FOLDER_PARAMS</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapGuide</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRSta [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsI.html b/doc/apidocs/search/ConstantsI.html
new file mode 100644
index 0000000..43a0612
--- /dev/null
+++ b/doc/apidocs/search/ConstantsI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_IMAGE_undEXTENSIONS><div class=IEntry><a href="../files/OpenLayers/Layer/KaMapCache-js.html#OpenLayers.Layer.KaMapCache.IMAGE_EXTENSIONS" target=_parent class=ISymbol>IMAGE_EXTENSIONS</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMapCache</span></div></div><div class=SRResult id=SR_INCHES_undPER_undUNIT><div class=I [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsK.html b/doc/apidocs/search/ConstantsK.html
new file mode 100644
index 0000000..5dc4966
--- /dev/null
+++ b/doc/apidocs/search/ConstantsK.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_KEY_undBACKSPACE><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Event.KEY_BACKSPACE" target=_parent class=ISymbol>KEY_BACKSPACE</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Event</span></div></div><div class=SRResult id=SR_KEY_undDELETE><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Event.KEY_D [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsL.html b/doc/apidocs/search/ConstantsL.html
new file mode 100644
index 0000000..d876ca9
--- /dev/null
+++ b/doc/apidocs/search/ConstantsL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_LABEL_undALIGN><div class=IEntry><a href="javascript:searchResults.Toggle('SR_LABEL_undALIGN')" class=ISymbol>LABEL_ALIGN</a><div class=ISubIndex><a href="../files/OpenLayers/Renderer/Canvas-js.html#OpenLayers.Renderer.Canvas.OpenLayers.Renderer.Canvas.LABEL_ALIGN" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsM.html b/doc/apidocs/search/ConstantsM.html
new file mode 100644
index 0000000..51c94f0
--- /dev/null
+++ b/doc/apidocs/search/ConstantsM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_MAX_undPIXEL><div class=IEntry><a href="../files/OpenLayers/Renderer/SVG-js.html#OpenLayers.Renderer.SVG.MAX_PIXEL" target=_parent class=ISymbol>MAX_PIXEL</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Renderer.SVG</span></div></div><div class=SRResult id=SR_MAX_undZOOM_undLEVEL><div class=IEntry><a href="javascript:searchResults.Toggle('SR_MAX_un [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsO.html b/doc/apidocs/search/ConstantsO.html
new file mode 100644
index 0000000..1018228
--- /dev/null
+++ b/doc/apidocs/search/ConstantsO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_OVERLAY_undPARAMS><div class=IEntry><a href="../files/OpenLayers/Layer/MapGuide-js.html#OpenLayers.Layer.MapGuide.OVERLAY_PARAMS" target=_parent class=ISymbol>OVERLAY_PARAMS</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapGuide</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SR [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsR.html b/doc/apidocs/search/ConstantsR.html
new file mode 100644
index 0000000..655c396
--- /dev/null
+++ b/doc/apidocs/search/ConstantsR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_RESHAPE><div class=IEntry><a href="../files/OpenLayers/Control/ModifyFeature-js.html#OpenLayers.Control.ModifyFeature.RESHAPE" target=_parent class=ISymbol>RESHAPE</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ModifyFeature</span></div></div><div class=SRResult id=SR_RESIZE><div class=IEntry><a href="../files/OpenLa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsS.html b/doc/apidocs/search/ConstantsS.html
new file mode 100644
index 0000000..0978161
--- /dev/null
+++ b/doc/apidocs/search/ConstantsS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_serviceTypes><div class=IEntry><a href="../files/OpenLayers/Format/Context-js.html#OpenLayers.Format.Context.OpenLayers.Format.Context.serviceTypes" target=_parent class=ISymbol>serviceTypes</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Context.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format.<span cla [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsT.html b/doc/apidocs/search/ConstantsT.html
new file mode 100644
index 0000000..4c6b29a
--- /dev/null
+++ b/doc/apidocs/search/ConstantsT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_TILE_undHEIGHT><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.TILE_HEIGHT" target=_parent class=ISymbol>TILE_HEIGHT</a>, <span class=IParent>OpenLayers.Map</span></div></div><div class=SRResult id=SR_TILE_undPARAMS><div class=IEntry><a href="../files/OpenLayers/Layer/MapGuide-js.html#OpenLayers.Layer.MapGuide.TILE_PARAMS" target=_pa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsU.html b/doc/apidocs/search/ConstantsU.html
new file mode 100644
index 0000000..ca8b8f9
--- /dev/null
+++ b/doc/apidocs/search/ConstantsU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_URL_undHASH_undFACTOR><div class=IEntry><a href="../files/OpenLayers/Layer/HTTPRequest-js.html#OpenLayers.Layer.HTTPRequest.URL_HASH_FACTOR" target=_parent class=ISymbol>URL_HASH_FACTOR</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>HTTPRequest</span></div></div></table><div class=SRStatus id=Searching>Searching...</di [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsV.html b/doc/apidocs/search/ConstantsV.html
new file mode 100644
index 0000000..1b3476a
--- /dev/null
+++ b/doc/apidocs/search/ConstantsV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_v2><div class=IEntry><a href="../files/OpenLayers/Layer/Google-js.html#OpenLayers.Layer.Google.OpenLayers.Layer.Google.v2" target=_parent class=ISymbol>v2</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google</span></div></div> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsX.html b/doc/apidocs/search/ConstantsX.html
new file mode 100644
index 0000000..b4b6bd4
--- /dev/null
+++ b/doc/apidocs/search/ConstantsX.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_X><div class=IEntry><a href="../files/OpenLayers/Control/PanZoom-js.html#OpenLayers.Control.PanZoom.X" target=_parent class=ISymbol>X</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoom</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><sc [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsY.html b/doc/apidocs/search/ConstantsY.html
new file mode 100644
index 0000000..0c6bff4
--- /dev/null
+++ b/doc/apidocs/search/ConstantsY.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Y><div class=IEntry><a href="../files/OpenLayers/Control/PanZoom-js.html#OpenLayers.Control.PanZoom.Y" target=_parent class=ISymbol>Y</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoom</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><sc [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstantsZ.html b/doc/apidocs/search/ConstantsZ.html
new file mode 100644
index 0000000..74b5974
--- /dev/null
+++ b/doc/apidocs/search/ConstantsZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Z_undINDEX_undBASE><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.Z_INDEX_BASE" target=_parent class=ISymbol>Z_INDEX_BASE</a>, <span class=IParent>OpenLayers.Map</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorA.html b/doc/apidocs/search/ConstructorA.html
new file mode 100644
index 0000000..10df3bb
--- /dev/null
+++ b/doc/apidocs/search/ConstructorA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Anchored><div class=IEntry><a href="../files/OpenLayers/Popup/Anchored-js.html#OpenLayers.Popup.Anchored.OpenLayers.Popup.Anchored" target=_parent class=ISymbol>Anchored</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Anchored.<span class=HB> </span>OpenLayers.<span class=HB> </span>Popup</span></div></div><div class=SR [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorB.html b/doc/apidocs/search/ConstructorB.html
new file mode 100644
index 0000000..dc3e704
--- /dev/null
+++ b/doc/apidocs/search/ConstructorB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Base><div class=IEntry><a href="javascript:searchResults.Toggle('SR_Base')" class=ISymbol>Base</a><div class=ISubIndex><a href="../files/OpenLayers/Ajax-js.html#OpenLayers.Ajax.Base.OpenLayers.Ajax.Base" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Base.<span class=HB> </span>OpenLayers.Ajax</a><a href="../files/O [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorC.html b/doc/apidocs/search/ConstructorC.html
new file mode 100644
index 0000000..6649f57
--- /dev/null
+++ b/doc/apidocs/search/ConstructorC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Canvas><div class=IEntry><a href="../files/OpenLayers/Renderer/Canvas-js.html#OpenLayers.Renderer.Canvas.OpenLayers.Renderer.Canvas" target=_parent class=ISymbol>Canvas</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Canvas.<span class=HB> </span>OpenLayers.<span class=HB> </span>Renderer</span></div></div><div class [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorD.html b/doc/apidocs/search/ConstructorD.html
new file mode 100644
index 0000000..fb9f490
--- /dev/null
+++ b/doc/apidocs/search/ConstructorD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Drag><div class=IEntry><a href="../files/OpenLayers/Handler/Drag-js.html#OpenLayers.Handler.Drag.OpenLayers.Handler.Drag" target=_parent class=ISymbol>Drag</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Drag.<span class=HB> </span>OpenLayers.<span class=HB> </span>Handler</span></div></div><div class=SRResult id=SR_D [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorE.html b/doc/apidocs/search/ConstructorE.html
new file mode 100644
index 0000000..3c07f26
--- /dev/null
+++ b/doc/apidocs/search/ConstructorE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_EditingToolbar><div class=IEntry><a href="../files/OpenLayers/Control/EditingToolbar-js.html#OpenLayers.Control.EditingToolbar.OpenLayers.Control.EditingToolbar" target=_parent class=ISymbol>EditingToolbar</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>EditingToolbar.<span class=HB> </span>OpenLayers.<span class=HB>  [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorF.html b/doc/apidocs/search/ConstructorF.html
new file mode 100644
index 0000000..abc765c
--- /dev/null
+++ b/doc/apidocs/search/ConstructorF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Feature><div class=IEntry><a href="javascript:searchResults.Toggle('SR_Feature')" class=ISymbol>Feature</a><div class=ISubIndex><a href="../files/OpenLayers/Feature-js.html#OpenLayers.Feature.OpenLayers.Feature" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>OpenLayers</a><a href="../files/OpenLayers/Handler/Feat [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorG.html b/doc/apidocs/search/ConstructorG.html
new file mode 100644
index 0000000..6a208e2
--- /dev/null
+++ b/doc/apidocs/search/ConstructorG.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Gears><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL/Gears-js.html#OpenLayers.Protocol.SQL.Gears.OpenLayers.Protocol.SQL.Gears" target=_parent class=ISymbol>Gears</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears.<span class=HB> </span>OpenLayers.<span class=HB> </span>Prot [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorH.html b/doc/apidocs/search/ConstructorH.html
new file mode 100644
index 0000000..cf7c1fc
--- /dev/null
+++ b/doc/apidocs/search/ConstructorH.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Handler><div class=IEntry><a href="../files/OpenLayers/Handler-js.html#OpenLayers.Handler.OpenLayers.Handler" target=_parent class=ISymbol>Handler</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_Hover><div class=IEntry><a href="../files/OpenLayers/Handler/Hover-js [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorI.html b/doc/apidocs/search/ConstructorI.html
new file mode 100644
index 0000000..8dc17e1
--- /dev/null
+++ b/doc/apidocs/search/ConstructorI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Icon><div class=IEntry><a href="../files/OpenLayers/Icon-js.html#OpenLayers.Icon.OpenLayers.Icon" target=_parent class=ISymbol>Icon</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Icon.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_IFrame><div class=IEntry><a href="../files/OpenLayers/Tile/Image/IFrame-js.html#OpenLay [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorJ.html b/doc/apidocs/search/ConstructorJ.html
new file mode 100644
index 0000000..485c9ca
--- /dev/null
+++ b/doc/apidocs/search/ConstructorJ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_JSON><div class=IEntry><a href="../files/OpenLayers/Format/JSON-js.html#OpenLayers.Format.JSON.OpenLayers.Format.JSON" target=_parent class=ISymbol>JSON</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>JSON.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format</span></div></div></table><div class=SRStatus id=S [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorK.html b/doc/apidocs/search/ConstructorK.html
new file mode 100644
index 0000000..9bcc417
--- /dev/null
+++ b/doc/apidocs/search/ConstructorK.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_KaMap><div class=IEntry><a href="../files/OpenLayers/Layer/KaMap-js.html#OpenLayers.Layer.KaMap.OpenLayers.Layer.KaMap" target=_parent class=ISymbol>KaMap</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMap.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer</span></div></div><div class=SRResult id=SR_KaMap [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorL.html b/doc/apidocs/search/ConstructorL.html
new file mode 100644
index 0000000..5153f8f
--- /dev/null
+++ b/doc/apidocs/search/ConstructorL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Layer><div class=IEntry><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.OpenLayers.Layer" target=_parent class=ISymbol>Layer</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_LayerSwitcher><div class=IEntry><a href="../files/OpenLayers/Control/LayerSwitche [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorM.html b/doc/apidocs/search/ConstructorM.html
new file mode 100644
index 0000000..869ef6e
--- /dev/null
+++ b/doc/apidocs/search/ConstructorM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Map><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.OpenLayers.Map" target=_parent class=ISymbol>Map</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Map.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_MapGuide><div class=IEntry><a href="../files/OpenLayers/Layer/MapGuide-js.html#OpenLayers.Lay [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorN.html b/doc/apidocs/search/ConstructorN.html
new file mode 100644
index 0000000..4c2e861
--- /dev/null
+++ b/doc/apidocs/search/ConstructorN.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Navigation><div class=IEntry><a href="../files/OpenLayers/Control/Navigation-js.html#OpenLayers.Control.Navigation.OpenLayers.Control.Navigation" target=_parent class=ISymbol>Navigation</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Navigation.<span class=HB> </span>OpenLayers.<span class=HB> </span>Control</span></d [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorO.html b/doc/apidocs/search/ConstructorO.html
new file mode 100644
index 0000000..64d7864
--- /dev/null
+++ b/doc/apidocs/search/ConstructorO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_OSM><div class=IEntry><a href="../files/OpenLayers/Format/OSM-js.html#OpenLayers.Format.OSM.OpenLayers.Format.OSM" target=_parent class=ISymbol>OSM</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OSM.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_OverviewMap> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorP.html b/doc/apidocs/search/ConstructorP.html
new file mode 100644
index 0000000..3b60658
--- /dev/null
+++ b/doc/apidocs/search/ConstructorP.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Paging><div class=IEntry><a href="../files/OpenLayers/Strategy/Paging-js.html#OpenLayers.Strategy.Paging.OpenLayers.Strategy.Paging" target=_parent class=ISymbol>Paging</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging.<span class=HB> </span>OpenLayers.<span class=HB> </span>Strategy</span></div></div><div class [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorR.html b/doc/apidocs/search/ConstructorR.html
new file mode 100644
index 0000000..8202b8f
--- /dev/null
+++ b/doc/apidocs/search/ConstructorR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Raster><div class=IEntry><a href="../files/OpenLayers/Symbolizer/Raster-js.html#OpenLayers.Symbolizer.Raster.OpenLayers.Symbolizer.Raster" target=_parent class=ISymbol>Raster</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Raster.<span class=HB> </span>OpenLayers.<span class=HB> </span>Symbolizer</span></div></div> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorS.html b/doc/apidocs/search/ConstructorS.html
new file mode 100644
index 0000000..e25ada3
--- /dev/null
+++ b/doc/apidocs/search/ConstructorS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Save><div class=IEntry><a href="../files/OpenLayers/Strategy/Save-js.html#OpenLayers.Strategy.Save.OpenLayers.Strategy.Save" target=_parent class=ISymbol>Save</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Save.<span class=HB> </span>OpenLayers.<span class=HB> </span>Strategy</span></div></div><div class=SRResult id [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorT.html b/doc/apidocs/search/ConstructorT.html
new file mode 100644
index 0000000..8aada3c
--- /dev/null
+++ b/doc/apidocs/search/ConstructorT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Text><div class=IEntry><a href="javascript:searchResults.Toggle('SR_Text')" class=ISymbol>Text</a><div class=ISubIndex><a href="../files/OpenLayers/Format/Text-js.html#OpenLayers.Format.Text.OpenLayers.Format.Text" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Text.<span class=HB> </span>OpenLayers.<span class=HB [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorU.html b/doc/apidocs/search/ConstructorU.html
new file mode 100644
index 0000000..76c2521
--- /dev/null
+++ b/doc/apidocs/search/ConstructorU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Untiled><div class=IEntry><a href="javascript:searchResults.Toggle('SR_Untiled')" class=ISymbol>Untiled</a><div class=ISubIndex><a href="../files/OpenLayers/Layer/MapServer/Untiled-js.html#OpenLayers.Layer.MapServer.Untiled.OpenLayers.Layer.MapServer.Untiled" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorV.html b/doc/apidocs/search/ConstructorV.html
new file mode 100644
index 0000000..9daf61c
--- /dev/null
+++ b/doc/apidocs/search/ConstructorV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_v0_und3_und1><div class=IEntry><a href="../files/OpenLayers/Format/OWSContext/v0_3_1-js.html#OpenLayers.Format.OWSContext.v0_3_1.OpenLayers.Format.OWSContext.v0_3_1" target=_parent class=ISymbol>v0_3_1</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext.<span class=HB> </span>v0_3_1.<span class=HB> </span>OpenLa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorW.html b/doc/apidocs/search/ConstructorW.html
new file mode 100644
index 0000000..185c45f
--- /dev/null
+++ b/doc/apidocs/search/ConstructorW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_WFS><div class=IEntry><a href="javascript:searchResults.Toggle('SR_WFS')" class=ISymbol>WFS</a><div class=ISubIndex><a href="../files/OpenLayers/Feature/WFS-js.html#OpenLayers.Feature.WFS.OpenLayers.Feature.WFS" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>WFS.<span class=HB> </span>OpenLayers.<span class=HB> < [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorX.html b/doc/apidocs/search/ConstructorX.html
new file mode 100644
index 0000000..0306625
--- /dev/null
+++ b/doc/apidocs/search/ConstructorX.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_XML><div class=IEntry><a href="../files/OpenLayers/Format/XML-js.html#OpenLayers.Format.XML.OpenLayers.Format.XML" target=_parent class=ISymbol>XML</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>XML.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_XYZ><div cla [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorY.html b/doc/apidocs/search/ConstructorY.html
new file mode 100644
index 0000000..3033d64
--- /dev/null
+++ b/doc/apidocs/search/ConstructorY.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Yahoo><div class=IEntry><a href="../files/OpenLayers/Layer/Yahoo-js.html#OpenLayers.Layer.Yahoo.OpenLayers.Layer.Yahoo" target=_parent class=ISymbol>Yahoo</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Yahoo.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer</span></div></div></table><div class=SRStatus id= [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/ConstructorZ.html b/doc/apidocs/search/ConstructorZ.html
new file mode 100644
index 0000000..7732e07
--- /dev/null
+++ b/doc/apidocs/search/ConstructorZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Zoomify><div class=IEntry><a href="../files/OpenLayers/Layer/Zoomify-js.html#OpenLayers.Layer.Zoomify.OpenLayers.Layer.Zoomify" target=_parent class=ISymbol>Zoomify</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Zoomify.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer</span></div></div><div class=SRResult [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FilesA.html b/doc/apidocs/search/FilesA.html
new file mode 100644
index 0000000..f9c9172
--- /dev/null
+++ b/doc/apidocs/search/FilesA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Ajax_perjs><div class=IEntry><a href="../files/OpenLayers/Ajax-js.html#Ajax.js" target=_parent class=ISymbol>Ajax.js</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FilesC.html b/doc/apidocs/search/FilesC.html
new file mode 100644
index 0000000..f4f5a3c
--- /dev/null
+++ b/doc/apidocs/search/FilesC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Class_perjs><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Class-js.html#Class.js" target=_parent class=ISymbol>Class.js</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FilesO.html b/doc/apidocs/search/FilesO.html
new file mode 100644
index 0000000..1d83f8f
--- /dev/null
+++ b/doc/apidocs/search/FilesO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_OpenLayers_spcBase_spcTypes><div class=IEntry><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers_Base_Types" target=_parent class=ISymbol>OpenLayers Base Types</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FilesV.html b/doc/apidocs/search/FilesV.html
new file mode 100644
index 0000000..18b067d
--- /dev/null
+++ b/doc/apidocs/search/FilesV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_v3_perjs><div class=IEntry><a href="../files/OpenLayers/Layer/Google/v3-js.html#v3.js" target=_parent class=ISymbol>v3.js</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsA.html b/doc/apidocs/search/FunctionsA.html
new file mode 100644
index 0000000..16f5e09
--- /dev/null
+++ b/doc/apidocs/search/FunctionsA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_abort><div class=IEntry><a href="../files/OpenLayers/Protocol/HTTP-js.html#OpenLayers.Protocol.HTTP.abort" target=_parent class=ISymbol>abort</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.HTTP</span></div></div><div class=SRResult id=SR_activate><div class=IEntry><a href="javascript:searchResults.Toggle('SR_activate')" class=ISymbol>acti [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsB.html b/doc/apidocs/search/FunctionsB.html
new file mode 100644
index 0000000..74d0c92
--- /dev/null
+++ b/doc/apidocs/search/FunctionsB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_bind><div class=IEntry><a href="javascript:searchResults.Toggle('SR_bind')" class=ISymbol>bind</a><div class=ISubIndex><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers.Function.bind" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Function</a><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers.Function.Function.bind" target=_pare [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsC.html b/doc/apidocs/search/FunctionsC.html
new file mode 100644
index 0000000..2c48f91
--- /dev/null
+++ b/doc/apidocs/search/FunctionsC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_calculateBounds><div class=IEntry><a href="javascript:searchResults.Toggle('SR_calculateBounds')" class=ISymbol>calculateBounds</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry-js.html#OpenLayers.Geometry.calculateBounds" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry</a><a href="../files/OpenLayers/Geometry/Collection-js [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsD.html b/doc/apidocs/search/FunctionsD.html
new file mode 100644
index 0000000..19da75f
--- /dev/null
+++ b/doc/apidocs/search/FunctionsD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_deactivate><div class=IEntry><a href="javascript:searchResults.Toggle('SR_deactivate')" class=ISymbol>deactivate</a><div class=ISubIndex><a href="../files/OpenLayers/Control/DragFeature-js.html#OpenLayers.Control.DragFeature.deactivate" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DragFeature</a><a href="../fil [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsE.html b/doc/apidocs/search/FunctionsE.html
new file mode 100644
index 0000000..eedf52c
--- /dev/null
+++ b/doc/apidocs/search/FunctionsE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_equals><div class=IEntry><a href="javascript:searchResults.Toggle('SR_equals')" class=ISymbol>equals</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Collection-js.html#OpenLayers.Geometry.Collection.equals" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Collection</a><a href="../files/OpenLayers/Ge [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsF.html b/doc/apidocs/search/FunctionsF.html
new file mode 100644
index 0000000..240e1b6
--- /dev/null
+++ b/doc/apidocs/search/FunctionsF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_False><div class=IEntry><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers.Function.False" target=_parent class=ISymbol>False</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Function</span></div></div><div class=SRResult id=SR_filter><div class=IEntry><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers.Array.filter" target=_parent clas [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsG.html b/doc/apidocs/search/FunctionsG.html
new file mode 100644
index 0000000..5072452
--- /dev/null
+++ b/doc/apidocs/search/FunctionsG.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_GET><div class=IEntry><a href="../files/OpenLayers/Request-js.html#OpenLayers.Request.GET" target=_parent class=ISymbol>GET</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Request</span></div></div><div class=SRResult id=SR_getArea><div class=IEntry><a href="javascript:searchResults.Toggle('SR_getArea')" class=ISymbol>getArea</a><div class=ISubInde [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsH.html b/doc/apidocs/search/FunctionsH.html
new file mode 100644
index 0000000..0e5612b
--- /dev/null
+++ b/doc/apidocs/search/FunctionsH.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_hasAttributeNS><div class=IEntry><a href="../files/OpenLayers/Format/XML-js.html#OpenLayers.Format.XML.hasAttributeNS" target=_parent class=ISymbol>hasAttributeNS</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.XML</span></div></div><div class=SRResult id=SR_HEAD><div class=IEntry><a href="../files/OpenLayers/Request-js.html#OpenLayers.Reque [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsI.html b/doc/apidocs/search/FunctionsI.html
new file mode 100644
index 0000000..793a7dd
--- /dev/null
+++ b/doc/apidocs/search/FunctionsI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_i18n><div class=IEntry><a href="../files/OpenLayers/Lang-js.html#OpenLayers.Lang.OpenLayers.i18n" target=_parent class=ISymbol>i18n</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Lang.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_info><div class=IEntry><a href="../files/OpenLayers/Console-js.html#OpenLayers.Console. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsL.html b/doc/apidocs/search/FunctionsL.html
new file mode 100644
index 0000000..eeb46b6
--- /dev/null
+++ b/doc/apidocs/search/FunctionsL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_limitSigDigs><div class=IEntry><a href="javascript:searchResults.Toggle('SR_limitSigDigs')" class=ISymbol>limitSigDigs</a><div class=ISubIndex><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers.Number.limitSigDigs" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Number</a><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers.Number.N [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsM.html b/doc/apidocs/search/FunctionsM.html
new file mode 100644
index 0000000..3cac745
--- /dev/null
+++ b/doc/apidocs/search/FunctionsM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_mergeNewParams><div class=IEntry><a href="javascript:searchResults.Toggle('SR_mergeNewParams')" class=ISymbol>mergeNewParams</a><div class=ISubIndex><a href="../files/OpenLayers/Layer/ArcGIS93Rest-js.html#OpenLayers.Layer.ArcGIS93Rest.mergeNewParams" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcGIS93Rest</a><a [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsN.html b/doc/apidocs/search/FunctionsN.html
new file mode 100644
index 0000000..ea45412
--- /dev/null
+++ b/doc/apidocs/search/FunctionsN.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_nextTrigger><div class=IEntry><a href="../files/OpenLayers/Control/NavigationHistory-js.html#OpenLayers.Control.NavigationHistory.nextTrigger" target=_parent class=ISymbol>nextTrigger</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavigationHistory</span></div></div><div class=SRResult id=SR_numericIf><div class=IEnt [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsO.html b/doc/apidocs/search/FunctionsO.html
new file mode 100644
index 0000000..9079c9d
--- /dev/null
+++ b/doc/apidocs/search/FunctionsO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_offset><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Pixel-js.html#OpenLayers.Pixel.offset" target=_parent class=ISymbol>offset</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Pixel</span></div></div><div class=SRResult id=SR_on><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.on" target=_parent class=ISymb [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsP.html b/doc/apidocs/search/FunctionsP.html
new file mode 100644
index 0000000..8481f47
--- /dev/null
+++ b/doc/apidocs/search/FunctionsP.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_pageCount><div class=IEntry><a href="../files/OpenLayers/Strategy/Paging-js.html#OpenLayers.Strategy.Paging.pageCount" target=_parent class=ISymbol>pageCount</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging</span></div></div><div class=SRResult id=SR_pageLength><div class=IEntry><a href="../files/OpenLayers/Str [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsR.html b/doc/apidocs/search/FunctionsR.html
new file mode 100644
index 0000000..fbf76ea
--- /dev/null
+++ b/doc/apidocs/search/FunctionsR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_raiseLayer><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.raiseLayer" target=_parent class=ISymbol>raiseLayer</a>, <span class=IParent>OpenLayers.Map</span></div></div><div class=SRResult id=SR_read><div class=IEntry><a href="javascript:searchResults.Toggle('SR_read')" class=ISymbol>read</a><div class=ISubIndex><a href="../files/Ope [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsS.html b/doc/apidocs/search/FunctionsS.html
new file mode 100644
index 0000000..984ca44
--- /dev/null
+++ b/doc/apidocs/search/FunctionsS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_save><div class=IEntry><a href="../files/OpenLayers/Strategy/Save-js.html#OpenLayers.Strategy.Save.save" target=_parent class=ISymbol>save</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.Save</span></div></div><div class=SRResult id=SR_setAttributeNS><div class=IEntry><a href="../files/OpenLayers/Format/XML-js.html#OpenLayers.Format.XML.se [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsT.html b/doc/apidocs/search/FunctionsT.html
new file mode 100644
index 0000000..1f35e1b
--- /dev/null
+++ b/doc/apidocs/search/FunctionsT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_time><div class=IEntry><a href="../files/OpenLayers/Console-js.html#OpenLayers.Console.time" target=_parent class=ISymbol>time</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Console</span></div></div><div class=SRResult id=SR_timeEnd><div class=IEntry><a href="../files/OpenLayers/Console-js.html#OpenLayers.Console.timeEnd" target=_parent class=ISy [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsU.html b/doc/apidocs/search/FunctionsU.html
new file mode 100644
index 0000000..d548cad
--- /dev/null
+++ b/doc/apidocs/search/FunctionsU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_un><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.un" target=_parent class=ISymbol>un</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Events</span></div></div><div class=SRResult id=SR_unregister><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.unregister" target=_parent class=ISymbol> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsV.html b/doc/apidocs/search/FunctionsV.html
new file mode 100644
index 0000000..b7218ce
--- /dev/null
+++ b/doc/apidocs/search/FunctionsV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_value2regex><div class=IEntry><a href="../files/OpenLayers/Filter/Comparison-js.html#OpenLayers.Filter.Comparison.value2regex" target=_parent class=ISymbol>value2regex</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Comparison</span></div></div><div class=SRResult id=SR_visible><div class=IEntry><a href="../files/OpenL [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsW.html b/doc/apidocs/search/FunctionsW.html
new file mode 100644
index 0000000..1add4cb
--- /dev/null
+++ b/doc/apidocs/search/FunctionsW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_warn><div class=IEntry><a href="../files/OpenLayers/Console-js.html#OpenLayers.Console.warn" target=_parent class=ISymbol>warn</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Console</span></div></div><div class=SRResult id=SR_wrapDateLine><div class=IEntry><a href="javascript:searchResults.Toggle('SR_wrapDateLine')" class=ISymbol>wrapDateLine</a>< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/FunctionsZ.html b/doc/apidocs/search/FunctionsZ.html
new file mode 100644
index 0000000..89825d3
--- /dev/null
+++ b/doc/apidocs/search/FunctionsZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Z_undORDER_undDRAWING_undORDER><div class=IEntry><a href="../files/OpenLayers/Renderer/Elements-js.html#OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER" target=_parent class=ISymbol>Z_ORDER_DRAWING_ORDER</a>, <span class=IParent>OpenLayers.<span class=HB> </span>ElementsIndexer.<span class=HB> </span>IndexingMethods</span></div></div><div cla [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralA.html b/doc/apidocs/search/GeneralA.html
new file mode 100644
index 0000000..a0227af
--- /dev/null
+++ b/doc/apidocs/search/GeneralA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_abort><div class=IEntry><a href="../files/OpenLayers/Protocol/HTTP-js.html#OpenLayers.Protocol.HTTP.abort" target=_parent class=ISymbol>abort</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.HTTP</span></div></div><div class=SRResult id=SR_activate><div class=IEntry><a href="javascript:searchResults.Toggle('SR_activate')" class=ISymbol>acti [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralB.html b/doc/apidocs/search/GeneralB.html
new file mode 100644
index 0000000..7e3169a
--- /dev/null
+++ b/doc/apidocs/search/GeneralB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_BACKGROUND_undID_undSUFFIX><div class=IEntry><a href="../files/OpenLayers/Renderer/Elements-js.html#OpenLayers.Renderer.Elements.BACKGROUND_ID_SUFFIX" target=_parent class=ISymbol>BACKGROUND_ID_SUFFIX</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Elements</span></div></div><div class=SRResult id=SR_base><div class= [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralC.html b/doc/apidocs/search/GeneralC.html
new file mode 100644
index 0000000..80f8bc7
--- /dev/null
+++ b/doc/apidocs/search/GeneralC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_calculateBounds><div class=IEntry><a href="javascript:searchResults.Toggle('SR_calculateBounds')" class=ISymbol>calculateBounds</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry-js.html#OpenLayers.Geometry.calculateBounds" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry</a><a href="../files/OpenLayers/Geometry/Collection-js [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralD.html b/doc/apidocs/search/GeneralD.html
new file mode 100644
index 0000000..7ca6d45
--- /dev/null
+++ b/doc/apidocs/search/GeneralD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_data><div class=IEntry><a href="../files/OpenLayers/Format-js.html#OpenLayers.Format.data" target=_parent class=ISymbol>data</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_databaseName><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL-js.html#OpenLayers.Protocol.SQL.databaseName" target= [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralE.html b/doc/apidocs/search/GeneralE.html
new file mode 100644
index 0000000..e7f2b72
--- /dev/null
+++ b/doc/apidocs/search/GeneralE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_easing><div class=IEntry><a href="../files/OpenLayers/Tween-js.html#OpenLayers.Tween.easing" target=_parent class=ISymbol>easing</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Tween</span></div></div><div class=SRResult id=SR_edge><div class=IEntry><a href="../files/OpenLayers/Control/Split-js.html#OpenLayers.Control.Split.edge" target=_parent cla [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralF.html b/doc/apidocs/search/GeneralF.html
new file mode 100644
index 0000000..40f63bd
--- /dev/null
+++ b/doc/apidocs/search/GeneralF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_fallThrough><div class=IEntry><a href="javascript:searchResults.Toggle('SR_fallThrough')" class=ISymbol>fallThrough</a><div class=ISubIndex><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.fallThrough" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Events</a><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.fallThrough" targ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralG.html b/doc/apidocs/search/GeneralG.html
new file mode 100644
index 0000000..b37e318
--- /dev/null
+++ b/doc/apidocs/search/GeneralG.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Gears><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL/Gears-js.html#OpenLayers.Protocol.SQL.Gears.OpenLayers.Protocol.SQL.Gears" target=_parent class=ISymbol>Gears</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears.<span class=HB> </span>OpenLayers.<span class=HB> </span>Prot [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralH.html b/doc/apidocs/search/GeneralH.html
new file mode 100644
index 0000000..1563e74
--- /dev/null
+++ b/doc/apidocs/search/GeneralH.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_h><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Size-js.html#OpenLayers.Size.h" target=_parent class=ISymbol>h</a>, <span class=IParent>OpenLayers.Size</span></div></div><div class=SRResult id=SR_Handler><div class=IEntry><a href="../files/OpenLayers/Handler-js.html#OpenLayers.Handler.OpenLayers.Handler" target=_parent class=ISymbol>Handler</a>, <s [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralI.html b/doc/apidocs/search/GeneralI.html
new file mode 100644
index 0000000..8cde1bc
--- /dev/null
+++ b/doc/apidocs/search/GeneralI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_i18n><div class=IEntry><a href="../files/OpenLayers/Lang-js.html#OpenLayers.Lang.OpenLayers.i18n" target=_parent class=ISymbol>i18n</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Lang.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_icon><div class=IEntry><a href="../files/OpenLayers/Layer/GeoRSS-js.html#OpenLayers.Lay [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralJ.html b/doc/apidocs/search/GeneralJ.html
new file mode 100644
index 0000000..485c9ca
--- /dev/null
+++ b/doc/apidocs/search/GeneralJ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_JSON><div class=IEntry><a href="../files/OpenLayers/Format/JSON-js.html#OpenLayers.Format.JSON.OpenLayers.Format.JSON" target=_parent class=ISymbol>JSON</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>JSON.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format</span></div></div></table><div class=SRStatus id=S [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralK.html b/doc/apidocs/search/GeneralK.html
new file mode 100644
index 0000000..62333e4
--- /dev/null
+++ b/doc/apidocs/search/GeneralK.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_KaMap><div class=IEntry><a href="../files/OpenLayers/Layer/KaMap-js.html#OpenLayers.Layer.KaMap.OpenLayers.Layer.KaMap" target=_parent class=ISymbol>KaMap</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMap.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer</span></div></div><div class=SRResult id=SR_KaMap [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralL.html b/doc/apidocs/search/GeneralL.html
new file mode 100644
index 0000000..da709a6
--- /dev/null
+++ b/doc/apidocs/search/GeneralL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_label><div class=IEntry><a href="../files/OpenLayers/Symbolizer/Text-js.html#OpenLayers.Symbolizer.Text.label" target=_parent class=ISymbol>label</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Symbolizer.Text</span></div></div><div class=SRResult id=SR_LABEL_undALIGN><div class=IEntry><a href="javascript:searchResults.Toggle('SR_LABEL_undALIGN')"  [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralM.html b/doc/apidocs/search/GeneralM.html
new file mode 100644
index 0000000..49eb9f2
--- /dev/null
+++ b/doc/apidocs/search/GeneralM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_map><div class=IEntry><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.map" target=_parent class=ISymbol>map</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer</span></div></div><div class=SRResult id=SR2_Map><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.OpenLayers.Map" target=_parent class=ISymbol>Map</a>, [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralN.html b/doc/apidocs/search/GeneralN.html
new file mode 100644
index 0000000..cf152f5
--- /dev/null
+++ b/doc/apidocs/search/GeneralN.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_name><div class=IEntry><a href="javascript:searchResults.Toggle('SR_name')" class=ISymbol>name</a><div class=ISubIndex><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.name" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer</a><a href="../files/OpenLayers/Layer/ArcIMS-js.html#OpenLayers.Layer.ArcIMS.name" target=_parent class=IPa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralO.html b/doc/apidocs/search/GeneralO.html
new file mode 100644
index 0000000..6297192
--- /dev/null
+++ b/doc/apidocs/search/GeneralO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_offset><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Pixel-js.html#OpenLayers.Pixel.offset" target=_parent class=ISymbol>offset</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Pixel</span></div></div><div class=SRResult id=SR_on><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.on" target=_parent class=ISymb [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralP.html b/doc/apidocs/search/GeneralP.html
new file mode 100644
index 0000000..ea77156
--- /dev/null
+++ b/doc/apidocs/search/GeneralP.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_pageCount><div class=IEntry><a href="../files/OpenLayers/Strategy/Paging-js.html#OpenLayers.Strategy.Paging.pageCount" target=_parent class=ISymbol>pageCount</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging</span></div></div><div class=SRResult id=SR_pageLength><div class=IEntry><a href="../files/OpenLayers/Str [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralQ.html b/doc/apidocs/search/GeneralQ.html
new file mode 100644
index 0000000..f6c03b4
--- /dev/null
+++ b/doc/apidocs/search/GeneralQ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Query><div class=IEntry><a href="../files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html#OpenLayers.Format.CSWGetRecords.v2_0_2.Query" target=_parent class=ISymbol>Query</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>v2_0_2</span></div></div><div class=SRResult id=SR_queryVisible>< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralR.html b/doc/apidocs/search/GeneralR.html
new file mode 100644
index 0000000..95c1287
--- /dev/null
+++ b/doc/apidocs/search/GeneralR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_radius><div class=IEntry><a href="../files/OpenLayers/Handler/RegularPolygon-js.html#OpenLayers.Handler.RegularPolygon.radius" target=_parent class=ISymbol>radius</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>RegularPolygon</span></div></div><div class=SRResult id=SR_raiseLayer><div class=IEntry><a href="../files/Op [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralS.html b/doc/apidocs/search/GeneralS.html
new file mode 100644
index 0000000..75a2a28
--- /dev/null
+++ b/doc/apidocs/search/GeneralS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_save><div class=IEntry><a href="../files/OpenLayers/Strategy/Save-js.html#OpenLayers.Strategy.Save.save" target=_parent class=ISymbol>save</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.Save</span></div></div><div class=SRResult id=SR2_Save><div class=IEntry><a href="../files/OpenLayers/Strategy/Save-js.html#OpenLayers.Strategy.Save.OpenL [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralT.html b/doc/apidocs/search/GeneralT.html
new file mode 100644
index 0000000..a283316
--- /dev/null
+++ b/doc/apidocs/search/GeneralT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_tableName><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL-js.html#OpenLayers.Protocol.SQL.tableName" target=_parent class=ISymbol>tableName</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.SQL</span></div></div><div class=SRResult id=SR_targetFilter><div class=IEntry><a href="../files/OpenLayers/Control/Split-js.html#OpenLayers. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralU.html b/doc/apidocs/search/GeneralU.html
new file mode 100644
index 0000000..36865bf
--- /dev/null
+++ b/doc/apidocs/search/GeneralU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_un><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.un" target=_parent class=ISymbol>un</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Events</span></div></div><div class=SRResult id=SR_units><div class=IEntry><a href="javascript:searchResults.Toggle('SR_units')" class=ISymbol>units</a><div class=ISubIndex><a href=". [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralV.html b/doc/apidocs/search/GeneralV.html
new file mode 100644
index 0000000..ea5bc43
--- /dev/null
+++ b/doc/apidocs/search/GeneralV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_v0_und3_und1><div class=IEntry><a href="../files/OpenLayers/Format/OWSContext/v0_3_1-js.html#OpenLayers.Format.OWSContext.v0_3_1.OpenLayers.Format.OWSContext.v0_3_1" target=_parent class=ISymbol>v0_3_1</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext.<span class=HB> </span>v0_3_1.<span class=HB> </span>OpenLa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralW.html b/doc/apidocs/search/GeneralW.html
new file mode 100644
index 0000000..668fc4b
--- /dev/null
+++ b/doc/apidocs/search/GeneralW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_w><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Size-js.html#OpenLayers.Size.w" target=_parent class=ISymbol>w</a>, <span class=IParent>OpenLayers.Size</span></div></div><div class=SRResult id=SR_warn><div class=IEntry><a href="../files/OpenLayers/Console-js.html#OpenLayers.Console.warn" target=_parent class=ISymbol>warn</a>, <span class=IParent>Op [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralX.html b/doc/apidocs/search/GeneralX.html
new file mode 100644
index 0000000..59693e3
--- /dev/null
+++ b/doc/apidocs/search/GeneralX.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_x><div class=IEntry><a href="javascript:searchResults.Toggle('SR_x')" class=ISymbol>x</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Point-js.html#OpenLayers.Geometry.Point.x" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</a><a href="../files/OpenLayers/BaseTypes/Pixel-js.html#OpenLayers.Pi [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralY.html b/doc/apidocs/search/GeneralY.html
new file mode 100644
index 0000000..070fc50
--- /dev/null
+++ b/doc/apidocs/search/GeneralY.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_y><div class=IEntry><a href="javascript:searchResults.Toggle('SR_y')" class=ISymbol>y</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Point-js.html#OpenLayers.Geometry.Point.y" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</a><a href="../files/OpenLayers/BaseTypes/Pixel-js.html#OpenLayers.Pi [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/GeneralZ.html b/doc/apidocs/search/GeneralZ.html
new file mode 100644
index 0000000..1d0738e
--- /dev/null
+++ b/doc/apidocs/search/GeneralZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Z_undINDEX_undBASE><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.Z_INDEX_BASE" target=_parent class=ISymbol>Z_INDEX_BASE</a>, <span class=IParent>OpenLayers.Map</span></div></div><div class=SRResult id=SR_Z_undORDER_undDRAWING_undORDER><div class=IEntry><a href="../files/OpenLayers/Renderer/Elements-js.html#OpenLayers.ElementsIndex [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/NoResults.html b/doc/apidocs/search/NoResults.html
new file mode 100644
index 0000000..947d3b5
--- /dev/null
+++ b/doc/apidocs/search/NoResults.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=NoMatches>No Matches</div></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesA.html b/doc/apidocs/search/PropertiesA.html
new file mode 100644
index 0000000..9f71776
--- /dev/null
+++ b/doc/apidocs/search/PropertiesA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_allOverlays><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.allOverlays" target=_parent class=ISymbol>allOverlays</a>, <span class=IParent>OpenLayers.Map</span></div></div><div class=SRResult id=SR_alwaysInRange><div class=IEntry><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.alwaysInRange" target=_parent class=ISymbol>a [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesB.html b/doc/apidocs/search/PropertiesB.html
new file mode 100644
index 0000000..1ee4872
--- /dev/null
+++ b/doc/apidocs/search/PropertiesB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_base><div class=IEntry><a href="../files/OpenLayers/Control/Permalink-js.html#OpenLayers.Control.Permalink.base" target=_parent class=ISymbol>base</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Permalink</span></div></div><div class=SRResult id=SR_baseLayer><div class=IEntry><a href="../files/OpenLayers/Map-js.html#O [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesC.html b/doc/apidocs/search/PropertiesC.html
new file mode 100644
index 0000000..26d1103
--- /dev/null
+++ b/doc/apidocs/search/PropertiesC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_callbacks><div class=IEntry><a href="javascript:searchResults.Toggle('SR_callbacks')" class=ISymbol>callbacks</a><div class=ISubIndex><a href="../files/OpenLayers/Control/SelectFeature-js.html#OpenLayers.Control.SelectFeature.callbacks" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SelectFeature</a><a href="../f [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesD.html b/doc/apidocs/search/PropertiesD.html
new file mode 100644
index 0000000..ea360c2
--- /dev/null
+++ b/doc/apidocs/search/PropertiesD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_data><div class=IEntry><a href="../files/OpenLayers/Format-js.html#OpenLayers.Format.data" target=_parent class=ISymbol>data</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_databaseName><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL-js.html#OpenLayers.Protocol.SQL.databaseName" target= [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesE.html b/doc/apidocs/search/PropertiesE.html
new file mode 100644
index 0000000..0993821
--- /dev/null
+++ b/doc/apidocs/search/PropertiesE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_easing><div class=IEntry><a href="../files/OpenLayers/Tween-js.html#OpenLayers.Tween.easing" target=_parent class=ISymbol>easing</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Tween</span></div></div><div class=SRResult id=SR_edge><div class=IEntry><a href="../files/OpenLayers/Control/Split-js.html#OpenLayers.Control.Split.edge" target=_parent cla [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesF.html b/doc/apidocs/search/PropertiesF.html
new file mode 100644
index 0000000..2f15cc6
--- /dev/null
+++ b/doc/apidocs/search/PropertiesF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_fallThrough><div class=IEntry><a href="javascript:searchResults.Toggle('SR_fallThrough')" class=ISymbol>fallThrough</a><div class=ISubIndex><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.fallThrough" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Events</a><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.fallThrough" targ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesG.html b/doc/apidocs/search/PropertiesG.html
new file mode 100644
index 0000000..92eb064
--- /dev/null
+++ b/doc/apidocs/search/PropertiesG.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_geodesic><div class=IEntry><a href="javascript:searchResults.Toggle('SR_geodesic')" class=ISymbol>geodesic</a><div class=ISubIndex><a href="../files/OpenLayers/Control/Scale-js.html#OpenLayers.Control.Scale.geodesic" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Scale</a><a href="../files/OpenLayers/Control/Scal [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesH.html b/doc/apidocs/search/PropertiesH.html
new file mode 100644
index 0000000..3f4980b
--- /dev/null
+++ b/doc/apidocs/search/PropertiesH.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_h><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Size-js.html#OpenLayers.Size.h" target=_parent class=ISymbol>h</a>, <span class=IParent>OpenLayers.Size</span></div></div><div class=SRResult id=SR_handleRightClicks><div class=IEntry><a href="../files/OpenLayers/Control/Navigation-js.html#OpenLayers.Control.Navigation.handleRightClicks" target=_paren [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesI.html b/doc/apidocs/search/PropertiesI.html
new file mode 100644
index 0000000..242e6dd
--- /dev/null
+++ b/doc/apidocs/search/PropertiesI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_icon><div class=IEntry><a href="../files/OpenLayers/Layer/GeoRSS-js.html#OpenLayers.Layer.GeoRSS.icon" target=_parent class=ISymbol>icon</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>GeoRSS</span></div></div><div class=SRResult id=SR_id><div class=IEntry><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.id"  [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesK.html b/doc/apidocs/search/PropertiesK.html
new file mode 100644
index 0000000..bf57649
--- /dev/null
+++ b/doc/apidocs/search/PropertiesK.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_keepData><div class=IEntry><a href="../files/OpenLayers/Format-js.html#OpenLayers.Format.keepData" target=_parent class=ISymbol>keepData</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_keepInMap><div class=IEntry><a href="javascript:searchResults.Toggle('SR_keepInMap')" class=ISymbol>keepInMap</a>< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesL.html b/doc/apidocs/search/PropertiesL.html
new file mode 100644
index 0000000..c369bf2
--- /dev/null
+++ b/doc/apidocs/search/PropertiesL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_label><div class=IEntry><a href="../files/OpenLayers/Symbolizer/Text-js.html#OpenLayers.Symbolizer.Text.label" target=_parent class=ISymbol>label</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Symbolizer.Text</span></div></div><div class=SRResult id=SR_labelFormat><div class=IEntry><a href="../files/OpenLayers/Control/Graticule-js.html#OpenLayers. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesM.html b/doc/apidocs/search/PropertiesM.html
new file mode 100644
index 0000000..964b80f
--- /dev/null
+++ b/doc/apidocs/search/PropertiesM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_map><div class=IEntry><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.map" target=_parent class=ISymbol>map</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer</span></div></div><div class=SRResult id=SR_mapOptions><div class=IEntry><a href="../files/OpenLayers/Control/OverviewMap-js.html#OpenLayers.Control.OverviewMap.mapOptions" tar [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesN.html b/doc/apidocs/search/PropertiesN.html
new file mode 100644
index 0000000..eab7f69
--- /dev/null
+++ b/doc/apidocs/search/PropertiesN.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_name><div class=IEntry><a href="javascript:searchResults.Toggle('SR_name')" class=ISymbol>name</a><div class=ISubIndex><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.name" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer</a><a href="../files/OpenLayers/Layer/ArcIMS-js.html#OpenLayers.Layer.ArcIMS.name" target=_parent class=IPa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesO.html b/doc/apidocs/search/PropertiesO.html
new file mode 100644
index 0000000..161272e
--- /dev/null
+++ b/doc/apidocs/search/PropertiesO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_onComplete><div class=IEntry><a href="../files/OpenLayers/Control/DragFeature-js.html#OpenLayers.Control.DragFeature.onComplete" target=_parent class=ISymbol>onComplete</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DragFeature</span></div></div><div class=SRResult id=SR_onDrag><div class=IEntry><a href="../files/Ope [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesP.html b/doc/apidocs/search/PropertiesP.html
new file mode 100644
index 0000000..a39c72e
--- /dev/null
+++ b/doc/apidocs/search/PropertiesP.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_panMapIfOutOfView><div class=IEntry><a href="javascript:searchResults.Toggle('SR_panMapIfOutOfView')" class=ISymbol>panMapIfOutOfView</a><div class=ISubIndex><a href="../files/OpenLayers/Popup-js.html#OpenLayers.Popup.panMapIfOutOfView" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Popup</a><a href="../files/OpenLayers/Popup/FramedCloud-js.ht [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesQ.html b/doc/apidocs/search/PropertiesQ.html
new file mode 100644
index 0000000..f6c03b4
--- /dev/null
+++ b/doc/apidocs/search/PropertiesQ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Query><div class=IEntry><a href="../files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html#OpenLayers.Format.CSWGetRecords.v2_0_2.Query" target=_parent class=ISymbol>Query</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>v2_0_2</span></div></div><div class=SRResult id=SR_queryVisible>< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesR.html b/doc/apidocs/search/PropertiesR.html
new file mode 100644
index 0000000..86d7813
--- /dev/null
+++ b/doc/apidocs/search/PropertiesR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_radius><div class=IEntry><a href="../files/OpenLayers/Handler/RegularPolygon-js.html#OpenLayers.Handler.RegularPolygon.radius" target=_parent class=ISymbol>radius</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>RegularPolygon</span></div></div><div class=SRResult id=SR_ratio><div class=IEntry><a href="javascript:searc [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesS.html b/doc/apidocs/search/PropertiesS.html
new file mode 100644
index 0000000..c7785bb
--- /dev/null
+++ b/doc/apidocs/search/PropertiesS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_saveState><div class=IEntry><a href="../files/OpenLayers/Control/Panel-js.html#OpenLayers.Control.Panel.saveState" target=_parent class=ISymbol>saveState</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Panel</span></div></div><div class=SRResult id=SR_scale><div class=IEntry><a href="../files/OpenLayers/Control/Transf [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesT.html b/doc/apidocs/search/PropertiesT.html
new file mode 100644
index 0000000..7541539
--- /dev/null
+++ b/doc/apidocs/search/PropertiesT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_tableName><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL-js.html#OpenLayers.Protocol.SQL.tableName" target=_parent class=ISymbol>tableName</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.SQL</span></div></div><div class=SRResult id=SR_targetFilter><div class=IEntry><a href="../files/OpenLayers/Control/Split-js.html#OpenLayers. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesU.html b/doc/apidocs/search/PropertiesU.html
new file mode 100644
index 0000000..d5ef61b
--- /dev/null
+++ b/doc/apidocs/search/PropertiesU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_units><div class=IEntry><a href="javascript:searchResults.Toggle('SR_units')" class=ISymbol>units</a><div class=ISubIndex><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.units" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer</a><a href="../files/OpenLayers/Layer/KaMap-js.html#OpenLayers.Layer.KaMap.units" target=_parent class= [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesV.html b/doc/apidocs/search/PropertiesV.html
new file mode 100644
index 0000000..e444d2f
--- /dev/null
+++ b/doc/apidocs/search/PropertiesV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_value><div class=IEntry><a href="javascript:searchResults.Toggle('SR_value')" class=ISymbol>value</a><div class=ISubIndex><a href="../files/OpenLayers/Filter/Comparison-js.html#OpenLayers.Filter.Comparison.value" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Comparison</a><a href="../files/OpenLayers/Filter/Spati [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesW.html b/doc/apidocs/search/PropertiesW.html
new file mode 100644
index 0000000..59f4716
--- /dev/null
+++ b/doc/apidocs/search/PropertiesW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_w><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Size-js.html#OpenLayers.Size.w" target=_parent class=ISymbol>w</a>, <span class=IParent>OpenLayers.Size</span></div></div><div class=SRResult id=SR_wfsCache><div class=IEntry><a href="../files/OpenLayers/Control/SLDSelect-js.html#OpenLayers.Control.SLDSelect.wfsCache" target=_parent class=ISymbol>wfsC [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesX.html b/doc/apidocs/search/PropertiesX.html
new file mode 100644
index 0000000..c4c2271
--- /dev/null
+++ b/doc/apidocs/search/PropertiesX.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_x><div class=IEntry><a href="javascript:searchResults.Toggle('SR_x')" class=ISymbol>x</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Point-js.html#OpenLayers.Geometry.Point.x" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</a><a href="../files/OpenLayers/BaseTypes/Pixel-js.html#OpenLayers.Pi [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesY.html b/doc/apidocs/search/PropertiesY.html
new file mode 100644
index 0000000..1ba286d
--- /dev/null
+++ b/doc/apidocs/search/PropertiesY.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_y><div class=IEntry><a href="javascript:searchResults.Toggle('SR_y')" class=ISymbol>y</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Point-js.html#OpenLayers.Geometry.Point.y" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</a><a href="../files/OpenLayers/BaseTypes/Pixel-js.html#OpenLayers.Pi [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/search/PropertiesZ.html b/doc/apidocs/search/PropertiesZ.html
new file mode 100644
index 0000000..b5325be
--- /dev/null
+++ b/doc/apidocs/search/PropertiesZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_zIndex><div class=IEntry><a href="../files/OpenLayers/Symbolizer-js.html#OpenLayers.Symbolizer.zIndex" target=_parent class=ISymbol>zIndex</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Symbolizer</span></div></div><div class=SRResult id=SR_zoomBoxEnabled><div class=IEntry><a href="../files/OpenLayers/Control/Navigation-js.html#OpenLayers.Control. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/apidocs/styles/1.css b/doc/apidocs/styles/1.css
new file mode 100644
index 0000000..9ea166f
--- /dev/null
+++ b/doc/apidocs/styles/1.css
@@ -0,0 +1,759 @@
+/*
+   IMPORTANT: If you're editing this file in the output directory of one of
+   your projects, your changes will be overwritten the next time you run
+   Natural Docs.  Instead, copy this file to your project directory, make your
+   changes, and you can use it with -s.  Even better would be to make a CSS
+   file in your project directory with only your changes, which you can then
+   use with -s [original style] [your changes].
+
+   On the other hand, if you're editing this file in the Natural Docs styles
+   directory, the changes will automatically be applied to all your projects
+   that use this style the next time Natural Docs is run on them.
+
+   This file is part of Natural Docs, which is Copyright (C) 2003-2005 Greg Valure
+   Natural Docs is licensed under the GPL
+*/
+
+body {
+    font: 10pt Verdana, Arial, sans-serif;
+    color: #000000;
+    margin: 0; padding: 0;
+    }
+
+.ContentPage,
+.IndexPage,
+.FramedMenuPage {
+    background-color: #E8E8E8;
+    }
+.FramedContentPage,
+.FramedIndexPage,
+.FramedSearchResultsPage,
+.PopupSearchResultsPage {
+    background-color: #FFFFFF;
+    }
+
+
+a:link,
+a:visited { color: #900000; text-decoration: none }
+a:hover { color: #900000; text-decoration: underline }
+a:active { color: #FF0000; text-decoration: underline }
+
+td {
+    vertical-align: top }
+
+img { border: 0;  }
+
+
+/*
+    Comment out this line to use web-style paragraphs (blank line between
+    paragraphs, no indent) instead of print-style paragraphs (no blank line,
+    indented.)
+*/
+p {
+    text-indent: 5ex; margin: 0 }
+
+
+/*  Can't use something like display: none or it won't break.  */
+.HB {
+    font-size: 1px;
+    visibility: hidden;
+    }
+
+/*  Blockquotes are used as containers for things that may need to scroll.  */
+blockquote {
+    padding: 0;
+    margin: 0;
+    overflow: auto;
+    }
+
+
+.Firefox1 blockquote {
+    padding-bottom: .5em;
+    }
+
+/*  Turn off scrolling when printing.  */
+ at media print {
+    blockquote {
+        overflow: visible;
+        }
+    .IE blockquote {
+        width: auto;
+        }
+    }
+
+
+
+#Menu {
+    font-size: 9pt;
+    padding: 10px 0 0 0;
+    }
+.ContentPage #Menu,
+.IndexPage #Menu {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 31ex;
+    overflow: hidden;
+    }
+.ContentPage .Firefox #Menu,
+.IndexPage .Firefox #Menu {
+    width: 27ex;
+    }
+
+
+    .MTitle {
+        font-size: 16pt; font-weight: bold; font-variant: small-caps;
+        text-align: center;
+        padding: 5px 10px 15px 10px;
+        border-bottom: 1px dotted #000000;
+        margin-bottom: 15px }
+
+    .MSubTitle {
+        font-size: 9pt; font-weight: normal; font-variant: normal;
+        margin-top: 1ex; margin-bottom: 5px }
+
+
+    .MEntry a:link,
+    .MEntry a:hover,
+    .MEntry a:visited { color: #606060; margin-right: 0 }
+    .MEntry a:active { color: #A00000; margin-right: 0 }
+
+
+    .MGroup {
+        font-variant: small-caps; font-weight: bold;
+        margin: 1em 0 1em 10px;
+        }
+
+    .MGroupContent {
+        font-variant: normal; font-weight: normal }
+
+    .MGroup a:link,
+    .MGroup a:hover,
+    .MGroup a:visited { color: #545454; margin-right: 10px }
+    .MGroup a:active { color: #A00000; margin-right: 10px }
+
+
+    .MFile,
+    .MText,
+    .MLink,
+    .MIndex {
+        padding: 1px 17px 2px 10px;
+        margin: .25em 0 .25em 0;
+        }
+
+    .MText {
+        font-size: 8pt; font-style: italic }
+
+    .MLink {
+        font-style: italic }
+
+    #MSelected {
+        color: #000000; background-color: #FFFFFF;
+        /*  Replace padding with border.  */
+        padding: 0 10px 0 10px;
+        border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000;
+        margin-right: 5px;
+        }
+
+    /*  Close off the left side when its in a group.  */
+    .MGroup #MSelected {
+        padding-left: 9px; border-left-width: 1px }
+
+    /*  A treat for Mozilla users.  Blatantly non-standard.  Will be replaced with CSS 3 attributes when finalized/supported.  */
+    .Firefox #MSelected {
+        -moz-border-radius-topright: 10px;
+        -moz-border-radius-bottomright: 10px }
+    .Firefox .MGroup #MSelected {
+        -moz-border-radius-topleft: 10px;
+        -moz-border-radius-bottomleft: 10px }
+
+
+    #MSearchPanel {
+        padding: 0px 6px;
+        margin: .25em 0;
+        }
+
+
+    #MSearchField {
+        font: italic 9pt Verdana, sans-serif;
+        color: #606060;
+        background-color: #E8E8E8;
+        border: none;
+        padding: 2px 4px;
+        width: 100%;
+        }
+    /* Only Opera gets it right. */
+    .Firefox #MSearchField,
+    .IE #MSearchField,
+    .Safari #MSearchField {
+        width: 94%;
+        }
+    .Opera9 #MSearchField,
+    .Konqueror #MSearchField {
+        width: 97%;
+        }
+    .FramedMenuPage .Firefox #MSearchField,
+    .FramedMenuPage .Safari #MSearchField,
+    .FramedMenuPage .Konqueror #MSearchField {
+        width: 98%;
+        }
+
+    /* Firefox doesn't do this right in frames without #MSearchPanel added on.
+        It's presence doesn't hurt anything other browsers. */
+    #MSearchPanel.MSearchPanelInactive:hover #MSearchField {
+        background-color: #FFFFFF;
+        border: 1px solid #C0C0C0;
+        padding: 1px 3px;
+        }
+    .MSearchPanelActive #MSearchField {
+        background-color: #FFFFFF;
+        border: 1px solid #C0C0C0;
+        font-style: normal;
+        padding: 1px 3px;
+        }
+
+    #MSearchType {
+        visibility: hidden;
+        font: 8pt Verdana, sans-serif;
+        width: 98%;
+        padding: 0;
+        border: 1px solid #C0C0C0;
+        }
+    .MSearchPanelActive #MSearchType,
+    /*  As mentioned above, Firefox doesn't do this right in frames without #MSearchPanel added on. */
+    #MSearchPanel.MSearchPanelInactive:hover #MSearchType,
+    #MSearchType:focus {
+        visibility: visible;
+        color: #606060;
+        }
+    #MSearchType option#MSearchEverything {
+        font-weight: bold;
+        }
+
+    .Opera8 .MSearchPanelInactive:hover,
+    .Opera8 .MSearchPanelActive {
+        margin-left: -1px;
+        }
+
+
+    iframe#MSearchResults {
+        width: 60ex;
+        height: 15em;
+        }
+    #MSearchResultsWindow {
+        display: none;
+        position: absolute;
+        left: 0; top: 0;
+        border: 1px solid #000000;
+        background-color: #E8E8E8;
+        }
+    #MSearchResultsWindowClose {
+        font-weight: bold;
+        font-size: 8pt;
+        display: block;
+        padding: 2px 5px;
+        }
+    #MSearchResultsWindowClose:link,
+    #MSearchResultsWindowClose:visited {
+        color: #000000;
+        text-decoration: none;
+        }
+    #MSearchResultsWindowClose:active,
+    #MSearchResultsWindowClose:hover {
+        color: #800000;
+        text-decoration: none;
+        background-color: #F4F4F4;
+        }
+
+
+
+
+#Content {
+    padding-bottom: 15px;
+    }
+
+.ContentPage #Content {
+    border-width: 0 0 1px 1px;
+    border-style: solid;
+    border-color: #000000;
+    background-color: #FFFFFF;
+    font-size: 9pt;  /* To make 31ex match the menu's 31ex. */
+    margin-left: 31ex;
+    }
+.ContentPage .Firefox #Content {
+    margin-left: 27ex;
+    }
+
+
+
+    .CTopic {
+        font-size: 10pt;
+        margin-bottom: 3em;
+        }
+
+
+    .CTitle {
+        font-size: 12pt; font-weight: bold;
+        border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0;
+        margin: 0 15px .5em 15px }
+
+    .CGroup .CTitle {
+        font-size: 16pt; font-variant: small-caps;
+        padding-left: 15px; padding-right: 15px;
+        border-width: 0 0 2px 0; border-color: #000000;
+        margin-left: 0; margin-right: 0 }
+
+    .CClass .CTitle,
+    .CInterface .CTitle,
+    .CDatabase .CTitle,
+    .CDatabaseTable .CTitle,
+    .CSection .CTitle {
+        font-size: 18pt;
+        color: #FFFFFF; background-color: #A0A0A0;
+        padding: 10px 15px 10px 15px;
+        border-width: 2px 0; border-color: #000000;
+        margin-left: 0; margin-right: 0 }
+
+    #MainTopic .CTitle {
+        font-size: 20pt;
+        color: #FFFFFF; background-color: #7070C0;
+        padding: 10px 15px 10px 15px;
+        border-width: 0 0 3px 0; border-color: #000000;
+        margin-left: 0; margin-right: 0 }
+
+    .CBody {
+        margin-left: 15px; margin-right: 15px }
+
+
+    .CToolTip {
+        position: absolute; visibility: hidden;
+        left: 0; top: 0;
+        background-color: #FFFFE0;
+        padding: 5px;
+        border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000;
+        font-size: 8pt;
+        }
+
+    .Opera .CToolTip {
+        max-width: 98%;
+        }
+
+    /*  Scrollbars would be useless.  */
+    .CToolTip blockquote {
+        overflow: hidden;
+        }
+    .IE6 .CToolTip blockquote {
+        overflow: visible;
+        }
+
+    .CHeading {
+        font-weight: bold; font-size: 10pt;
+        margin: 1.5em 0 .5em 0;
+        }
+
+    .CBody pre {
+        font: 10pt "Courier New", Courier, monospace;
+        margin: 1em 0;
+        }
+
+    .CBody ul {
+        /*  I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever.
+             Reapply it here as padding.  */
+        padding-left: 15px; padding-right: 15px;
+        margin: .5em 5ex .5em 5ex;
+        }
+
+    .CDescriptionList {
+        margin: .5em 5ex 0 5ex }
+
+        .CDLEntry {
+            font: 10pt "Courier New", Courier, monospace; color: #808080;
+            padding-bottom: .25em;
+            white-space: nowrap }
+
+        .CDLDescription {
+            font-size: 10pt;  /*  For browsers that don't inherit correctly, like Opera 5.  */
+            padding-bottom: .5em; padding-left: 5ex }
+
+
+    .CTopic img {
+        text-align: center;
+        display: block;
+        margin: 1em auto;
+        }
+    .CImageCaption {
+        font-variant: small-caps;
+        font-size: 8pt;
+        color: #808080;
+        text-align: center;
+        position: relative;
+        top: 1em;
+        }
+
+    .CImageLink {
+        color: #808080;
+        font-style: italic;
+        }
+    a.CImageLink:link,
+    a.CImageLink:visited,
+    a.CImageLink:hover { color: #808080 }
+
+
+
+
+
+.Prototype {
+    font: 10pt "Courier New", Courier, monospace;
+    padding: 5px 3ex;
+    border-width: 1px; border-style: solid;
+    margin: 0 5ex 1.5em 5ex;
+    }
+
+    .Prototype td {
+        font-size: 10pt;
+        }
+
+    .PDefaultValue,
+    .PDefaultValuePrefix,
+    .PTypePrefix {
+        color: #8F8F8F;
+        }
+    .PTypePrefix {
+        text-align: right;
+        }
+    .PAfterParameters {
+        vertical-align: bottom;
+        }
+
+    .IE .Prototype table {
+        padding: 0;
+        }
+
+    .CFunction .Prototype {
+        background-color: #F4F4F4; border-color: #D0D0D0 }
+    .CProperty .Prototype {
+        background-color: #F4F4FF; border-color: #C0C0E8 }
+    .CVariable .Prototype {
+        background-color: #FFFFF0; border-color: #E0E0A0 }
+
+    .CDatabaseIndex .Prototype,
+    .CConstant .Prototype {
+        background-color: #D0D0D0; border-color: #000000 }
+    .CType .Prototype,
+    .CClass .Prototype,
+    .CInterface .Prototype {
+        background-color: #FAF0F0; border-color: #E0B0B0;
+        }
+    .CDatabaseTrigger .Prototype,
+    .CEvent .Prototype,
+    .CDelegate .Prototype {
+        background-color: #F0FCF0; border-color: #B8E4B8 }
+
+    .CToolTip .Prototype {
+        margin: 0 0 .5em 0;
+        white-space: nowrap;
+        }
+
+
+
+
+
+.Summary {
+    margin: 1.5em 5ex 0 5ex }
+
+    .STitle {
+        font-size: 12pt; font-weight: bold;
+        margin-bottom: .5em }
+
+
+    .SBorder {
+        background-color: #FFFFF0;
+        padding: 15px;
+        border: 1px solid #C0C060 }
+
+    /* In a frame IE 6 will make them too long unless you set the width to 100%.  Without frames it will be correct without a width
+        or slightly too long (but not enough to scroll) with a width.  This arbitrary weirdness simply astounds me.  IE 7 has the same
+        problem with frames, haven't tested it without.  */
+    .FramedContentPage .IE .SBorder {
+        width: 100% }
+
+    /*  A treat for Mozilla users.  Blatantly non-standard.  Will be replaced with CSS 3 attributes when finalized/supported.  */
+    .Firefox .SBorder {
+        -moz-border-radius: 20px }
+
+
+    .STable {
+        font-size: 9pt; width: 100% }
+
+    .SEntry {
+        width: 30% }
+    .SDescription {
+        width: 70% }
+
+
+    .SMarked {
+        background-color: #F8F8D8 }
+
+    .SDescription { padding-left: 2ex }
+    .SIndent1 .SEntry { padding-left: 1.5ex }   .SIndent1 .SDescription { padding-left: 3.5ex }
+    .SIndent2 .SEntry { padding-left: 3.0ex }   .SIndent2 .SDescription { padding-left: 5.0ex }
+    .SIndent3 .SEntry { padding-left: 4.5ex }   .SIndent3 .SDescription { padding-left: 6.5ex }
+    .SIndent4 .SEntry { padding-left: 6.0ex }   .SIndent4 .SDescription { padding-left: 8.0ex }
+    .SIndent5 .SEntry { padding-left: 7.5ex }   .SIndent5 .SDescription { padding-left: 9.5ex }
+
+    .SDescription a { color: #800000}
+    .SDescription a:active { color: #A00000 }
+
+    .SGroup td {
+        padding-top: .5em; padding-bottom: .25em }
+
+    .SGroup .SEntry {
+        font-weight: bold; font-variant: small-caps }
+
+    .SGroup .SEntry a { color: #800000 }
+    .SGroup .SEntry a:active { color: #F00000 }
+
+
+    .SMain td,
+    .SClass td,
+    .SDatabase td,
+    .SDatabaseTable td,
+    .SSection td {
+        font-size: 10pt;
+        padding-bottom: .25em }
+
+    .SClass td,
+    .SDatabase td,
+    .SDatabaseTable td,
+    .SSection td {
+        padding-top: 1em }
+
+    .SMain .SEntry,
+    .SClass .SEntry,
+    .SDatabase .SEntry,
+    .SDatabaseTable .SEntry,
+    .SSection .SEntry {
+        font-weight: bold;
+        }
+
+    .SMain .SEntry a,
+    .SClass .SEntry a,
+    .SDatabase .SEntry a,
+    .SDatabaseTable .SEntry a,
+    .SSection .SEntry a { color: #000000 }
+
+    .SMain .SEntry a:active,
+    .SClass .SEntry a:active,
+    .SDatabase .SEntry a:active,
+    .SDatabaseTable .SEntry a:active,
+    .SSection .SEntry a:active { color: #A00000 }
+
+
+
+
+
+.ClassHierarchy {
+    margin: 0 15px 1em 15px }
+
+    .CHEntry {
+        border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0;
+        margin-bottom: 3px;
+        padding: 2px 2ex;
+        font-size: 10pt;
+        background-color: #F4F4F4; color: #606060;
+        }
+
+    .Firefox .CHEntry {
+        -moz-border-radius: 4px;
+        }
+
+    .CHCurrent .CHEntry {
+        font-weight: bold;
+        border-color: #000000;
+        color: #000000;
+        }
+
+    .CHChildNote .CHEntry {
+        font-style: italic;
+        font-size: 8pt;
+        }
+
+    .CHIndent {
+        margin-left: 3ex;
+        }
+
+    .CHEntry a:link,
+    .CHEntry a:visited,
+    .CHEntry a:hover {
+        color: #606060;
+        }
+    .CHEntry a:active {
+        color: #800000;
+        }
+
+
+
+
+
+#Index {
+    background-color: #FFFFFF;
+    }
+
+/*  As opposed to .PopupSearchResultsPage #Index  */
+.IndexPage #Index,
+.FramedIndexPage #Index,
+.FramedSearchResultsPage #Index {
+    padding: 15px;
+    }
+
+.IndexPage #Index {
+    border-width: 0 0 1px 1px;
+    border-style: solid;
+    border-color: #000000;
+    font-size: 9pt;  /* To make 27ex match the menu's 27ex. */
+    margin-left: 27ex;
+    }
+
+
+    .IPageTitle {
+        font-size: 20pt; font-weight: bold;
+        color: #FFFFFF; background-color: #7070C0;
+        padding: 10px 15px 10px 15px;
+        border-width: 0 0 3px 0; border-color: #000000; border-style: solid;
+        margin: -15px -15px 0 -15px }
+
+    .FramedSearchResultsPage .IPageTitle {
+        margin-bottom: 15px;
+        }
+
+    .INavigationBar {
+        font-size: 10pt;
+        text-align: center;
+        background-color: #FFFFF0;
+        padding: 5px;
+        border-bottom: solid 1px black;
+        margin: 0 -15px 15px -15px;
+        }
+
+    .INavigationBar a {
+        font-weight: bold }
+
+    .IHeading {
+        font-size: 16pt; font-weight: bold;
+        padding: 2.5em 0 .5em 0;
+        text-align: center;
+        width: 3.5ex;
+        }
+    #IFirstHeading {
+        padding-top: 0;
+        }
+
+    .IEntry {
+        font-size: 10pt;
+        padding-left: 1ex;
+        }
+    .PopupSearchResultsPage .IEntry {
+        font-size: 8pt;
+        padding: 1px 5px;
+        }
+    .PopupSearchResultsPage .Opera9 .IEntry,
+    .FramedSearchResultsPage .Opera9 .IEntry {
+        text-align: left;
+        }
+    .FramedSearchResultsPage .IEntry {
+        padding: 0;
+        }
+
+    .ISubIndex {
+        padding-left: 3ex; padding-bottom: .5em }
+    .PopupSearchResultsPage .ISubIndex {
+        display: none;
+        }
+
+    /*  While it may cause some entries to look like links when they aren't, I found it's much easier to read the
+         index if everything's the same color.  */
+    .ISymbol {
+        font-weight: bold; color: #900000  }
+
+    .IndexPage .ISymbolPrefix,
+    .FramedIndexPage .ISymbolPrefix {
+        font-size: 10pt;
+        text-align: right;
+        color: #C47C7C;
+        background-color: #F8F8F8;
+        border-right: 3px solid #E0E0E0;
+        border-left: 1px solid #E0E0E0;
+        padding: 0 1px 0 2px;
+        }
+    .PopupSearchResultsPage .ISymbolPrefix,
+    .FramedSearchResultsPage .ISymbolPrefix {
+        color: #900000;
+        }
+    .PopupSearchResultsPage .ISymbolPrefix {
+        font-size: 8pt;
+        }
+
+    .IndexPage #IFirstSymbolPrefix,
+    .FramedIndexPage #IFirstSymbolPrefix {
+        border-top: 1px solid #E0E0E0;
+        }
+    .IndexPage #ILastSymbolPrefix,
+    .FramedIndexPage #ILastSymbolPrefix {
+        border-bottom: 1px solid #E0E0E0;
+        }
+    .IndexPage #IOnlySymbolPrefix,
+    .FramedIndexPage #IOnlySymbolPrefix {
+        border-top: 1px solid #E0E0E0;
+        border-bottom: 1px solid #E0E0E0;
+        }
+
+    a.IParent,
+    a.IFile {
+        display: block;
+        }
+
+    .PopupSearchResultsPage .SRStatus {
+        padding: 2px 5px;
+        font-size: 8pt;
+        font-style: italic;
+        }
+    .FramedSearchResultsPage .SRStatus {
+        font-size: 10pt;
+        font-style: italic;
+        }
+
+    .SRResult {
+        display: none;
+        }
+
+
+
+#Footer {
+    font-size: 8pt;
+    color: #989898;
+    text-align: right;
+    }
+
+#Footer p {
+    text-indent: 0;
+    margin-bottom: .5em;
+    }
+
+.ContentPage #Footer,
+.IndexPage #Footer {
+    text-align: right;
+    margin: 2px;
+    }
+
+.FramedMenuPage #Footer {
+    text-align: center;
+    margin: 5em 10px 10px 10px;
+    padding-top: 1em;
+    border-top: 1px solid #C8C8C8;
+    }
+
+    #Footer a:link,
+    #Footer a:hover,
+    #Footer a:visited { color: #989898 }
+    #Footer a:active { color: #A00000 }
+
diff --git a/doc/apidocs/styles/2.css b/doc/apidocs/styles/2.css
new file mode 100644
index 0000000..a397119
--- /dev/null
+++ b/doc/apidocs/styles/2.css
@@ -0,0 +1,20 @@
+p {
+    text-indent: 0; margin-bottom: 1em;
+}
+
+.MGroup {
+    font-variant: normal;
+    margin: 0.4em 0 0em 10px
+}
+
+.MTitle {
+    font-variant: normal;
+}
+
+.CGroup .CTitle {
+    font-variant: normal;
+}
+
+.SGroup .SEntry {
+    font-variant: normal;
+}
\ No newline at end of file
diff --git a/doc/apidocs/styles/main.css b/doc/apidocs/styles/main.css
new file mode 100644
index 0000000..a672a94
--- /dev/null
+++ b/doc/apidocs/styles/main.css
@@ -0,0 +1,2 @@
+ at import URL("1.css");
+ at import URL("2.css");
diff --git a/doc/authors.txt b/doc/authors.txt
new file mode 100644
index 0000000..45206fd
--- /dev/null
+++ b/doc/authors.txt
@@ -0,0 +1,50 @@
+OpenLayers contributors:
+
+Mike Adair
+Jeff Adams
+Seb Benthall
+Howard Butler
+Bertil Chaupis                                                               
+John Cole
+Tim Coulter
+Robert Coup
+Jeff Dege
+Roald de Wit
+Schuyler Erle
+Christian López Espínola
+John Frank
+Sean Gilles
+Pierre Giraud
+Andreas Hocevar
+Ian Johnson
+Eric Lemoine
+Philip Lindsay
+Martijn van Oosterhout
+David Overstrom
+Corey Puffault
+Peter William Robins
+Gregers Rygg
+Tim Schaub
+Christopher Schmidt
+Cameron Shorter                                                              
+Pedro Simonetti
+Paul Spencer                                                                 
+Paul Smith                                                                 
+Glen Stampoultzis
+James Stembridge
+Erik Uzureau
+Bart van den Eijnden
+Ivan Willig
+Thomas Wood
+Bill Woodall
+Steve Woodbridge
+David Zwarg
+
+Some portions of OpenLayers are used under the Apache 2.0 license, available
+in doc/licenses/APACHE-2.0.txt.
+
+Some portions of OpenLayers are used under the MIT license, availabie in 
+doc/licenses/MIT-LICENSE.txt.
+
+Some portions of OpenLayers are Copyright 2001 Robert Penner, and are used 
+under the BSD license, available in doc/licenses/BSD-LICENSE.txt
diff --git a/doc/customization b/doc/customization
new file mode 100644
index 0000000..f4b5b98
--- /dev/null
+++ b/doc/customization
@@ -0,0 +1,49 @@
+Customizing OpenLayers
+======================
+
+OpenLayers is designed to fit many needs -- fitting in alongside all kinds of
+various applications which are currently in use. 
+
+Currently, OpenLayers supports a 'theme' option when creating a map. This 
+theme option allows you to specify the location of a CSS theme which should
+be included.
+
+A default theme is available as an example in the theme/ directory: the setup
+is:
+
+ * theme/
+ * theme/default/
+ * theme/default/style.css
+ * theme/default/img/
+
+Currently, the OpenLayers code does not support class names, and therefore,
+it is not possible to control many aspects of OpenLayers code with CSS 
+classes. However, with this framework in place, we expect to invest time 
+to make existing features and new features use the CSS theming framework
+where apropriate. 
+
+
+Class Naming
+============
+Elements should have class names which are descriptive of the Javascript
+class from which they come. For example, the main layer switcher element
+in the OpenLayers.Control.LayerSwitcher would be classed:
+
+  olControlLayerSwitcher
+
+This would allow users to add to their style.css class in their theme,
+changing, for example: 
+
+::
+  
+  .olControlLayerSwitcher input {
+    width:10px;
+  }
+
+Sub elements of a particular control can add to the class name:
+
+::
+
+  .olControlLayerSwitcherBaseLabel {
+      color: red;
+  }
diff --git a/doc/devdocs/files/OpenLayers-js.html b/doc/devdocs/files/OpenLayers-js.html
new file mode 100644
index 0000000..88fdd68
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers"></a>OpenLayers</h1><div class=CBody><p>The OpenLayers object provides a namespace for all things OpenLayers</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers" >OpenLayers</a></td><td class=SDescription>The OpenLayers object provi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers._scriptName"></a>_scriptName</h3><div class=CBody><p>{String} Relative path of this script.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers._getScriptLocation"></a>_getScriptLocation</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>_getScriptLocation: function ()</td></tr></table></blockquote><p>Return the path to this script.</p><h4 class=CHeading>Returns</h4><p>{String} Path to this script</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.VERSION_NUMBER"></a>VERSION_NUMBER</h3></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile id=MSelected>OpenLayers</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=MEntry><div class=MFile> [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>_getScriptLocation: function ()</td></tr></table></blockquote>Return the path to this script.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Ajax-js.html b/doc/devdocs/files/OpenLayers/Ajax-js.html
new file mode 100644
index 0000000..67bb0a0
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Ajax-js.html
@@ -0,0 +1,141 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Ajax.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="Ajax.js"></a>Ajax.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#Ajax.js" >Ajax.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.nullHandler"></a>OpenLayers.<span class=HB> </span>nullHandler</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.nullHandler = function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>@ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.loadURL"></a>OpenLayers.<span class=HB> </span>loadURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.loadURL = function(</td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>params,</td></tr><tr><td></td><td class=PParameter nowrap [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.parseXMLString"></a>OpenLayers.<span class=HB> </span>parseXMLString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.parseXMLString = function(</td><td class=PParameter nowrap>text</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax"></a>OpenLayers.Ajax</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Ajax.Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEntry><a href="#OpenLayers.Ajax.emptyFunction" [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.emptyFunction"></a>emptyFunction</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>emptyFunction: function ()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.getTransport"></a>getTransport</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getTransport: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} Transport mechanism for whichever browser we’re in, or false if none available.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.activeRequestCount"></a>activeRequestCount</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax.Responders"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Responders</h2><div class=CBody><p>{Object}</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Ajax.Responders.Properties" >Properties</a></td><td class=SDescription></td></tr> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Responders.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Responders.responders"></a>responders</h3><div class=CBody><p>{Array}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Responders.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Responders.register"></a>register</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>register: function(</td><td class=PParameter nowrap>responderToAdd</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Responders.unregister"></a>unregister</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unregister: function(</td><td class=PParameter nowrap>responderToRemove</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Paramete [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Responders.dispatch"></a>dispatch</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dispatch: function(</td><td class=PParameter nowrap>callback,</td></tr><tr><td></td><td class=PParameter nowrap>request,</td></tr><tr><td></td><td class=PParameter nowrap>transport</td><td cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Responders.onCreate"></a>onCreate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onCreate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Responders.onComplete"></a>onComplete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onComplete: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax.Base"></a>OpenLayers.<span class=HB> </span>Ajax.Base</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Ajax.Base.Constructor" >Constructor</a></td><td class=SDescription></td></tr><tr class="SConstructor SIndent1 SMarked"><td class=SE [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Base.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Base.OpenLayers.Ajax.Base"></a>OpenLayers.<span class=HB> </span>Ajax.Base</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax.Request"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Request</h2><div class=CBody><p><b>Deprecated</b>.   Use <a href="Request-js.html#OpenLayers.Request" class=LClass id=link41 onMouseOver="ShowTip(event, 'tt22', 'link41')" onMouseOut="HideTip('tt22')">OpenLayers.Request</a> method instead.</p><h4 class=CHeading>Inherit</h4><ul><li><a href="#OpenLayers.Ajax.Base" class=LClass >Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request._complete"></a>_complete</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.OpenLayers.Ajax.Request"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Request</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.request"></a>request</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>request: function(</td><td class=PParameter nowrap>url</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.onStateChange"></a>onStateChange</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onStateChange: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.setRequestHeaders"></a>setRequestHeaders</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setRequestHeaders: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.success"></a>success</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>success: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} -</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.getStatus"></a>getStatus</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getStatus: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Integer}</td><td class=CDLDescription>Status</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.respondToReadyState"></a>respondToReadyState</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>respondToReadyState: function(</td><td class=PParameter nowrap>readyState</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.getHeader"></a>getHeader</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getHeader: function(</td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table borde [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.dispatchException"></a>dispatchException</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dispatchException: function(</td><td class=PParameter nowrap>exception</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>If the optiona [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Request.Events"></a>Events</h3><div class=CBody><p>{Array(String)}</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Ajax.Response"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Response</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Ajax.Response.Properties" >Properties</a></td><td class=SDescription></td></tr><tr class="SProperty  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.status"></a>status</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.statusText"></a>statusText</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.OpenLayers.Ajax.Response"></a>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Response</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>request</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.getStatus"></a>getStatus</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.getStatustext"></a>getStatustext</h3><div class=CBody><h4 class=CHeading>Returns</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{String}</td><td class=CDLDescription>statusText</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.getHeader"></a>getHeader</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.getResponseHeader"></a>getResponseHeader</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getResponseHeader: function(</td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Re [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.getElementsByTagNameNS"></a>getElementsByTagNameNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Ajax.getElementsByTagNameNS = function(</td><td class=PParameter nowrap>parentnode,</td></tr><tr><td></td><td class=PParameter nowrap>nsuri,</td></tr><tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Ajax.Response.serializeXMLToString"></a>serializeXMLToString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Ajax.serializeXMLToString = function(</td><td class=PParameter nowrap>xmldom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bloc [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.nullHandler = function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>@param {} request</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspaci [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/BaseTypes-js.html b/doc/devdocs/files/OpenLayers/BaseTypes-js.html
new file mode 100644
index 0000000..f445b25
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/BaseTypes-js.html
@@ -0,0 +1,122 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers Base Types - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers_Base_Types"></a>OpenLayers Base Types</h1><div class=CBody><p>OpenLayers custom string, number and function functions are described here.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers_Base_Types" >OpenLayers Base Types</a></td> [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.String"></a>OpenLayers.<span class=HB> </span>String</h2><div class=CBody><p>Contains convenience functions for string manipulation.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.String.Functions" >Functions</a></td><td class=SDescription></td></tr><tr c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.startsWith"></a>startsWith</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>startsWith: function(</td><td class=PParameter nowrap>str,</td></tr><tr><td></td><td class=PParameter nowrap>sub</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockq [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.contains"></a>contains</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>contains: function(</td><td class=PParameter nowrap>str,</td></tr><tr><td></td><td class=PParameter nowrap>sub</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.trim"></a>trim</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>trim: function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Removes leading and trailing whitespace characters from a string. [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.camelize"></a>camelize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>camelize: function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Camel-case a hyphenated string.  Ex.  &ldqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.format"></a>format</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>format: function(</td><td class=PParameter nowrap>template,</td></tr><tr><td></td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>args</td><td class=PAfterParameters [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.OpenLayers.String.tokenRegEx"></a>OpenLayers.<span class=HB> </span>String.<span class=HB> </span>tokenRegEx</h3><div class=CBody><p>Used to find tokens in a string.  Examples: ${a}, ${a.b.c}, ${a-b}, ${5}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.OpenLayers.String.numberRegEx"></a>OpenLayers.<span class=HB> </span>String.<span class=HB> </span>numberRegEx</h3><div class=CBody><p>Used to test strings as numbers.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.OpenLayers.String.isNumeric"></a>OpenLayers.<span class=HB> </span>String.<span class=HB> </span>isNumeric</h3><div class=CBody><p>Determine whether a string contains only a numeric value.</p><h4 class=CHeading>Examples</h4><blockquote><pre>OpenLayers.String.isNumeric("6.02e23") // true
+OpenLayers.String.isNumeric("12 dozen") // false
+OpenLayers.String.isNumeric("4") // true
+OpenLayers.String.isNumeric(" 4 ") // false</pre></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} String contains only a number.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.numericIf"></a>numericIf</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>numericIf: function(</td><td class=PParameter nowrap>value</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Converts a string that appears to be a numeric v [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.String.startsWith"></a>String.<span class=HB> </span>startsWith</h3><div class=CBody><p><b>Deprecated</b>.  Whether or not a string starts with another string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>sStart</td><td class=CDLDescription>{Sring} The string we’re testing for.</td></tr></table><h4 class=CHeading [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.String.contains"></a>String.<span class=HB> </span>contains</h3><div class=CBody><p><b>Deprecated</b>.  Whether or not a string contains another string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>str</td><td class=CDLDescription>{String} The string that we’re testing for.</td></tr></table><h4 class=CHeading>Ret [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.String.trim"></a>String.trim</h3><div class=CBody><p><b>Deprecated</b>.  Removes leading and trailing whitespace characters from a string.</p><h4 class=CHeading>Returns</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{String} A trimmed version of the string</td><td class=CDLDescription>all leading and trailing spaces removed</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.String.String.camelize"></a>String.<span class=HB> </span>camelize</h3><div class=CBody><p><b>Deprecated</b>.  Camel-case a hyphenated string.  Ex.  “chicken-head” becomes “chickenHead”, and “-chicken-head” becomes “ChickenHead”.</p><h4 class=CHeading>Returns</h4><p>{String} The string, camelized</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Number"></a>OpenLayers.<span class=HB> </span>Number</h2><div class=CBody><p>Contains convenience functions for manipulating numbers.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Number.Properties" >Properties</a></td><td class=SDescription></td></tr><t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.decimalSeparator"></a>decimalSeparator</h3><div class=CBody><p>Decimal separator to use when formatting numbers.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.thousandsSeparator"></a>thousandsSeparator</h3><div class=CBody><p>Thousands separator to use when formatting numbers.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.limitSigDigs"></a>limitSigDigs</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>limitSigDigs: function(</td><td class=PParameter nowrap>num,</td></tr><tr><td></td><td class=PParameter nowrap>sig</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.format"></a>format</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>format: function(</td><td class=PParameter nowrap>num,</td></tr><tr><td></td><td class=PParameter nowrap>dec,</td></tr><tr><td></td><td class=PParameter nowrap>tsep,</td></tr><tr><td></td><td class=PParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Number.Number.limitSigDigs"></a>Number.<span class=HB> </span>limitSigDigs</h3><div class=CBody><p><b>Deprecated</b>.  Limit the number of significant digits on an integer.  Does <b>not</b> work with floats!</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>sig</td><td class=CDLDescription>{Integer}</td></tr></table><h4 class [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Function"></a>OpenLayers.<span class=HB> </span>Function</h2><div class=CBody><p>Contains convenience functions for function manipulation.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Function.Functions" >Functions</a></td><td class=SDescription></td></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.bind"></a>bind</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bind: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Bind [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.bindAsEventListener"></a>bindAsEventListener</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>bindAsEventListener: function(</td><td class=PParameter nowrap>func,</td></tr><tr><td></td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.False"></a>False</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>False : function()</td></tr></table></blockquote><p>A simple function to that just does “return false”.  We use this to avoid attaching anonymous functions to DOM event handlers, which causes “issues” on IE<8.</p><h4 class=CHeading>Usage</h4><p>document.o [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.True"></a>True</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>True : function()</td></tr></table></blockquote><p>A simple function to that just does “return true”.  We use this to avoid attaching anonymous functions to DOM event handlers, which causes “issues” on IE<8.</p><h4 class=CHeading>Usage</h4><p>document.oncli [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.Function.bind"></a>Function.bind</h3><div class=CBody><p><b>Deprecated</b>.  Bind a function to an object.  Method to easily create closures with ‘this’ altered.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} the this parameter</td></tr></table><h4 class=CHe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Function.Function.bindAsEventListener"></a>Function.<span class=HB> </span>bindAsEventListener</h3><div class=CBody><p><b>Deprecated</b>.  Bind a function to an object, and configure it to receive the event object as first parameter when called.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription> [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Array"></a>OpenLayers.<span class=HB> </span>Array</h2><div class=CBody><p>Contains convenience functions for array manipulation.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Array.Functions" >Functions</a></td><td class=SDescription></td></tr><tr class [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Array.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Array.filter"></a>filter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>filter: function(</td><td class=PParameter nowrap>array,</td></tr><tr><td></td><td class=PParameter nowrap>callback,</td></tr><tr><td></td><td class=PParameter nowrap>caller</td><td class=PAfterParameters  [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Date"></a>OpenLayers.Date</h2><div class=CBody><p>Contains implementations of Date.parse and date.toISOString that match the ECMAScript 5 specification for parsing RFC 3339 dates.  <a href="http://tools.ietf.org/html/rfc3339" class=LURL target=_top>http://tools.ietf.org/html/rfc3339</a></p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Date.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Date.toISOString"></a>toISOString</h3><div class=CBody><p>Generates a string representing a date.   The format of the string follows the profile of ISO 8601 for date and time on the Internet <img mode="link" target="
url target=”http://tools.ietf.org/html/rfc3339” name=”http://tools.ietf.org/html/rfc3339”>” original=”(see <url target=”http://tools.ietf.org/html/rfc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Date.parse"></a>parse</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parse: function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Generate a date object from a string.   The format for the  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>startsWith: function(</td><td class=PParameter nowrap>str,</td></tr><tr><td></td><td class=PParameter nowrap>sub</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Test whether a string starts with another string.</div></div><div class=CToolT [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/BaseTypes/Bounds-js.html b/doc/devdocs/files/OpenLayers/BaseTypes/Bounds-js.html
new file mode 100644
index 0000000..57cf45c
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/BaseTypes/Bounds-js.html
@@ -0,0 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Bounds - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Bounds"></a>OpenLayers.<span class=HB> </span>Bounds</h1><div class=CBody><p>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.</p><h4 class=CHeading>Possible use case</h4><blockquote><pre>bounds = new OpenLayer [...]
+bounds.extend(new OpenLayers.LonLat(4,5));
+bounds.extend(new OpenLayers.LonLat(5,6));
+bounds.toBBOX(); // returns 4,5,5,6</pre></blockquote><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Bounds" >OpenLayers.<span class=HB> </span>Bounds</a></td><td class=SDescription>Instances of this class represent bounding boxes. </td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#OpenLayers.Bounds.Properties" >Proper [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.left"></a>left</h3><div class=CBody><p>{Number} Minimum horizontal coordinate.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.bottom"></a>bottom</h3><div class=CBody><p>{Number} Minimum vertical coordinate.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.right"></a>right</h3><div class=CBody><p>{Number} Maximum horizontal coordinate.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.top"></a>top</h3><div class=CBody><p>{Number} Maximum vertical coordinate.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.centerLonLat"></a>centerLonLat</h3><div class=CBody><p>{<a href="LonLat-js.html#OpenLayers.LonLat" class=LClass id=link31 onMouseOver="ShowTip(event, 'tt1', 'link31')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a>} A cached center location.   This should not be accessed directly.   Use <a href="#OpenLayers.Bounds.getCenterLonLat" class=LFunction id=link32 onMouseOver="ShowTip(event, 'tt14', [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.OpenLayers.Bounds"></a>OpenLayers.<span class=HB> </span>Bounds</h3><div class=CBody><p>Construct a new bounds object.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>left</td><td class=CDLDescription>{Number} The left bounds of the box.   Note that for width calculations, this is assumed to be less than the right valu [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote><p>Create a cloned instance of this bounds.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Bounds.OpenLayers.Bounds" class=LConstructor id=link33 onMouseOver="ShowTip(event, 'tt30', 'link33')" onMouseOut="HideTip('tt30')">OpenLaye [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test a two bounds for equivalence.</p><h4 class=CHeading> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.toString"></a>toString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String representation of bounds object.  (ex.<i>”left-bottom=(5,42) right-top=(10,45)”</i>)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.toArray"></a>toArray</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toArray: function(</td><td class=PParameter nowrap>reverseAxisOrder</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table borde [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.toBBOX"></a>toBBOX</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toBBOX:function(</td><td class=PParameter nowrap>decimal,</td></tr><tr><td></td><td class=PParameter nowrap>reverseAxisOrder</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.toGeometry"></a>toGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toGeometry: function()</td></tr></table></blockquote><p>Create a new polygon geometry based on this bounds.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Geometry/Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id=link35 onMouseOver="ShowTip(event, 'tt31', 'link35' [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getWidth"></a>getWidth</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWidth:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The width of the bounds</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getHeight"></a>getHeight</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getHeight:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The height of the bounds (top minus bottom).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getSize"></a>getSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getSize:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="Size-js.html#OpenLayers.Size" class=LClass id=link36 onMouseOver="ShowTip(event, 'tt11', 'link36')" onMouseOut="HideTip('tt11')">OpenLayers.Size</a>} The size of the box.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getCenterPixel"></a>getCenterPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCenterPixel:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="Pixel-js.html#OpenLayers.Pixel" class=LClass id=link37 onMouseOver="ShowTip(event, 'tt13', 'link37')" onMouseOut="HideTip('tt13')">OpenLayers.Pixel</a>} The center of the  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.getCenterLonLat"></a>getCenterLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCenterLonLat:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="LonLat-js.html#OpenLayers.LonLat" class=LClass id=link38 onMouseOver="ShowTip(event, 'tt1', 'link38')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a>} The center of  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.scale"></a>scale</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>scale: function(</td><td class=PParameter nowrap>ratio,</td></tr><tr><td></td><td class=PParameter nowrap>origin</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.add"></a>add</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>add:function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Pa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.extend"></a>extend</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extend:function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Extend the bounds to include the point, lonlat, or bounds [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.containsLonLat"></a>containsLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>containsLonLat:function(</td><td class=PParameter nowrap>ll,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.containsPixel"></a>containsPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>containsPixel:function(</td><td class=PParameter nowrap>px,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.contains"></a>contains</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>contains:function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td><td class=PAfterParameters no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.intersectsBounds"></a>intersectsBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersectsBounds:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td><td class=PAfterParameters nowrap>)</td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.containsBounds"></a>containsBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>containsBounds:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>partial,</td></tr><tr><td></td><td class=PParameter nowrap>inclusive</td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.determineQuadrant"></a>determineQuadrant</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>determineQuadrant: function(</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>wrapDateLine: function(</td><td class=PParameter nowrap>maxExtent,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.fromString"></a>fromString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Bounds.fromString = function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Alternative constructor that [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.fromArray"></a>fromArray</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Bounds.fromArray = function(</td><td class=PParameter nowrap>bbox</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Alternative constructor that b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.fromSize"></a>fromSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Bounds.fromSize = function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Alternative constructor that buil [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Bounds.oppositeQuadrant"></a>oppositeQuadrant</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Bounds.oppositeQuadrant = function(</td><td class=PParameter nowrap>quadrant</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote>Create a cloned instance of this bounds.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspa [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/BaseTypes/Class-js.html b/doc/devdocs/files/OpenLayers/BaseTypes/Class-js.html
new file mode 100644
index 0000000..800503b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/BaseTypes/Class-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Class.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="Class.js"></a>Class.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#Class.js" >Class.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Constructor" >Constructor</a></td><td class=SDescriptio [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Class"></a>OpenLayers.<span class=HB> </span>Class</h3><div class=CBody><p>Base class used to construct all other classes.  Includes support for multiple inheritance.</p><p>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.</p><h4 class=CHeading>To create a new OpenLayers-style class, use the following sy [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="isPrototype"></a>isPrototype</h3><div class=CBody><p><b>Deprecated</b>.   This is no longer needed and will be removed at 3.0.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.create"></a>OpenLayers.<span class=HB> </span>create</h3><div class=CBody><p><b>Deprecated</b>.   Old method to create an OpenLayers style class.   Use the <a href="#OpenLayers.Class" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Class</a> constructor instead.</p><h4 class=CHeading>Returns</h4><p>An OpenLayers class</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="inherit"></a>inherit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Class.inherit = function ()</td></tr></table></blockquote><p><b>Deprecated</b>.   Old method to inherit from one or more OpenLayers style classes.   Use the <a href="#OpenLayers.Class" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt2', 'link3')" onMouseOut="HideTip('tt2 [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Class.inherit = function ()</td></tr></table></blockquote><b>Deprecated</b>. </div></div><div class=CToolTip id="tt2"><div class=CConstructor>Base class used to construct all other classes. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/BaseTypes/Element-js.html b/doc/devdocs/files/OpenLayers/BaseTypes/Element-js.html
new file mode 100644
index 0000000..f95c5b4
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/BaseTypes/Element-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Element - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Element"></a>OpenLayers.<span class=HB> </span>Element</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Element" >OpenLayers.<span class=HB> </span>Element</a></td><td class=SDescription></td></tr><tr class="SGr [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.visible"></a>visible</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>visible: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cell [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.toggle"></a>toggle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toggle: function()</td></tr></table></blockquote><p>Toggle the visibility of element(s) passed in</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement} Actually us [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.hide"></a>hide</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>hide: function()</td></tr></table></blockquote><p>Hide element(s) passed in</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement} Actually user can pass any number of  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.show"></a>show</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote><p>Show element(s) passed in</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement} Actually user can pass any number of  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.remove"></a>remove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>remove: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove the specified element from the DOM.</p><h4 clas [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.getHeight"></a>getHeight</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getHeight: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.getDimensions"></a>getDimensions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getDimensions: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p><b>Deprecated</b>.  Returns  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.hasClass"></a>hasClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>hasClass: function(</td><td class=PParameter nowrap>element,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockq [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.addClass"></a>addClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addClass: function(</td><td class=PParameter nowrap>element,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockq [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.removeClass"></a>removeClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeClass: function(</td><td class=PParameter nowrap>element,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.toggleClass"></a>toggleClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toggleClass: function(</td><td class=PParameter nowrap>element,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Element.getStyle"></a>getStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getStyle: function(</td><td class=PParameter nowrap>element,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>visible: function(</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototyp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/BaseTypes/LonLat-js.html b/doc/devdocs/files/OpenLayers/BaseTypes/LonLat-js.html
new file mode 100644
index 0000000..5d0e900
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/BaseTypes/LonLat-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.LonLat - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.LonLat"></a>OpenLayers.<span class=HB> </span>LonLat</h1><div class=CBody><p>This class represents a longitude and latitude pair</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.LonLat" >OpenLayers.<span class=HB> </span>LonLat</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.lon"></a>lon</h3><div class=CBody><p>{Float} The x-axis coodinate in map units</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.lat"></a>lat</h3><div class=CBody><p>{Float} The y-axis coordinate in map units</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.OpenLayers.LonLat"></a>OpenLayers.<span class=HB> </span>LonLat</h3><div class=CBody><p>Create a new map location.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>lon</td><td class=CDLDescription>{Number} The x-axis coordinate in map units.   If your map is in a geographic projection, this will be the Longitude.   [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.toString"></a>toString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote><p>Return a readable string version of the lonlat</p><h4 class=CHeading>Returns</h4><p>{String} String representation of OpenLayers.LonLat object.  (ex.  <i>”lon=5,lat=42”</i>)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.toShortString"></a>toShortString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toShortString:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} Shortened String representation of OpenLayers.LonLat object.  (ex.  <i>”5, 42”</i>)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.LonLat.OpenLayers.LonLat" class=LConstructor id=link11 onMouseOver="ShowTip(event, 'tt4', 'link11')" onMouseOut="HideTip('tt4')">OpenLayers.LonLat</a>} New OpenLayers.LonLat object with  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.add"></a>add</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>add:function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>ll</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>wrapDateLine: function(</td><td class=PParameter nowrap>maxExtent</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.LonLat.fromString"></a>fromString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.LonLat.fromString = function(</td><td class=PParameter nowrap>str</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Alternative constructor that [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote>Return a readable string version of the lonlat</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toShortString:function()</td></tr></table></blockquote>{String} Shortened String representation of OpenLayers.LonLat object. [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/BaseTypes/Pixel-js.html b/doc/devdocs/files/OpenLayers/BaseTypes/Pixel-js.html
new file mode 100644
index 0000000..1b8d1fa
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/BaseTypes/Pixel-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Pixel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Pixel"></a>OpenLayers.<span class=HB> </span>Pixel</h1><div class=CBody><p>This class represents a screen coordinate, in x and y coordinates</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Pixel" >OpenLayers.<span class=HB> </sp [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.x"></a>x</h3><div class=CBody><p>{Number} The x coordinate</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.y"></a>y</h3><div class=CBody><p>{Number} The y coordinate</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.OpenLayers.Pixel"></a>OpenLayers.<span class=HB> </span>Pixel</h3><div class=CBody><p>Create a new OpenLayers.Pixel instance</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>x</td><td class=CDLDescription>{Number} The x coordinate</td></tr><tr><td class=CDLEntry>y</td><td class=CDLDescription>{Number} The y coordinate</td></t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.toString"></a>toString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote><p>Cast this object into a string</p><h4 class=CHeading>Returns</h4><p>{String} The string representation of Pixel. ex: “x=200.4,y=242.2”</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote><p>Return a clone of this pixel object</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Pixel.OpenLayers.Pixel" class=LConstructor id=link7 onMouseOver="ShowTip(event, 'tt6', 'link7')" onMouseOut="HideTip('tt6')">OpenLayers.Pixel</a> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether one pixel is equivalent to another</p><h4 cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.add"></a>add</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>add:function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Pixel.offset"></a>offset</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>offset:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parameters px - {<a href="#OpenLayers.Pixel.OpenLayers.Pixel"  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote>Cast this object into a string</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote>Return a clone of this pixel object</div></div><div class=CToolTip id="tt3"><div class=CFunct [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/BaseTypes/Size-js.html b/doc/devdocs/files/OpenLayers/BaseTypes/Size-js.html
new file mode 100644
index 0000000..1b9ccbc
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/BaseTypes/Size-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Size - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Size"></a>OpenLayers.Size</h1><div class=CBody><p>Instances of this class represent a width/height pair</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Size" >OpenLayers.Size</a></td><td class=SDescription>Instances of this clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.w"></a>w</h3><div class=CBody><p>{Number} width</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.h"></a>h</h3><div class=CBody><p>{Number} height</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.OpenLayers.Size"></a>OpenLayers.Size</h3><div class=CBody><p>Create an instance of OpenLayers.Size</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>w</td><td class=CDLDescription>{Number} width</td></tr><tr><td class=CDLEntry>h</td><td class=CDLDescription>{Number} height</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.toString"></a>toString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote><p>Return the string representation of a size object</p><h4 class=CHeading>Returns</h4><p>{String} The string representation of OpenLayers.Size object.  (ex.  <i>”w=55,h=66”</i>)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote><p>Create a clone of this size object</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Size.OpenLayers.Size" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Size</a>} A n [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Size.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals:function(</td><td class=PParameter nowrap>sz</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine where this size is equal to another</p><h4 class=CHea [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([1, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString:function()</td></tr></table></blockquote>Return the string representation of a size object</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone:function()</td></tr></table></blockquote>Create a clone of this size object</div></div><div class=CToolTip id="tt3" [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Console-js.html b/doc/devdocs/files/OpenLayers/Console-js.html
new file mode 100644
index 0000000..f4ebf73
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Console-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Console - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Console"></a>OpenLayers.<span class=HB> </span>Console</h1><div class=CBody><p>The OpenLayers.Console namespace is used for debugging and error logging.  If the Firebug Lite (../Firebug/firebug.js) is included before this script, calls to OpenLayers.Console methods will get redirected to window.console.  This makes use of the Firebug extension where available and allows for c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.log"></a>log</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>log: function()</td></tr></table></blockquote><p>Log an object in the console.   The Firebug Lite console logs string representation of objects.   Given multiple arguments, they will be cast to strings and logged with a space delimiter.   If the first argument is a string with [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.debug"></a>debug</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>debug: function()</td></tr></table></blockquote><p>Writes a message to the console, including a hyperlink to the line where it was called.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cell [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.info"></a>info</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>info: function()</td></tr></table></blockquote><p>Writes a message to the console with the visual “info” icon and color coding and a hyperlink to the line where it was called.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeading>Pa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.warn"></a>warn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>warn: function()</td></tr></table></blockquote><p>Writes a message to the console with the visual “warning” icon and color coding and a hyperlink to the line where it was called.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeading [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.error"></a>error</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>error: function()</td></tr></table></blockquote><p>Writes a message to the console with the visual “error” icon and color coding and a hyperlink to the line where it was called.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.userError"></a>userError</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>userError: function(</td><td class=PParameter nowrap>error</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>A single interface for showing error messages t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.assert"></a>assert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>assert: function()</td></tr></table></blockquote><p>Tests that an expression is true.  If not, it will write a message to the console and throw an exception.</p><p>May be called with multiple arguments as with OpenLayers.Console.log().</p><h4 class=CHeading>Parameters</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.dir"></a>dir</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>dir: function()</td></tr></table></blockquote><p>Prints an interactive listing of all properties of the object.  This looks identical to the view that you would see in the DOM tab.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.dirxml"></a>dirxml</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>dirxml: function()</td></tr></table></blockquote><p>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.</p><h4 class=CHeading>Parameters</h4><tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.trace"></a>trace</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trace: function()</td></tr></table></blockquote><p>Prints an interactive stack trace of JavaScript execution at the point where it is called.   The stack trace details the functions on the stack, as well as the values that were passed as arguments to each function.  You can cli [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.group"></a>group</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>group: function()</td></tr></table></blockquote><p>Writes a message to the console and opens a nested block to indent all future messages sent to the console.  Call OpenLayers.Console.groupEnd() to close the block.</p><p>May be called with multiple arguments as with OpenLayers.Conso [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.groupEnd"></a>groupEnd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>groupEnd: function()</td></tr></table></blockquote><p>Closes the most recently opened block created by a call to OpenLayers.Console.group</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.time"></a>time</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>time: function()</td></tr></table></blockquote><p>Creates a new timer under the given name.  Call OpenLayers.Console.timeEnd(name) with the same name to stop the timer and print the time elapsed.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CD [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.timeEnd"></a>timeEnd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>timeEnd: function()</td></tr></table></blockquote><p>Stops a timer created by a call to OpenLayers.Console.time(name) and writes the time elapsed.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.profile"></a>profile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>profile: function()</td></tr></table></blockquote><p>Turns on the JavaScript profiler.  The optional argument title would contain the text to be printed in the header of the profile report.</p><p>This function is not currently implemented in Firebug Lite.</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.profileEnd"></a>profileEnd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>profileEnd: function()</td></tr></table></blockquote><p>Turns off the JavaScript profiler and prints its report.</p><p>This function is not currently implemented in Firebug Lite.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Console.count"></a>count</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>count: function()</td></tr></table></blockquote><p>Writes the number of times that the line of code where count was called was executed.  The optional argument title will print a message in addition to the number of the count.</p><p>This function is not currently implemented in Fire [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>log: function()</td></tr></table></blockquote>Log an object in the console. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>debug: function()</td></tr></table></blockquote>Writes a message to the console, including a hyperlink to the line where it was called.</div></d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control-js.html b/doc/devdocs/files/OpenLayers/Control-js.html
new file mode 100644
index 0000000..987b3a6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control-js.html
@@ -0,0 +1,119 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control"></a>OpenLayers.<span class=HB> </span>Control</h1><div class=CBody><p>Controls affect the display or behavior of the map.  They allow everything 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 param [...]
+
+map.addControl(new OpenLayers.Control.PanZoomBar());
+map.addControl(new OpenLayers.Control.MouseToolbar());
+map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));
+map.addControl(new OpenLayers.Control.Permalink());
+map.addControl(new OpenLayers.Control.Permalink('permalink'));
+map.addControl(new OpenLayers.Control.MousePosition());
+map.addControl(new OpenLayers.Control.OverviewMap());
+map.addControl(new OpenLayers.Control.KeyboardDefaults());</pre></blockquote><p>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 example:</p><blockquote><pre>var control = new OpenLayers.Control();
+OpenLayers.Util.extend(control, {
+    draw: function () {
+        // this Handler.Box will intercept the shift-mousedown
+        // before Control.MouseDefault gets to see it
+        this.box = new OpenLayers.Handler.Box( control,
+            {"done": this.notice},
+            {keyMask: OpenLayers.Handler.MOD_SHIFT});
+        this.box.activate();
+    },
+
+    notice: function (bounds) {
+        OpenLayers.Console.userError(bounds);
+    }
+});
+map.addControl(control);</pre></blockquote><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Control" >OpenLayers.<span class=HB> </span>Control</a></td><td class=SDescription>Controls affect the display or behavior of the map. </td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#OpenLayers.Control.Properties" >Properties</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.id"></a>id</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.map"></a>map</h3><div class=CBody><p>{<a href="Map-js.html#OpenLayers.Map" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt1', 'link10')" onMouseOut="HideTip('tt1')">OpenLayers.Map</a>} this gets set in the addControl() function in OpenLayers.Map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.div"></a>div</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.type"></a>type</h3><div class=CBody><p>{Number} Controls can have a ‘type’.  The type determines the type of interactions which are possible with them when they are placed in an <a href="Control/Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt10', 'link11')" onMouseOut="HideTip('tt10')">OpenLayers.Control.Panel</a>.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.allowSelection"></a>allowSelection</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.displayClass"></a>displayClass</h3><div class=CBody><p>{string}  This property is used for CSS related to the drawing of the Control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.title"></a>title</h3><div class=CBody><p>{string}  This property is used for showing a tooltip over the Control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.active"></a>active</h3><div class=CBody><p>{Boolean} The control is active.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.handler"></a>handler</h3><div class=CBody><p>{<a href="Handler-js.html#OpenLayers.Handler" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt2', 'link12')" onMouseOut="HideTip('tt2')">OpenLayers.Handler</a>} null</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.eventListeners"></a>eventListeners</h3><div class=CBody><p>{Object} If set as an option at construction, the eventListeners object will be registered with <a href="Events-js.html#OpenLayers.Events.on" class=LFunction id=link13 onMouseOver="ShowTip(event, 'tt3', 'link13')" onMouseOut="HideTip('tt3')">OpenLayers.Events.on</a>.   Object structure must be a listeners object as shown in the example for  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} Events instance for triggering control specific events.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.</p><h4 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OpenLayers.Control"></a>OpenLayers.<span class=HB> </span>Control</h3><div class=CBody><p>Create an OpenLayers Control.   The options passed as a parameter directly extend the control.   For example passing the following:</p><blockquote><pre>var control = new OpenLayers.Control({div: myDiv});</pre></blockquote><p>Overrides the default div attribute value of null.</p><h4 class=CHeading>Param [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote><p>The destroy method is used to perform any clean up before the control is dereferenced.   Typically this is where event listeners are removed to prevent memory leaks.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control.  This is done t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function (</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>The draw method is called when the control is ready to be displa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function (</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the left and top style attributes to the passed in pi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function ()</td></tr></table></blockquote><p>Explicitly activates a control and it’s associated handler if one has been set.   Controls can be deactivated by calling the deactivate() method.</p><h4 class=CHeading>Returns</h4><p>{Boolean}  True if the control wa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function ()</td></tr></table></blockquote><p>Deactivates a control and it’s associated handler if any.   The exact effect of this depends on the control itself.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the control was effectively deactivated [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OpenLayers.Control.TYPE_BUTTON"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TYPE_BUTTON</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OpenLayers.Control.TYPE_TOGGLE"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TYPE_TOGGLE</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OpenLayers.Control.TYPE_TOOL"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TYPE_TOOL</h3></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt2"><div class=CClass>Base class to construct a higher-level handler for event sequences. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>on: function(</td><t [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/ArgParser-js.html b/doc/devdocs/files/OpenLayers/Control/ArgParser-js.html
new file mode 100644
index 0000000..94a64f5
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/ArgParser-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ArgParser - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ArgParser"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ArgParser</h1><div class=CBody><p>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.</p><h4 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.displayProjection"></a>displayProjection</h3><div class=CBody><p>{<a href="../Projection-js.html#OpenLayers.Projection" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} Requires proj4js support.  Projection used when reading the coordinates from the URL.  This will</p><p>reproject the map coordinates from the UR [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.OpenLayers.Control.ArgParser"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ArgParser</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control.</p><h4 cla [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.setCenter"></a>setCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setCenter: function()</td></tr></table></blockquote><p>As soon as a baseLayer has been loaded, we center and zoom ...and remove the handler.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ArgParser.configureLayers"></a>configureLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>configureLayers: function()</td></tr></table></blockquote><p>As soon as all the layers are loaded, cycle through them and hide or show them.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Set the map proper [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Attribution-js.html b/doc/devdocs/files/OpenLayers/Control/Attribution-js.html
new file mode 100644
index 0000000..6fff2f7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Attribution-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Attribution - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Attribution"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Attribution</h1><div class=CBody><p>The attribution control adds attribution from layers to the map display.  It uses ‘attribution’ property of each layer.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link4 onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.seperator"></a>seperator</h3><div class=CBody><p>{String} String used to seperate layers.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.OpenLayers.Control.Attribution"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Attribution</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Options for control.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>Initialize control.</p><h4 class=CHeading>Returns</h4><p>{DOMElement} A reference to the DIV DOMElement containing the control</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Attribution.updateAttribution"></a>updateAttribution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateAttribution: function()</td></tr></table></blockquote><p>Update attribution string.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Destroy control.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote>Initialize control.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Button-js.html b/doc/devdocs/files/OpenLayers/Control/Button-js.html
new file mode 100644
index 0000000..dc8bceb
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Button-js.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Button - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Button"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Button</h1><div class=CBody><p>The Button control is a very simple push-button, for use with <a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">OpenLayers.Control.Panel</a>.  When clicked, the function tri [...]
+    displayClass: "MyButton", trigger: myFunction
+});
+panel.addControls([button]);</pre></blockquote><p>Will create a button with CSS class MyButtonItemInactive, that will call the function MyFunction() when clicked.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Control.Button" >OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Button</a></td><td class=SDescription>T [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Button.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Button.type"></a>type</h3><div class=CBody><p>{Integer} OpenLayers.Control.TYPE_BUTTON.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Button.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Button.trigger"></a>trigger</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote><p>Called by a control panel when the button is clicked.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote>Called by a control panel when the button is clicked.</div></div><div class=CToolTip id="tt3"><div class=CClass>Controls affect the display or behavior of the map. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/DragFeature-js.html b/doc/devdocs/files/OpenLayers/Control/DragFeature-js.html
new file mode 100644
index 0000000..e499ea4
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/DragFeature-js.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.DragFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.DragFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DragFeature</h1><div class=CBody><p>The DragFeature control moves a feature with a drag of the mouse.  Create a new control with the <a href="#OpenLayers.Control.DragFeature.OpenLayers.Control.DragFeature" class=LConstructor id=link15 onMouseOver="ShowTip(event, 'tt15', 'link15')" onMouseOut= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Array(String)} To restrict dragging to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.onStart"></a>onStart</h3><div class=CBody><p>{Function} Define this function if you want to know when a drag starts.  The function should expect to receive two arguments: the feature that is about to be dragged and the pixel location of the mouse.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>feature</td><t [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.onDrag"></a>onDrag</h3><div class=CBody><p>{Function} Define this function if you want to know about each move of a feature.  The function should expect to receive two arguments: the feature that is being dragged and the pixel location of the mouse.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>feature</td> [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.onComplete"></a>onComplete</h3><div class=CBody><p>{Function} Define this function if you want to know when a feature is done dragging.  The function should expect to receive two arguments: the feature that is being dragged and the pixel location of the mouse.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>f [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.documentDrag"></a>documentDrag</h3><div class=CBody><p>{Boolean} If set to true, mouse dragging will continue even if the mouse cursor leaves the map viewport.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt1', 'link23')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.feature"></a>feature</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link24 onMouseOver="ShowTip(event, 'tt2', 'link24')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.dragCallbacks"></a>dragCallbacks</h3><div class=CBody><p>{Object} The functions that are sent to the drag handler for callback.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.featureCallbacks"></a>featureCallbacks</h3><div class=CBody><p>{Object} The functions that are sent to the feature handler for callback.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.lastPixel"></a>lastPixel</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt3', 'link25')" onMouseOut="HideTip('tt3')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.OpenLayers.Control.DragFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DragFeature</h3><div class=CBody><p>Create a new control to drag features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Ve [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Take care of things that are not handled in superclass</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control and the feature handler.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Successfully activated the control and feature handler.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control and all handlers.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Successfully deactivated the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.overFeature"></a>overFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>overFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the feature han [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.downFeature"></a>downFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>downFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the drag handler  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.moveFeature"></a>moveFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the drag handler  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.upFeature"></a>upFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>upFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the drag handler detect [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.doneDragging"></a>doneDragging</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>doneDragging: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the drag handl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.outFeature"></a>outFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>outFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the feature handle [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.cancel"></a>cancel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote><p>Called when the drag handler detects a mouse-out (from the map viewport).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragFeature.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control and all h [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/DragPan-js.html b/doc/devdocs/files/OpenLayers/Control/DragPan-js.html
new file mode 100644
index 0000000..b4df032
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/DragPan-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.DragPan - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.DragPan"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DragPan</h1><div class=CBody><p>The DragPan control pans the map with a drag of the mouse.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt4', 'link6')" onMouseOut="HideTip('tt4')">OpenLayers.Control</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.type"></a>type</h3><div class=CBody><p>{OpenLayers.Control.TYPES}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.panned"></a>panned</h3><div class=CBody><p>{Boolean} The map moved.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.interval"></a>interval</h3><div class=CBody><p>{Integer} The number of milliseconds that should ellapse before panning the map again.  Set this to increase dragging performance.  Defaults to 25 milliseconds.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.documentDrag"></a>documentDrag</h3><div class=CBody><p>{Boolean} If set to true, mouse dragging will continue even if the mouse cursor leaves the map viewport.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>Creates a Drag handler, using <a href="#OpenLayers.Control.DragPan.panMap" class=LFunction id=link7 onMouseOver="ShowTip(event, 'tt2', 'link7')" onMouseOut="HideTip('tt2')">panMap</a> and <a href="#OpenLayers.Control.DragPan.panMapD [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.panMap"></a>panMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>panMap: function(</td><td class=PParameter nowrap>xy</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cell [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DragPan.panMapDone"></a>panMapDone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>panMapDone: function(</td><td class=PParameter nowrap>xy</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Finish the panning operation.   On [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote>Creates a Drag handler, using panMap and panMapDone as callbacks.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>panMap: function(</td><td [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/DrawFeature-js.html b/doc/devdocs/files/OpenLayers/Control/DrawFeature-js.html
new file mode 100644
index 0000000..a7ffc85
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/DrawFeature-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.DrawFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.DrawFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DrawFeature</h1><div class=CBody><p>The DrawFeature control draws point, line or polygon features on a vector layer when active.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMous [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.callbacks"></a>callbacks</h3><div class=CBody><p>{Object} The functions that are sent to the handler for callback</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>featureadded</td><td class=CDLDescription>Triggered when a feature is added</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.multi"></a>multi</h3><div class=CBody><p>{Boolean} Cast features to multi-part geometries before passing to the layer.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.featureAdded"></a>featureAdded</h3><div class=CBody><p>{Function} Called after each feature is added</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Used to set non-default properties on the control’s handler</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.OpenLayers.Control.DrawFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>DrawFeature</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link5 onMouseOver="Show [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.DrawFeature.drawFeature"></a>drawFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawFeature: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawFeature: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/EditingToolbar-js.html b/doc/devdocs/files/OpenLayers/Control/EditingToolbar-js.html
new file mode 100644
index 0000000..268c128
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/EditingToolbar-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.EditingToolbar - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.EditingToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>EditingToolbar</h1><div class=CBody><p>The EditingToolbar is a panel of 4 controls to draw polygons, lines, points, or to navigate the map by panning.  By default it appears in the upper right corner of the map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Panel-js.html#OpenLay [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.EditingToolbar.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.EditingToolbar.OpenLayers.Control.EditingToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>EditingToolbar</h3><div class=CBody><p>Create an editing toolbar for a given layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.EditingToolbar.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.EditingToolbar.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>calls the default draw, and then activates mouse defaults.</p><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote>calls the default draw, and then activates mouse defaults.</div></div><div class=CToolTip id="tt2"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/GetFeature-js.html b/doc/devdocs/files/OpenLayers/Control/GetFeature-js.html
new file mode 100644
index 0000000..4104726
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/GetFeature-js.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.GetFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.GetFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>GetFeature</h1><div class=CBody><p>Gets vector features for locations underneath the mouse cursor.  Can be configured to act on click, hover or dragged boxes.  Uses an <a href="../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link26 onMouseOver="ShowTip(event, 'tt1', 'link26')" on [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.protocol"></a>protocol</h3><div class=CBody><p>{<a href="../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link28 onMouseOver="ShowTip(event, 'tt1', 'link28')" onMouseOut="HideTip('tt1')">OpenLayers.Protocol</a>} Required.  The protocol used for fetching features.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.multipleKey"></a>multipleKey</h3><div class=CBody><p>{String} An event modifier (‘altKey’ or ‘shiftKey’) that temporarily sets the <a href="#OpenLayers.Control.GetFeature.multiple" class=LProperty id=link29 onMouseOver="ShowTip(event, 'tt2', 'link29')" onMouseOut="HideTip('tt2')">multiple</a> property to true.   Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.toggleKey"></a>toggleKey</h3><div class=CBody><p>{String} An event modifier (‘altKey’ or ‘shiftKey’) that temporarily sets the <a href="#OpenLayers.Control.GetFeature.toggle" class=LProperty id=link30 onMouseOver="ShowTip(event, 'tt3', 'link30')" onMouseOut="HideTip('tt3')">toggle</a> property to true.   Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.modifiers"></a>modifiers</h3><div class=CBody><p>{Object} The event modifiers to use, according to the current event being handled by this control’s handlers</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.multiple"></a>multiple</h3><div class=CBody><p>{Boolean} Allow selection of multiple geometries.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.click"></a>click</h3><div class=CBody><p>{Boolean} Use a click handler for selecting/unselecting features.  If both <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link31 onMouseOver="ShowTip(event, 'tt27', 'link31')" onMouseOut="HideTip('tt27')">click</a> and <a href="#OpenLayers.Control.GetFeature.box" class=LProperty id=link32 onMouseOver="ShowTip(event, 'tt13', 'lin [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.single"></a>single</h3><div class=CBody><p>{Boolean} Tells whether select by click should select a single feature.  If set to false, all matching features are selected.  If set to true, only the best matching feature is selected.  This option has an effect only of the <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link33 onMouseOver="ShowTip(event, 'tt27', 'l [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.clickout"></a>clickout</h3><div class=CBody><p>{Boolean} Unselect features when clicking outside any feature.  Applies only if <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link34 onMouseOver="ShowTip(event, 'tt27', 'link34')" onMouseOut="HideTip('tt27')">click</a> is true.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.toggle"></a>toggle</h3><div class=CBody><p>{Boolean} Unselect a selected feature on click.   Applies only if <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link35 onMouseOver="ShowTip(event, 'tt27', 'link35')" onMouseOut="HideTip('tt27')">click</a> is true.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.clickTolerance"></a>clickTolerance</h3><div class=CBody><p>{Integer} Tolerance for the filter query in pixels.  This has the same effect as the tolerance parameter on WMS GetFeatureInfo requests.   Will be ignored for box selections.   Applies only if <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link36 onMouseOver="ShowTip(event, 'tt27', 'link36')" onMouseO [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.hover"></a>hover</h3><div class=CBody><p>{Boolean} Send feature requests on mouse moves.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.box"></a>box</h3><div class=CBody><p>{Boolean} Allow feature selection by drawing a box.  If set to true set <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link38 onMouseOver="ShowTip(event, 'tt27', 'link38')" onMouseOut="HideTip('tt27')">click</a> to false to disable the click handler and rely on the box handler only, even for “zero extent” boxes.  Se [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.maxFeatures"></a>maxFeatures</h3><div class=CBody><p>{Integer} Maximum number of features to return from a query in single mode if supported by the <a href="#OpenLayers.Control.GetFeature.protocol" class=LProperty id=link40 onMouseOver="ShowTip(event, 'tt4', 'link40')" onMouseOut="HideTip('tt4')">protocol</a>.  This set of features is then used to determine the best match client-side.&nb [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.features"></a>features</h3><div class=CBody><p>{Object} Hash of {<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link41 onMouseOver="ShowTip(event, 'tt5', 'link41')" onMouseOut="HideTip('tt5')">OpenLayers.Feature.Vector</a>}, keyed by fid, holding the currently selected features</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Additional options for the handlers used by this control.  This is a hash with the keys “click”, “box” and “hover”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.handlers"></a>handlers</h3><div class=CBody><p>{Object} Object with references to multiple <a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link42 onMouseOver="ShowTip(event, 'tt6', 'link42')" onMouseOut="HideTip('tt6')">OpenLayers.Handler</a> instances.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.hoverResponse"></a>hoverResponse</h3><div class=CBody><p>{<a href="../Protocol-js.html#OpenLayers.Protocol.Response" class=LClass id=link43 onMouseOver="ShowTip(event, 'tt7', 'link43')" onMouseOut="HideTip('tt7')">OpenLayers.Protocol.Response</a>} The response object associated with the currently running hover request (if any).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.filterType"></a>filterType</h3><div class=CBody><p>{<a href="../BaseTypes-js.html#OpenLayers.String" class=LClass id=link44 onMouseOver="ShowTip(event, 'tt8', 'link44')" onMouseOut="HideTip('tt8')">String</a>} The type of filter to use when sending off a request.  Possible values: OpenLayers.Filter.Spatial.<BBOX|INTERSECTS|WITHIN|CONTAINS> Defaults to: OpenLayers.Filter.Spatial.BBO [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>beforefeatureselected</td><td class=CDLDescription>Triggered when <a href="#OpenLayers.Control.GetFeature.click" class=LProperty id=link45 onMouseOver="ShowTip(event, 'tt27', 'link45')" onMouseOut="HideTip('tt2 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.OpenLayers.Control.GetFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>GetFeature</h3><div class=CBody><p>Create a new control for fetching remote features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} A configuration object which at l [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function ()</td></tr></table></blockquote><p>Activates the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The control was effectively activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function ()</td></tr></table></blockquote><p>Deactivates the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The control was effectively deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.selectClick"></a>selectClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>selectClick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called on click</p><h4 class=CHe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.selectBox"></a>selectBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>selectBox: function(</td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Callback from the handlers.box se [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.cancelHover"></a>cancelHover</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancelHover: function()</td></tr></table></blockquote><p>Callback from the handlers.hover set up when <a href="#OpenLayers.Control.GetFeature.hover" class=LProperty id=link57 onMouseOver="ShowTip(event, 'tt15', 'link57')" onMouseOut="HideTip('tt15')">hover</a> sele [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.request"></a>request</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>request: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.selectBestFeature"></a>selectBestFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>selectBestFeature: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>clickPosition,</td></tr><tr><td></td><td class=PP [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.setModifiers"></a>setModifiers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setModifiers: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the multiple and toggle  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.select"></a>select</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>select: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add feature to the hash of selected featur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.hoverSelect"></a>hoverSelect</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>hoverSelect: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets/unsets the <hoverFea [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.unselect"></a>unselect</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unselect: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove feature from the hash of selec [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.unselectAll"></a>unselectAll</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>unselectAll: function()</td></tr></table></blockquote><p>Unselect all selected features.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control.</p><h4 cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.GetFeature.pixelToBounds"></a>pixelToBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pixelToBounds: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a pixel as argumen [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract vector layer protocol class. </div></div><div class=CToolTip id="tt2"><div class=CProperty>{Boolean} Allow selection of multiple geometries. </div></div><div class=CToolTip id="tt3"><div class=CProperty>{Boolean} Unselect a selected feature on click. </div></div><div class=CToolTip id="tt4"><div class=CProperty>{OpenLayers.Protocol} Required. </div></div><div class=CToolTip id="tt5"><div class=CClass>Vector features use the OpenLaye [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Graticule-js.html b/doc/devdocs/files/OpenLayers/Control/Graticule-js.html
new file mode 100644
index 0000000..ec20dd9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Graticule-js.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Graticule - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Graticule"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Graticule</h1><div class=CBody><p>The Graticule displays a grid of latitude/longitude lines reprojected on the map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip(' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.  Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.intervals"></a>intervals</h3><div class=CBody><p>{Array(Float)} A list of possible graticule widths in degrees.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.displayInLayerSwitcher"></a>displayInLayerSwitcher</h3><div class=CBody><p>{Boolean} Allows the Graticule control to be switched on and off by LayerSwitcher control.  Defaults is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.visible"></a>visible</h3><div class=CBody><p>{Boolean} should the graticule be initially visible (default=true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.numPoints"></a>numPoints</h3><div class=CBody><p>{Integer} The number of points to use in each graticule line.   Higher numbers result in a smoother curve for projected maps</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.targetSize"></a>targetSize</h3><div class=CBody><p>{Integer} The maximum size of the grid in pixels on the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.layerName"></a>layerName</h3><div class=CBody><p>{String} The name to be displayed in the layer switcher, default is set by {<a href="../Lang-js.html#OpenLayers.Lang" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt1', 'link8')" onMouseOut="HideTip('tt1')">OpenLayers.Lang</a>}.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.labelled"></a>labelled</h3><div class=CBody><p>{Boolean} Should the graticule lines be labelled?. default=true</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.labelFormat"></a>labelFormat</h3><div class=CBody><p>{String} the format of the labels, default = ‘dm’.  See <OpenLayers.Util.getFormattedLonLat> for other options.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.lineSymbolizer"></a>lineSymbolizer</h3><div class=CBody><p>{symbolizer} the symbolizer used to render lines</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.labelSymbolizer"></a>labelSymbolizer</h3><div class=CBody><p>{symbolizer} the symbolizer used to render labels</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.gratLayer"></a>gratLayer</h3><div class=CBody><p>{OpenLayers.Layer.Vector} vector layer used to draw the graticule on</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.OpenLayers.Control.Graticule"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Graticule</h3><div class=CBody><p>Create a new graticule control to display a grid of latitude longitude lines.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An option [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>initializes the graticule layer and does the initial update</p><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Graticule.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>update: function()</td></tr></table></blockquote><p>calculates the grid to be displayed and actually draws it</p><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Internationalization namespace. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote>initializes the graticule layer  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/KeyboardDefaults-js.html b/doc/devdocs/files/OpenLayers/Control/KeyboardDefaults-js.html
new file mode 100644
index 0000000..eaef20d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/KeyboardDefaults-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.KeyboardDefaults - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>KeyboardDefaults</h1><div class=CBody><p>The KeyboardDefaults control adds panning and zooming functions, controlled with the keyboard.  By default arrow keys pan, +/- keys zoom & Page Up/Page Down/Home/End scroll by three quarters of a page.</p><p>This control has no visible appeara [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.slideFactor"></a>slideFactor</h3><div class=CBody><p>Pixels to slide by.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.OpenLayers.Control.KeyboardDefaults"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>KeyboardDefaults</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>Create handler.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.KeyboardDefaults.defaultKeyPress"></a>defaultKeyPress</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultKeyPress: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When handling [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote>Create handler.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cell [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/LayerSwitcher-js.html b/doc/devdocs/files/OpenLayers/Control/LayerSwitcher-js.html
new file mode 100644
index 0000000..9e9d129
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/LayerSwitcher-js.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.LayerSwitcher - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.LayerSwitcher"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>LayerSwitcher</h1><div class=CBody><p>The LayerSwitcher control displays a table of contents for the map.  This allows the user interface to switch between BaseLasyers and to show or hide Overlays.  By default the switcher is shown minimized on the right edge of the map, the user may e [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.roundedCorner"></a>roundedCorner</h3><div class=CBody><p>{Boolean} If true the Rico library is used for rounding the corners of the layer switcher div, defaults to true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.roundedCornerColor"></a>roundedCornerColor</h3><div class=CBody><p>{String} The color of the rounded corners, only applies if roundedCorner is true, defaults to “darkblue”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.layerStates"></a>layerStates</h3><div class=CBody><p>{Array(Object)} Basically a copy of the “state” of the map’s layers the last time the control was drawn.  We have this in order to avoid unnecessarily redrawing the control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.layersDiv"></a>layersDiv</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.baseLayersDiv"></a>baseLayersDiv</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.baseLayers"></a>baseLayers</h3><div class=CBody><p>{Array(<a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.dataLbl"></a>dataLbl</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.dataLayersDiv"></a>dataLayersDiv</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.dataLayers"></a>dataLayers</h3><div class=CBody><p>{Array(<a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.minimizeDiv"></a>minimizeDiv</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.maximizeDiv"></a>maximizeDiv</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.ascending"></a>ascending</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.OpenLayers.Control.LayerSwitcher"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>LayerSwitcher</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Properties</h4><table border [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement} A reference to the DIV DOMElement containing the switcher tabs.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.clearLayersArray"></a>clearLayersArray</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clearLayersArray: function(</td><td class=PParameter nowrap>layersType</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>User sp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.checkRedraw"></a>checkRedraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkRedraw: function()</td></tr></table></blockquote><p>Checks if the layer state has changed since the last redraw() call.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The layer state changed since the last redraw() call.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>redraw: function()</td></tr></table></blockquote><p>Goes through and takes the current state of the Map and rebuilds the control to display that state.  Groups base layers into a radio-button group and lists each data layer with a checkbox.</p><h4 class=CHeading>Retu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.onLayerClick"></a>onLayerClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onLayerClick: function(</td><td class=PParameter nowrap>e</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Need to update the map accor [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.updateMap"></a>updateMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateMap: function()</td></tr></table></blockquote><p>Cycles through the loaded data and base layer input arrays and makes the necessary calls to the Map object such that that the map’s visual state corresponds to what the user has selected in the control.</p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.maximizeControl"></a>maximizeControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>maximizeControl: function(</td><td class=PParameter nowrap>e</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set up the labels a [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.minimizeControl"></a>minimizeControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>minimizeControl: function(</td><td class=PParameter nowrap>e</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide all the conten [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.showControls"></a>showControls</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>showControls: function(</td><td class=PParameter nowrap>minimize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide/Show all LayerSw [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.loadContents"></a>loadContents</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadContents: function()</td></tr></table></blockquote><p>Set up the labels and divs for the control</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.ignoreEvent"></a>ignoreEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>ignoreEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.mouseDown"></a>mouseDown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseDown: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Register a local ‘mouseDown&r [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.LayerSwitcher.mouseUp"></a>mouseUp</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseUp: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>If the ‘isMouseDown’ flag has [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters no [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Measure-js.html b/doc/devdocs/files/OpenLayers/Control/Measure-js.html
new file mode 100644
index 0000000..76c9ba7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Measure-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Measure - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Measure"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Measure</h1><div class=CBody><p>Allows for drawing of features for measurements.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt11', 'link12')" onMouseOut="HideTip('tt11')">OpenLayers.Control</a></li [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Used to set non-default properties on the control’s handler</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.callbacks"></a>callbacks</h3><div class=CBody><p>{Object} The functions that are sent to the handler for callback</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.displaySystem"></a>displaySystem</h3><div class=CBody><p>{String} Display system for output measurements.   Supported values are ‘english’, ‘metric’, and ‘geographic’.   Default is ‘metric’.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.geodesic"></a>geodesic</h3><div class=CBody><p>{Boolean} Calculate geodesic metrics instead of planar metrics.   This requires that geometries can be transformed into Geographic/WGS84 (if that is not already the map projection).   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.displaySystemUnits"></a>displaySystemUnits</h3><div class=CBody><p>{Object} Units for various measurement systems.   Values are arrays of unit abbreviations (from OpenLayers.INCHES_PER_UNIT) in decreasing order of length.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.delay"></a>delay</h3><div class=CBody><p>{Number} Number of milliseconds between clicks before the event is considered a double-click.   The “measurepartial” event will not be triggered if the sketch is completed within this time.   This is required for IE where creating a browser reflow (if a listener is modifying the DOM by displaying the measurement values) messes with t [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.delayedTrigger"></a>delayedTrigger</h3><div class=CBody><p>{Number} Timeout id of trigger for measurepartial.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.persist"></a>persist</h3><div class=CBody><p>{Boolean} Keep the temporary measurement sketch drawn after the measurement is complete.   The geometry will persist until a new measurement is started, the control is deactivated, or <a href="#OpenLayers.Control.Measure.cancel" class=LFunction id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">cancel</a> is calle [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.OpenLayers.Control.Measure"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Measure</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>handler</td><td class=CDLDescription>{<a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt12',  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.cancel"></a>cancel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote><p>Stop the control from measuring.   If <a href="#OpenLayers.Control.Measure.persist" class=LProperty id=link16 onMouseOver="ShowTip(event, 'tt13', 'link16')" onMouseOut="HideTip('tt13')">persist</a> is true, the temporary  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.updateHandler"></a>updateHandler</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>updateHandler: function(</td><td class=PParameter nowrap>handler,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.measureComplete"></a>measureComplete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>measureComplete: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the me [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.measurePartial"></a>measurePartial</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>measurePartial: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.measure"></a>measure</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>measure: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>eventType</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.getBestArea"></a>getBestArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getBestArea: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Based on the <a href="#OpenLay [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getArea: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>units</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.getBestLength"></a>getBestLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getBestLength: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Based on the <a href="#O [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Measure.getLength"></a>getLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLength: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>units</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote>Stop the control from measuring. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>updateHandler: function(</td><td class=PParameter nowra [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/ModifyFeature-js.html b/doc/devdocs/files/OpenLayers/Control/ModifyFeature-js.html
new file mode 100644
index 0000000..1c98308
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/ModifyFeature-js.html
@@ -0,0 +1,130 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ModifyFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ModifyFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ModifyFeature</h1><div class=CBody><p>Control to modify features.   When activated, a click renders the vertices of a feature - these vertices can then be dragged.   By default, the delete key will delete the vertex under the mouse.   New features are added by dragging “virt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Array(String)} To restrict modification to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.clickout"></a>clickout</h3><div class=CBody><p>{Boolean} Unselect features when clicking outside any feature.  Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.toggle"></a>toggle</h3><div class=CBody><p>{Boolean} Unselect a selected feature on click.  Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.standalone"></a>standalone</h3><div class=CBody><p>{Boolean} Set to true to create a control without SelectFeature capabilities.  Default is false.   If standalone is true, to modify a feature, call the <a href="#OpenLayers.Control.ModifyFeature.selectFeature" class=LFunction id=link27 onMouseOver="ShowTip(event, 'tt9', 'link27')" onMouseOut="HideTip('tt9')">selectFeature</a> met [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link29 onMouseOver="ShowTip(event, 'tt1', 'link29')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.feature"></a>feature</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link30 onMouseOver="ShowTip(event, 'tt2', 'link30')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>} Feature currently available for modification.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.vertices"></a>vertices</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link31 onMouseOver="ShowTip(event, 'tt2', 'link31')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>)} Verticies currently available for dragging.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.virtualVertices"></a>virtualVertices</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link32 onMouseOver="ShowTip(event, 'tt2', 'link32')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>)} Virtual vertices in the middle of each edge.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.selectControl"></a>selectControl</h3><div class=CBody><p>{<a href="SelectFeature-js.html#OpenLayers.Control.SelectFeature" class=LClass id=link33 onMouseOver="ShowTip(event, 'tt3', 'link33')" onMouseOut="HideTip('tt3')">OpenLayers.Control.SelectFeature</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.dragControl"></a>dragControl</h3><div class=CBody><p>{<a href="DragFeature-js.html#OpenLayers.Control.DragFeature" class=LClass id=link34 onMouseOver="ShowTip(event, 'tt4', 'link34')" onMouseOut="HideTip('tt4')">OpenLayers.Control.DragFeature</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.handlers"></a>handlers</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.deleteCodes"></a>deleteCodes</h3><div class=CBody><p>{Array(Integer)} Keycodes for deleting verticies.   Set to null to disable vertex deltion by keypress.   If non-null, keypresses with codes in this array will delete vertices under the mouse.  Default is 46 and 68, the ‘delete’ and lowercase ‘d’ keys.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.virtualStyle"></a>virtualStyle</h3><div class=CBody><p>{Object} A symbolizer to be used for virtual vertices.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.mode"></a>mode</h3><div class=CBody><p>{Integer} Bitfields specifying the modification mode.  Defaults to OpenLayers.Control.ModifyFeature.RESHAPE.  To set the mode to a combination of options, use the | operator.  For example, to allow the control to both resize and rotate features, use the following syntax</p><blockquote><pre>control.mode = OpenLayers.Control.ModifyFeature [...]
+               OpenLayers.Control.ModifyFeature.ROTATE;</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.modified"></a>modified</h3><div class=CBody><p>{Boolean} The currently selected feature has been modified.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.radiusHandle"></a>radiusHandle</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link35 onMouseOver="ShowTip(event, 'tt2', 'link35')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>} A handle for rotating/resizing a feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.dragHandle"></a>dragHandle</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link36 onMouseOver="ShowTip(event, 'tt2', 'link36')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>} A handle for dragging a feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.onModificationStart"></a>onModificationStart</h3><div class=CBody><p>{Function} <b>Deprecated</b>.   Register for “beforefeaturemodified” instead.  The “beforefeaturemodified” event is triggered on the layer before any modification begins.</p><p>Optional function to be called when a feature is selected to be modified.  The function should expect to be [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.onModification"></a>onModification</h3><div class=CBody><p>{Function} <b>Deprecated</b>.   Register for “featuremodified” instead.  The “featuremodified” event is triggered on the layer with each feature modification.</p><p>Optional function to be called when a feature has been modified.   The function should expect to be called with a feature.</p></d [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.onModificationEnd"></a>onModificationEnd</h3><div class=CBody><p>{Function} <b>Deprecated</b>.   Register for “afterfeaturemodified” instead.  The “afterfeaturemodified” event is triggered on the layer after a feature has been modified.</p><p>Optional function to be called when a feature is finished being modified.   The function should expect to be c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.OpenLayers.Control.ModifyFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ModifyFeature</h3><div class=CBody><p>Create a new modify feature control.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#OpenLayers.Laye [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Take care of things that are not handled in superclass.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Successfully activated the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Successfully deactivated the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.beforeSelectFeature"></a>beforeSelectFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>beforeSelectFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>C [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.selectFeature"></a>selectFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>selectFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the sel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.unselectFeature"></a>unselectFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unselectFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.dragStart"></a>dragStart</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragStart: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.dragVertex"></a>dragVertex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragVertex: function(</td><td class=PParameter nowrap>vertex,</td></tr><tr><td></td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.dragComplete"></a>dragComplete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragComplete: function(</td><td class=PParameter nowrap>vertex</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called by the drag feat [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.setFeatureState"></a>setFeatureState</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setFeatureState: function()</td></tr></table></blockquote><p>Called when the feature is modified.   If the current state is not INSERT or DELETE, the state is set to UPDATE.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.resetVertices"></a>resetVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>resetVertices: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.handleKeypress"></a>handleKeypress</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleKeypress: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called by the featur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.collectVertices"></a>collectVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>collectVertices: function()</td></tr></table></blockquote><p>Collect the vertices from the modifiable feature’s geometry and push them on to the control’s vertices array.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.collectDragHandle"></a>collectDragHandle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>collectDragHandle: function()</td></tr></table></blockquote><p>Collect the drag handle for the selected geometry.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.collectRadiusHandle"></a>collectRadiusHandle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>collectRadiusHandle: function()</td></tr></table></blockquote><p>Collect the radius handle for the selected geometry.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control and all [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.RESHAPE"></a>RESHAPE</h3><div class=CBody><p>{Integer} Constant used to make the control work in reshape mode</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.RESIZE"></a>RESIZE</h3><div class=CBody><p>{Integer} Constant used to make the control work in resize mode</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.ROTATE"></a>ROTATE</h3><div class=CBody><p>{Integer} Constant used to make the control work in rotate mode</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ModifyFeature.DRAG"></a>DRAG</h3><div class=CBody><p>{Integer} Constant used to make the control work in drag mode</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt3"><div class=CClass>The SelectFeature control selects vector features from a given layer on click or hover.</div></div><div class=CToolTip id="tt4"><div class=CClass>The DragF [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/MouseDefaults-js.html b/doc/devdocs/files/OpenLayers/Control/MouseDefaults-js.html
new file mode 100644
index 0000000..32830b7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/MouseDefaults-js.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.MouseDefaults - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.MouseDefaults"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseDefaults</h1><div class=CBody><p>This class is DEPRECATED in 2.4 and will be removed by 3.0.  If you need this functionality, use <a href="Navigation-js.html#OpenLayers.Control.Navigation" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt15', 'link15')" onMouseOut="HideTip('tt15') [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.performedDrag"></a>performedDrag</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.wheelObserver"></a>wheelObserver</h3><div class=CBody><p>{Function}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.OpenLayers.Control.MouseDefaults"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseDefaults</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.registerWheelEvents"></a>registerWheelEvents</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>registerWheelEvents: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.defaultClick"></a>defaultClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultClick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameter [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.defaultDblClick"></a>defaultDblClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultDblClick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.defaultMouseDown"></a>defaultMouseDown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultMouseDown: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeadi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.defaultMouseMove"></a>defaultMouseMove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultMouseMove: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeadi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.defaultMouseUp"></a>defaultMouseUp</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultMouseUp: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.defaultMouseOut"></a>defaultMouseOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultMouseOut: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.defaultWheelUp"></a>defaultWheelUp</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultWheelUp: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>User spun scroll whe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.defaultWheelDown"></a>defaultWheelDown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultWheelDown: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>User spun scro [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.zoomBoxEnd"></a>zoomBoxEnd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomBoxEnd: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Zoombox function.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.removeZoomBox"></a>removeZoomBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>removeZoomBox: function()</td></tr></table></blockquote><p>Remove the zoombox from the screen and nullify our reference to it.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseDefaults.onWheelEvent"></a>onWheelEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onWheelEvent: function(</td><td class=PParameter nowrap>e</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Catch the wheel event and ha [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/MousePosition-js.html b/doc/devdocs/files/OpenLayers/Control/MousePosition-js.html
new file mode 100644
index 0000000..85c400a
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/MousePosition-js.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.MousePosition - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.MousePosition"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MousePosition</h1><div class=CBody><p>The MousePosition control displays geographic coordinates of the mouse pointer, as it is moved about the map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link10 onMouseOver="ShowTip(event, ' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.element"></a>element</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.prefix"></a>prefix</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.separator"></a>separator</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.suffix"></a>suffix</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.numDigits"></a>numDigits</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.granularity"></a>granularity</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.emptyString"></a>emptyString</h3><div class=CBody><p>{String} Set this to some value to set when the mouse is outside the map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.lastXy"></a>lastXy</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.displayProjection"></a>displayProjection</h3><div class=CBody><p>{<a href="../Projection-js.html#OpenLayers.Projection" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt2', 'link12')" onMouseOut="HideTip('tt2')">OpenLayers.Projection</a>} The projection in which the mouse position is displayed</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.OpenLayers.Control.MousePosition"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MousePosition</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Options for control.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>{DOMElement}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>redraw: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.reset"></a>reset</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>reset: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MousePosition.formatOutput"></a>formatOutput</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>formatOutput: function(</td><td class=PParameter nowrap>lonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Override to provide cus [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt2"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt4"><div class=CFunction><blockq [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/MouseToolbar-js.html b/doc/devdocs/files/OpenLayers/Control/MouseToolbar-js.html
new file mode 100644
index 0000000..8f6065f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/MouseToolbar-js.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.MouseToolbar - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.MouseToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseToolbar</h1><div class=CBody><p>This class is DEPRECATED in 2.4 and will be removed by 3.0.  If you need this functionality, use <a href="NavToolbar-js.html#OpenLayers.Control.NavToolbar" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt14', 'link14')" onMouseOut="HideTip('tt14')"> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.mode"></a>mode</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.buttons"></a>buttons</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.direction"></a>direction</h3><div class=CBody><p>{String} ‘vertical’ or ‘horizontal’</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.buttonClicked"></a>buttonClicked</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.OpenLayers.Control.MouseToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseToolbar</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>position</td><td class=CDLDescription>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link15 onMouseOver="S [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar._addButton"></a>_addButton</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>_addButton:function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>img,</td></tr><tr><td></td><td class=PParameter nowrap>activeImg,</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.buttonDown"></a>buttonDown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buttonDown: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.buttonUp"></a>buttonUp</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buttonUp: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.defaultDblClick"></a>defaultDblClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultDblClick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.defaultMouseDown"></a>defaultMouseDown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultMouseDown: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.switchModeTo"></a>switchModeTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>switchModeTo: function(</td><td class=PParameter nowrap>mode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.leaveMode"></a>leaveMode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>leaveMode: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.defaultMouseMove"></a>defaultMouseMove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultMouseMove: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.defaultMouseUp"></a>defaultMouseUp</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultMouseUp: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Para [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.defaultMouseOut"></a>defaultMouseOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultMouseOut: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.MouseToolbar.defaultClick"></a>defaultClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultClick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/NavToolbar-js.html b/doc/devdocs/files/OpenLayers/Control/NavToolbar-js.html
new file mode 100644
index 0000000..66fbf96
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/NavToolbar-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.NavToolbar - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.NavToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavToolbar</h1><div class=CBody><p>This Toolbar is an alternative to the Navigation control that displays the state of the control, and provides a UI for changing state to use the zoomBox via a Panel control.</p><p>If you wish to change the properties of the Navigation control used in the NavToolba [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavToolbar.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavToolbar.OpenLayers.Control.NavToolbar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavToolbar</h3><div class=CBody><p>Add our two mousedefaults controls.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavToolbar.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavToolbar.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>calls the default draw, and then activates mouse defaults.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote>calls the default draw, and then activates mouse defaults.</div></div><div class=CToolTip id="tt2"><div class=CClass>The Panel control is a container for other controls. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Navigation-js.html b/doc/devdocs/files/OpenLayers/Control/Navigation-js.html
new file mode 100644
index 0000000..88a3da7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Navigation-js.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Navigation - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Navigation"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Navigation</h1><div class=CBody><p>The navigation control handles map browsing with mouse events (dragging, double-clicking, and scrolling the wheel).   Create a new navigation control with the <a href="#OpenLayers.Control.Navigation.OpenLayers.Control.Navigation" class=LConstructor id=link18  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.dragPan"></a>dragPan</h3><div class=CBody><p>{<a href="DragPan-js.html#OpenLayers.Control.DragPan" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt1', 'link21')" onMouseOut="HideTip('tt1')">OpenLayers.Control.DragPan</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.documentDrag"></a>documentDrag</h3><div class=CBody><p>{Boolean} Allow panning of the map by dragging outside map viewport.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.zoomBox"></a>zoomBox</h3><div class=CBody><p>{<a href="ZoomBox-js.html#OpenLayers.Control.ZoomBox" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt2', 'link22')" onMouseOut="HideTip('tt2')">OpenLayers.Control.ZoomBox</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.zoomBoxEnabled"></a>zoomBoxEnabled</h3><div class=CBody><p>{Boolean} Whether the user can draw a box to zoom</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.zoomWheelEnabled"></a>zoomWheelEnabled</h3><div class=CBody><p>{Boolean} Whether the mousewheel should zoom the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.mouseWheelOptions"></a>mouseWheelOptions</h3><div class=CBody><p>{Object} Options passed to the MouseWheel control (only useful if <a href="#OpenLayers.Control.Navigation.zoomWheelEnabled" class=LProperty id=link23 onMouseOver="ShowTip(event, 'tt3', 'link23')" onMouseOut="HideTip('tt3')">zoomWheelEnabled</a> is set to true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.handleRightClicks"></a>handleRightClicks</h3><div class=CBody><p>{Boolean} Whether or not to handle right clicks.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.zoomBoxKeyMask"></a>zoomBoxKeyMask</h3><div class=CBody><p>{Integer} <a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link24 onMouseOver="ShowTip(event, 'tt4', 'link24')" onMouseOut="HideTip('tt4')">OpenLayers.Handler</a> key code of the key, which has to be pressed, while drawing the zoom box with the mouse on the screen.  You should probably set handleRightClicks to true [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.OpenLayers.Control.Navigation"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Navigation</h3><div class=CBody><p>Create a new navigation control</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>The destroy method is used to perform any clean up before the control is dereferenced.   Typically this is where event listeners are removed to prevent memory leaks.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.defaultDblClick"></a>defaultDblClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultDblClick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.defaultDblRightClick"></a>defaultDblRightClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>defaultDblRightClick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 cla [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.wheelChange"></a>wheelChange</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>wheelChange: function(</td><td class=PParameter nowrap>evt,</td></tr><tr><td></td><td class=PParameter nowrap>deltaZ</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.wheelUp"></a>wheelUp</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>wheelUp: function(</td><td class=PParameter nowrap>evt,</td></tr><tr><td></td><td class=PParameter nowrap>delta</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.wheelDown"></a>wheelDown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>wheelDown: function(</td><td class=PParameter nowrap>evt,</td></tr><tr><td></td><td class=PParameter nowrap>delta</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.disableZoomBox"></a>disableZoomBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>disableZoomBox : function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.enableZoomBox"></a>enableZoomBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>enableZoomBox : function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.disableZoomWheel"></a>disableZoomWheel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>disableZoomWheel : function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Navigation.enableZoomWheel"></a>enableZoomWheel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>enableZoomWheel : function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The DragPan control pans the map with a drag of the mouse.</div></div><div class=CToolTip id="tt2"><div class=CClass>The ZoomBox control enables zooming directly to a given extent, by drawing a box on the map. </div></div><div class=CToolTip id="tt3"><div class=CProperty>{Boolean} Whether the mousewheel should zoom the map</div></div><div class=CToolTip id="tt4"><div class=CClass>Base class to construct a higher-level handler for event seque [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/NavigationHistory-js.html b/doc/devdocs/files/OpenLayers/Control/NavigationHistory-js.html
new file mode 100644
index 0000000..f4332f4
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/NavigationHistory-js.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.NavigationHistory - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.NavigationHistory"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavigationHistory</h1><div class=CBody><p>A navigation history control.   This is a meta-control, that creates two dependent controls: <a href="#OpenLayers.Control.NavigationHistory.previous" class=LProperty id=link21 onMouseOver="ShowTip(event, 'tt2', 'link21')" onMouseOut="HideTip('tt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.type"></a>type</h3><div class=CBody><p>{String} Note that this control is not intended to be added directly to a control panel.   Instead, add the sub-controls previous and next.   These sub-controls are button type controls that activate and deactivate themselves.   If this parent control is added to a panel, it will act as a toggle.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.previous"></a>previous</h3><div class=CBody><p>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link26 onMouseOver="ShowTip(event, 'tt1', 'link26')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>} A button type control whose trigger method restores the previous state managed by this control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.previousOptions"></a>previousOptions</h3><div class=CBody><p>{Object} Set this property on the options argument of the constructor to set optional properties on the <a href="#OpenLayers.Control.NavigationHistory.previous" class=LProperty id=link27 onMouseOver="ShowTip(event, 'tt2', 'link27')" onMouseOut="HideTip('tt2')">previous</a> control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.next"></a>next</h3><div class=CBody><p>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link28 onMouseOver="ShowTip(event, 'tt1', 'link28')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>} A button type control whose trigger method restores the next state managed by this control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.nextOptions"></a>nextOptions</h3><div class=CBody><p>{Object} Set this property on the options argument of the constructor to set optional properties on the <a href="#OpenLayers.Control.NavigationHistory.next" class=LProperty id=link29 onMouseOver="ShowTip(event, 'tt3', 'link29')" onMouseOut="HideTip('tt3')">next</a> control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.limit"></a>limit</h3><div class=CBody><p>{Integer} Optional limit on the number of history items to retain.   If null, there is no limit.   Default is 50.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.clearOnDeactivate"></a>clearOnDeactivate</h3><div class=CBody><p>{Boolean} Clear the history when the control is deactivated.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.registry"></a>registry</h3><div class=CBody><p>{Object} An object with keys corresponding to event types.   Values are functions that return an object representing the current state.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.nextStack"></a>nextStack</h3><div class=CBody><p>{Array} Array of items in the history.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.previousStack"></a>previousStack</h3><div class=CBody><p>{Array} List of items in the history.   First item represents the current state.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.listeners"></a>listeners</h3><div class=CBody><p>{Object} An object containing properties corresponding to event types.  This object is used to configure the control and is modified on construction.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.restoring"></a>restoring</h3><div class=CBody><p>{Boolean} Currently restoring a history state.   This is set to true before calling restore and set to false after restore returns.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.OpenLayers.Control.NavigationHistory"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavigationHistory</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used to extend the contro [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.onPreviousChange"></a>onPreviousChange</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onPreviousChange: function(</td><td class=PParameter nowrap>state,</td></tr><tr><td></td><td class=PParameter nowrap>length</td><td class=PAfterParameters nowrap>)</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.onNextChange"></a>onNextChange</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onNextChange: function(</td><td class=PParameter nowrap>state,</td></tr><tr><td></td><td class=PParameter nowrap>length</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control and [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>Called when the control is added to the map.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.previousTrigger"></a>previousTrigger</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>previousTrigger: function()</td></tr></table></blockquote><p>Restore the previous state.   If no items are in the previous history stack, this has no effect.</p><h4 class=CHeading>Returns</h4><p>{Object} Item representing state that was restored [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.nextTrigger"></a>nextTrigger</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>nextTrigger: function()</td></tr></table></blockquote><p>Restore the next state.   If no items are in the next history stack, this has no effect.   The next history stack is populated as states are restored from the previous history stack.</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear history.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.getState"></a>getState</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getState: function()</td></tr></table></blockquote><p>Get the current state and return it.</p><h4 class=CHeading>Returns</h4><p>{Object} An object representing the current state.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.restore"></a>restore</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>restore: function(</td><td class=PParameter nowrap>state</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Update the state with the given obj [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.setListeners"></a>setListeners</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setListeners: function()</td></tr></table></blockquote><p>Sets functions to be registered in the listeners object.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.   This registers any listeners.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Control successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.initStack"></a>initStack</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initStack: function()</td></tr></table></blockquote><p>Called after the control is activated if the previous history stack is empty.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.NavigationHistory.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.   This unregisters any listeners.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Control successfully deactivated.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CProperty>{OpenLayers.Control} A button type control whose trigger method restores the previous state managed by this control.</div></div><div class=CToolTip id="tt3"><div class=CProperty>{OpenLayers.Control} A button type control whose trigger method restores the next state managed by this control.</div></div><div class=CToolTip id="tt4"> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/OverviewMap-js.html b/doc/devdocs/files/OpenLayers/Control/OverviewMap-js.html
new file mode 100644
index 0000000..30612fb
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/OverviewMap-js.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.OverviewMap - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.OverviewMap"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>OverviewMap</h1><div class=CBody><p>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.  C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.element"></a>element</h3><div class=CBody><p>{DOMElement} The DOM element that contains the overview map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.ovmap"></a>ovmap</h3><div class=CBody><p>{<a href="../Map-js.html#OpenLayers.Map" class=LClass id=link24 onMouseOver="ShowTip(event, 'tt1', 'link24')" onMouseOut="HideTip('tt1')">OpenLayers.Map</a>} A reference to the overview map itself.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.size"></a>size</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt2', 'link25')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} The overvew map size in pixels.   Note that this is the size of the map itself - the element that contains the map (default class name olControlOverviewMapElement) may have paddin [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>)} Ordered list of layers in the overview map.  If none are sent at construction, the base layer for the main map is used.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.minRectSize"></a>minRectSize</h3><div class=CBody><p>{Integer} The minimum width or height (in pixels) of the extent rectangle on the overview map.   When the extent rectangle reaches this size, it will be replaced depending on the value of the <a href="#OpenLayers.Control.OverviewMap.minRectDisplayClass" class=LProperty id=link26 onMouseOver="ShowTip(event, 'tt24', 'link26')" onMouseOu [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.minRectDisplayClass"></a>minRectDisplayClass</h3><div class=CBody><p>{String} Replacement style class name for the extent rectangle when <a href="#OpenLayers.Control.OverviewMap.minRectSize" class=LProperty id=link27 onMouseOver="ShowTip(event, 'tt3', 'link27')" onMouseOut="HideTip('tt3')">minRectSize</a> is reached.   This string will be suffixed on to the displayClass.   Default  [...]
+    overflow: hidden;
+    cursor: move;
+    background-image: url("img/overview_replacement.gif");
+    background-repeat: no-repeat;
+    background-position: center;
+}</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.minRatio"></a>minRatio</h3><div class=CBody><p>{Float} The ratio of the overview map resolution to the main map resolution at which to zoom farther out on the overview map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.maxRatio"></a>maxRatio</h3><div class=CBody><p>{Float} The ratio of the overview map resolution to the main map resolution at which to zoom farther in on the overview map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.mapOptions"></a>mapOptions</h3><div class=CBody><p>{Object} An object containing any non-default properties to be sent to the overview map’s map constructor.   These should include any non-default options that the main map was constructed with.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.autoPan"></a>autoPan</h3><div class=CBody><p>{Boolean} Always pan the overview map, so the extent marker remains in the center.   Default is false.   If true, when you drag the extent marker, the overview map will update itself so the marker returns to the center.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.handlers"></a>handlers</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.resolutionFactor"></a>resolutionFactor</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.maximized"></a>maximized</h3><div class=CBody><p>{Boolean} Start as maximized (visible).  Defaults to false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.OpenLayers.Control.OverviewMap"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>OverviewMap</h3><div class=CBody><p>Create a new overview map</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} Properties of this object will be set on the overview ma [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Deconstruct the control</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>Render the control in the browser.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.baseLayerDraw"></a>baseLayerDraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>baseLayerDraw: function()</td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Draw the base layer</td><td class=CDLDescription>called if unable to complete in the initial draw</td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.rectDrag"></a>rectDrag</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>rectDrag: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle extent rectangle drag</p><h4 class [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.mapDivClick"></a>mapDivClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mapDivClick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle browser events</p><h4 cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.maximizeControl"></a>maximizeControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>maximizeControl: function(</td><td class=PParameter nowrap>e</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Unhide the control.&n [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.minimizeControl"></a>minimizeControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>minimizeControl: function(</td><td class=PParameter nowrap>e</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide all the contents [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.showToggle"></a>showToggle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>showToggle: function(</td><td class=PParameter nowrap>minimize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide/Show the toggle dependin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>update: function()</td></tr></table></blockquote><p>Update the overview map after layers move.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.isSuitableOverview"></a>isSuitableOverview</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>isSuitableOverview: function()</td></tr></table></blockquote><p>Determines if the overview map is suitable given the extent and resolution of the main map.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.createMap"></a>createMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createMap: function()</td></tr></table></blockquote><p>Construct the map that this control contains</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.updateRectToMap"></a>updateRectToMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateRectToMap: function()</td></tr></table></blockquote><p>Updates the extent rectangle position and size to match the map extent</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.updateMapToRect"></a>updateMapToRect</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateMapToRect: function()</td></tr></table></blockquote><p>Updates the map extent to match the extent rectangle position and size</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.setRectPxBounds"></a>setRectPxBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setRectPxBounds: function(</td><td class=PParameter nowrap>pxBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set extent rec [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.getRectBoundsFromMapBounds"></a>getRectBoundsFromMapBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getRectBoundsFromMapBounds: function(</td><td class=PParameter nowrap>lonLatBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.getMapBoundsFromRectBounds"></a>getMapBoundsFromRectBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapBoundsFromRectBounds: function(</td><td class=PParameter nowrap>pxBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.getLonLatFromOverviewPx"></a>getLonLatFromOverviewPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromOverviewPx: function(</td><td class=PParameter nowrap>overviewMapPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.OverviewMap.getOverviewPxFromLonLat"></a>getOverviewPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getOverviewPxFromLonLat: function(</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockq [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt3"><div class=CProperty>{Integer} The minimum width or height (in pixels) of the extent rectangle on the overview map. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Pan-js.html b/doc/devdocs/files/OpenLayers/Control/Pan-js.html
new file mode 100644
index 0000000..fd19b39
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Pan-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Pan - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Pan"></a>OpenLayers.<span class=HB> </span>Control.Pan</h1><div class=CBody><p>The Pan control is a single button to pan the map in one direction.  For a more complete control see <a href="PanPanel-js.html#OpenLayers.Control.PanPanel" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Control.PanPanel</a>.</p><h4 class [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.slideFactor"></a>slideFactor</h3><div class=CBody><p>{Integer} Number of pixels by which we’ll pan the map in any direction on clicking the arrow buttons, defaults to 50.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.direction"></a>direction</h3><div class=CBody><p>{String} in {‘North’, ‘South’, ‘East’, ‘West’}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.type"></a>type</h3><div class=CBody><p>{String} The type of <a href="../Control-js.html#OpenLayers.Control" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a> -- When added to a <a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt2', 'link7')" onMouseOut="HideTip('tt2')">Control.Panel [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.OpenLayers.Control.Pan"></a>OpenLayers.<span class=HB> </span>Control.Pan</h3><div class=CBody><p>Control which handles the panning (in any of the cardinal directions) of the map by a set px distance.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>direction</td><td class=CDLDescription>{String} The direction this butt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Pan.trigger"></a>trigger</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt4"><div class=CClass>The PanPanel is visible contro [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/PanPanel-js.html b/doc/devdocs/files/OpenLayers/Control/PanPanel-js.html
new file mode 100644
index 0000000..3502bb6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/PanPanel-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.PanPanel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.PanPanel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanPanel</h1><div class=CBody><p>The PanPanel is visible control for panning the map North, South, East or West in small steps.  By default it is drawn in the top left corner of the map.</p><h4 class=CHeading>Note</h4><p>If you wish to use this class with the default images and you want it to lo [...]
+  <link rel="stylesheet" href="../theme/default/ie6-style.css" type="text/css" />
+<![endif]--></pre></blockquote><h4 class=CHeading>Inherits from</h4><ul><li><a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Control.Panel</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Control.PanPanel" >Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanPanel.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanPanel.slideFactor"></a>slideFactor</h3><div class=CBody><p>{Integer} Number of pixels by which we’ll pan the map in any direction on clicking the arrow buttons, defaults to 50.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanPanel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanPanel.OpenLayers.Control.PanPanel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanPanel</h3><div class=CBody><p>Add the four directional pan buttons.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used to  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The Panel control is a container for other controls. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/PanZoom-js.html b/doc/devdocs/files/OpenLayers/Control/PanZoom-js.html
new file mode 100644
index 0000000..53391d6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/PanZoom-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.PanZoom - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.PanZoom"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoom</h1><div class=CBody><p>The PanZoom is a visible control, composed of a <a href="PanPanel-js.html#OpenLayers.Control.PanPanel" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Control.PanPanel</a> and a <a href="ZoomPanel-js.html#OpenL [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.slideFactor"></a>slideFactor</h3><div class=CBody><p>{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 <a href="#OpenLayers.Control.PanZoom.slideRatio" class=LProperty id=link14 onMouseOver="ShowTip(event, 'tt12', 'link14')" onMouseOut="HideTip('tt12')">slideRatio</a> inst [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.slideRatio"></a>slideRatio</h3><div class=CBody><p>{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 <a href="#OpenLayers.Control.PanZoom.slideFactor" class=LProperty id=link15 onMouseOver="ShowTip(event, 'tt13', 'link15')" onMouseOut="HideTip('tt13')">slideFactor</a>.  E.g. if slide [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.buttons"></a>buttons</h3><div class=CBody><p>{Array(DOMElement)} Array of Button Divs</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.position"></a>position</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt3', 'link16')" onMouseOut="HideTip('tt3')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.OpenLayers.Control.PanZoom"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoom</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom._addButton"></a>_addButton</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>_addButton:function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>img,</td></tr><tr><td></td><td class=PParameter nowrap>xy,</td></tr><tr><td></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom._removeButton"></a>_removeButton</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>_removeButton: function(</td><td class=PParameter nowrap>btn</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.removeButtons"></a>removeButtons</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>removeButtons: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.doubleClick"></a>doubleClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>doubleClick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.buttonDown"></a>buttonDown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buttonDown: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.X"></a>X</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoom.Y"></a>Y</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The PanPanel is visible control for panning the map North, South, East or West in small steps. </div></div><div class=CToolTip id="tt2"><div class=CClass>The ZoomPanel control is a compact collecton of 3 zoom controls: a OpenLayers.Control.ZoomIn, a OpenLayers.Control.ZoomToMaxExtent, and a OpenLayers.Control.ZoomOut. </div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents a screen coordinate, in x and y coordinates< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/PanZoomBar-js.html b/doc/devdocs/files/OpenLayers/Control/PanZoomBar-js.html
new file mode 100644
index 0000000..445c6f9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/PanZoomBar-js.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.PanZoomBar - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.PanZoomBar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoomBar</h1><div class=CBody><p>The PanZoomBar is a visible control composed of a <a href="PanPanel-js.html#OpenLayers.Control.PanPanel" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">OpenLayers.Control.PanPanel</a> and a <OpenLayers.Control.Z [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomStopWidth"></a>zoomStopWidth</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomStopHeight"></a>zoomStopHeight</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.slider"></a>slider</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.sliderEvents"></a>sliderEvents</h3><div class=CBody><p>{<a href="../Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoombarDiv"></a>zoombarDiv</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.divEvents"></a>divEvents</h3><div class=CBody><p>{<a href="../Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomWorldIcon"></a>zoomWorldIcon</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.forceFixedZoomLevel"></a>forceFixedZoomLevel</h3><div class=CBody><p>{Boolean} Force a fixed zoom level even though the map has fractionalZoom</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.mouseDragStart"></a>mouseDragStart</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt2', 'link18')" onMouseOut="HideTip('tt2')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomStart"></a>zoomStart</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt2', 'link19')" onMouseOut="HideTip('tt2')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.OpenLayers.Control.PanZoomBar"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoomBar</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>redraw: function()</td></tr></table></blockquote><p>clear the div and start over.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar._addZoomBar"></a>_addZoomBar</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>_addZoomBar:function(</td><td class=PParameter nowrap>centered</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar._removeZoomBar"></a>_removeZoomBar</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>_removeZoomBar: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.passEventToSlider"></a>passEventToSlider</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>passEventToSlider:function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This function i [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.divClick"></a>divClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>divClick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Picks up on clicks directly on the zoomb [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomBarDown"></a>zoomBarDown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomBarDown:function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>event listener for clicks on the  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomBarDrag"></a>zoomBarDrag</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomBarDrag:function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This is what happens when a click [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.zoomBarUp"></a>zoomBarUp</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomBarUp:function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Perform cleanup when a mouseup event is [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.PanZoomBar.moveZoomBar"></a>moveZoomBar</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>moveZoomBar:function()</td></tr></table></blockquote><p>Change the location of the slider to match the current zoom level.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The PanPanel is visible control for panning the map North, South, East or West in small steps. </div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Panel-js.html b/doc/devdocs/files/OpenLayers/Control/Panel-js.html
new file mode 100644
index 0000000..a03e5b2
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Panel-js.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Panel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Panel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Panel</h1><div class=CBody><p>The Panel control is a container for other controls.  With it toolbars may be composed.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="Hide [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.controls"></a>controls</h3><div class=CBody><p>{Array(<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt1', 'link17')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} Activate the control when it is added to a map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.defaultControl"></a>defaultControl</h3><div class=CBody><p>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt1', 'link18')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>} The control which is activated when the control is activated (turned on), which also happens at instantiation.  If <a href="#OpenLayers.Control.Panel.saveState" class [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.saveState"></a>saveState</h3><div class=CBody><p>{Boolean} If set to true, the active state of this panel’s controls will be stored on panel deactivation, and restored on reactivation.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.activeState"></a>activeState</h3><div class=CBody><p>{Object} stores the active state of this panel’s controls.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.OpenLayers.Control.Panel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Panel</h3><div class=CBody><p>Create a new control panel.</p><p>Each control in the panel is represented by an icon.  When clicking on an icon, the <a href="#OpenLayers.Control.Panel.activateControl" class=LFunction id=link21 onMouseOver="ShowTip(event, 'tt7', 'link21')" onMouseOut="HideTip('tt7' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>redraw: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.activateControl"></a>activateControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>activateControl: function (</td><td class=PParameter nowrap>control</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This method is calle [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.addControls"></a>addControls</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addControls: function(</td><td class=PParameter nowrap>controls</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>To build a toolbar, you add a se [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.addControlsToMap"></a>addControlsToMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addControlsToMap: function (</td><td class=PParameter nowrap>controls</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Only for interna [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.onClick"></a>onClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onClick: function (</td><td class=PParameter nowrap>ctrl,</td></tr><tr><td></td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockq [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.onDoubleClick"></a>onDoubleClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onDoubleClick: function(</td><td class=PParameter nowrap>ctrl,</td></tr><tr><td></td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.getControlsBy"></a>getControlsBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsBy: function(</td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.getControlsByName"></a>getControlsByName</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsByName: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of con [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Panel.getControlsByClass"></a>getControlsByClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsByClass: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Permalink-js.html b/doc/devdocs/files/OpenLayers/Control/Permalink-js.html
new file mode 100644
index 0000000..19751bd
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Permalink-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Permalink - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Permalink"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Permalink</h1><div class=CBody><p>The Permalink control is hyperlink that will return the user to the current map view.  By default it is drawn in the lower right corner of the map.  The href is updated as the map is zoomed, panned and whilst layers are switched.  ` Inherits from:</p> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.argParserClass"></a>argParserClass</h3><div class=CBody><p>{Class} The ArgParser control class (not instance) to use with this control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.element"></a>element</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.base"></a>base</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.displayProjection"></a>displayProjection</h3><div class=CBody><p>{<a href="../Projection-js.html#OpenLayers.Projection" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt1', 'link8')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} Requires proj4js support.   Projection used when creating the coordinates in the link.  This will reproject the map coordinates into display coo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.OpenLayers.Control.Permalink"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Permalink</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement}</td></tr><tr><td class=CDLEntry>base</td><td class=CDLDescription>{String}</td></tr><tr>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control.</p><h4 cla [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.updateLink"></a>updateLink</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateLink: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Permalink.createParams"></a>createParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createParams: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom,</td></tr><tr><td></td><td class=PParameter nowrap>layers</td> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/SLDSelect-js.html b/doc/devdocs/files/OpenLayers/Control/SLDSelect-js.html
new file mode 100644
index 0000000..2bf9baf
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/SLDSelect-js.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.SLDSelect - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.SLDSelect"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SLDSelect</h1><div class=CBody><p>Perform selections on WMS layers using Styled Layer Descriptor (SLD)</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt14', 'link14')" onMouseOut="HideTip('tt14')">Op [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happen [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.clearOnDeactivate"></a>clearOnDeactivate</h3><div class=CBody><p>{Boolean} Should the selection be cleared when the control is deactivated.  Default value is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="../Layer/WMS-js.html#OpenLayers.Layer.WMS" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.WMS</a>)} The WMS layers this control will work on.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.callbacks"></a>callbacks</h3><div class=CBody><p>{Object} The functions that are sent to the handler for callback</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.selectionSymbolizer"></a>selectionSymbolizer</h3><div class=CBody><p>{Object} Determines the styling of the selected objects.  Default is a selection in red.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.layerOptions"></a>layerOptions</h3><div class=CBody><p>{Object} The options to apply to the selection layer, by default the selection layer will be kept out of the layer switcher.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Used to set non-default properties on the control’s handler</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.sketchStyle"></a>sketchStyle</h3><div class=CBody><p>{<OpenLayers.Style>|Object} Style or symbolizer to use for the sketch handler.  The recommended way of styling the sketch layer, however, is to configure an <a href="../StyleMap-js.html#OpenLayers.StyleMap" class=LClass >OpenLayers.StyleMap</a> in the layerOptions of the <a href="#OpenLayers.Control.SLDSelect.handlerOptions" class [...]
+    handlerOptions: {
+        layerOptions: {
+            styleMap: new OpenLayers.StyleMap({
+                "default": {strokeColor: "yellow"}
+            });
+        }
+    }
+});</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.wfsCache"></a>wfsCache</h3><div class=CBody><p>{Object} Cache to use for storing parsed results from <OpenLayers.Format.WFSDescribeFeatureType.read>.  If not provided, these will be cached on the prototype.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.layerCache"></a>layerCache</h3><div class=CBody><p>{Object} Cache to use for storing references to the selection layers.  Normally each source layer will have exactly 1 selection layer of type OpenLayers.Layer.WMS.Post.  If not provided, layers will be cached on the prototype.  Note that if <a href="#OpenLayers.Control.SLDSelect.clearOnDeactivate" class=LProperty id=link18 onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.OpenLayers.Control.SLDSelect"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SLDSelect</h3><div class=CBody><p>Create a new control for selecting features in WMS layers using Styled Layer Descriptor (SLD).</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>handler</td><td class=CDLDescription>{ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Take care of things that are not handled in superclass.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.coupleLayerVisiblity"></a>coupleLayerVisiblity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>coupleLayerVisiblity: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Couple [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.createSelectionLayer"></a>createSelectionLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createSelectionLayer: function(</td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Cre [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.createSLD"></a>createSLD</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createSLD: function(</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>filters,</td></tr><tr><td></td><td class=PParameter nowrap>geometryAttributes [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.parseDescribeLayer"></a>parseDescribeLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseDescribeLayer: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.getGeometryAttributes"></a>getGeometryAttributes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeometryAttributes: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>L [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.  Activating the control will perform a SLD WMS DescribeLayer request followed by a WFS DescribeFeatureType request so that the proper symbolizers can be chosen based on the geometry type.</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.  If clearOnDeactivate is true, remove the selection layer(s).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.setLayers"></a>setLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayers: function(</td><td class=PParameter nowrap>layers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the layers on which the selectio [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.createFilter"></a>createFilter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFilter: function(</td><td class=PParameter nowrap>geometryAttribute,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.select"></a>select</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>select: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When the handler is done, use SLD_BODY on t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SLDSelect.applySelection"></a>applySelection</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>applySelection: function()</td></tr></table></blockquote><p>Checks if all required wfs data is cached, and applies the selection</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.WMS are used to display data from OGC Web Mapping Services. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Take care of things that are not handled in superclass.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cell [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Scale-js.html b/doc/devdocs/files/OpenLayers/Control/Scale-js.html
new file mode 100644
index 0000000..5fc1e8e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Scale-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Scale - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Scale"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Scale</h1><div class=CBody><p>The Scale control displays the current map scale as a ratio (e.g.  Scale = 1:1M).  By default it is displayed in the lower right corner of the map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.geodesic"></a>geodesic</h3><div class=CBody><p>{Boolean} Use geodesic measurement.  Default is false.  The recommended setting for maps in EPSG:4326 is false, and true EPSG:900913.  If set to true, the scale will be calculated based on the horizontal size of the pixel in the center of the map viewport.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.OpenLayers.Control.Scale"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Scale</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>element</td><td class=CDLDescription>{DOMElement}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Scale.updateScale"></a>updateScale</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateScale: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote>{DOMElement}</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateScale: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CClass>Controls affect the display or behavior of the m [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/ScaleLine-js.html b/doc/devdocs/files/OpenLayers/Control/ScaleLine-js.html
new file mode 100644
index 0000000..d54915b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/ScaleLine-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ScaleLine - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ScaleLine"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ScaleLine</h1><div class=CBody><p>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.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.maxWidth"></a>maxWidth</h3><div class=CBody><p>{Integer} Maximum width of the scale line in pixels.   Default is 100.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.topOutUnits"></a>topOutUnits</h3><div class=CBody><p>{String} Units for zoomed out on top bar.   Default is km.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.topInUnits"></a>topInUnits</h3><div class=CBody><p>{String} Units for zoomed in on top bar.   Default is m.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.bottomOutUnits"></a>bottomOutUnits</h3><div class=CBody><p>{String} Units for zoomed out on bottom bar.   Default is mi.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.bottomInUnits"></a>bottomInUnits</h3><div class=CBody><p>{String} Units for zoomed in on bottom bar.   Default is ft.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.eTop"></a>eTop</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.eBottom"></a>eBottom</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.geodesic"></a>geodesic</h3><div class=CBody><p>{Boolean} Use geodesic measurement.  Default is false.  The recommended setting for maps in EPSG:4326 is false, and true EPSG:900913.  If set to true, the scale will be calculated based on the horizontal size of the pixel in the center of the map viewport.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.OpenLayers.Control.ScaleLine"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ScaleLine</h3><div class=CBody><p>Create a new scale line control.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used to ex [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.getBarLen"></a>getBarLen</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getBarLen: function(</td><td class=PParameter nowrap>maxLen</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a number, round it down to the [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ScaleLine.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>update: function()</td></tr></table></blockquote><p>Update the size of the bars, and the labels they contain.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote>{DOMElement}</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getBarLen: function(</td><td class=PParameter nowrap>maxLen</td><td class=PAft [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/SelectFeature-js.html b/doc/devdocs/files/OpenLayers/Control/SelectFeature-js.html
new file mode 100644
index 0000000..05af140
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/SelectFeature-js.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.SelectFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.SelectFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SelectFeature</h1><div class=CBody><p>The SelectFeature control selects vector features from a given layer on click or hover.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link29 onMouseOver="ShowTip(event, 'tt26', 'link29')" onMo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types</h4><ul><li><b>beforefeaturehighlighted</b> Triggered before a feature is highlighted</li><li><b>featurehighlighted</b> Triggered when a feature is highlighted</li><li><b>featureunhighlighted</b> Triggered when a feature is unhighlighted</li></ul></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.multipleKey"></a>multipleKey</h3><div class=CBody><p>{String} An event modifier (‘altKey’ or ‘shiftKey’) that temporarily sets the <a href="#OpenLayers.Control.SelectFeature.multiple" class=LProperty id=link30 onMouseOver="ShowTip(event, 'tt1', 'link30')" onMouseOut="HideTip('tt1')">multiple</a> property to true.   Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.toggleKey"></a>toggleKey</h3><div class=CBody><p>{String} An event modifier (‘altKey’ or ‘shiftKey’) that temporarily sets the <a href="#OpenLayers.Control.SelectFeature.toggle" class=LProperty id=link31 onMouseOver="ShowTip(event, 'tt2', 'link31')" onMouseOut="HideTip('tt2')">toggle</a> property to true.   Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.multiple"></a>multiple</h3><div class=CBody><p>{Boolean} Allow selection of multiple geometries.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.clickout"></a>clickout</h3><div class=CBody><p>{Boolean} Unselect features when clicking outside any feature.  Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.toggle"></a>toggle</h3><div class=CBody><p>{Boolean} Unselect a selected feature on click.   Default is false.   Only has meaning if hover is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.hover"></a>hover</h3><div class=CBody><p>{Boolean} Select on mouse over and deselect on mouse out.   If true, this ignores clicks and only listens to mouse moves.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.highlightOnly"></a>highlightOnly</h3><div class=CBody><p>{Boolean} If true do not actually select features (i.e. place them in the layer’s selected features array), just highlight them.  This property has no effect if hover is false.  Defaults to false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.box"></a>box</h3><div class=CBody><p>{Boolean} Allow feature selection by drawing a box.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.onBeforeSelect"></a>onBeforeSelect</h3><div class=CBody><p>{Function} Optional function to be called before a feature is selected.  The function should expect to be called with a feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.onSelect"></a>onSelect</h3><div class=CBody><p>{Function} Optional function to be called when a feature is selected.  The function should expect to be called with a feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.onUnselect"></a>onUnselect</h3><div class=CBody><p>{Function} Optional function to be called when a feature is unselected.  The function should expect to be called with a feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.scope"></a>scope</h3><div class=CBody><p>{Object} The scope to use with the onBeforeSelect, onSelect, onUnselect callbacks.  If null the scope will be this control.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Array(String)} To restrict selecting to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link32 onMouseOver="ShowTip(event, 'tt3', 'link32')" onMouseOut="HideTip('tt3')">OpenLayers.Layer.Vector</a>} The vector layer with a common renderer root for all layers this control is configured with (if an array of layers was passed to the constructor), or the vector layer [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link33 onMouseOver="ShowTip(event, 'tt3', 'link33')" onMouseOut="HideTip('tt3')">OpenLayers.Layer.Vector</a>} The layers this control will work on, or null if the control was configured with a single layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.callbacks"></a>callbacks</h3><div class=CBody><p>{Object} The functions that are sent to the handlers.feature for callback</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.selectStyle"></a>selectStyle</h3><div class=CBody><p>{Object} Hash of styles</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.renderIntent"></a>renderIntent</h3><div class=CBody><p>{String} key used to retrieve the select style from the layer’s style map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.handlers"></a>handlers</h3><div class=CBody><p>{Object} Object with references to multiple <a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link34 onMouseOver="ShowTip(event, 'tt4', 'link34')" onMouseOut="HideTip('tt4')">OpenLayers.Handler</a> instances.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.OpenLayers.Control.SelectFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>SelectFeature</h3><div class=CBody><p>Create a new control for selecting features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layers</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#OpenLa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.initLayer"></a>initLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initLayer: function(</td><td class=PParameter nowrap>layers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Assign the layer property.  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function ()</td></tr></table></blockquote><p>Activates the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The control was effectively activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function ()</td></tr></table></blockquote><p>Deactivates the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The control was effectively deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.unselectAll"></a>unselectAll</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unselectAll: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Unselect all selected fea [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.clickFeature"></a>clickFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clickFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called on click in a f [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.multipleSelect"></a>multipleSelect</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>multipleSelect: function()</td></tr></table></blockquote><p>Allow for multiple selected features based on <a href="#OpenLayers.Control.SelectFeature.multiple" class=LProperty id=link38 onMouseOver="ShowTip(event, 'tt1', 'link38')" onMouseOut="HideTip('tt1' [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.toggleSelect"></a>toggleSelect</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toggleSelect: function()</td></tr></table></blockquote><p>Event should toggle the selected state of a feature based on <a href="#OpenLayers.Control.SelectFeature.toggle" class=LProperty id=link40 onMouseOver="ShowTip(event, 'tt2', 'link40')" onMouseOut="HideTi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.clickoutFeature"></a>clickoutFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clickoutFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called on cli [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.overFeature"></a>overFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>overFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called on over a feature. [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.outFeature"></a>outFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>outFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called on out of a selected  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.highlight"></a>highlight</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>highlight: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Redraw feature with the select  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.unhighlight"></a>unhighlight</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unhighlight: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Redraw feature with the & [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.select"></a>select</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>select: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add feature to the layer’s selecte [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.unselect"></a>unselect</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unselect: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove feature from the layer&rsqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.selectBox"></a>selectBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>selectBox: function(</td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Callback from the handlers.box [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control.</p><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.SelectFeature.setLayer"></a>setLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayer: function(</td><td class=PParameter nowrap>layers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Attach a new layer to the control,  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>{Boolean} Allow selection of multiple geometries. </div></div><div class=CToolTip id="tt2"><div class=CProperty>{Boolean} Unselect a selected feature on click. </div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt4"><div class=CClass>Base class to construct a higher-level handler for event sequences. < [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Snapping-js.html b/doc/devdocs/files/OpenLayers/Control/Snapping-js.html
new file mode 100644
index 0000000..a7d73ed
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Snapping-js.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Snapping - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Snapping"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Snapping</h1><div class=CBody><p>Acts as a snapping agent while editing vector features.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt18', 'link18')" onMouseOut="HideTip('tt18')">OpenLayers.Contro [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happene [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.DEFAULTS"></a>DEFAULTS</h3><div class=CBody><p>Default target properties.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.greedy"></a>greedy</h3><div class=CBody><p>{Boolean} Snap to closest feature in first layer with an eligible feature.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.precedence"></a>precedence</h3><div class=CBody><p>{Array} List representing precedence of different snapping types.  Default is “node”, “vertex”, “edge”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.resolution"></a>resolution</h3><div class=CBody><p>{Float} The map resolution for the previously considered snap.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.geoToleranceCache"></a>geoToleranceCache</h3><div class=CBody><p>{Object} A cache of geo-tolerances.   Tolerance values (in map units) are calculated when the map resolution changes.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt1', 'link20')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>} The current editable layer.   Set at construction or after construction with <a href="#OpenLayers.Control.Snapping.setLayer" class=LFunction id=link21 onMouseOver="Sh [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.feature"></a>feature</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt2', 'link22')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>} The current editable feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.point"></a>point</h3><div class=CBody><p>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt3', 'link23')" onMouseOut="HideTip('tt3')">OpenLayers.Geometry.Point</a>} The currently snapped vertex.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.OpenLayers.Control.Snapping"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Snapping</h3><div class=CBody><p>Creates a new snapping control.  A control is constructed with an editable layer and a set of configuration objects for target layers.  While the control is active, dragging vertices while drawing new features or modifying existing features on the edita [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.setLayer"></a>setLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayer: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the editable layer.   Call the s [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.setTargets"></a>setTargets</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setTargets: function(</td><td class=PParameter nowrap>targets</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the targets for the snapping  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.addTargetLayer"></a>addTargetLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTargetLayer: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add a target layer with [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.addTarget"></a>addTarget</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTarget: function(</td><td class=PParameter nowrap>target</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add a configured target layer.</p><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.removeTargetLayer"></a>removeTargetLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeTargetLayer: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove a targe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.removeTarget"></a>removeTarget</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeTarget: function(</td><td class=PParameter nowrap>target</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove a target.</p><h4 clas [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.   Activating the control registers listeners for editing related events so that during feature creation and modification, moving vertices will trigger snapping.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.   Deactivating the control unregisters listeners so feature editing may proceed without engaging the snapping agent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.onSketchModified"></a>onSketchModified</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onSketchModified: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Registered as a l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.onVertexModified"></a>onVertexModified</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onVertexModified: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Registered as a l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.considerSnapping"></a>considerSnapping</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>considerSnapping: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>loc</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.testTarget"></a>testTarget</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>testTarget: function(</td><td class=PParameter nowrap>target,</td></tr><tr><td></td><td class=PParameter nowrap>loc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.getGeoTolerance"></a>getGeoTolerance</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeoTolerance: function(</td><td class=PParameter nowrap>tolerance</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate a tole [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Snapping.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the control.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt3"><div class=CClass>Point geometry class.</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/Split-js.html b/doc/devdocs/files/OpenLayers/Control/Split-js.html
new file mode 100644
index 0000000..13f7ea9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/Split-js.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.Split - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.Split"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Split</h1><div class=CBody><p>Acts as a split feature agent while editing vector features.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt13', 'link14')" onMouseOut="HideTip('tt13')">OpenLayers.Control [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>control.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>} The target layer with features to be split.  Set at construction or after construction with <setLayer>.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.source"></a>source</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt1', 'link17')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>} Optional source layer.   Any newly created or modified features from this layer will be used to split features on the target layer.   If not provided, a temporary [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.sourceOptions"></a>sourceOptions</h3><div class=CBody><p>{Options} If a temporary sketch layer is created, these layer options will be applied.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.tolerance"></a>tolerance</h3><div class=CBody><p>{Number} Distance between the calculated intersection and a vertex on the source geometry below which the existing vertex will be used for the split.   Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.edge"></a>edge</h3><div class=CBody><p>{Boolean} Allow splits given intersection of edges only.   Default is true.   If false, a vertex on the source must be within the <a href="#OpenLayers.Control.Split.tolerance" class=LProperty id=link18 onMouseOver="ShowTip(event, 'tt14', 'link18')" onMouseOut="HideTip('tt14')">tolerance</a> distance of the calculated intersection for a split to occu [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.deferDelete"></a>deferDelete</h3><div class=CBody><p>{Boolean} Instead of removing features from the layer, set feature states of split features to DELETE.   This assumes a save strategy or other component is in charge of removing features from the layer.   Default is false.   If false, split features will be immediately deleted from the layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.mutual"></a>mutual</h3><div class=CBody><p>{Boolean} If source and target layers are the same, split source features and target features where they intersect.   Default is true.   If false, only target features will be split.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.targetFilter"></a>targetFilter</h3><div class=CBody><p>{OpenLayers.Filter} Optional filter that will be evaluated to determine if a feature from the target layer is eligible for splitting.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.sourceFilter"></a>sourceFilter</h3><div class=CBody><p>{OpenLayers.Filter} Optional filter that will be evaluated to determine if a feature from the target layer is eligible for splitting.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.handler"></a>handler</h3><div class=CBody><p>{<a href="../Handler/Path-js.html#OpenLayers.Handler.Path" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt2', 'link19')" onMouseOut="HideTip('tt2')">OpenLayers.Handler.Path</a>} The temporary sketch handler created if no source layer is provided.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.OpenLayers.Control.Split"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Split</h3><div class=CBody><p>Creates a new split control.  A control is constructed with a target layer and an optional source layer.  While the control is active, creating new features or modifying existing features on the source layer will result in splitting any eligible features on the  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.setSource"></a>setSource</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSource: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the source layer for edits layer.</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the control.   Activating the control registers listeners for editing related events so that during feature creation and modification, features in the target will be considered for splitting.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the control.   Deactivating the control unregisters listeners so feature editing may proceed without engaging the split agent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.onSketchComplete"></a>onSketchComplete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onSketchComplete: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Registered as a list [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.afterFeatureModified"></a>afterFeatureModified</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>afterFeatureModified: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Register [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.removeByGeometry"></a>removeByGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeByGeometry: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.isEligible"></a>isEligible</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isEligible: function(</td><td class=PParameter nowrap>target</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test if a target feature is eligible  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.considerSplit"></a>considerSplit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>considerSplit: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Decide whether or not to sp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.geomsToFeatures"></a>geomsToFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>geomsToFeatures: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>geoms</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.Split.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the control.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CClass>Handler to draw a path on the map. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSource: function(</td><td cl [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/TransformFeature-js.html b/doc/devdocs/files/OpenLayers/Control/TransformFeature-js.html
new file mode 100644
index 0000000..e7b9a8f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/TransformFeature-js.html
@@ -0,0 +1,104 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.TransformFeature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.TransformFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TransformFeature</h1><div class=CBody><p>Control to transform features with a standard transformation box.</p><h4 class=CHeading>Inherits From</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt14', 'link17')" onMouseOut="HideTip( [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types</h4><ul><li><b>beforesetfeature</b> Triggered before a feature is set for tranformation.  The feature will not be set if a listener returns false.  Listeners receive a <b>feature</b> property, with the feature that will be set for transformation.  Listeners are allowed to set the co [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Array(String)} To restrict transformation to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt1', 'link21')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.preserveAspectRatio"></a>preserveAspectRatio</h3><div class=CBody><p>{Boolean} set to true to not change the feature’s aspect ratio.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.rotate"></a>rotate</h3><div class=CBody><p>{Boolean} set to false if rotation should be disabled.  Default is true.  To be passed with the constructor or set when the control is not active.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.feature"></a>feature</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt2', 'link22')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>} Feature currently available for transformation.  Read-only, use <a href="#OpenLayers.Control.TransformFeature.setFeature" class=LFunction id=link23  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.renderIntent"></a>renderIntent</h3><div class=CBody><p>{String|Object} Render intent for the transformation box and handles.  A symbolizer object can also be provided here.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.rotationHandleSymbolizer"></a>rotationHandleSymbolizer</h3><div class=CBody><p>{Object|String} Optional.  A custom symbolizer for the rotation handles.  A render intent can also be provided here.  Defaults to</p><blockquote><pre>{
+    stroke: false,
+    pointRadius: 10,
+    fillOpacity: 0,
+    cursor: "pointer"
+}</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.box"></a>box</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link24 onMouseOver="ShowTip(event, 'tt2', 'link24')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>} The transformation box rectangle.  Read-only.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.center"></a>center</h3><div class=CBody><p>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt3', 'link25')" onMouseOut="HideTip('tt3')">OpenLayers.Geometry.Point</a>} The center of the feature bounds.  Read-only.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.scale"></a>scale</h3><div class=CBody><p>{Float} The scale of the feature, relative to the scale the time the feature was set.  Read-only, except for <b>beforesetfeature</b> listeners.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.ratio"></a>ratio</h3><div class=CBody><p>{Float} The ratio of the feature relative to the ratio the time the feature was set.  Read-only, except for <b>beforesetfeature</b> listeners.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.rotation"></a>rotation</h3><div class=CBody><p>{Integer} the current rotation angle of the box.  Read-only, except for <b>beforesetfeature</b> listeners.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.handles"></a>handles</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link26 onMouseOver="ShowTip(event, 'tt2', 'link26')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>)} The 8 handles currently available for scaling/resizing.  Numbered counterclockwise, starting from the southwest corner.  Read-only.</p>< [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.rotationHandles"></a>rotationHandles</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link27 onMouseOver="ShowTip(event, 'tt2', 'link27')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>)} The 4 rotation handles currently available for rotating.  Numbered counterclockwise, starting from the southwest corner.&nbsp [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.dragControl"></a>dragControl</h3><div class=CBody><p>{<a href="DragFeature-js.html#OpenLayers.Control.DragFeature" class=LClass id=link28 onMouseOver="ShowTip(event, 'tt4', 'link28')" onMouseOut="HideTip('tt4')">OpenLayers.Control.DragFeature</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.OpenLayers.Control.TransformFeature"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>TransformFeature</h3><div class=CBody><p>Create a new transform feature control.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer/Vector-js.html#Ope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activates the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivates the control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bor [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.setFeature"></a>setFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setFeature: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>initialParams</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.createBox"></a>createBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createBox: function()</td></tr></table></blockquote><p>Creates the box with all handles and transformation handles.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.createControl"></a>createControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createControl: function()</td></tr></table></blockquote><p>Creates a DragFeature control for this control.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.drawHandles"></a>drawHandles</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>drawHandles: function()</td></tr></table></blockquote><p>Draws the handles to match the box.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.transformFeature"></a>transformFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transformFeature: function(</td><td class=PParameter nowrap>mods</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Transforms [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.TransformFeature.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Take care of things that are not handled in superclass.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt3"><div class=CClass>Point geometry class.</div></div><div class=CToolTip id="tt4"><div class=CClass>The DragFeature control moves a feature with a drag of the mouse. </div></d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/WMSGetFeatureInfo-js.html b/doc/devdocs/files/OpenLayers/Control/WMSGetFeatureInfo-js.html
new file mode 100644
index 0000000..708bbf6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/WMSGetFeatureInfo-js.html
@@ -0,0 +1,110 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.WMSGetFeatureInfo - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>WMSGetFeatureInfo</h1><div class=CBody><p>The WMSGetFeatureInfo control uses a WMS query to get information about a point on the map.   The information may be in a display-friendly format such as HTML, or a machine-friendly format such as GML, depending on the server’s capabilitie [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.hover"></a>hover</h3><div class=CBody><p>{Boolean} Send GetFeatureInfo requests when mouse stops moving.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.drillDown"></a>drillDown</h3><div class=CBody><p>{Boolean} Drill down over all WMS layers in the map.  When using drillDown mode, hover is not possible, and an infoFormat that returns parseable features is required.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.maxFeatures"></a>maxFeatures</h3><div class=CBody><p>{Integer} Maximum number of features to return from a WMS query.  This sets the feature_count parameter on WMS GetFeatureInfo requests.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.clickCallback"></a>clickCallback</h3><div class=CBody><p>{String} The click callback to register in the {<a href="../Handler/Click-js.html#OpenLayers.Handler.Click" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt1', 'link22')" onMouseOut="HideTip('tt1')">OpenLayers.Handler.Click</a>} object created when the hover option is set to false.  Default is “click”.</p>< [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="../Layer/WMS-js.html#OpenLayers.Layer.WMS" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt2', 'link23')" onMouseOut="HideTip('tt2')">OpenLayers.Layer.WMS</a>)} The layers to query for feature info.  If omitted, all map WMS layers with a url that matches this <a href="#OpenLayers.Control.WMSGetFeatureInfo.url" class= [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.queryVisible"></a>queryVisible</h3><div class=CBody><p>{Boolean} If true, filter out hidden layers when searching the map for layers to query.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.url"></a>url</h3><div class=CBody><p>{String} The URL of the WMS service to use.   If not provided, the url of the first eligible layer will be used.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.layerUrls"></a>layerUrls</h3><div class=CBody><p>{Array(String)} Optional list of urls for layers that should be queried.  This can be used when the layer url differs from the url used for making GetFeatureInfo requests (in the case of a layer using cached tiles).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.infoFormat"></a>infoFormat</h3><div class=CBody><p>{String} The mimetype to request from the server</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.vendorParams"></a>vendorParams</h3><div class=CBody><p>{Object} Additional parameters that will be added to the request, for WMS implementations that support them.  This could e.g. look like</p><blockquote><pre>{
+    radius: 5
+}</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.format"></a>format</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link26 onMouseOver="ShowTip(event, 'tt3', 'link26')" onMouseOut="HideTip('tt3')">OpenLayers.Format</a>} A format for parsing GetFeatureInfo responses.  Default is <a href="../Format/WMSGetFeatureInfo-js.html#OpenLayers.Format.WMSGetFeatureInfo" class=LClass id=link27 onMouseOv [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Optional properties to set on the format (if one is not provided in the <a href="#OpenLayers.Control.WMSGetFeatureInfo.format" class=LProperty id=link28 onMouseOver="ShowTip(event, 'tt4', 'link28')" onMouseOut="HideTip('tt4')">format</a> property.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Additional options for the handlers used by this control, e.g.</p><blockquote><pre>{
+    "click": {delay: 100},
+    "hover": {delay: 300}
+}</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.handler"></a>handler</h3><div class=CBody><p>{Object} Reference to the <a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link29 onMouseOver="ShowTip(event, 'tt5', 'link29')" onMouseOut="HideTip('tt5')">OpenLayers.Handler</a> for this control</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.hoverRequest"></a>hoverRequest</h3><div class=CBody><p>{<a href="../Request-js.html#OpenLayers.Request" class=LClass id=link30 onMouseOver="ShowTip(event, 'tt6', 'link30')" onMouseOut="HideTip('tt6')">OpenLayers.Request</a>} contains the currently running hover request (if any).</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types (in addition to those from <a href="../Control-js.html#OpenLayers.Control" class=LClass id=link31 onMouseOver="ShowTip(event, 'tt21', 'link31')" onMouseOut="HideTip('tt21')">OpenLayers.Control</a>)</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>befor [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.OpenLayers.Control.WMSGetFeatureInfo"></a><OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>WMSGetFeatureInfo></h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function ()</td></tr></table></blockquote><p>Activates the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The control was effectively activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function ()</td></tr></table></blockquote><p>Deactivates the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The control was effectively deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.getInfoForClick"></a>getInfoForClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getInfoForClick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called on cli [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.getInfoForHover"></a>getInfoForHover</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getInfoForHover: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Pause callbac [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.cancelHover"></a>cancelHover</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancelHover: function()</td></tr></table></blockquote><p>Cancel callback for the hover handler</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.findLayers"></a>findLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>findLayers: function()</td></tr></table></blockquote><p>Internal method to get the layers, independent of whether we are inspecting the map or using a client-provided array</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.urlMatches"></a>urlMatches</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>urlMatches: function(</td><td class=PParameter nowrap>url</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test to see if the provided  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.buildWMSOptions"></a>buildWMSOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildWMSOptions: function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>layers,</td></tr><tr><td></td><td class=PParameter no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.getStyleNames"></a>getStyleNames</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getStyleNames: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Gets the STYLES p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.request"></a>request</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>request: function(</td><td class=PParameter nowrap>clickPosition,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.triggerGetFeatureInfo"></a>triggerGetFeatureInfo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>triggerGetFeatureInfo: function(</td><td class=PParameter nowrap>request,</td></tr><tr><td></td><td class=PParameter nowrap>xy,</td></tr><tr><td></td><td c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMSGetFeatureInfo.handleResponse"></a>handleResponse</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleResponse: function(</td><td class=PParameter nowrap>xy,</td></tr><tr><td></td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A handler for mouse clicks. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.WMS are used to display data from OGC Web Mapping Services. </div></div><div class=CToolTip id="tt3"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt4"><div class=CProperty>{OpenLayers.Format} A format for parsing GetFeatureInfo responses. </div></div><div cla [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/WMTSGetFeatureInfo-js.html b/doc/devdocs/files/OpenLayers/Control/WMTSGetFeatureInfo-js.html
new file mode 100644
index 0000000..5ad8532
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/WMTSGetFeatureInfo-js.html
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.WMTSGetFeatureInfo - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>WMTSGetFeatureInfo</h1><div class=CBody><p>The WMTSGetFeatureInfo control uses a WMTS query to get information about a point on the map.   The information may be in a display-friendly format such as HTML, or a machine-friendly format such as GML, depending on the server’s capabil [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.hover"></a>hover</h3><div class=CBody><p>{Boolean} Send GetFeatureInfo requests when mouse stops moving.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.requestEncoding"></a>requestEncoding</h3><div class=CBody><p>{String} One of “KVP” or “REST”.   Only KVP encoding is supported at this time.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.drillDown"></a>drillDown</h3><div class=CBody><p>{Boolean} Drill down over all WMTS layers in the map.  When using drillDown mode, hover is not possible.   A getfeatureinfo event will be fired for each layer queried.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.maxFeatures"></a>maxFeatures</h3><div class=CBody><p>{Integer} Maximum number of features to return from a WMTS query.  This sets the feature_count parameter on WMTS GetFeatureInfo requests.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.clickCallback"></a>clickCallback</h3><div class=CBody><p>{String} The click callback to register in the {<a href="../Handler/Click-js.html#OpenLayers.Handler.Click" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt1', 'link18')" onMouseOut="HideTip('tt1')">OpenLayers.Handler.Click</a>} object created when the hover option is set to false.  Default is “click”.</p> [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="../Layer/WMTS-js.html#OpenLayers.Layer.WMTS" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt2', 'link19')" onMouseOut="HideTip('tt2')">OpenLayers.Layer.WMTS</a>)} The layers to query for feature info.  If omitted, all map WMTS layers will be considered.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.queryVisible"></a>queryVisible</h3><div class=CBody><p>{Boolean} Filter out hidden layers when searching the map for layers to query.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.infoFormat"></a>infoFormat</h3><div class=CBody><p>{String} The mimetype to request from the server</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.vendorParams"></a>vendorParams</h3><div class=CBody><p>{Object} Additional parameters that will be added to the request, for WMTS implementations that support them.  This could e.g. look like</p><blockquote><pre>{
+    radius: 5
+}</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.format"></a>format</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt3', 'link20')" onMouseOut="HideTip('tt3')">OpenLayers.Format</a>} A format for parsing GetFeatureInfo responses.  Default is <a href="../Format/WMSGetFeatureInfo-js.html#OpenLayers.Format.WMSGetFeatureInfo" class=LClass id=link21 onMouseO [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Optional properties to set on the format (if one is not provided in the <a href="#OpenLayers.Control.WMTSGetFeatureInfo.format" class=LProperty id=link22 onMouseOver="ShowTip(event, 'tt4', 'link22')" onMouseOut="HideTip('tt4')">format</a> property.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.handlerOptions"></a>handlerOptions</h3><div class=CBody><p>{Object} Additional options for the handlers used by this control, e.g.</p><blockquote><pre>{
+    "click": {delay: 100},
+    "hover": {delay: 300}
+}</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.handler"></a>handler</h3><div class=CBody><p>{Object} Reference to the <a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt5', 'link23')" onMouseOut="HideTip('tt5')">OpenLayers.Handler</a> for this control</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.hoverRequest"></a>hoverRequest</h3><div class=CBody><p>{<a href="../Request-js.html#OpenLayers.Request" class=LClass id=link24 onMouseOver="ShowTip(event, 'tt6', 'link24')" onMouseOut="HideTip('tt6')">OpenLayers.Request</a>} contains the currently running hover request (if any).</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><h4 class=CHeading>Supported event types (in addition to those from <a href="../Control-js.html#OpenLayers.Control" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt17', 'link25')" onMouseOut="HideTip('tt17')">OpenLayers.Control</a>)</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>befo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.pending"></a>pending</h3><div class=CBody><p>{Number}  The number of pending requests.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.OpenLayers.Control.WMTSGetFeatureInfo"></a><OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>WMTSGetFeatureInfo></h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function ()</td></tr></table></blockquote><p>Activates the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The control was effectively activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function ()</td></tr></table></blockquote><p>Deactivates the control.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The control was effectively deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.getInfoForClick"></a>getInfoForClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getInfoForClick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called on cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.getInfoForHover"></a>getInfoForHover</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getInfoForHover: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Pause callba [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.cancelHover"></a>cancelHover</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancelHover: function()</td></tr></table></blockquote><p>Cancel callback for the hover handler</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.findLayers"></a>findLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>findLayers: function()</td></tr></table></blockquote><p>Internal method to get the layers, independent of whether we are inspecting the map or using a client-provided array</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.buildRequestOptions"></a>buildRequestOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildRequestOptions: function(</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>xy</td><td class=PAfterParameters nowr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.request"></a>request</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>request: function(</td><td class=PParameter nowrap>xy,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.handleResponse"></a>handleResponse</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleResponse: function(</td><td class=PParameter nowrap>xy,</td></tr><tr><td></td><td class=PParameter nowrap>request,</td></tr><tr><td></td><td class=PParameter nowr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.WMTSGetFeatureInfo.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the control.</ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A handler for mouse clicks. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of the WMTS class allow viewing of tiles from a service that implements the OGC WMTS specification version 1.0.0.</div></div><div class=CToolTip id="tt3"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt4"><div class=CProperty>{OpenLayers.Format} A format for parsing GetFeatureInf [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/ZoomBox-js.html b/doc/devdocs/files/OpenLayers/Control/ZoomBox-js.html
new file mode 100644
index 0000000..4661ae1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/ZoomBox-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomBox - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomBox"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomBox</h1><div class=CBody><p>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.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LC [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomBox.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomBox.type"></a>type</h3><div class=CBody><p>{OpenLayers.Control.TYPE}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomBox.out"></a>out</h3><div class=CBody><p>{Boolean} Should the control be used for zooming out?</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomBox.alwaysZoom"></a>alwaysZoom</h3><div class=CBody><p>{Boolean} Always zoom in/out, when box drawed</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomBox.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomBox.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomBox.zoomBox"></a>zoomBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomBox: function (</td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bor [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomBox: function (</td><td class=PParameter nowrap>position</td><td class=PAfterParameter [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/ZoomIn-js.html b/doc/devdocs/files/OpenLayers/Control/ZoomIn-js.html
new file mode 100644
index 0000000..9f6e5b3
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/ZoomIn-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomIn - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomIn"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomIn</h1><div class=CBody><p>The ZoomIn control is a button to increase the zoom level of a map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Co [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomIn.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomIn.type"></a>type</h3><div class=CBody><p>{String} The type of <a href="../Control-js.html#OpenLayers.Control" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a> -- When added to a <a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt2', 'link6')" onMouseOut="HideTip('tt2')">Control.Pa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomIn.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomIn.trigger"></a>trigger</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote></div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/ZoomOut-js.html b/doc/devdocs/files/OpenLayers/Control/ZoomOut-js.html
new file mode 100644
index 0000000..2bd1ef2
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/ZoomOut-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomOut - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomOut"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomOut</h1><div class=CBody><p>The ZoomOut control is a button to decrease the zoom level of a map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Control-js.html#OpenLayers.Control" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomOut.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomOut.type"></a>type</h3><div class=CBody><p>{String} The type of <a href="../Control-js.html#OpenLayers.Control" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a> -- When added to a <a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt2', 'link6')" onMouseOut="HideTip('tt2')">Control.P [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomOut.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomOut.trigger"></a>trigger</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote></div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/ZoomPanel-js.html b/doc/devdocs/files/OpenLayers/Control/ZoomPanel-js.html
new file mode 100644
index 0000000..6b4c40c
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/ZoomPanel-js.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomPanel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomPanel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomPanel</h1><div class=CBody><p>The ZoomPanel control is a compact collecton of 3 zoom controls: a <a href="ZoomIn-js.html#OpenLayers.Control.ZoomIn" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Control.ZoomIn</a>, a <a href="ZoomToMaxEx [...]
+  <link rel="stylesheet" href="../theme/default/ie6-style.css" type="text/css" />
+<![endif]--></pre></blockquote><h4 class=CHeading>Inherits from</h4><ul><li><a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt4', 'link7')" onMouseOut="HideTip('tt4')">OpenLayers.Control.Panel</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Control.ZoomPanel" >Ope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomPanel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomPanel.OpenLayers.Control.ZoomPanel"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomPanel</h3><div class=CBody><p>Add the three zooming controls.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be used to ext [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The ZoomIn control is a button to increase the zoom level of a map.</div></div><div class=CToolTip id="tt2"><div class=CClass>The ZoomToMaxExtent control is a button that zooms out to the maximum extent of the map. </div></div><div class=CToolTip id="tt3"><div class=CClass>The ZoomOut control is a button to decrease the zoom level of a map.</div></div><div class=CToolTip id="tt4"><div class=CClass>The Panel control is a container for other c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Control/ZoomToMaxExtent-js.html b/doc/devdocs/files/OpenLayers/Control/ZoomToMaxExtent-js.html
new file mode 100644
index 0000000..60028e9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Control/ZoomToMaxExtent-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Control.ZoomToMaxExtent - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Control.ZoomToMaxExtent"></a>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ZoomToMaxExtent</h1><div class=CBody><p>The ZoomToMaxExtent control is a button that zooms out to the maximum extent of the map.  It is designed to be used with a <a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt2', 'link4')" onMouseOut [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomToMaxExtent.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomToMaxExtent.type"></a>type</h3><div class=CBody><p>{String} The type of <a href="../Control-js.html#OpenLayers.Control" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a> -- When added to a <a href="Panel-js.html#OpenLayers.Control.Panel" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt2', 'link7')" onMouseOut="HideTip('tt2')">C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomToMaxExtent.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Control.ZoomToMaxExtent.trigger"></a>trigger</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote><p>Do the zoom.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([2, 3, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>The Panel control is a container for other controls. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>trigger: function()</td></tr></table></blockquote>Do the zoom.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Events-js.html b/doc/devdocs/files/OpenLayers/Events-js.html
new file mode 100644
index 0000000..0a80071
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Events-js.html
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Event - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Event"></a>OpenLayers.<span class=HB> </span>Event</h1><div class=CBody><p>Utility functions for event handling.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Event" >OpenLayers.<span class=HB> </span>Event</a></td><td class=S [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.observers"></a>observers</h3><div class=CBody><p>{Object} A hashtable cache of the event observers.  Keyed by element._eventCacheID</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_BACKSPACE"></a>KEY_BACKSPACE</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_TAB"></a>KEY_TAB</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_RETURN"></a>KEY_RETURN</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_ESC"></a>KEY_ESC</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_LEFT"></a>KEY_LEFT</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_UP"></a>KEY_UP</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_RIGHT"></a>KEY_RIGHT</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_DOWN"></a>KEY_DOWN</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.KEY_DELETE"></a>KEY_DELETE</h3><div class=CBody><p>{int}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.element"></a>element</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>element: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Cross browser event element detection.</p><h4 class=CHe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.isLeftClick"></a>isLeftClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isLeftClick: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether event was caused by a lef [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.isRightClick"></a>isRightClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isRightClick: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether event was caused by a  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.stop"></a>stop</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>stop: function(</td><td class=PParameter nowrap>event,</td></tr><tr><td></td><td class=PParameter nowrap>allowDefault</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.findElement"></a>findElement</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>findElement: function(</td><td class=PParameter nowrap>event,</td></tr><tr><td></td><td class=PParameter nowrap>tagName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.observe"></a>observe</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>observe: function(</td><td class=PParameter nowrap>elementParam,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>observer,</td></tr><tr><td></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.stopObservingElement"></a>stopObservingElement</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>stopObservingElement: function(</td><td class=PParameter nowrap>elementParam</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given the [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event._removeElementObservers"></a>_removeElementObservers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>_removeElementObservers: function(</td><td class=PParameter nowrap>elementObservers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.stopObserving"></a>stopObserving</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>stopObserving: function(</td><td class=PParameter nowrap>elementParam,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>observer,</td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Event.unloadCache"></a>unloadCache</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>unloadCache: function()</td></tr></table></blockquote><p>Cycle through all the element entries in the events cache and call stopObservingElement on each.</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Events"></a>OpenLayers.<span class=HB> </span>Events</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Events.Constants" >Constants</a></td><td class=SDescription></td></tr><tr class="SConstant SIndent1 SMarked"><td class=SEntry><a href="#O [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.BROWSER_EVENTS"></a>BROWSER_EVENTS</h3><div class=CBody><p>{Array(String)} supported events</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.listeners"></a>listeners</h3><div class=CBody><p>{Object} Hashtable of Array(Function): events listener functions</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.object"></a>object</h3><div class=CBody><p>{Object}  the code object issuing application events</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.element"></a>element</h3><div class=CBody><p>{DOMElement}  the DOM element receiving browser events</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.eventTypes"></a>eventTypes</h3><div class=CBody><p>{Array(String)}  list of support application events</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.eventHandler"></a>eventHandler</h3><div class=CBody><p>{Function}  bound event handler attached to elements</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.fallThrough"></a>fallThrough</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.includeXY"></a>includeXY</h3><div class=CBody><p>{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 event object that is passed.  (Prior to OpenLayers 2.7, this was true by default.)  Otherwise, you can call the getMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.clearMouseListener"></a>clearMouseListener</h3><div class=CBody><p>A version of <a href="#OpenLayers.Events.clearMouseCache" class=LFunction id=link43 onMouseOver="ShowTip(event, 'tt11', 'link43')" onMouseOut="HideTip('tt11')">clearMouseCache</a> that is bound to this instance so that it can be used with <a href="#OpenLayers.Event.observe" class=LFunction id=link44 onMouseOver="ShowTip(event, 'tt6', 'lin [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.OpenLayers.Events"></a>OpenLayers.<span class=HB> </span>Events</h3><div class=CBody><p>Construct an OpenLayers.Events object.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} The js object to which this Events object  is being</td></tr><tr><td class=CDLEntry>added element</td><td [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.addEventType"></a>addEventType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addEventType: function(</td><td class=PParameter nowrap>eventName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add a new event type to this events [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.attachToElement"></a>attachToElement</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>attachToElement: function (</td><td class=PParameter nowrap>element</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.on"></a>on</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>on: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Convenience method for registering listeners with a common scope.&nb [...]
+events.on({"loadstart", loadStartListener});
+
+// this is equivalent to the following
+events.register("loadstart", undefined, loadStartListener);
+
+// register multiple listeners to be called with the same `this` object
+events.on({
+    "loadstart": loadStartListener,
+    "loadend": loadEndListener,
+    scope: object
+});
+
+// this is equivalent to the following
+events.register("loadstart", object, loadStartListener);
+events.register("loadstart", object, loadEndListener);</pre></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.register"></a>register</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>register: function (</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>func</td><td class=PAfterParameters  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.registerPriority"></a>registerPriority</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>registerPriority: function (</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>func</td><td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.un"></a>un</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>un: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Convenience method for unregistering listeners with a common scope.& [...]
+events.un({"loadstart", loadStartListener});
+
+// this is equivalent to the following
+events.unregister("loadstart", undefined, loadStartListener);
+
+// unregister multiple listeners with the same `this` object
+events.un({
+    "loadstart": loadStartListener,
+    "loadend": loadEndListener,
+    scope: object
+});
+
+// this is equivalent to the following
+events.unregister("loadstart", object, loadStartListener);
+events.unregister("loadstart", object, loadEndListener);</pre></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.unregister"></a>unregister</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unregister: function (</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>func</td><td class=PAfterParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.remove"></a>remove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>remove: function(</td><td class=PParameter nowrap>type</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove all listeners for a given event type.  If type [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.triggerEvent"></a>triggerEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>triggerEvent: function (</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.handleBrowserEvent"></a>handleBrowserEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleBrowserEvent: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Basically just a wrapp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.clearMouseCache"></a>clearMouseCache</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearMouseCache: function()</td></tr></table></blockquote><p>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.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Events.getMousePosition"></a>getMousePosition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMousePosition: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>element: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Cross browser event element detection.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellsp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Feature-js.html b/doc/devdocs/files/OpenLayers/Feature-js.html
new file mode 100644
index 0000000..77d3c79
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Feature-js.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Feature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Feature"></a>OpenLayers.<span class=HB> </span>Feature</h1><div class=CBody><p>Features are combinations of geography and attributes.  The OpenLayers.Feature class specifically combines a marker and a lonlat.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.layer"></a>layer</h3><div class=CBody><p>{<a href="Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.id"></a>id</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.lonlat"></a>lonlat</h3><div class=CBody><p>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.data"></a>data</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.marker"></a>marker</h3><div class=CBody><p>{<a href="Marker-js.html#OpenLayers.Marker" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt2', 'link12')" onMouseOut="HideTip('tt2')">OpenLayers.Marker</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.popupClass"></a>popupClass</h3><div class=CBody><p>{<a href="BaseTypes/Class-js.html#OpenLayers.Class" class=LConstructor id=link13 onMouseOver="ShowTip(event, 'tt3', 'link13')" onMouseOut="HideTip('tt3')">OpenLayers.Class</a>} The class which will be used to instantiate a new Popup.  Default is <a href="Popup/AnchoredBubble-js.html#OpenLayers.Popup.AnchoredBubble" class=LClass >OpenLayers.Popup.An [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.popup"></a>popup</h3><div class=CBody><p>{<a href="Popup-js.html#OpenLayers.Popup" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt4', 'link14')" onMouseOut="HideTip('tt4')">OpenLayers.Popup</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.OpenLayers.Feature"></a>OpenLayers.<span class=HB> </span>Feature</h3><div class=CBody><p>Constructor for features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>}</td></tr><tr><td class=CDLEntry>lonlat</td><td  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.onScreen"></a>onScreen</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onScreen:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the feature is currently visible on screen (based on its ‘lonlat’ property)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.createMarker"></a>createMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createMarker: function()</td></tr></table></blockquote><p>Based on the data associated with the Feature, create and return a marker object.</p><h4 class=CHeading>Returns</h4><p>{<a href="Marker-js.html#OpenLayers.Marker" class=LClass id=link17 onMouseOver="ShowTip(event, 't [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.destroyMarker"></a>destroyMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyMarker: function()</td></tr></table></blockquote><p>Destroys marker.  If user overrides the createMarker() function, s/he should be able to also specify an alternative function for destroying it</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.createPopup"></a>createPopup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createPopup: function(</td><td class=PParameter nowrap>closeBox</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Creates a popup object created from th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.destroyPopup"></a>destroyPopup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyPopup: function()</td></tr></table></blockquote><p>Destroys the popup created via createPopup.</p><p>As with the marker, if user overrides the createPopup() function, s/he should also be able to override the destruction</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([4, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Marker are a combination of a OpenLayers.LonLat and an OpenLayers.Icon.</div></div><div class=CToolTip id="tt3"><div class=CConstructor>Base class used to construct all other classes. </div></div><div class=CToolTip id="tt4"><div class=CClass>A popup is a small div that can opened and closed on the map. </div> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Feature/Vector-js.html b/doc/devdocs/files/OpenLayers/Feature/Vector-js.html
new file mode 100644
index 0000000..0af4475
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Feature/Vector-js.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Feature.Vector - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Feature.Vector"></a>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>Vector</h1><div class=CBody><p>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 <a href="#OpenLayers.Feature.Vec [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.fid"></a>fid</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.geometry"></a>geometry</h3><div class=CBody><p>{<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt1', 'link17')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.attributes"></a>attributes</h3><div class=CBody><p>{Object} This object holds arbitrary, serializable properties that describe the feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.bounds"></a>bounds</h3><div class=CBody><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt2', 'link18')" onMouseOut="HideTip('tt2')">OpenLayers.Bounds</a>} The box bounding that feature’s geometry, that property can be set by an <a href="../Format-js.html#OpenLayers.Format" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.state"></a>state</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.style"></a>style</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.url"></a>url</h3><div class=CBody><p>{String} If this property is set it will be taken into account by {<OpenLayers.HTTP>} when upadting or deleting the feature.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.renderIntent"></a>renderIntent</h3><div class=CBody><p>{String} rendering intent currently being used</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.OpenLayers.Feature.Vector"></a>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>Vector</h3><div class=CBody><p>Create a vector feature.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link20 onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function ()</td></tr></table></blockquote><p>Create a clone of this vector feature.   Does not set any non-standard properties.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Feature.Vector.OpenLayers.Feature.Vector" class=LConstructor id=link22 onMouseOver [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.onScreen"></a>onScreen</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onScreen:function(</td><td class=PParameter nowrap>boundsOnly</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether the feature is within [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.getVisibility"></a>getVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getVisibility: function()</td></tr></table></blockquote><p>Determine whether the feature is displayed or not.  It may not displayed because:</p><ul><li>its style display property is set to ‘none’,</li><li>it doesn’t belong to any layer,</li>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.createMarker"></a>createMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createMarker: function()</td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>HACK</td><td class=CDLDescription>we need to decide if all vector features should be able to create markers</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.destroyMarker"></a>destroyMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyMarker: function()</td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>HACK</td><td class=CDLDescription>we need to decide if all vector features should be able to delete markers</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.createPopup"></a>createPopup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createPopup: function()</td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>HACK</td><td class=CDLDescription>we need to decide if all vector features should be able to create popups</td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.atPoint"></a>atPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>atPoint: function(</td><td class=PParameter nowrap>lonlat,</td></tr><tr><td></td><td class=PParameter nowrap>toleranceLon,</td></tr><tr><td></td><td class=PParameter nowrap>toleranceLat</td><td  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.destroyPopup"></a>destroyPopup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyPopup: function()</td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>HACK</td><td class=CDLDescription>we need to decide if all vector features should be able to delete popups</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>location</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Moves the feature and redraws it at its new location [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.toState"></a>toState</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toState: function(</td><td class=PParameter nowrap>state</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the new state</p><h4 class=CHeading>Param [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.Vector.OpenLayers.Feature.Vector.style"></a>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>Vector.<span class=HB> </span>style</h3><div class=CBody><p>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 [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([4, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A Geometry is a description of a geographic object. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt3"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Feature/WFS-js.html b/doc/devdocs/files/OpenLayers/Feature/WFS-js.html
new file mode 100644
index 0000000..7ab2e17
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Feature/WFS-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Feature.WFS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Feature.WFS"></a>OpenLayers.<span class=HB> </span>Feature.WFS</h1><div class=CBody><p>WFS handling class, for use as a featureClass on the WFS layer for handling ‘point’ WFS types.  Good for subclassing when creating a custom WFS like XML application.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link3  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.WFS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.WFS.OpenLayers.Feature.WFS"></a>OpenLayers.<span class=HB> </span>Feature.WFS</h3><div class=CBody><p>Create a WFS feature.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>layer</td><td class=CDLDescription>{<a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>}</td></tr><tr><td class=CDLEntry>xmlN [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.WFS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.WFS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Feature.WFS.processXMLNode"></a>processXMLNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>processXMLNode: function(</td><td class=PParameter nowrap>xmlNode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When passed an xmlNode, pa [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([4, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory leaks</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>processXMLNode: funct [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Filter-js.html b/doc/devdocs/files/OpenLayers/Filter-js.html
new file mode 100644
index 0000000..cc541ca
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Filter-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter"></a>OpenLayers.<span class=HB> </span>Filter</h1><div class=CBody><p>This class represents an OGC Filter.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Filter" >OpenLayers.<span class=HB> </span>Filter</a></td><td clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.OpenLayers.Filter"></a>OpenLayers.<span class=HB> </span>Filter</h3><div class=CBody><p>This is an abstract class.   Create an instance of a filter subclass.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Remove reference to anything added.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Evaluates this filter in a specific context.&nbsp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.  Should be implementted by subclasses.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.OpenLayers.Filter" class=LConstructor id=link5 onMouseOver="ShowTip(event, 'tt4', 'link5')" onMouseOut="Hide [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Remove reference to anything added.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Filter/Comparison-js.html b/doc/devdocs/files/OpenLayers/Filter/Comparison-js.html
new file mode 100644
index 0000000..d79c816
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Filter/Comparison-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter.Comparison - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter.Comparison"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Comparison</h1><div class=CBody><p>This class represents a comparison filter.</p><p>Inherits from</p><ul><li><a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Filter</a></li></ul><!--START_ND_SUMMARY [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.type"></a>type</h3><div class=CBody><p>{String} type: type of the comparison.  This is one of</p><ul><li>OpenLayers.Filter.Comparison.EQUAL_TO                 = “==”;</li><li>OpenLayers.Filter.Comparison.NOT_EQUAL_TO             = “!=”;</li><li>OpenLayers.Filter.Comparison.LESS_THAN                = “<”;</li><li>OpenLayers.Filter.Comparison.GREATER_T [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.property"></a>property</h3><div class=CBody><p>{String} name of the context property to compare</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.value"></a>value</h3><div class=CBody><p>{Number} or {String} comparison value for binary comparisons.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.matchCase"></a>matchCase</h3><div class=CBody><p>{Boolean} Force case sensitive searches for EQUAL_TO and NOT_EQUAL_TO comparisons.   The Filter Encoding 1.1 specification added a matchCase attribute to ogc:PropertyIsEqualTo and ogc:PropertyIsNotEqualTo elements.   This property will be serialized with those elements only if using the v1.1.0 filter format.  However, when evaluat [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.lowerBoundary"></a>lowerBoundary</h3><div class=CBody><p>{Number} or {String} lower boundary for between comparisons.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.upperBoundary"></a>upperBoundary</h3><div class=CBody><p>{Number} or {String} upper boundary for between comparisons.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.OpenLayers.Filter.Comparison"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Comparison</h3><div class=CBody><p>Creates a comparison rule.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the rule</td></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Evaluates this filter in a specific co [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.value2regex"></a>value2regex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>value2regex: function(</td><td class=PParameter nowrap>wildCard,</td></tr><tr><td></td><td class=PParameter nowrap>singleChar,</td></tr><tr><td></td><td class=PParameter nowrap>escape [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.regex2value"></a>regex2value</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>regex2value: function()</td></tr></table></blockquote><p>Convert the value of this rule from a regular expression string into an ogc literal string using a wildCard of *, a singleChar of ., and an escape of !.   Leaves the <a href="#OpenLayers.Filter.Comparison [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Comparison.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.Comparison.OpenLayers.Filter.Comparison" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt6', 'link8')" onMouseOut="HideTip('tt6')" [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Evaluates this filter in a specific context.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Filter/FeatureId-js.html b/doc/devdocs/files/OpenLayers/Filter/FeatureId-js.html
new file mode 100644
index 0000000..3a54873
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Filter/FeatureId-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter.FeatureId - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter.FeatureId"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>FeatureId</h1><div class=CBody><p>This class represents a ogc:FeatureId Filter, as being used for rule-based SLD styling</p><p>Inherits from</p><ul><li><a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayer [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.fids"></a>fids</h3><div class=CBody><p>{Array(String)} Feature Ids to evaluate this rule against.  To be passed To be passed inside the params object.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.OpenLayers.Filter.FeatureId"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>FeatureId</h3><div class=CBody><p>Creates an ogc:FeatureId rule.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the rule</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>evaluates this rule for a specific feat [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.FeatureId.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.FeatureId.OpenLayers.Filter.FeatureId" class=LConstructor id=link6 onMouseOver="ShowTip(event, 'tt4', 'link6')" onMouseOut="HideTip('tt4')">Op [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>evaluates this rule for a specific feature</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Filter/Logical-js.html b/doc/devdocs/files/OpenLayers/Filter/Logical-js.html
new file mode 100644
index 0000000..87f11b8
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Filter/Logical-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter.Logical - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter.Logical"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Logical</h1><div class=CBody><p>This class represents ogc:And, ogc:Or and ogc:Not rules.</p><p>Inherits from</p><ul><li><a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Filter</a></li></ul><!--START_ND [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.filters"></a>filters</h3><div class=CBody><p>{Array(<a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Filter</a>)} Child filters for this filter.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.type"></a>type</h3><div class=CBody><h4 class=CHeading>{String} type of logical operator.  Available types are</h4><ul><li>OpenLayers.Filter.Logical.AND = “&&”;</li><li>OpenLayers.Filter.Logical.OR  = “||”;</li><li>OpenLayers.Filter.Logical.NOT = “!”;</li></ul></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.OpenLayers.Filter.Logical"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Logical</h3><div class=CBody><p>Creates a logical filter (And, Or, Not).</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the filter [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Remove reference to child filters.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Evaluates this filter in a specific conte [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Logical.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.Logical.OpenLayers.Filter.Logical" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt5', 'link8')" onMouseOut="HideTip('tt5')">OpenLaye [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents an OGC Filter.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Remove reference to child filters.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Filter/Spatial-js.html b/doc/devdocs/files/OpenLayers/Filter/Spatial-js.html
new file mode 100644
index 0000000..59511d5
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Filter/Spatial-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Filter.Spatial - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Filter.Spatial"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Spatial</h1><div class=CBody><p>This class represents a spatial filter.  Currently implemented: BBOX, DWithin and Intersects</p><p>Inherits from</p><ul><li><a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">Op [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.type"></a>type</h3><div class=CBody><p>{String} Type of spatial filter.</p><h4 class=CHeading>The type should be one of</h4><ul><li>OpenLayers.Filter.Spatial.BBOX</li><li>OpenLayers.Filter.Spatial.INTERSECTS</li><li>OpenLayers.Filter.Spatial.DWITHIN</li><li>OpenLayers.Filter.Spatial.WITHIN</li><li>OpenLayers.Filter.Spatial.CONTAINS</li></ul></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.property"></a>property</h3><div class=CBody><p>{String} Name of the context property to compare.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.value"></a>value</h3><div class=CBody><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Bounds</a> || <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt2', 'link7')" onMouseOut="HideTip('tt2')">OpenLayers.Geometry</a>} The bounds  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.distance"></a>distance</h3><div class=CBody><p>{Number} The distance to use in a DWithin spatial filter.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.distanceUnits"></a>distanceUnits</h3><div class=CBody><p>{String} The units to use for the distance, e.g.  ‘m’.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.OpenLayers.Filter.Spatial"></a>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Spatial</h3><div class=CBody><p>Creates a spatial filter.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the filter.</td></tr></ta [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Evaluates this filter for a specific feat [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Filter.Spatial.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this filter.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Filter.Spatial.OpenLayers.Filter.Spatial" class=LConstructor id=link10 onMouseOver="ShowTip(event, 'tt6', 'link10')" onMouseOut="HideTip('tt6')">OpenLa [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([5, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt2"><div class=CClass>A Geometry is a description of a geographic object. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>feature [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format-js.html b/doc/devdocs/files/OpenLayers/Format-js.html
new file mode 100644
index 0000000..6047696
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format"></a>OpenLayers.<span class=HB> </span>Format</h1><div class=CBody><p>Base class for format reading/writing a variety of formats.   Subclasses of OpenLayers.Format are expected to have read and write methods.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMai [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.options"></a>options</h3><div class=CBody><p>{Object} A reference to options passed to the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.externalProjection"></a>externalProjection</h3><div class=CBody><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} When passed a externalProjection and internalProjection, the format will reproject the geometries it reads or writes.  The externalProjection is the projection u [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.internalProjection"></a>internalProjection</h3><div class=CBody><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Projection</a>} When passed a externalProjection and internalProjection, the format will reproject the geometries it reads or writes.  The internalProjection is the projection [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.data"></a>data</h3><div class=CBody><p>{Object} When <a href="#OpenLayers.Format.keepData" class=LProperty id=link13 onMouseOver="ShowTip(event, 'tt2', 'link13')" onMouseOut="HideTip('tt2')">keepData</a> is true, this is the parsed string sent to <a href="#OpenLayers.Format.read" class=LFunction id=link14 onMouseOver="ShowTip(event, 'tt3', 'link14')" onMouseOut="HideTip('tt3')">read</a>.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.keepData"></a>keepData</h3><div class=CBody><p>{Object} Maintain a reference (<a href="#OpenLayers.Format.data" class=LProperty id=link15 onMouseOver="ShowTip(event, 'tt4', 'link15')" onMouseOut="HideTip('tt4')">data</a>) to the most recently read data.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OpenLayers.Format"></a>OpenLayers.<span class=HB> </span>Format</h3><div class=CBody><p>Instances of this class are not useful.   See one of the subclasses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the format</td></tr></ta [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string, and return an object whose type depends [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Accept an object, and return a string.</p><h4 class=CHeadin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Class for coordinate transforms between coordinate systems. </div></div><div class=CToolTip id="tt2"><div class=CProperty>{Object} Maintain a reference (data) to the most recently read data. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/ArcXML-js.html b/doc/devdocs/files/OpenLayers/Format/ArcXML-js.html
new file mode 100644
index 0000000..3262da2
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/ArcXML-js.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.ArcXML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.ArcXML"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>ArcXML</h1><div class=CBody><p>Read/Wite ArcXML.  Create a new instance with the <a href="#OpenLayers.Format.ArcXML.OpenLayers.Format.ArcXML" class=LConstructor id=link11 onMouseOver="ShowTip(event, 'tt11', 'link11')" onMouseOut="HideTip('tt11')">OpenLayers.Format.ArcXML</a> constructor.</p><h4 clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.fontStyleKeys"></a>fontStyleKeys</h3><div class=CBody><p>{Array} List of keys used in font styling.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.request"></a>request</h3><div class=CBody><p>A get_image request destined for an ArcIMS server.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.response"></a>response</h3><div class=CBody><p>A parsed response from an ArcIMS server.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.OpenLayers.Format.ArcXML"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>ArcXML</h3><div class=CBody><p>Create a new parser/writer for ArcXML.   Create an instance of this class to begin authoring a request to an ArcIMS service.   This is used primarily by the ArcIMS layer, but could be used to do other wild stuff, like geocoding.</p><h4 class=CHeading>Parameters< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.parseEnvelope"></a>parseEnvelope</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseEnvelope: function(</td><td class=PParameter nowrap>env,</td></tr><tr><td></td><td class=PParameter nowrap>arr</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.addLayers"></a>addLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addLayers: function(</td><td class=PParameter nowrap>ll,</td></tr><tr><td></td><td class=PParameter nowrap>lyrs</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.addImageSize"></a>addImageSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addImageSize: function(</td><td class=PParameter nowrap>imsize,</td></tr><tr><td></td><td class=PParameter nowrap>olsize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.addCoordSys"></a>addCoordSys</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addCoordSys: function(</td><td class=PParameter nowrap>featOrFilt,</td></tr><tr><td></td><td class=PParameter nowrap>fsys</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.iserror"></a>iserror</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>iserror: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Check to see if the response from the server was [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string, and return an response.</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Generate an ArcXml document string for sending to a [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.parseResponse"></a>parseResponse</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseResponse: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Take an ArcXML response, and p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.parseAttributes"></a>parseAttributes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseAttributes: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>type</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.parsePointGeometry"></a>parsePointGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parsePointGeometry: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseEnvelope: function(</td><td class=PParameter nowrap>env,</td></tr><tr><td></td><td class=PParameter nowrap>arr</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parse an array of coordinates into an ArcXML envelope structure.</div></div [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/ArcXML/Features-js.html b/doc/devdocs/files/OpenLayers/Format/ArcXML/Features-js.html
new file mode 100644
index 0000000..af45d0e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/ArcXML/Features-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.ArcXML.Features - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.ArcXML.Features"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>ArcXML.<span class=HB> </span>Features</h1><div class=CBody><p>Read/Wite ArcXML features.  Create a new instance with the <a href="#OpenLayers.Format.ArcXML.Features.OpenLayers.Format.ArcXML.Features" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideT [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Features.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Features.OpenLayers.Format.ArcXML.Features"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>ArcXML.<span class=HB> </span>Features</h3><div class=CBody><p>Create a new parser/writer for ArcXML Features.   Create an instance of this class to get a set of features from an ArcXML response.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 cla [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Features.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.ArcXML.Features.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string of ArcXML, and return a  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read data from a string of ArcXML, and return a set of OpenLayers features.</div></div><div class=CToolTip id="tt2"><div class=CConstructo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/Atom-js.html b/doc/devdocs/files/OpenLayers/Format/Atom-js.html
new file mode 100644
index 0000000..3cb3186
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/Atom-js.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Atom - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Atom"></a>OpenLayers.<span class=HB> </span>Format.Atom</h1><div class=CBody><p>Read/write Atom feeds.  Create a new instance with the <OpenLayers.Format.AtomFeed> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt12', 'link12')" onMouseOut="HideTip('tt12')">Op [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.   Properties of this object should not be set individually.   Read-only.   All XML subclasses should have their own namespaces object.   Use <setNamespace> to add or set a namespace alias after construction.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.feedTitle"></a>feedTitle</h3><div class=CBody><p>{String} Atom feed elements require a title.   Default is “untitled”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.defaultEntryTitle"></a>defaultEntryTitle</h3><div class=CBody><p>{String} Atom entry elements require a title.   In cases where one is not provided in the feature attributes, this will be used.   Default is “untitled”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.gmlParse"></a>gmlParse</h3><div class=CBody><p>{Object} GML Format object for parsing features Non-API and only created if necessary</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x) For GeoRSS the default is (y,x), therefore: false</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.OpenLayers.Format.AtomEntry"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>AtomEntry</h3><div class=CBody><p>Create a new parser for Atom.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance. [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Serialize or more feature nodes to Atom documents.</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.buildContentNode"></a>buildContentNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildContentNode: function(</td><td class=PParameter nowrap>content</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Para [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.buildEntryNode"></a>buildEntryNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildEntryNode: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Build an Atom entry node f [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.initGmlParser"></a>initGmlParser</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initGmlParser: function()</td></tr></table></blockquote><p>Creates a GML parser.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.buildGeometryNode"></a>buildGeometryNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildGeometryNode: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>builds a GeoRSS  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.buildPersonConstructNode"></a>buildPersonConstructNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildPersonConstructNode: function(</td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>value</td><td class=PAfterParameters no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.getFirstChildValue"></a>getFirstChildValue</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFirstChildValue: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>nsuri,</td></tr><tr><td></td><td class=PParameter nowrap> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.parseFeature"></a>parseFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeature: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse feature from an Atom entry no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.parseFeatures"></a>parseFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeatures: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return features from an Atom ent [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.parseLocations"></a>parseLocations</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseLocations: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse the locations from an A [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Atom.parsePersonConstruct"></a>parsePersonConstruct</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parsePersonConstructs: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter n [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Serialize or more feature nodes to Atom documents.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table bo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/CSWGetDomain-js.html b/doc/devdocs/files/OpenLayers/Format/CSWGetDomain-js.html
new file mode 100644
index 0000000..21cad5a
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/CSWGetDomain-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetDomain.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="CSWGetDomain.js"></a>CSWGetDomain.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#CSWGetDomain.js" >CSWGetDomain.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetDomain.</h3><div class=CBody><p>Default version is 2.0.2.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} A CSWGetDomain format of the given version.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetDomain.<span class=HB> </span>DEFAULTS</h3><div class=CBody><p>{Object} Default properties for the CSWGetDomain format.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/CSWGetDomain/v2_0_2-js.html b/doc/devdocs/files/OpenLayers/Format/CSWGetDomain/v2_0_2-js.html
new file mode 100644
index 0000000..4e27d7b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/CSWGetDomain/v2_0_2-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.CSWGetDomain.v2_0_2 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetDomain.<span class=HB> </span>v2_0_2</h1><div class=CBody><p>A format for creating CSWGetDomain v2.0.2 transactions.  Create a new instance with the <a href="#OpenLayers.Format.CSWGetDomain.v2_0_2.OpenLayers.Format.CSWGetDomain.v2_0_2" class=LConstructor id=link3 onMouseOver="Show [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.defaultPrefix"></a>defaultPrefix</h3><div class=CBody><p>{String} The default prefix (used by Format.XML).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.version"></a>version</h3><div class=CBody><p>{String} CSW version number.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} <a href="http://www.opengis.net/cat/csw/2.0.2" class=LURL target=_top>http://www.opengis.net/cat/csw/2.0.2</a> <a href="http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd" class=LURL target=_top>http://schemas.opengis.net<span class=HB>- </span>/csw<span class=HB>- </span>/2.0.2<span class=HB>- </span>/CSW-discove [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.PropertyName"></a>PropertyName</h3><div class=CBody><p>{String} Value of the csw:PropertyName element, used when writing a GetDomain document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.ParameterName"></a>ParameterName</h3><div class=CBody><p>{String} Value of the csw:ParameterName element, used when writing a GetDomain document.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.OpenLayers.Format.CSWGetDomain.v2_0_2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetDomain.<span class=HB> </span>v2_0_2</h3><div class=CBody><p>A class for parsing and generating CSWGetDomain v2.0.2 transactions.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse the response from a GetDomain request. [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given an configuration js object, writ [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetDomain.v2_0_2.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parse the response from a GetDomain request.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cell [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/CSWGetRecords-js.html b/doc/devdocs/files/OpenLayers/Format/CSWGetRecords-js.html
new file mode 100644
index 0000000..f289901
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/CSWGetRecords-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetRecords.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="CSWGetRecords.js"></a>CSWGetRecords.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#CSWGetRecords.js" >CSWGetRecords.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.</h3><div class=CBody><p>Default version is 2.0.2.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} A CSWGetRecords format of the given version.</p></div></d [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>DEFAULTS</h3><div class=CBody><p>{Object} Default properties for the CSWGetRecords format.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html b/doc/devdocs/files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html
new file mode 100644
index 0000000..51f4597
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.CSWGetRecords.v2_0_2 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>v2_0_2</h1><div class=CBody><p>A format for creating CSWGetRecords v2.0.2 transactions.  Create a new instance with the <a href="#OpenLayers.Format.CSWGetRecords.v2_0_2.OpenLayers.Format.CSWGetRecords.v2_0_2" class=LConstructor id=link3 onMouseOver= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.defaultPrefix"></a>defaultPrefix</h3><div class=CBody><p>{String} The default prefix (used by Format.XML).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.version"></a>version</h3><div class=CBody><p>{String} CSW version number.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} <a href="http://www.opengis.net/cat/csw/2.0.2" class=LURL target=_top>http://www.opengis.net/cat/csw/2.0.2</a> <a href="http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd" class=LURL target=_top>http://schemas.opengis.net<span class=HB>- </span>/csw<span class=HB>- </span>/2.0.2<span class=HB>- </span>/CSW-discov [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.requestId"></a>requestId</h3><div class=CBody><p>{String} Value of the requestId attribute of the GetRecords element.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.resultType"></a>resultType</h3><div class=CBody><p>{String} Value of the resultType attribute of the GetRecords element, specifies the result type in the GetRecords response, “hits” is the default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.outputFormat"></a>outputFormat</h3><div class=CBody><p>{String} Value of the outputFormat attribute of the GetRecords element, specifies the format of the GetRecords response, “application/xml” is the default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.outputSchema"></a>outputSchema</h3><div class=CBody><p>{String} Value of the outputSchema attribute of the GetRecords element, specifies the schema of the GetRecords response.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.startPosition"></a>startPosition</h3><div class=CBody><p>{String} Value of the startPosition attribute of the GetRecords element, specifies the start position (offset+1) for the GetRecords response, 1 is the default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.maxRecords"></a>maxRecords</h3><div class=CBody><p>{String} Value of the maxRecords attribute of the GetRecords element, specifies the maximum number of records in the GetRecords response, 10 is the default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.DistributedSearch"></a>DistributedSearch</h3><div class=CBody><p>{String} Value of the csw:DistributedSearch element, used when writing a csw:GetRecords document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.ResponseHandler"></a>ResponseHandler</h3><div class=CBody><p>{Array({String})} Values of the csw:ResponseHandler elements, used when writting a csw:GetRecords document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.Query"></a>Query</h3><div class=CBody><p>{String} Value of the csw:Query element, used when writing a csw:GetRecords document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.regExes"></a>regExes</h3><div class=CBody><p>Compiled regular expressions for manipulating strings.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.OpenLayers.Format.CSWGetRecords.v2_0_2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>v2_0_2</h3><div class=CBody><p>A class for parsing and generating CSWGetRecords v2.0.2 transactions.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse the response from a GetRecords reques [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given an configuration js object, wri [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.CSWGetRecords.v2_0_2.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parse the response from a GetRecords request.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cel [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/Context-js.html b/doc/devdocs/files/OpenLayers/Format/Context-js.html
new file mode 100644
index 0000000..800aa7e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/Context-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Context - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Context"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Context</h1><div class=CBody><p>Base class for both Format.WMC and Format.OWSContext</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Format.Cont [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.layerOptions"></a>layerOptions</h3><div class=CBody><p>{Object} Default options for layers created by the parser.  These options are overridden by the options which are read from the capabilities document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.layerParams"></a>layerParams</h3><div class=CBody><p>{Object} Default parameters for layers created by the parser.  This can be used e.g. to override DEFAULT_PARAMS for OpenLayers.Layer.WMS.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.parser"></a>parser</h3><div class=CBody><p>{Object} Instance of the versioned parser.   Cached for multiple read and write calls of the same version.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.OpenLayers.Format.Context"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Context</h3><div class=CBody><p>Create a new parser for Context documents.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on th [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.getLayerFromContext"></a>getLayerFromContext</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayerFromContext: function(</td><td class=PParameter nowrap>layerContext</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Cre [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.getLayersFromContext"></a>getLayersFromContext</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayersFromContext: function(</td><td class=PParameter nowrap>layersContext</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.contextToMap"></a>contextToMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>contextToMap: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.mergeContextToMap"></a>mergeContextToMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeContextToMap: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Context.OpenLayers.Format.Context.serviceTypes"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Context.<span class=HB> </span>serviceTypes</h3><div class=CBody><p>Enumeration for service types</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read Context data from a string, and return an object with map properties and a [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/Filter-js.html b/doc/devdocs/files/OpenLayers/Format/Filter-js.html
new file mode 100644
index 0000000..63b7cf7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/Filter-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Filter - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Filter"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter</h1><div class=CBody><p>Read/Wite ogc:Filter.  Create a new instance with the <a href="#OpenLayers.Format.Filter.OpenLayers.Format.Filter" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.Filter</a> constructor.</p><h4 clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.parser"></a>parser</h3><div class=CBody><p>{Object} Instance of the versioned parser.   Cached for multiple read and write calls of the same version.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.OpenLayers.Format.Filter"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter</h3><div class=CBody><p>Create a new parser for Filter.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read and Filter doc and return an object representing the [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([6, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Write an ogc:Filter given a filter object.</div></div><div class=CToolTip id [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/Filter/v1-js.html b/doc/devdocs/files/OpenLayers/Format/Filter/v1-js.html
new file mode 100644
index 0000000..ecae27c
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/Filter/v1-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Filter.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Filter.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.v1</h1><div class=CBody><p>Superclass for Filter version 1 parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt7')">OpenLayers.Format.XML</a></li></ul><! [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.defaultPrefix"></a>defaultPrefix</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location for a particular minor version.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.OpenLayers.Format.Filter.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.v1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../Filter-js.html#OpenLayers.Format.Filter" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.Format.Filter</a> constructor instead.< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspa [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.readSpatial"></a>readSpatial</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>readSpatial: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>type</td><td class [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.readOgcExpression"></a>readOgcExpression</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>readOgcExpression: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Limited support [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 ce [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.getFilterType"></a>getFilterType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFilterType: function(</td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1.filterMap"></a>filterMap</h3><div class=CBody><p>{Object} Contains a member for each filter type.   Values are node names for corresponding OGC Filter child elements.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([6, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/Filter/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Format/Filter/v1_0_0-js.html
new file mode 100644
index 0000000..0f0f082
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/Filter/v1_0_0-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Filter.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Write ogc:Filter version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../GML/v2-js.html#OpenLayers.Format.GML.v2" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayer [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} <a href="http://www.opengis.net/ogc/filter/1.0.0/filter.xsd" class=LURL target=_top>http://www.opengis.net<span class=HB>- </span>/ogc<span class=HB>- </span>/filter<span class=HB>- </span>/1.0.0<span class=HB>- </span>/filter.xsd</a></p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.OpenLayers.Format.Filter.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../Filter-js.html#OpenLayers.Format.Filter" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Form [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_0_0.writeSpatial"></a>writeSpatial</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>writeSpatial: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([6, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>writeSpatial: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read a {OpenLayers.Filter.Spatial} filter and converts it into XML.</div [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/Filter/v1_1_0-js.html b/doc/devdocs/files/OpenLayers/Format/Filter/v1_1_0-js.html
new file mode 100644
index 0000000..dbcf676
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/Filter/v1_1_0-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Filter.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Write ogc:Filter version 1.1.0.</p><h4 class=CHeading>Differences from the v1.0.0 parser</h4><ul><li>uses GML v3 instead of GML v2</li><li>reads matchCase attribute on ogc:PropertyIsEqual and ogc:PropertyIsNotEqualelements.</li><li>write [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.1.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} <a href="http://www.opengis.net/ogc/filter/1.1.0/filter.xsd" class=LURL target=_top>http://www.opengis.net<span class=HB>- </span>/ogc<span class=HB>- </span>/filter<span class=HB>- </span>/1.1.0<span class=HB>- </span>/filter.xsd</a></p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.OpenLayers.Format.Filter.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Filter.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../Filter-js.html#OpenLayers.Format.Filter" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Form [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Filter.v1_1_0.writeSpatial"></a>writeSpatial</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>writeSpatial: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([6, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>writeSpatial: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read a {OpenLayers.Filter.Spatial} filter and converts it into XML.</div [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/GML-js.html b/doc/devdocs/files/OpenLayers/Format/GML-js.html
new file mode 100644
index 0000000..6d86977
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/GML-js.html
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GML"></a>OpenLayers.<span class=HB> </span>Format.GML</h1><div class=CBody><p>Read/Wite GML.  Create a new instance with the <a href="#OpenLayers.Format.GML.OpenLayers.Format.GML" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.Format.GML</a> constructor.   Supports the GML simple features profile.</p><h4  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.featureNS"></a>featureNS</h3><div class=CBody><p>{String} Namespace used for feature attributes.   Default is “<a href="http://mapserver.gis.umn.edu/mapserver" class=LURL target=_top>http://mapserver.gis.umn.edu/mapserver</a>”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.featurePrefix"></a>featurePrefix</h3><div class=CBody><p>{String} Namespace alias (or prefix) for feature nodes.   Default is “feature”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.featureName"></a>featureName</h3><div class=CBody><p>{String} Element name for features.  Default is “featureMember”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.layerName"></a>layerName</h3><div class=CBody><p>{String} Name of data layer.  Default is “features”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.geometryName"></a>geometryName</h3><div class=CBody><p>{String} Name of geometry element.   Defaults to “geometry”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.collectionName"></a>collectionName</h3><div class=CBody><p>{String} Name of featureCollection element.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.gmlns"></a>gmlns</h3><div class=CBody><p>{String} GML Namespace.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from GML.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) Changing is not recommended, a new Format should be instantiated.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.OpenLayers.Format.GML"></a>OpenLayers.<span class=HB> </span>Format.GML</h3><div class=CBody><p>Create a new parser for GML.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string, and return a list of features.</p>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseFeature"></a>parseFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeature: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This function is the core of the GML [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseGeometry"></a>parseGeometry</h3><div class=CBody><p>Properties of this object are the functions that parse geometries based on their type.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseGeometry.point"></a>parseGeometry.<span class=HB> </span>point</h3><div class=CBody><p>Given a GML node representing a point geometry, create an OpenLayers point geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A GML node.</td></tr></table><h4 class=CHeading>Retu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseGeometry.multipoint"></a>parseGeometry.<span class=HB> </span>multipoint</h3><div class=CBody><p>Given a GML node representing a multipoint geometry, create an OpenLayers multipoint geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A GML node.</td></tr></table><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseGeometry.linestring"></a>parseGeometry.<span class=HB> </span>linestring</h3><div class=CBody><p>Given a GML node representing a linestring geometry, create an OpenLayers linestring geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A GML node.</td></tr></table><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseGeometry.multilinestring"></a>parseGeometry.<span class=HB> </span>multilinestring</h3><div class=CBody><p>Given a GML node representing a multilinestring geometry, create an OpenLayers multilinestring geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A GML node.< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseGeometry.polygon"></a>parseGeometry.<span class=HB> </span>polygon</h3><div class=CBody><p>Given a GML node representing a polygon geometry, create an OpenLayers polygon geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A GML node.</td></tr></table><h4 class=CHead [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseGeometry.multipolygon"></a>parseGeometry.<span class=HB> </span>multipolygon</h3><div class=CBody><p>Given a GML node representing a multipolygon geometry, create an OpenLayers multipolygon geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A GML node.</td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseGeometry.box"></a>parseGeometry.box</h3><div class=CBody><p>Given a GML node representing a box geometry, create an OpenLayers.Bounds.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A GML node.</td></tr></table><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bou [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.parseAttributes"></a>parseAttributes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseAttributes: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Generate a GML document string given a list of featur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.createFeatureXML"></a>createFeatureXML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeatureXML: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Accept an OpenLayers. [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometryNode"></a>buildGeometryNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildGeometryNode: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry"></a>buildGeometry</h3><div class=CBody><p>Object containing methods to do the actual geometry node building based on geometry type.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry.point"></a>buildGeometry.<span class=HB> </span>point</h3><div class=CBody><p>Given an OpenLayers point geometry, create a GML point.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link20 onMo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry.multipoint"></a>buildGeometry.<span class=HB> </span>multipoint</h3><div class=CBody><p>Given an OpenLayers multipoint geometry, create a GML multipoint.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/MultiPoint-js.html#OpenLayers.Geometry.MultiPoin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry.linestring"></a>buildGeometry.<span class=HB> </span>linestring</h3><div class=CBody><p>Given an OpenLayers linestring geometry, create a GML linestring.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/LineString-js.html#OpenLayers.Geometry.LineStrin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry.multilinestring"></a>buildGeometry.<span class=HB> </span>multilinestring</h3><div class=CBody><p>Given an OpenLayers multilinestring geometry, create a GML multilinestring.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/MultiLineString-js.html#Open [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry.linearring"></a>buildGeometry.<span class=HB> </span>linearring</h3><div class=CBody><p>Given an OpenLayers linearring geometry, create a GML linearring.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/LinearRing-js.html#OpenLayers.Geometry.LinearRin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry.polygon"></a>buildGeometry.<span class=HB> </span>polygon</h3><div class=CBody><p>Given an OpenLayers polygon geometry, create a GML polygon.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry.multipolygon"></a>buildGeometry.<span class=HB> </span>multipolygon</h3><div class=CBody><p>Given an OpenLayers multipolygon geometry, create a GML multipolygon.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/MultiPolygon-js.html#OpenLayers.Geometry [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildGeometry.bounds"></a>buildGeometry.<span class=HB> </span>bounds</h3><div class=CBody><p>Given an OpenLayers bounds, create a GML box.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>bounds</td><td class=CDLDescription>{<OpenLayers.Geometry.Bounds>} A bounds object.</td></tr></table><h4 class=CHeading>Returns</h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.buildCoordinates"></a>buildCoordinates</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildCoordinatesNode: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>builds the coord [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([7, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read data from a string, and return a list of features.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table bo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/GML/Base-js.html b/doc/devdocs/files/OpenLayers/Format/GML/Base-js.html
new file mode 100644
index 0000000..ba11f41
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/GML/Base-js.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GML.Base - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GML.Base"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.Base</h1><div class=CBody><p>Superclass for GML parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Format.XML</a></li></ul><!--START_ND_SUMM [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.defaultPrefix"></a>defaultPrefix</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location for a particular minor version.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.featureType"></a>featureType</h3><div class=CBody><p>{Array(String) or String} The local (without prefix) feature typeName(s).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.featureNS"></a>featureNS</h3><div class=CBody><p>{String} The feature namespace.   Must be set in the options at construction.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.geometry"></a>geometry</h3><div class=CBody><p>{String} Name of geometry element.   Defaults to “geometry”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from GML.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.srsName"></a>srsName</h3><div class=CBody><p>{String} URI for spatial reference system.   This is optional for single part geometries and mandatory for collections and multis.  If set, the srsName attribute will be written for all geometries.  Default is null.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) Changing is not recommended, a new Format should be instantiated.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>{Object} Maps OpenLayers geometry class names to GML element names.  Use <a href="#OpenLayers.Format.GML.Base.setGeometryTypes" class=LFunction id=link6 onMouseOver="ShowTip(event, 'tt3', 'link6')" onMouseOut="HideTip('tt3')">setGeometryTypes</a> before accessing this property.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.singleFeatureType"></a>singleFeatureType</h3><div class=CBody><p>{Boolean} True if there is only 1 featureType, and not an array of featuretypes.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.regExes"></a>regExes</h3><div class=CBody><p>Compiled regular expressions for manipulating strings.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.OpenLayers.Format.GML.Base"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.Base</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="v2-js.html#OpenLayers.Format.GML.v2" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt6', 'link7')" onMouseOut="HideTip('tt6')">OpenLayers.Format.GML.v2</a> or <a href="v3-js.html#OpenLaye [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspac [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 c [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.Base.setGeometryTypes"></a>setGeometryTypes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setGeometryTypes: function()</td></tr></table></blockquote><p>Sets the <a href="#OpenLayers.Format.GML.Base.geometryTypes" class=LProperty id=link11 onMouseOver="ShowTip(event, 'tt4', 'link11')" onMouseOut="HideTip('tt4')">geometryTypes</a> mapping.</p></div [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([7, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/GML/v2-js.html b/doc/devdocs/files/OpenLayers/Format/GML/v2-js.html
new file mode 100644
index 0000000..4ed326b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/GML/v2-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GML.v2 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GML.v2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.v2</h1><div class=CBody><p>Parses GML version 2.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Base-js.html#OpenLayers.Format.GML.Base" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.GML.Base</a></li></ul><!--START_ND_SUMMAR [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location for a particular minor version.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.OpenLayers.Format.GML.v2"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.v2</h3><div class=CBody><p>Create a parser for GML v2.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.Properties_and_Functions"></a>Properties and Functions</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v2.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([7, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CClass>Superclass for GML parsers.</div></div><div class=CToolTip id="tt3"><div c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/GML/v3-js.html b/doc/devdocs/files/OpenLayers/Format/GML/v3-js.html
new file mode 100644
index 0000000..ffdf4b9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/GML/v3-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GML.v3 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GML.v3"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.v3</h1><div class=CBody><p>Parses GML version 3.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Base-js.html#OpenLayers.Format.GML.Base" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.GML.Base</a></li></ul><!--START_ND_SUMMAR [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location for a particular minor version.   The writers conform with the Simple Features Profile for GML.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.curve"></a>curve</h3><div class=CBody><p>{Boolean} Write gml:Curve instead of gml:LineString elements.   This also affects the elements in multi-part geometries.   Default is false.  To write gml:Curve elements instead of gml:LineString, set curve to true in the options to the contstructor (cannot be changed after instantiation).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.multiCurve"></a>multiCurve</h3><div class=CBody><p>{Boolean} Write gml:MultiCurve instead of gml:MultiLineString.   Since the latter is deprecated in GML 3, the default is true.   To write gml:MultiLineString instead of gml:MultiCurve, set multiCurve to false in the options to the constructor (cannot be changed after instantiation).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.surface"></a>surface</h3><div class=CBody><p>{Boolean} Write gml:Surface instead of gml:Polygon elements.   This also affects the elements in multi-part geometries.   Default is false.  To write gml:Surface elements instead of gml:Polygon, set surface to true in the options to the contstructor (cannot be changed after instantiation).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.multiSurface"></a>multiSurface</h3><div class=CBody><p>{Boolean} Write gml:multiSurface instead of gml:MultiPolygon.   Since the latter is deprecated in GML 3, the default is true.   To write gml:MultiPolygon instead of gml:multiSurface, set multiSurface to false in the options to the constructor (cannot be changed after instantiation).</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.OpenLayers.Format.GML.v3"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GML.v3</h3><div class=CBody><p>Create a parser for GML v3.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.Properties_and_Functions"></a>Properties and Functions</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GML.v3.setGeometryTypes"></a>setGeometryTypes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setGeometryTypes: function()</td></tr></table></blockquote><p>Sets the <geometryTypes> mapping.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([7, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/GPX-js.html b/doc/devdocs/files/OpenLayers/Format/GPX-js.html
new file mode 100644
index 0000000..6cf8ed1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/GPX-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GPX - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GPX"></a>OpenLayers.<span class=HB> </span>Format.GPX</h1><div class=CBody><p>Read/write GPX parser.  Create a new instance with the <a href="#OpenLayers.Format.GPX.OpenLayers.Format.GPX" class=LConstructor id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Format.GPX</a> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractWaypoints"></a>extractWaypoints</h3><div class=CBody><p>{Boolean} Extract waypoints from GPX.  (default: true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractTracks"></a>extractTracks</h3><div class=CBody><p>{Boolean} Extract tracks from GPX.  (default: true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractRoutes"></a>extractRoutes</h3><div class=CBody><p>{Boolean} Extract routes from GPX.  (default: true)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract feature attributes from GPX.  (default: true) NOTE: Attributes as part of extensions to the GPX standard may not be extracted.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.OpenLayers.Format.GPX"></a>OpenLayers.<span class=HB> </span>Format.GPX</h3><div class=CBody><p>Create a new parser for GPX.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>doc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of features from a GPX doc</p><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.extractSegment"></a>extractSegment</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extractSegment: function(</td><td class=PParameter nowrap>segment,</td></tr><tr><td></td><td class=PParameter nowrap>segmentType</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GPX.parseAttributes"></a>parseAttributes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseAttributes: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>doc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Return a list of features from a GPX doc</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspaci [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/GeoJSON-js.html b/doc/devdocs/files/OpenLayers/Format/GeoJSON-js.html
new file mode 100644
index 0000000..554312f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/GeoJSON-js.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GeoJSON - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GeoJSON"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoJSON</h1><div class=CBody><p>Read and write GeoJSON.  Create a new parser with the <a href="#OpenLayers.Format.GeoJSON.OpenLayers.Format.GeoJSON" class=LConstructor id=link16 onMouseOver="ShowTip(event, 'tt9', 'link16')" onMouseOut="HideTip('tt9')">OpenLayers.Format.GeoJSON</a> constructor.</p>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.ignoreExtraDims"></a>ignoreExtraDims</h3><div class=CBody><p>{Boolean} Ignore dimensions higher than 2 when reading geometry coordinates.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.OpenLayers.Format.GeoJSON"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoJSON</h3><div class=CBody><p>Create a new parser for GeoJSON.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instanc [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>json,</td></tr><tr><td></td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.isValidType"></a>isValidType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isValidType: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>type</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseFeature"></a>parseFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeature: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Convert a feature object from Geo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseGeometry"></a>parseGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseGeometry: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Convert a geometry object from [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseCoords"></a>parseCoords</h3><div class=CBody><p>Object with properties corresponding to the GeoJSON geometry types.  Property values are functions that do the actual parsing.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseCoords.point"></a>parseCoords.<span class=HB> </span>point</h3><div class=CBody><p>Convert a coordinate array from GeoJSON into an <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt6', 'link25')" onMouseOut="HideTip('tt6')">OpenLayers.Geometry</a>.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDes [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseCoords.multipoint"></a>parseCoords.<span class=HB> </span>multipoint</h3><div class=CBody><p>Convert a coordinate array from GeoJSON into an <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link27 onMouseOver="ShowTip(event, 'tt6', 'link27')" onMouseOut="HideTip('tt6')">OpenLayers.Geometry</a>.</p><h4 class=CHeading>Parameters</h4><p>array {Object} The coordinates array from [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseCoords.linestring"></a>parseCoords.<span class=HB> </span>linestring</h3><div class=CBody><p>Convert a coordinate array from GeoJSON into an <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link29 onMouseOver="ShowTip(event, 'tt6', 'link29')" onMouseOut="HideTip('tt6')">OpenLayers.Geometry</a>.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseCoords.multilinestring"></a>parseCoords.<span class=HB> </span>multilinestring</h3><div class=CBody><p>Convert a coordinate array from GeoJSON into an <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link31 onMouseOver="ShowTip(event, 'tt6', 'link31')" onMouseOut="HideTip('tt6')">OpenLayers.Geometry</a>.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cell [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseCoords.polygon"></a>parseCoords.<span class=HB> </span>polygon</h3><div class=CBody><p>Convert a coordinate array from GeoJSON into an <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link33 onMouseOver="ShowTip(event, 'tt6', 'link33')" onMouseOut="HideTip('tt6')">OpenLayers.Geometry</a>.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Geometry-js.html#OpenLayers.Geometry" [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseCoords.multipolygon"></a>parseCoords.<span class=HB> </span>multipolygon</h3><div class=CBody><p>Convert a coordinate array from GeoJSON into an <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link35 onMouseOver="ShowTip(event, 'tt6', 'link35')" onMouseOut="HideTip('tt6')">OpenLayers.Geometry</a>.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpaddin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.parseCoords.box"></a>parseCoords.box</h3><div class=CBody><p>Convert a coordinate array from GeoJSON into an <a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link37 onMouseOver="ShowTip(event, 'tt6', 'link37')" onMouseOut="HideTip('tt6')">OpenLayers.Geometry</a>.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>pretty</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.createCRSObject"></a>createCRSObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createCRSObject: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create the CRS object [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract"></a>extract</h3><div class=CBody><p>Object with properties corresponding to the GeoJSON types.  Property values are functions that do the actual value extraction.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.feature"></a>extract.<span class=HB> </span>feature</h3><div class=CBody><p>Return a partial GeoJSON object representing a single feature.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>feature</td><td class=CDLDescription>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link42 on [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.geometry"></a>extract.<span class=HB> </span>geometry</h3><div class=CBody><p>Return a GeoJSON object representing a single geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link43 onMouseOver="ShowT [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.point"></a>extract.<span class=HB> </span>point</h3><div class=CBody><p>Return an array of coordinates from a point.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>point</td><td class=CDLDescription>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link44 onMouseOver="ShowTip(event [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.multipoint"></a>extract.<span class=HB> </span>multipoint</h3><div class=CBody><p>Return an array of point coordinates from a multipoint.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>multipoint</td><td class=CDLDescription>{<a href="../Geometry/MultiPoint-js.html#OpenLayers.Geometry.MultiPoint" class=LClass  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.linestring"></a>extract.<span class=HB> </span>linestring</h3><div class=CBody><p>Return an array of coordinate arrays from a linestring.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>linestring</td><td class=CDLDescription>{<a href="../Geometry/LineString-js.html#OpenLayers.Geometry.LineString" class=LClass  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.multilinestring"></a>extract.<span class=HB> </span>multilinestring</h3><div class=CBody><p>Return an array of linestring arrays from a linestring.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>linestring</td><td class=CDLDescription>{<a href="../Geometry/MultiLineString-js.html#OpenLayers.Geometry.MultiLineS [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.polygon"></a>extract.<span class=HB> </span>polygon</h3><div class=CBody><p>Return an array of linear ring arrays from a polygon.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>polygon</td><td class=CDLDescription>{<a href="../Geometry/Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id=link48 onMouse [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.multipolygon"></a>extract.<span class=HB> </span>multipolygon</h3><div class=CBody><p>Return an array of polygon arrays from a multipolygon.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>multipolygon</td><td class=CDLDescription>{<a href="../Geometry/MultiPolygon-js.html#OpenLayers.Geometry.MultiPolygon" clas [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoJSON.extract.collection"></a>extract.<span class=HB> </span>collection</h3><div class=CBody><p>Return an array of geometries from a geometry collection.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>collection</td><td class=CDLDescription>{<a href="../Geometry/Collection-js.html#OpenLayers.Geometry.Collection" class=LClas [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>json,</td></tr><tr><td></td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Deserialize a GeoJSON st [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/GeoRSS-js.html b/doc/devdocs/files/OpenLayers/Format/GeoRSS-js.html
new file mode 100644
index 0000000..8c6c76b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/GeoRSS-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.GeoRSS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.GeoRSS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoRSS</h1><div class=CBody><p>Read/write GeoRSS parser.  Create a new instance with the <a href="#OpenLayers.Format.GeoRSS.OpenLayers.Format.GeoRSS" class=LConstructor id=link9 onMouseOver="ShowTip(event, 'tt9', 'link9')" onMouseOut="HideTip('tt9')">OpenLayers.Format.GeoRSS</a> constructor.</p><h4  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.rssns"></a>rssns</h3><div class=CBody><p>{String} RSS namespace to use.  Defaults to “<a href="http://backend.userland.com/rss2" class=LURL target=_top>http://backend.userland.com/rss2</a>”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.featurens"></a>featurens</h3><div class=CBody><p>{String} Feature Attributes namespace.   Defaults to “<a href="http://mapserver.gis.umn.edu/mapserver" class=LURL target=_top>http://mapserver.gis.umn.edu/mapserver</a>”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.georssns"></a>georssns</h3><div class=CBody><p>{String} GeoRSS namespace to use.   Defaults to “<a href="http://www.georss.org/georss" class=LURL target=_top>http://www.georss.org/georss</a>”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.geons"></a>geons</h3><div class=CBody><p>{String} W3C Geo namespace to use.   Defaults to “<a href="http://www.w3.org/2003/01/geo/wgs84_pos#" class=LURL target=_top>http://www.w3.org/2003/01/geo/wgs84_pos#</a>”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.featureTitle"></a>featureTitle</h3><div class=CBody><p>{String} Default title for features.   Defaults to “Untitled”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.featureDescription"></a>featureDescription</h3><div class=CBody><p>{String} Default description for features.   Defaults to “No Description”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.gmlParse"></a>gmlParse</h3><div class=CBody><p>{Object} GML Format object for parsing features Non-API and only created if necessary</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x) For GeoRSS the default is (y,x), therefore: false</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.OpenLayers.Format.GeoRSS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoRSS</h3><div class=CBody><p>Create a new parser for GeoRSS.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.createGeometryFromItem"></a>createGeometryFromItem</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createGeometryFromItem: function(</td><td class=PParameter nowrap>item</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Ret [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.createFeatureFromItem"></a>createFeatureFromItem</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeatureFromItem: function(</td><td class=PParameter nowrap>item</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.getChildValue"></a>getChildValue</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getChildValue: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>nsuri,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Accept Feature Collection, and return a string.</p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.createFeatureXML"></a>createFeatureXML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeatureXML: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Accept an <a href= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.buildGeometryNode"></a>buildGeometryNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildGeometryNode: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>builds a GeoRS [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.GeoRSS.buildCoordinatesNode"></a>buildCoordinatesNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildCoordinatesNode: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 clas [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createGeometryFromItem: function(</td><td class=PParameter nowrap>item</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Return a geometry from a GeoRSS Item.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table bo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/JSON-js.html b/doc/devdocs/files/OpenLayers/Format/JSON-js.html
new file mode 100644
index 0000000..6ccb785
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/JSON-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.JSON - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.JSON"></a>OpenLayers.<span class=HB> </span>Format.JSON</h1><div class=CBody><p>A parser to read/write JSON safely.   Create a new instance with the <a href="#OpenLayers.Format.JSON.OpenLayers.Format.JSON" class=LConstructor id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">OpenLayers.Format.JSON</a> constructor.</p><h4 class=CHeading>Inherit [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.indent"></a>indent</h3><div class=CBody><p>{String} For “pretty” printing, the indent string will be used once for each indentation level.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.space"></a>space</h3><div class=CBody><p>{String} For “pretty” printing, the space string will be used after the “:” separating a name/value pair.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.newline"></a>newline</h3><div class=CBody><p>{String} For “pretty” printing, the newline string will be used at the end of each name/value pair or array item.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.level"></a>level</h3><div class=CBody><p>{Integer} For “pretty” printing, this is incremented/decremented during serialization.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.pretty"></a>pretty</h3><div class=CBody><p>{Boolean} Serialize with extra whitespace for structure.   This is set by the <a href="#OpenLayers.Format.JSON.write" class=LFunction id=link8 onMouseOver="ShowTip(event, 'tt2', 'link8')" onMouseOut="HideTip('tt2')">write</a> method.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.OpenLayers.Format.JSON"></a>OpenLayers.<span class=HB> </span>Format.JSON</h3><div class=CBody><p>Create a new parser for JSON.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>json,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>D [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>value,</td></tr><tr><td></td><td class=PParameter nowrap>pretty</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.writeIndent"></a>writeIndent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>writeIndent: function()</td></tr></table></blockquote><p>Output an indentation string depending on the indentation level.</p><h4 class=CHeading>Returns</h4><p>{String} An appropriate indentation string.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.writeNewline"></a>writeNewline</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>writeNewline: function()</td></tr></table></blockquote><p>Output a string representing a newline if in pretty printing mode.</p><h4 class=CHeading>Returns</h4><p>{String} A string representing a new line.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.writeSpace"></a>writeSpace</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>writeSpace: function()</td></tr></table></blockquote><p>Output a string representing a space if in pretty printing mode.</p><h4 class=CHeading>Returns</h4><p>{String} A space.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.serialize"></a>serialize</h3><div class=CBody><p>Object with properties corresponding to the serializable data types.  Property values are functions that do the actual serializing.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.serialize.object"></a>serialize.<span class=HB> </span>object</h3><div class=CBody><p>Transform an object into a JSON string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>object</td><td class=CDLDescription>{Object} The object to be serialized.</td></tr></table><h4 class=CHeading>Returns</h4><p>{String} A JSON string r [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.serialize.array"></a>serialize.<span class=HB> </span>array</h3><div class=CBody><p>Transform an array into a JSON string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>array</td><td class=CDLDescription>{Array} The array to be serialized</td></tr></table><h4 class=CHeading>Returns</h4><p>{String} A JSON string represen [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.serialize.string"></a>serialize.<span class=HB> </span>string</h3><div class=CBody><p>Transform a string into a JSON string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>string</td><td class=CDLDescription>{String} The string to be serialized</td></tr></table><h4 class=CHeading>Returns</h4><p>{String} A JSON string rep [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.serialize.number"></a>serialize.<span class=HB> </span>number</h3><div class=CBody><p>Transform a number into a JSON string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>number</td><td class=CDLDescription>{Number} The number to be serialized.</td></tr></table><h4 class=CHeading>Returns</h4><p>{String} A JSON string re [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.serialize.boolean"></a>serialize.<span class=HB> </span>boolean</h3><div class=CBody><p>Transform a boolean into a JSON string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>bool</td><td class=CDLDescription>{Boolean} The boolean to be serialized.</td></tr></table><h4 class=CHeading>Returns</h4><p>{String} A JSON string [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.JSON.serialize.object"></a>serialize.<span class=HB> </span>object</h3><div class=CBody><p>Transform a date into a JSON string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>date</td><td class=CDLDescription>{Date} The date to be serialized.</td></tr></table><h4 class=CHeading>Returns</h4><p>{String} A JSON string representi [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>json,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Deserialize a json string.</div></div><div class=CToolTip id="tt2"><div class=CF [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/KML-js.html b/doc/devdocs/files/OpenLayers/Format/KML-js.html
new file mode 100644
index 0000000..fb2cb37
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/KML-js.html
@@ -0,0 +1,145 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.KML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.KML"></a>OpenLayers.<span class=HB> </span>Format.KML</h1><div class=CBody><p>Read/Write KML.  Create a new instance with the <a href="#OpenLayers.Format.KML.OpenLayers.Format.KML" class=LConstructor id=link24 onMouseOver="ShowTip(event, 'tt22', 'link24')" onMouseOut="HideTip('tt22')">OpenLayers.Format.KML</a> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li><a  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.kmlns"></a>kmlns</h3><div class=CBody><p>{String} KML Namespace to use.  Defaults to 2.0 namespace.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.placemarksDesc"></a>placemarksDesc</h3><div class=CBody><p>{String} Name of the placemarks.   Default is “No description available”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.foldersName"></a>foldersName</h3><div class=CBody><p>{String} Name of the folders.   Default is “OpenLayers export”.  If set to null, no name element will be created.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.foldersDesc"></a>foldersDesc</h3><div class=CBody><p>{String} Description of the folders.  Default is “Exported on [date].”  If set to null, no description element will be created.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from KML.   Default is true.  Extracting styleUrls requires this to be set to true</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.extractStyles"></a>extractStyles</h3><div class=CBody><p>{Boolean} Extract styles from KML.   Default is false.  Extracting styleUrls also requires extractAttributes to be set to true</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.extractTracks"></a>extractTracks</h3><div class=CBody><p>{Boolean} Extract gx:Track elements from Placemark elements.   Default is false.   If true, features will be generated for all points in all gx:Track elements.   Features will have a when (Date) attribute based on when elements in the track.   If tracks include angle elements, features will have heading, tilt, and roll attri [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.trackAttributes"></a>trackAttributes</h3><div class=CBody><p>{Array} If <a href="#OpenLayers.Format.KML.extractTracks" class=LProperty id=link26 onMouseOver="ShowTip(event, 'tt1', 'link26')" onMouseOut="HideTip('tt1')">extractTracks</a> is true, points within gx:Track elements will be parsed as features with when, heading, tilt, and roll attributes.  Any additional attribute names can be provide [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.internalns"></a>internalns</h3><div class=CBody><p>{String} KML Namespace to use -- defaults to the namespace of the Placemark node being parsed, but falls back to kmlns.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.features"></a>features</h3><div class=CBody><p>{Array} Array of features</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.styles"></a>styles</h3><div class=CBody><p>{Object} Storage of style objects</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.styleBaseUrl"></a>styleBaseUrl</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.fetched"></a>fetched</h3><div class=CBody><p>{Object} Storage of KML URLs that have been fetched before in order to prevent reloading them.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.maxDepth"></a>maxDepth</h3><div class=CBody><p>{Integer} Maximum depth for recursive loading external KML URLs Defaults to 0: do no external fetching</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.OpenLayers.Format.KML"></a>OpenLayers.<span class=HB> </span>Format.KML</h3><div class=CBody><p>Create a new parser for KML.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read data from a string, and return a list of features.</p>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseData"></a>parseData</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseData: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseLinks"></a>parseLinks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseLinks: function(</td><td class=PParameter nowrap>nodes,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.fetchLink"></a>fetchLink</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>fetchLink: function(</td><td class=PParameter nowrap>href</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Fetches a URL and returns the result</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseStyles"></a>parseStyles</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseStyles: function(</td><td class=PParameter nowrap>nodes,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseKmlColor"></a>parseKmlColor</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseKmlColor: function(</td><td class=PParameter nowrap>kmlColor</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parses a kml color (in &lsquo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseStyle"></a>parseStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseStyle: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parses the children of a <a href="../Style [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseStyleMaps"></a>parseStyleMaps</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseStyleMaps: function(</td><td class=PParameter nowrap>nodes,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseFeatures"></a>parseFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeatures: function(</td><td class=PParameter nowrap>nodes,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseFeature"></a>parseFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeature: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This function is the core of the KML [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.getStyle"></a>getStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getStyle: function(</td><td class=PParameter nowrap>styleUrl,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseGeometry"></a>parseGeometry</h3><div class=CBody><p>Properties of this object are the functions that parse geometries based on their type.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseGeometry.point"></a>parseGeometry.<span class=HB> </span>point</h3><div class=CBody><p>Given a KML node representing a point geometry, create an OpenLayers point geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A KML Point node.</td></tr></table><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseGeometry.linestring"></a>parseGeometry.<span class=HB> </span>linestring</h3><div class=CBody><p>Given a KML node representing a linestring geometry, create an OpenLayers linestring geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A KML LineString node.</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseGeometry.polygon"></a>parseGeometry.<span class=HB> </span>polygon</h3><div class=CBody><p>Given a KML node representing a polygon geometry, create an OpenLayers polygon geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A KML Polygon node.</td></tr></table><h4 cla [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseGeometry.multigeometry"></a>parseGeometry.<span class=HB> </span>multigeometry</h3><div class=CBody><p>Given a KML node representing a multigeometry, create an OpenLayers geometry collection.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement} A KML MultiGeometry node.</td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseAttributes"></a>parseAttributes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseAttributes: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseExtendedData"></a>parseExtendedData</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseExtendedData: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse ExtendedData fr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.parseProperty"></a>parseProperty</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseProperty: function(</td><td class=PParameter nowrap>xmlNode,</td></tr><tr><td></td><td class=PParameter nowrap>namespace,</td></tr><tr><td></td><td class=PParameter nowrap>tagName</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Accept Feature Collection, and return a string.</p><h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.createFolderXML"></a>createFolderXML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createFolderXML: function()</td></tr></table></blockquote><p>Creates and returns a KML folder node</p><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.createPlacemarkXML"></a>createPlacemarkXML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createPlacemarkXML: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Creates and ret [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometryNode"></a>buildGeometryNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildGeometryNode: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Builds and return [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry"></a>buildGeometry</h3><div class=CBody><p>Object containing methods to do the actual geometry node building based on geometry type.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry.point"></a>buildGeometry.<span class=HB> </span>point</h3><div class=CBody><p>Given an OpenLayers point geometry, create a KML point.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link42 onMo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry.multipoint"></a>buildGeometry.<span class=HB> </span>multipoint</h3><div class=CBody><p>Given an OpenLayers multipoint geometry, create a KML GeometryCollection.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry.linestring"></a>buildGeometry.<span class=HB> </span>linestring</h3><div class=CBody><p>Given an OpenLayers linestring geometry, create a KML linestring.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/LineString-js.html#OpenLayers.Geometry.LineStrin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry.multilinestring"></a>buildGeometry.<span class=HB> </span>multilinestring</h3><div class=CBody><p>Given an OpenLayers multilinestring geometry, create a KML GeometryCollection.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/Point-js.html#OpenLayers. [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry.linearring"></a>buildGeometry.<span class=HB> </span>linearring</h3><div class=CBody><p>Given an OpenLayers linearring geometry, create a KML linearring.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/LinearRing-js.html#OpenLayers.Geometry.LinearRin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry.polygon"></a>buildGeometry.<span class=HB> </span>polygon</h3><div class=CBody><p>Given an OpenLayers polygon geometry, create a KML polygon.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry.multipolygon"></a>buildGeometry.<span class=HB> </span>multipolygon</h3><div class=CBody><p>Given an OpenLayers multipolygon geometry, create a KML GeometryCollection.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry. [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildGeometry.collection"></a>buildGeometry.<span class=HB> </span>collection</h3><div class=CBody><p>Given an OpenLayers geometry collection, create a KML MultiGeometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry/Collection-js.html#OpenLayers.Geometry.Collec [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.KML.buildCoordinatesNode"></a>buildCoordinatesNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>buildCoordinatesNode: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Builds a [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>{Boolean} Extract gx:Track elements from Placemark elements. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read data from  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/OSM-js.html b/doc/devdocs/files/OpenLayers/Format/OSM-js.html
new file mode 100644
index 0000000..8482b67
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/OSM-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OSM - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OSM"></a>OpenLayers.<span class=HB> </span>Format.OSM</h1><div class=CBody><p>OSM parser.  Create a new instance with the <a href="#OpenLayers.Format.OSM.OpenLayers.Format.OSM" class=LConstructor id=link10 onMouseOver="ShowTip(event, 'tt10', 'link10')" onMouseOut="HideTip('tt10')">OpenLayers.Format.OSM</a> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.checkTags"></a>checkTags</h3><div class=CBody><p>{Boolean} Should tags be checked to determine whether something should be treated as a seperate node.  Will slow down parsing.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.interestingTagsExclude"></a>interestingTagsExclude</h3><div class=CBody><p>{Array} List of tags to exclude from ‘interesting’ checks on nodes.  Must be set when creating the format.  Will only be used if checkTags is set.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.areaTags"></a>areaTags</h3><div class=CBody><p>{Array} List of tags indicating that something is an area.  Must be set when creating the format.  Will only be used if checkTags is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.OpenLayers.Format.OSM"></a>OpenLayers.<span class=HB> </span>Format.OSM</h3><div class=CBody><p>Create a new parser for OSM.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.getNodes"></a>getNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNodes: function(</td><td class=PParameter nowrap>doc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return the node items from a doc.</p><h4 class=CH [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.getWays"></a>getWays</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getWays: function(</td><td class=PParameter nowrap>doc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return the way items from a doc.</p><h4 class=CHeadi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.getTags"></a>getTags</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getTags: function(</td><td class=PParameter nowrap>dom_node,</td></tr><tr><td></td><td class=PParameter nowrap>interesting_tags</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.isWayArea"></a>isWayArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isWayArea: function(</td><td class=PParameter nowrap>way</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a way object from getWays, check whether [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a list of features, returns a serialized OSM fo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.createFeatureNodes"></a>createFeatureNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeatureNodes: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a feature [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.createXML"></a>createXML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createXML:</td></tr></table></blockquote><p>Takes a feature, returns a list of nodes from size 0->n.  Will include all pieces of the serialization that are required which have not already been created.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.serializeTags"></a>serializeTags</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>serializeTags: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OSM.setState"></a>setState</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setState: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNodes: function(</td><td class=PParameter nowrap>doc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Return the node items from a doc.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1-js.html b/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1-js.html
new file mode 100644
index 0000000..765ca41
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSCommon.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSCommon.v1</h1><div class=CBody><p>Common readers and writers for OWSCommon v1.X formats</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers. [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1.regExes"></a>regExes</h3><div class=CBody><p>Compiled regular expressions for manipulating strings.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([14, 15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1_0_0-js.html
new file mode 100644
index 0000000..8a1b6ce
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1_0_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSCommon.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSCommon.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Parser for OWS Common version 1.0.0 which can be used by other parsers.  It is not intended to be used on its own.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_0_0.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_0_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_0_0.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([14, 15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1_1_0-js.html b/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1_1_0-js.html
new file mode 100644
index 0000000..8097763
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/OWSCommon/v1_1_0-js.html
@@ -0,0 +1,45 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSCommon.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSCommon.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Parser for OWS Common version 1.1.0 which can be used by other parsers.  It is not intended to be used on its own.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_1_0.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSCommon.v1_1_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([14, 15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/OWSContext-js.html b/doc/devdocs/files/OpenLayers/Format/OWSContext-js.html
new file mode 100644
index 0000000..c6301b8
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/OWSContext-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSContext - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSContext"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext</h1><div class=CBody><p>Read and write OWS Context documents.  OWS Context documents are a preliminary OGC (Open Geospatial Consortium) standard for storing the state of a web mapping application.  In a way it is the successor to Web Map Context (WMC), since it is more generic an [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “0.3.1”.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.getParser"></a>getParser</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getParser: function(</td><td class=PParameter nowrap>version</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get the OWSContext parser given a v [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.toContext"></a>toContext</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toContext: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a context object free from layer [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getParser: function(</td><td class=PParameter nowrap>version</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Get the OWSContext parser given a version. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/OWSContext/v0_3_1-js.html b/doc/devdocs/files/OpenLayers/Format/OWSContext/v0_3_1-js.html
new file mode 100644
index 0000000..e7de6eb
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/OWSContext/v0_3_1-js.html
@@ -0,0 +1,89 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.OWSContext.v0_3_1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext.<span class=HB> </span>v0_3_1</h1><div class=CBody><p>Read and write OWSContext version 0.3.1.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6') [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 0.3.1</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.defaultPrefix"></a>defaultPrefix</h3><div class=CBody><p>{String} Default namespace prefix to use.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from GML.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) Changing is not recommended, a new Format should be instantiated.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.regExes"></a>regExes</h3><div class=CBody><p>Compiled regular expressions for manipulating strings.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.featureNS"></a>featureNS</h3><div class=CBody><p>{String} The namespace uri to use for writing InlineGeometry</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.featureType"></a>featureType</h3><div class=CBody><p>{String} The name to use as the feature type when writing out InlineGeometry</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.geometryName"></a>geometryName</h3><div class=CBody><p>{String} The name to use for the geometry attribute when writing out InlineGeometry</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.nestingLayerLookup"></a>nestingLayerLookup</h3><div class=CBody><p>{Object} Hashtable lookup for nesting layer nodes.  Used while writing the OWS context document.  It is necessary to keep track of the nestingPaths for which nesting layer nodes have already been created, so (nesting) layer nodes are added to those nodes.</p><h4 class=CHeading>For example</h4><h4 class=CHeading [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.OpenLayers.Format.OWSContext.v0_3_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext.<span class=HB> </span>v0_3_1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../OWSContext-js.html#OpenLayers.Format.OWSContext" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.setNestingPath"></a>setNestingPath</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setNestingPath : function(</td><td class=PParameter nowrap>l</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the nestingPat [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.decomposeNestingPath"></a>decomposeNestingPath</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>decomposeNestingPath: function(</td><td class=PParameter nowrap>nPath</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read OWS context data from a string or DOMElem [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.processLayer"></a>processLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>processLayer: function(</td><td class=PParameter nowrap>layerArray,</td></tr><tr><td></td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.OWSContext.v0_3_1.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setNestingPath : function(</td><td class=PParameter nowrap>l</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Set the nestingPath property of the layer depending on the position of the layer in hierarchy of layers.</div></div><div class=CTo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/SLD-js.html b/doc/devdocs/files/OpenLayers/Format/SLD-js.html
new file mode 100644
index 0000000..63eade2
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/SLD-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SLD - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SLD"></a>OpenLayers.<span class=HB> </span>Format.SLD</h1><div class=CBody><p>Read/Wite SLD.  Create a new instance with the <a href="#OpenLayers.Format.SLD.OpenLayers.Format.SLD" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.SLD</a> constructor.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.namedLayersAsArray"></a>namedLayersAsArray</h3><div class=CBody><p>{Boolean} Generate a namedLayers array.   If false, the namedLayers property value will be an object keyed by layer name.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.parser"></a>parser</h3><div class=CBody><p>{Object} Instance of the versioned parser.   Cached for multiple read and write calls of the same version.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.OpenLayers.Format.SLD"></a>OpenLayers.<span class=HB> </span>Format.SLD</h3><div class=CBody><p>Create a new parser for SLD.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>sld,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>R [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([8, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>sld,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Write a SLD document given a list of styles.</div></div><div class=CToolTip id= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/SLD/v1-js.html b/doc/devdocs/files/OpenLayers/Format/SLD/v1-js.html
new file mode 100644
index 0000000..4a3a36e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/SLD/v1-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SLD.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SLD.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SLD.v1</h1><div class=CBody><p>Superclass for SLD version 1 parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Filter/v1_0_0-js.html#OpenLayers.Format.Filter.v1_0_0" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt6', 'link7')" onMouseOut="HideTip('tt6')">OpenLayers.Format.Filter.v [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.defaultPrefix"></a>defaultPrefix</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location for a particular minor version.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.multipleSymbolizers"></a>multipleSymbolizers</h3><div class=CBody><p>{Boolean} Support multiple symbolizers per rule.   Default is false.   if true, an OpenLayers.Style2 instance will be created to represent user styles instead of an OpenLayers.Style instace.   The OpenLayers.Style2 class allows collections of rules with multiple symbolizers, but is not currently useful for client s [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.featureTypeCounter"></a>featureTypeCounter</h3><div class=CBody><p>{Number} Private counter for multiple feature type styles.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.defaultSymbolizer"></a>defaultSymbolizer.</h3><div class=CBody><p>{Object} A symbolizer with the SLD defaults.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.OpenLayers.Format.SLD.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SLD.v1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../SLD-js.html#OpenLayers.Format.SLD" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt8', 'link9')" onMouseOut="HideTip('tt8')">OpenLayers.Format.SLD</a> constructor instead.</p><h4 class=CHead [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>< [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.cssMap"></a>cssMap</h3><div class=CBody><p>{Object} Object mapping supported css property names to OpenLayers symbolizer property names.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.getCssProperty"></a>getCssProperty</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getCssProperty: function(</td><td class=PParameter nowrap>sym</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a symbolizer property, [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.getGraphicFormat"></a>getGraphicFormat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGraphicFormat: function(</td><td class=PParameter nowrap>href</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a href for an e [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.defaultGraphicFormat"></a>defaultGraphicFormat</h3><div class=CBody><p>{String} If none other can be determined from <a href="#OpenLayers.Format.SLD.v1.getGraphicFormat" class=LFunction id=link12 onMouseOver="ShowTip(event, 'tt4', 'link12')" onMouseOut="HideTip('tt4')">getGraphicFormat</a>, this default will be returned.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.graphicFormats"></a>graphicFormats</h3><div class=CBody><p>{Object} Mapping of image mime-types to regular extensions matching well-known file extensions.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>sld</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspac [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([8, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><tabl [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/SLD/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Format/SLD/v1_0_0-js.html
new file mode 100644
index 0000000..ba3ea34
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/SLD/v1_0_0-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SLD.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SLD.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Write SLD version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1-js.html#OpenLayers.Format.SLD.v1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Format.SLD.v1</a>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} <a href="http://www.opengis.net/sld" class=LURL target=_top>http://www.opengis.net/sld</a> <a href="http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" class=LURL target=_top>http://schemas.opengis.net<span class=HB>- </span>/sld<span class=HB>- </span>/1.0.0<span class=HB>- </span>/StyledLayerDescriptor.xsd</a></p [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SLD.v1_0_0.OpenLayers.Format.SLD.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SLD.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../SLD-js.html#OpenLayers.Format.SLD" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.SLD</a> cons [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([8, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Superclass for SLD version 1 parsers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read/Wite SLD. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/SOSCapabilities-js.html b/doc/devdocs/files/OpenLayers/Format/SOSCapabilities-js.html
new file mode 100644
index 0000000..f6e3d09
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/SOSCapabilities-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SOSCapabilities - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SOSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSCapabilities</h1><div class=CBody><p>Read SOS Capabilities.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.XML</a></li></ul><!--START_N [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.parser"></a>parser</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} A cached versioned format used for reading.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.OpenLayers.Format.SOSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSCapabilities</h3><div class=CBody><p>Create a new parser for SOS capabilities.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose prope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and return [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/SOSCapabilities/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Format/SOSCapabilities/v1_0_0-js.html
new file mode 100644
index 0000000..b7d52de
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/SOSCapabilities/v1_0_0-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SOSCapabilities.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSCapabilities.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Read SOS Capabilities version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../SOSCapabilities-js.html#OpenLayers.Format.SOSCapabilities" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.regExes"></a>regExes</h3><div class=CBody><p>Compiled regular expressions for manipulating strings.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.OpenLayers.Format.SOSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSCapabilities.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Create a new parser for SOS capabilities version 1.0.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSCapabilities.v1_0_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return info about the SOS.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read SOS Ca [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/SOSGetFeatureOfInterest-js.html b/doc/devdocs/files/OpenLayers/Format/SOSGetFeatureOfInterest-js.html
new file mode 100644
index 0000000..08727b4
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/SOSGetFeatureOfInterest-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SOSGetFeatureOfInterest - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSGetFeatureOfInterest</h1><div class=CBody><p>Read and write SOS GetFeatureOfInterest.  This is used to get to the location of the features (stations).  The stations can have 1 or more sensors.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Fo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.defaultPrefix"></a>defaultPrefix</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.regExes"></a>regExes</h3><div class=CBody><p>Compiled regular expressions for manipulating strings.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.OpenLayers.Format.SOSGetFeatureOfInterest"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSGetFeatureOfInterest</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on thi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse a GetFeatureOfInterest response an [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetFeatureOfInterest.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Parse a GetFeatureOfInterest response and return an array of features</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and w [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/SOSGetObservation-js.html b/doc/devdocs/files/OpenLayers/Format/SOSGetObservation-js.html
new file mode 100644
index 0000000..d5388a6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/SOSGetObservation-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.SOSGetObservation - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.SOSGetObservation"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSGetObservation</h1><div class=CBody><p>Read and write SOS GetObersation (to get the actual values from a sensor) version 1.0.0</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.regExes"></a>regExes</h3><div class=CBody><p>Compiled regular expressions for manipulating strings.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.defaultPrefix"></a>defaultPrefix</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.OpenLayers.Format.SOSGetObservation"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>SOSGetObservation</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bo [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.SOSGetObservation.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/Text-js.html b/doc/devdocs/files/OpenLayers/Format/Text-js.html
new file mode 100644
index 0000000..0d02bea
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/Text-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.Text - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.Text"></a>OpenLayers.<span class=HB> </span>Format.Text</h1><div class=CBody><p>Read Text format.  Create a new instance with the <a href="#OpenLayers.Format.Text.OpenLayers.Format.Text" class=LConstructor id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.Text</a> constructor.  This reads text which is formatted like CS [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.defaultStyle"></a>defaultStyle</h3><div class=CBody><p>defaultStyle allows one to control the default styling of the features.  It should be a symbolizer hash.  By default, this is set to match the Layer.Text behavior, which is to use the default OpenLayers Icon.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.extractStyles"></a>extractStyles</h3><div class=CBody><p>set to true to extract styles from the TSV files, using information from the image or icon, iconSize and iconOffset fields.  This will result in features with a symbolizer (style) property set, using the default symbolizer specified in <a href="#OpenLayers.Format.Text.defaultStyle" class=LProperty id=link5 onMouseOver="ShowTip(event, 'tt5 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.OpenLayers.Format.Text"></a>OpenLayers.<span class=HB> </span>Format.Text</h3><div class=CBody><p>Create a new parser for TSV Text.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.Text.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>text</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of features from a Tab Seperated Values text  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>text</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Return a list of features from a Tab Seperated Values text string.</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFS-js.html b/doc/devdocs/files/OpenLayers/Format/WFS-js.html
new file mode 100644
index 0000000..41fdd7e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFS-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFS"></a>OpenLayers.<span class=HB> </span>Format.WFS</h1><div class=CBody><p>Read/Write WFS.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="GML-js.html#OpenLayers.Format.GML" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt7')">OpenLayers.Format.GML</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.layer"></a>layer</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.wfsns"></a>wfsns</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.ogcns"></a>ogcns</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.OpenLayers.Format.WFS"></a>OpenLayers.<span class=HB> </span>Format.WFS</h3><div class=CBody><p>Create a WFS-T formatter.  This requires a layer: that layer should have two properties: geometry_column and typename.  The parser for this format is subclassed entirely from GML: There is a writer only, which uses most of the code from the GML layer, and wraps it in transactional elements.</p [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a feature list, and generates a WFS-T Transacti [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.createFeatureXML"></a>createFeatureXML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeatureXML: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Param [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.insert"></a>insert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>insert: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a feature, and generates a WFS-T Transaction  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>update: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a feature, and generates a WFS-T Transaction  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.remove"></a>remove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>remove: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a feature, and generates a WFS-T Transaction  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Remove ciruclar ref to layer</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Takes a feature list, and generates a WFS-T Transaction</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><tab [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFSCapabilities-js.html b/doc/devdocs/files/OpenLayers/Format/WFSCapabilities-js.html
new file mode 100644
index 0000000..96c2079
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFSCapabilities-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSCapabilities - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities</h1><div class=CBody><p>Read WFS Capabilities.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.XML</a></li></ul><!--START_N [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.1.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.OpenLayers.Format.WFSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities</h3><div class=CBody><p>Create a new parser for WFS capabilities.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose prope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and return [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([9, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return a list of layers.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read and writ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1-js.html b/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1-js.html
new file mode 100644
index 0000000..c816662
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSCapabilities.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities.v1</h1><div class=CBody><p>Abstract class not to be instantiated directly.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.F [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.OpenLayers.Format.WFSCapabilities.v1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities.v1_1</h3><div class=CBody><p>Create an instance of one of the subclasses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional ob [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and ret [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.runChildNodes"></a>runChildNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>runChildNodes: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.read_cap_FeatureTypeList"></a>read_cap_FeatureTypeList</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_FeatureTypeList: function(</td><td class=PParameter nowrap>request,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAf [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.read_cap_FeatureType"></a>read_cap_FeatureType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_FeatureType: function(</td><td class=PParameter nowrap>featureTypeList,</td></tr><tr><td></td><td class=PParameter nowrap>node,</td></tr><tr><td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.read_cap_Name"></a>read_cap_Name</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Name: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.read_cap_Title"></a>read_cap_Title</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Title: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities.v1.read_cap_Abstract"></a>read_cap_Abstract</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Abstract: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([9, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return a list of layers.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquot [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1_0_0-js.html
new file mode 100644
index 0000000..b7f21b3
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1_0_0-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSCapabilities/v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities/<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Read WMS Capabilities version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../WFSCapabilities-js.html#OpenLayers.Format.WFSCapabilities" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt14', 'lin [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.OpenLayers.Format.WFSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Create a new parser for WFS capabilities version 1.0.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_Service"></a>read_cap_Service</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Service: function(</td><td class=PParameter nowrap>capabilities,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters n [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_Fees"></a>read_cap_Fees</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Fees: function(</td><td class=PParameter nowrap>service,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_AccessConstraints"></a>read_cap_AccessConstraints</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_AccessConstraints: function(</td><td class=PParameter nowrap>service,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_OnlineResource"></a>read_cap_OnlineResource</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_OnlineResource: function(</td><td class=PParameter nowrap>service,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PA [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_Keywords"></a>read_cap_Keywords</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Keywords: function(</td><td class=PParameter nowrap>service,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters now [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_Capability"></a>read_cap_Capability</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Capability: function(</td><td class=PParameter nowrap>capabilities,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterPar [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_Request"></a>read_cap_Request</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Request: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_GetFeature"></a>read_cap_GetFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_GetFeature: function(</td><td class=PParameter nowrap>request,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParamete [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_ResultFormat"></a>read_cap_ResultFormat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_ResultFormat: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParame [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_DCPType"></a>read_cap_DCPType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_DCPType: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_HTTP"></a>read_cap_HTTP</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_HTTP: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_Get"></a>read_cap_Get</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Get: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_0_0.read_cap_Post"></a>read_cap_Post</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Post: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([9, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_cap_Service: function(</td><td class=PParameter nowrap>capabilities,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1_1_0-js.html b/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1_1_0-js.html
new file mode 100644
index 0000000..003f413
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFSCapabilities/v1_1_0-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFSCapabilities/v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities/<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Read WFS Capabilities version 1.1.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../WFSCapabilities-js.html#OpenLayers.Format.WFSCapabilities" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSCapabilities/v1_1_0.OpenLayers.Format.WFSCapabilities.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSCapabilities.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>Create a new parser for WFS capabilities version 1.1.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([9, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read WFS Capabilities.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFSDescribeFeatureType-js.html b/doc/devdocs/files/OpenLayers/Format/WFSDescribeFeatureType-js.html
new file mode 100644
index 0000000..4c656ed
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFSDescribeFeatureType-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSDescribeFeatureType.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="WFSDescribeFeatureType.js"></a>WFSDescribeFeatureType.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#WFSDescribeFeatureType.js" >WFSDescribeFeatureType.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEnt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFSDescribeFeatureType"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFSDescribeFeatureType</h3><div class=CBody><p>Create a new parser for WFS DescribeFeatureType responses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properti [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="readRestriction"></a>readRestriction</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>readRestriction: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=C [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>readRestriction: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Reads restriction defined in the child nodes of a restriction element</d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFST-js.html b/doc/devdocs/files/OpenLayers/Format/WFST-js.html
new file mode 100644
index 0000000..c33ba65
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFST-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="WFST.js"></a>WFST.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#WFST.js" >WFST.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST"></a>OpenLayers.<span class=HB> </span>Format.WFST</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Format.WFST = function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>U [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>DEFAULTS</h3><div class=CBody><p>{Object} Default properties for the WFST format.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([10, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Format.WFST = function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Used to create a versioned WFS protocol. </div></div><div class=CToolTip id="tt2"><div class=CClass>Base class for f [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFST/v1-js.html b/doc/devdocs/files/OpenLayers/Format/WFST/v1-js.html
new file mode 100644
index 0000000..69db2c1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFST/v1-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFST.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFST.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.v1</h1><div class=CBody><p>Superclass for WFST parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">OpenLayers.Format.XML</a></li></ul><!--START_ND_SUMMA [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.defaultPrefix"></a>defaultPrefix</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.version"></a>version</h3><div class=CBody><p>{String} WFS version number.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location for a particular minor version.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.srsName"></a>srsName</h3><div class=CBody><p>{String} URI for spatial reference system.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Extract attributes from GML.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.xy"></a>xy</h3><div class=CBody><p>{Boolean} Order of the GML coordinate true:(x,y) or false:(y,x) Changing is not recommended, a new Format should be instantiated.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.stateName"></a>stateName</h3><div class=CBody><p>{Object} Maps feature states to node names.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.OpenLayers.Format.WFST.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.v1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="v1_0_0-js.html#OpenLayers.Format.WFST.v1_0_0" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt7')">OpenLayers.Format.WFST.v1_0_0</a> or <a href="v1_1_0-j [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.getSrsName"></a>getSrsName</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getSrsName: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given an array of features, write a WFS transacti [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.schemaLocationAttr"></a>schemaLocationAttr</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>schemaLocationAttr: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Generate th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1.setFilterProperty"></a>setFilterProperty</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setFilterProperty: function(</td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the propert [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([10, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getSrsName: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockqu [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFST/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Format/WFST/v1_0_0-js.html
new file mode 100644
index 0000000..c8b71c7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFST/v1_0_0-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFST.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>A format for creating WFS v1.0.0 transactions.   Create a new instance with the <a href="#OpenLayers.Format.WFST.v1_0_0.OpenLayers.Format.WFST.v1_0_0" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut=" [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.version"></a>version</h3><div class=CBody><p>{String} WFS version number.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.srsNameInQuery"></a>srsNameInQuery</h3><div class=CBody><p>{Boolean} If true the reference system is passed in Query requests via the “srsName” attribute to the “wfs:Query” element, this property defaults to false as it isn’t WFS 1.0.0 compliant.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.schemaLocations"></a>schemaLocations</h3><div class=CBody><p>{Object} Properties are namespace aliases, values are schema locations.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.OpenLayers.Format.WFST.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>A class for parsing and generating WFS v1.0.0 transactions.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} O [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_0_0.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([10, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>A class for parsing and generating WFS v1.0.0 transactions.</div></div><div class=CToolTip id="tt2"><div class=CClass>Write ogc:Filter version 1.0.0.</div></div><div class=CToolTip id="tt3"><div class=CClass>Superclass for WFST parsers.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WFST/v1_1_0-js.html b/doc/devdocs/files/OpenLayers/Format/WFST/v1_1_0-js.html
new file mode 100644
index 0000000..fe43bb5
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WFST/v1_1_0-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WFST.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>A format for creating WFS v1.1.0 transactions.   Create a new instance with the <a href="#OpenLayers.Format.WFST.v1_1_0.OpenLayers.Format.WFST.v1_1_0" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut=" [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.version"></a>version</h3><div class=CBody><p>{String} WFS version number.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.schemaLocations"></a>schemaLocations</h3><div class=CBody><p>{Object} Properties are namespace aliases, values are schema locations.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.OpenLayers.Format.WFST.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WFST.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>A class for parsing and generating WFS v1.1.0 transactions.</p><p>To read additional information like hit count (numberOfFeatures) from the  FeatureCollection, call the <a href="v1-js.html#OpenLayers.Format.WFST.v1.read" class=LFuncti [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WFST.v1_1_0.writers"></a>writers</h3><div class=CBody><p>As a compliment to the readers property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([10, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>A class for parsing and generating WFS v1.1.0 transactions.</div></div><div class=CToolTip id="tt2"><div class=CClass>Write ogc:Filter version 1.1.0.</div></div><div class=CToolTip id="tt3"><div class=CClass>Superclass for WFST parsers.</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBe [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WKT-js.html b/doc/devdocs/files/OpenLayers/Format/WKT-js.html
new file mode 100644
index 0000000..00c8cf0
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WKT-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WKT - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WKT"></a>OpenLayers.<span class=HB> </span>Format.WKT</h1><div class=CBody><p>Class for reading and writing Well-Known Text.   Create a new instance with the <a href="#OpenLayers.Format.WKT.OpenLayers.Format.WKT" class=LConstructor id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.WKT</a> constructor.</p><h4 class=CHeading>I [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WKT.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WKT.OpenLayers.Format.WKT"></a>OpenLayers.<span class=HB> </span>Format.WKT</h3><div class=CBody><p>Create a new parser for WKT</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose properties will be set on this instance</td></tr></table><h4 class=CHeading>Re [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WKT.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WKT.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>wkt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Deserialize a WKT string and return a vector feature or an ar [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WKT.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Serialize a feature or array of features into a WKT s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>wkt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Deserialize a WKT string and return a vector feature or an array of vector features. </div></div><div class=CToolTip id="tt2"><div class=CF [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMC-js.html b/doc/devdocs/files/OpenLayers/Format/WMC-js.html
new file mode 100644
index 0000000..1b863a2
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMC-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMC - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMC"></a>OpenLayers.<span class=HB> </span>Format.WMC</h1><div class=CBody><p>Read and write Web Map Context documents.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Format.XML</a></li></ul><!--START_ND_SUMMARY--><div class=Summa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.1.0”.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.getParser"></a>getParser</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getParser: function(</td><td class=PParameter nowrap>version</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get the WMC parser given a version.   [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.layerToContext"></a>layerToContext</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>layerToContext: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a layer context object [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.toContext"></a>toContext</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>toContext: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a context object free from layer given  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([11, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getParser: function(</td><td class=PParameter nowrap>version</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Get the WMC parser given a version. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cell [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMC/v1-js.html b/doc/devdocs/files/OpenLayers/Format/WMC/v1-js.html
new file mode 100644
index 0000000..4be8ce3
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMC/v1-js.html
@@ -0,0 +1,147 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMC.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMC.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.v1</h1><div class=CBody><p>Superclass for WMC version 1 parsers.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link46 onMouseOver="ShowTip(event, 'tt46', 'link46')" onMouseOut="HideTip('tt46')">OpenLayers.Format.XML</a></li></ul><!--STA [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.Properties_and_Functions"></a>Properties and Functions</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} Schema location for a particular minor version.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.getNamespacePrefix"></a>getNamespacePrefix</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNamespacePrefix: function(</td><td class=PParameter nowrap>uri</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get the namespac [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.defaultPrefix"></a>defaultPrefix</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.rootPrefix"></a>rootPrefix</h3><div class=CBody><p>{String} Prefix on the root node that maps to the context namespace URI.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.defaultStyleName"></a>defaultStyleName</h3><div class=CBody><p>{String} Style name used if layer has no style param.   Default is “”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.defaultStyleTitle"></a>defaultStyleTitle</h3><div class=CBody><p>{String} Default style title.   Default is “Default”.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.OpenLayers.Format.WMC.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.v1</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../WMC-js.html#OpenLayers.Format.WMC" class=LClass id=link48 onMouseOver="ShowTip(event, 'tt47', 'link48')" onMouseOut="HideTip('tt47')">OpenLayers.Format.WMC</a> constructor instead.</p><h4 class=C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and return a list o [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.runChildNodes"></a>runChildNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>runChildNodes: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_General"></a>read_wmc_General</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_General: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_BoundingBox"></a>read_wmc_BoundingBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_BoundingBox: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_LayerList"></a>read_wmc_LayerList</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_LayerList: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_Layer"></a>read_wmc_Layer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_Layer: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_Extension"></a>read_wmc_Extension</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_Extension: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_units"></a>read_ol_units</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_units: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_maxExtent"></a>read_ol_maxExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_maxExtent: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_transparent"></a>read_ol_transparent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_transparent: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>) [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_numZoomLevels"></a>read_ol_numZoomLevels</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_numZoomLevels: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_opacity"></a>read_ol_opacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_opacity: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_singleTile"></a>read_ol_singleTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_singleTile: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_tileSize"></a>read_ol_tileSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_tileSize: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_isBaseLayer"></a>read_ol_isBaseLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_isBaseLayer: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>) [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_ol_displayInLayerSwitcher"></a>read_ol_displayInLayerSwitcher</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_ol_displayInLayerSwitcher: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_Server"></a>read_wmc_Server</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_Server: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_FormatList"></a>read_wmc_FormatList</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_FormatList: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>) [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_Format"></a>read_wmc_Format</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_Format: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_StyleList"></a>read_wmc_StyleList</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_StyleList: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_Style"></a>read_wmc_Style</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_Style: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_SLD"></a>read_wmc_SLD</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_SLD: function(</td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_sld_StyledLayerDescriptor"></a>read_sld_StyledLayerDescriptor</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_sld_StyledLayerDescriptor: function(</td><td class=PParameter nowrap>sld,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_OnlineResource"></a>read_wmc_OnlineResource</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_OnlineResource: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowra [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_Name"></a>read_wmc_Name</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_Name: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_Title"></a>read_wmc_Title</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_Title: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_MetadataURL"></a>read_wmc_MetadataURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_MetadataURL: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowra [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_Abstract"></a>read_wmc_Abstract</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_Abstract: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.read_wmc_LegendURL"></a>read_wmc_LegendURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_wmc_LegendURL: function(</td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockq [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.createElementDefaultNS"></a>createElementDefaultNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createElementDefaultNS: function(</td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>childValue,</td></tr><tr><td></td><td class [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.setAttributes"></a>setAttributes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setAttributes: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_General"></a>write_wmc_General</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_General: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a Genera [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_ol_MapExtension"></a>write_ol_MapExtension</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_ol_MapExtension: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_LayerList"></a>write_wmc_LayerList</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_LayerList: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_Layer"></a>write_wmc_Layer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_Layer: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a Layer node g [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_LayerExtension"></a>write_wmc_LayerExtension</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_LayerExtension: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.createOLPropertyNode"></a>createOLPropertyNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createOLPropertyNode: function(</td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>prop</td><td class=PAfterParameters nowrap>)</td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_Server"></a>write_wmc_Server</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_Server: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a Server no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_MetadataURL"></a>write_wmc_MetadataURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_MetadataURL: function(</td><td class=PParameter nowrap>metadataURL</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_FormatList"></a>write_wmc_FormatList</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_FormatList: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_StyleList"></a>write_wmc_StyleList</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_StyleList: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a St [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1.write_wmc_OnlineResource"></a>write_wmc_OnlineResource</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_OnlineResource: function(</td><td class=PParameter nowrap>href</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([11, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNamespacePrefix: function(</td><td class=PParameter nowrap>uri</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Get the namespace prefix for a given uri from the namespaces object.</div></div><div class=CToolTip id="tt2"><div class=CProp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMC/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Format/WMC/v1_0_0-js.html
new file mode 100644
index 0000000..9e80d3b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMC/v1_0_0-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMC.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Read and write WMC version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1-js.html#OpenLayers.Format.WMC.v1" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouseOut="HideTip('tt2')">OpenLayers.Format.WM [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.0.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} <a href="http://www.opengis.net/context" class=LURL target=_top>http://www.opengis.net/context</a> <a href="http://schemas.opengis.net/context/1.0.0/context.xsd" class=LURL target=_top>http://schemas.opengis.net<span class=HB>- </span>/context<span class=HB>- </span>/1.0.0<span class=HB>- </span>/context.xsd</a></p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.OpenLayers.Format.WMC.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../WMC-js.html#OpenLayers.Format.WMC" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.WMC</a> cons [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_0_0.write_wmc_Layer"></a>write_wmc_Layer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_Layer: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a Layer no [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([11, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_Layer: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a Layer node given a layer context object. </div></div><div class=CToolTip id="tt2"><div class=CClass>Superclass for  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMC/v1_1_0-js.html b/doc/devdocs/files/OpenLayers/Format/WMC/v1_1_0-js.html
new file mode 100644
index 0000000..481c859
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMC/v1_1_0-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMC.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Read and write WMC version 1.1.0.</p><h4 class=CHeading>Differences between 1.1.0 and 1.0.0</h4><ul><li>1.1.0 Layers have optional sld:MinScaleDenominator and sld:MaxScaleDenominator</li></ul><h4 class=CHeading>Inherits from</h4><ul><li><a hre [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.VERSION"></a>VERSION</h3><div class=CBody><p>{String} 1.1.0</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.schemaLocation"></a>schemaLocation</h3><div class=CBody><p>{String} <a href="http://www.opengis.net/context" class=LURL target=_top>http://www.opengis.net/context</a> <a href="http://schemas.opengis.net/context/1.1.0/context.xsd" class=LURL target=_top>http://schemas.opengis.net<span class=HB>- </span>/context<span class=HB>- </span>/1.1.0<span class=HB>- </span>/context.xsd</a></p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.OpenLayers.Format.WMC.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMC.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>Instances of this class are not created directly.   Use the <a href="../WMC-js.html#OpenLayers.Format.WMC" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Format.WMC</a> cons [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.read_sld_MinScaleDenominator"></a>read_sld_MinScaleDenominator</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_sld_MinScaleDenominator: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.read_sld_MaxScaleDenominator"></a>read_sld_MaxScaleDenominator</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_sld_MaxScaleDenominator: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMC.v1_1_0.write_wmc_Layer"></a>write_wmc_Layer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write_wmc_Layer: function(</td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a Layer no [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([11, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_sld_MinScaleDenominator: function(</td><td class=PParameter nowrap>layerContext,</td></tr><tr><td></td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read a sld:MinScaleDenominator node.</div></div><d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSCapabilities-js.html b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities-js.html
new file mode 100644
index 0000000..1daadc4
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities</h1><div class=CBody><p>Read WMS Capabilities.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt3', 'link3')" onMouseOut="HideTip('tt3')">OpenLayers.Format.XML</a></li></ul><!--START_N [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.1.1”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.parser"></a>parser</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} A cached versioned format used for reading.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.OpenLayers.Format.WMSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities</h3><div class=CBody><p>Create a new parser for WMS capabilities.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose prope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and return [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1-js.html b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1-js.html
new file mode 100644
index 0000000..c380bb3
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.v1</h1><div class=CBody><p>Abstract class not to be instantiated directly.  Creates the common parts for both WMS 1.1.X and WMS 1.3.X.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../XML-js.html#OpenLayers.Format.XML" class=LClass id=link4 onMouseOver="ShowTip [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.defaultPrefix"></a>defaultPrefix</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.OpenLayers.Format.WMSCapabilities.v1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.v1</h3><div class=CBody><p>Create an instance of one of the subclasses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and ret [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.postProcessLayers"></a>postProcessLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>postProcessLayers: function(</td><td class=PParameter nowrap>capabilities</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.processLayer"></a>processLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>processLayer: function(</td><td class=PParameter nowrap>capability,</td></tr><tr><td></td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowra [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return a list of layers.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquot [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1-js.html b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1-js.html
new file mode 100644
index 0000000..ddc8710
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities.v1_1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.v1_1</h1><div class=CBody><p>Abstract class not to be instantiated directly.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1-js.html#OpenLayers.Format.WMSCapabilities.v1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1_1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities.v1_1.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract class not to be instantiated directly. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1_0-js.html b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1_0-js.html
new file mode 100644
index 0000000..c433105
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1_0-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities/v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities/<span class=HB> </span>v1_1_0</h1><div class=CBody><p>Read WMS Capabilities version 1.1.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1_1-js.html#OpenLayers.Format.WMSCapabilities.v1_1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0.version"></a>version</h3><div class=CBody><p>{String} The specific parser version.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0.OpenLayers.Format.WMSCapabilities.v1_1_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>Create a new parser for WMS capabilities version 1.1.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract class not to be instantiated directly.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1_1-js.html b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1_1-js.html
new file mode 100644
index 0000000..8b03f89
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_1_1-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities/v1_1_1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities/<span class=HB> </span>v1_1_1</h1><div class=CBody><p>Read WMS Capabilities version 1.1.1.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="v1_1-js.html#OpenLayers.Format.WMSCapabilities.v1_1" class=LClass id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1.version"></a>version</h3><div class=CBody><p>{String} The specific parser version.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1.OpenLayers.Format.WMSCapabilities.v1_1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities.<span class=HB> </span>v1_1_1</h3><div class=CBody><p>Create a new parser for WMS capabilities version 1.1.1.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_1_1.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract class not to be instantiated directly.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_3-js.html b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_3-js.html
new file mode 100644
index 0000000..15bb780
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_3-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities/v1_3 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_3"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities/<span class=HB> </span>v1_3</h1><div class=CBody><p>Abstract base class for WMS Capabilities version 1.3.X.  SLD 1.1.0 adds in the extra operations DescribeLayer and GetLegendGraphic, see: <a href="http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd" class=LURL ta [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_3.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_3.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Abstract class not to be instantiated directly. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_3_0-js.html b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_3_0-js.html
new file mode 100644
index 0000000..5ef75b4
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSCapabilities/v1_3_0-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSCapabilities/v1_3_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_3_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSCapabilities/<span class=HB> </span>v1_3_0</h1><div class=CBody><p>Read WMS Capabilities version 1.3.0.  SLD 1.1.0 adds in the extra operations DescribeLayer and GetLegendGraphic, see: <a href="http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd" class=LURL target=_top>http: [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_3_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSCapabilities/v1_3_0.version"></a>version</h3><div class=CBody><p>{String} The specific parser version.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([12, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSDescribeLayer-js.html b/doc/devdocs/files/OpenLayers/Format/WMSDescribeLayer-js.html
new file mode 100644
index 0000000..34e146f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSDescribeLayer-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSDescribeLayer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSDescribeLayer</h1><div class=CBody><p>Read SLD WMS DescribeLayer response DescribeLayer is meant to couple WMS to WFS and WCS</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', 'link2')" onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.1.1”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.OpenLayers.Format.WMSDescribeLayer"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSDescribeLayer</h3><div class=CBody><p>Create a new parser for WMS DescribeLayer responses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional obje [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read DescribeLayer data from a string, and retu [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([13, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read DescribeLayer data from a string, and return the response. </div></div><div class=CToolTip id="tt2"><div class=CClass>Read and write  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSDescribeLayer/v1_1-js.html b/doc/devdocs/files/OpenLayers/Format/WMSDescribeLayer/v1_1-js.html
new file mode 100644
index 0000000..f83cf4a
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSDescribeLayer/v1_1-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSDescribeLayer.v1_1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSDescribeLayer.v1_1</h1><div class=CBody><p>Read SLD WMS DescribeLayer response for WMS 1.1.X WMS 1.1.X is tightly coupled to SLD 1.0.0</p><h4 class=CHeading>Example DescribeLayer request</h4><p><a href="http://demo.opengeo.org/geoserver/wms?request=DescribeLayer&version=1.1.1&la [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1.OpenLayers.Format.WMSDescribeLayer"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSDescribeLayer</h3><div class=CBody><p>Create a new parser for WMS DescribeLayer responses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSDescribeLayer.v1_1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read DescribeLayer data from a string, and [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([13, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read DescribeLayer data from a string, and return the response. </div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMSGetFeatureInfo-js.html b/doc/devdocs/files/OpenLayers/Format/WMSGetFeatureInfo-js.html
new file mode 100644
index 0000000..9a1cdf7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMSGetFeatureInfo-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMSGetFeatureInfo - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSGetFeatureInfo</h1><div class=CBody><p>Class to read GetFeatureInfo responses from Web Mapping Services</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')"> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.layerIdentifier"></a>layerIdentifier</h3><div class=CBody><p>{String} All xml nodes containing this search criteria will populate an internal array of layer nodes.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.featureIdentifier"></a>featureIdentifier</h3><div class=CBody><p>{String} All xml nodes containing this search criteria will populate an internal array of feature nodes for each layer node found.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.regExes"></a>regExes</h3><div class=CBody><p>Compiled regular expressions for manipulating strings.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.gmlFormat"></a>gmlFormat</h3><div class=CBody><p>{<a href="GML-js.html#OpenLayers.Format.GML" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="HideTip('tt1')">OpenLayers.Format.GML</a>} internal GML format for parsing geometries in msGMLOutput</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.OpenLayers.Format.WMSGetFeatureInfo"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMSGetFeatureInfo</h3><div class=CBody><p>Create a new parser for WMS GetFeatureInfo responses</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional o [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read WMS GetFeatureInfo data from a string, an [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.read_msGMLOutput"></a>read_msGMLOutput</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_msGMLOutput: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse msGM [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.read_FeatureInfoResponse"></a>read_FeatureInfoResponse</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read_FeatureInfoResponse: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.getSiblingNodesByTagCriteria"></a>getSiblingNodesByTagCriteria</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getSiblingNodesByTagCriteria: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>criteria</td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.parseAttributes"></a>parseAttributes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseAttributes: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeadi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMSGetFeatureInfo.parseGeometry"></a>parseGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseGeometry: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse the geometry  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Read/Wite GML. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read WMS GetFeatureInfo data from a string, and return an array  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMTSCapabilities-js.html b/doc/devdocs/files/OpenLayers/Format/WMTSCapabilities-js.html
new file mode 100644
index 0000000..877bb2a
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMTSCapabilities-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMTSCapabilities - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMTSCapabilities</h1><div class=CBody><p>Read WMTS Capabilities.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="XML-js.html#OpenLayers.Format.XML" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Format.XML</a></li></ul><!--STAR [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.defaultVersion"></a>defaultVersion</h3><div class=CBody><p>{String} Version number to assume if none found.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.version"></a>version</h3><div class=CBody><p>{String} Specify a version string if one is known.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.parser"></a>parser</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} A cached versioned format used for reading.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.yx"></a>yx</h3><div class=CBody><p>{Object} Members in the yx object are used to determine if a CRS URN corresponds to a CRS with y,x axis order.   Member names are CRS URNs and values are boolean.   By default, the following CRS URN are assumed to correspond to a CRS with y,x axis order:</p><ul><li>urn:ogc:def:crs:EPSG::4326</li></ul></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.OpenLayers.Format.WMTSCapabilities"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMTSCapabilities</h3><div class=CBody><p>Create a new parser for WMTS capabilities.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object whose p [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, and retur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.createLayer"></a>createLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createLayer: function(</td><td class=PParameter nowrap>capabilities,</td></tr><tr><td></td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities d [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/WMTSCapabilities/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Format/WMTSCapabilities/v1_0_0-js.html
new file mode 100644
index 0000000..03e2548
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/WMTSCapabilities/v1_0_0-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.WMTSCapabilities.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMTSCapabilities.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>Read WMTS Capabilities version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../WMTSCapabilities-js.html#OpenLayers.Format.WMTSCapabilities" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt2', ' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.version"></a>version</h3><div class=CBody><p>{String} The parser version (“1.0.0”).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.yx"></a>yx</h3><div class=CBody><p>{Object} Members in the yx object are used to determine if a CRS URN corresponds to a CRS with y,x axis order.   Member names are CRS URNs and values are boolean.   Defaults come from the <a href="../WMTSCapabilities-js.html#OpenLayers.Format.WMTSCapabilities" class=LClass id=link3 onMouseOver="ShowTip(event, 'tt2', 'link3')" onMouseOut [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.defaultPrefix"></a>defaultPrefix</h3><div class=CBody><p>{String} The default namespace alias for creating element nodes.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.OpenLayers.Format.WMTSCapabilities.v1_0_0"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>WMTSCapabilities.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>Create a new parser for WMTS capabilities version 1.0.0.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read capabilities data from a string, an [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.WMTSCapabilities.v1_0_0.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>data</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Read capabilities data from a string, and return info about the WMTS.</div></div><div class=CToolTip id="tt2"><div class=CClass>Read WMTS  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Format/XML-js.html b/doc/devdocs/files/OpenLayers/Format/XML-js.html
new file mode 100644
index 0000000..6b6c629
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Format/XML-js.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Format.XML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Format.XML"></a>OpenLayers.<span class=HB> </span>Format.XML</h1><div class=CBody><p>Read and write XML.   For cross-browser XML generation, use methods on an instance of the XML format class instead of on <code>document<end>.  The DOM creation and traversing methods exposed here all mimic the W3C XML DOM methods.   Create a new parser with the <a href="#Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.namespaces"></a>namespaces</h3><div class=CBody><p>{Object} Mapping of namespace aliases to namespace URIs.   Properties of this object should not be set individually.   Read-only.   All XML subclasses should have their own namespaces object.   Use <a href="#OpenLayers.Format.XML.setNamespace" class=LFunction id=link27 onMouseOver="ShowTip(event, 'tt3', 'link27')" onMouseOut="Hide [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.namespaceAlias"></a>namespaceAlias</h3><div class=CBody><p>{Object} Mapping of namespace URI to namespace alias.   This object is read-only.   Use <a href="#OpenLayers.Format.XML.setNamespace" class=LFunction id=link28 onMouseOver="ShowTip(event, 'tt3', 'link28')" onMouseOut="HideTip('tt3')">setNamespace</a> to add or set a namespace alias.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.defaultPrefix"></a>defaultPrefix</h3><div class=CBody><p>{String} The default namespace alias for creating element nodes.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.readers"></a>readers</h3><div class=CBody><p>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name.   The function will be applied in the scope of this parser with two arguments: the node being read and a context object passed from the parent.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.writers"></a>writers</h3><div class=CBody><p>As a compliment to the <a href="#OpenLayers.Format.XML.readers" class=LProperty id=link29 onMouseOver="ShowTip(event, 'tt1', 'link29')" onMouseOut="HideTip('tt1')">readers</a> property, this structure contains public writing functions grouped by namespace alias and named like the node names they produce.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.xmldom"></a>xmldom</h3><div class=CBody><p>{XMLDom} If this browser uses ActiveX, this will be set to a XMLDOM object.   It is not intended to be a browser sniffing property.  Instead, the xmldom property is used instead of <code>document<end> where namespaced node creation methods are not supported.  In all other browsers, this remains null.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.OpenLayers.Format.XML"></a>OpenLayers.<span class=HB> </span>Format.XML</h3><div class=CBody><p>Construct an XML parser.   The parser is used to read and write XML.  Reading XML from a string returns a DOM element.   Writing XML from a DOM element returns a string.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.setNamespace"></a>setNamespace</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setNamespace: function(</td><td class=PParameter nowrap>alias,</td></tr><tr><td></td><td class=PParameter nowrap>uri</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.write"></a>write</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>write: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Serialize a DOM node into a XML string.</p><h4 class=CHea [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.createElementNS"></a>createElementNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createElementNS: function(</td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td class=PAfterParameters nowrap>)</td></tr></table></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.createTextNode"></a>createTextNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createTextNode: function(</td><td class=PParameter nowrap>text</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a text node.   Thi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getElementsByTagNameNS"></a>getElementsByTagNameNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getElementsByTagNameNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParamete [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getAttributeNodeNS"></a>getAttributeNodeNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getAttributeNodeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>nam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getAttributeNS"></a>getAttributeNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getAttributeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getChildValue"></a>getChildValue</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getChildValue: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>def</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.concatChildValues"></a>concatChildValues</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>concatChildValues: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>def</td><td class=PAfterParameters nowrap>)</td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.isSimpleContent"></a>isSimpleContent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isSimpleContent: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test if the given node has  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.contentType"></a>contentType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>contentType: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine the content type for a given  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.hasAttributeNS"></a>hasAttributeNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>hasAttributeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name</td><td cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.setAttributeNS"></a>setAttributeNS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setAttributeNS: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>uri,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.createElementNSPlus"></a>createElementNSPlus</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createElementNSPlus: function(</td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.setAttributes"></a>setAttributes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setAttributes: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.readNode"></a>readNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>readNode: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.readChildNodes"></a>readChildNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>readChildNodes: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.writeNode"></a>writeNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>writeNode: function(</td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>obj,</td></tr><tr><td></td><td class=PParameter nowrap>parent</td><td class=PAfterPar [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getChildEl"></a>getChildEl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getChildEl: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>uri</td><td class=PAfterPa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getNextEl"></a>getNextEl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNextEl: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>uri</td><td class=PAfterParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.getThisOrNextEl"></a>getThisOrNextEl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getThisOrNextEl: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>uri</td><td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.lookupNamespaceURI"></a>lookupNamespaceURI</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>lookupNamespaceURI: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>prefix</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Format.XML.OpenLayers.Format.XML.lookupNamespaceURI"></a>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>XML.<span class=HB> </span>lookupNamespaceURI</h3><div class=CBody><p>Takes a prefix and returns the namespace URI associated with it on the given node if found (and null if not).  Supplying null for the prefix will return the default namespace.</p><p>For browsers that support it, this c [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([15, 16, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>Contains public functions, grouped by namespace prefix, that will be applied when a namespaced node is found matching the function name. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry-js.html b/doc/devdocs/files/OpenLayers/Geometry-js.html
new file mode 100644
index 0000000..f00dba7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry"></a>OpenLayers.<span class=HB> </span>Geometry</h1><div class=CBody><p>A Geometry is a description of a geographic object.   Create an instance of this class with the <a href="#OpenLayers.Geometry.OpenLayers.Geometry" class=LConstructor id=link19 onMouseOver="ShowTip(event, 'tt1', 'link19')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry</a> constructor.   This is  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.id"></a>id</h3><div class=CBody><p>{String} A unique identifier for this geometry.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.parent"></a>parent</h3><div class=CBody><p>{<a href="#OpenLayers.Geometry.OpenLayers.Geometry" class=LConstructor id=link20 onMouseOver="ShowTip(event, 'tt1', 'link20')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry</a>}This is set when a Geometry is added as component of another geometry</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.bounds"></a>bounds</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt2', 'link21')" onMouseOut="HideTip('tt2')">OpenLayers.Bounds</a>} The bounds of this geometry</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.OpenLayers.Geometry"></a>OpenLayers.<span class=HB> </span>Geometry</h3><div class=CBody><p>Creates a geometry object.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy this geometry.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Create a clone of this geometry.   Does not set any non-standard properties of the cloned geometry.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Geometry.OpenLayers.Geometry" class=LConstructor id=link22 onMouseOver=" [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.clearBounds"></a>clearBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearBounds: function()</td></tr></table></blockquote><p>Nullify this components bounds and that of its parent as well.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.extendBounds"></a>extendBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extendBounds: function(</td><td class=PParameter nowrap>newBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Extend the existing bounds to inc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.getBounds"></a>getBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getBounds: function()</td></tr></table></blockquote><p>Get the bounds for this Geometry.  If bounds is not set, it is calculated again, this makes queries faster.</p><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.calculateBounds"></a>calculateBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote><p>Recalculate the bounds for the geometry.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points in this geom [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.atPoint"></a>atPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>atPoint: function(</td><td class=PParameter nowrap>lonlat,</td></tr><tr><td></td><td class=PParameter nowrap>toleranceLon,</td></tr><tr><td></td><td class=PParameter nowrap>toleranceLat</td><td class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.getLength"></a>getLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote><p>Calculate the length of this geometry.  This method is defined in subclasses.</p><h4 class=CHeading>Returns</h4><p>{Float} The length of the collection by summing its parts</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><p>Calculate the area of this geometry.  This method is defined in subclasses.</p><h4 class=CHeading>Returns</h4><p>{Float} The area of the collection by summing its parts</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.getCentroid"></a>getCentroid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCentroid: function()</td></tr></table></blockquote><p>Calculate the centroid of this geometry.  This method is defined in subclasses.</p><h4 class=CHeading>Returns</h4><p>{<a href="Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link27 onMouseOver=" [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.toString"></a>toString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString: function()</td></tr></table></blockquote><p>Returns the Well-Known Text representation of a geometry</p><h4 class=CHeading>Returns</h4><p>{String} Well-Known Text</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.OpenLayers.Geometry.fromWKT"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>fromWKT</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Geometry.fromWKT = function(</td><td class=PParameter nowrap>wkt</td><td class=PAfterParameters nowrap> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.OpenLayers.Geometry.segmentsIntersect"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>segmentsIntersect</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Geometry.segmentsIntersect = function(</td><td class=PParameter nowrap>seg1,</td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.OpenLayers.Geometry.distanceToSegment"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>distanceToSegment</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Geometry.distanceToSegment = function(</td><td class=PParameter nowrap>point,</td>< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Creates a geometry object.</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Destroy this geometry.</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/Collection-js.html b/doc/devdocs/files/OpenLayers/Geometry/Collection-js.html
new file mode 100644
index 0000000..fddc931
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/Collection-js.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Collection - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Collection"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Collection</h1><div class=CBody><p>A Collection is exactly what it sounds like: A collection of different Geometries.  These are stored in the local parameter <a href="#OpenLayers.Geometry.Collection.components" class=LProperty id=link23 onMouseOver="ShowTip(event, 'tt23', 'link23')" onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.components"></a>components</h3><div class=CBody><p>{Array(<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link28 onMouseOver="ShowTip(event, 'tt1', 'link28')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry</a>)} The component parts of this geometry</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.componentTypes"></a>componentTypes</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.OpenLayers.Geometry.Collection"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Collection</h3><div class=CBody><p>Creates a Geometry Collection -- a list of geoms.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="../Geometry-js.html#O [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote><p>Destroy this geometry.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clone this geometry.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Geometry.Collection.OpenLayers.Geometry.Collection" class=LConstructor id=link30 onMouseOver="ShowTip(event, 'tt24', 'link30')" onMouseOut="HideT [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getComponentsString"></a>getComponentsString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getComponentsString: function()</td></tr></table></blockquote><p>Get a string representing the components for this collection</p><h4 class=CHeading>Returns</h4><p>{String} A string representation of the components of this geometry</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.calculateBounds"></a>calculateBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote><p>Recalculate the bounds by iterating through the components and calling calling extendBounds() on each item.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.addComponents"></a>addComponents</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addComponents: function(</td><td class=PParameter nowrap>components</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add components to  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.addComponent"></a>addComponent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addComponent: function(</td><td class=PParameter nowrap>component,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.removeComponents"></a>removeComponents</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponents: function(</td><td class=PParameter nowrap>components</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove co [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.removeComponent"></a>removeComponent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponent: function(</td><td class=PParameter nowrap>component</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove a comp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getLength"></a>getLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote><p>Calculate the length of this geometry</p><h4 class=CHeading>Returns</h4><p>{Float} The length of the geometry</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><p>Calculate the area of this geometry.  Note how this function is overridden in <a href="Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id=link35 onMouseOver="ShowTip(event, 'tt25', 'link35')" onMouseOut=" [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getGeodesicArea"></a>getGeodesicArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicArea: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getCentroid"></a>getCentroid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getCentroid: function(</td><td class=PParameter nowrap>weighted</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Compute the centroid for t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getGeodesicLength"></a>getGeodesicLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicLength: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calcul [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>M [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.rotate"></a>rotate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>rotate: function(</td><td class=PParameter nowrap>angle,</td></tr><tr><td></td><td class=PParameter nowrap>origin</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.resize"></a>resize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>resize: function(</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>origin,</td></tr><tr><td></td><td class=PParameter nowrap>ratio</td><td class=PAfter [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether another geometry is equ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine if the input geomet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Collection.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points i [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A Geometry is a description of a geographic object. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote>Destroy this geometry.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/Curve-js.html b/doc/devdocs/files/OpenLayers/Geometry/Curve-js.html
new file mode 100644
index 0000000..a9a0c1f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/Curve-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Curve - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Curve"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Curve</h1><div class=CBody><p>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.</p><h4 class=CHeading>Inherits</h4><ul><li><a href="MultiPoint-js. [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.componentTypes"></a>componentTypes</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.OpenLayers.Geometry.Curve"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Curve</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>point</td><td class=CDLDescription>{Array(<a href="Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.getLength"></a>getLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The length of the curve</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Curve.getGeodesicLength"></a>getGeodesicLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicLength: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote>{Float} The length of the curve</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicLength: function(</td><td class=PParameter  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/LineString-js.html b/doc/devdocs/files/OpenLayers/Geometry/LineString-js.html
new file mode 100644
index 0000000..f3fdf8d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/LineString-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.LineString - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.LineString"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>LineString</h1><div class=CBody><p>A LineString is a Curve which, once two points have been added to it, can never be less than two points long.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Curve-js.html#OpenLayers.Geometry.Curve" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt9 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.OpenLayers.Geometry.LineString"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>LineString</h3><div class=CBody><p>Create a new LineString geometry</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>points</td><td class=CDLDescription>{Array(<a href="Point-js.html#OpenLayers.Geometry.Point" c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.removeComponent"></a>removeComponent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponent: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Only allows remov [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test for instersection betwee [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.getSortedSegments"></a>getSortedSegments</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getSortedSegments: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Array} An array of segment objects.   Segment objects have properties x1, y1, x2, and y2.   The start point is represented by x1 and y1.  The  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.splitWithSegment"></a>splitWithSegment</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>splitWithSegment: function(</td><td class=PParameter nowrap>seg,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.split"></a>split</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>split: function(</td><td class=PParameter nowrap>target,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.splitWith"></a>splitWith</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>splitWith: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points i [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LineString.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponent: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Only allows removal of a point if there are three or more points in the linestring. </div></div><div class=CToolTip id="tt2">< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/LinearRing-js.html b/doc/devdocs/files/OpenLayers/Geometry/LinearRing-js.html
new file mode 100644
index 0000000..c27ee29
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/LinearRing-js.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.LinearRing - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.LinearRing"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>LinearRing</h1><div class=CBody><p>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.</p><p>Also, as it is the first in the line family to close itself, a getArea() functi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.componentTypes"></a>componentTypes</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.OpenLayers.Geometry.LinearRing"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>LinearRing</h3><div class=CBody><p>Linear rings are constructed with an array of points.   This array can represent a closed or open ring.   If the ring is open (the last point does not equal the first point), the constructor will close the ring.   If the ring is already cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.addComponent"></a>addComponent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addComponent: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.removeComponent"></a>removeComponent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeComponent: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Removes a point f [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>M [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.rotate"></a>rotate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>rotate: function(</td><td class=PParameter nowrap>angle,</td></tr><tr><td></td><td class=PParameter nowrap>origin</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.resize"></a>resize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>resize: function(</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>origin,</td></tr><tr><td></td><td class=PParameter nowrap>ratio</td><td class=PAfter [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.getCentroid"></a>getCentroid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCentroid: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt8', 'link23')" onMouseOut="HideTip('tt8')">OpenLayers.Geometry.Point</a [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Note</td><td class=CDLDescription>The area is positive if the ring is oriented CW, otherwise it will be negative.</td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.getGeodesicArea"></a>getGeodesicArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicArea: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.containsPoint"></a>containsPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>containsPoint: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test if a point is insi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine if the input geomet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.LinearRing.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points i [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addComponent: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Adds a point to geometry components. </div></div><div class=CToolTip id= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/MultiLineString-js.html b/doc/devdocs/files/OpenLayers/Geometry/MultiLineString-js.html
new file mode 100644
index 0000000..e8f17b8
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/MultiLineString-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.MultiLineString - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.MultiLineString"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiLineString</h1><div class=CBody><p>A MultiLineString is a geometry with multiple <a href="LineString-js.html#OpenLayers.Geometry.LineString" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt1', 'link4')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry.LineString</a> components.</p>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.componentTypes"></a>componentTypes</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.OpenLayers.Geometry.MultiLineString"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiLineString</h3><div class=CBody><p>Constructor for a MultiLineString Geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="LineString-j [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.split"></a>split</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>split: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiLineString.splitWith"></a>splitWith</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>splitWith: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A LineString is a Curve which, once two points have been added to it, can never be less than two points long.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>split: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>op [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/MultiPoint-js.html b/doc/devdocs/files/OpenLayers/Geometry/MultiPoint-js.html
new file mode 100644
index 0000000..82e5b52
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/MultiPoint-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.MultiPoint - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.MultiPoint"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiPoint</h1><div class=CBody><p>MultiPoint is a collection of Points.   Create a new instance with the <a href="#OpenLayers.Geometry.MultiPoint.OpenLayers.Geometry.MultiPoint" class=LConstructor id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.G [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.componentTypes"></a>componentTypes</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.OpenLayers.Geometry.MultiPoint"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiPoint</h3><div class=CBody><p>Create a new MultiPoint Geometry</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="Point-js.html#OpenLayers.Geometry.Poin [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.addPoint"></a>addPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addPoint: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPoint.removePoint"></a>removePoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removePoint: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Wrapper for <a href="Collecti [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addPoint: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Wrapper for OpenLayers.Geometry.Collection.addComponent</div></div><div clas [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/MultiPolygon-js.html b/doc/devdocs/files/OpenLayers/Geometry/MultiPolygon-js.html
new file mode 100644
index 0000000..0b71508
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/MultiPolygon-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.MultiPolygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.MultiPolygon"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiPolygon</h1><div class=CBody><p>MultiPolygon is a geometry with multiple <a href="Polygon-js.html#OpenLayers.Geometry.Polygon" class=LClass id=link2 onMouseOver="ShowTip(event, 'tt1', 'link2')" onMouseOut="HideTip('tt1')">OpenLayers.Geometry.Polygon</a> components.   Create a new inst [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPolygon.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPolygon.componentTypes"></a>componentTypes</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPolygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.MultiPolygon.OpenLayers.Geometry.MultiPolygon"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>MultiPolygon</h3><div class=CBody><p>Create a new MultiPolygon geometry</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="Polygon-js.html#OpenLayers.Geo [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Polygon is a collection of Geometry.LinearRings.</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new MultiPolygon geometry</div></div><div class=CToolTip id="tt3"><div class=CClass>A Collection is exactly what it sounds like: A collection of different Geometries. </div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/Point-js.html b/doc/devdocs/files/OpenLayers/Geometry/Point-js.html
new file mode 100644
index 0000000..322b921
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/Point-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Point - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Point"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</h1><div class=CBody><p>Point geometry class.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt14', 'link15')" onMouseOut="HideTip('tt14')">OpenLayers.Geometry</a></li></ul><!--START_ND_SUMMARY [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.x"></a>x</h3><div class=CBody><p>{float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.y"></a>y</h3><div class=CBody><p>{float}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.OpenLayers.Geometry.Point"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</h3><div class=CBody><p>Construct a point geometry.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>x</td><td class=CDLDescription>{float}</td></tr><tr><td class=CDLEntry>y</td><td class=CDLDescription>{float}</td> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.G [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.calculateBounds"></a>calculateBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function ()</td></tr></table></blockquote><p>Create a new Bounds based on the lon/lat</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals: function(</td><td class=PParameter nowrap>geom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether another geometry is equivalent t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.toShortString"></a>toShortString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toShortString: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} Shortened String representation of Point object.  (ex.  <i>”5, 42”</i>)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Moves  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.rotate"></a>rotate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>rotate: function(</td><td class=PParameter nowrap>angle,</td></tr><tr><td></td><td class=PParameter nowrap>origin</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.getCentroid"></a>getCentroid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCentroid: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Geometry.Point.OpenLayers.Geometry.Point" class=LConstructor id=link20 onMouseOver="ShowTip(event, 'tt2', 'link20')" onMouseOut="HideTip('tt2')">OpenLayers.Geo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.resize"></a>resize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>resize: function(</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>origin,</td></tr><tr><td></td><td class=PParameter nowrap>ratio</td><td class=PAfterParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine if the input geometry in [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>transform: function(</td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>dest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Point.getVertices"></a>getVertices</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getVertices: function(</td><td class=PParameter nowrap>nodes</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a list of all points in thi [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>{OpenLayers.Geometry.Point} An exact clone of this OpenLayers.Geometry.Point</div></div><div class=CToolTip id="tt2"><div class=CConstruct [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/Polygon-js.html b/doc/devdocs/files/OpenLayers/Geometry/Polygon-js.html
new file mode 100644
index 0000000..0f9d894
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/Polygon-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Polygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Polygon"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Polygon</h1><div class=CBody><p>Polygon is a collection of Geometry.LinearRings.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Collection-js.html#OpenLayers.Geometry.Collection" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt7')">OpenLayers.Geome [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.componentTypes"></a>componentTypes</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.OpenLayers.Geometry.Polygon"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Polygon</h3><div class=CBody><p>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.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><p>Calculated by subtracting the areas of the internal holes from the area of the outer hole.</p><h4 class=CHeading>Returns</h4><p>{float} The area of the geometry</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.getGeodesicArea"></a>getGeodesicArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicArea: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate the a [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.containsPoint"></a>containsPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>containsPoint: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test if a point is inside  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.intersects"></a>intersects</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>intersects: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine if the input geometry  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.distanceTo"></a>distanceTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>distanceTo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Polygon.createRegularPolygon"></a>createRegularPolygon</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Geometry.Polygon.createRegularPolygon = function(</td><td class=PParameter nowrap>origin,</td></tr><tr><td></td><td class=PParameter nowrap>radius,</td></t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote>Calculated by subtracting the areas of the internal holes from the area of the outer hole.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowr [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Geometry/Rectangle-js.html b/doc/devdocs/files/OpenLayers/Geometry/Rectangle-js.html
new file mode 100644
index 0000000..5fa149d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Geometry/Rectangle-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Geometry.Rectangle - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Geometry.Rectangle"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Rectangle</h1><div class=CBody><p>This class is <b>not supported</b>, and probably isn’t what you’re looking for.  Instead, most users probably want something like:</p><blockquote><pre>var poly = new OpenLayers.Bounds(0,0,10,10).toGeometry();</pre></blockquote><p>This will create  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.x"></a>x</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.y"></a>y</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.width"></a>width</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.height"></a>height</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.OpenLayers.Geometry.Rectangle"></a>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Rectangle</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>points</td><td class=CDLDescription>{Array(<a href="Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link5 onMouseOver="ShowTip( [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.calculateBounds"></a>calculateBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote><p>Recalculate the bounds for the geometry.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.getLength"></a>getLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The length of the geometry</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Geometry.Rectangle.getArea"></a>getArea</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getArea: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The area of the geometry</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([17, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateBounds: function()</td></tr></table></blockquote>Recalculate the bounds for the geometry.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getLength: function()</td></tr></table></blockquote>{Float} The length of the geometry</div></div><div class=CToolTip id=" [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler-js.html b/doc/devdocs/files/OpenLayers/Handler-js.html
new file mode 100644
index 0000000..4f5657f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler-js.html
@@ -0,0 +1,92 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler"></a>OpenLayers.<span class=HB> </span>Handler</h1><div class=CBody><p>Base class to construct a higher-level handler for event sequences.   All handlers have activate and deactivate methods.   In addition, they have methods named like browser events.   When a handler is activated, any additional methods named like a browser event is registered as a listener for  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.id"></a>id</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.control"></a>control</h3><div class=CBody><p>{<a href="Control-js.html#OpenLayers.Control" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt1', 'link20')" onMouseOut="HideTip('tt1')">OpenLayers.Control</a>}.  The control that initialized this handler.   The control is assumed to have a valid map property - that map is used in the handler’s own setMap method.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.map"></a>map</h3><div class=CBody><p>{<a href="Map-js.html#OpenLayers.Map" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt2', 'link21')" onMouseOut="HideTip('tt2')">OpenLayers.Map</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.keyMask"></a>keyMask</h3><div class=CBody><p>{Integer} Use bitwise operators and one or more of the OpenLayers.Handler constants to construct a keyMask.   The keyMask is used by <a href="#OpenLayers.Handler.checkModifiers" class=LFunction id=link22 onMouseOver="ShowTip(event, 'tt4', 'link22')" onMouseOut="HideTip('tt4')">checkModifiers</a>.   If the keyMask matches the combination of keys down [...]
+handler.keyMask = OpenLayers.Handler.MOD_SHIFT;
+
+// handler only responds if Ctrl-Shift is down
+handler.keyMask = OpenLayers.Handler.MOD_SHIFT |
+                  OpenLayers.Handler.MOD_CTRL;</pre></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.active"></a>active</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.evt"></a>evt</h3><div class=CBody><p>{Event} This property references the last event handled by the handler.  Note that this property is not part of the stable API.   Use of the evt property should be restricted to controls in the library or other applications that are willing to update with changes to the OpenLayers code.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler"></a>OpenLayers.<span class=HB> </span>Handler</h3><div class=CBody><p>Construct a handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="Control-js.html#OpenLayers.Control" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt1', 'link23')" onMouseOut="H [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function (</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.checkModifiers"></a>checkModifiers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>checkModifiers: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Check the keyMask on the handler. [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Turn on the handler.   Returns false if the handler was already active.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Turn off the handler.   Returns false if the handler was already inactive.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.callback"></a>callback</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>callback: function (</td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>args</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.register"></a>register</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>register: function (</td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>method</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockq [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.unregister"></a>unregister</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unregister: function (</td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>method</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.setEvent"></a>setEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>With each registered browser event, the handler sets [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function ()</td></tr></table></blockquote><p>Deconstruct the handler.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler.MOD_NONE"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MOD_NONE</h3><div class=CBody><p>If set as the <a href="#OpenLayers.Handler.keyMask" class=LProperty id=link26 onMouseOver="ShowTip(event, 'tt12', 'link26')" onMouseOut="HideTip('tt12')">keyMask</a>, <a href="#OpenLayers.Handler.checkModifiers" class=LFunction id=link27 onMouseOver="ShowTip(event, 'tt4', 'l [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler.MOD_SHIFT"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MOD_SHIFT</h3><div class=CBody><p>If set as the <a href="#OpenLayers.Handler.keyMask" class=LProperty id=link28 onMouseOver="ShowTip(event, 'tt12', 'link28')" onMouseOut="HideTip('tt12')">keyMask</a>, <a href="#OpenLayers.Handler.checkModifiers" class=LFunction id=link29 onMouseOver="ShowTip(event, 'tt4',  [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler.MOD_CTRL"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MOD_CTRL</h3><div class=CBody><p>If set as the <a href="#OpenLayers.Handler.keyMask" class=LProperty id=link30 onMouseOver="ShowTip(event, 'tt12', 'link30')" onMouseOut="HideTip('tt12')">keyMask</a>, <a href="#OpenLayers.Handler.checkModifiers" class=LFunction id=link31 onMouseOver="ShowTip(event, 'tt4', 'l [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.OpenLayers.Handler.MOD_ALT"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MOD_ALT</h3><div class=CBody><p>If set as the <a href="#OpenLayers.Handler.keyMask" class=LProperty id=link32 onMouseOver="ShowTip(event, 'tt12', 'link32')" onMouseOut="HideTip('tt12')">keyMask</a>, <a href="#OpenLayers.Handler.checkModifiers" class=LFunction id=link33 onMouseOver="ShowTip(event, 'tt4', 'lin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function (</td><td class=PPa [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Box-js.html b/doc/devdocs/files/OpenLayers/Handler/Box-js.html
new file mode 100644
index 0000000..9ef8240
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Box-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Box - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Box"></a>OpenLayers.<span class=HB> </span>Handler.Box</h1><div class=CBody><p>Handler for dragging a rectangle across the map.   Box is displayed on mouse down, moves on mouse move, and is finished on mouse up.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt10', 'link10' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.dragHandler"></a>dragHandler</h3><div class=CBody><p>{<a href="Drag-js.html#OpenLayers.Handler.Drag" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Handler.Drag</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.boxDivClassName"></a>boxDivClassName</h3><div class=CBody><p>{String} The CSS class to use for drawing the box.  Default is olHandlerBoxZoomBox</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.boxCharacteristics"></a>boxCharacteristics</h3><div class=CBody><p>{Object} Caches some box characteristics from css.  This is used by the getBoxCharacteristics method.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.OpenLayers.Handler.Box"></a>OpenLayers.<span class=HB> </span>Handler.Box</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt11', 'link12')" onMouseOut="HideTip('tt1 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function (</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.startBox"></a>startBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>startBox: function (</td><td class=PParameter nowrap>xy</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.moveBox"></a>moveBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveBox: function (</td><td class=PParameter nowrap>xy</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.endBox"></a>endBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>endBox: function(</td><td class=PParameter nowrap>end</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.removeBox"></a>removeBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>removeBox: function()</td></tr></table></blockquote><p>Remove the zoombox from the screen and nullify our reference to it.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function ()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function ()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Box.getCharacteristics"></a>getCharacteristics</h3><div class=CBody><p>Determines offset and box model for a box.</p><h4 class=CHeading>Returns</h4><p>{Object} a hash with the following properties:</p><ul><li>xOffset - Corner offset in x-direction</li><li>yOffset - Corner offset in y-direction</li><li>newBoxModel - true for all browsers except IE in quirks mode</li></ul></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The drag handler is used to deal with sequences of browser events related to dragging. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspac [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Click-js.html b/doc/devdocs/files/OpenLayers/Handler/Click-js.html
new file mode 100644
index 0000000..9e2d6db
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Click-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Click - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Click"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Click</h1><div class=CBody><p>A handler for mouse clicks.   The intention of this handler is to give controls more flexibility with handling clicks.   Browsers trigger click events twice for a double-click.   In addition, the mousedown, mousemove, mouseup sequence fires a click event.&nbs [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.delay"></a>delay</h3><div class=CBody><p>{Number} Number of milliseconds between clicks before the event is considered a double-click.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.single"></a>single</h3><div class=CBody><p>{Boolean} Handle single clicks.   Default is true.   If false, clicks will not be reported.   If true, single-clicks will be reported.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.double"></a>double</h3><div class=CBody><p>{Boolean} Handle double-clicks.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.pixelTolerance"></a>pixelTolerance</h3><div class=CBody><p>{Number} Maximum number of pixels between mouseup and mousedown for an event to be considered a click.   Default is 0.   If set to an integer value, clicks with a drag greater than the value will be ignored.   This property can only be set when the handler is constructed.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.stopSingle"></a>stopSingle</h3><div class=CBody><p>{Boolean} Stop other listeners from being notified of clicks.   Default is false.   If true, any click listeners registered before this one will not be notified of <b>any</b> click event (associated with double or single clicks).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.stopDouble"></a>stopDouble</h3><div class=CBody><p>{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 <b>any</b> double-click events.</p><p>The one caveat with stopDouble is that given a map with two click handlers, one with stopDouble true and the other with stopSingle  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.timerId"></a>timerId</h3><div class=CBody><p>{Number} The id of the timeout waiting to clear the <a href="#OpenLayers.Handler.Click.delayedCall" class=LFunction id=link18 onMouseOver="ShowTip(event, 'tt1', 'link18')" onMouseOut="HideTip('tt1')">delayedCall</a>.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.down"></a>down</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt2', 'link19')" onMouseOut="HideTip('tt2')">OpenLayers.Pixel</a>} The pixel location of the last mousedown.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.rightclickTimerId"></a>rightclickTimerId</h3><div class=CBody><p>{Number} The id of the right mouse timeout waiting to clear the <delayedEvent>.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.OpenLayers.Handler.Click"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Click</h3><div class=CBody><p>Create a new click handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link20 onMouseO [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.mousedown"></a>mousedown</h3><div class=CBody><p>Handle mousedown.   Only registered as a listener if pixelTolerance is a non-zero value at construction.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Continue propagating this event.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.mouseup"></a>mouseup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseup: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouseup.   Installed to support coll [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.rightclick"></a>rightclick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>rightclick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle rightclick.   For a dblright [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.delayedRightCall"></a>delayedRightCall</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>delayedRightCall: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets <a href="#OpenLay [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.dblclick"></a>dblclick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dblclick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle dblclick.   For a dblclick, we get [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.click"></a>click</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>click: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle click.</p><h4 class=CHeading>Returns</h4><p>{Boo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.passesTolerance"></a>passesTolerance</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>passesTolerance: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether the eve [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.clearTimer"></a>clearTimer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearTimer: function()</td></tr></table></blockquote><p>Clear the timer and set <a href="#OpenLayers.Handler.Click.timerId" class=LProperty id=link23 onMouseOver="ShowTip(event, 'tt11', 'link23')" onMouseOut="HideTip('tt11')">timerId</a> to null.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.delayedCall"></a>delayedCall</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>delayedCall: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets <a href="#OpenLayers.Handler.Cli [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Click.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the handler.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was successfully deactivated.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>delayedCall: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Sets timerId to null. </div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents a screen coordinate, in x and [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Drag-js.html b/doc/devdocs/files/OpenLayers/Handler/Drag-js.html
new file mode 100644
index 0000000..d2e52fb
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Drag-js.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Drag - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Drag"></a>OpenLayers.<span class=HB> </span>Handler.Drag</h1><div class=CBody><p>The drag handler is used to deal with sequences of browser events related to dragging.   The handler is used by controls that want to know when a drag sequence begins, when a drag is happening, and when it has finished.</p><p>Controls that use the drag handler typically construct it with callb [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.started"></a>started</h3><div class=CBody><p>{Boolean} When a mousedown event is received, we want to record it, but not set ‘dragging’ until the mouse moves after starting.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.stopDown"></a>stopDown</h3><div class=CBody><p>{Boolean} Stop propagation of mousedown events from getting to listeners on the same element.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.dragging"></a>dragging</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.last"></a>last</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt1', 'link19')" onMouseOut="HideTip('tt1')">OpenLayers.Pixel</a>} The last pixel location of the drag.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.start"></a>start</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt1', 'link20')" onMouseOut="HideTip('tt1')">OpenLayers.Pixel</a>} The first pixel location of the drag.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.oldOnselectstart"></a>oldOnselectstart</h3><div class=CBody><p>{Function}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.interval"></a>interval</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.timeoutId"></a>timeoutId</h3><div class=CBody><p>{String} The id of the timeout used for the mousedown interval.  This is “private”, and should be left alone.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.documentDrag"></a>documentDrag</h3><div class=CBody><p>{Boolean} If set to true, the handler will also handle mouse moves when the cursor has moved out of the map viewport.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.documentEvents"></a>documentEvents</h3><div class=CBody><p>{<a href="../Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} Event instance for observing document events.  Will be set on mouseout if documentDrag is set to true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.OpenLayers.Handler.Drag"></a>OpenLayers.<span class=HB> </span>Handler.Drag</h3><div class=CBody><p>Returns OpenLayers.Handler.Drag</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link21 onMouseOver="ShowTip(event, 't [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.down"></a>down</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>down: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This method is called during the handling of the mouse down [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This method is called during the handling of the mouse move [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.up"></a>up</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>up: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This method is called during the handling of the mouse up event.& [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.out"></a>out</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>out: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This method is called during the handling of the mouse out eve [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.mousedown"></a>mousedown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousedown: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mousedown events</p><h4 class=CHeadi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.mousemove"></a>mousemove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousemove: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mousemove events</p><h4 class=CHeadi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.removeTimeout"></a>removeTimeout</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>removeTimeout: function()</td></tr></table></blockquote><p>Private.  Called by mousemove() to remove the drag timeout.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.mouseup"></a>mouseup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseup: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouseup events</p><h4 class=CHeading>Param [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.mouseout"></a>mouseout</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseout: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouseout events</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.click"></a>click</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>click: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>The drag handler captures the click event.   If so [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the handler.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the handler.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.adjustXY"></a>adjustXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>adjustXY: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Converts event coordinates that are relative to [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Drag.destroyDocumentEvents"></a>destroyDocumentEvents</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyDocumentEvents: function()</td></tr></table></blockquote><p>Destroys the events instance that gets added to the document body when documentDrag is true and the mouse cursor leaves the map viewport while dragging.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>down: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>This method is  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Feature-js.html b/doc/devdocs/files/OpenLayers/Handler/Feature-js.html
new file mode 100644
index 0000000..a64c683
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Feature-js.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Feature - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Feature"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Feature</h1><div class=CBody><p>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.</p><p>This handler stops event propagation for mousedown  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.EVENTMAP"></a>EVENTMAP</h3><div class=CBody><p>{Object} A object mapping the browser events to objects with callback keys for in and out.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.feature"></a>feature</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt1', 'link17')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>} The last feature that was hovered.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.lastFeature"></a>lastFeature</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt1', 'link18')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>} The last feature that was handled.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.down"></a>down</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt2', 'link19')" onMouseOut="HideTip('tt2')">OpenLayers.Pixel</a>} The location of the last mousedown.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.up"></a>up</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt2', 'link20')" onMouseOut="HideTip('tt2')">OpenLayers.Pixel</a>} The location of the last mouseup.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.clickTolerance"></a>clickTolerance</h3><div class=CBody><p>{Number} The number of pixels the mouse can move between mousedown and mouseup for the event to still be considered a click.  Dragging the map should not trigger the click and clickout callbacks unless the map is moved by less than this tolerance.  Defaults to 4.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.geometryTypes"></a>geometryTypes</h3><div class=CBody><p>To restrict dragging to a limited set of geometry types, send a list of strings corresponding to the geometry class names.</p><p>@type Array(String)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.stopClick"></a>stopClick</h3><div class=CBody><p>{Boolean} If stopClick is set to true, handled clicks do not propagate to other click listeners.  Otherwise, handled clicks do propagate.  Unhandled clicks always propagate, whatever the value of stopClick.  Defaults to true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.stopDown"></a>stopDown</h3><div class=CBody><p>{Boolean} If stopDown is set to true, handled mousedowns do not propagate to other mousedown listeners.  Otherwise, handled mousedowns do propagate.  Unhandled mousedowns always propagate, whatever the value of stopDown.  Defaults to true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.stopUp"></a>stopUp</h3><div class=CBody><p>{Boolean} If stopUp is set to true, handled mouseups do not propagate to other mouseup listeners.  Otherwise, handled mouseups do propagate.  Unhandled mouseups always propagate, whatever the value of stopUp.  Defaults to false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.OpenLayers.Handler.Feature"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Feature</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt15',  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.mousedown"></a>mousedown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousedown: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse down.   Stop propagatio [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.mouseup"></a>mouseup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseup: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse up.   Stop propagation if a f [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.click"></a>click</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>click: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle click.   Call the “click” cal [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.mousemove"></a>mousemove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousemove: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse moves.   Call the &ldqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.dblclick"></a>dblclick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dblclick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle dblclick.   Call the “dblc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.geometryTypeMatches"></a>geometryTypeMatches</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>geometryTypeMatches: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.handle"></a>handle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handle: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.triggerCallback"></a>triggerCallback</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>triggerCallback: function(</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>mode,</td></tr><tr><td></td><td class=PParameter nowrap>args</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Turn on the handler.   Returns false if the handler was already active.</p><h4 class=CHeading>Returns</h4><p>{Boolean}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Turn off the handler.   Returns false if the handler was already active.</p><h4 class=CHeading>Returns</h4><p>{Boolean}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.moveLayerToTop"></a>moveLayerToTop</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>moveLayerToTop: function()</td></tr></table></blockquote><p>Moves the layer for this handler to the top, so mouse events can reach it.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Feature.moveLayerBack"></a>moveLayerBack</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>moveLayerBack: function()</td></tr></table></blockquote><p>Moves the layer back to the position determined by the map’s layers array.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousedown: function [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Hover-js.html b/doc/devdocs/files/OpenLayers/Handler/Hover-js.html
new file mode 100644
index 0000000..53e47a8
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Hover-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Hover - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Hover"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Hover</h1><div class=CBody><p>The hover handler is to be used to emulate mouseovers on objects 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.</p><h4 class=CHeading>Inherits from</h4><ul>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.delay"></a>delay</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Integer}</td><td class=CDLDescription>Number of milliseconds between mousemoves before the event is considered a hover.  Default is 500.</td></tr></table></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.pixelTolerance"></a>pixelTolerance</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Integer}</td><td class=CDLDescription>Maximum number of pixels between mousemoves for an event to be considered a hover.  Default is null.</td></tr></table></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.stopMove"></a>stopMove</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Boolean}</td><td class=CDLDescription>Stop other listeners from being notified on mousemoves.  Default is false.</td></tr></table></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.px"></a>px</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{<OpenLayers.Pixel>}</td><td class=CDLDescription>The location of the last mousemove, expressed in pixels.</td></tr></table></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.timerId"></a>timerId</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Number}</td><td class=CDLDescription>The id of the timer.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.OpenLayers.Handler.Hover"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Hover</h3><div class=CBody><p>Construct a hover handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link8 onMouseOve [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.mousemove"></a>mousemove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousemove: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the mouse moves on the map.</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.mouseout"></a>mouseout</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseout: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the mouse goes out of the map.</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.passesTolerance"></a>passesTolerance</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>passesTolerance: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether the mous [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.clearTimer"></a>clearTimer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearTimer: function()</td></tr></table></blockquote><p>Clear the timer and set <a href="#OpenLayers.Handler.Hover.timerId" class=LProperty >timerId</a> to null.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.delayedCall"></a>delayedCall</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>delayedCall: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Triggers pause callback.</p><h4 class [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Hover.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the handler.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The handler was successfully deactivated.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousemove: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Called when the mouse moves on the map.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cells [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Keyboard-js.html b/doc/devdocs/files/OpenLayers/Handler/Keyboard-js.html
new file mode 100644
index 0000000..a81fd56
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Keyboard-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.handler.Keyboard - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.handler.Keyboard"></a>OpenLayers.<span class=HB> </span>handler.<span class=HB> </span>Keyboard</h1><div class=CBody><p>A handler for keyboard events.   Create a new instance with the <a href="#OpenLayers.handler.Keyboard.OpenLayers.Handler.Keyboard" class=LConstructor id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Handler.Keyboard</a> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.KEY_EVENTS"></a>KEY_EVENTS</h3><div class=CBody><p>keydown, keypress, keyup</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.eventListener"></a>eventListener</h3><div class=CBody><p>{Function}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.OpenLayers.Handler.Keyboard"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Keyboard</h3><div class=CBody><p>Returns a new keyboard handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=li [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.handler.Keyboard.handleKeyEvent"></a>handleKeyEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleKeyEvent: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/MouseWheel-js.html b/doc/devdocs/files/OpenLayers/Handler/MouseWheel-js.html
new file mode 100644
index 0000000..4542711
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/MouseWheel-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.MouseWheel - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.MouseWheel"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MouseWheel</h1><div class=CBody><p>Handler for wheel up/down events.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Handler-js.html#OpenLayers.Handler" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.Handler</a></li></ul><!--STA [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.wheelListener"></a>wheelListener</h3><div class=CBody><p>{function}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.mousePosition"></a>mousePosition</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="HideTip('tt1')">OpenLayers.Pixel</a>} mousePosition is necessary because evt.clientX/Y is buggy in Moz on wheel events, so we cache and use the value from the last mousemove.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.interval"></a>interval</h3><div class=CBody><p>{Integer} In order to increase server performance, an interval (in milliseconds) can be set to reduce the number of up/down events called.  If set, a new up/down event will not be set until the interval has passed.  Defaults to 0, meaning no interval.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.delta"></a>delta</h3><div class=CBody><p>{Integer} When interval is set, delta collects the mousewheel z-deltas of the events that occur within the interval.  See also the cumulative option</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.cumulative"></a>cumulative</h3><div class=CBody><p>{Boolean} When interval is set: true to collect all the mousewheel z-deltas, false to only record the delta direction (positive or negative)</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.OpenLayers.Handler.MouseWheel"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>MouseWheel</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link10 onMouseOver="ShowTip(event, [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.onWheelEvent"></a>onWheelEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onWheelEvent: function(</td><td class=PParameter nowrap>e</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Catch the wheel event and handl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.wheelZoom"></a>wheelZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>wheelZoom: function(</td><td class=PParameter nowrap>e</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given the wheel event, we carry out the  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.mousemove"></a>mousemove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousemove: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Update the stored mousePosition on ev [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>activate: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.MouseWheel.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>deactivate: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><t [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Path-js.html b/doc/devdocs/files/OpenLayers/Handler/Path-js.html
new file mode 100644
index 0000000..677c2cb
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Path-js.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Path - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Path"></a>OpenLayers.<span class=HB> </span>Handler.Path</h1><div class=CBody><p>Handler to draw a path on the map.   Path is displayed on mouse down, moves on mouse move, and is finished on mouse up.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Point-js.html#OpenLayers.Handler.Point" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt15', 'link15')" onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.line"></a>line</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.freehand"></a>freehand</h3><div class=CBody><p>{Boolean} In freehand mode, the handler starts the path on mouse down, adds a point for every mouse move, and finishes the path on mouse up.  Outside of freehand mode, a point is added to the path on every mouse click and double-click finishes the path.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.freehandToggle"></a>freehandToggle</h3><div class=CBody><p>{String} If set, freehandToggle is checked on mouse events and will set the freehand mode to the opposite of this.freehand.   To disallow toggling between freehand and non-freehand mode, set freehandToggle to null.   Acceptable toggle values are ‘shiftKey’, ‘ctrlKey’, and ‘altKey’.</p></div></di [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.OpenLayers.Handler.Path"></a>OpenLayers.<span class=HB> </span>Handler.Path</h3><div class=CBody><p>Create a new path hander</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt16', ' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.createFeature"></a>createFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add temporary geometries</p><h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.destroyFeature"></a>destroyFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyFeature: function()</td></tr></table></blockquote><p>Destroy temporary geometries</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.removePoint"></a>removePoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>removePoint: function()</td></tr></table></blockquote><p>Destroy the temporary point.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.addPoint"></a>addPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addPoint: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add point to geometry.   Send the point  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.freehandMode"></a>freehandMode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>freehandMode: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether to behave in free [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.modifyFeature"></a>modifyFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>modifyFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Modify the existing geometry g [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.drawFeature"></a>drawFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>drawFeature: function()</td></tr></table></blockquote><p>Render geometries on the temporary layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.getSketch"></a>getSketch</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getSketch: function()</td></tr></table></blockquote><p>Return the sketch feature.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt1', 'link21')" onMouseOut="HideTip('tt1 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.getGeometry"></a>getGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getGeometry: function()</td></tr></table></blockquote><p>Return the sketch geometry.   If <multi> is true, this will return a multi-part geometry.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Geometry/LineString-js.html#OpenLayers.Geometry.LineString" cla [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.mousedown"></a>mousedown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousedown: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse down.   Add a new point to [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.mousemove"></a>mousemove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousemove: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse move.   Adjust the geomet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.mouseup"></a>mouseup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseup: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse up.   Send the latest point in  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Path.dblclick"></a>dblclick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dblclick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle double-clicks.   Finish the geometr [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Point-js.html b/doc/devdocs/files/OpenLayers/Handler/Point-js.html
new file mode 100644
index 0000000..eb0d93b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Point-js.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Point - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Point"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Point</h1><div class=CBody><p>Handler to draw a point on the map.   Point is displayed on mouse down, moves on mouse move, and is finished on mouse up.   The handler triggers callbacks for ‘done’, ‘cancel’, and ‘modify’.   The modify callback is called  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.point"></a>point</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt1', 'link22')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>} The currently drawn point</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt2', 'link23')" onMouseOut="HideTip('tt2')">OpenLayers.Layer.Vector</a>} The temporary drawing layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.multi"></a>multi</h3><div class=CBody><p>{Boolean} Cast features to multi-part geometries before passing to the layer.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.drawing"></a>drawing</h3><div class=CBody><p>{Boolean} A point is being drawn</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.mouseDown"></a>mouseDown</h3><div class=CBody><p>{Boolean} The mouse is down</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.lastDown"></a>lastDown</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link24 onMouseOver="ShowTip(event, 'tt3', 'link24')" onMouseOut="HideTip('tt3')">OpenLayers.Pixel</a>} Location of the last mouse down</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.lastUp"></a>lastUp</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt3', 'link25')" onMouseOut="HideTip('tt3')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.persist"></a>persist</h3><div class=CBody><p>{Boolean} Leave the feature rendered until destroyFeature is called.  Default is false.   If set to true, the feature remains rendered until destroyFeature is called, typically by deactivating the handler or starting another drawing.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.layerOptions"></a>layerOptions</h3><div class=CBody><p>{Object} Any optional properties to be set on the sketch layer.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.OpenLayers.Handler.Point"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Point</h3><div class=CBody><p>Create a new point handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link26 onMouseO [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>turn on the handler</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.createFeature"></a>createFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add temporary features</p><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>turn off the handler</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.destroyFeature"></a>destroyFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyFeature: function()</td></tr></table></blockquote><p>Destroy the temporary geometries</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.finalize"></a>finalize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>finalize: function(</td><td class=PParameter nowrap>cancel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Finish the geometry and call the “don [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.cancel"></a>cancel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote><p>Finish the geometry and call the “cancel” callback.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.click"></a>click</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>click: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle clicks.   Clicks are stopped from propagati [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.dblclick"></a>dblclick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dblclick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle double-clicks.   Double-clicks are [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.modifyFeature"></a>modifyFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>modifyFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Modify the existing geometry  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.drawFeature"></a>drawFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>drawFeature: function()</td></tr></table></blockquote><p>Render features on the temporary layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.getGeometry"></a>getGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getGeometry: function()</td></tr></table></blockquote><p>Return the sketch geometry.   If <a href="#OpenLayers.Handler.Point.multi" class=LProperty id=link29 onMouseOver="ShowTip(event, 'tt22', 'link29')" onMouseOut="HideTip('tt22')">multi</a> is true, this will re [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.geometryClone"></a>geometryClone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>geometryClone: function()</td></tr></table></blockquote><p>Return a clone of the relevant geometry.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link31 onMouseOver="ShowTip(event, 'tt24', 'link31')" onMouseO [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.mousedown"></a>mousedown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousedown: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse down.   Adjust the geomet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.mousemove"></a>mousemove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mousemove: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse move.   Adjust the geome [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Point.mouseup"></a>mouseup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mouseup: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle mouse up.   Send the latest point in [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/Polygon-js.html b/doc/devdocs/files/OpenLayers/Handler/Polygon-js.html
new file mode 100644
index 0000000..79f4f5f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/Polygon-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.Polygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.Polygon"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Polygon</h1><div class=CBody><p>Handler to draw a polygon on the map.   Polygon is displayed on mouse down, moves on mouse move, and is finished on mouse up.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Path-js.html#OpenLayers.Handler.Path" class=LClass id=link7 onMouseOver="ShowTip(e [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.OpenLayers.Handler.Polygon"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Polygon</h3><div class=CBody><p>Create a Polygon Handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Control" class=LClass id=link9 onMou [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.createFeature"></a>createFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add temporary geometries</p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.destroyFeature"></a>destroyFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyFeature: function()</td></tr></table></blockquote><p>Destroy temporary geometries</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.drawFeature"></a>drawFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>drawFeature: function()</td></tr></table></blockquote><p>Render geometries on the temporary layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.getSketch"></a>getSketch</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getSketch: function()</td></tr></table></blockquote><p>Return the sketch feature.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt11', 'link11')" onMouseOut="HideTip( [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.getGeometry"></a>getGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getGeometry: function()</td></tr></table></blockquote><p>Return the sketch geometry.   If <multi> is true, this will return a multi-part geometry.</p><h4 class=CHeading>Returns</h4><p>{<a href="../Geometry/Polygon-js.html#OpenLayers.Geometry.Polygon" class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.Polygon.dblclick"></a>dblclick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dblclick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Handle double-clicks.   Finish the geom [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createFeature: function(</td><td class=PParameter nowrap>pixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Add temporary geometries</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Handler/RegularPolygon-js.html b/doc/devdocs/files/OpenLayers/Handler/RegularPolygon-js.html
new file mode 100644
index 0000000..6282818
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Handler/RegularPolygon-js.html
@@ -0,0 +1,99 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Handler.RegularPolygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Handler.RegularPolygon"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>RegularPolygon</h1><div class=CBody><p>Handler to draw a regular polygon on the map.   Polygon is displayed on mouse down, moves or is modified on mouse move, and is finished on mouse up.  The handler triggers callbacks for ‘done’ and ‘cancel’.   Create a  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.sides"></a>sides</h3><div class=CBody><p>{Integer} Number of sides for the regular polygon.   Needs to be greater than 2.   Defaults to 4.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.radius"></a>radius</h3><div class=CBody><p>{Float} Optional radius in map units of the regular polygon.   If this is set to some non-zero value, a polygon with a fixed radius will be drawn and dragged with mose movements.   If this property is not set, dragging changes the radius of the polygon.   Set to null by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.snapAngle"></a>snapAngle</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.snapToggle"></a>snapToggle</h3><div class=CBody><p>{String} If set, snapToggle is checked on mouse events and will set the snap mode to the opposite of what it currently is.   To disallow toggling between snap and non-snap mode, set freehandToggle to null.   Acceptable toggle values are ‘shiftKey’, ‘ctrlKey’, and ‘altKey’.  Snap mode is o [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.layerOptions"></a>layerOptions</h3><div class=CBody><p>{Object} Any optional properties to be set on the sketch layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.persist"></a>persist</h3><div class=CBody><p>{Boolean} Leave the feature rendered until clear is called.   Default is false.   If set to true, the feature remains rendered until clear is called, typically by deactivating the handler or starting another drawing.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.irregular"></a>irregular</h3><div class=CBody><p>{Boolean} Draw an irregular polygon instead of a regular polygon.  Default is false.   If true, the initial mouse down will represent one corner of the polygon bounds and with each mouse movement, the polygon will be stretched so the opposite corner of its bounds follows the mouse position.   This property takes precedence ov [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.angle"></a>angle</h3><div class=CBody><p>{Float} The angle from the origin (mouse down) to the current mouse position, in radians.   This is measured counterclockwise from the positive x-axis.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.fixedRadius"></a>fixedRadius</h3><div class=CBody><p>{Boolean} The polygon has a fixed radius.   True if a radius is set before drawing begins.   False otherwise.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.feature"></a>feature</h3><div class=CBody><p>{<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt1', 'link20')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>} The currently drawn polygon feature</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.layer"></a>layer</h3><div class=CBody><p>{<a href="../Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt2', 'link21')" onMouseOut="HideTip('tt2')">OpenLayers.Layer.Vector</a>} The temporary drawing layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.origin"></a>origin</h3><div class=CBody><p>{<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt3', 'link22')" onMouseOut="HideTip('tt3')">OpenLayers.Geometry.Point</a>} Location of the first mouse down</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.OpenLayers.Handler.RegularPolygon"></a>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>RegularPolygon</h3><div class=CBody><p>Create a new regular polygon handler.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>control</td><td class=CDLDescription>{<a href="../Control-js.html#OpenLayers.Con [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.setOptions"></a>setOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOptions: function (</td><td class=PParameter nowrap>newOptions</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Turn on the handler.</p><h4 class=CHeading>Return</h4><p>{Boolean} The handler was successfully activated</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Turn off the handler.</p><h4 class=CHeading>Return</h4><p>{Boolean} The handler was successfully deactivated</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.down"></a>down</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>down: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Start drawing a new feature</p><h4 class=CHeading [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.move"></a>move</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>move: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Respond to drag move events</p><h4 class=CHeading [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.up"></a>up</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>up: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Finish drawing the feature</p><h4 class=CHeading>Parame [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.out"></a>out</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>out: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Finish drawing the feature.</p><h4 class=CHeading>Pa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.createGeometry"></a>createGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createGeometry: function()</td></tr></table></blockquote><p>Create the new polygon geometry.   This is called at the start of the drag and at any point during the drag if the number of sides changes.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.modifyGeometry"></a>modifyGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>modifyGeometry: function()</td></tr></table></blockquote><p>Modify the polygon geometry in place.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.calculateAngle"></a>calculateAngle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateAngle: function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.cancel"></a>cancel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>cancel: function()</td></tr></table></blockquote><p>Finish the geometry and call the “cancel” callback.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.finalize"></a>finalize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>finalize: function()</td></tr></table></blockquote><p>Finish the geometry and call the “done” callback.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear any rendered features on the temporary layer.   This is called when the handler is deactivated, canceled, or done (unless persist is true).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Handler.RegularPolygon.callback"></a>callback</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>callback: function (</td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>args</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([18, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt3"><div class=CClass>Point geometry class.</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Icon-js.html b/doc/devdocs/files/OpenLayers/Icon-js.html
new file mode 100644
index 0000000..e0e7d53
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Icon-js.html
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Icon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Icon"></a>OpenLayers.Icon</h1><div class=CBody><p>The icon represents a graphical icon on the screen.   Typically used in conjunction with a <a href="Marker-js.html#OpenLayers.Marker" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt14', 'link16')" onMouseOut="HideTip('tt14')">OpenLayers.Marker</a> to represent markers on a screen.</p><p>An icon has a url, size and position.& [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.url"></a>url</h3><div class=CBody><p>{String}  image url</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.size"></a>size</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt1', 'link17')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.offset"></a>offset</h3><div class=CBody><p>{<a href="BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt2', 'link18')" onMouseOut="HideTip('tt2')">OpenLayers.Pixel</a>} distance in pixels to offset the image when being rendered</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.calculateOffset"></a>calculateOffset</h3><div class=CBody><p>{<a href="BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt2', 'link19')" onMouseOut="HideTip('tt2')">OpenLayers.Pixel</a>} Function to calculate the offset (based on the size)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.imageDiv"></a>imageDiv</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.px"></a>px</h3><div class=CBody><p>{<a href="BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt2', 'link20')" onMouseOut="HideTip('tt2')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.OpenLayers.Icon"></a>OpenLayers.Icon</h3><div class=CBody><p>Creates an icon, which is an image tag in a div.</p><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>size</td><td class=CDLDescription>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link21 onMouseOver="ShowTip(e [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Nullify references and remove event listeners to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Icon.OpenLayers.Icon" class=LConstructor id=link23 onMouseOver="ShowTip(event, 'tt5', 'link23')" onMouseOut="HideTip('tt5')">OpenLayers.Icon</a>} A fresh copy of the icon.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.setUrl"></a>setUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setUrl: function(</td><td class=PParameter nowrap>url</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Move the div to the given pixel.</p><h4 class=CHeading>Parameters</h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.erase"></a>erase</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>erase: function()</td></tr></table></blockquote><p>Erase the underlying image element.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Change the icon’s opacity</p><h4 class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function (</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>move icon to passed in px.</p><h4 class=CHeading>Parameters</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>display</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the icon</p><h4 class=CHeading>Parameters [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Icon.isDrawn"></a>isDrawn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>isDrawn: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the icon is drawn.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Nullify references and remove event listeners to prevent circular references [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang-js.html b/doc/devdocs/files/OpenLayers/Lang-js.html
new file mode 100644
index 0000000..78395d0
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang"></a>OpenLayers.Lang</h1><div class=CBody><p>Internationalization namespace.   Contains dictionaries in various languages and methods to set and get the current language.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.code"></a>code</h3><div class=CBody><p>{String}  Current language code to use in OpenLayers.   Use the <a href="#OpenLayers.Lang.setCode" class=LFunction id=link5 onMouseOver="ShowTip(event, 'tt2', 'link5')" onMouseOut="HideTip('tt2')">setCode</a> method to set this value and the <a href="#OpenLayers.Lang.getCode" class=LFunction id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTi [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.defaultCode"></a>defaultCode</h3><div class=CBody><p>{String} Default language to use when a specific language can’t be found.   Default is “en”.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.getCode"></a>getCode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCode: function()</td></tr></table></blockquote><p>Get the current language code.</p><h4 class=CHeading>Returns</h4><p>The current language code.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.setCode"></a>setCode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setCode: function(</td><td class=PParameter nowrap>code</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the language code for string translation.   This [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.translate"></a>translate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Lang.OpenLayers.i18n"></a>OpenLayers.i18n</h3><div class=CBody><p>Alias for <a href="#OpenLayers.Lang.translate" class=LFunction id=link12 onMouseOver="ShowTip(event, 'tt3', 'link12')" onMouseOut="HideTip('tt3')">OpenLayers.Lang.translate</a>.   Looks up a key from a dictionary based on the current language string.  The value of <a href="#OpenLayers.Lang.getCode" class=LFunction id=link13 onMouseOver= [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCode: function()</td></tr></table></blockquote>Get the current language code.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setCode: function(</td><td class=PParameter nowrap>code</ [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/ar-js.html b/doc/devdocs/files/OpenLayers/Lang/ar-js.html
new file mode 100644
index 0000000..20482d6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/ar-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ar”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ar]"></a>OpenLayers.<span class=HB> </span>Lang[“ar”]</h1><div class=CBody><p>Dictionary for العربية.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/be-tarask-js.html b/doc/devdocs/files/OpenLayers/Lang/be-tarask-js.html
new file mode 100644
index 0000000..f03e968
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/be-tarask-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“be-tarask”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[be-tarask]"></a>OpenLayers.<span class=HB> </span>Lang[“be-tarask”]</h1><div class=CBody><p>Dictionary for Беларуская (тарашкевіца).   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/bg-js.html b/doc/devdocs/files/OpenLayers/Lang/bg-js.html
new file mode 100644
index 0000000..670853b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/bg-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“bg”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[bg]"></a>OpenLayers.<span class=HB> </span>Lang[“bg”]</h1><div class=CBody><p>Dictionary for Български.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/br-js.html b/doc/devdocs/files/OpenLayers/Lang/br-js.html
new file mode 100644
index 0000000..6416847
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/br-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“br”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[br]"></a>OpenLayers.<span class=HB> </span>Lang[“br”]</h1><div class=CBody><p>Dictionary for Brezhoneg.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/ca-js.html b/doc/devdocs/files/OpenLayers/Lang/ca-js.html
new file mode 100644
index 0000000..cf7d89f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/ca-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ca”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ca]"></a>OpenLayers.<span class=HB> </span>Lang[“ca”]</h1><div class=CBody><p>Dictionary for Catalan, UTF8 encoding.  Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are norma [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/cs-CZ-js.html b/doc/devdocs/files/OpenLayers/Lang/cs-CZ-js.html
new file mode 100644
index 0000000..9183322
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/cs-CZ-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“cs-CZ”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[cs-CZ]"></a>OpenLayers.<span class=HB> </span>Lang[“cs-CZ”]</h1><div class=CBody><p>Dictionary for Česky.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/da-DK-js.html b/doc/devdocs/files/OpenLayers/Lang/da-DK-js.html
new file mode 100644
index 0000000..bdaac89
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/da-DK-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“da-DK”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[da-DK]"></a>OpenLayers.<span class=HB> </span>Lang[“da-DK”]</h1><div class=CBody><p>Dictionary for Danish.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/de-js.html b/doc/devdocs/files/OpenLayers/Lang/de-js.html
new file mode 100644
index 0000000..b30391e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/de-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“de”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[de]"></a>OpenLayers.<span class=HB> </span>Lang[“de”]</h1><div class=CBody><p>Dictionary for Deutsch.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/el-js.html b/doc/devdocs/files/OpenLayers/Lang/el-js.html
new file mode 100644
index 0000000..8bdf876
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/el-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“el”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[el]"></a>OpenLayers.<span class=HB> </span>Lang[“el”]</h1><div class=CBody><p>Dictionary for Ελληνικά.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/en-CA-js.html b/doc/devdocs/files/OpenLayers/Lang/en-CA-js.html
new file mode 100644
index 0000000..b1b991b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/en-CA-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“en-CA”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[en-CA]"></a>OpenLayers.<span class=HB> </span>Lang[“en-CA”]</h1><div class=CBody><p>Dictionary for English-CA.   This dictionary inherits from the standard English dictionary.   Override only those entries with language specific to the CA region.</p><p>Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/en-js.html b/doc/devdocs/files/OpenLayers/Lang/en-js.html
new file mode 100644
index 0000000..eaf3be8
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/en-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“en”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[en]"></a>OpenLayers.<span class=HB> </span>Lang[“en”]</h1><div class=CBody><p>Dictionary for English.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/es-js.html b/doc/devdocs/files/OpenLayers/Lang/es-js.html
new file mode 100644
index 0000000..bca7d31
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/es-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“es”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[es]"></a>OpenLayers.<span class=HB> </span>Lang[“es”]</h1><div class=CBody><p>Dictionary for Spanish, UTF8 encoding.  Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are norma [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/fi-js.html b/doc/devdocs/files/OpenLayers/Lang/fi-js.html
new file mode 100644
index 0000000..eee9008
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/fi-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“fi”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[fi]"></a>OpenLayers.<span class=HB> </span>Lang[“fi”]</h1><div class=CBody><p>Dictionary for Suomi.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or str [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/fr-js.html b/doc/devdocs/files/OpenLayers/Lang/fr-js.html
new file mode 100644
index 0000000..313da70
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/fr-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“fr”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[fr]"></a>OpenLayers.<span class=HB> </span>Lang[“fr”]</h1><div class=CBody><p>Dictionary for Français.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/fur-js.html b/doc/devdocs/files/OpenLayers/Lang/fur-js.html
new file mode 100644
index 0000000..8e4a3c9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/fur-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“fur”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[fur]"></a>OpenLayers.<span class=HB> </span>Lang[“fur”]</h1><div class=CBody><p>Dictionary for Furlan.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/gl-js.html b/doc/devdocs/files/OpenLayers/Lang/gl-js.html
new file mode 100644
index 0000000..6f9ea2d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/gl-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“gl”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[gl]"></a>OpenLayers.<span class=HB> </span>Lang[“gl”]</h1><div class=CBody><p>Dictionary for Galego.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/gsw-js.html b/doc/devdocs/files/OpenLayers/Lang/gsw-js.html
new file mode 100644
index 0000000..590d9e0
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/gsw-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“gsw”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[gsw]"></a>OpenLayers.<span class=HB> </span>Lang[“gsw”]</h1><div class=CBody><p>Dictionary for Alemannisch.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal string [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/hr-js.html b/doc/devdocs/files/OpenLayers/Lang/hr-js.html
new file mode 100644
index 0000000..42857f3
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/hr-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“hr”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[hr]"></a>OpenLayers.<span class=HB> </span>Lang[“hr”]</h1><div class=CBody><p>Dictionary for Hrvatski.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/hsb-js.html b/doc/devdocs/files/OpenLayers/Lang/hsb-js.html
new file mode 100644
index 0000000..0712dce
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/hsb-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“hsb”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[hsb]"></a>OpenLayers.<span class=HB> </span>Lang[“hsb”]</h1><div class=CBody><p>Dictionary for Hornjoserbsce.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal stri [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/hu-js.html b/doc/devdocs/files/OpenLayers/Lang/hu-js.html
new file mode 100644
index 0000000..e74868a
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/hu-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“hu”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[hu]"></a>OpenLayers.<span class=HB> </span>Lang[“hu”]</h1><div class=CBody><p>Dictionary for Magyar.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/ia-js.html b/doc/devdocs/files/OpenLayers/Lang/ia-js.html
new file mode 100644
index 0000000..dac9d3b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/ia-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ia”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ia]"></a>OpenLayers.<span class=HB> </span>Lang[“ia”]</h1><div class=CBody><p>Dictionary for Interlingua.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/id-js.html b/doc/devdocs/files/OpenLayers/Lang/id-js.html
new file mode 100644
index 0000000..b292276
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/id-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“id”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[id]"></a>OpenLayers.<span class=HB> </span>Lang[“id”]</h1><div class=CBody><p>Dictionary for Bahasa Indonesia.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal str [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/io-js.html b/doc/devdocs/files/OpenLayers/Lang/io-js.html
new file mode 100644
index 0000000..c2e2bc5
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/io-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“io”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[io]"></a>OpenLayers.<span class=HB> </span>Lang[“io”]</h1><div class=CBody><p>Dictionary for Ido.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or strin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/is-js.html b/doc/devdocs/files/OpenLayers/Lang/is-js.html
new file mode 100644
index 0000000..43f394d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/is-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“is”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[is]"></a>OpenLayers.<span class=HB> </span>Lang[“is”]</h1><div class=CBody><p>Dictionary for Íslenska.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/it-js.html b/doc/devdocs/files/OpenLayers/Lang/it-js.html
new file mode 100644
index 0000000..aea2286
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/it-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“it”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[it]"></a>OpenLayers.<span class=HB> </span>Lang[“it”]</h1><div class=CBody><p>Dictionary for Italian.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/ja-js.html b/doc/devdocs/files/OpenLayers/Lang/ja-js.html
new file mode 100644
index 0000000..54f3822
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/ja-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ja”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ja]"></a>OpenLayers.<span class=HB> </span>Lang[“ja”]</h1><div class=CBody><p>Dictionary for 日本語.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or strin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/km-js.html b/doc/devdocs/files/OpenLayers/Lang/km-js.html
new file mode 100644
index 0000000..615c9c9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/km-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“km”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[km]"></a>OpenLayers.<span class=HB> </span>Lang[“km”]</h1><div class=CBody><p>Dictionary for ភាសាខ្មែរ.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/ksh-js.html b/doc/devdocs/files/OpenLayers/Lang/ksh-js.html
new file mode 100644
index 0000000..6907696
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/ksh-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ksh”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ksh]"></a>OpenLayers.<span class=HB> </span>Lang[“ksh”]</h1><div class=CBody><p>Dictionary for Ripoarisch.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/nb-js.html b/doc/devdocs/files/OpenLayers/Lang/nb-js.html
new file mode 100644
index 0000000..45762db
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/nb-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“nb”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[nb]"></a>OpenLayers.<span class=HB> </span>Lang[“nb”]</h1><div class=CBody><p>Dictionary for norwegian bokmål (Norway).  Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are no [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/nds-js.html b/doc/devdocs/files/OpenLayers/Lang/nds-js.html
new file mode 100644
index 0000000..de57a6e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/nds-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“nds”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[nds]"></a>OpenLayers.<span class=HB> </span>Lang[“nds”]</h1><div class=CBody><p>Dictionary for Plattdüütsch.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strin [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/nl-js.html b/doc/devdocs/files/OpenLayers/Lang/nl-js.html
new file mode 100644
index 0000000..ee3ace5
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/nl-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“nl”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[nl]"></a>OpenLayers.<span class=HB> </span>Lang[“nl”]</h1><div class=CBody><p>Dictionary for Nederlands.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings o [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/nn-js.html b/doc/devdocs/files/OpenLayers/Lang/nn-js.html
new file mode 100644
index 0000000..ca4fbf8
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/nn-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“nn”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[nn]"></a>OpenLayers.<span class=HB> </span>Lang[“nn”]</h1><div class=CBody><p>Dictionary for ‪Norsk (nynorsk)‬.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/oc-js.html b/doc/devdocs/files/OpenLayers/Lang/oc-js.html
new file mode 100644
index 0000000..f9bd051
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/oc-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“oc”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[oc]"></a>OpenLayers.<span class=HB> </span>Lang[“oc”]</h1><div class=CBody><p>Dictionary for Occitan.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/pt-BR-js.html b/doc/devdocs/files/OpenLayers/Lang/pt-BR-js.html
new file mode 100644
index 0000000..d6504cd
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/pt-BR-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“pt-br”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[pt-br]"></a>OpenLayers.<span class=HB> </span>Lang[“pt-br”]</h1><div class=CBody><p>Dictionary for Português do Brasil.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are n [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/pt-js.html b/doc/devdocs/files/OpenLayers/Lang/pt-js.html
new file mode 100644
index 0000000..4d42294
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/pt-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“pt”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[pt]"></a>OpenLayers.<span class=HB> </span>Lang[“pt”]</h1><div class=CBody><p>Dictionary for Português.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/ru-js.html b/doc/devdocs/files/OpenLayers/Lang/ru-js.html
new file mode 100644
index 0000000..9ae41a2
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/ru-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“ru”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[ru]"></a>OpenLayers.<span class=HB> </span>Lang[“ru”]</h1><div class=CBody><p>Dictionary for Русский.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/sk-js.html b/doc/devdocs/files/OpenLayers/Lang/sk-js.html
new file mode 100644
index 0000000..5d363a1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/sk-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“sk”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[sk]"></a>OpenLayers.<span class=HB> </span>Lang[“sk”]</h1><div class=CBody><p>Dictionary for Slovenčina.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings o [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/sv-SE-js.html b/doc/devdocs/files/OpenLayers/Lang/sv-SE-js.html
new file mode 100644
index 0000000..3483bff
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/sv-SE-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“sv”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[sv]"></a>OpenLayers.<span class=HB> </span>Lang[“sv”]</h1><div class=CBody><p>Dictionary for Svenska.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or s [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/te-js.html b/doc/devdocs/files/OpenLayers/Lang/te-js.html
new file mode 100644
index 0000000..a000da4
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/te-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“te”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[te]"></a>OpenLayers.<span class=HB> </span>Lang[“te”]</h1><div class=CBody><p>Dictionary for తెలుగు.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings or st [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/vi-js.html b/doc/devdocs/files/OpenLayers/Lang/vi-js.html
new file mode 100644
index 0000000..b498326
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/vi-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“vi”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[vi]"></a>OpenLayers.<span class=HB> </span>Lang[“vi”]</h1><div class=CBody><p>Dictionary for Tiếng Việt.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are normal strings o [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/zh-CN-js.html b/doc/devdocs/files/OpenLayers/Lang/zh-CN-js.html
new file mode 100644
index 0000000..6bbd075
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/zh-CN-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“zh-CN”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[zh-CN]"></a>OpenLayers.<span class=HB> </span>Lang[“zh-CN”]</h1><div class=CBody><p>Dictionary for Simplified Chinese.   Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.   Entry bodies are no [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Lang/zh-TW-js.html b/doc/devdocs/files/OpenLayers/Lang/zh-TW-js.html
new file mode 100644
index 0000000..faa756b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Lang/zh-TW-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Lang[“zh-TW”] - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Lang[zh-TW]"></a>OpenLayers.<span class=HB> </span>Lang[“zh-TW”]</h1><div class=CBody><p>Dictionary for Traditional Chinese.  (Used Mainly in Taiwan) Keys for entries are used in calls to <a href="../Lang-js.html#OpenLayers.Lang.translate" class=LFunction id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="HideTip('tt1')">OpenLayers.Lang.translate</a>.&nb [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([19, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>key,</td></tr><tr><td></td><td class=PParameter nowrap>context</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Looks up a key from a dictionary based on the current language string. </di [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer-js.html b/doc/devdocs/files/OpenLayers/Layer-js.html
new file mode 100644
index 0000000..9cff99f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer-js.html
@@ -0,0 +1,187 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer"></a>OpenLayers.<span class=HB> </span>Layer</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Layer" >OpenLayers.<span class=HB> </span>Layer</a></td><td class=SDescription></td></tr><tr class="SGroup SInd [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.id"></a>id</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.name"></a>name</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.div"></a>div</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.opacity"></a>opacity</h3><div class=CBody><p>{Float} The layer’s opacity.  Float number between 0.0 and 1.0.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.alwaysInRange"></a>alwaysInRange</h3><div class=CBody><p>{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.</p><p>If not explicitly specified for a layer, its value will be determined on startup in initResolutions() based [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>layer.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.</p><h4 cla [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.RESOLUTION_PROPERTIES"></a>RESOLUTION_PROPERTIES</h3><div class=CBody><p>{Array} The properties that are used for calculating resolutions information.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.map"></a>map</h3><div class=CBody><p>{<a href="Map-js.html#OpenLayers.Map" class=LClass id=link43 onMouseOver="ShowTip(event, 'tt1', 'link43')" onMouseOut="HideTip('tt1')">OpenLayers.Map</a>} This variable is set when the layer is added to the map, via the accessor function setMap().</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Whether or not the layer is a base layer.  This should be set individually by all subclasses.  Default is false</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.alpha"></a>alpha</h3><div class=CBody><p>{Boolean} The layer’s images have an alpha channel.   Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.displayInLayerSwitcher"></a>displayInLayerSwitcher</h3><div class=CBody><p>{Boolean} Display the layer’s name in the layer switcher.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.visibility"></a>visibility</h3><div class=CBody><p>{Boolean} The layer should be displayed in the map.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.attribution"></a>attribution</h3><div class=CBody><p>{String} Attribution string, displayed when an <a href="Control/Attribution-js.html#OpenLayers.Control.Attribution" class=LClass id=link44 onMouseOver="ShowTip(event, 'tt2', 'link44')" onMouseOut="HideTip('tt2')">OpenLayers.Control.Attribution</a> has been added to the map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.inRange"></a>inRange</h3><div class=CBody><p>{Boolean} The current map resolution is within the layer’s min/max range.  This is set in <a href="Map-js.html#OpenLayers.Map.setCenter" class=LFunction id=link45 onMouseOver="ShowTip(event, 'tt41', 'link45')" onMouseOut="HideTip('tt41')">OpenLayers.Map.setCenter</a> whenever the zoom changes.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.imageOffset"></a>imageOffset</h3><div class=CBody><p>{<a href="BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link46 onMouseOver="ShowTip(event, 'tt3', 'link46')" onMouseOut="HideTip('tt3')">OpenLayers.Pixel</a>} For layers with a gutter, the image offset represents displacement due to the gutter.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.options"></a>options</h3><div class=CBody><p>{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 object and sent to the constructor when the layer is created.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.eventListeners"></a>eventListeners</h3><div class=CBody><p>{Object} If set as an option at construction, the eventListeners object will be registered with <a href="Events-js.html#OpenLayers.Events.on" class=LFunction id=link47 onMouseOver="ShowTip(event, 'tt4', 'link47')" onMouseOut="HideTip('tt4')">OpenLayers.Events.on</a>.   Object structure must be a listeners object as shown in the example for th [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.gutter"></a>gutter</h3><div class=CBody><p>{Integer} Determines the width (in pixels) of the gutter around image tiles to ignore.   By setting this property to a non-zero value, images will be requested that are wider and taller than the tile size by a value of 2 x gutter.   This allows artifacts of rendering at tile edges to be ignored.   Set a gutter value that is equal to half the size o [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.projection"></a>projection</h3><div class=CBody><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link48 onMouseOver="ShowTip(event, 'tt5', 'link48')" onMouseOut="HideTip('tt5')">OpenLayers.Projection</a>} or {<a href="BaseTypes-js.html#OpenLayers.String" class=LClass id=link49 onMouseOver="ShowTip(event, 'tt6', 'link49')" onMouseOut="HideTip('tt6')">String</a>} Set in the layer optio [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.units"></a>units</h3><div class=CBody><p>{String} The layer map units.   Defaults to ‘degrees’.   Possible values are ‘degrees’ (or ‘dd’), ‘m’, ‘ft’, ‘km’, ‘mi’, ‘inches’.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.scales"></a>scales</h3><div class=CBody><p>{Array}  An array of map scales in descending order.   The values in the array correspond to the map scale denominator.   Note that these values only make sense if the display (monitor) resolution of the client is correctly guessed by whomever is configuring the application.   In addition, the units property must also be set.  Use <a href="#Op [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.resolutions"></a>resolutions</h3><div class=CBody><p>{Array} 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.).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.maxExtent"></a>maxExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link52 onMouseOver="ShowTip(event, 'tt7', 'link52')" onMouseOut="HideTip('tt7')">OpenLayers.Bounds</a>}  The center of these bounds will not stray outside of the viewport extent during panning.   In addition, if <a href="#OpenLayers.Layer.displayOutsideMaxExtent" class=LProperty id=l [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.minExtent"></a>minExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link54 onMouseOver="ShowTip(event, 'tt7', 'link54')" onMouseOut="HideTip('tt7')">OpenLayers.Bounds</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.maxResolution"></a>maxResolution</h3><div class=CBody><p>{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 displaying the whole world.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.minResolution"></a>minResolution</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.numZoomLevels"></a>numZoomLevels</h3><div class=CBody><p>{Integer}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.minScale"></a>minScale</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.maxScale"></a>maxScale</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.displayOutsideMaxExtent"></a>displayOutsideMaxExtent</h3><div class=CBody><p>{Boolean} Request map tiles that are completely outside of the max extent for this layer.  Defaults to false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><p>{Boolean} #487 for more info.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.transitionEffect"></a>transitionEffect</h3><div class=CBody><p>{String} The transition effect to use when the map is panned or zoomed.</p><h4 class=CHeading>There are currently two supported values</h4><ul><li><b>null</b> No transition effect (the default).</li><li><b>resize</b>  Existing tiles are resized on zoom to provide a visual effect of the zoom having taken place immediately.   As the new til [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SUPPORTED_TRANSITIONS"></a>SUPPORTED_TRANSITIONS</h3><div class=CBody><p>{Array} An immutable (that means don’t change it!) list of supported transitionEffect values.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.metadata"></a>metadata</h3><div class=CBody><p>{Object} This object can be used to store additional information on a layer object.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.OpenLayers.Layer"></a>OpenLayers.<span class=HB> </span>Layer</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} The layer name</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Hashtable of extra options to tag onto the layer</td></tr></ta [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>destroy: function(</td><td class=PParameter nowrap>setNewBaseLayer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Destroy is a destructor: this is to alleviate [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getOptions"></a>getOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getOptions: function()</td></tr></table></blockquote><p>Extracts an object from the layer with the properties that were set as options, but updates them with the values currently set on the instance.</p><h4 class=CHeading>Returns</h4><p>{Object} the <a href="#OpenLayers.Layer.opt [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setName"></a>setName</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setName: function(</td><td class=PParameter nowrap>newName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the new layer name for this layer.   Can tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.addOptions"></a>addOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addOptions: function (</td><td class=PParameter nowrap>newOptions</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote><p>This function can be implemented by subclasses</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>redraw: function()</td></tr></table></blockquote><p>Redraws the layer.   Returns true if the layer was redrawn, false if not.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The layer was redrawn.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PAfterParame [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the layer.  This is done throu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.afterAdd"></a>afterAdd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>afterAdd: function()</td></tr></table></blockquote><p>Called at the end of the map.addLayer sequence.   At this point, the map will have a base layer.   To be overridden by subclasses.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.removeMap"></a>removeMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Just as setMap() allows each layer the possibility  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getImageSize"></a>getImageSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getImageSize: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setTileSize"></a>setTileSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setTileSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the tile size based on the map size.&nbs [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getVisibility"></a>getVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getVisibility: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} The layer should be displayed (if in range).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setVisibility"></a>setVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visibility</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the visibility flag for the  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>display</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the Layer</p><h4 class=CHeading>Paramete [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.calculateInRange"></a>calculateInRange</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>calculateInRange: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} The layer is displayable at the current map’s current resolution.  Note that if ‘alwaysInRange’ is true for the layer, this function will alwa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setIsBaseLayer"></a>setIsBaseLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setIsBaseLayer: function(</td><td class=PParameter nowrap>isBaseLayer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.initResolutions"></a>initResolutions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initResolutions: function()</td></tr></table></blockquote><p>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 dis [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.resolutionsFromScales"></a>resolutionsFromScales</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>resolutionsFromScales: function(</td><td class=PParameter nowrap>scales</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Derive resol [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.calculateResolutions"></a>calculateResolutions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateResolutions: function(</td><td class=PParameter nowrap>props</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate resolu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getResolution"></a>getResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The currently selected resolution of the map, taken from the resolutions array, indexed by current zoom level.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getExtent"></a>getExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link62 onMouseOver="ShowTip(event, 'tt7', 'link62')" onMouseOut="HideTip('tt7')">OpenLayers.Bounds</a>} A Bounds object which  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getZoomForExtent"></a>getZoomForExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForExtent: function(</td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getDataExtent"></a>getDataExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getDataExtent: function ()</td></tr></table></blockquote><p>Calculates the max extent which includes all of the data for the layer.  This function is to be implemented by subclasses.</p><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bou [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getResolutionForZoom"></a>getResolutionForZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getResolutionForZoom: function(</td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getZoomForResolution"></a>getZoomForResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForResolution: function(</td><td class=PParameter nowrap>resolution,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getLonLatFromViewPortPx"></a>getLonLatFromViewPortPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromViewPortPx: function (</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getViewPortPxFromLonLat"></a>getViewPortPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getViewPortPxFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Retur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the opacity for the entire layer (all i [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.getZIndex"></a>getZIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getZIndex: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} the z-index of this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.setZIndex"></a>setZIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setZIndex: function (</td><td class=PParameter nowrap>zIndex</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.adjustBounds"></a>adjustBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>adjustBounds: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This function will take a bounds, and  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt2"><div class=CClass>The attribution control adds attribution from layers to the map display. </div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/ArcGIS93Rest-js.html b/doc/devdocs/files/OpenLayers/Layer/ArcGIS93Rest-js.html
new file mode 100644
index 0000000..8d73bba
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/ArcGIS93Rest-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.ArcGIS93Rest - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcGIS93Rest</h1><div class=CBody><p>Instances of OpenLayers.Layer.ArcGIS93Rest are used to display data from ESRI ArcGIS Server 9.3 (and up?)  Mapping Services using the REST API.  Create a new ArcGIS93Rest layer with the <a href="#OpenLayers.Layer.ArcGIS93Rest.OpenLayers.Layer.ArcGIS93Res [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Default is true for ArcGIS93Rest layer</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.OpenLayers.Layer.ArcGIS93Rest"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcGIS93Rest</h3><div class=CBody><p>Create a new ArcGIS93Rest layer object.</p><h4 class=CHeading>Example</h4><blockquote><pre>var arcims = new OpenLayers.Layer.ArcGIS93Rest("MyName",
+                                   "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/export",
+                                   {
+                                     layers: "0,1,2"
+                                   });</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base url for the ArcGIS server REST service</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An object with key/value pairs representing the opt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeadin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return an image url this layer.</p><h4 clas [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.setLayerFilter"></a>setLayerFilter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayerFilter: function (</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>queryDef</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.clearLayerFilter"></a>clearLayerFilter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clearLayerFilter: function (</td><td class=PParameter nowrap>id</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Clears layer filt [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Catch changeParams [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcGIS93Rest.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Destroy this layer</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=P [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/ArcIMS-js.html b/doc/devdocs/files/OpenLayers/Layer/ArcIMS-js.html
new file mode 100644
index 0000000..14580e6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/ArcIMS-js.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.ArcIMS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.ArcIMS"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcIMS</h1><div class=CBody><p>Instances of OpenLayers.Layer.ArcIMS are used to display data from ESRI ArcIMS Mapping Services.  Create a new ArcIMS layer with the <a href="#OpenLayers.Layer.ArcIMS.OpenLayers.Layer.ArcIMS" class=LConstructor id=link10 onMouseOver="ShowTip(event, 'tt10', 'link10')" onM [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Default query string parameters.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.tileSize"></a>tileSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt1', 'link12')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Size for tiles.   Default is 512x512.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.featureCoordSys"></a>featureCoordSys</h3><div class=CBody><p>{String} Code for feature coordinate system.   Default is “4326”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.filterCoordSys"></a>filterCoordSys</h3><div class=CBody><p>{String} Code for filter coordinate system.   Default is “4326”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.layers"></a>layers</h3><div class=CBody><p>{Array} An array of objects with layer properties.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.async"></a>async</h3><div class=CBody><p>{Boolean} Request images asynchronously.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.name"></a>name</h3><div class=CBody><p>{String} Layer name.   Default is “ArcIMS”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} The layer is a base layer.   Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.DEFAULT_OPTIONS"></a>DEFAULT_OPTIONS</h3><div class=CBody><p>{Object} Default layers properties.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.OpenLayers.Layer.ArcIMS"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>ArcIMS</h3><div class=CBody><p>Create a new ArcIMS layer object.</p><h4 class=CHeading>Example</h4><blockquote><pre>var arcims = new OpenLayers.Layer.ArcIMS(
+    "Global Sample",
+    "http://sample.avencia.com/servlet/com.esri.esrimap.Esrimap",
+    {
+        service: "OpenLayers_Sample",
+        layers: [
+            // layers to manipulate
+            {id: "1", visible: true}
+        ]
+    }
+);</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base url for the ArcIMS server</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object with properties to be set on the layer.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return an image url this layer.</p><h4 class=CHead [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.getURLasync"></a>getURLasync</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURLasync: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>scope,</td></tr><tr><td></td><td class=PParameter nowrap>prop,</td></tr><tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.getUrlOrImage"></a>getUrlOrImage</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getUrlOrImage: function(</td><td class=PParameter nowrap>output</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Extract a url or image from t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.setLayerQuery"></a>setLayerQuery</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayerQuery: function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>querydef</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.getFeatureInfo"></a>getFeatureInfo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureInfo: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>options [...]
+    id: "ArcXML layer ID",  // the ArcXML layer ID
+    query: {
+        where: "STATE = 'PA'",  // the where clause of the query
+        accuracy: 100           // the accuracy of the returned feature
+    }
+}</pre></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Object with non-default properties to set on the layer.  Supported properties are buffer, callback, scope, and any other properties applicable to the ArcXML format.   Set the ‘callback’ and ‘scope’ for an object and function to recieve the parsed features from ArcIMS.</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Retu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.ArcIMS.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bl [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Destroy this layer</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpaddin [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Boxes-js.html b/doc/devdocs/files/OpenLayers/Layer/Boxes-js.html
new file mode 100644
index 0000000..9b0419d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Boxes-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Boxes - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Boxes"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Boxes</h1><div class=CBody><p>Draw divs as ‘boxes’ on the layer.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Markers-js.html#OpenLayers.Layer.Markers" class=LClass >OpenLayers.Layer.Markers</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div cl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.OpenLayers.Layer.Boxes"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Boxes</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Hashtable of extra options to tag on [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.drawMarker"></a>drawMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate the pixel location for the ma [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Boxes.removeMarker"></a>removeMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Calculate the pixel location for the marker, create it, and add it to the layer’s div</div></div><div class=CToolTip id="tt2 [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/EventPane-js.html b/doc/devdocs/files/OpenLayers/Layer/EventPane-js.html
new file mode 100644
index 0000000..4697195
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/EventPane-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.EventPane - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.EventPane"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>EventPane</h1><div class=CBody><p>Base class for 3rd party layers.   Create a new event pane layer with the <a href="#OpenLayers.Layer.EventPane.OpenLayers.Layer.EventPane" class=LConstructor id=link15 onMouseOver="ShowTip(event, 'tt15', 'link15')" onMouseOut="HideTip('tt15')">OpenLayers.Layer.Even [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.smoothDragPan"></a>smoothDragPan</h3><div class=CBody><p>{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 n [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} EventPaned layers are always base layers, by necessity.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.isFixed"></a>isFixed</h3><div class=CBody><p>{Boolean} EventPaned layers are fixed by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.pane"></a>pane</h3><div class=CBody><p>{DOMElement} A reference to the element that controls the events.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.mapObject"></a>mapObject</h3><div class=CBody><p>{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 ve layer, this will be of type VEMap</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.OpenLayers.Layer.EventPane"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>EventPane</h3><div class=CBody><p>Create a new event pane layer</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescripti [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Deconstruct this layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the map property for the layer.  This is  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.removeMap"></a>removeMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>On being removed from the map, we’l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.loadWarningMessage"></a>loadWarningMessage</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadWarningMessage:function()</td></tr></table></blockquote><p>If we can’t load the map lib, then display an error message to the user and tell them where to go for help.</p><p>This function sets up the layout for the warning message.  Each 3r [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><p>To be implemented by subclasses.</p><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>display</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the display on the pane</p><h4 class=CH [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.setZIndex"></a>setZIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setZIndex: function (</td><td class=PParameter nowrap>zIndex</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the z-index order for the pane.</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PA [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.getLonLatFromViewPortPx"></a>getLonLatFromViewPortPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromViewPortPx: function (</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.getViewPortPxFromLonLat"></a>getViewPortPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getViewPortPxFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.getOLLonLatFromMapObjectLonLat"></a>getOLLonLatFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getOLLonLatFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.getMapObjectLonLatFromOLLonLat"></a>getMapObjectLonLatFromOLLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromOLLonLat: function(</td><td class=PParameter nowrap>olLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.getOLPixelFromMapObjectPixel"></a>getOLPixelFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getOLPixelFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.EventPane.getMapObjectPixelFromOLPixel"></a>getMapObjectPixelFromOLPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromOLPixel: function(</td><td class=PParameter nowrap>olPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ta [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Deconstruct this layer.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td cl [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/FixedZoomLevels-js.html b/doc/devdocs/files/OpenLayers/Layer/FixedZoomLevels-js.html
new file mode 100644
index 0000000..ebbbfe6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/FixedZoomLevels-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.FixedZoomLevels - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>FixedZoomLevels</h1><div class=CBody><p>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.</p><h4 class=CHeading>When you subcla [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.OpenLayers.Layer.FixedZoomLevels"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>FixedZoomLevels</h3><div class=CBody><p>Create a new fixed zoom levels layer.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.initResolutions"></a>initResolutions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initResolutions: function()</td></tr></table></blockquote><p>Populate the resolutions array</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.getResolution"></a>getResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function()</td></tr></table></blockquote><p>Get the current map resolution</p><h4 class=CHeading>Returns</h4><p>{Float} Map units per Pixel</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.getExtent"></a>getExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function ()</td></tr></table></blockquote><p>Calculates using px-> lonlat translation functions on tl and br corners of viewport</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link7 onMouse [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.getZoomForResolution"></a>getZoomForResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForResolution: function(</td><td class=PParameter nowrap>resolution</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.getOLZoomFromMapObjectZoom"></a>getOLZoomFromMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getOLZoomFromMapObjectZoom: function(</td><td class=PParameter nowrap>moZoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.FixedZoomLevels.getMapObjectZoomFromOLZoom"></a>getMapObjectZoomFromOLZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectZoomFromOLZoom: function(</td><td class=PParameter nowrap>olZoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initResolutions: function()</td></tr></table></blockquote>Populate the resolutions array</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function()</td></tr></table></blockquote>Get the current map resolution</div></div><div class=CToolTip id="tt3"><div  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/GML-js.html b/doc/devdocs/files/OpenLayers/Layer/GML-js.html
new file mode 100644
index 0000000..18d124d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/GML-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.GML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.GML"></a>OpenLayers.<span class=HB> </span>Layer.GML</h1><div class=CBody><p>Create a vector layer by parsing a GML file.  The GML file is passed in as a parameter.  <b>Deprecated</b>.   To be removed in 3.0.   Instead use OpenLayers.Layer.Vector with Protocol.HTTP and Strategy.Fixed.  Provide the protocol with a format parameter to get the parser you wan [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.loaded"></a>loaded</h3><div class=CBody><p>{Boolean} Flag for whether the GML data has been loaded yet.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.format"></a>format</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} The format you want the data to be parsed with.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Hash of options which should be passed to the format when it is created.  Must be passed in the constructor.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.OpenLayers.Layer.GML"></a>OpenLayers.<span class=HB> </span>Layer.GML</h3><div class=CBody><p>Load and parse a single file on the web, according to the format provided via the ‘format’ option, defaulting to GML.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.setVisibility"></a>setVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visibility,</td></tr><tr><td></td><td class=PParameter nowrap>noEvent</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>minor</td><td class=PAfterParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.loadGML"></a>loadGML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadGML: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.setUrl"></a>setUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setUrl:function(</td><td class=PParameter nowrap>url</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Change the URL and reload the GML</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.requestSuccess"></a>requestSuccess</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>requestSuccess:function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Process GML after it has been [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GML.requestFailure"></a>requestFailure</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>requestFailure: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Process a failed loading of  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visibility,</td></tr><tr><td></td><td class=PParameter nowrap>noEvent</td><td class=PAfterParameters no [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/GeoRSS-js.html b/doc/devdocs/files/OpenLayers/Layer/GeoRSS-js.html
new file mode 100644
index 0000000..3ccb0a4
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/GeoRSS-js.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.GeoRSS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.GeoRSS"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>GeoRSS</h1><div class=CBody><p>Add GeoRSS Point features to your map.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Markers-js.html#OpenLayers.Layer.Markers" class=LClass >OpenLayers.Layer.Markers</a></li><li><a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a></li></ul [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.location"></a>location</h3><div class=CBody><p>{String} store url of text file</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.features"></a>features</h3><div class=CBody><p>{Array(<a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Feature</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Hash of options which should be passed to the format when it is created.  Must be passed in the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.selectedFeature"></a>selectedFeature</h3><div class=CBody><p>{<a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt1', 'link12')" onMouseOut="HideTip('tt1')">OpenLayers.Feature</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.icon"></a>icon</h3><div class=CBody><p>{<a href="../Icon-js.html#OpenLayers.Icon" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt2', 'link13')" onMouseOut="HideTip('tt2')">OpenLayers.Icon</a>}.  This determines the Icon to be used on the map for this GeoRSS layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.popupSize"></a>popupSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt3', 'link14')" onMouseOut="HideTip('tt3')">OpenLayers.Size</a>} This determines the size of GeoRSS popups.  If not provided, defaults to 250px by 120px.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.useFeedTitle"></a>useFeedTitle</h3><div class=CBody><p>{Boolean} Set layer.name to the first <title> element in the feed.  Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.OpenLayers.Layer.GeoRSS"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>GeoRSS</h3><div class=CBody><p>Create a GeoRSS Layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>location</td><td class=CDLDescription>{String}</td [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.loadRSS"></a>loadRSS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadRSS: function()</td></tr></table></blockquote><p>Start the load of the RSS data.  Don’t do this when we first add the layer, since we may not be visible at any point, and it would therefore be a waste.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>minor</td><td class=PAfterPa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.parseData"></a>parseData</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseData: function(</td><td class=PParameter nowrap>ajaxRequest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse the data returned from the Eve [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.markerClick"></a>markerClick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>markerClick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.GeoRSS.clearFeatures"></a>clearFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearFeatures: function()</td></tr></table></blockquote><p>Destroy all features in this layer.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Features are combinations of geography and attributes. </div></div><div class=CToolTip id="tt2"><div class=CClass>The icon represents a graphical icon on the screen. </div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Google-js.html b/doc/devdocs/files/OpenLayers/Layer/Google-js.html
new file mode 100644
index 0000000..2588742
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Google-js.html
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Google - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Google"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="SphericalMercator-js.html#OpenLayers.Layer.SphericalMercator" class=LClass id=link29 onMouseOver="ShowTip(event, 'tt29', 'link29')" onMouseOut="HideTip('tt29')">OpenLayers.Layer.SphericalMercator</a></li><li><a href="EventPan [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.MIN_ZOOM_LEVEL"></a>MIN_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 0</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.MAX_ZOOM_LEVEL"></a>MAX_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 21</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.RESOLUTIONS"></a>RESOLUTIONS</h3><div class=CBody><p>{Array(Float)} Hardcode these resolutions so that they are more closely tied with the standard wms projection</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.type"></a>type</h3><div class=CBody><p>{GMapType}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><p>{Boolean} Allow user to pan forever east/west.   Default is true.  Setting this to false only restricts panning if <a href="#OpenLayers.Layer.Google.sphericalMercator" class=LProperty id=link32 onMouseOver="ShowTip(event, 'tt32', 'link32')" onMouseOut="HideTip('tt32')">sphericalMercator</a> is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.sphericalMercator"></a>sphericalMercator</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.version"></a>version</h3><div class=CBody><p>{Number} The version of the Google Maps API</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.OpenLayers.Layer.Google"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer.</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Layer.Google.OpenLayers.Layer.Google" class=LConstructor >OpenLayers.Layer.Google</a>} An exact clone of this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.setVisibility"></a>setVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visible</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the visibility flag for  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>visible</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the Layer</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PAft [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the opacity for the entire layer [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up this layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.removeGMapElements"></a>removeGMapElements</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>removeGMapElements: function()</td></tr></table></blockquote><p>Remove all elements added to the dom.   This should only be called if this is the last of the Google layers for the given map.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.removeMap"></a>removeMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>On being removed from the map, also remove t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getOLBoundsFromMapObjectBounds"></a>getOLBoundsFromMapObjectBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getOLBoundsFromMapObjectBounds: function(</td><td class=PParameter nowrap>moBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectCenter"></a>getMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectCenter: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} The mapObject’s current center in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectZoom"></a>getMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectZoom: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The mapObject’s current zoom, in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getLongitudeFromMapObjectLonLat"></a>getLongitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLongitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getLatitudeFromMapObjectLonLat"></a>getLatitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLatitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getXFromMapObjectPixel"></a>getXFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getXFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getYFromMapObjectPixel"></a>getYFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getYFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.OpenLayers.Layer.Google.cache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.<span class=HB> </span>cache</h3><div class=CBody><p>{Object} Cache for elements that should only be created once per map.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.OpenLayers.Layer.Google.v2"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.v2</h3><div class=CBody><p>Mixin providing functionality specific to the Google Maps API v2.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.termsOfUse"></a>termsOfUse</h3><div class=CBody><p>{DOMElement} Div for Google’s copyright and terms of use link</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.poweredBy"></a>poweredBy</h3><div class=CBody><p>{DOMElement} Div for Google’s powered by logo and link</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.dragObject"></a>dragObject</h3><div class=CBody><p>{GDraggableObject} Since 2.93, Google has exposed the ability to get the maps GDraggableObject.  We can now use this for smooth panning</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.loadMapObject"></a>loadMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote><p>Load the GMap and register appropriate event listeners.  If we can’t load GMap2, then display a warning message.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.setGMapVisibility"></a>setGMapVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setGMapVisibility: function(</td><td class=PParameter nowrap>visible</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Display the GMap [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapContainer"></a>getMapContainer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapContainer: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement} the GMap container’s div</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectBoundsFromOLBounds"></a>getMapObjectBoundsFromOLBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectBoundsFromOLBounds: function(</td><td class=PParameter nowrap>olBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.dragPanMapObject"></a>dragPanMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragPanMapObject: function(</td><td class=PParameter nowrap>dX,</td></tr><tr><td></td><td class=PParameter nowrap>dY</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectZoomFromMapObjectBounds"></a>getMapObjectZoomFromMapObjectBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectZoomFromMapObjectBounds: function(</td><td class=PParameter nowrap>moBounds</td><td class=PAfterParameters nowrap>)</td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterPar [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote>Create a clone of this layer</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setVisibility: function(</td><td class=PParameter nowrap>visi [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Google/v3-js.html b/doc/devdocs/files/OpenLayers/Layer/Google/v3-js.html
new file mode 100644
index 0000000..00be93d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Google/v3-js.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Google/v3.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="v3.js"></a>v3.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#v3.js" >v3.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Constants" >Constants</a></td><td class=SDescription></td></tr><tr  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Google.v3"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.v3</h3><div class=CBody><p>Mixin providing functionality specific to the Google Maps API v3.  Note that this layer configures the google.maps.map object with the “disableDefaultUI” option set to true.  Using UI controls that the Google Maps API provides is not supported by the OpenLayers API.</p></di [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="DEFAULTS"></a>DEFAULTS</h3><div class=CBody><p>{Object} It is not recommended to change the properties set here.  Note that Google.v3 layers only work when sphericalMercator is set to true.</p><blockquote><pre>{
+    maxExtent: new OpenLayers.Bounds(
+        -128 * 156543.0339,
+        -128 * 156543.0339,
+        128 * 156543.0339,
+        128 * 156543.0339
+    ),
+    sphericalMercator: true,
+    maxResolution: 156543.0339,
+    units: "m",
+    projection: "EPSG:900913"
+}</pre></blockquote></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="loadMapObject"></a>loadMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote><p>Load the GMap and register appropriate event listeners.  If we can’t load GMap2, then display a warning message.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="repositionMapElements"></a>repositionMapElements</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>repositionMapElements: function()</td></tr></table></blockquote><p>Waits until powered by and terms of use elements are available and then moves them so they are clickable.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="setGMapVisibility"></a>setGMapVisibility</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setGMapVisibility: function(</td><td class=PParameter nowrap>visible</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Display the GMap container and associate [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapContainer"></a>getMapContainer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapContainer: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement} the GMap container’s div</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectBoundsFromOLBounds"></a>getMapObjectBoundsFromOLBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectBoundsFromOLBounds: function(</td><td class=PParameter nowrap>olBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectZoomFromMapObjectBounds"></a>getMapObjectZoomFromMapObjectBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectZoomFromMapObjectBounds: function(</td><td class=PParameter nowrap>moBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up this layer.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote>Load the GMap and register appropriate event listeners. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>repositionMapElements: function()</td></tr></table></blockquote>Waits until powered by and terms of use eleme [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Grid-js.html b/doc/devdocs/files/OpenLayers/Layer/Grid-js.html
new file mode 100644
index 0000000..8cc0284
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Grid-js.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Grid - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Grid"></a>OpenLayers.<span class=HB> </span>Layer.Grid</h1><div class=CBody><p>Base class for layers that use a lattice of tiles.   Create a new grid layer with the <a href="#OpenLayers.Layer.Grid.OpenLayers.Layer.Grid" class=LConstructor id=link24 onMouseOver="ShowTip(event, 'tt24', 'link24')" onMouseOut="HideTip('tt24')">OpenLayers.Layer.Grid</a> constructor.</p><h4 class= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.tileSize"></a>tileSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt1', 'link25')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.grid"></a>grid</h3><div class=CBody><p>{Array(Array(<a href="../Tile-js.html#OpenLayers.Tile" class=LClass id=link26 onMouseOver="ShowTip(event, 'tt2', 'link26')" onMouseOut="HideTip('tt2')">OpenLayers.Tile</a>))} This is an array of rows, each row is an array of tiles.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.singleTile"></a>singleTile</h3><div class=CBody><p>{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 entire viewport, it is reloaded.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.ratio"></a>ratio</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.buffer"></a>buffer</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.numLoadingTiles"></a>numLoadingTiles</h3><div class=CBody><p>{Integer} How many tiles are still loading?</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.OpenLayers.Layer.Grid"></a>OpenLayers.<span class=HB> </span>Layer.Grid</h3><div class=CBody><p>Create a new grid layer</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>para [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Deconstruct the layer and clear the grid.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.clearGrid"></a>clearGrid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearGrid:function()</td></tr></table></blockquote><p>Go through and remove all tiles from the grid, calling destroy() on each of them to kill circular references</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Parame [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PAfterP [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.setTileSize"></a>setTileSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setTileSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Check if we are in singleTile mode and  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.getGridBounds"></a>getGridBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getGridBounds: function()</td></tr></table></blockquote><p>Deprecated.  This function will be removed in 3.0.  Please use getTilesBounds() instead.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.getTilesBounds"></a>getTilesBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getTilesBounds: function()</td></tr></table></blockquote><p>Return the bounds of the tile grid.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link31 onMouseOver="ShowTip(event, 'tt25', 'link31')" onMouse [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.initSingleTile"></a>initSingleTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initSingleTile: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.calculateGridLayout"></a>calculateGridLayout</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateGridLayout: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParameter no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.initGriddedTiles"></a>initGriddedTiles</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initGriddedTiles:function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.getMaxExtent"></a>getMaxExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMaxExtent: function()</td></tr></table></blockquote><p>Get this layer’s maximum extent.  (Implemented as a getter for potential specific implementations in sub-classes.)</p><h4 class=CHeading>Returns</h4><p>{OpenLayers.Bounds}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.spiralTileLoad"></a>spiralTileLoad</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>spiralTileLoad: function()</td></tr></table></blockquote><p>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.</p><p>Once all the grid’s tiles have been added to the qu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bloc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.addTileMonitoringHooks"></a>addTileMonitoringHooks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTileMonitoringHooks: function(</td><td class=PParameter nowrap>tile</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This f [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.removeTileMonitoringHooks"></a>removeTileMonitoringHooks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeTileMonitoringHooks: function(</td><td class=PParameter nowrap>tile</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.moveGriddedTiles"></a>moveGriddedTiles</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveGriddedTiles: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parame [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.shiftRow"></a>shiftRow</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>shiftRow:function(</td><td class=PParameter nowrap>prepend</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Shifty grid work</p><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.shiftColumn"></a>shiftColumn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>shiftColumn: function(</td><td class=PParameter nowrap>prepend</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Shift grid work in the other dimensi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.removeExcessTiles"></a>removeExcessTiles</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeExcessTiles: function(</td><td class=PParameter nowrap>rows,</td></tr><tr><td></td><td class=PParameter nowrap>columns</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote><p>For singleTile layers, this will set a new tile size according to the dimensions of the map pane.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Grid.getTileBounds"></a>getTileBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getTileBounds: function(</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns The tile bounds for [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CClass>This is a class designed to designate a single tile, however it is explicitly designed to do relatively little. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Deconstruct the layer and cle [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/HTTPRequest-js.html b/doc/devdocs/files/OpenLayers/Layer/HTTPRequest-js.html
new file mode 100644
index 0000000..8e95971
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/HTTPRequest-js.html
@@ -0,0 +1,71 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.HTTPRequest - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.HTTPRequest"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>HTTPRequest</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.URL_HASH_FACTOR"></a>URL_HASH_FACTOR</h3><div class=CBody><p>{Float} Used to hash URL param strings for multi-WMS server selection.  Set to the Golden Ratio per Knuth’s recommendation.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.url"></a>url</h3><div class=CBody><p>{Array(String) or String} This is either an array of url strings or a single url string.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.params"></a>params</h3><div class=CBody><p>{Object} Hashtable of key/value parameters</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.reproject"></a>reproject</h3><div class=CBody><p><b>Deprecated</b>.  See <a href="http://trac.openlayers.org/wiki/SpatialMercator" class=LURL target=_top>http://trac.openlayers.org/wiki/SpatialMercator</a> for information on the replacement for this functionality.  {Boolean} Whether layer should reproject itself based on base layer locations.  This allows reprojection onto comme [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.OpenLayers.Layer.HTTPRequest"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>HTTPRequest</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{Array(String) or String}</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.setUrl"></a>setUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setUrl: function(</td><td class=PParameter nowrap>newUrl</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>redraw: function(</td><td class=PParameter nowrap>force</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Redraws the layer.   Returns true if the  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.selectUrl"></a>selectUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>selectUrl: function(</td><td class=PParameter nowrap>paramString,</td></tr><tr><td></td><td class=PParameter nowrap>urls</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.HTTPRequest.getFullRequestString"></a>getFullRequestString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFullRequestString:function(</td><td class=PParameter nowrap>newParams,</td></tr><tr><td></td><td class=PParameter nowrap>altUrl</td><td class=PAfterParameters now [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters no [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Image-js.html b/doc/devdocs/files/OpenLayers/Layer/Image-js.html
new file mode 100644
index 0000000..534f3f2
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Image-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Image - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Image"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Image</h1><div class=CBody><p>Instances of OpenLayers.Layer.Image are used to display data from a web accessible image as a map layer.   Create a new image layer with the <a href="#OpenLayers.Layer.Image.OpenLayers.Layer.Image" class=LConstructor id=link13 onMouseOver="ShowTip(event, 'tt12', 'link13')" [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} The layer is a base layer.   Default is true.   Set this property in the layer options</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.url"></a>url</h3><div class=CBody><p>{String} URL of the image to use</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.extent"></a>extent</h3><div class=CBody><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">OpenLayers.Bounds</a>} The image bounds in map units.   This extent will also be used as the default maxExtent for the layer.   If you wish to have a maxExtent that is different than the image ex [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.size"></a>size</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt2', 'link15')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} The image size in pixels</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.tile"></a>tile</h3><div class=CBody><p>{<a href="../Tile/Image-js.html#OpenLayers.Tile.Image" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt3', 'link16')" onMouseOut="HideTip('tt3')">OpenLayers.Tile.Image</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.aspectRatio"></a>aspectRatio</h3><div class=CBody><p>{Float} The ratio of height/width represented by a single pixel in the graphic</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.OpenLayers.Layer.Image"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Image</h3><div class=CBody><p>Create a new image layer</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer.</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescript [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Paramt [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PAfter [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.addTileMonitoringHooks"></a>addTileMonitoringHooks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTileMonitoringHooks: function(</td><td class=PParameter nowrap>tile</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.removeTileMonitoringHooks"></a>removeTileMonitoringHooks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeTileMonitoringHooks: function(</td><td class=PParameter nowrap>tile</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.setUrl"></a>setUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setUrl: function(</td><td class=PParameter nowrap>newUrl</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cell [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Image.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>The url we return is always the same (the image its [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of OpenLayers.Tile.Image are used to manage the image tiles used by various layers. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Protot [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/KaMap-js.html b/doc/devdocs/files/OpenLayers/Layer/KaMap-js.html
new file mode 100644
index 0000000..557a2dd
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/KaMap-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.KaMap - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.KaMap"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMap</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">OpenLayers.Layer.Grid</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>S [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} KaMap Layer is always a base layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.units"></a>units</h3><div class=CBody><p>{?}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.resolution"></a>resolution</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} parameters set by default.  The default parameters set the format via the ‘i’ parameter to ‘jpeg’.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.OpenLayers.Layer.KaMap"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMap</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>params</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.calculateGridLayout"></a>calculateGridLayout</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateGridLayout: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParameter n [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspaci [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMap.getTileBounds"></a>getTileBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getTileBounds: function(</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns The tile bounds fo [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/KaMapCache-js.html b/doc/devdocs/files/OpenLayers/Layer/KaMapCache-js.html
new file mode 100644
index 0000000..d0101c2
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/KaMapCache-js.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.KaMapCache - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.KaMapCache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMapCache</h1><div class=CBody><p>This class is designed to talk directly to a web-accessible ka-Map cache generated by the precache2.php script.</p><p>To create a a new KaMapCache layer, you must indicate also the “i” parameter (that will be used to calculate the file extension), and anot [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.IMAGE_EXTENSIONS"></a>IMAGE_EXTENSIONS</h3><div class=CBody><p>{Object} Simple hash map to convert format to extension.</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.DEFAULT_FORMAT"></a>DEFAULT_FORMAT</h3><div class=CBody><p>{Object} Simple hash map to convert format to extension.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.OpenLayers.Layer.KaMapCache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMapCache</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CD [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.KaMapCache.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border= [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CClass>Base class for layers that use a lattice of tiles. </div></div><div class= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/MapGuide-js.html b/doc/devdocs/files/OpenLayers/Layer/MapGuide-js.html
new file mode 100644
index 0000000..dcad78d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/MapGuide-js.html
@@ -0,0 +1,85 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.MapGuide - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.MapGuide"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapGuide</h1><div class=CBody><p>Instances of OpenLayers.Layer.MapGuide are used to display data from a MapGuide OS instance.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Treat this layer as a base layer.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.useHttpTile"></a>useHttpTile</h3><div class=CBody><p>{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 <a href="http://trac.osgeo.or [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.singleTile"></a>singleTile</h3><div class=CBody><p>{Boolean} use tile server or request single tile image.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.useOverlay"></a>useOverlay</h3><div class=CBody><p>{Boolean} flag to indicate if the layer should be retrieved using GETMAPIMAGE (default) or using GETDYNAMICOVERLAY requests.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.useAsyncOverlay"></a>useAsyncOverlay</h3><div class=CBody><p>{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 the map and offers styling options.</p><p>With olde [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.TILE_PARAMS"></a>TILE_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs for tiled layer</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.SINGLE_TILE_PARAMS"></a>SINGLE_TILE_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs for untiled layer</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.OVERLAY_PARAMS"></a>OVERLAY_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs for untiled layer</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.FOLDER_PARAMS"></a>FOLDER_PARAMS</h3><div class=CBody><p>{Object} Hashtable of parameter key/value pairs which describe the folder structure for tiles as configured in the mapguide serverconfig.ini section [TileServiceProperties]</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.defaultSize"></a>defaultSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Tile size as produced by MapGuide server</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.OpenLayers.Layer.MapGuide"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapGuide</h3><div class=CBody><p>Create a new Mapguide layer, either tiled or untiled.</p><p>For tiled layers, the ‘groupName’ and ‘mapDefinition’ values must be specified as parameters in the constructor.</p><p>For untiled base layers, specify either combination of ‘mapN [...]
+
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.MapGuide_OS_uses_a_DPI_value_and_degrees_to_meters_conversion"></a>MapGuide OS uses a DPI value and degrees to meters conversion</h3><div class=CBody><p>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.</p><h4 class=CHeading>Parameters</h4><table border=0 ce [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Re [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a query string for this layer</p><h4 cla [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.getFullRequestString"></a>getFullRequestString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFullRequestString:function(</td><td class=PParameter nowrap>newParams,</td></tr><tr><td></td><td class=PParameter nowrap>altUrl</td><td class=PAfterParameters nowrap [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.getImageFilePath"></a>getImageFilePath</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getImageFilePath:function(</td><td class=PParameter nowrap>newParams,</td></tr><tr><td></td><td class=PParameter nowrap>altUrl</td><td class=PAfterParameters nowrap>)</td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapGuide.calculateGridLayout"></a>calculateGridLayout</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateGridLayout: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParamete [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a clone of this la [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/MapServer-js.html b/doc/devdocs/files/OpenLayers/Layer/MapServer-js.html
new file mode 100644
index 0000000..82bf0e7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/MapServer-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.MapServer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.MapServer"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer</h1><div class=CBody><p>Instances of OpenLayers.Layer.MapServer are used to display data from a MapServer CGI instance.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="Hi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.OpenLayers.Layer.MapServer"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer</h3><div class=CBody><p>Create a new MapServer layer object</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>R [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a query string for this layer</p><h4 cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.getFullRequestString"></a>getFullRequestString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFullRequestString:function(</td><td class=PParameter nowrap>newParams,</td></tr><tr><td></td><td class=PParameter nowrap>altUrl</td><td class=PAfterParameters nowra [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a clone of this layer</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/MapServer/Untiled-js.html b/doc/devdocs/files/OpenLayers/Layer/MapServer/Untiled-js.html
new file mode 100644
index 0000000..68ba438
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/MapServer/Untiled-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.MapServer.Untiled - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer.<span class=HB> </span>Untiled</h1><div class=CBody><p><b>Deprecated</b>.   To be removed in 3.0.   Instead use OpenLayers.Layer.MapServer and pass the option ‘singleTile’ as true.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../MapServer-js.html#OpenL [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.singleTile"></a>singleTile</h3><div class=CBody><p>{singleTile} Always true for untiled.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.OpenLayers.Layer.MapServer.Untiled"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer.<span class=HB> </span>Untiled</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDe [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MapServer.Untiled.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CH [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a clone of this layer</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.MapServer are used t [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Markers-js.html b/doc/devdocs/files/OpenLayers/Layer/Markers-js.html
new file mode 100644
index 0000000..f59f29a
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Markers-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Markers - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Markers"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Markers</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=ST [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Markers layer is never a base layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.markers"></a>markers</h3><div class=CBody><p>{Array(<a href="../Marker-js.html#OpenLayers.Marker" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt1', 'link10')" onMouseOut="HideTip('tt1')">OpenLayers.Marker</a>)} internal marker list</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.drawn"></a>drawn</h3><div class=CBody><p>{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 <b>never</b> drawn the layer, and draw it even if the zoom hasn’t changed.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.OpenLayers.Layer.Markers"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Markers</h3><div class=CBody><p>Create a Markers layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the opacity for all the markers [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PAft [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.addMarker"></a>addMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.removeMarker"></a>removeMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.clearMarkers"></a>clearMarkers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearMarkers: function()</td></tr></table></blockquote><p>This method removes all markers from a layer.  The markers are not destroyed by this function, but are removed from the list of markers.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.drawMarker"></a>drawMarker</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawMarker: function(</td><td class=PParameter nowrap>marker</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calculate the pixel location for the  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Markers.getDataExtent"></a>getDataExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getDataExtent: function ()</td></tr></table></blockquote><p>Calculates the max extent which includes all of the markers.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link15 onMouseOver="ShowTip(event,  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Marker are a combination of a OpenLayers.LonLat and an OpenLayers.Icon.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/MultiMap-js.html b/doc/devdocs/files/OpenLayers/Layer/MultiMap-js.html
new file mode 100644
index 0000000..df474da
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/MultiMap-js.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.MultiMap - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.MultiMap"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MultiMap</h1><div class=CBody><p>Note that MultiMap does not fully support the sphericalMercator option.  See Ticket #953 for more details.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="EventPane-js.html#OpenLayers.Layer.EventPane" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt14' [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.MIN_ZOOM_LEVEL"></a>MIN_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 1</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.MAX_ZOOM_LEVEL"></a>MAX_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 17</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.RESOLUTIONS"></a>RESOLUTIONS</h3><div class=CBody><p>{Array(Float)} Hardcode these resolutions so that they are more closely tied with the standard wms projection</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.type"></a>type</h3><div class=CBody><p>{?}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.OpenLayers.Layer.MultiMap"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MultiMap</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></di [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.loadMapObject"></a>loadMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectCenter"></a>getMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectCenter: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} The mapObject’s current center in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectZoom"></a>getMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectZoom: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The mapObject’s current zoom, in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getLongitudeFromMapObjectLonLat"></a>getLongitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLongitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getLatitudeFromMapObjectLonLat"></a>getLatitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLatitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterP [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getXFromMapObjectPixel"></a>getXFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getXFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getYFromMapObjectPixel"></a>getYFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getYFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.MultiMap.getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote>{String} String with information on why layer is broken, how to get it working.</div></div><div class=CToolTi [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/PointTrack-js.html b/doc/devdocs/files/OpenLayers/Layer/PointTrack-js.html
new file mode 100644
index 0000000..3370108
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/PointTrack-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.PointTrack - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.PointTrack"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>PointTrack</h1><div class=CBody><p>Vector layer to display ordered point features as a line, creating one LineString feature for each pair of two points.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link2 onMouseOver="ShowTip(event, 't [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.OpenLayers.PointTrack"></a>OpenLayers.<span class=HB> </span>PointTrack</h3><div class=CBody><p>Constructor for a new OpenLayers.PointTrack instance.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} name of the layer</td></tr><tr><td class=CDLEntry>options</td><td class=CD [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.addNodes"></a>addNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addNodes: function(</td><td class=PParameter nowrap>pointFeatures</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Adds point features that will be  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.PointTrack.OpenLayers.Layer.PointTrack.dataFrom"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>PointTrack.<span class=HB> </span>dataFrom</h3><div class=CBody><p>{Object} with the following keys</p><ul><li>SOURCE_NODE: take data/attributes from the source node of the line</li><li>TARGET_NODE: take data/attributes from the target node of the line</li></ul></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addNodes: function(</td><td class=PParameter nowrap>pointFeatures</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Adds point features that will be used to create lines from, using point pairs. </div></div><div class=CToolTip id="tt2"><div  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/SphericalMercator-js.html b/doc/devdocs/files/OpenLayers/Layer/SphericalMercator-js.html
new file mode 100644
index 0000000..f136f2b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/SphericalMercator-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.SphericalMercator - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.SphericalMercator"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>SphericalMercator</h1><div class=CBody><p>A mixin for layers that wraps up the pieces neccesary to have a coordinate conversion for working with commercial APIs which use a spherical mercator projection.   Using this layer as a base layer, additional layers can be used as overlays if they a [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.getExtent"></a>getExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function()</td></tr></table></blockquote><p>Get the map’s extent.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt9', 'link9')" onMouseOut="HideTip( [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.getLonLatFromViewPortPx"></a>getLonLatFromViewPortPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromViewPortPx: function (</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.getViewPortPxFromLonLat"></a>getViewPortPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getViewPortPxFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.initMercatorParameters"></a>initMercatorParameters</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initMercatorParameters: function()</td></tr></table></blockquote><p>Set up the mercator parameters on the layer: resolutions, projection, units.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.forwardMercator"></a>forwardMercator</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>forwardMercator: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.inverseMercator"></a>inverseMercator</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>inverseMercator: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.projectForward"></a>projectForward</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>projectForward: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given an object  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.projectInverse"></a>projectInverse</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>projectInverse: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given an object  [...]
+
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.SphericalMercator.Two_transforms_declared"></a>Two transforms declared</h3><div class=CBody><p>Transforms from EPSG:4326 to EPSG:900913 and from EPSG:900913 to EPSG:4326 are set by this class.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function()</td></tr></table></blockquote>Get the map’s extent.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromViewPortPx: function (</td><td class=PParamet [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/TMS-js.html b/doc/devdocs/files/OpenLayers/Layer/TMS-js.html
new file mode 100644
index 0000000..0a38a30
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/TMS-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.TMS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.TMS"></a>OpenLayers.<span class=HB> </span>Layer.TMS</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">OpenLayers.Layer.Grid</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBor [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.serviceVersion"></a>serviceVersion</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.tileOrigin"></a>tileOrigin</h3><div class=CBody><p>{<a href="../BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Pixel</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.serverResolutions"></a>serverResolutions</h3><div class=CBody><p>{Array} A list of all resolutions available on the server.   Only set this property if the map resolutions differs from the server.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.zoomOffset"></a>zoomOffset</h3><div class=CBody><p>{Number} If your cache has more zoom levels than you want to provide access to with this layer, supply a zoomOffset.   This zoom offset is added to the current map zoom level to determine the level for a requested tile.   For example, if you supply a zoomOffset of 3, when the map is at the zoom 0, tiles will be requested from level 3 of your [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.OpenLayers.Layer.TMS"></a>OpenLayers.<span class=HB> </span>Layer.TMS</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cells [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TMS.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When the layer is added to a map, then we can fetch our  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Text-js.html b/doc/devdocs/files/OpenLayers/Layer/Text-js.html
new file mode 100644
index 0000000..adfaef1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Text-js.html
@@ -0,0 +1,68 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Text - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Text"></a>OpenLayers.<span class=HB> </span>Layer.Text</h1><div class=CBody><p>This layer creates markers given data in a text file.   The <a href="#OpenLayers.Layer.Text.location" class=LProperty id=link8 onMouseOver="ShowTip(event, 'tt7', 'link8')" onMouseOut="HideTip('tt7')">location</a> property of the layer (specified as a property of the options argument in the <a href [...]
+10   20  title   description 21,25       -10,-25     http://www.openlayers.org/dev/img/marker.png</pre></blockquote><h4 class=CHeading>Inherits from</h4><ul><li><a href="Markers-js.html#OpenLayers.Layer.Markers" class=LClass >OpenLayers.Layer.Markers</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Layer.Text" >OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.location"></a>location</h3><div class=CBody><p>{String} URL of text file.   Must be specified in the “options” argument of the constructor.  Can not be changed once passed in.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.features"></a>features</h3><div class=CBody><p>{Array(<a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt1', 'link10')" onMouseOut="HideTip('tt1')">OpenLayers.Feature</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Hash of options which should be passed to the format when it is created.  Must be passed in the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.selectedFeature"></a>selectedFeature</h3><div class=CBody><p>{<a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Feature</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.OpenLayers.Layer.Text"></a>OpenLayers.<span class=HB> </span>Layer.Text</h3><div class=CBody><p>Create a text layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Object with properties to be set on [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.loadText"></a>loadText</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadText: function()</td></tr></table></blockquote><p>Start the load of the Text data.  Don’t do this when we first add the layer, since we may not be visible at any point, and it would therefore be a waste.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>minor</td><td class=PAfterPara [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.parseData"></a>parseData</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseData: function(</td><td class=PParameter nowrap>ajaxRequest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.markerClick"></a>markerClick</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>evt</td><td class=CDLDescription>{Event}</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Text.clearFeatures"></a>clearFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearFeatures: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Features are combinations of geography and attributes. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadText: function()</td></tr></table></blockquote>Start [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/TileCache-js.html b/doc/devdocs/files/OpenLayers/Layer/TileCache-js.html
new file mode 100644
index 0000000..682b629
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/TileCache-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.TileCache - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.TileCache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>TileCache</h1><div class=CBody><p>A read only TileCache layer.   Used to requests tiles cached by TileCache in a web accessible cache.   This means that you have to pre-populate your cache before this layer can be used.   It is meant only to read tiles created by TileCache, and not to mak [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Treat this layer as a base layer.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.format"></a>format</h3><div class=CBody><p>{String} Mime type of the images returned.   Default is image/png.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.serverResolutions"></a>serverResolutions</h3><div class=CBody><p>{Array} A list of all resolutions available on the server.   Only set this property if the map resolutions differs from the server.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.OpenLayers.Layer.TileCache"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>TileCache</h3><div class=CBody><p>Create a new read only TileCache layer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} Name of the layer displayed in the interface</td></tr><t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDesc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.TileCache.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Vector-js.html b/doc/devdocs/files/OpenLayers/Layer/Vector-js.html
new file mode 100644
index 0000000..502493f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Vector-js.html
@@ -0,0 +1,135 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Vector - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Vector"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Vector</h1><div class=CBody><p>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources.  Create a new vector layer with the <a href="#OpenLayers.Layer.Vector.OpenLayers.Layer.Vector" class=LConstructor id=link31 onMouseOver="ShowTip(event, 'tt7', 'link31')" onMous [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>layer.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.</p> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} The layer is a base layer.   Default is false.   Set this property in the layer options.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.isFixed"></a>isFixed</h3><div class=CBody><p>{Boolean} Whether the layer remains in one place while dragging the map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.isVector"></a>isVector</h3><div class=CBody><p>{Boolean} Whether the layer is a vector layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.features"></a>features</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link32 onMouseOver="ShowTip(event, 'tt1', 'link32')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.filter"></a>filter</h3><div class=CBody><p>{<a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link33 onMouseOver="ShowTip(event, 'tt2', 'link33')" onMouseOut="HideTip('tt2')">OpenLayers.Filter</a>} The filter set in this layer, a strategy launching read requests can combined this filter with its own filter.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.selectedFeatures"></a>selectedFeatures</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link34 onMouseOver="ShowTip(event, 'tt1', 'link34')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.unrenderedFeatures"></a>unrenderedFeatures</h3><div class=CBody><p>{Object} hash of features, keyed by feature.id, that the renderer failed to draw</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.reportError"></a>reportError</h3><div class=CBody><p>{Boolean} report friendly error message when loading of renderer fails.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.style"></a>style</h3><div class=CBody><p>{Object} Default style for the layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.styleMap"></a>styleMap</h3><div class=CBody><p>{<a href="../StyleMap-js.html#OpenLayers.StyleMap" class=LClass >OpenLayers.StyleMap</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.strategies"></a>strategies</h3><div class=CBody><p>{Array(<a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link35 onMouseOver="ShowTip(event, 'tt3', 'link35')" onMouseOut="HideTip('tt3')">OpenLayers.Strategy</a>})} Optional list of strategies for the layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.protocol"></a>protocol</h3><div class=CBody><p>{<a href="../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link36 onMouseOver="ShowTip(event, 'tt4', 'link36')" onMouseOut="HideTip('tt4')">OpenLayers.Protocol</a>} Optional protocol for the layer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.renderers"></a>renderers</h3><div class=CBody><p>{Array(String)} List of supported Renderer classes.  Add to this list to add support for additional renderers.  This list is ordered: the first renderer which returns true for the  ‘supported()’ method will be used, if not defined in the ‘renderer’ option.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.renderer"></a>renderer</h3><div class=CBody><p>{<a href="../Renderer-js.html#OpenLayers.Renderer" class=LClass id=link37 onMouseOver="ShowTip(event, 'tt5', 'link37')" onMouseOut="HideTip('tt5')">OpenLayers.Renderer</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.rendererOptions"></a>rendererOptions</h3><div class=CBody><p>{Object} Options for the renderer.  See {<a href="../Renderer-js.html#OpenLayers.Renderer" class=LClass id=link38 onMouseOver="ShowTip(event, 'tt5', 'link38')" onMouseOut="HideTip('tt5')">OpenLayers.Renderer</a>} for supported options.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.geometryType"></a>geometryType</h3><div class=CBody><p>{String} geometryType allows you to limit the types of geometries this layer supports.  This should be set to something like “OpenLayers.Geometry.Point” to limit types.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.drawn"></a>drawn</h3><div class=CBody><p>{Boolean} Whether the Vector Layer features have been drawn yet.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.OpenLayers.Layer.Vector"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Vector</h3><div class=CBody><p>Create a new vector layer</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>options</td><td class=CDLD [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.clone"></a>clone</h3><div class=CBody><p>Create a clone of this layer.</p></div></div></div>
+
+<div class="CGeneric"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.Features_of_the_layer_are_also_cloned"></a>Features of the layer are also cloned.</h3><div class=CBody><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Layer.Vector.OpenLayers.Layer.Vector" class=LConstructor id=link40 onMouseOver="ShowTip(event, 'tt7', 'link40')" onMouseOut="HideTip('tt7')">OpenLayers.Layer.Vector</a>} An exact clone of this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.refresh"></a>refresh</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>refresh: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Ask the layer to request features again and redraw [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.assignRenderer"></a>assignRenderer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>assignRenderer: function()</td></tr></table></blockquote><p>Iterates through the available renderer implementations and selects and assigns the first one whose “supported()” function returns true.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.displayError"></a>displayError</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>displayError: function()</td></tr></table></blockquote><p>Let the user know their browser isn’t supported.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>The layer has been added to the map.</p><p>If there i [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.afterAdd"></a>afterAdd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>afterAdd: function()</td></tr></table></blockquote><p>Called at the end of the map.addLayer sequence.   At this point, the map will have a base layer.   Any autoActivate strategies will be activated here.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.removeMap"></a>removeMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>The layer has been removed from the map.</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote><p>Notify the renderer of the change in size.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PAft [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>display</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the Layer</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.addFeatures"></a>addFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addFeatures: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.removeFeatures"></a>removeFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeFeatures: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.removeAllFeatures"></a>removeAllFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeAllFeatures: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove all featu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.destroyFeatures"></a>destroyFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>destroyFeatures: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.drawFeature"></a>drawFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawFeature: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.eraseFeatures"></a>eraseFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>eraseFeatures: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Erase features from the lay [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getFeatureFromEvent"></a>getFeatureFromEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureFromEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given an event [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getFeatureBy"></a>getFeatureBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureBy: function(</td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>value</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getFeatureById"></a>getFeatureById</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureById: function(</td><td class=PParameter nowrap>featureId</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a feature id, ret [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getFeatureByFid"></a>getFeatureByFid</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureByFid: function(</td><td class=PParameter nowrap>featureFid</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a feature fid [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.onFeatureInsert"></a>onFeatureInsert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onFeatureInsert: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>method called after a  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.preFeatureInsert"></a>preFeatureInsert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>preFeatureInsert: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>method called befor [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.getDataExtent"></a>getDataExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getDataExtent: function ()</td></tr></table></blockquote><p>Calculates the max extent which includes all of the features.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link55 onMouseOver="ShowTip(event,  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents an OGC Filter.</div></div><div class=CToolTip id="tt3"><div class=CClass>Abstract vector layer strategy class. </div></div><div class=CToolTip id="tt4"><div class=CClass>Abstract vector layer protocol class. </div></div><div class=CToolTip id="tt5"><div class=CClass>This is the base cla [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Vector/RootContainer-js.html b/doc/devdocs/files/OpenLayers/Layer/Vector/RootContainer-js.html
new file mode 100644
index 0000000..63e4c1e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Vector/RootContainer-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Vector.RootContainer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Vector.<span class=HB> </span>RootContainer</h1><div class=CBody><p>A special layer type to combine multiple vector layers inside a single renderer root container.  This class is not supposed to be instantiated from user space, it is a helper class for controls that require event process [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.displayInLayerSwitcher"></a>displayInLayerSwitcher</h3><div class=CBody><p>Set to false for this layer type</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.layers"></a>layers</h3><div class=CBody><p>Layers that are attached to this container.  Required config option.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.OpenLayers.Layer.Vector.RootContainer"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Vector.<span class=HB> </span>RootContainer</h3><div class=CBody><p>Create a new root container for multiple vector layer.  This constructor is not supposed to be used from user space, it is only to be used by controls that need feature selection across multiple vector lay [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>display: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.getFeatureFromEvent"></a>getFeatureFromEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureFromEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.removeMap"></a>removeMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.collectRoots"></a>collectRoots</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>collectRoots: function()</td></tr></table></blockquote><p>Collects the root nodes of all layers this control is configured with and moveswien the nodes to this control’s layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.resetRoots"></a>resetRoots</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>resetRoots: function()</td></tr></table></blockquote><p>Resets the root nodes back into the layers they belong to.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Vector.RootContainer.handleChangeLayer"></a>handleChangeLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleChangeLayer: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Event  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>display: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureFromEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfter [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/VirtualEarth-js.html b/doc/devdocs/files/OpenLayers/Layer/VirtualEarth-js.html
new file mode 100644
index 0000000..03ffe5a
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/VirtualEarth-js.html
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.VirtualEarth - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.VirtualEarth"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>VirtualEarth</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="EventPane-js.html#OpenLayers.Layer.EventPane" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt16', 'link16')" onMouseOut="HideTip('tt16')">OpenLayers.Layer.EventPane</a></li><li><a href="FixedZoomLevels-js.h [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.MIN_ZOOM_LEVEL"></a>MIN_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 1</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.MAX_ZOOM_LEVEL"></a>MAX_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 19</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.RESOLUTIONS"></a>RESOLUTIONS</h3><div class=CBody><p>{Array(Float)} Hardcode these resolutions so that they are more closely tied with the standard wms projection</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.type"></a>type</h3><div class=CBody><p>{VEMapType}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><p>{Boolean} Allow user to pan forever east/west.   Default is true.  Setting this to false only restricts panning if <a href="#OpenLayers.Layer.VirtualEarth.sphericalMercator" class=LProperty id=link18 onMouseOver="ShowTip(event, 'tt18', 'link18')" onMouseOut="HideTip('tt18')">sphericalMercator</a> is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.sphericalMercator"></a>sphericalMercator</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.animationEnabled"></a>animationEnabled</h3><div class=CBody><p>{Boolean} If set to true, the transition between zoom levels will be animated.  Set to false to match the zooming experience of other layer types.  Default is true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.OpenLayers.Layer.VirtualEarth"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>VirtualEarth</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></tabl [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.loadMapObject"></a>loadMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectCenter"></a>getMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectCenter: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} The mapObject’s current center in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.dragPanMapObject"></a>dragPanMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragPanMapObject: function(</td><td class=PParameter nowrap>dX,</td></tr><tr><td></td><td class=PParameter nowrap>dY</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectZoom"></a>getMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectZoom: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The mapObject’s current zoom, in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getLongitudeFromMapObjectLonLat"></a>getLongitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLongitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getLatitudeFromMapObjectLonLat"></a>getLatitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLatitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAf [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getXFromMapObjectPixel"></a>getXFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getXFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getYFromMapObjectPixel"></a>getYFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getYFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.VirtualEarth.getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowra [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpad [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/WFS-js.html b/doc/devdocs/files/OpenLayers/Layer/WFS-js.html
new file mode 100644
index 0000000..5ccdf03
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/WFS-js.html
@@ -0,0 +1,103 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WFS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WFS"></a>OpenLayers.<span class=HB> </span>Layer.WFS</h1><div class=CBody><p><b>Deprecated</b>.   To be removed in 3.0.   Instead use OpenLayers.Layer.Vector with a Protocol.WFS and one or more Strategies.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt21', 'link22')" [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} WFS layer is not a base layer by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.tile"></a>tile</h3><div class=CBody><p>{<a href="../Tile/WFS-js.html#OpenLayers.Tile.WFS" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt1', 'link23')" onMouseOut="HideTip('tt1')">OpenLayers.Tile.WFS</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.ratio"></a>ratio</h3><div class=CBody><p>{Float} The ratio property determines the size of the serverside query relative to the map viewport size.  By default, we load an area twice as big as the map, to allow for panning without immediately reload.  Setting this to 1 will cause the area of the WFS request to match the map area exactly.  It is recommended to set this to some number at l [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default key/value parameters</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.featureClass"></a>featureClass</h3><div class=CBody><p>{<a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link24 onMouseOver="ShowTip(event, 'tt2', 'link24')" onMouseOut="HideTip('tt2')">OpenLayers.Feature</a>} If featureClass is defined, an old-style markers based WFS layer is created instead of a new-style vector layer.  If sent, this should be a subclass of OpenLayers.Feature</p> [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.format"></a>format</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link25 onMouseOver="ShowTip(event, 'tt3', 'link25')" onMouseOut="HideTip('tt3')">OpenLayers.Format</a>} The format you want the data to be parsed with.  Must be passed in the constructor.  Should be a class, not an instance.  This option can only be used if no featureClass is passed [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.formatObject"></a>formatObject</h3><div class=CBody><p>{<a href="../Format-js.html#OpenLayers.Format" class=LClass id=link26 onMouseOver="ShowTip(event, 'tt3', 'link26')" onMouseOut="HideTip('tt3')">OpenLayers.Format</a>} Internally created/managed format object, used by the Tile to parse data.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Hash of options which should be passed to the format when it is created.  Must be passed in the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.vectorMode"></a>vectorMode</h3><div class=CBody><p>{Boolean} Should be calculated automatically.  Determines whether the layer is in vector mode or marker mode.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.encodeBBOX"></a>encodeBBOX</h3><div class=CBody><p>{Boolean} Should the BBOX commas be encoded?  The WMS spec says ‘no’, but some services want it that way.  Default false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.extractAttributes"></a>extractAttributes</h3><div class=CBody><p>{Boolean} Should the WFS layer parse attributes from the retrieved GML?  Defaults to false.  If enabled, parsing is slower, but attributes are available in the attributes property of layer features.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.OpenLayers.Layer.WFS"></a>OpenLayers.<span class=HB> </span>Layer.WFS</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>params</td><td class=CDLDescription>{ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspaci [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PAfterPa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.addTileMonitoringHooks"></a>addTileMonitoringHooks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTileMonitoringHooks: function(</td><td class=PParameter nowrap>tile</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This fu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.removeTileMonitoringHooks"></a>removeTileMonitoringHooks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeTileMonitoringHooks: function(</td><td class=PParameter nowrap>tile</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote><p>Call the onMapResize method of the appropriate parent class.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>display: function()</td></tr></table></blockquote><p>Call the display method of the appropriate parent class.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Modify parameters for the l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.getFullRequestString"></a>getFullRequestString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFullRequestString:function(</td><td class=PParameter nowrap>newParams,</td></tr><tr><td></td><td class=PParameter nowrap>altUrl</td><td class=PAfterParameters nowrap>)</t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>commit: function()</td></tr></table></blockquote><p>Write out the data to a WFS server.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.commitSuccess"></a>commitSuccess</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commitSuccess: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the Ajax request re [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.commitFailure"></a>commitFailure</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commitFailure: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called when the Ajax request fa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.commitReport"></a>commitReport</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commitReport: function(</td><td class=PParameter nowrap>string,</td></tr><tr><td></td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.refresh"></a>refresh</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>refresh: function()</td></tr></table></blockquote><p>Refreshes all the features of the layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.getDataExtent"></a>getDataExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getDataExtent: function ()</td></tr></table></blockquote><p>Calculates the max extent which includes all of the layer data.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link31 onMouseOver="ShowTip(event, ' [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WFS.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function (</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Call the setOpacity method of the appro [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Tile.WFS are used to manage the image tiles used by various layers. </div></div><div class=CToolTip id="tt2"><div class=CClass>Features are combinations of geography and attributes. </div></div><div class=CToolTip id="tt3"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 cl [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/WMS-js.html b/doc/devdocs/files/OpenLayers/Layer/WMS-js.html
new file mode 100644
index 0000000..f8983a9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/WMS-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WMS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WMS"></a>OpenLayers.<span class=HB> </span>Layer.WMS</h1><div class=CBody><p>Instances of OpenLayers.Layer.WMS are used to display data from OGC Web Mapping Services.  Create a new WMS layer with the <a href="#OpenLayers.Layer.WMS.OpenLayers.Layer.WMS" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.Layer.WMS</a [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.DEFAULT_PARAMS"></a>DEFAULT_PARAMS</h3><div class=CBody><p>{Object} Hashtable of default parameter key/value pairs</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.reproject"></a>reproject</h3><div class=CBody><p><b>Deprecated</b>.  See <a href="http://trac.openlayers.org/wiki/SphericalMercator" class=LURL target=_top>http://trac.openlayers.org/wiki/SphericalMercator</a> 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.   De [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} Default is true for WMS layer</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.encodeBBOX"></a>encodeBBOX</h3><div class=CBody><p>{Boolean} Should the BBOX commas be encoded?  The WMS spec says ‘no’, but some services want it that way.  Default false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.noMagic"></a>noMagic</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.yx"></a>yx</h3><div class=CBody><p>{Object} Keys in this object are EPSG codes for which the axis order is to be reversed (yx instead of xy, LatLon instead of LonLat), with true as value.  This is only relevant for WMS versions >= 1.3.0.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.OpenLayers.Layer.WMS"></a>OpenLayers.<span class=HB> </span>Layer.WMS</h3><div class=CBody><p>Create a new WMS layer object</p><h4 class=CHeading>Example</h4><blockquote><pre>var wms = new OpenLayers.Layer.WMS("NASA Global Mosaic",
+                                   "http://wms.jpl.nasa.gov/wms.cgi",
+                                   {layers: "modis,global_mosaic"});</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base url for the WMS (e.g.  <a href="http://wms.jpl.nasa.gov/wms.cgi" class=LURL target=_top>http://wms.jpl.nasa.gov/wms.cgi</a> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy this layer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Returns [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.reverseAxisOrder"></a>reverseAxisOrder</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>reverseAxisOrder: function()</td></tr></table></blockquote><p>Returns true if the axis order is reversed for the WMS version and projection of the layer.</p><h4 class=CHeading>Returns</h4><p>{Boolean} true if the axis order is reversed, false otherwise.</p></div>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Return a GetMap query string for this layer</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams:function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Catch changeParams and uppe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.getFullRequestString"></a>getFullRequestString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFullRequestString:function(</td><td class=PParameter nowrap>newParams,</td></tr><tr><td></td><td class=PParameter nowrap>altUrl</td><td class=PAfterParameters nowrap>)</t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Destroy this layer</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=P [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/WMS/Post-js.html b/doc/devdocs/files/OpenLayers/Layer/WMS/Post-js.html
new file mode 100644
index 0000000..25cfe11
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/WMS/Post-js.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WMS.Post - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WMS.Post"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WMS.Post</h1><div class=CBody><p>Instances of OpenLayers.Layer.WMS.Post are used to retrieve data from OGC Web Mapping Services via HTTP-POST (application/x-www-form-urlencoded).  Create a new WMS layer with the <a href="#OpenLayers.Layer.WMS.Post.OpenLayers.Layer.WMS.Post" class=LConstructor id=lin [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.tileClass"></a>tileClass</h3><div class=CBody><p>{Object} Class, used to create tiles.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.unsupportedBrowsers"></a>unsupportedBrowsers</h3><div class=CBody><p>{Array} Array with browsers, which should use the HTTP-GET protocol instead of HTTP-POST for fetching tiles from a WMS . Defaults to [“mozilla”, “firefox”, “opera”], because Opera is not able to show transparent images in IFrames and Firefox/Mozilla has some ugly effects of viewport-shaking wh [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.SUPPORTED_TRANSITIONS"></a>SUPPORTED_TRANSITIONS</h3><div class=CBody><p>{Array} no supported transitions for this type of layer, because it is not possible to modify the initialized tiles (iframes)</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.OpenLayers.Layer.WMS.Post"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WMS.Post</h3><div class=CBody><p>Creates a new WMS layer object.</p><h4 class=CHeading>Example</h4><blockquote><pre>var wms = new OpenLayers.Layer.WMS.Post(
+ "NASA Global Mosaic",
+ "http://wms.jpl.nasa.gov/wms.cgi",
+ {layers: "modis, global_mosaic"});</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base url for the WMS (e.g.  <a href="http://wms.jpl.nasa.gov/wms.cgi" class=LURL target=_top>http://wms.jpl.nasa.gov/wms.cgi</a>)</td></tr><tr><td class=CDLEntry [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Post.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>addTile creates a tile, initializes it and adds it as iframe to the layer [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/WMS/Untiled-js.html b/doc/devdocs/files/OpenLayers/Layer/WMS/Untiled-js.html
new file mode 100644
index 0000000..73c0e82
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/WMS/Untiled-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WMS.Untiled - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WMS.<span class=HB> </span>Untiled</h1><div class=CBody><p><b>Deprecated</b>.   To be removed in 3.0.   Instead use OpenLayers.Layer.WMS and pass the option ‘singleTile’ as true.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../WMS-js.html#OpenLayers.Layer.WMS" class=L [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.singleTile"></a>singleTile</h3><div class=CBody><p>{singleTile} Always true for untiled.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.OpenLayers.Layer.WMS.Untiled"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WMS.<span class=HB> </span>Untiled</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMS.Untiled.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a clone of this layer</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of OpenLayers.Layer.WMS are used to disp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/WMTS-js.html b/doc/devdocs/files/OpenLayers/Layer/WMTS-js.html
new file mode 100644
index 0000000..b531116
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/WMTS-js.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WMTS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WMTS"></a>OpenLayers.<span class=HB> </span>Layer.WMTS</h1><div class=CBody><p>Instances of the WMTS class allow viewing of tiles from a service that implements the OGC WMTS specification version 1.0.0.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt13', 'link13')" onMouseOut="Hide [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean} The layer will be considered a base layer.   Default is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.version"></a>version</h3><div class=CBody><p>{String} WMTS version.   Default is “1.0.0”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.requestEncoding"></a>requestEncoding</h3><div class=CBody><p>{String} Request encoding.   Can be “REST” or “KVP”.   Default is “KVP”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.url"></a>url</h3><div class=CBody><p>{String} The base URL for the WMTS service.   Must be provided.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.layer"></a>layer</h3><div class=CBody><p>{String} The layer identifier advertised by the WMTS service.   Must be provided.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.matrixSet"></a>matrixSet</h3><div class=CBody><p>{String} One of the advertised matrix set identifiers.   Must be provided.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.style"></a>style</h3><div class=CBody><p>{String} One of the advertised layer styles.   Must be provided.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.format"></a>format</h3><div class=CBody><p>{String} The image MIME type.   Default is “image/jpeg”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.tileOrigin"></a>tileOrigin</h3><div class=CBody><p>{<a href="../BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a>} The top-left corner of the tile matrix in map units.   If the tile origin for each matrix in a set is different, the <a href="#OpenLayers.Layer.WMTS.matrixIds" class=LPro [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.tileFullExtent"></a>tileFullExtent</h3><div class=CBody><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt2', 'link17')" onMouseOut="HideTip('tt2')">OpenLayers.Bounds</a>}  The full extent of the tile set.   If not supplied, the layer’s <a href="../Layer-js.html#OpenLayers.Layer.maxExtent" class=LProperty id=link18 onMouseOver [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.formatSuffix"></a>formatSuffix</h3><div class=CBody><p>{String} For REST request encoding, an image format suffix must be included in the request.   If not provided, the suffix will be derived from the <a href="#OpenLayers.Layer.WMTS.format" class=LProperty id=link19 onMouseOver="ShowTip(event, 'tt16', 'link19')" onMouseOut="HideTip('tt16')">format</a> property.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.matrixIds"></a>matrixIds</h3><div class=CBody><p>{Array} A list of tile matrix identifiers.   If not provided, the matrix identifiers will be assumed to be integers corresponding to the map zoom level.   If a list of strings is provided, each item should be the matrix identifier that corresponds to the map zoom level.  Additionally, a list of objects can be provided.   Each object [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.dimensions"></a>dimensions</h3><div class=CBody><p>{Array} For RESTful request encoding, extra dimensions may be specified.  Items in this list should be property names in the <a href="#OpenLayers.Layer.WMTS.params" class=LProperty id=link22 onMouseOver="ShowTip(event, 'tt11', 'link22')" onMouseOut="HideTip('tt11')">params</a> object.  Values of extra dimensions will be determined from the  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.params"></a>params</h3><div class=CBody><p>{Object} Extra parameters to include in tile requests.   For KVP <a href="#OpenLayers.Layer.WMTS.requestEncoding" class=LProperty id=link24 onMouseOver="ShowTip(event, 'tt18', 'link24')" onMouseOut="HideTip('tt18')">requestEncoding</a>, these properties will be encoded in the request query string.   For REST <a href="#OpenLayers.Layer.WMTS.requestE [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.zoomOffset"></a>zoomOffset</h3><div class=CBody><p>{Number} If your cache has more levels than you want to provide access to with this layer, supply a zoomOffset.   This zoom offset is added to the current map zoom level to determine the level for a requested tile.   For example, if you supply a zoomOffset of 3, when the map is at the zoom 0, tiles will be requested from level 3 of your cac [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.formatSuffixMap"></a>formatSuffixMap</h3><div class=CBody><p>{Object} a map between WMTS ‘format’ request parameter and tile image file suffix</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.matrix"></a>matrix</h3><div class=CBody><p>{Object} Matrix definition for the current map resolution.   Updated by the <a href="#OpenLayers.Layer.WMTS.updateMatrixProperties" class=LFunction id=link28 onMouseOver="ShowTip(event, 'tt4', 'link28')" onMouseOut="HideTip('tt4')">updateMatrixProperties</a> method.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.OpenLayers.Layer.WMTS"></a>OpenLayers.<span class=HB> </span>Layer.WMTS</h3><div class=CBody><p>Create a new WMTS layer.</p><h4 class=CHeading>Example</h4><blockquote><pre>var wmts = new OpenLayers.Layer.WMTS({
+    name: "My WMTS Layer",
+    url: "http://example.com/wmts",
+    layer: "layer_id",
+    style: "default",
+    matrixSet: "matrix_id"
+});</pre></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} Configuration properties for the layer.</td></tr></table><h4 class=CHeading>Required configuration properties</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} The base url for the service.   See the <a href="# [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setMap: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.updateMatrixProperties"></a>updateMatrixProperties</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateMatrixProperties: function()</td></tr></table></blockquote><p>Called when map resolution changes to update matrix related properties.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>zoomChanged,</td></tr><tr><td></td><td class=PParameter nowrap>dragging</td><td class=PAfterP [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function(</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.getMatrix"></a>getMatrix</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMatrix: function()</td></tr></table></blockquote><p>Get the appropriate matrix definition for the current map resolution.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.getTileInfo"></a>getTileInfo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getTileInfo: function(</td><td class=PParameter nowrap>loc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get tile information for a given locatio [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function(</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cells [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.mergeNewParams"></a>mergeNewParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeNewParams: function(</td><td class=PParameter nowrap>newParams</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Extend the existing layer [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WMTS.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setMap: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cell [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/WorldWind-js.html b/doc/devdocs/files/OpenLayers/Layer/WorldWind-js.html
new file mode 100644
index 0000000..98d2e23
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/WorldWind-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.WorldWind - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.WorldWind"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WorldWind</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Layer.Grid</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>WorldWind layer is a base layer by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.lzd"></a>lzd</h3><div class=CBody><p>LevelZeroTileSizeDegrees</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.zoomLevels"></a>zoomLevels</h3><div class=CBody><p>Number of zoom levels.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.OpenLayers.Layer.WorldWind"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>WorldWind</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} Name of Layer</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} Base URL</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.getZoom"></a>getZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getZoom: function ()</td></tr></table></blockquote><p>Convert map zoom to WW zoom.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.WorldWind.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/XYZ-js.html b/doc/devdocs/files/OpenLayers/Layer/XYZ-js.html
new file mode 100644
index 0000000..1eb3bba
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/XYZ-js.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.XYZ - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.XYZ"></a>OpenLayers.<span class=HB> </span>Layer.XYZ</h1><div class=CBody><p>The XYZ class is designed to make it easier for people who have tiles arranged by a standard XYZ grid.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut="HideTip('tt4')">OpenLayers.Lay [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>Default is true, as this is designed to be a base tile source.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.sphericalMecator"></a>sphericalMecator</h3><div class=CBody><p>Whether the tile extents should be set to the defaults for spherical mercator.  Useful for things like OpenStreetMap.  Default is false, except for the OSM subclass.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.zoomOffset"></a>zoomOffset</h3><div class=CBody><p>{Number} If your cache has more zoom levels than you want to provide access to with this layer, supply a zoomOffset.   This zoom offset is added to the current map zoom level to determine the level for a requested tile.   For example, if you supply a zoomOffset of 3, when the map is at the zoom 0, tiles will be requested from level 3 of your [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.OpenLayers.Layer.XYZ"></a>OpenLayers.<span class=HB> </span>Layer.XYZ</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a clone of this layer</p><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.getUrl"></a>getUrl</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>bounds</td><td class=CDLDescription>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Bounds</a>}</td></tr></table><h4 class=CH [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.XYZ.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When the layer is added to a map, then we can fetch our  [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Layer.OSM"></a>OpenLayers.<span class=HB> </span>Layer.OSM</h2><div class=CBody><p>A class to access OpenStreetMap tiles.  By default, uses the OpenStreetMap hosted tile.openstreetmap.org ‘Mapnik’ tileset.  If you wish to use tiles at home / osmarender layer instead, you can pass a layer like:</p><blockquote><pre>new OpenLayers.Layer.OSM("t at h",
+  "http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png");</pre></blockquote><p>This layer defaults to Spherical Mercator.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="#OpenLayers.Layer.XYZ" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt9', 'link10')" onMouseOut="HideTip('tt9')">OpenLayers.Layer.XYZ</a></li></ul></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a clone of this layer</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellp [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Yahoo-js.html b/doc/devdocs/files/OpenLayers/Layer/Yahoo-js.html
new file mode 100644
index 0000000..7db8605
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Yahoo-js.html
@@ -0,0 +1,101 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Yahoo - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Yahoo"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Yahoo</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="EventPane-js.html#OpenLayers.Layer.EventPane" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt21', 'link21')" onMouseOut="HideTip('tt21')">OpenLayers.Layer.EventPane</a></li><li><a href="FixedZoomLevels-js.html#OpenLayers [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.MIN_ZOOM_LEVEL"></a>MIN_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 0</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.MAX_ZOOM_LEVEL"></a>MAX_ZOOM_LEVEL</h3><div class=CBody><p>{Integer} 17</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.RESOLUTIONS"></a>RESOLUTIONS</h3><div class=CBody><p>{Array(Float)} Hardcode these resolutions so that they are more closely tied with the standard wms projection</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.type"></a>type</h3><div class=CBody><p>{YahooMapType}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.wrapDateLine"></a>wrapDateLine</h3><div class=CBody><p>{Boolean} Allow user to pan forever east/west.   Default is true.  Setting this to false only restricts panning if <a href="#OpenLayers.Layer.Yahoo.sphericalMercator" class=LProperty id=link23 onMouseOver="ShowTip(event, 'tt23', 'link23')" onMouseOut="HideTip('tt23')">sphericalMercator</a> is true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.sphericalMercator"></a>sphericalMercator</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.OpenLayers.Layer.Yahoo"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Yahoo</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.loadMapObject"></a>loadMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.onMapResize"></a>onMapResize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Overridden from EventPane because we need to remove th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.fixYahooEventPane"></a>fixYahooEventPane</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>fixYahooEventPane: function()</td></tr></table></blockquote><p>The map has been centered, so the mysterious yahoo eventpane has been added. we remove it so that it doesnt mess with <b>our</b> event pane.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getWarningHTML"></a>getWarningHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getWarningHTML:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} String with information on why layer is broken, how to get it working.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getOLZoomFromMapObjectZoom"></a>getOLZoomFromMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getOLZoomFromMapObjectZoom: function(</td><td class=PParameter nowrap>moZoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectZoomFromOLZoom"></a>getMapObjectZoomFromOLZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectZoomFromOLZoom: function(</td><td class=PParameter nowrap>olZoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.setMapObjectCenter"></a>setMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMapObjectCenter: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectCenter"></a>getMapObjectCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectCenter: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Object} The mapObject’s current center in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.dragPanMapObject"></a>dragPanMapObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dragPanMapObject: function(</td><td class=PParameter nowrap>dX,</td></tr><tr><td></td><td class=PParameter nowrap>dY</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectZoom"></a>getMapObjectZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapObjectZoom: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The mapObject’s current zoom, in Map Object format</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectLonLatFromMapObjectPixel"></a>getMapObjectLonLatFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectPixelFromMapObjectLonLat"></a>getMapObjectPixelFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getLongitudeFromMapObjectLonLat"></a>getLongitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLongitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getLatitudeFromMapObjectLonLat"></a>getLatitudeFromMapObjectLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLatitudeFromMapObjectLonLat: function(</td><td class=PParameter nowrap>moLonLat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectLonLatFromLonLat"></a>getMapObjectLonLatFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectLonLatFromLonLat: function(</td><td class=PParameter nowrap>lon,</td></tr><tr><td></td><td class=PParameter nowrap>lat</td><td class=PAfterPara [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getXFromMapObjectPixel"></a>getXFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getXFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getYFromMapObjectPixel"></a>getYFromMapObjectPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getYFromMapObjectPixel: function(</td><td class=PParameter nowrap>moPixel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectPixelFromXY"></a>getMapObjectPixelFromXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectPixelFromXY: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Yahoo.getMapObjectSizeFromOLSize"></a>getMapObjectSizeFromOLSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMapObjectSizeFromOLSize: function(</td><td class=PParameter nowrap>olSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>loadMapObject:function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onMapResize: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpad [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Layer/Zoomify-js.html b/doc/devdocs/files/OpenLayers/Layer/Zoomify-js.html
new file mode 100644
index 0000000..493bb17
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Layer/Zoomify-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Layer.Zoomify - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Layer.Zoomify"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Zoomify</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Grid-js.html#OpenLayers.Layer.Grid" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt9', 'link11')" onMouseOut="HideTip('tt9')">OpenLayers.Layer.Grid</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=ST [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.url"></a>url</h3><div class=CBody><p>{String} URL for root directory with TileGroupX subdirectories.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.size"></a>size</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt1', 'link12')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} The Zoomify image size in pixels.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.isBaseLayer"></a>isBaseLayer</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.standardTileSize"></a>standardTileSize</h3><div class=CBody><p>{Integer} The size of a standard (non-border) square tile in pixels.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.numberOfTiers"></a>numberOfTiers</h3><div class=CBody><p>{Integer} Depth of the Zoomify pyramid, number of tiers (zoom levels)</p><ul><li>filled during Zoomify pyramid initialization.</li></ul></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.tileCountUpToTier"></a>tileCountUpToTier</h3><div class=CBody><p>{Array(Integer)} Number of tiles up to the given tier of pyramid.</p><ul><li>filled during Zoomify pyramid initialization.</li></ul></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.tierSizeInTiles"></a>tierSizeInTiles</h3><div class=CBody><p>{Array(<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt1', 'link13')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>)} Size (in tiles) for each tier of pyramid.</p><ul><li>filled during Zoomify pyramid initialization.</li></ul></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.tierImageSize"></a>tierImageSize</h3><div class=CBody><p>{Array(<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>)} Image size in pixels for each pyramid tier.</p><ul><li>filled during Zoomify pyramid initialization.</li></ul></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.OpenLayers.Layer.Zoomify"></a>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Zoomify</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>name</td><td class=CDLDescription>{String} A name for the layer.</td></tr><tr><td class=CDLEntry>url</td><td class=CDLDescription>{String} - Relative o [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.initializeZoomify"></a>initializeZoomify</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initializeZoomify: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>It generates const [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.getURL"></a>getURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getURL: function (</td><td class=PParameter nowrap>bounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.getImageSize"></a>getImageSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getImageSize: function()</td></tr></table></blockquote><p>getImageSize returns size for a particular tile.  If bounds are given as first argument, size is calculated (bottom-right tiles are non square).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.addTile"></a>addTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addTile:function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.setMap"></a>setMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setMap: function(</td><td class=PParameter nowrap>map</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When the layer is added to a map, then we can fetch  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Layer.Zoomify.calculateGridLayout"></a>calculateGridLayout</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateGridLayout: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParameter [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([20, 21, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initializeZoomify: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>It generates  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Map-js.html b/doc/devdocs/files/OpenLayers/Map-js.html
new file mode 100644
index 0000000..e078307
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Map-js.html
@@ -0,0 +1,302 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Map - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Map"></a>OpenLayers.Map</h1><div class=CBody><p>Instances of OpenLayers.Map are interactive maps embedded in a web page.  Create a new map with the <a href="#OpenLayers.Map.OpenLayers.Map" class=LConstructor id=link87 onMouseOver="ShowTip(event, 'tt76', 'link87')" onMouseOut="HideTip('tt76')">OpenLayers.Map</a> constructor.</p><p>On their own maps do not provide much functionality [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Z_INDEX_BASE"></a>Z_INDEX_BASE</h3><div class=CBody><p>{Object} Base z-indexes for different classes of thing</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>map.events.register(type, obj, listener);</pre></blockquote><p>Listeners will be called with a reference to an event object.   The properties of this event depends on exactly what happened.</p><h4 class=C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.id"></a>id</h3><div class=CBody><p>{String} Unique identifier for the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.fractionalZoom"></a>fractionalZoom</h3><div class=CBody><p>{Boolean} For a base layer that supports it, allow the map resolution to be set to a value between one of the values in the resolutions array.   Default is false.</p><p>When fractionalZoom is set to true, it is possible to zoom to an arbitrary extent.   This requires a base layer from a source that supports requests for arbitrary extents ( [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} An events object that handles all events on the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.allOverlays"></a>allOverlays</h3><div class=CBody><p>{Boolean} Allow the map to function with “overlays” only.   Defaults to false.   If true, the lowest layer in the draw order will act as the base layer.   In addition, if set to true, all layers will have isBaseLayer set to false when they are added to the map.</p><h4 class=CHeading>Note</h4><p>If you set map.allOverlays to true [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.div"></a>div</h3><div class=CBody><p>{DOMElement|String} The element that contains the map (or an id for that element).   If the <a href="#OpenLayers.Map.OpenLayers.Map" class=LConstructor id=link93 onMouseOver="ShowTip(event, 'tt76', 'link93')" onMouseOut="HideTip('tt76')">OpenLayers.Map</a> constructor is called with two arguments, this should be provided as the first argument.  Alternatively, t [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.dragging"></a>dragging</h3><div class=CBody><p>{Boolean} The map is currently being dragged.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.size"></a>size</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link98 onMouseOver="ShowTip(event, 'tt1', 'link98')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Size of the main div (this.div)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.viewPortDiv"></a>viewPortDiv</h3><div class=CBody><p>{HTMLDivElement} The element that represents the map viewport</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.layerContainerOrigin"></a>layerContainerOrigin</h3><div class=CBody><p>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link99 onMouseOver="ShowTip(event, 'tt2', 'link99')" onMouseOut="HideTip('tt2')">OpenLayers.LonLat</a>} The lonlat at which the later container was re-initialized (on-zoom)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.layerContainerDiv"></a>layerContainerDiv</h3><div class=CBody><p>{HTMLDivElement} The element that contains the layers.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.layers"></a>layers</h3><div class=CBody><p>{Array(<a href="Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>)} Ordered list of layers in the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.controls"></a>controls</h3><div class=CBody><p>{Array(<a href="Control-js.html#OpenLayers.Control" class=LClass id=link100 onMouseOver="ShowTip(event, 'tt3', 'link100')" onMouseOut="HideTip('tt3')">OpenLayers.Control</a>)} List of controls associated with the map.</p><p>If not provided in the map options at construction, the map will be given the following controls by default:</p><ul><li><a href="Control/Na [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.popups"></a>popups</h3><div class=CBody><p>{Array(<a href="Popup-js.html#OpenLayers.Popup" class=LClass id=link105 onMouseOver="ShowTip(event, 'tt4', 'link105')" onMouseOut="HideTip('tt4')">OpenLayers.Popup</a>)} List of popups associated with the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.baseLayer"></a>baseLayer</h3><div class=CBody><p>{<a href="Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>} The currently selected base layer.   This determines min/max zoom level, projection, etc.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.center"></a>center</h3><div class=CBody><p>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link106 onMouseOver="ShowTip(event, 'tt2', 'link106')" onMouseOut="HideTip('tt2')">OpenLayers.LonLat</a>} The current center of the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.resolution"></a>resolution</h3><div class=CBody><p>{Float} The resolution of the map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoom"></a>zoom</h3><div class=CBody><p>{Integer} The current zoom level of the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.panRatio"></a>panRatio</h3><div class=CBody><p>{Float} The ratio of the current extent within which panning will tween.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.viewRequestID"></a>viewRequestID</h3><div class=CBody><p>{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 com [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.tileSize"></a>tileSize</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link107 onMouseOver="ShowTip(event, 'tt1', 'link107')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Set in the map options to override the default tile size for this map.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.projection"></a>projection</h3><div class=CBody><p>{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”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.units"></a>units</h3><div class=CBody><p>{String} The map units.   Defaults to ‘degrees’.   Possible values are ‘degrees’ (or ‘dd’), ‘m’, ‘ft’, ‘km’, ‘mi’, ‘inches’.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.resolutions"></a>resolutions</h3><div class=CBody><p>{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.).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.maxResolution"></a>maxResolution</h3><div class=CBody><p>{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 displaying the whole world.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.minResolution"></a>minResolution</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.maxScale"></a>maxScale</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.minScale"></a>minScale</h3><div class=CBody><p>{Float}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.maxExtent"></a>maxExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link108 onMouseOver="ShowTip(event, 'tt5', 'link108')" onMouseOut="HideTip('tt5')">OpenLayers.Bounds</a>} The maximum extent for the map.   Defaults to the whole world in decimal degrees (-180, -90, 180, 90).   Specify a different extent in the map options if you are not using a g [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.minExtent"></a>minExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link109 onMouseOver="ShowTip(event, 'tt5', 'link109')" onMouseOut="HideTip('tt5')">OpenLayers.Bounds</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.restrictedExtent"></a>restrictedExtent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link110 onMouseOver="ShowTip(event, 'tt5', 'link110')" onMouseOut="HideTip('tt5')">OpenLayers.Bounds</a>} Limit map navigation to this extent where possible.  If a non-null restrictedExtent is set, panning will be restricted to the given bounds.   In addition, zoomin [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.numZoomLevels"></a>numZoomLevels</h3><div class=CBody><p>{Integer} Number of zoom levels for the map.   Defaults to 16.   Set a different value in the map options if needed.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.theme"></a>theme</h3><div class=CBody><p>{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 stylesheets or style declarations directly in your page.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.displayProjection"></a>displayProjection</h3><div class=CBody><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link111 onMouseOver="ShowTip(event, 'tt6', 'link111')" onMouseOut="HideTip('tt6')">OpenLayers.Projection</a>} 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 dis [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.fallThrough"></a>fallThrough</h3><div class=CBody><p>{Boolean} Should OpenLayers allow events on the map to fall through to other elements on the page, or should it swallow them?  (#457) Default is to fall through.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.panTween"></a>panTween</h3><div class=CBody><p>{OpenLayers.Tween} Animated panning tween object, see panTo()</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.eventListeners"></a>eventListeners</h3><div class=CBody><p>{Object} If set as an option at construction, the eventListeners object will be registered with <a href="Events-js.html#OpenLayers.Events.on" class=LFunction id=link112 onMouseOver="ShowTip(event, 'tt7', 'link112')" onMouseOut="HideTip('tt7')">OpenLayers.Events.on</a>.   Object structure must be a listeners object as shown in the example for th [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.panMethod"></a>panMethod</h3><div class=CBody><p>{Function} The Easing function to be used for tweening.   Default is OpenLayers.Easing.Expo.easeOut.  Setting this to ‘null’ turns off animated panning.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.panDuration"></a>panDuration</h3><div class=CBody><p>{Integer} The number of steps to be passed to the OpenLayers.Tween.start() method when the map is panned.  Default is 50.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.paddingForPopups"></a>paddingForPopups</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link113 onMouseOver="ShowTip(event, 'tt5', 'link113')" onMouseOut="HideTip('tt5')">OpenLayers.Bounds</a>} Outside margin of the popup.  Used to prevent the popup from getting too close to the map border.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.OpenLayers.Map"></a>OpenLayers.Map</h3><div class=CBody><p>Constructor for a new OpenLayers.Map instance.   There are two possible ways to call the map constructor.   See the examples below.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>div</td><td class=CDLDescription>{DOMElement|String}  The element or id of an e [...]
+var map = new OpenLayers.Map("map1");
+
+// create a map with non-default options in an element with id "map2"
+var options = {
+    maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+    maxResolution: 156543,
+    units: 'm',
+    projection: "EPSG:41001"
+};
+var map = new OpenLayers.Map("map2", options);</pre></blockquote><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>Examples (method two</td><td class=CDLDescription>single argument):</td></tr></table><blockquote><pre>// create a map with non-default options
+var map = new OpenLayers.Map({
+    div: "map_id",
+    maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+    maxResolution: 156543,
+    units: 'm',
+    projection: "EPSG:41001"
+});
+
+// create a map without a reference to a container - call render later
+var map = new OpenLayers.Map({
+    maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+    maxResolution: 156543,
+    units: 'm',
+    projection: "EPSG:41001"
+});</pre></blockquote></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.render"></a>render</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>render: function(</td><td class=PParameter nowrap>div</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Render the map to a specified container.</p><h4 class=CHeading [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.unloadDestroy"></a>unloadDestroy</h3><div class=CBody><p>Function that is called to destroy the map on page unload. stored here so that if map is manually destroyed, we can unregister this.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.updateSizeDestroy"></a>updateSizeDestroy</h3><div class=CBody><p>When the map is destroyed, we need to stop listening to updateSize events: this method stores the function we need to unregister in non-IE browsers.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy:function()</td></tr></table></blockquote><p>Destroy this map</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setOptions"></a>setOptions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOptions: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Change the map options</p><h4 class=CHeading>P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getTileSize"></a>getTileSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getTileSize: function()</td></tr></table></blockquote><p>Get the tile size for the map</p><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link116 onMouseOver="ShowTip(event, 'tt1', 'link116')" onMouseOut="HideTip('tt1')">OpenLay [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getBy"></a>getBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getBy: function(</td><td class=PParameter nowrap>array,</td></tr><tr><td></td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayersBy"></a>getLayersBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayersBy: function(</td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayersByName"></a>getLayersByName</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayersByName: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of layers with names m [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayersByClass"></a>getLayersByClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayersByClass: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of layers of a give [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getControlsBy"></a>getControlsBy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsBy: function(</td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getControlsByClass"></a>getControlsByClass</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControlsByClass: function(</td><td class=PParameter nowrap>match</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a list of controls o [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayer"></a>getLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayer: function(</td><td class=PParameter nowrap>id</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get a layer based on its id</p><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setLayerZIndex"></a>setLayerZIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayerZIndex: function (</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>zIdx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.resetLayersZIndex"></a>resetLayersZIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>resetLayersZIndex: function()</td></tr></table></blockquote><p>Reset each layer’s z-index based on layer’s array index</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addLayer"></a>addLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addLayer: function (</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellsp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addLayers"></a>addLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addLayers: function (</td><td class=PParameter nowrap>layers</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 ce [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.removeLayer"></a>removeLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeLayer: function(</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>setNewBaseLayer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getNumLayers"></a>getNumLayers</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getNumLayers: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Int} The number of layers attached to the map.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayerIndex"></a>getLayerIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayerIndex: function (</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setLayerIndex"></a>setLayerIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayerIndex: function (</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>idx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.raiseLayer"></a>raiseLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>raiseLayer: function (</td><td class=PParameter nowrap>layer,</td></tr><tr><td></td><td class=PParameter nowrap>delta</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bloc [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setBaseLayer"></a>setBaseLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBaseLayer: function(</td><td class=PParameter nowrap>newBaseLayer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Allows user to specify one of the c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addControl"></a>addControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addControl: function (</td><td class=PParameter nowrap>control,</td></tr><tr><td></td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></block [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addControls"></a>addControls</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addControls: function (</td><td class=PParameter nowrap>controls,</td></tr><tr><td></td><td class=PParameter nowrap>pixels</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addControlToMap"></a>addControlToMap</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addControlToMap: function (</td><td class=PParameter nowrap>control,</td></tr><tr><td></td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getControl"></a>getControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getControl: function (</td><td class=PParameter nowrap>id</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.removeControl"></a>removeControl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeControl: function (</td><td class=PParameter nowrap>control</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Remove a control from the map.  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.addPopup"></a>addPopup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addPopup: function(</td><td class=PParameter nowrap>popup,</td></tr><tr><td></td><td class=PParameter nowrap>exclusive</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.removePopup"></a>removePopup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removePopup: function(</td><td class=PParameter nowrap>popup</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getSize"></a>getSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getSize: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link129 onMouseOver="ShowTip(event, 'tt1', 'link129')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} An <a href="BaseTypes/Size-js.htm [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.updateSize"></a>updateSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateSize: function()</td></tr></table></blockquote><p>This function should be called by any external code which dynamically changes the size of the map div (because mozilla wont let us catch the “onresize” for an element)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getCurrentSize"></a>getCurrentSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCurrentSize: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link131 onMouseOver="ShowTip(event, 'tt1', 'link131')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} A new <a href [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.calculateBounds"></a>calculateBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateBounds: function(</td><td class=PParameter nowrap>center,</td></tr><tr><td></td><td class=PParameter nowrap>resolution</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getCenter"></a>getCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCenter: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link135 onMouseOver="ShowTip(event, 'tt2', 'link135')" onMouseOut="HideTip('tt2')">OpenLayers.LonLat</a>}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getZoom"></a>getZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getZoom: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.pan"></a>pan</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pan: function(</td><td class=PParameter nowrap>dx,</td></tr><tr><td></td><td class=PParameter nowrap>dy,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.panTo"></a>panTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>panTo: function(</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Allows user to pan to a new lonlat If the new lonlat is in the [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.setCenter"></a>setCenter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setCenter: function(</td><td class=PParameter nowrap>lonlat,</td></tr><tr><td></td><td class=PParameter nowrap>zoom,</td></tr><tr><td></td><td class=PParameter nowrap>dragging,</td></tr><tr><td></td><t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function(</td><td class=PParameter nowrap>lonlat,</td></tr><tr><td></td><td class=PParameter nowrap>zoom,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.centerLayerContainer"></a>centerLayerContainer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>centerLayerContainer: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This function ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.isValidZoomLevel"></a>isValidZoomLevel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isValidZoomLevel: function(</td><td class=PParameter nowrap>zoomLevel</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.isValidLonLat"></a>isValidLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isValidLonLat: function(</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getProjection"></a>getProjection</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getProjection: function()</td></tr></table></blockquote><p>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 projec [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getProjectionObject"></a>getProjectionObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getProjectionObject: function()</td></tr></table></blockquote><p>Returns the projection obect from the baselayer.</p><h4 class=CHeading>Returns</h4><p>{<a href="Projection-js.html#OpenLayers.Projection" class=LClass id=link140 onMouseOver="ShowTip(event, 'tt6', 'l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getMaxResolution"></a>getMaxResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMaxResolution: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} The Map’s Maximum Resolution</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getMaxExtent"></a>getMaxExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getMaxExtent: function (</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getNumZoomLevels"></a>getNumZoomLevels</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getNumZoomLevels: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Integer} The total number of zoom levels that can be displayed by the current baseLayer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getExtent"></a>getExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getExtent: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link142 onMouseOver="ShowTip(event, 'tt5', 'link142')" onMouseOut="HideTip('tt5')">OpenLayers.Bounds</a>} A Bounds object which [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getResolution"></a>getResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The current resolution of the map.  If no baselayer is set, returns null.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getUnits"></a>getUnits</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getUnits: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The current units of the map.  If no baselayer is set, returns null.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getScale"></a>getScale</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getScale: function ()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Float} The current scale denominator of the map.  If no baselayer is set, returns null.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getZoomForExtent"></a>getZoomForExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForExtent: function (</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getResolutionForZoom"></a>getResolutionForZoom</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getResolutionForZoom: function(</td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getZoomForResolution"></a>getZoomForResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZoomForResolution: function(</td><td class=PParameter nowrap>resolution,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomTo"></a>zoomTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomTo: function(</td><td class=PParameter nowrap>zoom</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Zoom to a specific zoom level</p><h4 class=CHeading>Parameter [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomIn"></a>zoomIn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>zoomIn: function()</td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>zoom</td><td class=CDLDescription>{int}</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomOut"></a>zoomOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>zoomOut: function()</td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>zoom</td><td class=CDLDescription>{int}</td></tr></table></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomToExtent"></a>zoomToExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomToExtent: function(</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomToMaxExtent"></a>zoomToMaxExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomToMaxExtent: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Zoom to the full extent and rec [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.zoomToScale"></a>zoomToScale</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>zoomToScale: function(</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>closest</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLonLatFromViewPortPx"></a>getLonLatFromViewPortPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromViewPortPx: function (</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getViewPortPxFromLonLat"></a>getViewPortPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getViewPortPxFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLonLatFromPixel"></a>getLonLatFromPixel</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromPixel: function (</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getPixelFromLonLat"></a>getPixelFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getPixelFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns a pixel locati [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getGeodesicPixelSize"></a>getGeodesicPixelSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getGeodesicPixelSize: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Param [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getViewPortPxFromLayerPx"></a>getViewPortPxFromLayerPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getViewPortPxFromLayerPx:function(</td><td class=PParameter nowrap>layerPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 clas [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayerPxFromViewPortPx"></a>getLayerPxFromViewPortPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayerPxFromViewPortPx:function(</td><td class=PParameter nowrap>viewPortPx</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLonLatFromLayerPx"></a>getLonLatFromLayerPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLonLatFromLayerPx: function (</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Para [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.getLayerPxFromLonLat"></a>getLayerPxFromLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLayerPxFromLonLat: function (</td><td class=PParameter nowrap>lonlat</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.TILE_WIDTH"></a>TILE_WIDTH</h3><div class=CBody><p>{Integer} 256 Default tile width (unless otherwise specified)</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Map.TILE_HEIGHT"></a>TILE_HEIGHT</h3><div class=CBody><p>{Integer} 256 Default tile height (unless otherwise specified)</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt3"><div class=CClass>Controls affect the display or behavior of the map. </div></div><div class=CToolTip id="tt4"><div class=CClass>A popup is a small div that can opened and closed on the map. </div></div><div class=CToolTip id="tt5"><div clas [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Marker-js.html b/doc/devdocs/files/OpenLayers/Marker-js.html
new file mode 100644
index 0000000..d9e902e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Marker-js.html
@@ -0,0 +1,84 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Marker - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Marker"></a>OpenLayers.<span class=HB> </span>Marker</h1><div class=CBody><p>Instances of OpenLayers.Marker are a combination of a <a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link18 onMouseOver="ShowTip(event, 'tt1', 'link18')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a> and an <a href="Icon-js.html#OpenLayers.Icon" class=LClass id=link19 onMouseOver="Sho [...]
+map.addLayer(markers);
+
+var size = new OpenLayers.Size(21,25);
+var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
+var icon = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png', size, offset);
+markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon));
+markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon.clone()));</pre></blockquote><p>Note that if you pass an icon into the Marker constructor, it will take that icon and use it.  This means that you should not share icons between markers -- you use them once, but you should clone() for any additional markers using that same icon.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpaddin [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.icon"></a>icon</h3><div class=CBody><p>{<a href="Icon-js.html#OpenLayers.Icon" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt2', 'link20')" onMouseOut="HideTip('tt2')">OpenLayers.Icon</a>} The icon used by this marker.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.lonlat"></a>lonlat</h3><div class=CBody><p>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt1', 'link21')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a>} location of object</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} the event handler.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.map"></a>map</h3><div class=CBody><p>{<a href="Map-js.html#OpenLayers.Map" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt3', 'link22')" onMouseOut="HideTip('tt3')">OpenLayers.Map</a>} the map this marker is attached to</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.OpenLayers.Marker"></a>OpenLayers.<span class=HB> </span>Marker</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt1', 'link23')" onMouseOut="HideTip('tt1')">OpenLaye [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>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 att [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calls draw on the icon, and returns that output.</p><h4 class=CHea [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.erase"></a>erase</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>erase: function()</td></tr></table></blockquote><p>Erases any drawn elements for this marker.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function (</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Move the marker to the new location.</p><h4 class=CHeading> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.isDrawn"></a>isDrawn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>isDrawn: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the marker is drawn.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.onScreen"></a>onScreen</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onScreen:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the marker is currently visible on screen.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.inflate"></a>inflate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>inflate: function(</td><td class=PParameter nowrap>inflate</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Englarges the markers icon by the specified ratio.</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity: function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Change the opacity of the marker by changin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.setUrl"></a>setUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setUrl: function(</td><td class=PParameter nowrap>url</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Change URL of the Icon Image.</p><table border=0 cellspacin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>display</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the icon</p><table border=0 cellspacing [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.defaultIcon"></a>defaultIcon</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Marker.defaultIcon = function()</td></tr></table></blockquote><p>Creates a default <a href="Icon-js.html#OpenLayers.Icon" class=LClass id=link27 onMouseOver="ShowTip(event, 'tt2', 'link27')" onMouseOut="HideTip('tt2')">OpenLayers.Icon</a>.</p><h4 class=CHeading>Retu [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([22, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt2"><div class=CClass>The icon represents a graphical icon on the screen. </div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy:  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Marker/Box-js.html b/doc/devdocs/files/OpenLayers/Marker/Box-js.html
new file mode 100644
index 0000000..f2c793b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Marker/Box-js.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Marker.Box - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Marker.Box"></a>OpenLayers.<span class=HB> </span>Marker.Box</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Marker-js.html#OpenLayers.Marker" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt7', 'link7')" onMouseOut="HideTip('tt7')">OpenLayers.Marker</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBord [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.bounds"></a>bounds</h3><div class=CBody><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt1', 'link8')" onMouseOut="HideTip('tt1')">OpenLayers.Bounds</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.div"></a>div</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.OpenLayers.Marker.Box"></a>OpenLayers.<span class=HB> </span>Marker.Box</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>bounds</td><td class=CDLDescription>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="HideTip('tt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.setBorder"></a>setBorder</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBorder: function (</td><td class=PParameter nowrap>color,</td></tr><tr><td></td><td class=PParameter nowrap>width</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function(</td><td class=PParameter nowrap>px,</td></tr><tr><td></td><td class=PParameter nowrap>sz</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=C [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.onScreen"></a>onScreen</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>onScreen:function()</td></tr></table></blockquote><h4 class=CHeading>Rreturn</h4><p>{Boolean} Whether or not the marker is currently visible on screen.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Marker.Box.display"></a>display</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>display: function(</td><td class=PParameter nowrap>display</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Hide or show the icon</p><h4 class=CHeading>Para [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([22, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBe [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Popup-js.html b/doc/devdocs/files/OpenLayers/Popup-js.html
new file mode 100644
index 0000000..0235b3e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Popup-js.html
@@ -0,0 +1,159 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup"></a>OpenLayers.<span class=HB> </span>Popup</h1><div class=CBody><p>A popup is a small div that can opened and closed on the map.  Typically opened in response to clicking on a marker.  See <a href="Marker-js.html#OpenLayers.Marker" class=LClass id=link36 onMouseOver="ShowTip(event, 'tt32', 'link36')" onMouseOut="HideTip('tt32')">OpenLayers.Marker</a>.   Popup&rsq [...]
+                   new OpenLayers.LonLat(5,40),
+                   new OpenLayers.Size(200,200),
+                   "example popup",
+                   true);
+
+map.addPopup(popup);</pre></blockquote><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Popup" >OpenLayers.<span class=HB> </span>Popup</a></td><td class=SDescription>A popup is a small div that can opened and closed on the map. </td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#OpenLayers.Popup.Properties" >Properties</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} custom event manager</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.id"></a>id</h3><div class=CBody><p>{String} the unique identifier assigned to this popup.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.lonlat"></a>lonlat</h3><div class=CBody><p>{<a href="BaseTypes/LonLat-js.html#OpenLayers.LonLat" class=LClass id=link38 onMouseOver="ShowTip(event, 'tt1', 'link38')" onMouseOut="HideTip('tt1')">OpenLayers.LonLat</a>} the position of this popup on the map</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.div"></a>div</h3><div class=CBody><p>{DOMElement} the div that contains this popup.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.contentSize"></a>contentSize</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link39 onMouseOver="ShowTip(event, 'tt2', 'link39')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} the width and height of the content.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.size"></a>size</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link40 onMouseOver="ShowTip(event, 'tt2', 'link40')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} the width and height of the popup.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.contentHTML"></a>contentHTML</h3><div class=CBody><p>{String} An HTML string for this popup to display.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.backgroundColor"></a>backgroundColor</h3><div class=CBody><p>{String} the background color used by the popup.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.opacity"></a>opacity</h3><div class=CBody><p>{float} the opacity of this popup (between 0.0 and 1.0)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.border"></a>border</h3><div class=CBody><p>{String} the border size of the popup.   (eg 2px)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.contentDiv"></a>contentDiv</h3><div class=CBody><p>{DOMElement} a reference to the element that holds the content of the div.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.groupDiv"></a>groupDiv</h3><div class=CBody><p>{DOMElement} First and only child of ‘div’.  The group Div contains the ‘contentDiv’ and the ‘closeDiv’.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.closeDiv"></a>closeDiv</h3><div class=CBody><p>{DOMElement} the optional closer image</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.autoSize"></a>autoSize</h3><div class=CBody><p>{Boolean} Resize the popup to auto-fit the contents.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.minSize"></a>minSize</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link41 onMouseOver="ShowTip(event, 'tt2', 'link41')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} Minimum size allowed for the popup’s contents.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.maxSize"></a>maxSize</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link42 onMouseOver="ShowTip(event, 'tt2', 'link42')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} Maximum size allowed for the popup’s contents.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.displayClass"></a>displayClass</h3><div class=CBody><p>{String} The CSS class of the popup.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.contentDisplayClass"></a>contentDisplayClass</h3><div class=CBody><p>{String} The CSS class of the popup content div.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.padding"></a>padding</h3><div class=CBody><p>{int or <a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link43 onMouseOver="ShowTip(event, 'tt3', 'link43')" onMouseOut="HideTip('tt3')">OpenLayers.Bounds</a>} 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 &lsquo [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.disableFirefoxOverflowHack"></a>disableFirefoxOverflowHack</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.fixPadding"></a>fixPadding</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>fixPadding: function()</td></tr></table></blockquote><p>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 <a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link44 on [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.panMapIfOutOfView"></a>panMapIfOutOfView</h3><div class=CBody><p>{Boolean} When drawn, pan map such that the entire popup is visible in the current viewport (if necessary).  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.keepInMap"></a>keepInMap</h3><div class=CBody><p>{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 [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.closeOnMove"></a>closeOnMove</h3><div class=CBody><p>{Boolean} When map pans, close the popup.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.map"></a>map</h3><div class=CBody><p>{<a href="Map-js.html#OpenLayers.Map" class=LClass id=link45 onMouseOver="ShowTip(event, 'tt5', 'link45')" onMouseOut="HideTip('tt5')">OpenLayers.Map</a>} this gets set in Map.js when the popup is added to the map</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.OpenLayers.Popup"></a>OpenLayers.<span class=HB> </span>Popup</h3><div class=CBody><p>Create a popup.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String} a unqiue identifier for this popup.   If null is passed an identifier will be automatically generated.</td></tr><tr><td class=CDLE [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Constructs the elements that make up the popup.</p><h4 class=CHeadi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.updatePosition"></a>updatePosition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updatePosition: function()</td></tr></table></blockquote><p>if the popup has a lonlat and its map members set, then have it move itself to its proper position</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.visible"></a>visible</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>visible: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Boolean indicating whether or not the popup is visible</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.toggle"></a>toggle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toggle: function()</td></tr></table></blockquote><p>Toggles visibility of the popup.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.show"></a>show</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote><p>Makes the popup visible.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.hide"></a>hide</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>hide: function()</td></tr></table></blockquote><p>Makes the popup invisible.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize:function(</td><td class=PParameter nowrap>contentSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Used to adjust the size of the popup.</p><h4 class [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.updateSize"></a>updateSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateSize: function()</td></tr></table></blockquote><p>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</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.setBackgroundColor"></a>setBackgroundColor</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBackgroundColor:function(</td><td class=PParameter nowrap>color</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the background col [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity:function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the opacity of the popup.</p><h4 class=C [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.setBorder"></a>setBorder</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBorder:function(</td><td class=PParameter nowrap>border</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the border style of the popup.</p><h4 class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.setContentHTML"></a>setContentHTML</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setContentHTML:function(</td><td class=PParameter nowrap>contentHTML</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Allows the user to set the HT [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.registerImageListeners"></a>registerImageListeners</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>registerImageListeners: function()</td></tr></table></blockquote><p>Called when an image contained by the popup loaded. this function updates the popup size, then unregisters the image load listener.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.getSafeContentSize"></a>getSafeContentSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getSafeContentSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.getContentDivPadding"></a>getContentDivPadding</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getContentDivPadding: function()</td></tr></table></blockquote><p>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’  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.addCloseBox"></a>addCloseBox</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addCloseBox: function(</td><td class=PParameter nowrap>callback</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.panIntoView"></a>panIntoView</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>panIntoView: function()</td></tr></table></blockquote><p>Pans the map such that the popup is totaly viewable (if necessary)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.registerEvents"></a>registerEvents</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>registerEvents:function()</td></tr></table></blockquote><p>Registers events on the popup.</p><p>Do this in a separate function so that subclasses can choose to override it if they wish to deal differently with mouse events</p><p>Note in the following handler functions tha [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.onmousedown"></a>onmousedown</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onmousedown: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When mouse goes down within the popup, make  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.onmousemove"></a>onmousemove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onmousemove: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>If the drag was started within the popup, th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.onmouseup"></a>onmouseup</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onmouseup: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When mouse comes up within the popup, after going  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.onclick"></a>onclick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onclick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Ignore clicks, but allowing default browser handling</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.onmouseout"></a>onmouseout</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onmouseout: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>When mouse goes out of the popup set the flag t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.ondblclick"></a>ondblclick</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>ondblclick: function (</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Ignore double-clicks, but allowing default brow [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>fixPadding: function()</td></tr [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Popup/Anchored-js.html b/doc/devdocs/files/OpenLayers/Popup/Anchored-js.html
new file mode 100644
index 0000000..39d1741
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Popup/Anchored-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup.Anchored - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup.Anchored"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Anchored</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Popup-js.html#OpenLayers.Popup" class=LClass id=link8 onMouseOver="ShowTip(event, 'tt8', 'link8')" onMouseOut="HideTip('tt8')">OpenLayers.Popup</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>S [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.keepInMap"></a>keepInMap</h3><div class=CBody><p>{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 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.OpenLayers.Popup.Anchored"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Anchored</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="../BaseTypes/LonLat-js.html#O [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.show"></a>show</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote><p>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)</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Since the popup is moving to a new px, it might need [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize:function(</td><td class=PParameter nowrap>contentSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bor [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.calculateRelativePosition"></a>calculateRelativePosition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateRelativePosition:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.updateRelativePosition"></a>updateRelativePosition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateRelativePosition: function()</td></tr></table></blockquote><p>The popup has been moved to a new relative location, so we may want to make some cosmetic adjustments to it.</p><p>Note that in the classic Anchored popup, there is nothing to do  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Anchored.calculateNewPx"></a>calculateNewPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateNewPx:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote>Overridden from Popup since user might hide popup and then show() it in a new location (meaning we might want to update the [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Popup/AnchoredBubble-js.html b/doc/devdocs/files/OpenLayers/Popup/AnchoredBubble-js.html
new file mode 100644
index 0000000..cc0fef8
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Popup/AnchoredBubble-js.html
@@ -0,0 +1,69 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup.AnchoredBubble - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>AnchoredBubble</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Anchored-js.html#OpenLayers.Popup.Anchored" class=LClass >OpenLayers.Popup.Anchored</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cell [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.rounded"></a>rounded</h3><div class=CBody><p>{Boolean} Has the popup been rounded yet?</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.OpenLayers.Popup.AnchoredBubble"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>AnchoredBubble</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="../BaseType [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cells [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.updateRelativePosition"></a>updateRelativePosition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateRelativePosition: function()</td></tr></table></blockquote><p>The popup has been moved to a new relative location, in which case we will want to re-do the rico corners.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize:function(</td><td class=PParameter nowrap>contentSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.setBackgroundColor"></a>setBackgroundColor</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBackgroundColor:function(</td><td class=PParameter nowrap>color</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=C [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity:function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.setBorder"></a>setBorder</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBorder:function(</td><td class=PParameter nowrap>border</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Always sets border to 0.  Bub [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.setRicoCorners"></a>setRicoCorners</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setRicoCorners:function()</td></tr></table></blockquote><p>Update RICO corners according to the popup’s current relative postion.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.getCornersToRound"></a>getCornersToRound</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCornersToRound:function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} The proper corners string (“tr tl bl br”) for rico to round.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.AnchoredBubble.CORNER_SIZE"></a>CORNER_SIZE</h3><div class=CBody><p>{Integer} 5.  Border space for the RICO corners.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>draw: function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><t [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Popup/Framed-js.html b/doc/devdocs/files/OpenLayers/Popup/Framed-js.html
new file mode 100644
index 0000000..b9de95f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Popup/Framed-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup.Framed - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup.Framed"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Framed</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Anchored-js.html#OpenLayers.Popup.Anchored" class=LClass >OpenLayers.Popup.Anchored</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.imageSrc"></a>imageSrc</h3><div class=CBody><p>{String} location of the image to be used as the popup frame</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.imageSize"></a>imageSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>} Size (measured in pixels) of the image located by the ‘imageSrc’ property.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.isAlphaImage"></a>isAlphaImage</h3><div class=CBody><p>{Boolean} The image has some alpha and thus needs to use the alpha image hack.  Note that setting this to true will have no noticeable effect in FF or IE7 browsers, but will all but crush the ie6 browser.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.positionBlocks"></a>positionBlocks</h3><div class=CBody><p>{Object} Hash of different position blocks (Object/Hashs).  Each block will be keyed by a two-character ‘relativePosition’ code string (ie “tl”, “tr”, “bl”, “br”).  Block properties are ‘offset’, ‘padding’ (self-explanatory), and finally the &lsquo [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.blocks"></a>blocks</h3><div class=CBody><p>{Array[Object]} Array of objects, each of which is one “block” of the popup.  Each block has a ‘div’ and an ‘image’ property, both of which are DOMElements, and the latter of which is appended to the former.  These are reused as the popup goes changing positions for great economy and elegance.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.fixedRelativePosition"></a>fixedRelativePosition</h3><div class=CBody><p>{Boolean} We want the framed popup to work dynamically placed relative to its anchor but also in just one fixed position.  A well designed framed popup will have the pixels and logic to display itself in any of the four relative positions, but (understandably), this will not be the case for all of them.  By setting t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.OpenLayers.Popup.Framed"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Framed</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="../BaseTypes/LonLat-js.html#OpenLay [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.setBackgroundColor"></a>setBackgroundColor</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setBackgroundColor:function(</td><td class=PParameter nowrap>color</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.setBorder"></a>setBorder</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>setBorder:function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setOpacity:function(</td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the opacity of the popup.</p><h4  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize:function(</td><td class=PParameter nowrap>contentSize</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Overridden here, because we need to update  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.updateRelativePosition"></a>updateRelativePosition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateRelativePosition: function()</td></tr></table></blockquote><p>When the relative position changes, we need to set the new padding BBOX on the popup, reposition the close div, and update the blocks.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.calculateNewPx"></a>calculateNewPx</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateNewPx:function(</td><td class=PParameter nowrap>px</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Besides the standard offset as  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.createBlocks"></a>createBlocks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createBlocks: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.Framed.updateBlocks"></a>updateBlocks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>updateBlocks: function()</td></tr></table></blockquote><p>Internal method, called on initialize and when the popup’s relative position has changed.  This function takes care of re-positioning the popup’s blocks in their appropropriate places.</p></div> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Popup/FramedCloud-js.html b/doc/devdocs/files/OpenLayers/Popup/FramedCloud-js.html
new file mode 100644
index 0000000..0337c9e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Popup/FramedCloud-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Popup.FramedCloud - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Popup.FramedCloud"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>FramedCloud</h1><div class=CBody><h4 class=CHeading>Inherits from</h4><ul><li><a href="Framed-js.html#OpenLayers.Popup.Framed" class=LClass >OpenLayers.Popup.Framed</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 ce [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.contentDisplayClass"></a>contentDisplayClass</h3><div class=CBody><p>{String} The CSS class of the popup content div.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.autoSize"></a>autoSize</h3><div class=CBody><p>{Boolean} Framed Cloud is autosizing by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.panMapIfOutOfView"></a>panMapIfOutOfView</h3><div class=CBody><p>{Boolean} Framed Cloud does pan into view by default.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.imageSize"></a>imageSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.isAlphaImage"></a>isAlphaImage</h3><div class=CBody><p>{Boolean} The FramedCloud does not use an alpha image (in honor of the good ie6 folk out there)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.fixedRelativePosition"></a>fixedRelativePosition</h3><div class=CBody><p>{Boolean} The Framed Cloud popup works in just one fixed position.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.positionBlocks"></a>positionBlocks</h3><div class=CBody><p>{Object} Hash of differen position blocks, keyed by relativePosition two-character code string (ie “tl”, “tr”, “bl”, “br”)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.minSize"></a>minSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.maxSize"></a>maxSize</h3><div class=CBody><p>{<a href="../BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.OpenLayers.Popup.FramedCloud"></a>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>FramedCloud</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>id</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>lonlat</td><td class=CDLDescription>{<a href="../BaseTypes/LonLat- [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Popup.FramedCloud.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([23, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents a longitude and latitude pair</div></div><div class=CToolTip id="tt4"><div class=CClass>This class represents a screen  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Projection-js.html b/doc/devdocs/files/OpenLayers/Projection-js.html
new file mode 100644
index 0000000..4e7f25d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Projection-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Projection - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Projection"></a>OpenLayers.<span class=HB> </span>Projection</h1><div class=CBody><p>Class for coordinate transforms between coordinate systems.  Depends on the proj4js library.  If proj4js is not available, then this is just an empty stub.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.proj"></a>proj</h3><div class=CBody><p>{Object} Proj4js.Proj instance.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.projCode"></a>projCode</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.OpenLayers.Projection"></a>OpenLayers.<span class=HB> </span>Projection</h3><div class=CBody><p>This class offers several methods for interacting with a wrapped pro4js projection object.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>projCode</td><td class=CDLDescription>{String} A string identifying the Well Known Ide [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.getCode"></a>getCode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCode: function()</td></tr></table></blockquote><p>Get the string SRS code.</p><h4 class=CHeading>Returns</h4><p>{String} The SRS code.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.getUnits"></a>getUnits</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getUnits: function()</td></tr></table></blockquote><p>Get the units string for the projection -- returns null if proj4js is not available.</p><h4 class=CHeading>Returns</h4><p>{String} The units abbreviation.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.toString"></a>toString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>toString: function()</td></tr></table></blockquote><p>Convert projection to string (getCode wrapper).</p><h4 class=CHeading>Returns</h4><p>{String} The projection code.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.equals"></a>equals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>equals: function(</td><td class=PParameter nowrap>projection</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Test equality of two projection instances.  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Destroy projection object.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.transforms"></a>transforms</h3><div class=CBody><p>Transforms is an object, with from properties, each of which may have a to property.  This allows you to define projections without requiring support for proj4js to be included.</p><p>This object has keys which correspond to a ‘source’ projection object.   The keys should be strings, corresponding to the projection.getCode() val [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.addTransform"></a>addTransform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Projection.addTransform = function(</td><td class=PParameter nowrap>from,</td></tr><tr><td></td><td class=PParameter nowrap>to,</td></tr><tr><td></td><td class=PParameter nowrap [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Projection.transform"></a>transform</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Projection.transform = function(</td><td class=PParameter nowrap>point,</td></tr><tr><td></td><td class=PParameter nowrap>source,</td></tr><tr><td></td><td class=PParameter nowrap>des [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getCode: function()</td></tr></table></blockquote>Get the string SRS code.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getUnits: function()</td></tr></table></blockquote>Get the units string for the projection -- returns null if proj4js is not available.</div></div [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol-js.html b/doc/devdocs/files/OpenLayers/Protocol-js.html
new file mode 100644
index 0000000..5f36618
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol-js.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol"></a>OpenLayers.<span class=HB> </span>Protocol</h1><div class=CBody><p>Abstract vector layer protocol class.   Not to be instantiated directly.   Use one of the protocol subclasses instead.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.format"></a>format</h3><div class=CBody><p>{<a href="Format-js.html#OpenLayers.Format" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} The format used by this protocol.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.options"></a>options</h3><div class=CBody><p>{Object} Any options sent to the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.autoDestroy"></a>autoDestroy</h3><div class=CBody><p>{Boolean} The creator of the protocol can set autoDestroy to false to fully control when the protocol is destroyed.  Defaults to true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.defaultFilter"></a>defaultFilter</h3><div class=CBody><p>{OpenLayers.Filter} Optional default filter to read requests</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.OpenLayers.Protocol"></a>OpenLayers.<span class=HB> </span>Protocol</h3><div class=CBody><p>Abstract class for vector protocols.   Create instances of a subclass.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance. [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.mergeWithDefaultFilter"></a>mergeWithDefaultFilter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeWithDefaultFilter: function(</td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Merge  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct a request for reading new features.</p><h4 class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.create"></a>create</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>create: function()</td></tr></table></blockquote><p>Construct a request for writing newly created features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>features</td><td class=CDLDescription>{Array({<a h [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>update: function()</td></tr></table></blockquote><p>Construct a request updating modified features.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>features</td><td class=CDLDescription>{Array({<a href="Fea [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.delete"></a>delete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>"delete": function()</td></tr></table></blockquote><p>Construct a request deleting a removed feature.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>feature</td><td class=CDLDescription>{<a href= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>commit: function()</td></tr></table></blockquote><p>Go over the features and for each take action based on the feature state.  Possible actions are create, update and delete.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.abort"></a>abort</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>abort: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Abort an ongoing request.</p><h4 class=CHeading>Paramet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.createCallback"></a>createCallback</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createCallback: function(</td><td class=PParameter nowrap>method,</td></tr><tr><td></td><td class=PParameter nowrap>response,</td></tr><tr><td></td><td class=PParameter nowrap>options</t [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Protocol.Response"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>Response</h2><div class=CBody><p>Protocols return Response objects to their users.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Protocol.Response.Properties" >Prope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.code"></a>code</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Number}</td><td class=CDLDescription>OpenLayers.Protocol.Response.SUCCESS or OpenLayers.Protocol.Response.FAILURE</td></tr></table></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.requestType"></a>requestType</h3><div class=CBody><p>{String} The type of request this response corresponds to.  Either “create”, “read”, “update” or “delete”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.last"></a>last</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Boolean}</td><td class=CDLDescription>true if this is the last response expected in a commit, false otherwise, defaults to true.</td></tr></table></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.features"></a>features</h3><div class=CBody><p>{Array({<a href="Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link40 onMouseOver="ShowTip(event, 'tt11', 'link40')" onMouseOut="HideTip('tt11')">OpenLayers.Feature.Vector</a>})} or {<a href="Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link41 onMouseOver="ShowTip(event, 'tt11', 'link41')" onMouseOut="HideT [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.reqFeatures"></a>reqFeatures</h3><div class=CBody><p>{Array({<a href="Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link42 onMouseOver="ShowTip(event, 'tt11', 'link42')" onMouseOut="HideTip('tt11')">OpenLayers.Feature.Vector</a>})} or {<a href="Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link43 onMouseOver="ShowTip(event, 'tt11', 'link43')" onMouseOut= [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.priv"></a>priv</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.OpenLayers.Protocol.Response"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>Response</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.Response.success"></a>success</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>success: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Boolean}</td><td class=CDLDescription>true on success, false otherwise</td></tr></table></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mergeWithDefaultFilter: function(</td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/HTTP-js.html b/doc/devdocs/files/OpenLayers/Protocol/HTTP-js.html
new file mode 100644
index 0000000..e9fde8c
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/HTTP-js.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.HTTP - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.HTTP"></a>OpenLayers.<span class=HB> </span>Protocol.HTTP</h1><div class=CBody><p>A basic HTTP protocol for vector layers.   Create a new instance with the <a href="#OpenLayers.Protocol.HTTP.OpenLayers.Protocol.HTTP" class=LConstructor id=link26 onMouseOver="ShowTip(event, 'tt18', 'link26')" onMouseOut="HideTip('tt18')">OpenLayers.Protocol.HTTP</a> constructor.</p><h4 cla [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.url"></a>url</h3><div class=CBody><p>{String} Service URL, read-only, set through the options passed to constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.headers"></a>headers</h3><div class=CBody><p>{Object} HTTP request headers, read-only, set through the options passed to the constructor, Example: {‘Content-Type’: ‘plain/text’}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.params"></a>params</h3><div class=CBody><p>{Object} Parameters of GET requests, read-only, set through the options passed to the constructor, Example: {‘bbox’: ‘5,5,5,5’}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.callback"></a>callback</h3><div class=CBody><p>{Object} Function to be called when the <a href="#OpenLayers.Protocol.HTTP.read" class=LFunction id=link28 onMouseOver="ShowTip(event, 'tt1', 'link28')" onMouseOut="HideTip('tt1')">read</a>, <a href="#OpenLayers.Protocol.HTTP.create" class=LFunction id=link29 onMouseOver="ShowTip(event, 'tt2', 'link29')" onMouseOut="HideTip('tt2')">create</a>, <a href [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.scope"></a>scope</h3><div class=CBody><p>{Object} Callback execution scope, read-only, set through the options passed to the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.readWithPOST"></a>readWithPOST</h3><div class=CBody><p>{Boolean} true if read operations are done with POST requests instead of GET, defaults to false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.wildcarded"></a>wildcarded.</h3><div class=CBody><p>{Boolean} If true percent signs are added around values read from LIKE filters, for example if the protocol read method is passed a LIKE filter whose property is “foo” and whose value is “bar” the string “foo__ilike=%bar%” will be sent in the query string; defaults to false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.OpenLayers.Protocol.HTTP"></a>OpenLayers.<span class=HB> </span>Protocol.HTTP</h3><div class=CBody><p>A class for giving layers generic HTTP protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct a request for reading new features.</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.handleRead"></a>handleRead</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleRead: function(</td><td class=PParameter nowrap>resp,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.filterToParams"></a>filterToParams</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>filterToParams: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>params</td><td class=PAfterParameters nowrap>)</td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.regex2value"></a>regex2value</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>regex2value: function(</td><td class=PParameter nowrap>value</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Convert the value from a regular ex [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.create"></a>create</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>create: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.handleCreate"></a>handleCreate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleCreate: function(</td><td class=PParameter nowrap>resp,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>update: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.handleUpdate"></a>handleUpdate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleUpdate: function(</td><td class=PParameter nowrap>resp,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.delete"></a>delete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>"delete": function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.handleDelete"></a>handleDelete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleDelete: function(</td><td class=PParameter nowrap>resp,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.handleResponse"></a>handleResponse</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleResponse: function(</td><td class=PParameter nowrap>resp,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.parseFeatures"></a>parseFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeatures: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read HTTP response body and [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commit: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.abort"></a>abort</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>abort: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Abort an ongoing request, the response object pass [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.callUserCallback"></a>callUserCallback</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>callUserCallback: function(</td><td class=PParameter nowrap>resp,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.HTTP.OpenLayers.Protocol.HTTP.COMP_TYPE_TO_OP_STR"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>HTTP.<span class=HB> </span>COMP_TYPE_TO_OP_STR</h3><div class=CBody><p>{Object} A private class-level property mapping the OpenLayers.Filter.Comparison types to the operation strings of the protocol.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Construct a request for reading new features.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/SOS-js.html b/doc/devdocs/files/OpenLayers/Protocol/SOS-js.html
new file mode 100644
index 0000000..3da2cd1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/SOS-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SOS.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="SOS.js"></a>SOS.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#SOS.js" >SOS.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS"></a>OpenLayers.<span class=HB> </span>Protocol.SOS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Protocol.SOS = function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SOS.<span class=HB> </span>DEFAULTS</h3></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Protocol.SOS = function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Used to create a versioned SOS protocol. </div></div><div class=CToolTip id="tt2"><div class=CClass>Abstract vector [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/SOS/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Protocol/SOS/v1_0_0-js.html
new file mode 100644
index 0000000..94f1d8c
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/SOS/v1_0_0-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.SOS.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SOS.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>An SOS v1.0.0 Protocol for vector layers.   Create a new instance with the <a href="#OpenLayers.Protocol.SOS.v1_0_0" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt5', 'link5')" onMouseOut="HideTip('tt5')">OpenLayers.Protocol.SO [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.fois"></a>fois</h3><div class=CBody><p>{Array(String)} Array of features of interest (foi)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Optional options for the format.   If a format is not provided, this property can be used to extend the default format options.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.OpenLayers.Protocol.SOS"></a>OpenLayers.<span class=HB> </span>Protocol.SOS</h3><div class=CBody><p>A class for giving layers an SOS protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.  Valid o [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct a request for reading new sensor posit [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.handleRead"></a>handleRead</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleRead: function(</td><td class=PParameter nowrap>response,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SOS.v1_0_0.parseFeatures"></a>parseFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeatures: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read HTTP response bo [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/SQL-js.html b/doc/devdocs/files/OpenLayers/Protocol/SQL-js.html
new file mode 100644
index 0000000..e405589
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/SQL-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.SQL - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.SQL"></a>OpenLayers.<span class=HB> </span>Protocol.SQL</h1><div class=CBody><p>Abstract SQL protocol class.   Not to be instantiated directly.   Use one of the SQL protocol subclasses instead.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link4 onMouseOver="ShowTip(event, 'tt4', 'link4')" onMouseOut [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.databaseName"></a>databaseName</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.tableName"></a>tableName</h3><div class=CBody><p>Name of the database table into which Features should be saved.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.postReadFiltering"></a>postReadFiltering</h3><div class=CBody><p>{Boolean} Whether the filter (if there’s one) must be applied after the features have been read from the database; for example the BBOX strategy passes the read method a BBOX spatial filter, if postReadFiltering is true every feature read from the database will go through the BBOX spatial filter, which can be costly; defaults to [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.OpenLayers.Protocol.SQL"></a>OpenLayers.<span class=HB> </span>Protocol.SQL</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><p>This should be overridden by specific subclasses</p><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the browser supports the SQL backend</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.evaluateFilter"></a>evaluateFilter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluateFilter: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table>< [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([24, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>This should be overridden by specific subclasses</div></div><div class=CToolTip id="tt3"><div cl [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/SQL/Gears-js.html b/doc/devdocs/files/OpenLayers/Protocol/SQL/Gears-js.html
new file mode 100644
index 0000000..6488571
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/SQL/Gears-js.html
@@ -0,0 +1,97 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.SQL.Gears - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears</h1><div class=CBody><p>This Protocol stores feature in the browser via the Gears Database module <a href="http://code.google.com/apis/gears/api_database.html" class=LURL target=_top>http://code.google.com<span class=HB>- </span>/apis<span class=HB>- </span>/gears< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.FID_PREFIX"></a>FID_PREFIX</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.NULL_GEOMETRY"></a>NULL_GEOMETRY</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.NULL_FEATURE_STATE"></a>NULL_FEATURE_STATE</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.jsonParser"></a>jsonParser</h3><div class=CBody><p>{<a href="../../Format/JSON-js.html#OpenLayers.Format.JSON" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt1', 'link21')" onMouseOut="HideTip('tt1')">OpenLayers.Format.JSON</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.wktParser"></a>wktParser</h3><div class=CBody><p>{<a href="../../Format/WKT-js.html#OpenLayers.Format.WKT" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt2', 'link22')" onMouseOut="HideTip('tt2')">OpenLayers.Format.WKT</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.fidRegExp"></a>fidRegExp</h3><div class=CBody><p>{RegExp} Regular expression to know whether a feature was created in offline mode.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.saveFeatureState"></a>saveFeatureState</h3><div class=CBody><p>{Boolean} Whether to save the feature state (<OpenLayers.State>) into the database, defaults to true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.typeOfFid"></a>typeOfFid</h3><div class=CBody><p>{String} The type of the feature identifier, either “number” or “string”, defaults to “string”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.db"></a>db</h3><div class=CBody><p>{GearsDatabase}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.OpenLayers.Protocol.SQL.Gears"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears</h3></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.initializeDatabase"></a>initializeDatabase</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initializeDatabase: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><p>Determine whether a browser supports Gears</p><h4 class=CHeading>Returns</h4><p>{Boolean} The browser supports Gears</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read all features from the database and return a  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.unfreezeFeature"></a>unfreezeFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>unfreezeFeature: function(</td><td class=PParameter nowrap>row</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Para [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.extractFidFromField"></a>extractFidFromField</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>extractFidFromField: function(</td><td class=PParameter nowrap>field</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.create"></a>create</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>create: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>update: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.createOrUpdate"></a>createOrUpdate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createOrUpdate: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct a reques [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.freezeFeature"></a>freezeFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>freezeFeature: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parame [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.getFeatureStateForFreeze"></a>getFeatureStateForFreeze</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureStateForFreeze: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.delete"></a>delete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>"delete": function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.createdOffline"></a>createdOffline</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createdOffline: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns true if the [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commit: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Removes all rows of the table.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.SQL.Gears.callUserCallback"></a>callUserCallback</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>callUserCallback: function(</td><td class=PParameter nowrap>options,</td></tr><tr><td></td><td class=PParameter nowrap>resp</td><td class=PAfterParameters nowrap>)</td></tr [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([24, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>A parser to read/write JSON safely. </div></div><div class=CToolTip id="tt2"><div class=CClass>Class for reading and writing Well-Known Text. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initializeDatabase: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacin [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/WFS-js.html b/doc/devdocs/files/OpenLayers/Protocol/WFS-js.html
new file mode 100644
index 0000000..20f55a1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/WFS-js.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS.js - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CFile"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="WFS.js"></a>WFS.js</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#WFS.js" >WFS.js</a></td><td class=SDescription></td></tr><tr class="SGroup"><td class=SEntry><a href="#Functions" >Functions</a></td><td class=SDescription></td></tr> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS"></a>OpenLayers.<span class=HB> </span>Protocol.WFS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Protocol.WFS = function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.fromWMSLayer"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>fromWMSLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Protocol.WFS.fromWMSLayer = function(</td><td class=PParameter nowrap>layer,</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.DEFAULTS"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>DEFAULTS</h3></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([25, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Protocol.WFS = function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Used to create a versioned WFS protocol. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote> [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/WFS/v1-js.html b/doc/devdocs/files/OpenLayers/Protocol/WFS/v1-js.html
new file mode 100644
index 0000000..ae470b7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/WFS/v1-js.html
@@ -0,0 +1,81 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.WFS.v1 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.WFS.v1"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.v1</h1><div class=CBody><p>Abstract class for for v1.0.0 and v1.1.0 protocol.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../../Protocol-js.html#OpenLayers.Protocol" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt10', 'link10')" onMouseOut="HideTip('tt10')">OpenLayers.Protocol [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.version"></a>version</h3><div class=CBody><p>{String} WFS version number.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.srsName"></a>srsName</h3><div class=CBody><p>{String} Name of spatial reference system.   Default is “EPSG:4326”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.featureType"></a>featureType</h3><div class=CBody><p>{String} Local feature typeName.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.featureNS"></a>featureNS</h3><div class=CBody><p>{String} Feature namespace.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.geometryName"></a>geometryName</h3><div class=CBody><p>{String} Name of the geometry attribute for features.   Default is “the_geom”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.schema"></a>schema</h3><div class=CBody><p>{String} Optional schema location that will be included in the schemaLocation attribute value.   Note that the feature type schema is required for a strict XML validator (on transactions with an insert for example), but is <b>not</b> required by the WFS specification (since the server is supposed to know about feature type schemas).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.featurePrefix"></a>featurePrefix</h3><div class=CBody><p>{String} Namespace alias for feature type.   Default is “feature”.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.formatOptions"></a>formatOptions</h3><div class=CBody><p>{Object} Optional options for the format.   If a format is not provided, this property can be used to extend the default format options.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.readFormat"></a>readFormat</h3><div class=CBody><p>{<a href="../../Format-js.html#OpenLayers.Format" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Format</a>} For WFS requests it is possible to get a different output format than GML.  In that case, we cannot parse the response with the default format (WFST) and we need a differen [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.OpenLayers.Protocol.WFS"></a>OpenLayers.<span class=HB> </span>Protocol.WFS</h3><div class=CBody><p>A class for giving layers WFS protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></table><h4 [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the protocol.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.read"></a>read</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>read: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct a request for reading new features.   [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.handleRead"></a>handleRead</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleRead: function(</td><td class=PParameter nowrap>response,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.parseFeatures"></a>parseFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>parseFeatures: function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Read HTTP response body a [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.commit"></a>commit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>commit: function(</td><td class=PParameter nowrap>features,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.handleCommit"></a>handleCommit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleCommit: function(</td><td class=PParameter nowrap>response,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.filterDelete"></a>filterDelete</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>filterDelete: function(</td><td class=PParameter nowrap>filter,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1.abort"></a>abort</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>abort: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Abort an ongoing request, the response object pa [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([25, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Base class for format reading/writing a variety of formats. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the protocol.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/WFS/v1_0_0-js.html b/doc/devdocs/files/OpenLayers/Protocol/WFS/v1_0_0-js.html
new file mode 100644
index 0000000..5561f1b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/WFS/v1_0_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.WFS.v1_0_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_0_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>v1_0_0</h1><div class=CBody><p>A WFS v1.0.0 protocol for vector layers.   Create a new instance with the <a href="#OpenLayers.Protocol.WFS.v1_0_0.OpenLayers.Protocol.WFS.v1_0_0" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="Hi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_0_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_0_0.version"></a>version</h3><div class=CBody><p>{String} WFS version number.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_0_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_0_0.OpenLayers.Protocol.WFS.v1_0_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>v1_0_0</h3><div class=CBody><p>A class for giving layers WFS v1.0.0 protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional ob [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([25, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>A class for giving layers WFS v1.0.0 protocol.</div></div><div class=CToolTip id="tt2"><div class=CClass>Abstract class for for v1.0.0 and v1.1.0 protocol.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Protocol/WFS/v1_1_0-js.html b/doc/devdocs/files/OpenLayers/Protocol/WFS/v1_1_0-js.html
new file mode 100644
index 0000000..a90e65d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Protocol/WFS/v1_1_0-js.html
@@ -0,0 +1,47 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Protocol.WFS.v1_1_0 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_1_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>v1_1_0</h1><div class=CBody><p>A WFS v1.1.0 protocol for vector layers.   Create a new instance with the <a href="#OpenLayers.Protocol.WFS.v1_1_0.OpenLayers.Protocol.WFS.v1_1_0" class=LConstructor id=link1 onMouseOver="ShowTip(event, 'tt1', 'link1')" onMouseOut="Hi [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_1_0.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_1_0.version"></a>version</h3><div class=CBody><p>{String} WFS version number.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_1_0.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Protocol.WFS.v1_1_0.OpenLayers.Protocol.WFS.v1_1_0"></a>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>WFS.<span class=HB> </span>v1_1_0</h3><div class=CBody><p>A class for giving layers WFS v1.1.0 protocol.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional ob [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([25, 26, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>A class for giving layers WFS v1.1.0 protocol.</div></div><div class=CToolTip id="tt2"><div class=CClass>Abstract class for for v1.0.0 and v1.1.0 protocol.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Renderer-js.html b/doc/devdocs/files/OpenLayers/Renderer-js.html
new file mode 100644
index 0000000..fcf4b58
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Renderer-js.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Renderer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Renderer"></a>OpenLayers.<span class=HB> </span>Renderer</h1><div class=CBody><p>This is the base class for all renderers.</p><p>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.</p><p>The functions that <b>are</b>  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.container"></a>container</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.root"></a>root</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.extent"></a>extent</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt1', 'link20')" onMouseOut="HideTip('tt1')">OpenLayers.Bounds</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.locked"></a>locked</h3><div class=CBody><p>{Boolean} If the renderer is currently in a state where many things 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  [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.size"></a>size</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link21 onMouseOver="ShowTip(event, 'tt2', 'link21')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.resolution"></a>resolution</h3><div class=CBody><p>{Float} cache of current map resolution</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.map"></a>map</h3><div class=CBody><p>{<a href="Map-js.html#OpenLayers.Map" class=LClass id=link22 onMouseOver="ShowTip(event, 'tt3', 'link22')" onMouseOut="HideTip('tt3')">OpenLayers.Map</a>} Reference to the map -- this is set in Vector’s setMap()</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.OpenLayers.Renderer"></a>OpenLayers.<span class=HB> </span>Renderer</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{<a href="BaseTypes-js.html#OpenLayers.String" class=LClass id=link23 onMouseOver="ShowTip(event, 'tt20', 'link23')" onMouseOut="HideTip('tt20')">St [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><p>This should be overridden by specific subclasses</p><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the browser supports the renderer class</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.setExtent"></a>setExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setExtent: function(</td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParameter nowrap>resolutionChanged</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the size of the drawing surface.</p><p>Resolutio [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.getResolution"></a>getResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getResolution: function()</td></tr></table></blockquote><p>Uses cached copy of resolution if available to minimize computing</p><h4 class=CHeading>Returns</h4><p>The current map’s resolution</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.drawFeature"></a>drawFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawFeature: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.drawGeometry"></a>drawGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawGeometry: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>featureId</td><td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.drawText"></a>drawText</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawText: function(</td><td class=PParameter nowrap>featureId,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>location</td><td class=PAfte [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.removeText"></a>removeText</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeText: function(</td><td class=PParameter nowrap>featureId</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Function for removing text labels.&nbsp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear all vectors from the renderer. virtual function.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.getFeatureIdFromEvent"></a>getFeatureIdFromEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureIdFromEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns a fe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.eraseFeatures"></a>eraseFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>eraseFeatures: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This is called by the layer to  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.eraseGeometry"></a>eraseGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>eraseGeometry: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>featureId</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.moveRoot"></a>moveRoot</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveRoot: function(</td><td class=PParameter nowrap>renderer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>moves this renderer’s root to a (differe [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.getRenderLayerId"></a>getRenderLayerId</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getRenderLayerId: function()</td></tr></table></blockquote><p>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.</p><h4 class=CH [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.applyDefaultSymbolizer"></a>applyDefaultSymbolizer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>applyDefaultSymbolizer: function(</td><td class=PParameter nowrap>symbolizer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.OpenLayers.Renderer.defaultSymbolizer"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>defaultSymbolizer</h3><div class=CBody><p>{Object} Properties from this symbolizer will be applied to symbolizers with missing properties.  This can also be used to set a global symbolizer default in OpenLayers.  To be SLD 1.x compliant, add the following code before rendering any vect [...]
+    fillColor: "#808080",
+    fillOpacity: 1,
+    strokeColor: "#000000",
+    strokeOpacity: 1,
+    strokeWidth: 1,
+    pointRadius: 3,
+    graphicName: "square"
+};</pre></blockquote></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt3"><div class=CClass>Instances of OpenLayers.Map are interactive maps embedded in a web page. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy:  [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Renderer/Canvas-js.html b/doc/devdocs/files/OpenLayers/Renderer/Canvas-js.html
new file mode 100644
index 0000000..30b93fd
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Renderer/Canvas-js.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Renderer.Canvas - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Renderer.Canvas"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Canvas</h1><div class=CBody><p>A renderer based on the 2D ‘canvas’ drawing element.element</p><h4 class=CHeading>Inherits</h4><ul><li><a href="../Renderer-js.html#OpenLayers.Renderer" class=LClass id=link19 onMouseOver="ShowTip(event, 'tt19', 'link19')" onMouseOut="HideTip('tt19')">OpenLa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.canvas"></a>canvas</h3><div class=CBody><p>{Canvas} The canvas context object.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.features"></a>features</h3><div class=CBody><p>{Object} Internal object of feature/style pairs for use in redrawing the layer.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.OpenLayers.Renderer.Canvas"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Canvas</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{<a href="../BaseTypes-js.html#OpenLayers.String" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.eraseGeometry"></a>eraseGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>eraseGeometry: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>featureId</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the browser supports the renderer class</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.setExtent"></a>setExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setExtent: function(</td><td class=PParameter nowrap>extent</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the visible part of the layer.</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the size of the drawing surface.</p><p>On [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.drawFeature"></a>drawFeature</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawFeature: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.drawGeometry"></a>drawGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawGeometry: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.drawExternalGraphic"></a>drawExternalGraphic</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawExternalGraphic: function(</td><td class=PParameter nowrap>pt,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.setCanvasStyle"></a>setCanvasStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setCanvasStyle: function(</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.drawPoint"></a>drawPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawPoint: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.drawLineString"></a>drawLineString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawLineString: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.drawLinearRing"></a>drawLinearRing</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawLinearRing: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.drawPolygon"></a>drawPolygon</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawPolygon: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.drawText"></a>drawText</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawText: function(</td><td class=PParameter nowrap>location,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.getLocalXY"></a>getLocalXY</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getLocalXY: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>transform geographic xy into pixel x [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear all vectors from the renderer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.getFeatureIdFromEvent"></a>getFeatureIdFromEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureIdFromEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Retur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.eraseFeatures"></a>eraseFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>eraseFeatures: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>This is called by the la [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.redraw"></a>redraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>redraw: function()</td></tr></table></blockquote><p>The real ‘meat’ of the function: any time things have changed, redraw() can be called to loop over all the data and (you guessed it) redraw it.   Unlike Elements-based Renderers, we can’t interact with t [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Canvas.OpenLayers.Renderer.Canvas.LABEL_ALIGN"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Canvas.<span class=HB> </span>LABEL_ALIGN</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>eraseGeometry: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>featureId</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Erase a geometry from the renderer. </div></div><div class=CTool [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Renderer/Elements-js.html b/doc/devdocs/files/OpenLayers/Renderer/Elements-js.html
new file mode 100644
index 0000000..592b696
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Renderer/Elements-js.html
@@ -0,0 +1,157 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.ElementsIndexer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.ElementsIndexer"></a>OpenLayers.<span class=HB> </span>ElementsIndexer</h1><div class=CBody><p>This class takes care of figuring out which order elements should be placed in the DOM based on given indexing methods.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.maxZIndex"></a>maxZIndex</h3><div class=CBody><p>{Integer} This is the largest-most z-index value for a node contained within the indexer.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.order"></a>order</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.indices"></a>indices</h3><div class=CBody><p>{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 value O(1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.compare"></a>compare</h3><div class=CBody><p>{Function} This is the function used to determine placement of of a new node within the indexer.  If null, this defaults to to the Z_ORDER_DRAWING_ORDER comparison method.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.initialize"></a>initialize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>yOrdering</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a new indexer with</p><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.insert"></a>insert</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>insert: function(</td><td class=PParameter nowrap>newNode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Insert a new node into the indexer.  In o [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.remove"></a>remove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>remove: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 ce [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.exists"></a>exists</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>exists: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><p>node- {DOMEleme [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.getZIndex"></a>getZIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getZIndex: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get the z-index value for the current no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.determineZIndex"></a>determineZIndex</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>determineZIndex: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine the z-index  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.getNextElement"></a>getNextElement</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNextElement: function(</td><td class=PParameter nowrap>index</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Get the next element in  [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods"></a>OpenLayers.<span class=HB> </span>ElementsIndexer.<span class=HB> </span>IndexingMethods</h2><div class=CBody><p>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.</p> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER"></a>Z_ORDER</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td></td><td class=PParameter nowrap>nextNode [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_DRAWING_ORDER"></a>Z_ORDER_DRAWING_ORDER</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER_DRAWING_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER_Y_ORDER"></a>Z_ORDER_Y_ORDER</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER_Y_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td></td><td class=PP [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Renderer.Elements"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Elements</h2><div class=CBody><p>This is another virtual class in that it should never be instantiated by itself as a Renderer.  It exists because there is <b>tons</b> of shared functionality between different vector libraries which use nodes/elements as a base for rendering vectors.</p><p>The highlevel bits of code that  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.rendererRoot"></a>rendererRoot</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.root"></a>root</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.vectorRoot"></a>vectorRoot</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.textRoot"></a>textRoot</h3><div class=CBody><p>{DOMElement}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.xmlns"></a>xmlns</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Indexer"></a>Indexer</h3><div class=CBody><p>{<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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.BACKGROUND_ID_SUFFIX"></a>BACKGROUND_ID_SUFFIX</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.BACKGROUND_ID_SUFFIX"></a>BACKGROUND_ID_SUFFIX</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.OpenLayers.Renderer.Elements"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Elements</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{String}</td></tr><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} options for [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Remove all the elements from the root</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.getNodeType"></a>getNodeType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNodeType: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawGeometry"></a>drawGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawGeometry: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>featureI [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.redrawNode"></a>redrawNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>redrawNode: function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.redrawBackgroundNode"></a>redrawBackgroundNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>redrawBackgroundNode: function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PPara [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawGeometryNode"></a>drawGeometryNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawGeometryNode: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.postDraw"></a>postDraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>postDraw: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Things that have do be done after the geo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawPoint"></a>drawPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawPoint: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawLineString"></a>drawLineString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawLineString: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawLinearRing"></a>drawLinearRing</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawLinearRing: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawPolygon"></a>drawPolygon</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawPolygon: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawRectangle"></a>drawRectangle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawRectangle: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawCircle"></a>drawCircle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawCircle: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.drawSurface"></a>drawSurface</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawSurface: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.removeText"></a>removeText</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>removeText: function(</td><td class=PParameter nowrap>featureId</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Removes a label</p><h4 class=C [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.getFeatureIdFromEvent"></a>getFeatureIdFromEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureIdFromEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.eraseGeometry"></a>eraseGeometry</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>eraseGeometry: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>featureId</td><td class=PAfterParameters nowrap>)</td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.nodeFactory"></a>nodeFactory</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>nodeFactory: function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>type</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.nodeTypeCompare"></a>nodeTypeCompare</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>nodeTypeCompare: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>type</td><td class=PAfterParameters nowrap>)</td></tr></tabl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.createNode"></a>createNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createNode: function(</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>id</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></tab [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.moveRoot"></a>moveRoot</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveRoot: function(</td><td class=PParameter nowrap>renderer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>moves this renderer’s root to a [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.getRenderLayerId"></a>getRenderLayerId</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getRenderLayerId: function()</td></tr></table></blockquote><p>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.</p><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.isComplexSymbol"></a>isComplexSymbol</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>isComplexSymbol: function(</td><td class=PParameter nowrap>graphicName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determines if [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.Elements.OpenLayers.Renderer.symbol"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>symbol</h3><div class=CBody><p>Coordinate arrays for well known (named) symbols.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>initialize: function(</td><td class=PParameter nowrap>yOrdering</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a new indexer with</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing= [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Renderer/SVG-js.html b/doc/devdocs/files/OpenLayers/Renderer/SVG-js.html
new file mode 100644
index 0000000..c0cc856
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Renderer/SVG-js.html
@@ -0,0 +1,127 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Renderer.SVG - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Renderer.SVG"></a>OpenLayers.<span class=HB> </span>Renderer.SVG</h1><div class=CBody><h4 class=CHeading>Inherits</h4><ul><li><a href="Elements-js.html#OpenLayers.Renderer.Elements" class=LClass id=link28 onMouseOver="ShowTip(event, 'tt28', 'link28')" onMouseOut="HideTip('tt28')">OpenLayers.Renderer.Elements</a></li></ul><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summa [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.xmlns"></a>xmlns</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.xlinkns"></a>xlinkns</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.MAX_PIXEL"></a>MAX_PIXEL</h3><div class=CBody><p>{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.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.translationParameters"></a>translationParameters</h3><div class=CBody><p>{Object} Hash with “x” and “y” properties</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.symbolMetrics"></a>symbolMetrics</h3><div class=CBody><p>{Object} Cache for symbol metrics according to their svg coordinate space.  This is an object keyed by the symbol’s id, and values are an array of [width, centerX, centerY].</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.isGecko"></a>isGecko</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.supportUse"></a>supportUse</h3><div class=CBody><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>{Boolean} true if defs/use is supported</td><td class=CDLDescription>known to not work as expected at least in some applewebkit/5* builds.  See <a href="https://bugs.webkit.org/show_bug.cgi?id=33322" class=LURL target=_top>https://bugs.webkit.org/show_bug.cg [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.OpenLayers.Renderer.SVG"></a>OpenLayers.<span class=HB> </span>Renderer.SVG</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{String}</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the browser supports the SVG renderer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.inValidRange"></a>inValidRange</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>inValidRange: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y,</td></tr><tr><td></td><td class=PParameter nowrap>xyOnly</td><td class=PAf [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.setExtent"></a>setExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setExtent: function(</td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParameter nowrap>resolutionChanged</td><td class=PAfterParameters nowrap>)</td></tr></table></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.translate"></a>translate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>translate: function(</td><td class=PParameter nowrap>x,</td></tr><tr><td></td><td class=PParameter nowrap>y</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockqu [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the size of the drawing surface.</p><h4 clas [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.getNodeType"></a>getNodeType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNodeType: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.setStyle"></a>setStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setStyle: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterP [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.dashStyle"></a>dashStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dashStyle: function(</td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>widthFactor</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.createNode"></a>createNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createNode: function(</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>id</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.nodeTypeCompare"></a>nodeTypeCompare</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>nodeTypeCompare: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>type</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.createRenderRoot"></a>createRenderRoot</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createRenderRoot: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement} The specific render engine’s root element</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.createRoot"></a>createRoot</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createRoot: function(</td><td class=PParameter nowrap>suffix</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameter</h4><table b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.createDefs"></a>createDefs</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createDefs: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{DOMElement} The element to which we’ll add the symbol definitions</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.drawPoint"></a>drawPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawPoint: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.drawCircle"></a>drawCircle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawCircle: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>radius</td><td class [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.drawLineString"></a>drawLineString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawLineString: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.drawLinearRing"></a>drawLinearRing</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawLinearRing: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.drawPolygon"></a>drawPolygon</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawPolygon: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.drawRectangle"></a>drawRectangle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawRectangle: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.drawSurface"></a>drawSurface</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawSurface: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.drawText"></a>drawText</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawText: function(</td><td class=PParameter nowrap>featureId,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>location</td><td class=P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.getComponentString"></a>getComponentString</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>components</td><td class=CDLDescription>{Array(<a href="../Geometry/Point-js.html#OpenLayers.Geometry.Point" class=LClass id=link40 onMouseOver="ShowTip(event, 'tt32', 'link40')" onMouseOut="HideTip('tt32')">OpenL [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.clipLine"></a>clipLine</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clipLine: function(</td><td class=PParameter nowrap>badComponent,</td></tr><tr><td></td><td class=PParameter nowrap>goodComponent</td><td class=PAfterParameters nowrap>)</td></tr></table></td></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.getShortString"></a>getShortString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getShortString: function(</td><td class=PParameter nowrap>point</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.getPosition"></a>getPosition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getPosition: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Finds the position of an svg node.</p [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.importSymbol"></a>importSymbol</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>importSymbol: function (</td><td class=PParameter nowrap>graphicName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>add a new symbol definitio [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.getFeatureIdFromEvent"></a>getFeatureIdFromEvent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getFeatureIdFromEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=C [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.OpenLayers.Renderer.SVG.LABEL_ALIGN"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>SVG.<span class=HB> </span>LABEL_ALIGN</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.SVG.OpenLayers.Renderer.SVG.LABEL_VSHIFT"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>SVG.<span class=HB> </span>LABEL_VSHIFT</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>{Boolean} Whether or not the browser supports the SVG renderer</div></div><div class=CToolTip id="tt3"><div class=CFun [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Renderer/VML-js.html b/doc/devdocs/files/OpenLayers/Renderer/VML-js.html
new file mode 100644
index 0000000..6e5518d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Renderer/VML-js.html
@@ -0,0 +1,107 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Renderer.VML - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Renderer.VML"></a>OpenLayers.<span class=HB> </span>Renderer.VML</h1><div class=CBody><p>Render vector features in browsers with VML capability.   Construct a new VML renderer with the <a href="#OpenLayers.Renderer.VML.OpenLayers.Renderer.VML" class=LConstructor id=link25 onMouseOver="ShowTip(event, 'tt25', 'link25')" onMouseOut="HideTip('tt25')">OpenLayers.Renderer.VML</a> constr [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.xmlns"></a>xmlns</h3><div class=CBody><p>{String} XML Namespace URN</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.symbolCache"></a>symbolCache</h3><div class=CBody><p>{DOMElement} node holding symbols.  This hash is keyed by symbol name, and each value is a hash with a “path” and an “extent” property.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.offset"></a>offset</h3><div class=CBody><p>{Object} Hash with “x” and “y” properties</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.OpenLayers.Renderer.VML"></a>OpenLayers.<span class=HB> </span>Renderer.VML</h3><div class=CBody><p>Create a new VML renderer.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>containerID</td><td class=CDLDescription>{String} The id for the element that contains the renderer</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Deconstruct the renderer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.supported"></a>supported</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote><p>Determine whether a browser supports this renderer.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The browser supports the VML renderer</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.setExtent"></a>setExtent</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setExtent: function(</td><td class=PParameter nowrap>extent,</td></tr><tr><td></td><td class=PParameter nowrap>resolutionChanged</td><td class=PAfterParameters nowrap>)</td></tr></table></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.setSize"></a>setSize</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setSize: function(</td><td class=PParameter nowrap>size</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Set the size of the drawing surface</p><h4 class= [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.getNodeType"></a>getNodeType</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getNodeType: function(</td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.setStyle"></a>setStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setStyle: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>options,</td></tr><tr><td></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.graphicRotate"></a>graphicRotate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>graphicRotate: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>xOffset,</td></tr><tr><td></td><td class=PParameter nowrap>yOffset,</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.postDraw"></a>postDraw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>postDraw: function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Does some node postprocessing  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.setNodeDimension"></a>setNodeDimension</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setNodeDimension: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.dashStyle"></a>dashStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dashStyle: function(</td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table bord [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.createNode"></a>createNode</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createNode: function(</td><td class=PParameter nowrap>type,</td></tr><tr><td></td><td class=PParameter nowrap>id</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.nodeTypeCompare"></a>nodeTypeCompare</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>nodeTypeCompare: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>type</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.createRenderRoot"></a>createRenderRoot</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createRenderRoot: function()</td></tr></table></blockquote><p>Create the renderer root</p><h4 class=CHeading>Returns</h4><p>{DOMElement} The specific render engine’s root element</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.createRoot"></a>createRoot</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createRoot: function(</td><td class=PParameter nowrap>suffix</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create the main root element</p><h4 cl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.drawPoint"></a>drawPoint</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawPoint: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.drawCircle"></a>drawCircle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawCircle: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry,</td></tr><tr><td></td><td class=PParameter nowrap>radius</td><td class [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.drawLineString"></a>drawLineString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawLineString: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.drawLinearRing"></a>drawLinearRing</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawLinearRing: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.DrawLine"></a>DrawLine</h3><div class=CBody><p>Render a line.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>node</td><td class=CDLDescription>{DOMElement}</td></tr><tr><td class=CDLEntry>geometry</td><td class=CDLDescription>{<a href="../Geometry-js.html#OpenLayers.Geometry" class=LClass id=link36 onMouseOver="ShowTip( [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.drawPolygon"></a>drawPolygon</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawPolygon: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.drawRectangle"></a>drawRectangle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawRectangle: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.drawText"></a>drawText</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawText: function(</td><td class=PParameter nowrap>featureId,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>location</td><td class=P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.drawSurface"></a>drawSurface</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>drawSurface: function(</td><td class=PParameter nowrap>node,</td></tr><tr><td></td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.moveRoot"></a>moveRoot</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveRoot: function(</td><td class=PParameter nowrap>renderer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>moves this renderer’s root to a diff [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.importSymbol"></a>importSymbol</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>importSymbol: function (</td><td class=PParameter nowrap>graphicName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>add a new symbol definitio [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Renderer.VML.OpenLayers.Renderer.VML.LABEL_SHIFT"></a>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>VML.<span class=HB> </span>LABEL_SHIFT</h3><div class=CBody><p>{Object}</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([27, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Deconstruct the renderer.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>supported: function()</td></tr></table></blockquote>Determine whether a browser supports this renderer.</div></div><div class=CToolTip id="tt3">< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Request-js.html b/doc/devdocs/files/OpenLayers/Request-js.html
new file mode 100644
index 0000000..8efbdf6
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Request-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Request - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Request"></a>OpenLayers.<span class=HB> </span>Request</h1><div class=CBody><p>The OpenLayers.Request namespace contains convenience methods for working with XMLHttpRequests.   These methods work with a cross-browser W3C compliant <a href="Request/XMLHttpRequest-js.html#OpenLayers.Request.XMLHttpRequest" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt10', 'link10')" onMouse [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.DEFAULT_CONFIG"></a>DEFAULT_CONFIG</h3><div class=CBody><p>{Object} Default configuration for all requests.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} An events object that handles all events on the {<a href="#OpenLayers.Request" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt1', 'link11')" onMouseOut="HideTip('tt1')">OpenLayers.Request</a>} object.</p><h4 class=CHeading>All event listeners will receive an event object wit [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.issue"></a>issue</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>issue: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a new XMLHttpRequest object, open it, set any heade [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.runCallbacks"></a>runCallbacks</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>runCallbacks: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Calls the complete, success and fail [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.GET"></a>GET</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>GET: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP GET request.   Additional configuration proper [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.POST"></a>POST</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>POST: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send a POST request.   Additional configuration properti [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.PUT"></a>PUT</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>PUT: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP PUT request.   Additional configuration proper [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.DELETE"></a>DELETE</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>DELETE: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP DELETE request.   Additional configur [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.HEAD"></a>HEAD</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>HEAD: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP HEAD request.   Additional configuration pr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Request.OPTIONS"></a>OPTIONS</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OPTIONS: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Send an HTTP OPTIONS request.   Additional conf [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([28, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The OpenLayers.Request namespace contains convenience methods for working with XMLHttpRequests. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>issue: function(</td><td class=PParameter nowrap>config</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Request/XMLHttpRequest-js.html b/doc/devdocs/files/OpenLayers/Request/XMLHttpRequest-js.html
new file mode 100644
index 0000000..a97cee7
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Request/XMLHttpRequest-js.html
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Request.XMLHttpRequest - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Request.XMLHttpRequest"></a>OpenLayers.<span class=HB> </span>Request.<span class=HB> </span>XMLHttpRequest</h1><div class=CBody><p>Standard-compliant (W3C) cross-browser implementation of the XMLHttpRequest object.   From <a href="http://code.google.com/p/xmlhttprequest/" class=LURL target=_top>http://code.google.com/p/xmlhttprequest/</a>.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([28, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Rule-js.html b/doc/devdocs/files/OpenLayers/Rule-js.html
new file mode 100644
index 0000000..5b51263
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Rule-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Rule - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Rule"></a>OpenLayers.Rule</h1><div class=CBody><p>This class represents an SLD Rule, as being used for rule-based SLD styling.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Rule" >OpenLayers.Rule</a></td><td class=SDescription [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.id"></a>id</h3><div class=CBody><p>{String} A unique id for this session.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.name"></a>name</h3><div class=CBody><p>{String} name of this rule</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.title"></a>title</h3><div class=CBody><p>{String} Title of this rule (set if included in SLD)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.description"></a>description</h3><div class=CBody><p>{String} Description of this rule (set if abstract is included in SLD)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.context"></a>context</h3><div class=CBody><p>{Object} An optional object with properties that the rule should be evaluated against.  If no context is specified, feature.attributes will be used.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.filter"></a>filter</h3><div class=CBody><p>{<a href="Filter-js.html#OpenLayers.Filter" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt1', 'link6')" onMouseOut="HideTip('tt1')">OpenLayers.Filter</a>} Optional filter for the rule.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.elseFilter"></a>elseFilter</h3><div class=CBody><p>{Boolean} Determines whether this rule is only to be applied only if 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 ignored.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.symbolizer"></a>symbolizer</h3><div class=CBody><p>{Object} Symbolizer or hash of symbolizers for this rule.  If hash of symbolizers, keys are one or more of [“Point”, “Line”, “Polygon”].  The latter if useful if it is required to style e.g. vertices of a line with a point symbolizer.  Note, however, that this is not implemented yet in OpenLayers, but it i [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.symbolizers"></a>symbolizers</h3><div class=CBody><p>{Array} Collection of symbolizers associated with this rule.   If provided at construction, the symbolizers array has precedence over the deprecated symbolizer property.   Note that multiple symbolizers are not currently supported by the vector renderers.  Rules with multiple symbolizers are currently only useful for maintaining elements i [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.minScaleDenominator"></a>minScaleDenominator</h3><div class=CBody><p>{Number} or {String} minimum scale at which to draw the feature.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.maxScaleDenominator"></a>maxScaleDenominator</h3><div class=CBody><p>{Number} or {String} maximum scale at which to draw the feature.  In the case of a String, this can be a combination of text and propertyNames in the form “literal ${propertyName}”</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.OpenLayers.Rule"></a>OpenLayers.Rule</h3><div class=CBody><p>Creates a Rule.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} An optional object with properties to set on the rule</td></tr></table><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Rule.OpenLayers.Rule" class=L [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.evaluate"></a>evaluate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>evaluate: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>evaluates this rule for a specific feature</p><h4 c [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.getContext"></a>getContext</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getContext: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Gets the context for evaluating this rule</p> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Rule.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this rule.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Rule.OpenLayers.Rule" class=LConstructor id=link10 onMouseOver="ShowTip(event, 'tt6', 'link10')" onMouseOut="HideTip('tt6')">OpenLayers.Rule</a>} Clone of this rul [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents an OGC Filter.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory leaks</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table bo [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Strategy-js.html b/doc/devdocs/files/OpenLayers/Strategy-js.html
new file mode 100644
index 0000000..bd16bd3
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Strategy-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy"></a>OpenLayers.<span class=HB> </span>Strategy</h1><div class=CBody><p>Abstract vector layer strategy class.   Not to be instantiated directly.   Use one of the strategy subclasses instead.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.layer"></a>layer</h3><div class=CBody><p>{<a href="Layer/Vector-js.html#OpenLayers.Layer.Vector" class=LClass id=link7 onMouseOver="ShowTip(event, 'tt1', 'link7')" onMouseOut="HideTip('tt1')">OpenLayers.Layer.Vector</a>} The layer this strategy belongs to.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.options"></a>options</h3><div class=CBody><p>{Object} Any options sent to the constructor.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.active"></a>active</h3><div class=CBody><p>{Boolean} The control is active.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.autoActivate"></a>autoActivate</h3><div class=CBody><p>{Boolean} The creator of the strategy can set autoActivate to false to fully control when the protocol is activated and deactivated.  Defaults to true.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.autoDestroy"></a>autoDestroy</h3><div class=CBody><p>{Boolean} The creator of the strategy can set autoDestroy to false to fully control when the strategy is destroyed.  Defaults to true.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.OpenLayers.Strategy"></a>OpenLayers.<span class=HB> </span>Strategy</h3><div class=CBody><p>Abstract class for vector strategies.   Create instances of a subclass.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the strategy.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.setLayer"></a>setLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setLayer: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called to set the <a href="#OpenLayers.Strategy.l [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully activated or false if the strategy was already active.</p></div></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully deactivated or false if the strategy was already ina [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of OpenLayers.Layer.Vector are used to render vector data from a variety of sources. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the strategy.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><t [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Strategy/BBOX-js.html b/doc/devdocs/files/OpenLayers/Strategy/BBOX-js.html
new file mode 100644
index 0000000..c76fed5
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Strategy/BBOX-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.BBOX - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.BBOX"></a>OpenLayers.<span class=HB> </span>Strategy.BBOX</h1><div class=CBody><p>A simple strategy that reads new features when the viewport invalidates some bounds.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt12', 'link13')" onMouseOut="HideTip('tt12')">OpenLayers.Stra [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.bounds"></a>bounds</h3><div class=CBody><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">OpenLayers.Bounds</a>} The current data bounds (in the same projection as the layer - not always the same projection as the map).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.resolution"></a>resolution</h3><div class=CBody><p>{Float} The current data resolution.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.ratio"></a>ratio</h3><div class=CBody><p>{Float} The ratio of the data bounds to the viewport bounds (in each dimension).   Default is 2.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.resFactor"></a>resFactor</h3><div class=CBody><p>{Float} Optional factor used to determine when previously requested features are invalid.   If set, the resFactor will be compared to the resolution of the previous request to the current map resolution.  If resFactor > (old / new) and 1/resFactor < (old / new).   If you set a resFactor of 1, data will be requested every time th [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.response"></a>response</h3><div class=CBody><p>{<a href="../Protocol-js.html#OpenLayers.Protocol.Response" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt2', 'link15')" onMouseOut="HideTip('tt2')">OpenLayers.Protocol.Response</a>} The protocol response object returned by the layer protocol.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.OpenLayers.Strategy.BBOX"></a>OpenLayers.<span class=HB> </span>Strategy.BBOX</h3><div class=CBody><p>Create a new BBOX strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Set up strategy with regard to reading new batches of remote data.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Tear down strategy with regard to reading new batches of remote data.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.update"></a>update</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>update: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Callback function called on “moveend&rdquo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.getMapBounds"></a>getMapBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>getMapBounds: function()</td></tr></table></blockquote><p>Get the map bounds expressed in the same projection as this layer.</p><h4 class=CHeading>Returns</h4><p>{<a href="../BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link16 onMouseOver="ShowTip(event [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.invalidBounds"></a>invalidBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>invalidBounds: function(</td><td class=PParameter nowrap>mapBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Determine whether the pre [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.calculateBounds"></a>calculateBounds</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>calculateBounds: function(</td><td class=PParameter nowrap>mapBounds</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Par [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.triggerRead"></a>triggerRead</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>triggerRead: function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{<a href="../Protocol-js.html#OpenLayers.Protocol.Response" class=LClass id=link20 onMouseOver="ShowTip(event, 'tt2', 'link20')" onMouseOut="HideTip('tt2')">OpenLayers.Protocol.Respo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.createFilter"></a>createFilter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createFilter: function()</td></tr></table></blockquote><p>Creates a spatial BBOX filter.  If the layer that this strategy belongs to has a filter property, this filter will be combined with the BBOX filter.</p><p>Returns {<a href="../Filter-js.html#OpenLayers.Fil [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.BBOX.merge"></a>merge</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>merge: function(</td><td class=PParameter nowrap>resp</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a list of features, determine which ones to add  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt2"><div class=CClass>Protocols return Response objects to their users.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Set up strategy with regard to reading new batches of remote data.</div></div><div class=CTool [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Strategy/Cluster-js.html b/doc/devdocs/files/OpenLayers/Strategy/Cluster-js.html
new file mode 100644
index 0000000..38e2c9d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Strategy/Cluster-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Cluster - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Cluster"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Cluster</h1><div class=CBody><p>Strategy for vector feature clustering.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt11', 'link12')" onMouseOut="HideTip('tt11')">OpenLayers.Strategy</a></li></u [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.distance"></a>distance</h3><div class=CBody><p>{Integer} Pixel distance between features that should be considered a single cluster.   Default is 20 pixels.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.threshold"></a>threshold</h3><div class=CBody><p>{Integer} Optional threshold below which original features will be added to the layer instead of clusters.   For example, a threshold of 3 would mean that any time there are 2 or fewer features in a cluster, those features will be added directly to the layer instead of a cluster representing those features.   Default is null (which is e [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.features"></a>features</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt1', 'link13')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>)} Cached features.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.clusters"></a>clusters</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt1', 'link14')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>)} Calculated clusters.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.clustering"></a>clustering</h3><div class=CBody><p>{Boolean} The strategy is currently clustering features.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.resolution"></a>resolution</h3><div class=CBody><p>{Float} The resolution (map units per pixel) of the current cluster set.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.OpenLayers.Strategy.Cluster"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Cluster</h3><div class=CBody><p>Create a new clustering strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the inst [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.cacheFeatures"></a>cacheFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>cacheFeatures: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Cache features before they [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.clearCache"></a>clearCache</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearCache: function()</td></tr></table></blockquote><p>Clear out the cached features.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.cluster"></a>cluster</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>cluster: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Cluster features based on some threshold dis [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.clustersExist"></a>clustersExist</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clustersExist: function()</td></tr></table></blockquote><p>Determine whether calculated clusters are already on the layer.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The calculated clusters are already on the layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.shouldCluster"></a>shouldCluster</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>shouldCluster: function(</td><td class=PParameter nowrap>cluster,</td></tr><tr><td></td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.addToCluster"></a>addToCluster</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addToCluster: function(</td><td class=PParameter nowrap>cluster,</td></tr><tr><td></td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Cluster.createCluster"></a>createCluster</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createCluster: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Given a feature, create  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Strategy/Filter-js.html b/doc/devdocs/files/OpenLayers/Strategy/Filter-js.html
new file mode 100644
index 0000000..2d2b087
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Strategy/Filter-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Filter - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Filter"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Filter</h1><div class=CBody><p>Strategy for limiting features that get added to a layer by evaluating a filter.   The strategy maintains a cache of all features until removeFeatures is called on the layer.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.St [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.filter"></a>filter</h3><div class=CBody><p>{<a href="../Filter-js.html#OpenLayers.Filter" class=LClass id=link9 onMouseOver="ShowTip(event, 'tt1', 'link9')" onMouseOut="HideTip('tt1')">OpenLayers.Filter</a>}  Filter for limiting features sent to the layer.  Use the <a href="#OpenLayers.Strategy.Filter.setFilter" class=LFunction id=link10 onMouseOver="ShowTip(event, 'tt7', 'link10')" onMouse [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.cache"></a>cache</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link11 onMouseOver="ShowTip(event, 'tt2', 'link11')" onMouseOut="HideTip('tt2')">OpenLayers.Feature.Vector</a>)} List of currently cached features.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.caching"></a>caching</h3><div class=CBody><p>{Boolean} The filter is currently caching features.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.OpenLayers.Strategy.Filter"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Filter</h3><div class=CBody><p>Create a new filter strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.&n [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.  By default, this strategy automatically activates itself when a layer is added to a map.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Clear the feature cache.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully deactivated or false if the strategy was already inactive.</p></div></di [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.handleAdd"></a>handleAdd</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleAdd: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.handleRemove"></a>handleRemove</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handleRemove: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Filter.setFilter"></a>setFilter</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setFilter: function(</td><td class=PParameter nowrap>filter</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Update the filter for this strategy.&n [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents an OGC Filter.</div></div><div class=CToolTip id="tt2"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt4"><div class=CFunc [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Strategy/Fixed-js.html b/doc/devdocs/files/OpenLayers/Strategy/Fixed-js.html
new file mode 100644
index 0000000..294df29
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Strategy/Fixed-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Fixed - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Fixed"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Fixed</h1><div class=CBody><p>A simple strategy that requests features once and never requests new data.</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt6', 'link6')" onMouseOut="HideTip('tt6')">Open [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.preload"></a>preload</h3><div class=CBody><p>{Boolean} Load data before layer made visible.  Enabling this may result in considerable overhead if your application loads many data layers that are not visible by default.  Default is false.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.OpenLayers.Strategy.Fixed"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Fixed</h3><div class=CBody><p>Create a new Fixed strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>Clean up the strategy.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy: load data or add listener to load when visible</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully activated or false if the strategy was already active.</p></div></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Undo what is done in <a href="#OpenLayers.Strategy.Fixed.activate" class=LFunction id=link7 onMouseOver="ShowTip(event, 'tt2', 'link7')" onMouseOut="HideTip('tt2')">activate</a>.</p>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.load"></a>load</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>load: function(</td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Tells protocol to load data and unhooks the visibilit [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Fixed.merge"></a>merge</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>merge: function(</td><td class=PParameter nowrap>resp</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Add all features to the layer.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>Clean up the strategy.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy: load data or add listener to load when visible</div></div><div class=CTool [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Strategy/Paging-js.html b/doc/devdocs/files/OpenLayers/Strategy/Paging-js.html
new file mode 100644
index 0000000..722c4a8
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Strategy/Paging-js.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Paging - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Paging"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging</h1><div class=CBody><p>Strategy for vector feature paging</p><h4 class=CHeading>Inherits from</h4><ul><li><a href="../Strategy-js.html#OpenLayers.Strategy" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt12', 'link12')" onMouseOut="HideTip('tt12')">OpenLayers.Strategy</a></li></ul><!--S [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.features"></a>features</h3><div class=CBody><p>{Array(<a href="../Feature/Vector-js.html#OpenLayers.Feature.Vector" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt1', 'link13')" onMouseOut="HideTip('tt1')">OpenLayers.Feature.Vector</a>)} Cached features.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.length"></a>length</h3><div class=CBody><p>{Integer} Number of features per page.   Default is 10.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.num"></a>num</h3><div class=CBody><p>{Integer} The currently displayed page number.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.paging"></a>paging</h3><div class=CBody><p>{Boolean} The strategy is currently changing pages.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.OpenLayers.Strategy.Paging"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging</h3><div class=CBody><p>Create a new paging strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</ [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.cacheFeatures"></a>cacheFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>cacheFeatures: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Cache features before they  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.clearCache"></a>clearCache</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clearCache: function()</td></tr></table></blockquote><p>Clear out the cached features.   This destroys features, assuming nothing else has a reference.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pageCount"></a>pageCount</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>pageCount: function()</td></tr></table></blockquote><p>Get the total count of pages given the current cache of features.</p><h4 class=CHeading>Returns</h4><p>{Integer} The page count.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pageNum"></a>pageNum</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>pageNum: function()</td></tr></table></blockquote><p>Get the zero based page number.</p><h4 class=CHeading>Returns</h4><p>{Integer} The current page number being displayed.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pageLength"></a>pageLength</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pageLength: function(</td><td class=PParameter nowrap>newLength</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Gets or sets page length.</p><h4 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pageNext"></a>pageNext</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>pageNext: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Display the next page of features.</p><h4  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.pagePrevious"></a>pagePrevious</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>pagePrevious: function()</td></tr></table></blockquote><p>Display the previous page of features.</p><h4 class=CHeading>Returns</h4><p>{Boolean} A new page was displayed.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Paging.page"></a>page</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>page: function(</td><td class=PParameter nowrap>start,</td></tr><tr><td></td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Vector features use the OpenLayers.Geometry classes as geometry description. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Strategy/Refresh-js.html b/doc/devdocs/files/OpenLayers/Strategy/Refresh-js.html
new file mode 100644
index 0000000..a37279d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Strategy/Refresh-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Refresh - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Refresh"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Refresh</h1><div class=CBody><p>A strategy that refreshes the layer.  By default the strategy waits for a call to <a href="#OpenLayers.Strategy.Refresh.refresh" class=LFunction id=link7 onMouseOver="ShowTip(event, 'tt5', 'link7')" onMouseOut="HideTip('tt5')">refresh</a> before refreshing.  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.force"></a>force</h3><div class=CBody><p>{Boolean} Force a refresh on the layer.  Default is false.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.interval"></a>interval</h3><div class=CBody><p>{Number} Auto-refresh.  Default is 0.   If > 0, layer will be refreshed every N milliseconds.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.timer"></a>timer</h3><div class=CBody><p>{Number} The id of the timer.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.OpenLayers.Strategy.Refresh"></a>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Refresh</h3><div class=CBody><p>Create a new Refresh strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instanc [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.  Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.  Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} True if the strategy was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.reset"></a>reset</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>reset: function()</td></tr></table></blockquote><p>Start or cancel the refresh interval depending on the visibility of the layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.start"></a>start</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>start: function()</td></tr></table></blockquote><p>Start the refresh interval.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.refresh"></a>refresh</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>refresh: function()</td></tr></table></blockquote><p>Tell the strategy to refresh which will refresh the layer.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Refresh.stop"></a>stop</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>stop: function()</td></tr></table></blockquote><p>Cancels the refresh interval.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CFunction><block [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Strategy/Save-js.html b/doc/devdocs/files/OpenLayers/Strategy/Save-js.html
new file mode 100644
index 0000000..8c41b5d
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Strategy/Save-js.html
@@ -0,0 +1,67 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Strategy.Save - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Strategy.Save"></a>OpenLayers.<span class=HB> </span>Strategy.Save</h1><div class=CBody><p>A strategy that commits newly created or modified features.   By default the strategy waits for a call to <a href="#OpenLayers.Strategy.Save.save" class=LFunction id=link6 onMouseOver="ShowTip(event, 'tt4', 'link6')" onMouseOut="HideTip('tt4')">save</a> before persisting changes.   By c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types.   Register a listener for a particular event with the following syntax:</p><blockquote><pre>strategy.events.register(type, obj, listener);</pre></blockquote><ul><li><b>start</b> Triggered before saving</li><li><b>success</b> Triggered after a successful transaction</li><li><b>fail</b> Trigg [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.events"></a>events</h3><div class=CBody><p>{<a href="../Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} Events instance for triggering this protocol events.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.auto"></a>auto</h3><div class=CBody><p>{Boolean | Number} Auto-save.   Default is false.   If true, features will be saved immediately after being added to the layer and with each modification or deletion.   If auto is a number, features will be saved on an interval provided by the value (in seconds).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.timer"></a>timer</h3><div class=CBody><p>{Number} The id of the timer.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.OpenLayers.Strategy.Save"></a>OpenLayers.<span class=HB> </span>Strategy.Save</h3><div class=CBody><p>Create a new Save strategy.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>options</td><td class=CDLDescription>{Object} Optional object whose properties will be set on the instance.</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.activate"></a>activate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote><p>Activate the strategy.   Register any listeners, do appropriate setup.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully activated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.deactivate"></a>deactivate</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote><p>Deactivate the strategy.   Unregister any listeners, do appropriate tear-down.</p><h4 class=CHeading>Returns</h4><p>{Boolean} The strategy was successfully deactivated.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.triggerSave"></a>triggerSave</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>triggerSave: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Registered as a listener.   Ca [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.save"></a>save</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>save: function(</td><td class=PParameter nowrap>features</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Tell the layer protocol to commit unsaved features.&n [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Strategy.Save.onCommit"></a>onCommit</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>onCommit: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called after protocol commit.</p><h4 clas [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([29, 30, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>activate: function()</td></tr></table></blockquote>Activate the strategy. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>deactivate: function()</td></tr></table></blockquote>Deactivate the strategy. </div></div><div class=CToolTip id="tt3"><div class=CFunction><block [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Style-js.html b/doc/devdocs/files/OpenLayers/Style-js.html
new file mode 100644
index 0000000..28af44f
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Style-js.html
@@ -0,0 +1,95 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Style - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Style"></a>OpenLayers.<span class=HB> </span>Style</h1><div class=CBody><p>This class represents a UserStyle obtained from a SLD, containing styling rules.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Style" >OpenLayers.<span [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.id"></a>id</h3><div class=CBody><p>{String} A unique id for this session.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.name"></a>name</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.title"></a>title</h3><div class=CBody><p>{String} Title of this style (set if included in SLD)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.description"></a>description</h3><div class=CBody><p>{String} Description of this style (set if abstract is included in SLD)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.layerName"></a>layerName</h3><div class=CBody><p>{<a href="BaseTypes-js.html#OpenLayers.String" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt1', 'link15')" onMouseOut="HideTip('tt1')">String</a>} name of the layer that this style belongs to, usually according to the NamedLayer attribute of an SLD document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.isDefault"></a>isDefault</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.rules"></a>rules</h3><div class=CBody><p>{Array(<a href="Rule-js.html#OpenLayers.Rule" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt2', 'link16')" onMouseOut="HideTip('tt2')">OpenLayers.Rule</a>)}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.context"></a>context</h3><div class=CBody><p>{Object} An optional object with properties that symbolizers’ property values should be evaluated against.  If no context is specified, feature.attributes will be used</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.defaultStyle"></a>defaultStyle</h3><div class=CBody><p>{Object} hash of style properties to use as default for merging rule-based style symbolizers onto.  If no rules are defined, createSymbolizer will return this style.  If <a href="#OpenLayers.Style.defaultsPerSymbolizer" class=LProperty id=link17 onMouseOver="ShowTip(event, 'tt15', 'link17')" onMouseOut="HideTip('tt15')">defaultsPerSymbolizer [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.defaultsPerSymbolizer"></a>defaultsPerSymbolizer</h3><div class=CBody><p>{Boolean} If set to true, the <a href="#OpenLayers.Style.defaultStyle" class=LProperty id=link18 onMouseOver="ShowTip(event, 'tt3', 'link18')" onMouseOut="HideTip('tt3')">defaultStyle</a> will extend the symbolizer of every rule.  Properties of the <a href="#OpenLayers.Style.defaultStyle" class=LProperty id=link19 onMouseOver="S [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.propertyStyles"></a>propertyStyles</h3><div class=CBody><p>{Hash of Boolean} cache of style properties that need to be parsed for propertyNames.  Property names are keys, values won’t be used.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.OpenLayers.Style"></a>OpenLayers.<span class=HB> </span>Style</h3><div class=CBody><p>Creates a UserStyle.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>style</td><td class=CDLDescription>{Object} Optional hash of style properties that will be used as default style for this style object.  This style applies if no rule [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.createSymbolizer"></a>createSymbolizer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createSymbolizer: function(</td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>creates a style by applyin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.applySymbolizer"></a>applySymbolizer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>applySymbolizer: function(</td><td class=PParameter nowrap>rule,</td></tr><tr><td></td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>feature</td><td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.createLiterals"></a>createLiterals</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createLiterals: function(</td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>feature</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.findPropertyStyles"></a>findPropertyStyles</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>findPropertyStyles: function()</td></tr></table></blockquote><p>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 [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.addPropertyStyles"></a>addPropertyStyles</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addPropertyStyles: function(</td><td class=PParameter nowrap>propertyStyles,</td></tr><tr><td></td><td class=PParameter nowrap>symbolizer</td><td class=PAfterParameters nowrap>)</td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.addRules"></a>addRules</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addRules: function(</td><td class=PParameter nowrap>rules</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Adds rules to this style.</p><h4 class=CHeading>Para [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.setDefaultStyle"></a>setDefaultStyle</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>setDefaultStyle: function(</td><td class=PParameter nowrap>style</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Sets the default style for this [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.getSymbolizerPrefix"></a>getSymbolizerPrefix</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getSymbolizerPrefix: function(</td><td class=PParameter nowrap>geometry</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Returns the corr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this style.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Style.OpenLayers.Style" class=LConstructor id=link25 onMouseOver="ShowTip(event, 'tt16', 'link25')" onMouseOut="HideTip('tt16')">OpenLayers.Style</a>} Clone of t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.createLiteral"></a>createLiteral</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Style.createLiteral = function(</td><td class=PParameter nowrap>value,</td></tr><tr><td></td><td class=PParameter nowrap>context,</td></tr><tr><td></td><td class=PParameter nowrap> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style.OpenLayers.Style.SYMBOLIZER_PREFIXES"></a>OpenLayers.<span class=HB> </span>Style.<span class=HB> </span>SYMBOLIZER_PREFIXES</h3><div class=CBody><p>{Array} prefixes of the sld symbolizers.  These are the same as the main geometry types</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Contains convenience functions for string manipulation.</div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents an SLD Rule, as being used for rule-based SLD styling.</div></div><div class=CToolTip id="tt3"><div class=CProperty>{Object} hash of style properties to use as default for merging rule-based style symbolizers onto. </div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cell [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Style2-js.html b/doc/devdocs/files/OpenLayers/Style2-js.html
new file mode 100644
index 0000000..8075055
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Style2-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Style2 - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Style2"></a>OpenLayers.<span class=HB> </span>Style2</h1><div class=CBody><p>This class represents a collection of rules for rendering features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Style2" >OpenLayers.<span class=HB> [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.id"></a>id</h3><div class=CBody><p>{String} A unique id for this session.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.name"></a>name</h3><div class=CBody><p>{String} Style identifier.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.title"></a>title</h3><div class=CBody><p>{String} Title of this style.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.description"></a>description</h3><div class=CBody><p>{String} Description of this style.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.layerName"></a>layerName</h3><div class=CBody><p>{<a href="BaseTypes-js.html#OpenLayers.String" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">String</a>} Name of the layer that this style belongs to, usually according to the NamedLayer attribute of an SLD document.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.isDefault"></a>isDefault</h3><div class=CBody><p>{Boolean}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.rules"></a>rules</h3><div class=CBody><p>{Array(<a href="Rule-js.html#OpenLayers.Rule" class=LClass id=link6 onMouseOver="ShowTip(event, 'tt2', 'link6')" onMouseOut="HideTip('tt2')">OpenLayers.Rule</a>)} Collection of rendering rules.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.OpenLayers.Style2"></a>OpenLayers.<span class=HB> </span>Style2</h3><div class=CBody><p>Creates a style representing a collection of rendering rules.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the style.   Any documented prop [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Style2.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Clones this style.</p><h4 class=CHeading>Returns</h4><p>{<a href="#OpenLayers.Style2.OpenLayers.Style2" class=LConstructor id=link8 onMouseOver="ShowTip(event, 'tt5', 'link8')" onMouseOut="HideTip('tt5')">OpenLayers.Style2</a>} Clone of t [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Contains convenience functions for string manipulation.</div></div><div class=CToolTip id="tt2"><div class=CClass>This class represents an SLD Rule, as being used for rule-based SLD styling.</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory le [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/StyleMap-js.html b/doc/devdocs/files/OpenLayers/StyleMap-js.html
new file mode 100644
index 0000000..b18e056
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/StyleMap-js.html
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.StyleMap - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.StyleMap"></a>OpenLayers.<span class=HB> </span>StyleMap</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.StyleMap" >OpenLayers.<span class=HB> </span>StyleMap</a></td><td class=SDescription></td></tr><tr class= [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.styles"></a>styles</h3><div class=CBody><p>Hash of {<a href="Style-js.html#OpenLayers.Style" class=LClass id=link5 onMouseOver="ShowTip(event, 'tt1', 'link5')" onMouseOut="HideTip('tt1')">OpenLayers.Style</a>}, keyed by names of well known rendering intents (e.g.  “default”, “temporary”, “select”, “delete”).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.extendDefault"></a>extendDefault</h3><div class=CBody><p>{Boolean} if true, every render intent will extend the symbolizers specified for the “default” intent at rendering time.  Otherwise, every rendering intent will be treated as a completely independent style.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.OpenLayers.StyleMap"></a>OpenLayers.<span class=HB> </span>StyleMap</h3><div class=CBody><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>style</td><td class=CDLDescription>{Object} Optional.  Either a style hash, or a style object, or a hash of style objects (style hashes) keyed by rendering intent.  If just one st [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.createSymbolizer"></a>createSymbolizer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>createSymbolizer: function(</td><td class=PParameter nowrap>feature,</td></tr><tr><td></td><td class=PParameter nowrap>intent</td><td class=PAfterParameters nowrap>)</td></tr></table [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.StyleMap.addUniqueValueRules"></a>addUniqueValueRules</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addUniqueValueRules: function(</td><td class=PParameter nowrap>renderIntent,</td></tr><tr><td></td><td class=PParameter nowrap>property,</td></tr><tr><td></td><td class=PParame [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This class represents a UserStyle obtained from a SLD, containing styling rules.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 c [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Symbolizer-js.html b/doc/devdocs/files/OpenLayers/Symbolizer-js.html
new file mode 100644
index 0000000..464403e
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Symbolizer-js.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer"></a>OpenLayers.<span class=HB> </span>Symbolizer</h1><div class=CBody><p>Base class representing a symbolizer used for feature rendering.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer" >OpenLayers.<span  [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.zIndex"></a>zIndex</h3><div class=CBody><p>{Number} The zIndex determines the rendering order for a symbolizer.  Symbolizers with larger zIndex values are rendered over symbolizers with smaller zIndex values.   Default is 0.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.OpenLayers.Symbolizer"></a>OpenLayers.<span class=HB> </span>Symbolizer</h3><div class=CBody><p>Instances of this class are not useful.   See one of the subclasses.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the symbolize [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote><p>Create a copy of this symbolizer.</p><p>Returns a symbolizer of the same type with the same properties.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clone: function()</td></tr></table></blockquote>Create a copy of this symbolizer.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Symbolizer/Line-js.html b/doc/devdocs/files/OpenLayers/Symbolizer/Line-js.html
new file mode 100644
index 0000000..c50b494
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Symbolizer/Line-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Line - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Line"></a>OpenLayers.<span class=HB> </span>Symbolizer.Line</h1><div class=CBody><p>A symbolizer used to render line features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Line" >OpenLayers.<span class=H [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeColor"></a>strokeColor</h3><div class=CBody><p>{String} Color for line stroke.   This is a RGB hex value (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeOpacity"></a>strokeOpacity</h3><div class=CBody><p>{Number} Stroke opacity (0-1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeWidth"></a>strokeWidth</h3><div class=CBody><p>{Number} Pixel stroke width.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeLinecap"></a>strokeLinecap</h3><div class=CBody><p>{String} Stroke cap type (“butt”, “round”, or “square”).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.strokeDashstyle"></a>strokeDashstyle</h3><div class=CBody><p>{String} Stroke dash style according to the SLD spec.  Note that the OpenLayers values for strokeDashstyle (“dot”, “dash”, “dashdot”, “longdash”, “longdashdot”, or “solid”) will not work in SLD, but most SLD patterns will render correctly in OpenLayers.</p></d [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Line.OpenLayers.Symbolizer.Line"></a>OpenLayers.<span class=HB> </span>Symbolizer.Line</h3><div class=CBody><p>Create a symbolizer for rendering lines.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the symbolizer.   Any docu [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Symbolizer/Point-js.html b/doc/devdocs/files/OpenLayers/Symbolizer/Point-js.html
new file mode 100644
index 0000000..b6a2d44
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Symbolizer/Point-js.html
@@ -0,0 +1,77 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Point - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Point"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Point</h1><div class=CBody><p>A symbolizer used to render point features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Point [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeColor"></a>strokeColor</h3><div class=CBody><p>{String} Color for line stroke.   This is a RGB hex value (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeOpacity"></a>strokeOpacity</h3><div class=CBody><p>{Number} Stroke opacity (0-1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeWidth"></a>strokeWidth</h3><div class=CBody><p>{Number} Pixel stroke width.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeLinecap"></a>strokeLinecap</h3><div class=CBody><p>{String} Stroke cap type (“butt”, “round”, or “square”).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.strokeDashstyle"></a>strokeDashstyle</h3><div class=CBody><p>{String} Stroke dash style according to the SLD spec.  Note that the OpenLayers values for strokeDashstyle (“dot”, “dash”, “dashdot”, “longdash”, “longdashdot”, or “solid”) will not work in SLD, but most SLD patterns will render correctly in OpenLayers.</p></ [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.fillColor"></a>fillColor</h3><div class=CBody><p>{String} RGB hex fill color (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.fillOpacity"></a>fillOpacity</h3><div class=CBody><p>{Number} Fill opacity (0-1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.pointRadius"></a>pointRadius</h3><div class=CBody><p>{Number} Pixel point radius.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.externalGraphic"></a>externalGraphic</h3><div class=CBody><p>{String} Url to an external graphic that will be used for rendering points.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicWidth"></a>graphicWidth</h3><div class=CBody><p>{Number} Pixel width for sizing an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicHeight"></a>graphicHeight</h3><div class=CBody><p>{Number} Pixel height for sizing an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicOpacity"></a>graphicOpacity</h3><div class=CBody><p>{Number} Opacity (0-1) for an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicXOffset"></a>graphicXOffset</h3><div class=CBody><p>{Number} Pixel offset along the positive x axis for displacing an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicYOffset"></a>graphicYOffset</h3><div class=CBody><p>{Number} Pixel offset along the positive y axis for displacing an external graphic.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.rotation"></a>rotation</h3><div class=CBody><p>{Number} The rotation of a graphic in the clockwise direction about its center point (or any point off center as specified by <a href="#OpenLayers.Symbolizer.Point.graphicXOffset" class=LProperty id=link3 onMouseOver="ShowTip(event, 'tt1', 'link3')" onMouseOut="HideTip('tt1')">graphicXOffset</a> and <a href="#OpenLayers.Symbolizer.Point.graphicYOff [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.graphicName"></a>graphicName</h3><div class=CBody><p>{String} Named graphic to use when rendering points.   Supported values include “circle”, “square”, “star”, “x”, “cross”, and “triangle”.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Point.OpenLayers.Symbolizer.Point"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Point</h3><div class=CBody><p>Create a symbolizer for rendering points.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>{Number} Pixel offset along the positive x axis for displacing an external graphic.</div></div><div class=CToolTip id="tt2"><div class=CProperty>{Number} Pixel offset along the positive y axis for displacing an external graphic.</div></div><!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Symbolizer/Polygon-js.html b/doc/devdocs/files/OpenLayers/Symbolizer/Polygon-js.html
new file mode 100644
index 0000000..243f59b
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Symbolizer/Polygon-js.html
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Polygon - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Polygon"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Polygon</h1><div class=CBody><p>A symbolizer used to render line features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Po [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeColor"></a>strokeColor</h3><div class=CBody><p>{String} Color for line stroke.   This is a RGB hex value (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeOpacity"></a>strokeOpacity</h3><div class=CBody><p>{Number} Stroke opacity (0-1).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeWidth"></a>strokeWidth</h3><div class=CBody><p>{Number} Pixel stroke width.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeLinecap"></a>strokeLinecap</h3><div class=CBody><p>{String} Stroke cap type (“butt”, “round”, or “square”).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.strokeDashstyle"></a>strokeDashstyle</h3><div class=CBody><p>{String} Stroke dash style according to the SLD spec.  Note that the OpenLayers values for strokeDashstyle (“dot”, “dash”, “dashdot”, “longdash”, “longdashdot”, or “solid”) will not work in SLD, but most SLD patterns will render correctly in OpenLayers.</p> [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.fillColor"></a>fillColor</h3><div class=CBody><p>{String} RGB hex fill color (e.g.  “#ff0000” for red).</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.fillOpacity"></a>fillOpacity</h3><div class=CBody><p>{Number} Fill opacity (0-1).</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Polygon.OpenLayers.Symbolizer.Polygon"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Polygon</h3><div class=CBody><p>Create a symbolizer for rendering polygons.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Symbolizer/Raster-js.html b/doc/devdocs/files/OpenLayers/Symbolizer/Raster-js.html
new file mode 100644
index 0000000..bb910b1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Symbolizer/Raster-js.html
@@ -0,0 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Raster - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Raster"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Raster</h1><div class=CBody><p>A symbolizer used to render raster images.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Rast [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Raster.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Raster.OpenLayers.Symbolizer.Raster"></a>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Raster</h3><div class=CBody><p>Create a symbolizer for rendering rasters.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Symbolizer/Text-js.html b/doc/devdocs/files/OpenLayers/Symbolizer/Text-js.html
new file mode 100644
index 0000000..4020df9
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Symbolizer/Text-js.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Symbolizer.Text - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Symbolizer.Text"></a>OpenLayers.<span class=HB> </span>Symbolizer.Text</h1><div class=CBody><p>A symbolizer used to render text labels for features.</p><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Symbolizer.Text" >OpenLayers.<s [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.label"></a>label</h3><div class=CBody><p>{String} The text for the label.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.fontFamily"></a>fontFamily</h3><div class=CBody><p>{String} The font family for the label.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.fontSize"></a>fontSize</h3><div class=CBody><p>{String} The font size for the label.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.fontWeight"></a>fontWeight</h3><div class=CBody><p>{String} The font weight for the label.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.fontStyle"></a>fontStyle</h3><div class=CBody><p>{String} The font style for the label.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Symbolizer.Text.OpenLayers.Symbolizer.Text"></a>OpenLayers.<span class=HB> </span>Symbolizer.Text</h3><div class=CBody><p>Create a symbolizer for rendering text labels.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>config</td><td class=CDLDescription>{Object} An object containing properties to be set on the symbolizer.   An [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([32, 33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Tile-js.html b/doc/devdocs/files/OpenLayers/Tile-js.html
new file mode 100644
index 0000000..59a0bb1
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Tile-js.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tile - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tile"></a>OpenLayers.Tile</h1><div class=CBody><p>This is a class designed to designate a single tile, however 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 <a href="#Ope [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.EVENT_TYPES"></a>EVENT_TYPES</h3><div class=CBody><p>{Array(String)} Supported application event types</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.events"></a>events</h3><div class=CBody><p>{<a href="Events-js.html#OpenLayers.Events" class=LClass >OpenLayers.Events</a>} An events object that handles all events on the tile.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.id"></a>id</h3><div class=CBody><p>{String} null</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.layer"></a>layer</h3><div class=CBody><p>{<a href="Layer-js.html#OpenLayers.Layer" class=LClass >OpenLayers.Layer</a>} layer the tile is attached to</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.url"></a>url</h3><div class=CBody><p>{String} url of the request.</p><p>TBD 3.0 Deprecated.  The base tile class does not need an url.  This should be handled in subclasses.  Does not belong here.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.bounds"></a>bounds</h3><div class=CBody><p>{<a href="BaseTypes/Bounds-js.html#OpenLayers.Bounds" class=LClass id=link15 onMouseOver="ShowTip(event, 'tt1', 'link15')" onMouseOut="HideTip('tt1')">OpenLayers.Bounds</a>} null</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.size"></a>size</h3><div class=CBody><p>{<a href="BaseTypes/Size-js.html#OpenLayers.Size" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt2', 'link16')" onMouseOut="HideTip('tt2')">OpenLayers.Size</a>} null</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.position"></a>position</h3><div class=CBody><p>{<a href="BaseTypes/Pixel-js.html#OpenLayers.Pixel" class=LClass id=link17 onMouseOver="ShowTip(event, 'tt3', 'link17')" onMouseOut="HideTip('tt3')">OpenLayers.Pixel</a>} Top Left pixel of the tile</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.isLoading"></a>isLoading</h3><div class=CBody><p>{Boolean} Is the tile loading?</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.unload"></a>unload</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>unload: function()</td></tr></table></blockquote><p>Call immediately before destroying if you are listening to tile events, so that counters are properly handled if tile is still loading at destroy-time.  Will only fire an event if the tile is still loading.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy:function()</td></tr></table></blockquote><p>Nullify references to prevent circular references and memory leaks.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 ce [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>Clear whatever is currently in the tile, then return whether or not it should actually be re-drawn.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Whether or not the tile should actually be drawn.  Note that this is not really the best wa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.moveTo"></a>moveTo</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>moveTo: function (</td><td class=PParameter nowrap>bounds,</td></tr><tr><td></td><td class=PParameter nowrap>position,</td></tr><tr><td></td><td class=PParameter nowrap>redraw</td><td class=PAfterParameters [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear the tile of any bounds/position-related data so that it can be reused in a new location.  To be implemented by subclasses.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.getBoundsFromBaseLayer"></a>getBoundsFromBaseLayer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>getBoundsFromBaseLayer: function(</td><td class=PParameter nowrap>position</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Take the [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.showTile"></a>showTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>showTile: function()</td></tr></table></blockquote><p>Show the tile only if it should be drawn.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.show"></a>show</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote><p>Show the tile.   To be implemented by subclasses.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.hide"></a>hide</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>hide: function()</td></tr></table></blockquote><p>Hide the tile.   To be implemented by subclasses.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([31, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Instances of this class represent bounding boxes. </div></div><div class=CToolTip id="tt2"><div class=CClass>Instances of this class represent a width/height pair</div></div><div class=CToolTip id="tt3"><div class=CClass>This class represents a screen coordinate, in x and y coordinates</div></div><div class=CToolTip id="tt4"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>unload: function( [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Tile/Image-js.html b/doc/devdocs/files/OpenLayers/Tile/Image-js.html
new file mode 100644
index 0000000..27d8738
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Tile/Image-js.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tile.Image - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tile.Image"></a>OpenLayers.<span class=HB> </span>Tile.<span class=HB> </span>Image</h1><div class=CBody><p>Instances of OpenLayers.Tile.Image are used to manage the image tiles used by various layers.   Create a new image tile with the <a href="#OpenLayers.Tile.Image" class=LClass id=link14 onMouseOver="ShowTip(event, 'tt14', 'link14')" onMouseOut="HideTip('tt14')">OpenLayers.Til [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.url"></a>url</h3><div class=CBody><p>{String} The URL of the image being requested.  No default.  Filled in by layer.getURL() function.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.imgDiv"></a>imgDiv</h3><div class=CBody><p>{DOMElement} The div element which wraps the image.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.frame"></a>frame</h3><div class=CBody><p>{DOMElement} The image element is appended to the frame.   Any gutter on the image will be hidden behind the frame.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.layerAlphaHack"></a>layerAlphaHack</h3><div class=CBody><p>{Boolean} True if the png alpha hack needs to be applied on the layer’s div.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.isBackBuffer"></a>isBackBuffer</h3><div class=CBody><p>{Boolean} Is this tile a back buffer tile?</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.lastRatio"></a>lastRatio</h3><div class=CBody><p>{Float} Used in transition code only.   This is the previous ratio of the back buffer tile resolution to the map resolution.   Compared with the current ratio to determine if zooming occurred.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.isFirstDraw"></a>isFirstDraw</h3><div class=CBody><p>{Boolean} Is this the first time the tile is being drawn?  This is used to force resetBackBuffer to synchronize the backBufferTile with the foreground tile the first time the foreground tile loads so that if the user zooms before the layer has fully loaded, the backBufferTile for tiles that have been loaded can be used.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.backBufferTile"></a>backBufferTile</h3><div class=CBody><p>{<a href="../Tile-js.html#OpenLayers.Tile" class=LClass id=link16 onMouseOver="ShowTip(event, 'tt1', 'link16')" onMouseOut="HideTip('tt1')">OpenLayers.Tile</a>} A clone of the tile used to create transition effects when the tile is moved or changes resolution.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacin [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw: function()</td></tr></table></blockquote><p>Check that a tile should be drawn, and draw it.</p><h4 class=CHeading>Returns</h4><p>{Boolean} Always returns true.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.resetBackBuffer"></a>resetBackBuffer</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>resetBackBuffer: function()</td></tr></table></blockquote><p>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 foreground til [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.renderTile"></a>renderTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>renderTile: function()</td></tr></table></blockquote><p>Internal function to actually initialize the image tile, position it correctly, and set its url.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.positionImage"></a>positionImage</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>positionImage: function()</td></tr></table></blockquote><p>Using the properties currenty set on the layer, position the tile correctly.  This method is used both by the async and non-async versions of the Tile.Image code.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear the tile of any bounds/position-related data so that it can be reused in a new location.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.initImgDiv"></a>initImgDiv</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initImgDiv: function()</td></tr></table></blockquote><p>Creates the imgDiv property on the tile.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.checkImgURL"></a>checkImgURL</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>checkImgURL: function ()</td></tr></table></blockquote><p>Make sure that the image that just loaded is the one this tile is meant to display, since panning/zooming might have changed the tile’s URL in the meantime.  If the tile URL did change before the image lo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.startTransition"></a>startTransition</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>startTransition: function()</td></tr></table></blockquote><p>This method is invoked on tiles that are backBuffers for tiles in the grid.   The grid tile is about to be cleared and a new tile source loaded.   This is where the transition effect needs to be [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.show"></a>show</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>show: function()</td></tr></table></blockquote><p>Show the tile by showing its frame.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.hide"></a>hide</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>hide: function()</td></tr></table></blockquote><p>Hide the tile by hiding its frame.</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([31, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>This is a class designed to designate a single tile, however it is explicitly designed to do relatively little. </div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory leaks</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote>< [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Tile/Image/IFrame-js.html b/doc/devdocs/files/OpenLayers/Tile/Image/IFrame-js.html
new file mode 100644
index 0000000..bf0a1c5
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Tile/Image/IFrame-js.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tile.Image.IFrame - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../../styles/main.css"><script language=JavaScript src="../../../../javascript/main.js"></script><script language=JavaScript src="../../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tile.Image.IFrame"></a>OpenLayers.<span class=HB> </span>Tile.<span class=HB> </span>Image.<span class=HB> </span>IFrame</h1><div class=CBody><p>Instances of OpenLayers.Tile.Image.IFrame are used to manage the image tiles used by Layer.WMS.Post loaded via HTTP-POST-protocol.  Create a new image tile with the <a href="#OpenLayers.Tile.Image.IFrame.OpenLayers.Tile.Image.IFrame" clas [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.layerAlphaHack"></a>layerAlphaHack</h3><div class=CBody><p>{Boolean} Always false for an instance.</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.OpenLayers.Tile.Image.IFrame"></a>OpenLayers.<span class=HB> </span>Tile.<span class=HB> </span>Image.<span class=HB> </span>IFrame</h3><div class=CBody><p>Constructor for a new <a href="#OpenLayers.Tile.Image.IFrame.OpenLayers.Tile.Image.IFrame" class=LConstructor id=link12 onMouseOver="ShowTip(event, 'tt1', 'link12')" onMouseOut="HideTip('tt1')">OpenLayers.Tile.Image.IFrame</a> instance.< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Removes the iframe from DOM (avoids back-button problems).</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.clone"></a>clone</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>clone: function (</td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cel [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.renderTile"></a>renderTile</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>renderTile: function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.initImgDiv"></a>initImgDiv</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>initImgDiv: function()</td></tr></table></blockquote><p>Creates the imgDiv property on the tile.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.createImgDiv"></a>createImgDiv</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createImgDiv: function()</td></tr></table></blockquote><p>Creates a div with iframe.and eventPane</p><h4 class=CHeading>Returns</h4><p>{DOMElement}</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.createIFrame"></a>createIFrame</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createIFrame: function()</td></tr></table></blockquote><p>Create the IFrame which shows the image.</p><h4 class=CHeading>Returns</h4><p>{DOMElement} Iframe</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.Image.IFrame.createRequestForm"></a>createRequestForm</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>createRequestForm: function()</td></tr></table></blockquote><p>Create the html <form> element with width, height, bbox and all parameters specified in the layer params.</p><h4 class=CHeading>Returns</h4><p>{DOMElement} The form element which sends  [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([31, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Constructor for a new OpenLayers.Tile.Image.IFrame instance.</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and memory leaks</div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 cla [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Tile/WFS-js.html b/doc/devdocs/files/OpenLayers/Tile/WFS-js.html
new file mode 100644
index 0000000..1d6f161
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Tile/WFS-js.html
@@ -0,0 +1,63 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tile.WFS - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../../styles/main.css"><script language=JavaScript src="../../../javascript/main.js"></script><script language=JavaScript src="../../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tile.WFS"></a>OpenLayers.<span class=HB> </span>Tile.WFS</h1><div class=CBody><p>Instances of OpenLayers.Tile.WFS are used to manage the image tiles used by various layers.   Create a new image tile with the <a href="#OpenLayers.Tile.WFS" class=LClass id=link10 onMouseOver="ShowTip(event, 'tt10', 'link10')" onMouseOut="HideTip('tt10')">OpenLayers.Tile.WFS</a> constructor.</p><h4 c [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.features"></a>features</h3><div class=CBody><p>{Array(<a href="../Feature-js.html#OpenLayers.Feature" class=LClass id=link12 onMouseOver="ShowTip(event, 'tt1', 'link12')" onMouseOut="HideTip('tt1')">OpenLayers.Feature</a>)} list of features in this tile</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.url"></a>url</h3><div class=CBody><p>{String}</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.request"></a>request</h3><div class=CBody><p>{<a href="../Request/XMLHttpRequest-js.html#OpenLayers.Request.XMLHttpRequest" class=LClass id=link13 onMouseOver="ShowTip(event, 'tt2', 'link13')" onMouseOut="HideTip('tt2')">OpenLayers.Request.XMLHttpRequest</a>}</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.destroy"></a>destroy</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote><p>nullify references to prevent circular references and memory leaks</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.clear"></a>clear</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>clear: function()</td></tr></table></blockquote><p>Clear the tile of any bounds/position-related data so that it can be reused in a new location.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.draw"></a>draw</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>draw:function()</td></tr></table></blockquote><p>Check that a tile should be drawn, and load features for it.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.loadFeaturesForRegion"></a>loadFeaturesForRegion</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>loadFeaturesForRegion:function(</td><td class=PParameter nowrap>success,</td></tr><tr><td></td><td class=PParameter nowrap>failure</td><td class=PAfterParameters nowrap>)</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.requestSuccess"></a>requestSuccess</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>requestSuccess:function(</td><td class=PParameter nowrap>request</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Called on return from request  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.addResults"></a>addResults</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>addResults: function(</td><td class=PParameter nowrap>results</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Construct new feature via layer featureCl [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tile.WFS.destroyAllFeatures"></a>destroyAllFeatures</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroyAllFeatures: function()</td></tr></table></blockquote><p>Iterate through and call destroy() on each feature, removing it from the local array</p></div></div></div>
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div clas [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([31, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>Features are combinations of geography and attributes. </div></div><div class=CToolTip id="tt2"><div class=CClass>Standard-compliant (W3C) cross-browser implementation of the XMLHttpRequest object. </div></div><div class=CToolTip id="tt3"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>destroy: function()</td></tr></table></blockquote>nullify references to prevent circular references and m [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Tween-js.html b/doc/devdocs/files/OpenLayers/Tween-js.html
new file mode 100644
index 0000000..6958528
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Tween-js.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>OpenLayers.Tween - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="OpenLayers.Tween"></a>OpenLayers.<span class=HB> </span>Tween</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#OpenLayers.Tween" >OpenLayers.<span class=HB> </span>Tween</a></td><td class=SDescription></td></tr><tr class="SGroup SInd [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.INTERVAL"></a>INTERVAL</h3><div class=CBody><p>{int} Interval in milliseconds between 2 steps</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.Properties"></a>Properties</h3></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.easing"></a>easing</h3><div class=CBody><p>{<OpenLayers.Easing>(Function)} Easing equation used for the animation Defaultly set to OpenLayers.Easing.Expo.easeOut</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.begin"></a>begin</h3><div class=CBody><p>{Object} Values to start the animation with</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.finish"></a>finish</h3><div class=CBody><p>{Object} Values to finish the animation with</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.duration"></a>duration</h3><div class=CBody><p>{int} duration of the tween (number of steps)</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.callbacks"></a>callbacks</h3><div class=CBody><p>{Object} An object with start, eachStep and done properties whose values are functions to be call during the animation.  They are passed the current computed value as argument.</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.time"></a>time</h3><div class=CBody><p>{int} Step counter</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.interval"></a>interval</h3><div class=CBody><p>{int} Interval id returned by window.setInterval</p></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.playing"></a>playing</h3><div class=CBody><p>{Boolean} Tells if the easing is currently playing</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.Constructor"></a>Constructor</h3></div></div>
+
+<div class="CConstructor"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.OpenLayers.Tween"></a>OpenLayers.<span class=HB> </span>Tween</h3><div class=CBody><p>Creates a Tween.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>easing</td><td class=CDLDescription>{<OpenLayers.Easing>(Function)} easing function method to use</td></tr></table></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.start"></a>start</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>start: function(</td><td class=PParameter nowrap>begin,</td></tr><tr><td></td><td class=PParameter nowrap>finish,</td></tr><tr><td></td><td class=PParameter nowrap>duration,</td></tr><tr><td></td><td class=P [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.stop"></a>stop</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>stop: function()</td></tr></table></blockquote><p>Stops the Tween, and calls the done callback Doesn’t do anything if animation is already finished</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Tween.play"></a>play</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>play: function()</td></tr></table></blockquote><p>Calls the appropriate easing method</p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Easing"></a>OpenLayers.<span class=HB> </span>Easing</h2><div class=CBody><h4 class=CHeading>Credits</h4><p>Easing Equations by Robert Penner, <a href="http://www.robertpenner.com/easing/" class=LURL target=_top>http://www.robertpenner.com/easing/</a></p></div></div></div>
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Easing.Linear"></a>OpenLayers.<span class=HB> </span>Easing.<span class=HB> </span>Linear</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Easing.Linear.Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SI [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Linear.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Linear.easeIn"></a>easeIn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeIn: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class=PParam [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Linear.easeOut"></a>easeOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeOut: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class=PPa [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Linear.easeInOut"></a>easeInOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeInOut: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td cla [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Easing.Expo"></a>OpenLayers.<span class=HB> </span>Easing.Expo</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Easing.Expo.Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEn [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Expo.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Expo.easeIn"></a>easeIn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeIn: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class=PParamet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Expo.easeOut"></a>easeOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeOut: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class=PPara [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Expo.easeInOut"></a>easeInOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeInOut: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class [...]
+
+<div class="CClass"><div class=CTopic><h2 class=CTitle><a name="OpenLayers.Easing.Quad"></a>OpenLayers.<span class=HB> </span>Easing.Quad</h2><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SGroup"><td class=SEntry><a href="#OpenLayers.Easing.Quad.Functions" >Functions</a></td><td class=SDescription></td></tr><tr class="SFunction SIndent1 SMarked"><td class=SEn [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Quad.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Quad.easeIn"></a>easeIn</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeIn: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class=PParamet [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Quad.easeOut"></a>easeOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeOut: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class=PPara [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="OpenLayers.Easing.Quad.easeInOut"></a>easeInOut</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeInOut: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>start: function(</td><td class=PParameter nowrap>begin,</td></tr><tr><td></td><td class=PParameter nowrap>finish,</td></tr><tr><td></td><td class=PParameter nowrap>duration,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></t [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/files/OpenLayers/Util-js.html b/doc/devdocs/files/OpenLayers/Util-js.html
new file mode 100644
index 0000000..3c9efd0
--- /dev/null
+++ b/doc/devdocs/files/OpenLayers/Util-js.html
@@ -0,0 +1,153 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Util - OpenLayers</title><link rel="stylesheet" type="text/css" href="../../styles/main.css"><script language=JavaScript src="../../javascript/main.js"></script><script language=JavaScript src="../../javascript/searchdata.js"></script></head><body class="ContentPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Content><div class="CClass"><div class=CTopic id=MainTopic><h1 class=CTitle><a name="Util"></a>Util</h1><div class=CBody><!--START_ND_SUMMARY--><div class=Summary><div class=STitle>Summary</div><div class=SBorder><table border=0 cellspacing=0 cellpadding=0 class=STable><tr class="SMain"><td class=SEntry><a href="#Util" >Util</a></td><td class=SDescription></td></tr><tr class="SGroup SIndent1"><td class=SEntry><a href="#Util.Functions_and_Properties" >Functions and Properties</a>< [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Util.Functions_and_Properties"></a>Functions and Properties</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getElement"></a>getElement</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.getElement = function()</td></tr></table></blockquote><p>This is the old $() from prototype</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.isElement"></a>isElement</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.isElement = function(</td><td class=PParameter nowrap>o</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>A cross-browser implementation of “e insta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.extend"></a>extend</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.extend = function(</td><td class=PParameter nowrap>destination,</td></tr><tr><td></td><td class=PParameter nowrap>source</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.removeItem"></a>removeItem</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.removeItem = function(</td><td class=PParameter nowrap>array,</td></tr><tr><td></td><td class=PParameter nowrap>item</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.clearArray"></a>clearArray</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.clearArray = function(</td><td class=PParameter nowrap>array</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p><b>Deprecated</b>.  This function wi [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.indexOf"></a>indexOf</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.indexOf = function(</td><td class=PParameter nowrap>array,</td></tr><tr><td></td><td class=PParameter nowrap>obj</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquot [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.modifyDOMElement"></a>modifyDOMElement</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.modifyDOMElement = function(</td><td class=PParameter nowrap>element,</td></tr><tr><td></td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>px,</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.createDiv"></a>createDiv</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.createDiv = function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>px,</td></tr><tr><td></td><td class=PParameter nowrap>sz,</td></tr><tr><td></td><td cla [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.createImage"></a>createImage</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.createImage = function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>px,</td></tr><tr><td></td><td class=PParameter nowrap>sz,</td></tr><tr><td></td>< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.setOpacity"></a>setOpacity</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.setOpacity = function(</td><td class=PParameter nowrap>element,</td></tr><tr><td></td><td class=PParameter nowrap>opacity</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ta [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.onImageLoad"></a>onImageLoad</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.onImageLoad = function()</td></tr></table></blockquote><p>Bound to image load events.   For all images created with <a href="#Util.createImage" class=LFunction id=link52 onMouseOver="ShowTip(event, 'tt9', 'link52')" onMouseOut="HideTip('tt9')">createImage</a> or <a hre [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="Util.IMAGE_RELOAD_ATTEMPTS"></a>IMAGE_RELOAD_ATTEMPTS</h3><div class=CBody><p>{Integer} How many times should we try to reload an image before giving up?  Default is 0</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.onImageLoadError"></a>onImageLoadError</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.onImageLoadError = function()</td></tr></table></blockquote></div></div></div>
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="Util.alphaHackNeeded"></a>alphaHackNeeded</h3><div class=CBody><p>{Boolean} true if the png alpha hack is necessary and possible, false otherwise.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.alphaHack"></a>alphaHack</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.alphaHack = function()</td></tr></table></blockquote><p>Checks whether it’s necessary (and possible) to use the png alpha hack which allows alpha transparency for png images under Internet Explorer.</p><h4 class=CHeading>Returns</h4><p>{Boolean} true if the png alpha hack [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.modifyAlphaImageDiv"></a>modifyAlphaImageDiv</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.modifyAlphaImageDiv = function(</td><td class=PParameter nowrap>div,</td></tr><tr><td></td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>px [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.createAlphaImageDiv"></a>createAlphaImageDiv</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.createAlphaImageDiv = function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>px,</td></tr><tr><td></td><td class=PParameter nowrap>sz, [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.upperCaseObject"></a>upperCaseObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.upperCaseObject = function (</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Creates a new hashtable  [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.applyDefaults"></a>applyDefaults</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.applyDefaults = function (</td><td class=PParameter nowrap>to,</td></tr><tr><td></td><td class=PParameter nowrap>from</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getParameterString"></a>getParameterString</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getParameterString = function(</td><td class=PParameter nowrap>params</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.urlAppend"></a>urlAppend</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.urlAppend = function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>paramStr</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></ [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="Util.ImgPath"></a>ImgPath</h3><div class=CBody><p>{String} Default is ‘’.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getImagesLocation"></a>getImagesLocation</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.getImagesLocation = function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} The fully formatted image location string</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.Try"></a>Try</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.Try = function()</td></tr></table></blockquote><p>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()</p><h4 class=CHeading>Parameters</h4><table bord [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getNodes"></a>getNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getNodes=function(</td><td class=PParameter nowrap>p,</td></tr><tr><td></td><td class=PParameter nowrap>tagName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util._getNodes"></a>_getNodes</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util._getNodes=function(</td><td class=PParameter nowrap>nodes,</td></tr><tr><td></td><td class=PParameter nowrap>tagName</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getTagText"></a>getTagText</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getTagText = function (</td><td class=PParameter nowrap>parent,</td></tr><tr><td></td><td class=PParameter nowrap>item,</td></tr><tr><td></td><td class=PParameter nowrap>index</td><td class=PAf [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getXmlNodeValue"></a>getXmlNodeValue</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getXmlNodeValue = function(</td><td class=PParameter nowrap>node</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters< [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.mouseLeft"></a>mouseLeft</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.mouseLeft = function (</td><td class=PParameter nowrap>evt,</td></tr><tr><td></td><td class=PParameter nowrap>div</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></bloc [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="Util.precision"></a>precision</h3><div class=CBody><p>{Number} The number of significant digits to retain to avoid floating point precision errors.</p><p>We use 14 as a “safe” default because, although IEEE 754 double floats (standard on most modern operating systems) support up to about 16 significant digits, 14 significant digits are sufficient to represent sub-millimeter accuracy in any coordinate system th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.toFloat"></a>toFloat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.toFloat = function (</td><td class=PParameter nowrap>number,</td></tr><tr><td></td><td class=PParameter nowrap>precision</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.rad"></a>rad</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.rad = function(</td><td class=PParameter nowrap>x</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellp [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.deg"></a>deg</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.deg = function(</td><td class=PParameter nowrap>x</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellp [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="Util.VincentyConstants"></a>VincentyConstants</h3><div class=CBody><p>{Object} Constants for Vincenty functions.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.distVincenty"></a>distVincenty</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.distVincenty = function(</td><td class=PParameter nowrap>p1,</td></tr><tr><td></td><td class=PParameter nowrap>p2</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.destinationVincenty"></a>destinationVincenty</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.destinationVincenty = function(</td><td class=PParameter nowrap>lonlat,</td></tr><tr><td></td><td class=PParameter nowrap>brng,</td></tr><tr><td></td><td class=PParameter nowr [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getParameters"></a>getParameters</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getParameters = function(</td><td class=PParameter nowrap>url</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Parse the parameters from a URL or [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getArgs"></a>getArgs</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getArgs = function(</td><td class=PParameter nowrap>url</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p><b>Deprecated</b>.   Will be removed in 3.0.&nb [...]
+
+<div class="CProperty"><div class=CTopic><h3 class=CTitle><a name="Util.lastSeqID"></a>lastSeqID</h3><div class=CBody><p>{Integer} The ever-incrementing count variable.  Used for generating unique ids.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.createUniqueID"></a>createUniqueID</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.createUniqueID = function(</td><td class=PParameter nowrap>prefix</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Create a unique identifier f [...]
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Util.Constants"></a>Constants</h3></div></div>
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="Util.INCHES_PER_UNIT"></a>INCHES_PER_UNIT</h3><div class=CBody><p>{Object} Constant inches per unit -- borrowed from MapServer mapscale.c derivation of nautical miles from <a href="http://en.wikipedia.org/wiki/Nautical_mile" class=LURL target=_top>http://en.wikipedia.org/wiki/Nautical_mile</a> Includes the full set of units supported by CS-MAP (<a href="http://trac.osgeo.org/csmap/" class=LURL target=_top>http://trac.osge [...]
+
+<div class="CConstant"><div class=CTopic><h3 class=CTitle><a name="Util.DOTS_PER_INCH"></a>DOTS_PER_INCH</h3><div class=CBody><p>{Integer} 72 (A sensible default)</p></div></div></div>
+
+<div class="CGroup"><div class=CTopic><h3 class=CTitle><a name="Util.Functions"></a>Functions</h3></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.normalizeScale"></a>normalizeScale</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.normalizeScale = function (</td><td class=PParameter nowrap>scale</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><h4 class=CHeading>Parameters</ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getResolutionFromScale"></a>getResolutionFromScale</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getResolutionFromScale = function (</td><td class=PParameter nowrap>scale,</td></tr><tr><td></td><td class=PParameter nowrap>units</td><td class=PAfterParameters nowrap> [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getScaleFromResolution"></a>getScaleFromResolution</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getScaleFromResolution = function (</td><td class=PParameter nowrap>resolution,</td></tr><tr><td></td><td class=PParameter nowrap>units</td><td class=PAfterParameters no [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.safeStopPropagation"></a>safeStopPropagation</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.safeStopPropagation = function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p><b>Deprecated</b [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.pagePositon"></a>pagePositon</h3><div class=CBody><p>Calculates the position of an element on the page.</p><h4 class=CHeading>Parameters</h4><table border=0 cellspacing=0 cellpadding=0 class=CDescriptionList><tr><td class=CDLEntry>forElement</td><td class=CDLDescription>{DOMElement}</td></tr></table><h4 class=CHeading>Returns</h4><p>{Array} two item array, L value then T value.</p></div></div></div>
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.isEquivalentUrl"></a>isEquivalentUrl</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.isEquivalentUrl = function(</td><td class=PParameter nowrap>url1,</td></tr><tr><td></td><td class=PParameter nowrap>url2,</td></tr><tr><td></td><td class=PParameter nowrap>options</td [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.createUrlObject"></a>createUrlObject</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.createUrlObject = function(</td><td class=PParameter nowrap>url,</td></tr><tr><td></td><td class=PParameter nowrap>options</td><td class=PAfterParameters nowrap>)</td></tr></table></t [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.removeTail"></a>removeTail</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.removeTail = function(</td><td class=PParameter nowrap>url</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><p>Takes a url and removes everything after th [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getBrowserName"></a>getBrowserName</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.getBrowserName = function()</td></tr></table></blockquote><h4 class=CHeading>Returns</h4><p>{String} A string which specifies which is the current browser in which we are running.</p><h4 class=CHeading>Currently-supported browser detection and codes</h4><ul><li>&rsquo [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getRenderedDimensions"></a>getRenderedDimensions</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getRenderedDimensions = function(</td><td class=PParameter nowrap>contentHTML,</td></tr><tr><td></td><td class=PParameter nowrap>size,</td></tr><tr><td></td><td class=PPar [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getScrollbarWidth"></a>getScrollbarWidth</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.getScrollbarWidth = function()</td></tr></table></blockquote><p>This function has been modified by the OpenLayers from the original version, written by Matthew Eernisse and released under the Apache 2 license here:</p><p><a href="http://www.fleegix.org/articles/ [...]
+
+<div class="CFunction"><div class=CTopic><h3 class=CTitle><a name="Util.getFormattedLonLat"></a>getFormattedLonLat</h3><div class=CBody><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.getFormattedLonLat = function(</td><td class=PParameter nowrap>coordinate,</td></tr><tr><td></td><td class=PParameter nowrap>axis,</td></tr><tr><td></td><td class=PParameter now [...]
+
+</div><!--Content-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div class=M [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([33, 34], 36);// --></script></div><!--Menu-->
+
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>OpenLayers.Util.getElement = function()</td></tr></table></blockquote>This is the old $() from prototype</div></div><div class=CToolTip id="tt2"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.isElement = funct [...]
+
+
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index.html b/doc/devdocs/index.html
new file mode 100644
index 0000000..acf03fb
--- /dev/null
+++ b/doc/devdocs/index.html
@@ -0,0 +1 @@
+<html><head><meta http-equiv="Refresh" CONTENT="0; URL=files/OpenLayers-js.html"></head></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Classes.html b/doc/devdocs/index/Classes.html
new file mode 100644
index 0000000..345ff2c
--- /dev/null
+++ b/doc/devdocs/index/Classes.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Class Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Class Index</div><div class=INavigationBar>$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · <a href="#O">O</a> · P · Q · R · S · T · <a href="Classes2.html#U">U</a> · V · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class= [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CClass>The OpenLayers object provides a namespace for all things OpenLayers</div></div><div class=CToolTip id="tt2"><div class=CClass><b>Deprecated</b>. </div></div><div class=CToolTip id="tt3"><div class=CClass>{Object}</div></div><div class=CToolTip id="tt4"><div class=CClass>Contains convenience functions for array manipulation.</div></div><div class=CToolTip id="tt5"><div class=CClass>Instances of this class represent bounding boxes. </div></di [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Classes2.html b/doc/devdocs/index/Classes2.html
new file mode 100644
index 0000000..145ac51
--- /dev/null
+++ b/doc/devdocs/index/Classes2.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Class Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Class Index</div><div class=INavigationBar>$#! · 0-9 · A · B · C · D · E · F · G · H · I · J · K · L · M · N · <a href="Classes.html#O">O</a> · P · Q · R · S · T · <a href="#U">U</a> · V · W · X · Y · Z</div><table border=0 cellspacing=0 cellpadding=0><tr><td class=I [...]
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Constants.html b/doc/devdocs/index/Constants.html
new file mode 100644
index 0000000..0d9899e
--- /dev/null
+++ b/doc/devdocs/index/Constants.html
@@ -0,0 +1,102 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Constant Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Constant Index</div><div class=INavigationBar>$#! · 0-9 · A · <a href="#B">B</a> · <a href="#C">C</a> · <a href="#D">D</a> · <a href="#E">E</a> · <a href="#F">F</a> · G · H · <a href="#I">I</a> · J · <a href="#K">K</a> · <a href="#L">L</a> · <a href="#M">M</a> · N · <a href="#O">O</a> · P · Q · <a href="#R">R</a> · [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstant>{String}</div></div><div class=CToolTip id="tt2"><div class=CConstant>{Array(String)} supported events</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3"><div class=CConstant>{Integer} 5. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt4"><div class=CConstant>{Object} with the following keys</div></div><div class=CToolTip id="tt5"><div class=CConstant>{Object} Default configuration for all requests.</div></div><div class=CToolTip id="tt6"><div class=CConstant>{Object} Simple hash map to convert format to extension.</div></div><div class=CToolTip id="tt7"><div class=CConstant>{Object} Default layers properties.</div></div><div class=CToolTip id="tt8"><div class=CConstant>{Object} Hashtable of d [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt21"><div class=CConstant>{Array(String)} Supported application event types. </div></div><div class=CToolTip id="tt22"><div class=CConstant>{Array(String)} Supported application event types. </div></div><div class=CToolTip id="tt23"><div class=CConstant>{Array(String)} Supported application event types. </div></div><div class=CToolTip id="tt24"><div class=CConstant>{Array(String)} Supported application event types. </div></div><div class=CToolTip id="tt25"><div c [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt31"><div class=CConstant>{Object} Hashtable of parameter key/value pairs which describe the folder structure for tiles as configured in the mapguide serverconfig.ini section [TileServiceProperties]</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt32"><div class=CConstant>{Object} Simple hash map to convert format to extension.</div></div><div class=CToolTip id="tt33"><div class=CConstant>{Object} Constant inches per unit -- borrowed from MapServer mapscale.c derivation of nautical miles from http://en.wikipedia.org/wiki/Nautical_mile Includes the full set of units supported by CS-MAP (http://trac.osgeo.org/csmap/) and PROJ.4 (http://trac.osgeo.org/proj/) The hardcoded table is maintain in a CS-MAP source [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt35"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt36"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt37"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt38"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt39"><div class=CConstant>keydown, keypress, keyup</div></div><div class=CToolTip id="tt40"><div class=CConstant>{int}</div></div><div class=CToolTip id="tt41"><div class=CConstant>{int}</div></d [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt45"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt46"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt47"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt48"><div class=CConstant>{Object}</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt49"><div class=CConstant>{Integer} Firefox has a limitation where values larger or smaller than about 15000 in an SVG document lock the browser up. </div></div><div class=CToolTip id="tt50"><div class=CConstant>{Integer} 21</div></div><div class=CToolTip id="tt51"><div class=CConstant>{Integer} 17</div></div><div class=CToolTip id="tt52"><div class=CConstant>{Integer} 19</div></div><div class=CToolTip id="tt53"><div class=CConstant>{Integer} 17</div></div><div c [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt62"><div class=CConstant>{Object} Hashtable of default parameter key/value pairs for untiled layer</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt63"><div class=CConstant>{Integer} Constant used to make the control work in reshape mode</div></div><div class=CToolTip id="tt64"><div class=CConstant>{Integer} Constant used to make the control work in resize mode</div></div><div class=CToolTip id="tt65"><div class=CConstant>{Array} The properties that are used for calculating resolutions information.</div></div><div class=CToolTip id="tt66"><div class=CConstant>{Array(Float)} Hardcode these resolutions so tha [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt71"><div class=CConstant>Enumeration for service types</div></div><div class=CToolTip id="tt72"><div class=CConstant>{Object} Hashtable of default parameter key/value pairs for untiled layer</div></div><div class=CToolTip id="tt73"><div class=CConstant>OpenLayers features can have a number of style attributes. </div></div><div class=CToolTip id="tt74"><div class=CConstant>Coordinate arrays for well known (named) symbols.</div></div><div class=CToolTip id="tt75"> [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt76"><div class=CConstant>{Integer} 256 Default tile height (unless otherwise specified)</div></div><div class=CToolTip id="tt77"><div class=CConstant>{Object} Hashtable of default parameter key/value pairs for tiled layer</div></div><div class=CToolTip id="tt78"><div class=CConstant>{Integer} 256 Default tile width (unless otherwise specified)</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt79"><div class=CConstant>{Float} Used to hash URL param strings for multi-WMS server selection. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt80"><div class=CConstant>Mixin providing functionality specific to the Google Maps API v2.</div></div><div class=CToolTip id="tt81"><div class=CConstant>Mixin providing functionality specific to the Google Maps API v3. </div></div><div class=CToolTip id="tt82"><div class=CConstant>{String} 1.0.0</div></div><div class=CToolTip id="tt83"><div class=CConstant>{String} 1.1.0</div></div><div class=CToolTip id="tt84"><div class=CConstant>{String} 0.3.1</div></div><div [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt90"><div class=CConstant>{Integer}</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt91"><div class=CConstant>{Integer}</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt92"><div class=CConstant>{Object} Base z-indexes for different classes of thing</div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Constructor.html b/doc/devdocs/index/Constructor.html
new file mode 100644
index 0000000..6b32ad4
--- /dev/null
+++ b/doc/devdocs/index/Constructor.html
@@ -0,0 +1,90 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Constructor Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Constructor Index</div><div class=INavigationBar>$#! · 0-9 · <a href="#A">A</a> · <a href="#B">B</a> · <a href="#C">C</a> · <a href="#D">D</a> · <a href="#E">E</a> · <a href="#F">F</a> · <a href="#G">G</a> · <a href="#H">H</a> · <a href="#I">I</a> · <a href="#J">J</a> · <a href="#K">K</a> · <a href="#L">L</a> · <a href="#M">M</a> · <a href="#N">N</a [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CConstructor>Create a new ArcGIS93Rest layer object.</div></div><div class=CToolTip id="tt2"><div class=CConstructor>Create a new ArcIMS layer object.</div></div><div class=CToolTip id="tt3"><div class=CConstructor>Create a new parser/writer for ArcXML. </div></div><div class=CToolTip id="tt4"><div class=CConstructor>Create a new parser for Atom.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt5"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt6"><div class=CConstructor>Create a new BBOX strategy.</div></div><div class=CToolTip id="tt7"><div class=CConstructor>Construct a new bounds object.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt8"><div class=CConstructor>Base class used to construct all other classes. </div></div><div class=CToolTip id="tt9"><div class=CConstructor>Create a new click handler.</div></div><div class=CToolTip id="tt10"><div class=CConstructor>Create a new clustering strategy.</div></div><div class=CToolTip id="tt11"><div class=CConstructor>Creates a Geometry Collection -- a list of geoms.</div></div><div class=CToolTip id="tt12"><div class=CConstructor>Creates a compariso [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt15"><div class=CConstructor>Returns OpenLayers.Handler.Drag</div></div><div class=CToolTip id="tt16"><div class=CConstructor>Create a new control to drag features.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt17"><div class=CConstructor>Create an editing toolbar for a given layer.</div></div><div class=CToolTip id="tt18"><div class=CConstructor>Create a new event pane layer</div></div><div class=CToolTip id="tt19"><div class=CConstructor>Construct an OpenLayers.Events object.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt20"><div class=CConstructor>Constructor for features.</div></div><div class=CToolTip id="tt21"><div class=CConstructor>Creates an ogc:FeatureId rule.</div></div><div class=CToolTip id="tt22"><div class=CConstructor>Create a new parser/writer for ArcXML Features. </div></div><div class=CToolTip id="tt23"><div class=CConstructor>This is an abstract class. </div></div><div class=CToolTip id="tt24"><div class=CConstructor>Create a new parser for Filter.</div></div>< [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt29"><div class=CConstructor>Create a new parser for GeoJSON.</div></div><div class=CToolTip id="tt30"><div class=CConstructor>Creates a geometry object.</div></div><div class=CToolTip id="tt31"><div class=CConstructor>Create a new parser for GeoRSS.</div></div><div class=CToolTip id="tt32"><div class=CConstructor>Create a GeoRSS Layer.</div></div><div class=CToolTip id="tt33"><div class=CConstructor>Create a new control for fetching remote features.</div></div>< [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt39"><div class=CConstructor>Construct a handler.</div></div><div class=CToolTip id="tt40"><div class=CConstructor>Construct a hover handler.</div></div><div class=CToolTip id="tt41"><div class=CConstructor>A class for giving layers generic HTTP protocol.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt42"><div class=CConstructor>Creates an icon, which is an image tag in a div.</div></div><div class=CToolTip id="tt43"><div class=CConstructor>Constructor for a new OpenLayers.Tile.Image.IFrame instance.</div></div><div class=CToolTip id="tt44"><div class=CConstructor>Create a new image layer</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt45"><div class=CConstructor>Create a new parser for JSON.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt46"><div class=CConstructor>Returns a new keyboard handler.</div></div><div class=CToolTip id="tt47"><div class=CConstructor>Create a new parser for KML.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt48"><div class=CConstructor>Create a symbolizer for rendering lines.</div></div><div class=CToolTip id="tt49"><div class=CConstructor>Linear rings are constructed with an array of points. </div></div><div class=CToolTip id="tt50"><div class=CConstructor>Create a new LineString geometry</div></div><div class=CToolTip id="tt51"><div class=CConstructor>Creates a logical filter (And, Or, Not).</div></div><div class=CToolTip id="tt52"><div class=CConstructor>Create a [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt53"><div class=CConstructor>Constructor for a new OpenLayers.Map instance. </div></div><div class=CToolTip id="tt54"><div class=CConstructor>Create a new Mapguide layer, either tiled or untiled.</div></div><div class=CToolTip id="tt55"><div class=CConstructor>Create a new MapServer layer object</div></div><div class=CToolTip id="tt56"><div class=CConstructor>Create a Markers layer.</div></div><div class=CToolTip id="tt57"><div class=CConstructor>Create a new mod [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt61"><div class=CConstructor>Create a new navigation control</div></div><div class=CToolTip id="tt62"><div class=CConstructor>Add our two mousedefaults controls.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt63"><div class=CConstructor>Create a new parser for OSM.</div></div><div class=CToolTip id="tt64"><div class=CConstructor>Create a new overview map</div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Constructor2.html b/doc/devdocs/index/Constructor2.html
new file mode 100644
index 0000000..95756a0
--- /dev/null
+++ b/doc/devdocs/index/Constructor2.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Constructor Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Constructor Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Constructor.html#A">A</a> · <a href="Constructor.html#B">B</a> · <a href="Constructor.html#C">C</a> · <a href="Constructor.html#D">D</a> · <a href="Constructor.html#E">E</a> · <a href="Constructor.html#F">F</a> · <a href="Constructor.html#G">G</a> · <a href="Constructor.html#H">H</a> · <a href="Constructor.html#I"> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt65"><div class=CConstructor>Create a new paging strategy.</div></div><div class=CToolTip id="tt66"><div class=CConstructor>Control which handles the panning (in any of the cardinal directions) of the map by a set px distance.</div></div><div class=CToolTip id="tt67"><div class=CConstructor>Create a new control panel.</div></div><div class=CToolTip id="tt68"><div class=CConstructor>Add the four directional pan buttons.</div></div><div class=CToolTip id="tt69"><di [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt82"><div class=CConstructor>Create a symbolizer for rendering rasters.</div></div><div class=CToolTip id="tt83"><div class=CConstructor>Create a new Refresh strategy.</div></div><div class=CToolTip id="tt84"><div class=CConstructor>Create a new regular polygon handler.</div></div><div class=CToolTip id="tt85"><div class=CConstructor>Create a new root container for multiple vector layer. </div></div><div class=CToolTip id="tt86"><div class=CConstructor>Creates a  [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt87"><div class=CConstructor>Create a new Save strategy.</div></div><div class=CToolTip id="tt88"><div class=CConstructor>Create a new scale line control.</div></div><div class=CToolTip id="tt89"><div class=CConstructor>Create a new control for selecting features.</div></div><div class=CToolTip id="tt90"><div class=CConstructor>Create an instance of OpenLayers.Size</div></div><div class=CToolTip id="tt91"><div class=CConstructor>Create a new parser for SLD.</div> [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt102"><div class=CConstructor>Create a new parser for TSV Text.</div></div><div class=CToolTip id="tt103"><div class=CConstructor>Create a text layer.</div></div><div class=CToolTip id="tt104"><div class=CConstructor>Create a symbolizer for rendering text labels.</div></div><div class=CToolTip id="tt105"><div class=CConstructor>Create a new read only TileCache layer.</div></div><div class=CToolTip id="tt106"><div class=CConstructor>Create a new transform feature  [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt108"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt109"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt110"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt111"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id=" [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Constructor3.html b/doc/devdocs/index/Constructor3.html
new file mode 100644
index 0000000..3d24fc8
--- /dev/null
+++ b/doc/devdocs/index/Constructor3.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Constructor Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Constructor Index</div><div class=INavigationBar>$#! · 0-9 · <a href="Constructor.html#A">A</a> · <a href="Constructor.html#B">B</a> · <a href="Constructor.html#C">C</a> · <a href="Constructor.html#D">D</a> · <a href="Constructor.html#E">E</a> · <a href="Constructor.html#F">F</a> · <a href="Constructor.html#G">G</a> · <a href="Constructor.html#H">H</a> · <a href="Constructor.html#I"> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt137"><div class=CConstructor>Create a WFS feature.</div></div><div class=CToolTip id="tt138"><div class=CConstructor>Create a WFS-T formatter. </div></div><div class=CToolTip id="tt139"><div class=CConstructor>A class for giving layers WFS protocol.</div></div><div class=CToolTip id="tt140"><div class=CConstructor>Create a new parser for WFS capabilities.</div></div><div class=CToolTip id="tt141"><div class=CConstructor>Create a new parser for WFS DescribeFeatur [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt150"><div class=CConstructor>Construct an XML parser. </div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt151"><div class=CConstructor>Add the three zooming controls.</div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Files.html b/doc/devdocs/index/Files.html
new file mode 100644
index 0000000..b1353ed
--- /dev/null
+++ b/doc/devdocs/index/Files.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>File Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>File Index</div><div class=INavigationBar>$#! · 0-9 · <a href="#A">A</a> · B · <a href="#C">C</a> · D · E · F · G · H · I · J · K · L · M · N · <a href="#O">O</a> · P · Q · R · <a href="#S">S</a> · T · U · <a href="#V">V</a> · <a href="#W">W</a> · X · Y · Z</div><tab [...]
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFile>OpenLayers custom string, number and function functions are described here.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions.html b/doc/devdocs/index/Functions.html
new file mode 100644
index 0000000..8007783
--- /dev/null
+++ b/doc/devdocs/index/Functions.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="#Symbols">$#!</a> · 0-9 · <a href="#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a href="Functions9.html#I">I</a [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>_addButton:function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>img,</td></tr><tr><td></td><td class=PParameter nowrap>activeImg,</td></tr><tr><td></td><td class=PParameter nowrap>xy,</td></tr><tr><td></td><td class=PParameter nowrap>sz [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt9"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>abort: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Abort an ongoing request.</div></div><div class=CToolTip id="tt10"><div class=CFunction><blockquote><table border=0 cellspacing=0 cel [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions10.html b/doc/devdocs/index/Functions10.html
new file mode 100644
index 0000000..cf66f87
--- /dev/null
+++ b/doc/devdocs/index/Functions10.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1083"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>mapDivClick: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Handle browser events</div></div><div class=CToolTip id="tt1084"><div class=CFunction><blockquote><table border=0 cellspacing=0 c [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions11.html b/doc/devdocs/index/Functions11.html
new file mode 100644
index 0000000..796b081
--- /dev/null
+++ b/doc/devdocs/index/Functions11.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1178"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>nextTrigger: function()</td></tr></table></blockquote>Restore the next state. </div></div><div class=CToolTip id="tt1179"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>nodeFactory: function(</td><td class=PParameter nowra [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1187"><div class=CFunction>Transform an object into a JSON string.</div></div><div class=CToolTip id="tt1188"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>observe: function(</td><td class=PParameter nowrap>elementParam,</td></tr><tr><td></td><td class=PParameter nowrap>name,</td></tr><tr><td></td><td class=PParameter nowrap>o [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions12.html b/doc/devdocs/index/Functions12.html
new file mode 100644
index 0000000..62d6621
--- /dev/null
+++ b/doc/devdocs/index/Functions12.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1234"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>page: function(</td><td class=PParameter nowrap>start,</td></tr><tr><td></td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Display the page starting at the given index from the cache.</div></div><div  [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions13.html b/doc/devdocs/index/Functions13.html
new file mode 100644
index 0000000..cfd8d9e
--- /dev/null
+++ b/doc/devdocs/index/Functions13.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1312"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.rad = function(</td><td class=PParameter nowrap>x</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt1313"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 c [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions14.html b/doc/devdocs/index/Functions14.html
new file mode 100644
index 0000000..0f8a1b7
--- /dev/null
+++ b/doc/devdocs/index/Functions14.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1500"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.safeStopPropagation = function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><b>Deprecated</b>. </div></div><div class=CToolTip id="tt1501"><div class=CFunction><blockquote><table b [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions15.html b/doc/devdocs/index/Functions15.html
new file mode 100644
index 0000000..81dedae
--- /dev/null
+++ b/doc/devdocs/index/Functions15.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1671"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>testTarget: function(</td><td class=PParameter nowrap>target,</td></tr><tr><td></td><td class=PParameter nowrap>loc</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt1672"><div class=CFunction><blockq [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions16.html b/doc/devdocs/index/Functions16.html
new file mode 100644
index 0000000..2237e3b
--- /dev/null
+++ b/doc/devdocs/index/Functions16.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1718"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>un: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Convenience method for unregistering listeners with a common scope. </div></div><div class=CToolTip id="tt1719"><div class=CFunction><b [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1763"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>value2regex: function(</td><td class=PParameter nowrap>wildCard,</td></tr><tr><td></td><td class=PParameter nowrap>singleChar,</td></tr><tr><td></td><td class=PParameter nowrap>escapeChar</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote> [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions17.html b/doc/devdocs/index/Functions17.html
new file mode 100644
index 0000000..bf1e78e
--- /dev/null
+++ b/doc/devdocs/index/Functions17.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1766"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>warn: function()</td></tr></table></blockquote>Writes a message to the console with the visual “warning” icon and color coding and a hyperlink to the line where it was called.</div></div><div class=CToolTip id="tt1767"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1819"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td></td><td class=PParameter nowrap>nextNode</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>This compa [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions2.html b/doc/devdocs/index/Functions2.html
new file mode 100644
index 0000000..b2bb9dc
--- /dev/null
+++ b/doc/devdocs/index/Functions2.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a href="Functions9 [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt112"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>baseLayerDraw: function()</td></tr></table></blockquote></div></div><div class=CToolTip id="tt113"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>beforeSelectFeature: function(</td><td class=PParameter nowrap>feature</td><t [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions3.html b/doc/devdocs/index/Functions3.html
new file mode 100644
index 0000000..731fdc7
--- /dev/null
+++ b/doc/devdocs/index/Functions3.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a href="Functions9 [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt137"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>cacheFeatures: function(</td><td class=PParameter nowrap>event</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Cache features before they are added to the layer.</div></div><div class=CToolTip id="tt138"><div class=CFunction><blockquote> [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions4.html b/doc/devdocs/index/Functions4.html
new file mode 100644
index 0000000..4c94cf6
--- /dev/null
+++ b/doc/devdocs/index/Functions4.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a href="Functions9 [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt341"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dashStyle: function(</td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>widthFactor</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt342"><div class=CFunction><bl [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions5.html b/doc/devdocs/index/Functions5.html
new file mode 100644
index 0000000..1a35fa0
--- /dev/null
+++ b/doc/devdocs/index/Functions5.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a href="Functions9 [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt613"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeIn: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class=PParameter nowrap>d</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions6.html b/doc/devdocs/index/Functions6.html
new file mode 100644
index 0000000..dc3be5e
--- /dev/null
+++ b/doc/devdocs/index/Functions6.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a href="Functions9 [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt656"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>False : function()</td></tr></table></blockquote>A simple function to that just does “return false”. </div></div><div class=CToolTip id="tt657"><div class=CFunction>Return a partial GeoJSON object representing a single feature.</div></div><div class=CToolTip id="tt658"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 c [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions7.html b/doc/devdocs/index/Functions7.html
new file mode 100644
index 0000000..da9ef92
--- /dev/null
+++ b/doc/devdocs/index/Functions7.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="#G">G</a> · <a href="Functions8.html#H">H</a> · <a href="Functions9 [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt682"><div class=CFunction>Return a GeoJSON object representing a single geometry.</div></div><div class=CToolTip id="tt683"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>geometryClone: function()</td></tr></table></blockquote>Return a clone of the relevant geometry.</div></div><div class=CToolTip id="tt684"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>< [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions8.html b/doc/devdocs/index/Functions8.html
new file mode 100644
index 0000000..1f65e60
--- /dev/null
+++ b/doc/devdocs/index/Functions8.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="#H">H</a> · <a href="Functions9 [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt980"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handle: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt981"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Functions9.html b/doc/devdocs/index/Functions9.html
new file mode 100644
index 0000000..3c9d7fd
--- /dev/null
+++ b/doc/devdocs/index/Functions9.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Function Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Function Index</div><div class=INavigationBar><a href="Functions.html#Symbols">$#!</a> · 0-9 · <a href="Functions.html#A">A</a> · <a href="Functions2.html#B">B</a> · <a href="Functions3.html#C">C</a> · <a href="Functions4.html#D">D</a> · <a href="Functions5.html#E">E</a> · <a href="Functions6.html#F">F</a> · <a href="Functions7.html#G">G</a> · <a href="Functions8.html#H">H</a> · <a h [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1006"><div class=CFunction>Alias for OpenLayers.Lang.translate. </div></div><div class=CToolTip id="tt1007"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>ignoreEvent: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToo [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1055"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>layerToContext: function(</td><td class=PParameter nowrap>layer</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Create a layer context object given a wms layer object.</div></div><div class=CToolTip id="tt1056"><div class=CFunction><blo [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General.html b/doc/devdocs/index/General.html
new file mode 100644
index 0000000..67825d7
--- /dev/null
+++ b/doc/devdocs/index/General.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="#Symbols">$#!</a> · 0-9 · <a href="#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> · <a href="Gener [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>_addButton:function(</td><td class=PParameter nowrap>id,</td></tr><tr><td></td><td class=PParameter nowrap>img,</td></tr><tr><td></td><td class=PParameter nowrap>activeImg,</td></tr><tr><td></td><td class=PParameter nowrap>xy,</td></tr><tr><td></td><td class=PParameter nowrap>sz [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt11"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>abort: function(</td><td class=PParameter nowrap>response</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Abort an ongoing request.</div></div><div class=CToolTip id="tt12"><div class=CFunction><blockquote><table border=0 cellspacing=0 ce [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General10.html b/doc/devdocs/index/General10.html
new file mode 100644
index 0000000..1302e7a
--- /dev/null
+++ b/doc/devdocs/index/General10.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1613"><div class=CConstructor>Create a new parser for JSON.</div></div><div class=CToolTip id="tt1614"><div class=CProperty>{OpenLayers.Format.JSON}</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1615"><div class=CProperty>{Object} Maintain a reference (data) to the most recently read data. </div></div><div class=CToolTip id="tt1616"><div class=CProperty>{Boolean} If panMapIfOutOfView is false, and this property is true, contrain the popup such that it always fits in the available map space. </div></div><div class=CToolTip id="tt1617"><div class=CProperty>{Boolean} If panMapIfOutOfView is false, and this property is true, contrain the popup such that it  [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General11.html b/doc/devdocs/index/General11.html
new file mode 100644
index 0000000..8fbad3d
--- /dev/null
+++ b/doc/devdocs/index/General11.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1632"><div class=CProperty>{String} The text for the label.</div></div><div class=CToolTip id="tt1633"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt1634"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt1635"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt1636"><div class=CConstant>{Object}</div></div><div class=CToolTip id="tt1637"><div class=CProperty>{String} the format of the labels, default = &lsqu [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General12.html b/doc/devdocs/index/General12.html
new file mode 100644
index 0000000..4deae21
--- /dev/null
+++ b/doc/devdocs/index/General12.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1739"><div class=CProperty>{OpenLayers.Map} this gets set in the addControl() function in OpenLayers.Map</div></div><div class=CToolTip id="tt1740"><div class=CProperty>{OpenLayers.Map}</div></div><div class=CToolTip id="tt1741"><div class=CProperty>{OpenLayers.Map} This variable is set when the layer is added to the map, via the accessor function setMap().</div></div><div class=CToolTip id="tt1742"><div class=CProperty>{OpenLayers.Map} the map this marker is at [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General13.html b/doc/devdocs/index/General13.html
new file mode 100644
index 0000000..8b8e28f
--- /dev/null
+++ b/doc/devdocs/index/General13.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1920"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt1921"><div class=CProperty>{String} Layer name. </div></div><div class=CToolTip id="tt1922"><div class=CProperty>{String} name of this rule</div></div><div class=CToolTip id="tt1923"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt1924"><div class=CProperty>{String} Style identifier.</div></div><div class=CToolTip id="tt1925"><div class=CProperty>{Boolean} Generate a name [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General14.html b/doc/devdocs/index/General14.html
new file mode 100644
index 0000000..388991d
--- /dev/null
+++ b/doc/devdocs/index/General14.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1973"><div class=CProperty>{Object}  the code object issuing application events</div></div><div class=CToolTip id="tt1974"><div class=CFunction>Transform an object into a JSON string.</div></div><div class=CToolTip id="tt1975"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>observe: function(</td><td class=PParameter nowrap>elem [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General15.html b/doc/devdocs/index/General15.html
new file mode 100644
index 0000000..b20b449
--- /dev/null
+++ b/doc/devdocs/index/General15.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt2310"><div class=CProperty>{int or OpenLayers.Bounds} An extra opportunity to specify internal padding of the content div inside the popup. </div></div><div class=CToolTip id="tt2311"><div class=CProperty>{OpenLayers.Bounds} Outside margin of the popup. </div></div><div class=CToolTip id="tt2312"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforePa [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General16.html b/doc/devdocs/index/General16.html
new file mode 100644
index 0000000..46d7b66
--- /dev/null
+++ b/doc/devdocs/index/General16.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt2471"><div class=CProperty>{String} Value of the csw:Query element, used when writing a csw:GetRecords document.</div></div><div class=CToolTip id="tt2472"><div class=CProperty>{Boolean} If true, filter out hidden layers when searching the map for layers to query. </div></div><div class=CToolTip id="tt2473"><div class=CProperty>{Boolean} Filter out hidden layers when searching the map for layers to query. </div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General17.html b/doc/devdocs/index/General17.html
new file mode 100644
index 0000000..8319a2f
--- /dev/null
+++ b/doc/devdocs/index/General17.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt2474"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.rad = function(</td><td class=PParameter nowrap>x</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt2475"><div class=CProperty>{Float} Optional radius in map units of the regular polyg [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General18.html b/doc/devdocs/index/General18.html
new file mode 100644
index 0000000..117d318
--- /dev/null
+++ b/doc/devdocs/index/General18.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt2770"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>OpenLayers.Util.safeStopPropagation = function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote><b>Deprecated</b>. </div></div><div class=CToolTip id="tt2771"><div class=CFunction><blockquote><table b [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General19.html b/doc/devdocs/index/General19.html
new file mode 100644
index 0000000..18adb18
--- /dev/null
+++ b/doc/devdocs/index/General19.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3083"><div class=CProperty>Name of the database table into which Features should be saved.</div></div><div class=CToolTip id="tt3084"><div class=CProperty>{OpenLayers.Filter} Optional filter that will be evaluated to determine if a feature from the target layer is eligible for splitting.</div></div><div class=CToolTip id="tt3085"><div class=CProperty>{Integer} The maximum size of the grid in pixels on the map</div></div><div class=CToolTip id="tt3086"><div class [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General2.html b/doc/devdocs/index/General2.html
new file mode 100644
index 0000000..b172e15
--- /dev/null
+++ b/doc/devdocs/index/General2.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> · <a  [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt152"><div class=CProperty>{OpenLayers.Tile} A clone of the tile used to create transition effects when the tile is moved or changes resolution.</div></div><div class=CToolTip id="tt153"><div class=CConstant>{String}</div></div><div class=CToolTip id="tt154"><div class=CProperty>{String} the background color used by the popup.</div></div><div class=CToolTip id="tt155"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt156"><div class=CConstructor> [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General20.html b/doc/devdocs/index/General20.html
new file mode 100644
index 0000000..e405854
--- /dev/null
+++ b/doc/devdocs/index/General20.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3199"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>un: function(</td><td class=PParameter nowrap>object</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote>Convenience method for unregistering listeners with a common scope. </div></div><div class=CToolTip id="tt3200"><div class=CFunction><b [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General21.html b/doc/devdocs/index/General21.html
new file mode 100644
index 0000000..94a7e48
--- /dev/null
+++ b/doc/devdocs/index/General21.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3267"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt3268"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt3269"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip id="tt3270"><div class=CConstructor>Instances of this class are not created directly. </div></div><div class=CToolTip  [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General22.html b/doc/devdocs/index/General22.html
new file mode 100644
index 0000000..779e3dd
--- /dev/null
+++ b/doc/devdocs/index/General22.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3345"><div class=CProperty>{Number} width</div></div><div class=CToolTip id="tt3346"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>warn: function()</td></tr></table></blockquote>Writes a message to the console with the visual “warning” icon and color coding and a hyperlink to the line where it was called.</div></div><div class=CToolTip id="tt3347"><div class=CConstructor>Create a WFS feature.</di [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General23.html b/doc/devdocs/index/General23.html
new file mode 100644
index 0000000..194880a
--- /dev/null
+++ b/doc/devdocs/index/General23.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3440"><div class=CProperty>{float}</div></div><div class=CToolTip id="tt3441"><div class=CProperty>{Float}</div></div><div class=CToolTip id="tt3442"><div class=CProperty>{Number} The x coordinate</div></div><div class=CToolTip id="tt3443"><div class=CConstant>{Integer}</div></div><div class=CToolTip id="tt3444"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt3445"><div class=CConstructor>Construct an XML parser. </div></div><div class=CToolTi [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3456"><div class=CProperty>{float}</div></div><div class=CToolTip id="tt3457"><div class=CProperty>{Float}</div></div><div class=CToolTip id="tt3458"><div class=CProperty>{Number} The y coordinate</div></div><div class=CToolTip id="tt3459"><div class=CConstant>{Integer}</div></div><div class=CToolTip id="tt3460"><div class=CProperty>{Object} Members in the yx object are used to determine if a CRS URN corresponds to a CRS with y,x axis order. </div></div><div cla [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3463"><div class=CConstant>{Object} Base z-indexes for different classes of thing</div></div><div class=CToolTip id="tt3464"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>Z_ORDER: function(</td><td class=PParameter nowrap>indexer,</td></tr><tr><td></td><td class=PParameter nowrap>newNode,</td></tr><tr><td></td><td class=PParam [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General3.html b/doc/devdocs/index/General3.html
new file mode 100644
index 0000000..5f8c1e9
--- /dev/null
+++ b/doc/devdocs/index/General3.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> · <a  [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt209"><div class=CProperty>{Object} Cache for elements that should only be created once per map.</div></div><div class=CToolTip id="tt210"><div class=CProperty>{Array(OpenLayers.Feature.Vector)} List of currently cached features.</div></div><div class=CToolTip id="tt211"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>cacheFeatur [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General4.html b/doc/devdocs/index/General4.html
new file mode 100644
index 0000000..e448d57
--- /dev/null
+++ b/doc/devdocs/index/General4.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> · <a  [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt476"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>dashStyle: function(</td><td class=PParameter nowrap>style,</td></tr><tr><td></td><td class=PParameter nowrap>widthFactor</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt477"><div class=CFunction><bl [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General5.html b/doc/devdocs/index/General5.html
new file mode 100644
index 0000000..13e6afa
--- /dev/null
+++ b/doc/devdocs/index/General5.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> · <a  [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt860"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>easeIn: function(</td><td class=PParameter nowrap>t,</td></tr><tr><td></td><td class=PParameter nowrap>b,</td></tr><tr><td></td><td class=PParameter nowrap>c,</td></tr><tr><td></td><td class=PParameter nowrap>d</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General6.html b/doc/devdocs/index/General6.html
new file mode 100644
index 0000000..849713a
--- /dev/null
+++ b/doc/devdocs/index/General6.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> · <a  [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt964"><div class=CProperty>{Boolean}</div></div><div class=CToolTip id="tt965"><div class=CProperty>{Boolean} Should OpenLayers allow events on the map to fall through to other elements on the page, or should it swallow them?  </div></div><div class=CToolTip id="tt966"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td>False : function()</td></tr></table></blockquote>A simple function to that just does &ldquo [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General7.html b/doc/devdocs/index/General7.html
new file mode 100644
index 0000000..b481fd7
--- /dev/null
+++ b/doc/devdocs/index/General7.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="#G">G</a> · <a href="General8.html#H">H</a> · <a href="General9.html#I">I</a> · <a  [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1091"><div class=CProperty>{Boolean} Calculate geodesic metrics instead of planar metrics. </div></div><div class=CToolTip id="tt1092"><div class=CProperty>{Boolean} Use geodesic measurement. </div></div><div class=CToolTip id="tt1093"><div class=CProperty>{Boolean} Use geodesic measurement. </div></div><div class=CToolTip id="tt1094"><div class=CConstructor>Create a new parser for GeoJSON.</div></div><div class=CToolTip id="tt1095"><div class=CProperty>{OpenLay [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General8.html b/doc/devdocs/index/General8.html
new file mode 100644
index 0000000..2dfec38
--- /dev/null
+++ b/doc/devdocs/index/General8.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="#H">H</a> · <a href="General9.html#I">I</a> · <a  [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1434"><div class=CProperty>{Number} height</div></div><div class=CToolTip id="tt1435"><div class=CFunction><blockquote><table border=0 cellspacing=0 cellpadding=0 class=Prototype><tr><td><table border=0 cellspacing=0 cellpadding=0><tr><td class=PBeforeParameters nowrap>handle: function(</td><td class=PParameter nowrap>evt</td><td class=PAfterParameters nowrap>)</td></tr></table></td></tr></table></blockquote></div></div><div class=CToolTip id="tt1436"><div class [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/General9.html b/doc/devdocs/index/General9.html
new file mode 100644
index 0000000..366b3c1
--- /dev/null
+++ b/doc/devdocs/index/General9.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Index</div><div class=INavigationBar><a href="General.html#Symbols">$#!</a> · 0-9 · <a href="General.html#A">A</a> · <a href="General2.html#B">B</a> · <a href="General3.html#C">C</a> · <a href="General4.html#D">D</a> · <a href="General5.html#E">E</a> · <a href="General6.html#F">F</a> · <a href="General7.html#G">G</a> · <a href="General8.html#H">H</a> · <a href="#I">I</a> · <a  [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1490"><div class=CFunction>Alias for OpenLayers.Lang.translate. </div></div><div class=CToolTip id="tt1491"><div class=CProperty>{OpenLayers.Icon}. </div></div><div class=CToolTip id="tt1492"><div class=CProperty>{OpenLayers.Icon} The icon used by this marker.</div></div><div class=CToolTip id="tt1493"><div class=CConstructor>Creates an icon, which is an image tag in a div.</div></div><div class=CToolTip id="tt1494"><div class=CProperty>{String}</div></div><div  [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties.html b/doc/devdocs/index/Properties.html
new file mode 100644
index 0000000..c59d757
--- /dev/null
+++ b/doc/devdocs/index/Properties.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="#Symbols">$#!</a> · 0-9 · <a href="#A">A</a> · <a href="#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> · <a href="Properties7.html#I">I</a> &middo [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1"><div class=CProperty>{Boolean}</div></div><div class=CToolTip id="tt2"><div class=CProperty>{String} Relative path of this script.</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt3"><div class=CProperty>{Boolean} The control is active.</div></div><div class=CToolTip id="tt4"><div class=CProperty>{Boolean}</div></div><div class=CToolTip id="tt5"><div class=CProperty>{Boolean} The control is active.</div></div><div class=CToolTip id="tt6"><div class=CProperty>{Integer}</div></div><div class=CToolTip id="tt7"><div class=CProperty>{Object} stores the active state of this panel’s controls.</div></div><div class=CToolTip id="tt8"><div cl [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt37"><div class=CProperty>{OpenLayers.Tile} A clone of the tile used to create transition effects when the tile is moved or changes resolution.</div></div><div class=CToolTip id="tt38"><div class=CProperty>{String} the background color used by the popup.</div></div><div class=CToolTip id="tt39"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt40"><div class=CProperty>{OpenLayers.Layer} The currently selected base layer. </div></div><div class=CT [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties10.html b/doc/devdocs/index/Properties10.html
new file mode 100644
index 0000000..3525343
--- /dev/null
+++ b/doc/devdocs/index/Properties10.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt662"><div class=CProperty>{Object}  the code object issuing application events</div></div><div class=CToolTip id="tt663"><div class=CProperty>{Object} A hashtable cache of the event observers. </div></div><div class=CToolTip id="tt664"><div class=CProperty>{OpenLayers.Pixel} distance in pixels to offset the image when being rendered</div></div><div class=CToolTip id="tt665"><div class=CProperty>{Object} Hash with “x” and “y” properties</d [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt688"><div class=CProperty>{int or OpenLayers.Bounds} An extra opportunity to specify internal padding of the content div inside the popup. </div></div><div class=CToolTip id="tt689"><div class=CProperty>{OpenLayers.Bounds} Outside margin of the popup. </div></div><div class=CToolTip id="tt690"><div class=CProperty>{Boolean} The strategy is currently changing pages.</div></div><div class=CToolTip id="tt691"><div class=CProperty>{Integer} The number of steps to be [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt754"><div class=CProperty>{String} Value of the csw:Query element, used when writing a csw:GetRecords document.</div></div><div class=CToolTip id="tt755"><div class=CProperty>{Boolean} If true, filter out hidden layers when searching the map for layers to query. </div></div><div class=CToolTip id="tt756"><div class=CProperty>{Boolean} Filter out hidden layers when searching the map for layers to query. </div></div><!--END_ND_TOOLTIPS-->
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties11.html b/doc/devdocs/index/Properties11.html
new file mode 100644
index 0000000..0a0bc89
--- /dev/null
+++ b/doc/devdocs/index/Properties11.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt757"><div class=CProperty>{Float} Optional radius in map units of the regular polygon. </div></div><div class=CToolTip id="tt758"><div class=CProperty>{OpenLayers.Feature.Vector} A handle for rotating/resizing a feature.</div></div><div class=CToolTip id="tt759"><div class=CProperty>{Float} The ratio of the feature relative to the ratio the time the feature was set. </div></div><div class=CToolTip id="tt760"><div class=CProperty>{Float} Used only when in single- [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties12.html b/doc/devdocs/index/Properties12.html
new file mode 100644
index 0000000..636c0c0
--- /dev/null
+++ b/doc/devdocs/index/Properties12.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt852"><div class=CProperty>{Boolean} Whether to save the feature state (OpenLayers.State) into the database, defaults to true.</div></div><div class=CToolTip id="tt853"><div class=CProperty>{Boolean} If set to true, the active state of this panel’s controls will be stored on panel deactivation, and restored on reactivation. </div></div><div class=CToolTip id="tt854"><div class=CProperty>{Float} The scale of the feature, relative to the scale the time the fe [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties13.html b/doc/devdocs/index/Properties13.html
new file mode 100644
index 0000000..1f348bc
--- /dev/null
+++ b/doc/devdocs/index/Properties13.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt974"><div class=CProperty>Name of the database table into which Features should be saved.</div></div><div class=CToolTip id="tt975"><div class=CProperty>{OpenLayers.Filter} Optional filter that will be evaluated to determine if a feature from the target layer is eligible for splitting.</div></div><div class=CToolTip id="tt976"><div class=CProperty>{Integer} The maximum size of the grid in pixels on the map</div></div><div class=CToolTip id="tt977"><div class=CPr [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1033"><div class=CProperty>{String} The layer map units. </div></div><div class=CToolTip id="tt1034"><div class=CProperty>{?}</div></div><div class=CToolTip id="tt1035"><div class=CProperty>{String} The map units. </div></div><div class=CToolTip id="tt1036"><div class=CProperty>{Object} hash of features, keyed by feature.id, that the renderer failed to draw</div></div><div class=CToolTip id="tt1037"><div class=CProperty>{Array} Array with browsers, which should  [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties14.html b/doc/devdocs/index/Properties14.html
new file mode 100644
index 0000000..e7c0f78
--- /dev/null
+++ b/doc/devdocs/index/Properties14.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1055"><div class=CProperty>{Number} or {String} comparison value for binary comparisons. </div></div><div class=CToolTip id="tt1056"><div class=CProperty>{OpenLayers.Bounds || OpenLayers.Geometry} The bounds or geometry to be used by the filter. </div></div><div class=CToolTip id="tt1057"><div class=CProperty>{Boolean} Should be calculated automatically. </div></div><div class=CToolTip id="tt1058"><div class=CProperty>{DOMElement}</div></div><div class=CToolTip  [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1091"><div class=CProperty>{Number} width</div></div><div class=CToolTip id="tt1092"><div class=CProperty>{Object} Cache to use for storing parsed results from OpenLayers.Format.WFSDescribeFeatureType.read. </div></div><div class=CToolTip id="tt1093"><div class=CProperty>{function}</div></div><div class=CToolTip id="tt1094"><div class=CProperty>{Function}</div></div><div class=CToolTip id="tt1095"><div class=CProperty>{Float}</div></div><div class=CToolTip id="t [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1120"><div class=CProperty>{float}</div></div><div class=CToolTip id="tt1121"><div class=CProperty>{Float}</div></div><div class=CToolTip id="tt1122"><div class=CProperty>{Number} The x coordinate</div></div><div class=CToolTip id="tt1123"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt1124"><div class=CProperty>{XMLDom} If this browser uses ActiveX, this will be set to a XMLDOM object. </div></div><div class=CToolTip id="tt1125"><div class=C [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1134"><div class=CProperty>{float}</div></div><div class=CToolTip id="tt1135"><div class=CProperty>{Float}</div></div><div class=CToolTip id="tt1136"><div class=CProperty>{Number} The y coordinate</div></div><div class=CToolTip id="tt1137"><div class=CProperty>{Object} Members in the yx object are used to determine if a CRS URN corresponds to a CRS with y,x axis order. </div></div><div class=CToolTip id="tt1138"><div class=CProperty>{Object} Members in the yx ob [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt1140"><div class=CProperty>{Number} The zIndex determines the rendering order for a symbolizer. </div></div><div class=CToolTip id="tt1141"><div class=CProperty>{Integer} The current zoom level of the map</div></div><div class=CToolTip id="tt1142"><div class=CProperty>{DOMElement}</div></div><div class=CToolTip id="tt1143"><div class=CProperty>{OpenLayers.Control.ZoomBox}</div></div><div class=CToolTip id="tt1144"><div class=CProperty>{Boolean} Whether the user  [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties2.html b/doc/devdocs/index/Properties2.html
new file mode 100644
index 0000000..11bd9df
--- /dev/null
+++ b/doc/devdocs/index/Properties2.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> · <a href="Pro [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt64"><div class=CProperty>{Object} Cache for elements that should only be created once per map.</div></div><div class=CToolTip id="tt65"><div class=CProperty>{Array(OpenLayers.Feature.Vector)} List of currently cached features.</div></div><div class=CToolTip id="tt66"><div class=CProperty>{Boolean} The filter is currently caching features.</div></div><div class=CToolTip id="tt67"><div class=CProperty>{OpenLayers.Pixel} Function to calculate the offset (based on t [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties3.html b/doc/devdocs/index/Properties3.html
new file mode 100644
index 0000000..14c2a55
--- /dev/null
+++ b/doc/devdocs/index/Properties3.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> · <a href="Pro [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt119"><div class=CProperty>{Object}</div></div><div class=CToolTip id="tt120"><div class=CProperty>{Object} When keepData is true, this is the parsed string sent to read.</div></div><div class=CToolTip id="tt121"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt122"><div class=CProperty>{Array(OpenLayers.Layer)}</div></div><div class=CToolTip id="tt123"><div class=CProperty>{DOMElement}</div></div><div class=CToolTip id="tt124"><div class=CPrope [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties4.html b/doc/devdocs/index/Properties4.html
new file mode 100644
index 0000000..45950e1
--- /dev/null
+++ b/doc/devdocs/index/Properties4.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> · <a href="Pro [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt212"><div class=CProperty>{<OpenLayers.Easing>(Function)} Easing equation used for the animation Defaultly set to OpenLayers.Easing.Expo.easeOut</div></div><div class=CToolTip id="tt213"><div class=CProperty>{DOMElement}</div></div><div class=CToolTip id="tt214"><div class=CProperty>{Boolean} Allow splits given intersection of edges only. </div></div><div class=CToolTip id="tt215"><div class=CProperty>{DOMElement}</div></div><div class=CToolTip id="tt216"> [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties5.html b/doc/devdocs/index/Properties5.html
new file mode 100644
index 0000000..5b99f20
--- /dev/null
+++ b/doc/devdocs/index/Properties5.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> · <a href="Pro [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt260"><div class=CProperty>{Boolean}</div></div><div class=CToolTip id="tt261"><div class=CProperty>{Boolean} Should OpenLayers allow events on the map to fall through to other elements on the page, or should it swallow them?  </div></div><div class=CToolTip id="tt262"><div class=CProperty>{OpenLayers.Feature.Vector}</div></div><div class=CToolTip id="tt263"><div class=CProperty>{OpenLayers.Feature.Vector} Feature currently available for modification.</div>< [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties6.html b/doc/devdocs/index/Properties6.html
new file mode 100644
index 0000000..48e290b
--- /dev/null
+++ b/doc/devdocs/index/Properties6.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="#G">G</a> · <a href="#H">H</a> · <a href="Properties7.html#I" [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt350"><div class=CProperty>{Boolean} Calculate geodesic metrics instead of planar metrics. </div></div><div class=CToolTip id="tt351"><div class=CProperty>{Boolean} Use geodesic measurement. </div></div><div class=CToolTip id="tt352"><div class=CProperty>{Boolean} Use geodesic measurement. </div></div><div class=CToolTip id="tt353"><div class=CProperty>{OpenLayers.Geometry}</div></div><div class=CToolTip id="tt354"><div class=CProperty>{String} Name of geometry e [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt385"><div class=CProperty>{Number} height</div></div><div class=CToolTip id="tt386"><div class=CProperty>{OpenLayers.Handler} null</div></div><div class=CToolTip id="tt387"><div class=CProperty>{OpenLayers.Handler.Path} The temporary sketch handler created if no source layer is provided.</div></div><div class=CToolTip id="tt388"><div class=CProperty>{Object} Reference to the OpenLayers.Handler for this control</div></div><div class=CToolTip id="tt389"><div class [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties7.html b/doc/devdocs/index/Properties7.html
new file mode 100644
index 0000000..2eece73
--- /dev/null
+++ b/doc/devdocs/index/Properties7.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt412"><div class=CProperty>{OpenLayers.Icon}. </div></div><div class=CToolTip id="tt413"><div class=CProperty>{OpenLayers.Icon} The icon used by this marker.</div></div><div class=CToolTip id="tt414"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt415"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt416"><div class=CProperty>{String} A unique identifier for this geometry.</div></div><div class=CToolTip id="tt417"><div class=C [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt480"><div class=CProperty>{OpenLayers.Format.JSON}</div></div><!--END_ND_TOOLTIPS-->
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt481"><div class=CProperty>{Object} Maintain a reference (data) to the most recently read data. </div></div><div class=CToolTip id="tt482"><div class=CProperty>{Boolean} If panMapIfOutOfView is false, and this property is true, contrain the popup such that it always fits in the available map space. </div></div><div class=CToolTip id="tt483"><div class=CProperty>{Boolean} If panMapIfOutOfView is false, and this property is true, contrain the popup such that it alw [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties8.html b/doc/devdocs/index/Properties8.html
new file mode 100644
index 0000000..567a511
--- /dev/null
+++ b/doc/devdocs/index/Properties8.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt486"><div class=CProperty>{String} The text for the label.</div></div><div class=CToolTip id="tt487"><div class=CProperty>{String} the format of the labels, default = ‘dm’. </div></div><div class=CToolTip id="tt488"><div class=CProperty>{Boolean} Should the graticule lines be labelled?. </div></div><div class=CToolTip id="tt489"><div class=CProperty>{symbolizer} the symbolizer used to render labels</div></div><div class=CToolTip id="tt490"><div class [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/index/Properties9.html b/doc/devdocs/index/Properties9.html
new file mode 100644
index 0000000..67b3fce
--- /dev/null
+++ b/doc/devdocs/index/Properties9.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><title>Property Index - OpenLayers</title><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script><script language=JavaScript src="../javascript/searchdata.js"></script></head><body class="IndexPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=IPageTitle>Property Index</div><div class=INavigationBar><a href="Properties.html#Symbols">$#!</a> · 0-9 · <a href="Properties.html#A">A</a> · <a href="Properties.html#B">B</a> · <a href="Properties2.html#C">C</a> · <a href="Properties3.html#D">D</a> · <a href="Properties4.html#E">E</a> · <a href="Properties5.html#F">F</a> · <a href="Properties6.html#G">G</a> · <a href="Properties6.html#H">H</a> &midd [...]
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt556"><div class=CProperty>{OpenLayers.Map} this gets set in the addControl() function in OpenLayers.Map</div></div><div class=CToolTip id="tt557"><div class=CProperty>{OpenLayers.Map}</div></div><div class=CToolTip id="tt558"><div class=CProperty>{OpenLayers.Map} This variable is set when the layer is added to the map, via the accessor function setMap().</div></div><div class=CToolTip id="tt559"><div class=CProperty>{OpenLayers.Map} the map this marker is attach [...]
+
+
+<!--START_ND_TOOLTIPS-->
+<div class=CToolTip id="tt620"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt621"><div class=CProperty>{String} Layer name. </div></div><div class=CToolTip id="tt622"><div class=CProperty>{String} name of this rule</div></div><div class=CToolTip id="tt623"><div class=CProperty>{String}</div></div><div class=CToolTip id="tt624"><div class=CProperty>{String} Style identifier.</div></div><div class=CToolTip id="tt625"><div class=CProperty>{Boolean} Generate a namedLayer [...]
+
+</div><!--Index-->
+
+
+<div id=Footer><a href="http://www.naturaldocs.org">Generated by Natural Docs</a></div><!--Footer-->
+
+
+<div id=Menu><div class=MTitle>OpenLayers<div class=MSubTitle>JavaScript Mapping Library</div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent34')">OpenLayers</a><div class=MGroupContent id=MGroupContent34><div class=MEntry><div class=MFile><a href="../files/OpenLayers-js.html">OpenLayers</a></div></div><div class=MEntry><div class=MGroup><a href="javascript:ToggleMenu('MGroupContent1')">BaseTypes</a><div class=MGroupContent id=MGroupContent1><div c [...]
+var searchPanel = new SearchPanel("searchPanel", "HTML", "../search");
+--></script><div id=MSearchPanel class=MSearchPanelInactive><input type=text id=MSearchField value=Search onFocus="searchPanel.OnSearchFieldFocus(true)" onBlur="searchPanel.OnSearchFieldFocus(false)" onKeyUp="searchPanel.OnSearchFieldChange()"><select id=MSearchType onFocus="searchPanel.OnSearchTypeFocus(true)" onBlur="searchPanel.OnSearchTypeFocus(false)" onChange="searchPanel.OnSearchTypeChange()"><option  id=MSearchEverything selected value="General">Everything</option><option value=" [...]
+HideAllBut([35], 36);// --></script></div><!--Menu-->
+
+
+<div id=MSearchResultsWindow><iframe src="" frameborder=0 name=MSearchResults id=MSearchResults></iframe><a href="javascript:searchPanel.CloseResultsWindow()" id=MSearchResultsWindowClose>Close</a></div>
+
+
+<script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/javascript/main.js b/doc/devdocs/javascript/main.js
new file mode 100644
index 0000000..d9b8d3a
--- /dev/null
+++ b/doc/devdocs/javascript/main.js
@@ -0,0 +1,835 @@
+// This file is part of Natural Docs, which is Copyright (C) 2003-2005 Greg Valure
+// Natural Docs is licensed under the GPL
+
+
+//
+//  Browser Styles
+// ____________________________________________________________________________
+
+var agt=navigator.userAgent.toLowerCase();
+var browserType;
+var browserVer;
+
+if (agt.indexOf("opera") != -1)
+    {
+    browserType = "Opera";
+
+    if (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1)
+        {  browserVer = "Opera7";  }
+    else if (agt.indexOf("opera 8") != -1 || agt.indexOf("opera/8") != -1)
+        {  browserVer = "Opera8";  }
+    else if (agt.indexOf("opera 9") != -1 || agt.indexOf("opera/9") != -1)
+        {  browserVer = "Opera9";  }
+    }
+
+else if (agt.indexOf("applewebkit") != -1)
+    {
+    browserType = "Safari";
+
+    if (agt.indexOf("version/3") != -1)
+        {  browserVer = "Safari3";  }
+    else if (agt.indexOf("safari/4") != -1)
+        {  browserVer = "Safari2";  }
+    }
+
+else if (agt.indexOf("khtml") != -1)
+    {
+    browserType = "Konqueror";
+    }
+
+else if (agt.indexOf("msie") != -1)
+    {
+    browserType = "IE";
+
+    if (agt.indexOf("msie 6") != -1)
+        {  browserVer = "IE6";  }
+    else if (agt.indexOf("msie 7") != -1)
+        {  browserVer = "IE7";  }
+    }
+
+else if (agt.indexOf("gecko") != -1)
+    {
+    browserType = "Firefox";
+
+    if (agt.indexOf("rv:1.7") != -1)
+        {  browserVer = "Firefox1";  }
+    else if (agt.indexOf("rv:1.8)") != -1 || agt.indexOf("rv:1.8.0") != -1)
+        {  browserVer = "Firefox15";  }
+    else if (agt.indexOf("rv:1.8.1") != -1)
+        {  browserVer = "Firefox2";  }
+    }
+
+
+//
+//  Support Functions
+// ____________________________________________________________________________
+
+
+function GetXPosition(item)
+    {
+    var position = 0;
+
+    if (item.offsetWidth != null)
+        {
+        while (item != document.body && item != null)
+            {
+            position += item.offsetLeft;
+            item = item.offsetParent;
+            };
+        };
+
+    return position;
+    };
+
+
+function GetYPosition(item)
+    {
+    var position = 0;
+
+    if (item.offsetWidth != null)
+        {
+        while (item != document.body && item != null)
+            {
+            position += item.offsetTop;
+            item = item.offsetParent;
+            };
+        };
+
+    return position;
+    };
+
+
+function MoveToPosition(item, x, y)
+    {
+    // Opera 5 chokes on the px extension, so it can use the Microsoft one instead.
+
+    if (item.style.left != null)
+        {
+        item.style.left = x + "px";
+        item.style.top = y + "px";
+        }
+    else if (item.style.pixelLeft != null)
+        {
+        item.style.pixelLeft = x;
+        item.style.pixelTop = y;
+        };
+    };
+
+
+//
+//  Menu
+// ____________________________________________________________________________
+
+
+function ToggleMenu(id)
+    {
+    if (!window.document.getElementById)
+        {  return;  };
+
+    var display = window.document.getElementById(id).style.display;
+
+    if (display == "none")
+        {  display = "block";  }
+    else
+        {  display = "none";  }
+
+    window.document.getElementById(id).style.display = display;
+    }
+
+function HideAllBut(ids, max)
+    {
+    if (document.getElementById)
+        {
+        ids.sort( function(a,b) { return a - b; } );
+        var number = 1;
+
+        while (number < max)
+            {
+            if (ids.length > 0 && number == ids[0])
+                {  ids.shift();  }
+            else
+                {
+                document.getElementById("MGroupContent" + number).style.display = "none";
+                };
+
+            number++;
+            };
+        };
+    }
+
+
+//
+//  Tooltips
+// ____________________________________________________________________________
+
+
+var tooltipTimer = 0;
+
+function ShowTip(event, tooltipID, linkID)
+    {
+    if (tooltipTimer)
+        {  clearTimeout(tooltipTimer);  };
+
+    var docX = event.clientX + window.pageXOffset;
+    var docY = event.clientY + window.pageYOffset;
+
+    var showCommand = "ReallyShowTip('" + tooltipID + "', '" + linkID + "', " + docX + ", " + docY + ")";
+
+    tooltipTimer = setTimeout(showCommand, 1000);
+    }
+
+function ReallyShowTip(tooltipID, linkID, docX, docY)
+    {
+    tooltipTimer = 0;
+
+    var tooltip;
+    var link;
+
+    if (document.getElementById)
+        {
+        tooltip = document.getElementById(tooltipID);
+        link = document.getElementById(linkID);
+        }
+/*    else if (document.all)
+        {
+        tooltip = eval("document.all['" + tooltipID + "']");
+        link = eval("document.all['" + linkID + "']");
+        }
+*/
+    if (tooltip)
+        {
+        var left = GetXPosition(link);
+        var top = GetYPosition(link);
+        top += link.offsetHeight;
+
+
+        // The fallback method is to use the mouse X and Y relative to the document.  We use a separate if and test if its a number
+        // in case some browser snuck through the above if statement but didn't support everything.
+
+        if (!isFinite(top) || top == 0)
+            {
+            left = docX;
+            top = docY;
+            }
+
+        // Some spacing to get it out from under the cursor.
+
+        top += 10;
+
+        // Make sure the tooltip doesnt get smushed by being too close to the edge, or in some browsers, go off the edge of the
+        // page.  We do it here because Konqueror does get offsetWidth right even if it doesnt get the positioning right.
+
+        if (tooltip.offsetWidth != null)
+            {
+            var width = tooltip.offsetWidth;
+            var docWidth = document.body.clientWidth;
+
+            if (left + width > docWidth)
+                {  left = docWidth - width - 1;  }
+
+            // If there's a horizontal scroll bar we could go past zero because it's using the page width, not the window width.
+            if (left < 0)
+                {  left = 0;  };
+            }
+
+        MoveToPosition(tooltip, left, top);
+        tooltip.style.visibility = "visible";
+        }
+    }
+
+function HideTip(tooltipID)
+    {
+    if (tooltipTimer)
+        {
+        clearTimeout(tooltipTimer);
+        tooltipTimer = 0;
+        }
+
+    var tooltip;
+
+    if (document.getElementById)
+        {  tooltip = document.getElementById(tooltipID); }
+    else if (document.all)
+        {  tooltip = eval("document.all['" + tooltipID + "']");  }
+
+    if (tooltip)
+        {  tooltip.style.visibility = "hidden";  }
+    }
+
+
+//
+//  Blockquote fix for IE
+// ____________________________________________________________________________
+
+
+function NDOnLoad()
+    {
+    if (browserVer == "IE6")
+        {
+        var scrollboxes = document.getElementsByTagName('blockquote');
+
+        if (scrollboxes.item(0))
+            {
+            NDDoResize();
+            window.onresize=NDOnResize;
+            };
+        };
+    };
+
+
+var resizeTimer = 0;
+
+function NDOnResize()
+    {
+    if (resizeTimer != 0)
+        {  clearTimeout(resizeTimer);  };
+
+    resizeTimer = setTimeout(NDDoResize, 250);
+    };
+
+
+function NDDoResize()
+    {
+    var scrollboxes = document.getElementsByTagName('blockquote');
+
+    var i;
+    var item;
+
+    i = 0;
+    while (item = scrollboxes.item(i))
+        {
+        item.style.width = 100;
+        i++;
+        };
+
+    i = 0;
+    while (item = scrollboxes.item(i))
+        {
+        item.style.width = item.parentNode.offsetWidth;
+        i++;
+        };
+
+    clearTimeout(resizeTimer);
+    resizeTimer = 0;
+    }
+
+
+
+/* ________________________________________________________________________________________________________
+
+    Class: SearchPanel
+    ________________________________________________________________________________________________________
+
+    A class handling everything associated with the search panel.
+
+    Parameters:
+
+        name - The name of the global variable that will be storing this instance.  Is needed to be able to set timeouts.
+        mode - The mode the search is going to work in.  Pass <NaturalDocs::Builder::Base->CommandLineOption()>, so the
+                   value will be something like "HTML" or "FramedHTML".
+
+    ________________________________________________________________________________________________________
+*/
+
+
+function SearchPanel(name, mode, resultsPath)
+    {
+    if (!name || !mode || !resultsPath)
+        {  alert("Incorrect parameters to SearchPanel.");  };
+
+
+    // Group: Variables
+    // ________________________________________________________________________
+
+    /*
+        var: name
+        The name of the global variable that will be storing this instance of the class.
+    */
+    this.name = name;
+
+    /*
+        var: mode
+        The mode the search is going to work in, such as "HTML" or "FramedHTML".
+    */
+    this.mode = mode;
+
+    /*
+        var: resultsPath
+        The relative path from the current HTML page to the results page directory.
+    */
+    this.resultsPath = resultsPath;
+
+    /*
+        var: keyTimeout
+        The timeout used between a keystroke and when a search is performed.
+    */
+    this.keyTimeout = 0;
+
+    /*
+        var: keyTimeoutLength
+        The length of <keyTimeout> in thousandths of a second.
+    */
+    this.keyTimeoutLength = 500;
+
+    /*
+        var: lastSearchValue
+        The last search string executed, or an empty string if none.
+    */
+    this.lastSearchValue = "";
+
+    /*
+        var: lastResultsPage
+        The last results page.  The value is only relevant if <lastSearchValue> is set.
+    */
+    this.lastResultsPage = "";
+
+    /*
+        var: deactivateTimeout
+
+        The timeout used between when a control is deactivated and when the entire panel is deactivated.  Is necessary
+        because a control may be deactivated in favor of another control in the same panel, in which case it should stay
+        active.
+    */
+    this.deactivateTimout = 0;
+
+    /*
+        var: deactivateTimeoutLength
+        The length of <deactivateTimeout> in thousandths of a second.
+    */
+    this.deactivateTimeoutLength = 200;
+
+
+
+
+    // Group: DOM Elements
+    // ________________________________________________________________________
+
+
+    // Function: DOMSearchField
+    this.DOMSearchField = function()
+        {  return document.getElementById("MSearchField");  };
+
+    // Function: DOMSearchType
+    this.DOMSearchType = function()
+        {  return document.getElementById("MSearchType");  };
+
+    // Function: DOMPopupSearchResults
+    this.DOMPopupSearchResults = function()
+        {  return document.getElementById("MSearchResults");  };
+
+    // Function: DOMPopupSearchResultsWindow
+    this.DOMPopupSearchResultsWindow = function()
+        {  return document.getElementById("MSearchResultsWindow");  };
+
+    // Function: DOMSearchPanel
+    this.DOMSearchPanel = function()
+        {  return document.getElementById("MSearchPanel");  };
+
+
+
+
+    // Group: Event Handlers
+    // ________________________________________________________________________
+
+
+    /*
+        Function: OnSearchFieldFocus
+        Called when focus is added or removed from the search field.
+    */
+    this.OnSearchFieldFocus = function(isActive)
+        {
+        this.Activate(isActive);
+        };
+
+
+    /*
+        Function: OnSearchFieldChange
+        Called when the content of the search field is changed.
+    */
+    this.OnSearchFieldChange = function()
+        {
+        if (this.keyTimeout)
+            {
+            clearTimeout(this.keyTimeout);
+            this.keyTimeout = 0;
+            };
+
+        var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+        if (searchValue != this.lastSearchValue)
+            {
+            if (searchValue != "")
+                {
+                this.keyTimeout = setTimeout(this.name + ".Search()", this.keyTimeoutLength);
+                }
+            else
+                {
+                if (this.mode == "HTML")
+                    {  this.DOMPopupSearchResultsWindow().style.display = "none";  };
+                this.lastSearchValue = "";
+                };
+            };
+        };
+
+
+    /*
+        Function: OnSearchTypeFocus
+        Called when focus is added or removed from the search type.
+    */
+    this.OnSearchTypeFocus = function(isActive)
+        {
+        this.Activate(isActive);
+        };
+
+
+    /*
+        Function: OnSearchTypeChange
+        Called when the search type is changed.
+    */
+    this.OnSearchTypeChange = function()
+        {
+        var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+        if (searchValue != "")
+            {
+            this.Search();
+            };
+        };
+
+
+
+    // Group: Action Functions
+    // ________________________________________________________________________
+
+
+    /*
+        Function: CloseResultsWindow
+        Closes the results window.
+    */
+    this.CloseResultsWindow = function()
+        {
+        this.DOMPopupSearchResultsWindow().style.display = "none";
+        this.Activate(false, true);
+        };
+
+
+    /*
+        Function: Search
+        Performs a search.
+    */
+    this.Search = function()
+        {
+        this.keyTimeout = 0;
+
+        var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+        var searchTopic = this.DOMSearchType().value;
+
+        var pageExtension = searchValue.substr(0,1);
+
+        if (pageExtension.match(/^[a-z]/i))
+            {  pageExtension = pageExtension.toUpperCase();  }
+        else if (pageExtension.match(/^[0-9]/))
+            {  pageExtension = 'Numbers';  }
+        else
+            {  pageExtension = "Symbols";  };
+
+        var resultsPage;
+        var resultsPageWithSearch;
+        var hasResultsPage;
+
+        // indexSectionsWithContent is defined in searchdata.js
+        if (indexSectionsWithContent[searchTopic][pageExtension] == true)
+            {
+            resultsPage = this.resultsPath + '/' + searchTopic + pageExtension + '.html';
+            resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+            hasResultsPage = true;
+            }
+        else
+            {
+            resultsPage = this.resultsPath + '/NoResults.html';
+            resultsPageWithSearch = resultsPage;
+            hasResultsPage = false;
+            };
+
+        var resultsFrame;
+        if (this.mode == "HTML")
+            {  resultsFrame = window.frames.MSearchResults;  }
+        else if (this.mode == "FramedHTML")
+            {  resultsFrame = window.top.frames['Content'];  };
+
+
+        if (resultsPage != this.lastResultsPage ||
+
+            // Bug in IE.  If everything becomes hidden in a run, none of them will be able to be reshown in the next for some
+            // reason.  It counts the right number of results, and you can even read the display as "block" after setting it, but it
+            // just doesn't work in IE 6 or IE 7.  So if we're on the right page but the previous search had no results, reload the
+            // page anyway to get around the bug.
+            (browserType == "IE" && hasResultsPage && resultsFrame.searchResults.lastMatchCount == 0) )
+
+            {
+            resultsFrame.location.href = resultsPageWithSearch;
+            }
+
+        // So if the results page is right and there's no IE bug, reperform the search on the existing page.  We have to check if there
+        // are results because NoResults.html doesn't have any JavaScript, and it would be useless to do anything on that page even
+        // if it did.
+        else if (hasResultsPage)
+            {
+            // We need to check if this exists in case the frame is present but didn't finish loading.
+            if (resultsFrame.searchResults)
+                {  resultsFrame.searchResults.Search(searchValue);  }
+
+            // Otherwise just reload instead of waiting.
+            else
+                {  resultsFrame.location.href = resultsPageWithSearch;  };
+            };
+
+
+        var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+        if (this.mode == "HTML" && domPopupSearchResultsWindow.style.display != "block")
+            {
+            var domSearchType = this.DOMSearchType();
+
+            var left = GetXPosition(domSearchType);
+            var top = GetYPosition(domSearchType) + domSearchType.offsetHeight;
+
+            MoveToPosition(domPopupSearchResultsWindow, left, top);
+            domPopupSearchResultsWindow.style.display = 'block';
+            };
+
+
+        this.lastSearchValue = searchValue;
+        this.lastResultsPage = resultsPage;
+        };
+
+
+
+    // Group: Activation Functions
+    // Functions that handle whether the entire panel is active or not.
+    // ________________________________________________________________________
+
+
+    /*
+        Function: Activate
+
+        Activates or deactivates the search panel, resetting things to their default values if necessary.  You can call this on every
+        control's OnBlur() and it will handle not deactivating the entire panel when focus is just switching between them transparently.
+
+        Parameters:
+
+            isActive - Whether you're activating or deactivating the panel.
+            ignoreDeactivateDelay - Set if you're positive the action will deactivate the panel and thus want to skip the delay.
+    */
+    this.Activate = function(isActive, ignoreDeactivateDelay)
+        {
+        // We want to ignore isActive being false while the results window is open.
+        if (isActive || (this.mode == "HTML" && this.DOMPopupSearchResultsWindow().style.display == "block"))
+            {
+            if (this.inactivateTimeout)
+                {
+                clearTimeout(this.inactivateTimeout);
+                this.inactivateTimeout = 0;
+                };
+
+            this.DOMSearchPanel().className = 'MSearchPanelActive';
+
+            var searchField = this.DOMSearchField();
+
+            if (searchField.value == 'Search')
+                 {  searchField.value = "";  }
+            }
+        else if (!ignoreDeactivateDelay)
+            {
+            this.inactivateTimeout = setTimeout(this.name + ".InactivateAfterTimeout()", this.inactivateTimeoutLength);
+            }
+        else
+            {
+            this.InactivateAfterTimeout();
+            };
+        };
+
+
+    /*
+        Function: InactivateAfterTimeout
+
+        Called by <inactivateTimeout>, which is set by <Activate()>.  Inactivation occurs on a timeout because a control may
+        receive OnBlur() when focus is really transferring to another control in the search panel.  In this case we don't want to
+        actually deactivate the panel because not only would that cause a visible flicker but it could also reset the search value.
+        So by doing it on a timeout instead, there's a short period where the second control's OnFocus() can cancel the deactivation.
+    */
+    this.InactivateAfterTimeout = function()
+        {
+        this.inactivateTimeout = 0;
+
+        this.DOMSearchPanel().className = 'MSearchPanelInactive';
+        this.DOMSearchField().value = "Search";
+
+	    this.lastSearchValue = "";
+	    this.lastResultsPage = "";
+        };
+    };
+
+
+
+
+/* ________________________________________________________________________________________________________
+
+   Class: SearchResults
+   _________________________________________________________________________________________________________
+
+   The class that handles everything on the search results page.
+   _________________________________________________________________________________________________________
+*/
+
+
+function SearchResults(name, mode)
+    {
+    /*
+        var: mode
+        The mode the search is going to work in, such as "HTML" or "FramedHTML".
+    */
+    this.mode = mode;
+
+    /*
+        var: lastMatchCount
+        The number of matches from the last run of <Search()>.
+    */
+    this.lastMatchCount = 0;
+
+
+    /*
+        Function: Toggle
+        Toggles the visibility of the passed element ID.
+    */
+    this.Toggle = function(id)
+        {
+        if (this.mode == "FramedHTML")
+            {  return;  };
+
+        var parentElement = document.getElementById(id);
+
+        var element = parentElement.firstChild;
+
+        while (element && element != parentElement)
+            {
+            if (element.nodeName == 'DIV' && element.className == 'ISubIndex')
+                {
+                if (element.style.display == 'block')
+                    {  element.style.display = "none";  }
+                else
+                    {  element.style.display = 'block';  }
+                };
+
+            if (element.nodeName == 'DIV' && element.hasChildNodes())
+                {  element = element.firstChild;  }
+            else if (element.nextSibling)
+                {  element = element.nextSibling;  }
+            else
+                {
+                do
+                    {
+                    element = element.parentNode;
+                    }
+                while (element && element != parentElement && !element.nextSibling);
+
+                if (element && element != parentElement)
+                    {  element = element.nextSibling;  };
+                };
+            };
+        };
+
+
+    /*
+        Function: Search
+
+        Searches for the passed string.  If there is no parameter, it takes it from the URL query.
+
+        Always returns true, since other documents may try to call it and that may or may not be possible.
+    */
+    this.Search = function(search)
+        {
+        if (!search)
+            {
+            search = window.location.search;
+            search = search.substring(1);  // Remove the leading ?
+            search = unescape(search);
+            };
+
+        search = search.replace(/^ +/, "");
+        search = search.replace(/ +$/, "");
+        search = search.toLowerCase();
+
+        if (search.match(/[^a-z0-9]/)) // Just a little speedup so it doesn't have to go through the below unnecessarily.
+            {
+            search = search.replace(/\_/g, "_und");
+            search = search.replace(/\ +/gi, "_spc");
+            search = search.replace(/\~/g, "_til");
+            search = search.replace(/\!/g, "_exc");
+            search = search.replace(/\@/g, "_att");
+            search = search.replace(/\#/g, "_num");
+            search = search.replace(/\$/g, "_dol");
+            search = search.replace(/\%/g, "_pct");
+            search = search.replace(/\^/g, "_car");
+            search = search.replace(/\&/g, "_amp");
+            search = search.replace(/\*/g, "_ast");
+            search = search.replace(/\(/g, "_lpa");
+            search = search.replace(/\)/g, "_rpa");
+            search = search.replace(/\-/g, "_min");
+            search = search.replace(/\+/g, "_plu");
+            search = search.replace(/\=/g, "_equ");
+            search = search.replace(/\{/g, "_lbc");
+            search = search.replace(/\}/g, "_rbc");
+            search = search.replace(/\[/g, "_lbk");
+            search = search.replace(/\]/g, "_rbk");
+            search = search.replace(/\:/g, "_col");
+            search = search.replace(/\;/g, "_sco");
+            search = search.replace(/\"/g, "_quo");
+            search = search.replace(/\'/g, "_apo");
+            search = search.replace(/\</g, "_lan");
+            search = search.replace(/\>/g, "_ran");
+            search = search.replace(/\,/g, "_com");
+            search = search.replace(/\./g, "_per");
+            search = search.replace(/\?/g, "_que");
+            search = search.replace(/\//g, "_sla");
+            search = search.replace(/[^a-z0-9\_]i/gi, "_zzz");
+            };
+
+        var resultRows = document.getElementsByTagName("div");
+        var matches = 0;
+
+        var i = 0;
+        while (i < resultRows.length)
+            {
+            var row = resultRows.item(i);
+
+            if (row.className == "SRResult")
+                {
+                var rowMatchName = row.id.toLowerCase();
+                rowMatchName = rowMatchName.replace(/^sr\d*_/, '');
+
+                if (search.length <= rowMatchName.length && rowMatchName.substr(0, search.length) == search)
+                    {
+                    row.style.display = "block";
+                    matches++;
+                    }
+                else
+                    {  row.style.display = "none";  };
+                };
+
+            i++;
+            };
+
+        document.getElementById("Searching").style.display="none";
+
+        if (matches == 0)
+            {  document.getElementById("NoMatches").style.display="block";  }
+        else
+            {  document.getElementById("NoMatches").style.display="none";  }
+
+        this.lastMatchCount = matches;
+
+        return true;
+        };
+    };
+
diff --git a/doc/devdocs/javascript/searchdata.js b/doc/devdocs/javascript/searchdata.js
new file mode 100644
index 0000000..a77c64a
--- /dev/null
+++ b/doc/devdocs/javascript/searchdata.js
@@ -0,0 +1,212 @@
+var indexSectionsWithContent = {
+   "General": {
+      "Symbols": true,
+      "Numbers": false,
+      "A": true,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": true,
+      "H": true,
+      "I": true,
+      "J": true,
+      "K": true,
+      "L": true,
+      "M": true,
+      "N": true,
+      "O": true,
+      "P": true,
+      "Q": true,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": true,
+      "X": true,
+      "Y": true,
+      "Z": true
+      },
+   "Constructor": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": true,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": true,
+      "H": true,
+      "I": true,
+      "J": true,
+      "K": true,
+      "L": true,
+      "M": true,
+      "N": true,
+      "O": true,
+      "P": true,
+      "Q": false,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": true,
+      "X": true,
+      "Y": true,
+      "Z": true
+      },
+   "Functions": {
+      "Symbols": true,
+      "Numbers": false,
+      "A": true,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": true,
+      "H": true,
+      "I": true,
+      "J": false,
+      "K": false,
+      "L": true,
+      "M": true,
+      "N": true,
+      "O": true,
+      "P": true,
+      "Q": false,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": true,
+      "X": false,
+      "Y": false,
+      "Z": true
+      },
+   "Files": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": true,
+      "B": false,
+      "C": true,
+      "D": false,
+      "E": false,
+      "F": false,
+      "G": false,
+      "H": false,
+      "I": false,
+      "J": false,
+      "K": false,
+      "L": false,
+      "M": false,
+      "N": false,
+      "O": true,
+      "P": false,
+      "Q": false,
+      "R": false,
+      "S": true,
+      "T": false,
+      "U": false,
+      "V": true,
+      "W": true,
+      "X": false,
+      "Y": false,
+      "Z": false
+      },
+   "Constants": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": false,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": false,
+      "H": false,
+      "I": true,
+      "J": false,
+      "K": true,
+      "L": true,
+      "M": true,
+      "N": false,
+      "O": true,
+      "P": false,
+      "Q": false,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": false,
+      "X": true,
+      "Y": true,
+      "Z": true
+      },
+   "Classes": {
+      "Symbols": false,
+      "Numbers": false,
+      "A": false,
+      "B": false,
+      "C": false,
+      "D": false,
+      "E": false,
+      "F": false,
+      "G": false,
+      "H": false,
+      "I": false,
+      "J": false,
+      "K": false,
+      "L": false,
+      "M": false,
+      "N": false,
+      "O": true,
+      "P": false,
+      "Q": false,
+      "R": false,
+      "S": false,
+      "T": false,
+      "U": true,
+      "V": false,
+      "W": false,
+      "X": false,
+      "Y": false,
+      "Z": false
+      },
+   "Properties": {
+      "Symbols": true,
+      "Numbers": false,
+      "A": true,
+      "B": true,
+      "C": true,
+      "D": true,
+      "E": true,
+      "F": true,
+      "G": true,
+      "H": true,
+      "I": true,
+      "J": true,
+      "K": true,
+      "L": true,
+      "M": true,
+      "N": true,
+      "O": true,
+      "P": true,
+      "Q": true,
+      "R": true,
+      "S": true,
+      "T": true,
+      "U": true,
+      "V": true,
+      "W": true,
+      "X": true,
+      "Y": true,
+      "Z": true
+      }
+   }
\ No newline at end of file
diff --git a/doc/devdocs/search/ClassesO.html b/doc/devdocs/search/ClassesO.html
new file mode 100644
index 0000000..ef84745
--- /dev/null
+++ b/doc/devdocs/search/ClassesO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_OpenLayers><div class=IEntry><a href="../files/OpenLayers-js.html#OpenLayers" target=_parent class=ISymbol>OpenLayers</a></div></div><div class=SRResult id=SR_OpenLayers_perAjax><div class=IEntry><a href="../files/OpenLayers/Ajax-js.html#OpenLayers.Ajax" target=_parent class=ISymbol>OpenLayers.Ajax</a></div></div><div class=SRResult id=SR_OpenLayers_perAjax_p [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ClassesU.html b/doc/devdocs/search/ClassesU.html
new file mode 100644
index 0000000..798b8f9
--- /dev/null
+++ b/doc/devdocs/search/ClassesU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Util><div class=IEntry><a href="../files/OpenLayers/Util-js.html#Util" target=_parent class=ISymbol>Util</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsB.html b/doc/devdocs/search/ConstantsB.html
new file mode 100644
index 0000000..b655329
--- /dev/null
+++ b/doc/devdocs/search/ConstantsB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_BACKGROUND_undID_undSUFFIX><div class=IEntry><a href="../files/OpenLayers/Renderer/Elements-js.html#OpenLayers.Renderer.Elements.BACKGROUND_ID_SUFFIX" target=_parent class=ISymbol>BACKGROUND_ID_SUFFIX</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Elements</span></div></div><div class=SRResult id=SR_BROWSER_undEVENT [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsC.html b/doc/devdocs/search/ConstantsC.html
new file mode 100644
index 0000000..2ee37f5
--- /dev/null
+++ b/doc/devdocs/search/ConstantsC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_CORNER_undSIZE><div class=IEntry><a href="../files/OpenLayers/Popup/AnchoredBubble-js.html#OpenLayers.Popup.AnchoredBubble.CORNER_SIZE" target=_parent class=ISymbol>CORNER_SIZE</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>AnchoredBubble</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsD.html b/doc/devdocs/search/ConstantsD.html
new file mode 100644
index 0000000..18281fb
--- /dev/null
+++ b/doc/devdocs/search/ConstantsD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_dataFrom><div class=IEntry><a href="../files/OpenLayers/Layer/PointTrack-js.html#OpenLayers.Layer.PointTrack.OpenLayers.Layer.PointTrack.dataFrom" target=_parent class=ISymbol>dataFrom</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>PointTrack.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer.<span class=HB [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsE.html b/doc/devdocs/search/ConstantsE.html
new file mode 100644
index 0000000..860c350
--- /dev/null
+++ b/doc/devdocs/search/ConstantsE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_EVENT_undTYPES><div class=IEntry><a href="javascript:searchResults.Toggle('SR_EVENT_undTYPES')" class=ISymbol>EVENT_TYPES</a><div class=ISubIndex><a href="../files/OpenLayers/Control-js.html#OpenLayers.Control.EVENT_TYPES" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control</a><a href="../files/OpenLayers/Control/DrawFeature-js.html#OpenLay [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsF.html b/doc/devdocs/search/ConstantsF.html
new file mode 100644
index 0000000..247d8d9
--- /dev/null
+++ b/doc/devdocs/search/ConstantsF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_FOLDER_undPARAMS><div class=IEntry><a href="../files/OpenLayers/Layer/MapGuide-js.html#OpenLayers.Layer.MapGuide.FOLDER_PARAMS" target=_parent class=ISymbol>FOLDER_PARAMS</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapGuide</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRSta [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsI.html b/doc/devdocs/search/ConstantsI.html
new file mode 100644
index 0000000..43a0612
--- /dev/null
+++ b/doc/devdocs/search/ConstantsI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_IMAGE_undEXTENSIONS><div class=IEntry><a href="../files/OpenLayers/Layer/KaMapCache-js.html#OpenLayers.Layer.KaMapCache.IMAGE_EXTENSIONS" target=_parent class=ISymbol>IMAGE_EXTENSIONS</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMapCache</span></div></div><div class=SRResult id=SR_INCHES_undPER_undUNIT><div class=I [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsK.html b/doc/devdocs/search/ConstantsK.html
new file mode 100644
index 0000000..5dc4966
--- /dev/null
+++ b/doc/devdocs/search/ConstantsK.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_KEY_undBACKSPACE><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Event.KEY_BACKSPACE" target=_parent class=ISymbol>KEY_BACKSPACE</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Event</span></div></div><div class=SRResult id=SR_KEY_undDELETE><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Event.KEY_D [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsL.html b/doc/devdocs/search/ConstantsL.html
new file mode 100644
index 0000000..d876ca9
--- /dev/null
+++ b/doc/devdocs/search/ConstantsL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_LABEL_undALIGN><div class=IEntry><a href="javascript:searchResults.Toggle('SR_LABEL_undALIGN')" class=ISymbol>LABEL_ALIGN</a><div class=ISubIndex><a href="../files/OpenLayers/Renderer/Canvas-js.html#OpenLayers.Renderer.Canvas.OpenLayers.Renderer.Canvas.LABEL_ALIGN" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsM.html b/doc/devdocs/search/ConstantsM.html
new file mode 100644
index 0000000..51c94f0
--- /dev/null
+++ b/doc/devdocs/search/ConstantsM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_MAX_undPIXEL><div class=IEntry><a href="../files/OpenLayers/Renderer/SVG-js.html#OpenLayers.Renderer.SVG.MAX_PIXEL" target=_parent class=ISymbol>MAX_PIXEL</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Renderer.SVG</span></div></div><div class=SRResult id=SR_MAX_undZOOM_undLEVEL><div class=IEntry><a href="javascript:searchResults.Toggle('SR_MAX_un [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsO.html b/doc/devdocs/search/ConstantsO.html
new file mode 100644
index 0000000..1018228
--- /dev/null
+++ b/doc/devdocs/search/ConstantsO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_OVERLAY_undPARAMS><div class=IEntry><a href="../files/OpenLayers/Layer/MapGuide-js.html#OpenLayers.Layer.MapGuide.OVERLAY_PARAMS" target=_parent class=ISymbol>OVERLAY_PARAMS</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapGuide</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SR [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsR.html b/doc/devdocs/search/ConstantsR.html
new file mode 100644
index 0000000..655c396
--- /dev/null
+++ b/doc/devdocs/search/ConstantsR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_RESHAPE><div class=IEntry><a href="../files/OpenLayers/Control/ModifyFeature-js.html#OpenLayers.Control.ModifyFeature.RESHAPE" target=_parent class=ISymbol>RESHAPE</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>ModifyFeature</span></div></div><div class=SRResult id=SR_RESIZE><div class=IEntry><a href="../files/OpenLa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsS.html b/doc/devdocs/search/ConstantsS.html
new file mode 100644
index 0000000..0978161
--- /dev/null
+++ b/doc/devdocs/search/ConstantsS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_serviceTypes><div class=IEntry><a href="../files/OpenLayers/Format/Context-js.html#OpenLayers.Format.Context.OpenLayers.Format.Context.serviceTypes" target=_parent class=ISymbol>serviceTypes</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Context.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format.<span cla [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsT.html b/doc/devdocs/search/ConstantsT.html
new file mode 100644
index 0000000..4c6b29a
--- /dev/null
+++ b/doc/devdocs/search/ConstantsT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_TILE_undHEIGHT><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.TILE_HEIGHT" target=_parent class=ISymbol>TILE_HEIGHT</a>, <span class=IParent>OpenLayers.Map</span></div></div><div class=SRResult id=SR_TILE_undPARAMS><div class=IEntry><a href="../files/OpenLayers/Layer/MapGuide-js.html#OpenLayers.Layer.MapGuide.TILE_PARAMS" target=_pa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsU.html b/doc/devdocs/search/ConstantsU.html
new file mode 100644
index 0000000..ca8b8f9
--- /dev/null
+++ b/doc/devdocs/search/ConstantsU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_URL_undHASH_undFACTOR><div class=IEntry><a href="../files/OpenLayers/Layer/HTTPRequest-js.html#OpenLayers.Layer.HTTPRequest.URL_HASH_FACTOR" target=_parent class=ISymbol>URL_HASH_FACTOR</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>HTTPRequest</span></div></div></table><div class=SRStatus id=Searching>Searching...</di [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsV.html b/doc/devdocs/search/ConstantsV.html
new file mode 100644
index 0000000..1b3476a
--- /dev/null
+++ b/doc/devdocs/search/ConstantsV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_v2><div class=IEntry><a href="../files/OpenLayers/Layer/Google-js.html#OpenLayers.Layer.Google.OpenLayers.Layer.Google.v2" target=_parent class=ISymbol>v2</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google</span></div></div> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsX.html b/doc/devdocs/search/ConstantsX.html
new file mode 100644
index 0000000..b4b6bd4
--- /dev/null
+++ b/doc/devdocs/search/ConstantsX.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_X><div class=IEntry><a href="../files/OpenLayers/Control/PanZoom-js.html#OpenLayers.Control.PanZoom.X" target=_parent class=ISymbol>X</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoom</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><sc [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsY.html b/doc/devdocs/search/ConstantsY.html
new file mode 100644
index 0000000..0c6bff4
--- /dev/null
+++ b/doc/devdocs/search/ConstantsY.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Y><div class=IEntry><a href="../files/OpenLayers/Control/PanZoom-js.html#OpenLayers.Control.PanZoom.Y" target=_parent class=ISymbol>Y</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>PanZoom</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><sc [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstantsZ.html b/doc/devdocs/search/ConstantsZ.html
new file mode 100644
index 0000000..74b5974
--- /dev/null
+++ b/doc/devdocs/search/ConstantsZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Z_undINDEX_undBASE><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.Z_INDEX_BASE" target=_parent class=ISymbol>Z_INDEX_BASE</a>, <span class=IParent>OpenLayers.Map</span></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorA.html b/doc/devdocs/search/ConstructorA.html
new file mode 100644
index 0000000..10df3bb
--- /dev/null
+++ b/doc/devdocs/search/ConstructorA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Anchored><div class=IEntry><a href="../files/OpenLayers/Popup/Anchored-js.html#OpenLayers.Popup.Anchored.OpenLayers.Popup.Anchored" target=_parent class=ISymbol>Anchored</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Popup.<span class=HB> </span>Anchored.<span class=HB> </span>OpenLayers.<span class=HB> </span>Popup</span></div></div><div class=SR [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorB.html b/doc/devdocs/search/ConstructorB.html
new file mode 100644
index 0000000..dc3e704
--- /dev/null
+++ b/doc/devdocs/search/ConstructorB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Base><div class=IEntry><a href="javascript:searchResults.Toggle('SR_Base')" class=ISymbol>Base</a><div class=ISubIndex><a href="../files/OpenLayers/Ajax-js.html#OpenLayers.Ajax.Base.OpenLayers.Ajax.Base" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Base.<span class=HB> </span>OpenLayers.Ajax</a><a href="../files/O [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorC.html b/doc/devdocs/search/ConstructorC.html
new file mode 100644
index 0000000..6649f57
--- /dev/null
+++ b/doc/devdocs/search/ConstructorC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Canvas><div class=IEntry><a href="../files/OpenLayers/Renderer/Canvas-js.html#OpenLayers.Renderer.Canvas.OpenLayers.Renderer.Canvas" target=_parent class=ISymbol>Canvas</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Renderer.<span class=HB> </span>Canvas.<span class=HB> </span>OpenLayers.<span class=HB> </span>Renderer</span></div></div><div class [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorD.html b/doc/devdocs/search/ConstructorD.html
new file mode 100644
index 0000000..fb9f490
--- /dev/null
+++ b/doc/devdocs/search/ConstructorD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Drag><div class=IEntry><a href="../files/OpenLayers/Handler/Drag-js.html#OpenLayers.Handler.Drag.OpenLayers.Handler.Drag" target=_parent class=ISymbol>Drag</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Drag.<span class=HB> </span>OpenLayers.<span class=HB> </span>Handler</span></div></div><div class=SRResult id=SR_D [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorE.html b/doc/devdocs/search/ConstructorE.html
new file mode 100644
index 0000000..3c07f26
--- /dev/null
+++ b/doc/devdocs/search/ConstructorE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_EditingToolbar><div class=IEntry><a href="../files/OpenLayers/Control/EditingToolbar-js.html#OpenLayers.Control.EditingToolbar.OpenLayers.Control.EditingToolbar" target=_parent class=ISymbol>EditingToolbar</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>EditingToolbar.<span class=HB> </span>OpenLayers.<span class=HB>  [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorF.html b/doc/devdocs/search/ConstructorF.html
new file mode 100644
index 0000000..abc765c
--- /dev/null
+++ b/doc/devdocs/search/ConstructorF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Feature><div class=IEntry><a href="javascript:searchResults.Toggle('SR_Feature')" class=ISymbol>Feature</a><div class=ISubIndex><a href="../files/OpenLayers/Feature-js.html#OpenLayers.Feature.OpenLayers.Feature" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>OpenLayers</a><a href="../files/OpenLayers/Handler/Feat [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorG.html b/doc/devdocs/search/ConstructorG.html
new file mode 100644
index 0000000..6a208e2
--- /dev/null
+++ b/doc/devdocs/search/ConstructorG.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Gears><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL/Gears-js.html#OpenLayers.Protocol.SQL.Gears.OpenLayers.Protocol.SQL.Gears" target=_parent class=ISymbol>Gears</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears.<span class=HB> </span>OpenLayers.<span class=HB> </span>Prot [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorH.html b/doc/devdocs/search/ConstructorH.html
new file mode 100644
index 0000000..cf7c1fc
--- /dev/null
+++ b/doc/devdocs/search/ConstructorH.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Handler><div class=IEntry><a href="../files/OpenLayers/Handler-js.html#OpenLayers.Handler.OpenLayers.Handler" target=_parent class=ISymbol>Handler</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_Hover><div class=IEntry><a href="../files/OpenLayers/Handler/Hover-js [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorI.html b/doc/devdocs/search/ConstructorI.html
new file mode 100644
index 0000000..8dc17e1
--- /dev/null
+++ b/doc/devdocs/search/ConstructorI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Icon><div class=IEntry><a href="../files/OpenLayers/Icon-js.html#OpenLayers.Icon.OpenLayers.Icon" target=_parent class=ISymbol>Icon</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Icon.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_IFrame><div class=IEntry><a href="../files/OpenLayers/Tile/Image/IFrame-js.html#OpenLay [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorJ.html b/doc/devdocs/search/ConstructorJ.html
new file mode 100644
index 0000000..485c9ca
--- /dev/null
+++ b/doc/devdocs/search/ConstructorJ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_JSON><div class=IEntry><a href="../files/OpenLayers/Format/JSON-js.html#OpenLayers.Format.JSON.OpenLayers.Format.JSON" target=_parent class=ISymbol>JSON</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>JSON.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format</span></div></div></table><div class=SRStatus id=S [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorK.html b/doc/devdocs/search/ConstructorK.html
new file mode 100644
index 0000000..9bcc417
--- /dev/null
+++ b/doc/devdocs/search/ConstructorK.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_KaMap><div class=IEntry><a href="../files/OpenLayers/Layer/KaMap-js.html#OpenLayers.Layer.KaMap.OpenLayers.Layer.KaMap" target=_parent class=ISymbol>KaMap</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMap.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer</span></div></div><div class=SRResult id=SR_KaMap [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorL.html b/doc/devdocs/search/ConstructorL.html
new file mode 100644
index 0000000..5153f8f
--- /dev/null
+++ b/doc/devdocs/search/ConstructorL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Layer><div class=IEntry><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.OpenLayers.Layer" target=_parent class=ISymbol>Layer</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_LayerSwitcher><div class=IEntry><a href="../files/OpenLayers/Control/LayerSwitche [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorM.html b/doc/devdocs/search/ConstructorM.html
new file mode 100644
index 0000000..869ef6e
--- /dev/null
+++ b/doc/devdocs/search/ConstructorM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Map><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.OpenLayers.Map" target=_parent class=ISymbol>Map</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Map.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_MapGuide><div class=IEntry><a href="../files/OpenLayers/Layer/MapGuide-js.html#OpenLayers.Lay [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorN.html b/doc/devdocs/search/ConstructorN.html
new file mode 100644
index 0000000..4c2e861
--- /dev/null
+++ b/doc/devdocs/search/ConstructorN.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Navigation><div class=IEntry><a href="../files/OpenLayers/Control/Navigation-js.html#OpenLayers.Control.Navigation.OpenLayers.Control.Navigation" target=_parent class=ISymbol>Navigation</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Navigation.<span class=HB> </span>OpenLayers.<span class=HB> </span>Control</span></d [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorO.html b/doc/devdocs/search/ConstructorO.html
new file mode 100644
index 0000000..64d7864
--- /dev/null
+++ b/doc/devdocs/search/ConstructorO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_OSM><div class=IEntry><a href="../files/OpenLayers/Format/OSM-js.html#OpenLayers.Format.OSM.OpenLayers.Format.OSM" target=_parent class=ISymbol>OSM</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OSM.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_OverviewMap> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorP.html b/doc/devdocs/search/ConstructorP.html
new file mode 100644
index 0000000..3b60658
--- /dev/null
+++ b/doc/devdocs/search/ConstructorP.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Paging><div class=IEntry><a href="../files/OpenLayers/Strategy/Paging-js.html#OpenLayers.Strategy.Paging.OpenLayers.Strategy.Paging" target=_parent class=ISymbol>Paging</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging.<span class=HB> </span>OpenLayers.<span class=HB> </span>Strategy</span></div></div><div class [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorR.html b/doc/devdocs/search/ConstructorR.html
new file mode 100644
index 0000000..8202b8f
--- /dev/null
+++ b/doc/devdocs/search/ConstructorR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Raster><div class=IEntry><a href="../files/OpenLayers/Symbolizer/Raster-js.html#OpenLayers.Symbolizer.Raster.OpenLayers.Symbolizer.Raster" target=_parent class=ISymbol>Raster</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Symbolizer.<span class=HB> </span>Raster.<span class=HB> </span>OpenLayers.<span class=HB> </span>Symbolizer</span></div></div> [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorS.html b/doc/devdocs/search/ConstructorS.html
new file mode 100644
index 0000000..e25ada3
--- /dev/null
+++ b/doc/devdocs/search/ConstructorS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Save><div class=IEntry><a href="../files/OpenLayers/Strategy/Save-js.html#OpenLayers.Strategy.Save.OpenLayers.Strategy.Save" target=_parent class=ISymbol>Save</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Save.<span class=HB> </span>OpenLayers.<span class=HB> </span>Strategy</span></div></div><div class=SRResult id [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorT.html b/doc/devdocs/search/ConstructorT.html
new file mode 100644
index 0000000..8aada3c
--- /dev/null
+++ b/doc/devdocs/search/ConstructorT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Text><div class=IEntry><a href="javascript:searchResults.Toggle('SR_Text')" class=ISymbol>Text</a><div class=ISubIndex><a href="../files/OpenLayers/Format/Text-js.html#OpenLayers.Format.Text.OpenLayers.Format.Text" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>Text.<span class=HB> </span>OpenLayers.<span class=HB [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorU.html b/doc/devdocs/search/ConstructorU.html
new file mode 100644
index 0000000..76c2521
--- /dev/null
+++ b/doc/devdocs/search/ConstructorU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Untiled><div class=IEntry><a href="javascript:searchResults.Toggle('SR_Untiled')" class=ISymbol>Untiled</a><div class=ISubIndex><a href="../files/OpenLayers/Layer/MapServer/Untiled-js.html#OpenLayers.Layer.MapServer.Untiled.OpenLayers.Layer.MapServer.Untiled" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>MapServer [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorV.html b/doc/devdocs/search/ConstructorV.html
new file mode 100644
index 0000000..9daf61c
--- /dev/null
+++ b/doc/devdocs/search/ConstructorV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_v0_und3_und1><div class=IEntry><a href="../files/OpenLayers/Format/OWSContext/v0_3_1-js.html#OpenLayers.Format.OWSContext.v0_3_1.OpenLayers.Format.OWSContext.v0_3_1" target=_parent class=ISymbol>v0_3_1</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext.<span class=HB> </span>v0_3_1.<span class=HB> </span>OpenLa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorW.html b/doc/devdocs/search/ConstructorW.html
new file mode 100644
index 0000000..185c45f
--- /dev/null
+++ b/doc/devdocs/search/ConstructorW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_WFS><div class=IEntry><a href="javascript:searchResults.Toggle('SR_WFS')" class=ISymbol>WFS</a><div class=ISubIndex><a href="../files/OpenLayers/Feature/WFS-js.html#OpenLayers.Feature.WFS.OpenLayers.Feature.WFS" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Feature.<span class=HB> </span>WFS.<span class=HB> </span>OpenLayers.<span class=HB> < [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorX.html b/doc/devdocs/search/ConstructorX.html
new file mode 100644
index 0000000..0306625
--- /dev/null
+++ b/doc/devdocs/search/ConstructorX.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_XML><div class=IEntry><a href="../files/OpenLayers/Format/XML-js.html#OpenLayers.Format.XML.OpenLayers.Format.XML" target=_parent class=ISymbol>XML</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>XML.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_XYZ><div cla [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorY.html b/doc/devdocs/search/ConstructorY.html
new file mode 100644
index 0000000..3033d64
--- /dev/null
+++ b/doc/devdocs/search/ConstructorY.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Yahoo><div class=IEntry><a href="../files/OpenLayers/Layer/Yahoo-js.html#OpenLayers.Layer.Yahoo.OpenLayers.Layer.Yahoo" target=_parent class=ISymbol>Yahoo</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Yahoo.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer</span></div></div></table><div class=SRStatus id= [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/ConstructorZ.html b/doc/devdocs/search/ConstructorZ.html
new file mode 100644
index 0000000..7732e07
--- /dev/null
+++ b/doc/devdocs/search/ConstructorZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Zoomify><div class=IEntry><a href="../files/OpenLayers/Layer/Zoomify-js.html#OpenLayers.Layer.Zoomify.OpenLayers.Layer.Zoomify" target=_parent class=ISymbol>Zoomify</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Zoomify.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer</span></div></div><div class=SRResult [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FilesA.html b/doc/devdocs/search/FilesA.html
new file mode 100644
index 0000000..f9c9172
--- /dev/null
+++ b/doc/devdocs/search/FilesA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Ajax_perjs><div class=IEntry><a href="../files/OpenLayers/Ajax-js.html#Ajax.js" target=_parent class=ISymbol>Ajax.js</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FilesC.html b/doc/devdocs/search/FilesC.html
new file mode 100644
index 0000000..4f568c7
--- /dev/null
+++ b/doc/devdocs/search/FilesC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Class_perjs><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Class-js.html#Class.js" target=_parent class=ISymbol>Class.js</a></div></div><div class=SRResult id=SR_CSWGetDomain_perjs><div class=IEntry><a href="../files/OpenLayers/Format/CSWGetDomain-js.html#CSWGetDomain.js" target=_parent class=ISymbol>CSWGetDomain.js</a></div></div><div class=SRResul [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FilesO.html b/doc/devdocs/search/FilesO.html
new file mode 100644
index 0000000..1d83f8f
--- /dev/null
+++ b/doc/devdocs/search/FilesO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_OpenLayers_spcBase_spcTypes><div class=IEntry><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers_Base_Types" target=_parent class=ISymbol>OpenLayers Base Types</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FilesS.html b/doc/devdocs/search/FilesS.html
new file mode 100644
index 0000000..3813296
--- /dev/null
+++ b/doc/devdocs/search/FilesS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_SOS_perjs><div class=IEntry><a href="../files/OpenLayers/Protocol/SOS-js.html#SOS.js" target=_parent class=ISymbol>SOS.js</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FilesV.html b/doc/devdocs/search/FilesV.html
new file mode 100644
index 0000000..18b067d
--- /dev/null
+++ b/doc/devdocs/search/FilesV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_v3_perjs><div class=IEntry><a href="../files/OpenLayers/Layer/Google/v3-js.html#v3.js" target=_parent class=ISymbol>v3.js</a></div></div></table><div class=SRStatus id=Searching>Searching...</div><div class=SRStatus id=NoMatches>No Matches</div><script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FilesW.html b/doc/devdocs/search/FilesW.html
new file mode 100644
index 0000000..e1f2506
--- /dev/null
+++ b/doc/devdocs/search/FilesW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_WFS_perjs><div class=IEntry><a href="../files/OpenLayers/Protocol/WFS-js.html#WFS.js" target=_parent class=ISymbol>WFS.js</a></div></div><div class=SRResult id=SR_WFSDescribeFeatureType_perjs><div class=IEntry><a href="../files/OpenLayers/Format/WFSDescribeFeatureType-js.html#WFSDescribeFeatureType.js" target=_parent class=ISymbol>WFSDescribeFeatureType.js</a [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsA.html b/doc/devdocs/search/FunctionsA.html
new file mode 100644
index 0000000..9bbd2f4
--- /dev/null
+++ b/doc/devdocs/search/FunctionsA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_abort><div class=IEntry><a href="javascript:searchResults.Toggle('SR_abort')" class=ISymbol>abort</a><div class=ISubIndex><a href="../files/OpenLayers/Protocol-js.html#OpenLayers.Protocol.abort" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Protocol</a><a href="../files/OpenLayers/Protocol/HTTP-js.html#OpenLayers.Protocol.HTTP.abort" target=_ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsB.html b/doc/devdocs/search/FunctionsB.html
new file mode 100644
index 0000000..f02cd18
--- /dev/null
+++ b/doc/devdocs/search/FunctionsB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_baseLayerDraw><div class=IEntry><a href="../files/OpenLayers/Control/OverviewMap-js.html#OpenLayers.Control.OverviewMap.baseLayerDraw" target=_parent class=ISymbol>baseLayerDraw</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>OverviewMap</span></div></div><div class=SRResult id=SR_beforeSelectFeature><div class=IEntry [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsC.html b/doc/devdocs/search/FunctionsC.html
new file mode 100644
index 0000000..0b9cf09
--- /dev/null
+++ b/doc/devdocs/search/FunctionsC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_cacheFeatures><div class=IEntry><a href="javascript:searchResults.Toggle('SR_cacheFeatures')" class=ISymbol>cacheFeatures</a><div class=ISubIndex><a href="../files/OpenLayers/Strategy/Cluster-js.html#OpenLayers.Strategy.Cluster.cacheFeatures" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Cluster</a><a href="../ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsD.html b/doc/devdocs/search/FunctionsD.html
new file mode 100644
index 0000000..4dc07f3
--- /dev/null
+++ b/doc/devdocs/search/FunctionsD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_dashStyle><div class=IEntry><a href="javascript:searchResults.Toggle('SR_dashStyle')" class=ISymbol>dashStyle</a><div class=ISubIndex><a href="../files/OpenLayers/Renderer/SVG-js.html#OpenLayers.Renderer.SVG.dashStyle" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Renderer.SVG</a><a href="../files/OpenLayers/Renderer/VML-js.html#OpenLayers.Re [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsE.html b/doc/devdocs/search/FunctionsE.html
new file mode 100644
index 0000000..10403fa
--- /dev/null
+++ b/doc/devdocs/search/FunctionsE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_easeIn><div class=IEntry><a href="javascript:searchResults.Toggle('SR_easeIn')" class=ISymbol>easeIn</a><div class=ISubIndex><a href="../files/OpenLayers/Tween-js.html#OpenLayers.Easing.Expo.easeIn" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Easing.Expo</a><a href="../files/OpenLayers/Tween-js.html#OpenLayers.Easing.Linear.easeIn" target=_ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsF.html b/doc/devdocs/search/FunctionsF.html
new file mode 100644
index 0000000..e99010b
--- /dev/null
+++ b/doc/devdocs/search/FunctionsF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_False><div class=IEntry><a href="../files/OpenLayers/BaseTypes-js.html#OpenLayers.Function.False" target=_parent class=ISymbol>False</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Function</span></div></div><div class=SRResult id=SR_feature><div class=IEntry><a href="../files/OpenLayers/Format/GeoJSON-js.html#OpenLayers.Format.GeoJSON.extract.feat [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsG.html b/doc/devdocs/search/FunctionsG.html
new file mode 100644
index 0000000..c6d2f94
--- /dev/null
+++ b/doc/devdocs/search/FunctionsG.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_geometry><div class=IEntry><a href="../files/OpenLayers/Format/GeoJSON-js.html#OpenLayers.Format.GeoJSON.extract.geometry" target=_parent class=ISymbol>geometry</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>GeoJSON.<span class=HB> </span>extract</span></div></div><div class=SRResult id=SR_geometryClone><div class=IEn [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsH.html b/doc/devdocs/search/FunctionsH.html
new file mode 100644
index 0000000..0f47d9c
--- /dev/null
+++ b/doc/devdocs/search/FunctionsH.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_handle><div class=IEntry><a href="../files/OpenLayers/Handler/Feature-js.html#OpenLayers.Handler.Feature.handle" target=_parent class=ISymbol>handle</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>Feature</span></div></div><div class=SRResult id=SR_handleAdd><div class=IEntry><a href="../files/OpenLayers/Strategy/Filt [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsI.html b/doc/devdocs/search/FunctionsI.html
new file mode 100644
index 0000000..3eb2a96
--- /dev/null
+++ b/doc/devdocs/search/FunctionsI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_i18n><div class=IEntry><a href="../files/OpenLayers/Lang-js.html#OpenLayers.Lang.OpenLayers.i18n" target=_parent class=ISymbol>i18n</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Lang.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_ignoreEvent><div class=IEntry><a href="../files/OpenLayers/Control/LayerSwitcher-js.htm [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsL.html b/doc/devdocs/search/FunctionsL.html
new file mode 100644
index 0000000..7063084
--- /dev/null
+++ b/doc/devdocs/search/FunctionsL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_layerToContext><div class=IEntry><a href="../files/OpenLayers/Format/WMC-js.html#OpenLayers.Format.WMC.layerToContext" target=_parent class=ISymbol>layerToContext</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.WMC</span></div></div><div class=SRResult id=SR_leaveMode><div class=IEntry><a href="../files/OpenLayers/Control/MouseToolbar-js.htm [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsM.html b/doc/devdocs/search/FunctionsM.html
new file mode 100644
index 0000000..5971860
--- /dev/null
+++ b/doc/devdocs/search/FunctionsM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_mapDivClick><div class=IEntry><a href="../files/OpenLayers/Control/OverviewMap-js.html#OpenLayers.Control.OverviewMap.mapDivClick" target=_parent class=ISymbol>mapDivClick</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>OverviewMap</span></div></div><div class=SRResult id=SR_markerClick><div class=IEntry><a href="../f [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsN.html b/doc/devdocs/search/FunctionsN.html
new file mode 100644
index 0000000..e621dbe
--- /dev/null
+++ b/doc/devdocs/search/FunctionsN.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_nextTrigger><div class=IEntry><a href="../files/OpenLayers/Control/NavigationHistory-js.html#OpenLayers.Control.NavigationHistory.nextTrigger" target=_parent class=ISymbol>nextTrigger</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>NavigationHistory</span></div></div><div class=SRResult id=SR_nodeFactory><div class=IE [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsO.html b/doc/devdocs/search/FunctionsO.html
new file mode 100644
index 0000000..b9089db
--- /dev/null
+++ b/doc/devdocs/search/FunctionsO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_object><div class=IEntry><a href="../files/OpenLayers/Format/JSON-js.html#OpenLayers.Format.JSON.serialize.object" target=_parent class=ISymbol>object</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>JSON.<span class=HB> </span>serialize</span></div></div><div class=SRResult id=SR_observe><div class=IEntry><a href="../f [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsP.html b/doc/devdocs/search/FunctionsP.html
new file mode 100644
index 0000000..d68240e
--- /dev/null
+++ b/doc/devdocs/search/FunctionsP.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_page><div class=IEntry><a href="../files/OpenLayers/Strategy/Paging-js.html#OpenLayers.Strategy.Paging.page" target=_parent class=ISymbol>page</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Strategy.<span class=HB> </span>Paging</span></div></div><div class=SRResult id=SR_pageCount><div class=IEntry><a href="../files/OpenLayers/Strategy/Paging-js. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsR.html b/doc/devdocs/search/FunctionsR.html
new file mode 100644
index 0000000..e789dbf
--- /dev/null
+++ b/doc/devdocs/search/FunctionsR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_rad><div class=IEntry><a href="../files/OpenLayers/Util-js.html#Util.rad" target=_parent class=ISymbol>rad</a>, <span class=IParent>Util</span></div></div><div class=SRResult id=SR_raiseLayer><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.raiseLayer" target=_parent class=ISymbol>raiseLayer</a>, <span class=IParent>OpenLayers.Map</sp [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsS.html b/doc/devdocs/search/FunctionsS.html
new file mode 100644
index 0000000..5e8f4e4
--- /dev/null
+++ b/doc/devdocs/search/FunctionsS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_safeStopPropagation><div class=IEntry><a href="../files/OpenLayers/Util-js.html#Util.safeStopPropagation" target=_parent class=ISymbol>safeStopPropagation</a>, <span class=IParent>Util</span></div></div><div class=SRResult id=SR_save><div class=IEntry><a href="../files/OpenLayers/Strategy/Save-js.html#OpenLayers.Strategy.Save.save" target=_parent class=ISymbo [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsSymbols.html b/doc/devdocs/search/FunctionsSymbols.html
new file mode 100644
index 0000000..6be3524
--- /dev/null
+++ b/doc/devdocs/search/FunctionsSymbols.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR__undaddButton><div class=IEntry><a href="javascript:searchResults.Toggle('SR__undaddButton')" class=ISymbol>_addButton</a><div class=ISubIndex><a href="../files/OpenLayers/Control/MouseToolbar-js.html#OpenLayers.Control.MouseToolbar._addButton" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseToolbar</a><a hre [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsT.html b/doc/devdocs/search/FunctionsT.html
new file mode 100644
index 0000000..7fb2fb6
--- /dev/null
+++ b/doc/devdocs/search/FunctionsT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_testTarget><div class=IEntry><a href="../files/OpenLayers/Control/Snapping-js.html#OpenLayers.Control.Snapping.testTarget" target=_parent class=ISymbol>testTarget</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Snapping</span></div></div><div class=SRResult id=SR_time><div class=IEntry><a href="../files/OpenLayers/Con [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsU.html b/doc/devdocs/search/FunctionsU.html
new file mode 100644
index 0000000..38513d3
--- /dev/null
+++ b/doc/devdocs/search/FunctionsU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_un><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.un" target=_parent class=ISymbol>un</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Events</span></div></div><div class=SRResult id=SR_unfreezeFeature><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL/Gears-js.html#OpenLayers.Protocol.SQL.Gears.unfreezeFeat [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsV.html b/doc/devdocs/search/FunctionsV.html
new file mode 100644
index 0000000..a83805f
--- /dev/null
+++ b/doc/devdocs/search/FunctionsV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_value2regex><div class=IEntry><a href="../files/OpenLayers/Filter/Comparison-js.html#OpenLayers.Filter.Comparison.value2regex" target=_parent class=ISymbol>value2regex</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Comparison</span></div></div><div class=SRResult id=SR_visible><div class=IEntry><a href="javascript:sea [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsW.html b/doc/devdocs/search/FunctionsW.html
new file mode 100644
index 0000000..7d6347f
--- /dev/null
+++ b/doc/devdocs/search/FunctionsW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_warn><div class=IEntry><a href="../files/OpenLayers/Console-js.html#OpenLayers.Console.warn" target=_parent class=ISymbol>warn</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Console</span></div></div><div class=SRResult id=SR_WFS><div class=IEntry><a href="../files/OpenLayers/Protocol/WFS-js.html#OpenLayers.Protocol.WFS" target=_parent class=ISymb [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/FunctionsZ.html b/doc/devdocs/search/FunctionsZ.html
new file mode 100644
index 0000000..efbb27b
--- /dev/null
+++ b/doc/devdocs/search/FunctionsZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Z_undORDER><div class=IEntry><a href="../files/OpenLayers/Renderer/Elements-js.html#OpenLayers.ElementsIndexer.IndexingMethods.Z_ORDER" target=_parent class=ISymbol>Z_ORDER</a>, <span class=IParent>OpenLayers.<span class=HB> </span>ElementsIndexer.<span class=HB> </span>IndexingMethods</span></div></div><div class=SRResult id=SR_Z_undORDER_undDRAWING_undORDER [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralA.html b/doc/devdocs/search/GeneralA.html
new file mode 100644
index 0000000..94f63d8
--- /dev/null
+++ b/doc/devdocs/search/GeneralA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_abort><div class=IEntry><a href="javascript:searchResults.Toggle('SR_abort')" class=ISymbol>abort</a><div class=ISubIndex><a href="../files/OpenLayers/Protocol-js.html#OpenLayers.Protocol.abort" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Protocol</a><a href="../files/OpenLayers/Protocol/HTTP-js.html#OpenLayers.Protocol.HTTP.abort" target=_ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralB.html b/doc/devdocs/search/GeneralB.html
new file mode 100644
index 0000000..89ba522
--- /dev/null
+++ b/doc/devdocs/search/GeneralB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_backBufferTile><div class=IEntry><a href="../files/OpenLayers/Tile/Image-js.html#OpenLayers.Tile.Image.backBufferTile" target=_parent class=ISymbol>backBufferTile</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Tile.<span class=HB> </span>Image</span></div></div><div class=SRResult id=SR_BACKGROUND_undID_undSUFFIX><div class=IEntry><a href="../file [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralC.html b/doc/devdocs/search/GeneralC.html
new file mode 100644
index 0000000..cefb48f
--- /dev/null
+++ b/doc/devdocs/search/GeneralC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_cache><div class=IEntry><a href="javascript:searchResults.Toggle('SR_cache')" class=ISymbol>cache</a><div class=ISubIndex><a href="../files/OpenLayers/Layer/Google-js.html#OpenLayers.Layer.Google.OpenLayers.Layer.Google.cache" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.<span class=HB> </span>OpenLayers.< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralD.html b/doc/devdocs/search/GeneralD.html
new file mode 100644
index 0000000..a75ae67
--- /dev/null
+++ b/doc/devdocs/search/GeneralD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_dashStyle><div class=IEntry><a href="javascript:searchResults.Toggle('SR_dashStyle')" class=ISymbol>dashStyle</a><div class=ISubIndex><a href="../files/OpenLayers/Renderer/SVG-js.html#OpenLayers.Renderer.SVG.dashStyle" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Renderer.SVG</a><a href="../files/OpenLayers/Renderer/VML-js.html#OpenLayers.Re [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralE.html b/doc/devdocs/search/GeneralE.html
new file mode 100644
index 0000000..20f7f76
--- /dev/null
+++ b/doc/devdocs/search/GeneralE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_easeIn><div class=IEntry><a href="javascript:searchResults.Toggle('SR_easeIn')" class=ISymbol>easeIn</a><div class=ISubIndex><a href="../files/OpenLayers/Tween-js.html#OpenLayers.Easing.Expo.easeIn" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Easing.Expo</a><a href="../files/OpenLayers/Tween-js.html#OpenLayers.Easing.Linear.easeIn" target=_ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralF.html b/doc/devdocs/search/GeneralF.html
new file mode 100644
index 0000000..5ded935
--- /dev/null
+++ b/doc/devdocs/search/GeneralF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_fallThrough><div class=IEntry><a href="javascript:searchResults.Toggle('SR_fallThrough')" class=ISymbol>fallThrough</a><div class=ISubIndex><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.fallThrough" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Events</a><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.fallThrough" targ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralG.html b/doc/devdocs/search/GeneralG.html
new file mode 100644
index 0000000..158d072
--- /dev/null
+++ b/doc/devdocs/search/GeneralG.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Gears><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL/Gears-js.html#OpenLayers.Protocol.SQL.Gears.OpenLayers.Protocol.SQL.Gears" target=_parent class=ISymbol>Gears</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears.<span class=HB> </span>OpenLayers.<span class=HB> </span>Prot [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralH.html b/doc/devdocs/search/GeneralH.html
new file mode 100644
index 0000000..1354a3a
--- /dev/null
+++ b/doc/devdocs/search/GeneralH.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_h><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Size-js.html#OpenLayers.Size.h" target=_parent class=ISymbol>h</a>, <span class=IParent>OpenLayers.Size</span></div></div><div class=SRResult id=SR_handle><div class=IEntry><a href="../files/OpenLayers/Handler/Feature-js.html#OpenLayers.Handler.Feature.handle" target=_parent class=ISymbol>handle</a>,  [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralI.html b/doc/devdocs/search/GeneralI.html
new file mode 100644
index 0000000..fee227d
--- /dev/null
+++ b/doc/devdocs/search/GeneralI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_i18n><div class=IEntry><a href="../files/OpenLayers/Lang-js.html#OpenLayers.Lang.OpenLayers.i18n" target=_parent class=ISymbol>i18n</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Lang.<span class=HB> </span>OpenLayers</span></div></div><div class=SRResult id=SR_icon><div class=IEntry><a href="javascript:searchResults.Toggle('SR_icon')" class=ISymb [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralJ.html b/doc/devdocs/search/GeneralJ.html
new file mode 100644
index 0000000..a7b45f7
--- /dev/null
+++ b/doc/devdocs/search/GeneralJ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_JSON><div class=IEntry><a href="../files/OpenLayers/Format/JSON-js.html#OpenLayers.Format.JSON.OpenLayers.Format.JSON" target=_parent class=ISymbol>JSON</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>JSON.<span class=HB> </span>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_jsonPa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralK.html b/doc/devdocs/search/GeneralK.html
new file mode 100644
index 0000000..62333e4
--- /dev/null
+++ b/doc/devdocs/search/GeneralK.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_KaMap><div class=IEntry><a href="../files/OpenLayers/Layer/KaMap-js.html#OpenLayers.Layer.KaMap.OpenLayers.Layer.KaMap" target=_parent class=ISymbol>KaMap</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>KaMap.<span class=HB> </span>OpenLayers.<span class=HB> </span>Layer</span></div></div><div class=SRResult id=SR_KaMap [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralL.html b/doc/devdocs/search/GeneralL.html
new file mode 100644
index 0000000..82ade6b
--- /dev/null
+++ b/doc/devdocs/search/GeneralL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_label><div class=IEntry><a href="../files/OpenLayers/Symbolizer/Text-js.html#OpenLayers.Symbolizer.Text.label" target=_parent class=ISymbol>label</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Symbolizer.Text</span></div></div><div class=SRResult id=SR_LABEL_undALIGN><div class=IEntry><a href="javascript:searchResults.Toggle('SR_LABEL_undALIGN')"  [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralM.html b/doc/devdocs/search/GeneralM.html
new file mode 100644
index 0000000..f3e36d2
--- /dev/null
+++ b/doc/devdocs/search/GeneralM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_map><div class=IEntry><a href="javascript:searchResults.Toggle('SR_map')" class=ISymbol>map</a><div class=ISubIndex><a href="../files/OpenLayers/Control-js.html#OpenLayers.Control.map" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control</a><a href="../files/OpenLayers/Handler-js.html#OpenLayers.Handler.map" target=_parent class=IParent>Open [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralN.html b/doc/devdocs/search/GeneralN.html
new file mode 100644
index 0000000..f0e2d3b
--- /dev/null
+++ b/doc/devdocs/search/GeneralN.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_name><div class=IEntry><a href="javascript:searchResults.Toggle('SR_name')" class=ISymbol>name</a><div class=ISubIndex><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.name" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer</a><a href="../files/OpenLayers/Layer/ArcIMS-js.html#OpenLayers.Layer.ArcIMS.name" target=_parent class=IPa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralO.html b/doc/devdocs/search/GeneralO.html
new file mode 100644
index 0000000..dc0c769
--- /dev/null
+++ b/doc/devdocs/search/GeneralO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_object><div class=IEntry><a href="javascript:searchResults.Toggle('SR_object')" class=ISymbol>object</a><div class=ISubIndex><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.object" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Events</a><a href="../files/OpenLayers/Format/JSON-js.html#OpenLayers.Format.JSON.serialize.object" tar [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralP.html b/doc/devdocs/search/GeneralP.html
new file mode 100644
index 0000000..10e842b
--- /dev/null
+++ b/doc/devdocs/search/GeneralP.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_padding><div class=IEntry><a href="../files/OpenLayers/Popup-js.html#OpenLayers.Popup.padding" target=_parent class=ISymbol>padding</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Popup</span></div></div><div class=SRResult id=SR_paddingForPopups><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.paddingForPopups" target=_par [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralQ.html b/doc/devdocs/search/GeneralQ.html
new file mode 100644
index 0000000..68a95f7
--- /dev/null
+++ b/doc/devdocs/search/GeneralQ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Query><div class=IEntry><a href="../files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html#OpenLayers.Format.CSWGetRecords.v2_0_2.Query" target=_parent class=ISymbol>Query</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>v2_0_2</span></div></div><div class=SRResult id=SR_queryVisible>< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralR.html b/doc/devdocs/search/GeneralR.html
new file mode 100644
index 0000000..5cfd318
--- /dev/null
+++ b/doc/devdocs/search/GeneralR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_rad><div class=IEntry><a href="../files/OpenLayers/Util-js.html#Util.rad" target=_parent class=ISymbol>rad</a>, <span class=IParent>Util</span></div></div><div class=SRResult id=SR_radius><div class=IEntry><a href="../files/OpenLayers/Handler/RegularPolygon-js.html#OpenLayers.Handler.RegularPolygon.radius" target=_parent class=ISymbol>radius</a>, <span class= [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralS.html b/doc/devdocs/search/GeneralS.html
new file mode 100644
index 0000000..ff12904
--- /dev/null
+++ b/doc/devdocs/search/GeneralS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_safeStopPropagation><div class=IEntry><a href="../files/OpenLayers/Util-js.html#Util.safeStopPropagation" target=_parent class=ISymbol>safeStopPropagation</a>, <span class=IParent>Util</span></div></div><div class=SRResult id=SR_save><div class=IEntry><a href="../files/OpenLayers/Strategy/Save-js.html#OpenLayers.Strategy.Save.save" target=_parent class=ISymbo [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralSymbols.html b/doc/devdocs/search/GeneralSymbols.html
new file mode 100644
index 0000000..85cdd44
--- /dev/null
+++ b/doc/devdocs/search/GeneralSymbols.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR__undaddButton><div class=IEntry><a href="javascript:searchResults.Toggle('SR__undaddButton')" class=ISymbol>_addButton</a><div class=ISubIndex><a href="../files/OpenLayers/Control/MouseToolbar-js.html#OpenLayers.Control.MouseToolbar._addButton" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>MouseToolbar</a><a hre [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralT.html b/doc/devdocs/search/GeneralT.html
new file mode 100644
index 0000000..9b16c79
--- /dev/null
+++ b/doc/devdocs/search/GeneralT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_tableName><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL-js.html#OpenLayers.Protocol.SQL.tableName" target=_parent class=ISymbol>tableName</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.SQL</span></div></div><div class=SRResult id=SR_targetFilter><div class=IEntry><a href="../files/OpenLayers/Control/Split-js.html#OpenLayers. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralU.html b/doc/devdocs/search/GeneralU.html
new file mode 100644
index 0000000..2c36737
--- /dev/null
+++ b/doc/devdocs/search/GeneralU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_un><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.un" target=_parent class=ISymbol>un</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Events</span></div></div><div class=SRResult id=SR_unfreezeFeature><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL/Gears-js.html#OpenLayers.Protocol.SQL.Gears.unfreezeFeat [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralV.html b/doc/devdocs/search/GeneralV.html
new file mode 100644
index 0000000..cc2cf9a
--- /dev/null
+++ b/doc/devdocs/search/GeneralV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_v0_und3_und1><div class=IEntry><a href="../files/OpenLayers/Format/OWSContext/v0_3_1-js.html#OpenLayers.Format.OWSContext.v0_3_1.OpenLayers.Format.OWSContext.v0_3_1" target=_parent class=ISymbol>v0_3_1</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>OWSContext.<span class=HB> </span>v0_3_1.<span class=HB> </span>OpenLa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralW.html b/doc/devdocs/search/GeneralW.html
new file mode 100644
index 0000000..7951f54
--- /dev/null
+++ b/doc/devdocs/search/GeneralW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_w><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Size-js.html#OpenLayers.Size.w" target=_parent class=ISymbol>w</a>, <span class=IParent>OpenLayers.Size</span></div></div><div class=SRResult id=SR_warn><div class=IEntry><a href="../files/OpenLayers/Console-js.html#OpenLayers.Console.warn" target=_parent class=ISymbol>warn</a>, <span class=IParent>Op [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralX.html b/doc/devdocs/search/GeneralX.html
new file mode 100644
index 0000000..e38159d
--- /dev/null
+++ b/doc/devdocs/search/GeneralX.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_x><div class=IEntry><a href="javascript:searchResults.Toggle('SR_x')" class=ISymbol>x</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Point-js.html#OpenLayers.Geometry.Point.x" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</a><a href="../files/OpenLayers/Geometry/Rectangle-js.html#OpenLayers [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralY.html b/doc/devdocs/search/GeneralY.html
new file mode 100644
index 0000000..45d3b4b
--- /dev/null
+++ b/doc/devdocs/search/GeneralY.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_y><div class=IEntry><a href="javascript:searchResults.Toggle('SR_y')" class=ISymbol>y</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Point-js.html#OpenLayers.Geometry.Point.y" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</a><a href="../files/OpenLayers/Geometry/Rectangle-js.html#OpenLayers [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/GeneralZ.html b/doc/devdocs/search/GeneralZ.html
new file mode 100644
index 0000000..fb3f977
--- /dev/null
+++ b/doc/devdocs/search/GeneralZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Z_undINDEX_undBASE><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.Z_INDEX_BASE" target=_parent class=ISymbol>Z_INDEX_BASE</a>, <span class=IParent>OpenLayers.Map</span></div></div><div class=SRResult id=SR_Z_undORDER><div class=IEntry><a href="../files/OpenLayers/Renderer/Elements-js.html#OpenLayers.ElementsIndexer.IndexingMethods.Z [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/NoResults.html b/doc/devdocs/search/NoResults.html
new file mode 100644
index 0000000..947d3b5
--- /dev/null
+++ b/doc/devdocs/search/NoResults.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=NoMatches>No Matches</div></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesA.html b/doc/devdocs/search/PropertiesA.html
new file mode 100644
index 0000000..631349c
--- /dev/null
+++ b/doc/devdocs/search/PropertiesA.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_active><div class=IEntry><a href="javascript:searchResults.Toggle('SR_active')" class=ISymbol>active</a><div class=ISubIndex><a href="../files/OpenLayers/Control-js.html#OpenLayers.Control.active" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control</a><a href="../files/OpenLayers/Handler-js.html#OpenLayers.Handler.active" target=_parent cla [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesB.html b/doc/devdocs/search/PropertiesB.html
new file mode 100644
index 0000000..74d1c09
--- /dev/null
+++ b/doc/devdocs/search/PropertiesB.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_backBufferTile><div class=IEntry><a href="../files/OpenLayers/Tile/Image-js.html#OpenLayers.Tile.Image.backBufferTile" target=_parent class=ISymbol>backBufferTile</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Tile.<span class=HB> </span>Image</span></div></div><div class=SRResult id=SR_backgroundColor><div class=IEntry><a href="../files/OpenLayer [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesC.html b/doc/devdocs/search/PropertiesC.html
new file mode 100644
index 0000000..c1a645c
--- /dev/null
+++ b/doc/devdocs/search/PropertiesC.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_cache><div class=IEntry><a href="javascript:searchResults.Toggle('SR_cache')" class=ISymbol>cache</a><div class=ISubIndex><a href="../files/OpenLayers/Layer/Google-js.html#OpenLayers.Layer.Google.OpenLayers.Layer.Google.cache" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>Google.<span class=HB> </span>OpenLayers.< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesD.html b/doc/devdocs/search/PropertiesD.html
new file mode 100644
index 0000000..a5a2b70
--- /dev/null
+++ b/doc/devdocs/search/PropertiesD.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_data><div class=IEntry><a href="javascript:searchResults.Toggle('SR_data')" class=ISymbol>data</a><div class=ISubIndex><a href="../files/OpenLayers/Feature-js.html#OpenLayers.Feature.data" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Feature</a><a href="../files/OpenLayers/Format-js.html#OpenLayers.Format.data" target=_parent class=IParent>O [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesE.html b/doc/devdocs/search/PropertiesE.html
new file mode 100644
index 0000000..3eb13f0
--- /dev/null
+++ b/doc/devdocs/search/PropertiesE.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_easing><div class=IEntry><a href="../files/OpenLayers/Tween-js.html#OpenLayers.Tween.easing" target=_parent class=ISymbol>easing</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Tween</span></div></div><div class=SRResult id=SR_eBottom><div class=IEntry><a href="../files/OpenLayers/Control/ScaleLine-js.html#OpenLayers.Control.ScaleLine.eBottom" targ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesF.html b/doc/devdocs/search/PropertiesF.html
new file mode 100644
index 0000000..b450cc2
--- /dev/null
+++ b/doc/devdocs/search/PropertiesF.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_fallThrough><div class=IEntry><a href="javascript:searchResults.Toggle('SR_fallThrough')" class=ISymbol>fallThrough</a><div class=ISubIndex><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.fallThrough" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Events</a><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.fallThrough" targ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesG.html b/doc/devdocs/search/PropertiesG.html
new file mode 100644
index 0000000..a67ca7d
--- /dev/null
+++ b/doc/devdocs/search/PropertiesG.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_geodesic><div class=IEntry><a href="javascript:searchResults.Toggle('SR_geodesic')" class=ISymbol>geodesic</a><div class=ISubIndex><a href="../files/OpenLayers/Control/Measure-js.html#OpenLayers.Control.Measure.geodesic" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control.<span class=HB> </span>Measure</a><a href="../files/OpenLayers/Contro [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesH.html b/doc/devdocs/search/PropertiesH.html
new file mode 100644
index 0000000..4b6515b
--- /dev/null
+++ b/doc/devdocs/search/PropertiesH.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_h><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Size-js.html#OpenLayers.Size.h" target=_parent class=ISymbol>h</a>, <span class=IParent>OpenLayers.Size</span></div></div><div class=SRResult id=SR_handler><div class=IEntry><a href="javascript:searchResults.Toggle('SR_handler')" class=ISymbol>handler</a><div class=ISubIndex><a href="../files/OpenLaye [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesI.html b/doc/devdocs/search/PropertiesI.html
new file mode 100644
index 0000000..2b0034a
--- /dev/null
+++ b/doc/devdocs/search/PropertiesI.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_icon><div class=IEntry><a href="javascript:searchResults.Toggle('SR_icon')" class=ISymbol>icon</a><div class=ISubIndex><a href="../files/OpenLayers/Layer/GeoRSS-js.html#OpenLayers.Layer.GeoRSS.icon" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer.<span class=HB> </span>GeoRSS</a><a href="../files/OpenLayers/Marker-js.html#OpenLayers.Marke [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesJ.html b/doc/devdocs/search/PropertiesJ.html
new file mode 100644
index 0000000..9afbd64
--- /dev/null
+++ b/doc/devdocs/search/PropertiesJ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_jsonParser><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL/Gears-js.html#OpenLayers.Protocol.SQL.Gears.jsonParser" target=_parent class=ISymbol>jsonParser</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears</span></div></div></table><div class=SRStatus id=Searching>Searching.. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesK.html b/doc/devdocs/search/PropertiesK.html
new file mode 100644
index 0000000..bf57649
--- /dev/null
+++ b/doc/devdocs/search/PropertiesK.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_keepData><div class=IEntry><a href="../files/OpenLayers/Format-js.html#OpenLayers.Format.keepData" target=_parent class=ISymbol>keepData</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format</span></div></div><div class=SRResult id=SR_keepInMap><div class=IEntry><a href="javascript:searchResults.Toggle('SR_keepInMap')" class=ISymbol>keepInMap</a>< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesL.html b/doc/devdocs/search/PropertiesL.html
new file mode 100644
index 0000000..4b7bdd3
--- /dev/null
+++ b/doc/devdocs/search/PropertiesL.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_label><div class=IEntry><a href="../files/OpenLayers/Symbolizer/Text-js.html#OpenLayers.Symbolizer.Text.label" target=_parent class=ISymbol>label</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Symbolizer.Text</span></div></div><div class=SRResult id=SR_labelFormat><div class=IEntry><a href="../files/OpenLayers/Control/Graticule-js.html#OpenLayers. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesM.html b/doc/devdocs/search/PropertiesM.html
new file mode 100644
index 0000000..86fa076
--- /dev/null
+++ b/doc/devdocs/search/PropertiesM.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_map><div class=IEntry><a href="javascript:searchResults.Toggle('SR_map')" class=ISymbol>map</a><div class=ISubIndex><a href="../files/OpenLayers/Control-js.html#OpenLayers.Control.map" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Control</a><a href="../files/OpenLayers/Handler-js.html#OpenLayers.Handler.map" target=_parent class=IParent>Open [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesN.html b/doc/devdocs/search/PropertiesN.html
new file mode 100644
index 0000000..5eaa767
--- /dev/null
+++ b/doc/devdocs/search/PropertiesN.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_name><div class=IEntry><a href="javascript:searchResults.Toggle('SR_name')" class=ISymbol>name</a><div class=ISubIndex><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.name" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer</a><a href="../files/OpenLayers/Layer/ArcIMS-js.html#OpenLayers.Layer.ArcIMS.name" target=_parent class=IPa [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesO.html b/doc/devdocs/search/PropertiesO.html
new file mode 100644
index 0000000..e508ad3
--- /dev/null
+++ b/doc/devdocs/search/PropertiesO.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_object><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Events.object" target=_parent class=ISymbol>object</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Events</span></div></div><div class=SRResult id=SR_observers><div class=IEntry><a href="../files/OpenLayers/Events-js.html#OpenLayers.Event.observers" target=_parent class [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesP.html b/doc/devdocs/search/PropertiesP.html
new file mode 100644
index 0000000..fcde193
--- /dev/null
+++ b/doc/devdocs/search/PropertiesP.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_padding><div class=IEntry><a href="../files/OpenLayers/Popup-js.html#OpenLayers.Popup.padding" target=_parent class=ISymbol>padding</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Popup</span></div></div><div class=SRResult id=SR_paddingForPopups><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.paddingForPopups" target=_par [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesQ.html b/doc/devdocs/search/PropertiesQ.html
new file mode 100644
index 0000000..68a95f7
--- /dev/null
+++ b/doc/devdocs/search/PropertiesQ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_Query><div class=IEntry><a href="../files/OpenLayers/Format/CSWGetRecords/v2_0_2-js.html#OpenLayers.Format.CSWGetRecords.v2_0_2.Query" target=_parent class=ISymbol>Query</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Format.<span class=HB> </span>CSWGetRecords.<span class=HB> </span>v2_0_2</span></div></div><div class=SRResult id=SR_queryVisible>< [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesR.html b/doc/devdocs/search/PropertiesR.html
new file mode 100644
index 0000000..a2d61e5
--- /dev/null
+++ b/doc/devdocs/search/PropertiesR.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_radius><div class=IEntry><a href="../files/OpenLayers/Handler/RegularPolygon-js.html#OpenLayers.Handler.RegularPolygon.radius" target=_parent class=ISymbol>radius</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Handler.<span class=HB> </span>RegularPolygon</span></div></div><div class=SRResult id=SR_radiusHandle><div class=IEntry><a href="../files/ [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesS.html b/doc/devdocs/search/PropertiesS.html
new file mode 100644
index 0000000..5522009
--- /dev/null
+++ b/doc/devdocs/search/PropertiesS.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_saveFeatureState><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL/Gears-js.html#OpenLayers.Protocol.SQL.Gears.saveFeatureState" target=_parent class=ISymbol>saveFeatureState</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.<span class=HB> </span>SQL.<span class=HB> </span>Gears</span></div></div><div class=SRResult id=SR_saveStat [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesSymbols.html b/doc/devdocs/search/PropertiesSymbols.html
new file mode 100644
index 0000000..db33671
--- /dev/null
+++ b/doc/devdocs/search/PropertiesSymbols.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR__undcomplete><div class=IEntry><a href="../files/OpenLayers/Ajax-js.html#OpenLayers.Ajax.Request._complete" target=_parent class=ISymbol>_complete</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Ajax.<span class=HB> </span>Request</span></div></div><div class=SRResult id=SR__undscriptName><div class=IEntry><a href="../files/OpenLayers-js.html#OpenL [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesT.html b/doc/devdocs/search/PropertiesT.html
new file mode 100644
index 0000000..e816c31
--- /dev/null
+++ b/doc/devdocs/search/PropertiesT.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_tableName><div class=IEntry><a href="../files/OpenLayers/Protocol/SQL-js.html#OpenLayers.Protocol.SQL.tableName" target=_parent class=ISymbol>tableName</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Protocol.SQL</span></div></div><div class=SRResult id=SR_targetFilter><div class=IEntry><a href="../files/OpenLayers/Control/Split-js.html#OpenLayers. [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesU.html b/doc/devdocs/search/PropertiesU.html
new file mode 100644
index 0000000..b07bbf7
--- /dev/null
+++ b/doc/devdocs/search/PropertiesU.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_units><div class=IEntry><a href="javascript:searchResults.Toggle('SR_units')" class=ISymbol>units</a><div class=ISubIndex><a href="../files/OpenLayers/Layer-js.html#OpenLayers.Layer.units" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Layer</a><a href="../files/OpenLayers/Layer/KaMap-js.html#OpenLayers.Layer.KaMap.units" target=_parent class= [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesV.html b/doc/devdocs/search/PropertiesV.html
new file mode 100644
index 0000000..b7b9cae
--- /dev/null
+++ b/doc/devdocs/search/PropertiesV.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_value><div class=IEntry><a href="javascript:searchResults.Toggle('SR_value')" class=ISymbol>value</a><div class=ISubIndex><a href="../files/OpenLayers/Filter/Comparison-js.html#OpenLayers.Filter.Comparison.value" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Filter.<span class=HB> </span>Comparison</a><a href="../files/OpenLayers/Filter/Spati [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesW.html b/doc/devdocs/search/PropertiesW.html
new file mode 100644
index 0000000..aea91a8
--- /dev/null
+++ b/doc/devdocs/search/PropertiesW.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_w><div class=IEntry><a href="../files/OpenLayers/BaseTypes/Size-js.html#OpenLayers.Size.w" target=_parent class=ISymbol>w</a>, <span class=IParent>OpenLayers.Size</span></div></div><div class=SRResult id=SR_wfsCache><div class=IEntry><a href="../files/OpenLayers/Control/SLDSelect-js.html#OpenLayers.Control.SLDSelect.wfsCache" target=_parent class=ISymbol>wfsC [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesX.html b/doc/devdocs/search/PropertiesX.html
new file mode 100644
index 0000000..f410f8a
--- /dev/null
+++ b/doc/devdocs/search/PropertiesX.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_x><div class=IEntry><a href="javascript:searchResults.Toggle('SR_x')" class=ISymbol>x</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Point-js.html#OpenLayers.Geometry.Point.x" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</a><a href="../files/OpenLayers/Geometry/Rectangle-js.html#OpenLayers [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesY.html b/doc/devdocs/search/PropertiesY.html
new file mode 100644
index 0000000..6cae8ac
--- /dev/null
+++ b/doc/devdocs/search/PropertiesY.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_y><div class=IEntry><a href="javascript:searchResults.Toggle('SR_y')" class=ISymbol>y</a><div class=ISubIndex><a href="../files/OpenLayers/Geometry/Point-js.html#OpenLayers.Geometry.Point.y" target=_parent class=IParent>OpenLayers.<span class=HB> </span>Geometry.<span class=HB> </span>Point</a><a href="../files/OpenLayers/Geometry/Rectangle-js.html#OpenLayers [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/search/PropertiesZ.html b/doc/devdocs/search/PropertiesZ.html
new file mode 100644
index 0000000..2d6afe5
--- /dev/null
+++ b/doc/devdocs/search/PropertiesZ.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
+<html><head><link rel="stylesheet" type="text/css" href="../styles/main.css"><script language=JavaScript src="../javascript/main.js"></script></head><body class="PopupSearchResultsPage" onLoad="NDOnLoad()"><script language=JavaScript><!--
+if (browserType) {document.write("<div class=" + browserType + ">");if (browserVer) {document.write("<div class=" + browserVer + ">"); }}// --></script>
+
+<!--  Generated by Natural Docs, version Development Release 12-07-2007 (1.35 base) -->
+<!--  http://www.naturaldocs.org  -->
+
+<!-- saved from url=(0026)http://www.naturaldocs.org -->
+
+
+
+
+<div id=Index><div class=SRStatus id=Loading>Loading...</div><table border=0 cellspacing=0 cellpadding=0><div class=SRResult id=SR_zIndex><div class=IEntry><a href="../files/OpenLayers/Symbolizer-js.html#OpenLayers.Symbolizer.zIndex" target=_parent class=ISymbol>zIndex</a>, <span class=IParent>OpenLayers.<span class=HB> </span>Symbolizer</span></div></div><div class=SRResult id=SR_zoom><div class=IEntry><a href="../files/OpenLayers/Map-js.html#OpenLayers.Map.zoom" target=_parent class=IS [...]
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults", "HTML");
+searchResults.Search();
+--></script></div><script language=JavaScript><!--
+if (browserType) {if (browserVer) {document.write("</div>"); }document.write("</div>");}// --></script></body></html>
\ No newline at end of file
diff --git a/doc/devdocs/styles/1.css b/doc/devdocs/styles/1.css
new file mode 100644
index 0000000..9ea166f
--- /dev/null
+++ b/doc/devdocs/styles/1.css
@@ -0,0 +1,759 @@
+/*
+   IMPORTANT: If you're editing this file in the output directory of one of
+   your projects, your changes will be overwritten the next time you run
+   Natural Docs.  Instead, copy this file to your project directory, make your
+   changes, and you can use it with -s.  Even better would be to make a CSS
+   file in your project directory with only your changes, which you can then
+   use with -s [original style] [your changes].
+
+   On the other hand, if you're editing this file in the Natural Docs styles
+   directory, the changes will automatically be applied to all your projects
+   that use this style the next time Natural Docs is run on them.
+
+   This file is part of Natural Docs, which is Copyright (C) 2003-2005 Greg Valure
+   Natural Docs is licensed under the GPL
+*/
+
+body {
+    font: 10pt Verdana, Arial, sans-serif;
+    color: #000000;
+    margin: 0; padding: 0;
+    }
+
+.ContentPage,
+.IndexPage,
+.FramedMenuPage {
+    background-color: #E8E8E8;
+    }
+.FramedContentPage,
+.FramedIndexPage,
+.FramedSearchResultsPage,
+.PopupSearchResultsPage {
+    background-color: #FFFFFF;
+    }
+
+
+a:link,
+a:visited { color: #900000; text-decoration: none }
+a:hover { color: #900000; text-decoration: underline }
+a:active { color: #FF0000; text-decoration: underline }
+
+td {
+    vertical-align: top }
+
+img { border: 0;  }
+
+
+/*
+    Comment out this line to use web-style paragraphs (blank line between
+    paragraphs, no indent) instead of print-style paragraphs (no blank line,
+    indented.)
+*/
+p {
+    text-indent: 5ex; margin: 0 }
+
+
+/*  Can't use something like display: none or it won't break.  */
+.HB {
+    font-size: 1px;
+    visibility: hidden;
+    }
+
+/*  Blockquotes are used as containers for things that may need to scroll.  */
+blockquote {
+    padding: 0;
+    margin: 0;
+    overflow: auto;
+    }
+
+
+.Firefox1 blockquote {
+    padding-bottom: .5em;
+    }
+
+/*  Turn off scrolling when printing.  */
+ at media print {
+    blockquote {
+        overflow: visible;
+        }
+    .IE blockquote {
+        width: auto;
+        }
+    }
+
+
+
+#Menu {
+    font-size: 9pt;
+    padding: 10px 0 0 0;
+    }
+.ContentPage #Menu,
+.IndexPage #Menu {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 31ex;
+    overflow: hidden;
+    }
+.ContentPage .Firefox #Menu,
+.IndexPage .Firefox #Menu {
+    width: 27ex;
+    }
+
+
+    .MTitle {
+        font-size: 16pt; font-weight: bold; font-variant: small-caps;
+        text-align: center;
+        padding: 5px 10px 15px 10px;
+        border-bottom: 1px dotted #000000;
+        margin-bottom: 15px }
+
+    .MSubTitle {
+        font-size: 9pt; font-weight: normal; font-variant: normal;
+        margin-top: 1ex; margin-bottom: 5px }
+
+
+    .MEntry a:link,
+    .MEntry a:hover,
+    .MEntry a:visited { color: #606060; margin-right: 0 }
+    .MEntry a:active { color: #A00000; margin-right: 0 }
+
+
+    .MGroup {
+        font-variant: small-caps; font-weight: bold;
+        margin: 1em 0 1em 10px;
+        }
+
+    .MGroupContent {
+        font-variant: normal; font-weight: normal }
+
+    .MGroup a:link,
+    .MGroup a:hover,
+    .MGroup a:visited { color: #545454; margin-right: 10px }
+    .MGroup a:active { color: #A00000; margin-right: 10px }
+
+
+    .MFile,
+    .MText,
+    .MLink,
+    .MIndex {
+        padding: 1px 17px 2px 10px;
+        margin: .25em 0 .25em 0;
+        }
+
+    .MText {
+        font-size: 8pt; font-style: italic }
+
+    .MLink {
+        font-style: italic }
+
+    #MSelected {
+        color: #000000; background-color: #FFFFFF;
+        /*  Replace padding with border.  */
+        padding: 0 10px 0 10px;
+        border-width: 1px 2px 2px 0; border-style: solid; border-color: #000000;
+        margin-right: 5px;
+        }
+
+    /*  Close off the left side when its in a group.  */
+    .MGroup #MSelected {
+        padding-left: 9px; border-left-width: 1px }
+
+    /*  A treat for Mozilla users.  Blatantly non-standard.  Will be replaced with CSS 3 attributes when finalized/supported.  */
+    .Firefox #MSelected {
+        -moz-border-radius-topright: 10px;
+        -moz-border-radius-bottomright: 10px }
+    .Firefox .MGroup #MSelected {
+        -moz-border-radius-topleft: 10px;
+        -moz-border-radius-bottomleft: 10px }
+
+
+    #MSearchPanel {
+        padding: 0px 6px;
+        margin: .25em 0;
+        }
+
+
+    #MSearchField {
+        font: italic 9pt Verdana, sans-serif;
+        color: #606060;
+        background-color: #E8E8E8;
+        border: none;
+        padding: 2px 4px;
+        width: 100%;
+        }
+    /* Only Opera gets it right. */
+    .Firefox #MSearchField,
+    .IE #MSearchField,
+    .Safari #MSearchField {
+        width: 94%;
+        }
+    .Opera9 #MSearchField,
+    .Konqueror #MSearchField {
+        width: 97%;
+        }
+    .FramedMenuPage .Firefox #MSearchField,
+    .FramedMenuPage .Safari #MSearchField,
+    .FramedMenuPage .Konqueror #MSearchField {
+        width: 98%;
+        }
+
+    /* Firefox doesn't do this right in frames without #MSearchPanel added on.
+        It's presence doesn't hurt anything other browsers. */
+    #MSearchPanel.MSearchPanelInactive:hover #MSearchField {
+        background-color: #FFFFFF;
+        border: 1px solid #C0C0C0;
+        padding: 1px 3px;
+        }
+    .MSearchPanelActive #MSearchField {
+        background-color: #FFFFFF;
+        border: 1px solid #C0C0C0;
+        font-style: normal;
+        padding: 1px 3px;
+        }
+
+    #MSearchType {
+        visibility: hidden;
+        font: 8pt Verdana, sans-serif;
+        width: 98%;
+        padding: 0;
+        border: 1px solid #C0C0C0;
+        }
+    .MSearchPanelActive #MSearchType,
+    /*  As mentioned above, Firefox doesn't do this right in frames without #MSearchPanel added on. */
+    #MSearchPanel.MSearchPanelInactive:hover #MSearchType,
+    #MSearchType:focus {
+        visibility: visible;
+        color: #606060;
+        }
+    #MSearchType option#MSearchEverything {
+        font-weight: bold;
+        }
+
+    .Opera8 .MSearchPanelInactive:hover,
+    .Opera8 .MSearchPanelActive {
+        margin-left: -1px;
+        }
+
+
+    iframe#MSearchResults {
+        width: 60ex;
+        height: 15em;
+        }
+    #MSearchResultsWindow {
+        display: none;
+        position: absolute;
+        left: 0; top: 0;
+        border: 1px solid #000000;
+        background-color: #E8E8E8;
+        }
+    #MSearchResultsWindowClose {
+        font-weight: bold;
+        font-size: 8pt;
+        display: block;
+        padding: 2px 5px;
+        }
+    #MSearchResultsWindowClose:link,
+    #MSearchResultsWindowClose:visited {
+        color: #000000;
+        text-decoration: none;
+        }
+    #MSearchResultsWindowClose:active,
+    #MSearchResultsWindowClose:hover {
+        color: #800000;
+        text-decoration: none;
+        background-color: #F4F4F4;
+        }
+
+
+
+
+#Content {
+    padding-bottom: 15px;
+    }
+
+.ContentPage #Content {
+    border-width: 0 0 1px 1px;
+    border-style: solid;
+    border-color: #000000;
+    background-color: #FFFFFF;
+    font-size: 9pt;  /* To make 31ex match the menu's 31ex. */
+    margin-left: 31ex;
+    }
+.ContentPage .Firefox #Content {
+    margin-left: 27ex;
+    }
+
+
+
+    .CTopic {
+        font-size: 10pt;
+        margin-bottom: 3em;
+        }
+
+
+    .CTitle {
+        font-size: 12pt; font-weight: bold;
+        border-width: 0 0 1px 0; border-style: solid; border-color: #A0A0A0;
+        margin: 0 15px .5em 15px }
+
+    .CGroup .CTitle {
+        font-size: 16pt; font-variant: small-caps;
+        padding-left: 15px; padding-right: 15px;
+        border-width: 0 0 2px 0; border-color: #000000;
+        margin-left: 0; margin-right: 0 }
+
+    .CClass .CTitle,
+    .CInterface .CTitle,
+    .CDatabase .CTitle,
+    .CDatabaseTable .CTitle,
+    .CSection .CTitle {
+        font-size: 18pt;
+        color: #FFFFFF; background-color: #A0A0A0;
+        padding: 10px 15px 10px 15px;
+        border-width: 2px 0; border-color: #000000;
+        margin-left: 0; margin-right: 0 }
+
+    #MainTopic .CTitle {
+        font-size: 20pt;
+        color: #FFFFFF; background-color: #7070C0;
+        padding: 10px 15px 10px 15px;
+        border-width: 0 0 3px 0; border-color: #000000;
+        margin-left: 0; margin-right: 0 }
+
+    .CBody {
+        margin-left: 15px; margin-right: 15px }
+
+
+    .CToolTip {
+        position: absolute; visibility: hidden;
+        left: 0; top: 0;
+        background-color: #FFFFE0;
+        padding: 5px;
+        border-width: 1px 2px 2px 1px; border-style: solid; border-color: #000000;
+        font-size: 8pt;
+        }
+
+    .Opera .CToolTip {
+        max-width: 98%;
+        }
+
+    /*  Scrollbars would be useless.  */
+    .CToolTip blockquote {
+        overflow: hidden;
+        }
+    .IE6 .CToolTip blockquote {
+        overflow: visible;
+        }
+
+    .CHeading {
+        font-weight: bold; font-size: 10pt;
+        margin: 1.5em 0 .5em 0;
+        }
+
+    .CBody pre {
+        font: 10pt "Courier New", Courier, monospace;
+        margin: 1em 0;
+        }
+
+    .CBody ul {
+        /*  I don't know why CBody's margin doesn't apply, but it's consistent across browsers so whatever.
+             Reapply it here as padding.  */
+        padding-left: 15px; padding-right: 15px;
+        margin: .5em 5ex .5em 5ex;
+        }
+
+    .CDescriptionList {
+        margin: .5em 5ex 0 5ex }
+
+        .CDLEntry {
+            font: 10pt "Courier New", Courier, monospace; color: #808080;
+            padding-bottom: .25em;
+            white-space: nowrap }
+
+        .CDLDescription {
+            font-size: 10pt;  /*  For browsers that don't inherit correctly, like Opera 5.  */
+            padding-bottom: .5em; padding-left: 5ex }
+
+
+    .CTopic img {
+        text-align: center;
+        display: block;
+        margin: 1em auto;
+        }
+    .CImageCaption {
+        font-variant: small-caps;
+        font-size: 8pt;
+        color: #808080;
+        text-align: center;
+        position: relative;
+        top: 1em;
+        }
+
+    .CImageLink {
+        color: #808080;
+        font-style: italic;
+        }
+    a.CImageLink:link,
+    a.CImageLink:visited,
+    a.CImageLink:hover { color: #808080 }
+
+
+
+
+
+.Prototype {
+    font: 10pt "Courier New", Courier, monospace;
+    padding: 5px 3ex;
+    border-width: 1px; border-style: solid;
+    margin: 0 5ex 1.5em 5ex;
+    }
+
+    .Prototype td {
+        font-size: 10pt;
+        }
+
+    .PDefaultValue,
+    .PDefaultValuePrefix,
+    .PTypePrefix {
+        color: #8F8F8F;
+        }
+    .PTypePrefix {
+        text-align: right;
+        }
+    .PAfterParameters {
+        vertical-align: bottom;
+        }
+
+    .IE .Prototype table {
+        padding: 0;
+        }
+
+    .CFunction .Prototype {
+        background-color: #F4F4F4; border-color: #D0D0D0 }
+    .CProperty .Prototype {
+        background-color: #F4F4FF; border-color: #C0C0E8 }
+    .CVariable .Prototype {
+        background-color: #FFFFF0; border-color: #E0E0A0 }
+
+    .CDatabaseIndex .Prototype,
+    .CConstant .Prototype {
+        background-color: #D0D0D0; border-color: #000000 }
+    .CType .Prototype,
+    .CClass .Prototype,
+    .CInterface .Prototype {
+        background-color: #FAF0F0; border-color: #E0B0B0;
+        }
+    .CDatabaseTrigger .Prototype,
+    .CEvent .Prototype,
+    .CDelegate .Prototype {
+        background-color: #F0FCF0; border-color: #B8E4B8 }
+
+    .CToolTip .Prototype {
+        margin: 0 0 .5em 0;
+        white-space: nowrap;
+        }
+
+
+
+
+
+.Summary {
+    margin: 1.5em 5ex 0 5ex }
+
+    .STitle {
+        font-size: 12pt; font-weight: bold;
+        margin-bottom: .5em }
+
+
+    .SBorder {
+        background-color: #FFFFF0;
+        padding: 15px;
+        border: 1px solid #C0C060 }
+
+    /* In a frame IE 6 will make them too long unless you set the width to 100%.  Without frames it will be correct without a width
+        or slightly too long (but not enough to scroll) with a width.  This arbitrary weirdness simply astounds me.  IE 7 has the same
+        problem with frames, haven't tested it without.  */
+    .FramedContentPage .IE .SBorder {
+        width: 100% }
+
+    /*  A treat for Mozilla users.  Blatantly non-standard.  Will be replaced with CSS 3 attributes when finalized/supported.  */
+    .Firefox .SBorder {
+        -moz-border-radius: 20px }
+
+
+    .STable {
+        font-size: 9pt; width: 100% }
+
+    .SEntry {
+        width: 30% }
+    .SDescription {
+        width: 70% }
+
+
+    .SMarked {
+        background-color: #F8F8D8 }
+
+    .SDescription { padding-left: 2ex }
+    .SIndent1 .SEntry { padding-left: 1.5ex }   .SIndent1 .SDescription { padding-left: 3.5ex }
+    .SIndent2 .SEntry { padding-left: 3.0ex }   .SIndent2 .SDescription { padding-left: 5.0ex }
+    .SIndent3 .SEntry { padding-left: 4.5ex }   .SIndent3 .SDescription { padding-left: 6.5ex }
+    .SIndent4 .SEntry { padding-left: 6.0ex }   .SIndent4 .SDescription { padding-left: 8.0ex }
+    .SIndent5 .SEntry { padding-left: 7.5ex }   .SIndent5 .SDescription { padding-left: 9.5ex }
+
+    .SDescription a { color: #800000}
+    .SDescription a:active { color: #A00000 }
+
+    .SGroup td {
+        padding-top: .5em; padding-bottom: .25em }
+
+    .SGroup .SEntry {
+        font-weight: bold; font-variant: small-caps }
+
+    .SGroup .SEntry a { color: #800000 }
+    .SGroup .SEntry a:active { color: #F00000 }
+
+
+    .SMain td,
+    .SClass td,
+    .SDatabase td,
+    .SDatabaseTable td,
+    .SSection td {
+        font-size: 10pt;
+        padding-bottom: .25em }
+
+    .SClass td,
+    .SDatabase td,
+    .SDatabaseTable td,
+    .SSection td {
+        padding-top: 1em }
+
+    .SMain .SEntry,
+    .SClass .SEntry,
+    .SDatabase .SEntry,
+    .SDatabaseTable .SEntry,
+    .SSection .SEntry {
+        font-weight: bold;
+        }
+
+    .SMain .SEntry a,
+    .SClass .SEntry a,
+    .SDatabase .SEntry a,
+    .SDatabaseTable .SEntry a,
+    .SSection .SEntry a { color: #000000 }
+
+    .SMain .SEntry a:active,
+    .SClass .SEntry a:active,
+    .SDatabase .SEntry a:active,
+    .SDatabaseTable .SEntry a:active,
+    .SSection .SEntry a:active { color: #A00000 }
+
+
+
+
+
+.ClassHierarchy {
+    margin: 0 15px 1em 15px }
+
+    .CHEntry {
+        border-width: 1px 2px 2px 1px; border-style: solid; border-color: #A0A0A0;
+        margin-bottom: 3px;
+        padding: 2px 2ex;
+        font-size: 10pt;
+        background-color: #F4F4F4; color: #606060;
+        }
+
+    .Firefox .CHEntry {
+        -moz-border-radius: 4px;
+        }
+
+    .CHCurrent .CHEntry {
+        font-weight: bold;
+        border-color: #000000;
+        color: #000000;
+        }
+
+    .CHChildNote .CHEntry {
+        font-style: italic;
+        font-size: 8pt;
+        }
+
+    .CHIndent {
+        margin-left: 3ex;
+        }
+
+    .CHEntry a:link,
+    .CHEntry a:visited,
+    .CHEntry a:hover {
+        color: #606060;
+        }
+    .CHEntry a:active {
+        color: #800000;
+        }
+
+
+
+
+
+#Index {
+    background-color: #FFFFFF;
+    }
+
+/*  As opposed to .PopupSearchResultsPage #Index  */
+.IndexPage #Index,
+.FramedIndexPage #Index,
+.FramedSearchResultsPage #Index {
+    padding: 15px;
+    }
+
+.IndexPage #Index {
+    border-width: 0 0 1px 1px;
+    border-style: solid;
+    border-color: #000000;
+    font-size: 9pt;  /* To make 27ex match the menu's 27ex. */
+    margin-left: 27ex;
+    }
+
+
+    .IPageTitle {
+        font-size: 20pt; font-weight: bold;
+        color: #FFFFFF; background-color: #7070C0;
+        padding: 10px 15px 10px 15px;
+        border-width: 0 0 3px 0; border-color: #000000; border-style: solid;
+        margin: -15px -15px 0 -15px }
+
+    .FramedSearchResultsPage .IPageTitle {
+        margin-bottom: 15px;
+        }
+
+    .INavigationBar {
+        font-size: 10pt;
+        text-align: center;
+        background-color: #FFFFF0;
+        padding: 5px;
+        border-bottom: solid 1px black;
+        margin: 0 -15px 15px -15px;
+        }
+
+    .INavigationBar a {
+        font-weight: bold }
+
+    .IHeading {
+        font-size: 16pt; font-weight: bold;
+        padding: 2.5em 0 .5em 0;
+        text-align: center;
+        width: 3.5ex;
+        }
+    #IFirstHeading {
+        padding-top: 0;
+        }
+
+    .IEntry {
+        font-size: 10pt;
+        padding-left: 1ex;
+        }
+    .PopupSearchResultsPage .IEntry {
+        font-size: 8pt;
+        padding: 1px 5px;
+        }
+    .PopupSearchResultsPage .Opera9 .IEntry,
+    .FramedSearchResultsPage .Opera9 .IEntry {
+        text-align: left;
+        }
+    .FramedSearchResultsPage .IEntry {
+        padding: 0;
+        }
+
+    .ISubIndex {
+        padding-left: 3ex; padding-bottom: .5em }
+    .PopupSearchResultsPage .ISubIndex {
+        display: none;
+        }
+
+    /*  While it may cause some entries to look like links when they aren't, I found it's much easier to read the
+         index if everything's the same color.  */
+    .ISymbol {
+        font-weight: bold; color: #900000  }
+
+    .IndexPage .ISymbolPrefix,
+    .FramedIndexPage .ISymbolPrefix {
+        font-size: 10pt;
+        text-align: right;
+        color: #C47C7C;
+        background-color: #F8F8F8;
+        border-right: 3px solid #E0E0E0;
+        border-left: 1px solid #E0E0E0;
+        padding: 0 1px 0 2px;
+        }
+    .PopupSearchResultsPage .ISymbolPrefix,
+    .FramedSearchResultsPage .ISymbolPrefix {
+        color: #900000;
+        }
+    .PopupSearchResultsPage .ISymbolPrefix {
+        font-size: 8pt;
+        }
+
+    .IndexPage #IFirstSymbolPrefix,
+    .FramedIndexPage #IFirstSymbolPrefix {
+        border-top: 1px solid #E0E0E0;
+        }
+    .IndexPage #ILastSymbolPrefix,
+    .FramedIndexPage #ILastSymbolPrefix {
+        border-bottom: 1px solid #E0E0E0;
+        }
+    .IndexPage #IOnlySymbolPrefix,
+    .FramedIndexPage #IOnlySymbolPrefix {
+        border-top: 1px solid #E0E0E0;
+        border-bottom: 1px solid #E0E0E0;
+        }
+
+    a.IParent,
+    a.IFile {
+        display: block;
+        }
+
+    .PopupSearchResultsPage .SRStatus {
+        padding: 2px 5px;
+        font-size: 8pt;
+        font-style: italic;
+        }
+    .FramedSearchResultsPage .SRStatus {
+        font-size: 10pt;
+        font-style: italic;
+        }
+
+    .SRResult {
+        display: none;
+        }
+
+
+
+#Footer {
+    font-size: 8pt;
+    color: #989898;
+    text-align: right;
+    }
+
+#Footer p {
+    text-indent: 0;
+    margin-bottom: .5em;
+    }
+
+.ContentPage #Footer,
+.IndexPage #Footer {
+    text-align: right;
+    margin: 2px;
+    }
+
+.FramedMenuPage #Footer {
+    text-align: center;
+    margin: 5em 10px 10px 10px;
+    padding-top: 1em;
+    border-top: 1px solid #C8C8C8;
+    }
+
+    #Footer a:link,
+    #Footer a:hover,
+    #Footer a:visited { color: #989898 }
+    #Footer a:active { color: #A00000 }
+
diff --git a/doc/devdocs/styles/2.css b/doc/devdocs/styles/2.css
new file mode 100644
index 0000000..a397119
--- /dev/null
+++ b/doc/devdocs/styles/2.css
@@ -0,0 +1,20 @@
+p {
+    text-indent: 0; margin-bottom: 1em;
+}
+
+.MGroup {
+    font-variant: normal;
+    margin: 0.4em 0 0em 10px
+}
+
+.MTitle {
+    font-variant: normal;
+}
+
+.CGroup .CTitle {
+    font-variant: normal;
+}
+
+.SGroup .SEntry {
+    font-variant: normal;
+}
\ No newline at end of file
diff --git a/doc/devdocs/styles/main.css b/doc/devdocs/styles/main.css
new file mode 100644
index 0000000..a672a94
--- /dev/null
+++ b/doc/devdocs/styles/main.css
@@ -0,0 +1,2 @@
+ at import URL("1.css");
+ at import URL("2.css");
diff --git a/doc/licenses/APACHE-2.0.txt b/doc/licenses/APACHE-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/doc/licenses/APACHE-2.0.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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
+
+   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.
diff --git a/doc/licenses/BSD-LICENSE.txt b/doc/licenses/BSD-LICENSE.txt
new file mode 100644
index 0000000..aa321e6
--- /dev/null
+++ b/doc/licenses/BSD-LICENSE.txt
@@ -0,0 +1,28 @@
+Redistribution and use of this software in source and binary forms, with or
+without modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the
+  following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+* Neither the name of Yahoo! Inc. nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Yahoo! Inc.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/doc/licenses/MIT-LICENSE.txt b/doc/licenses/MIT-LICENSE.txt
new file mode 100644
index 0000000..c9b44cb
--- /dev/null
+++ b/doc/licenses/MIT-LICENSE.txt
@@ -0,0 +1,18 @@
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/doc/readme.txt b/doc/readme.txt
new file mode 100644
index 0000000..d02540a
--- /dev/null
+++ b/doc/readme.txt
@@ -0,0 +1,7 @@
+Automatically generated OpenLayers API documentation is online:
+
+  http://dev.openlayers.org/apidocs
+
+More information on documentation is available from:
+
+  http://trac.openlayers.org/wiki/Documentation
diff --git a/doc/walkthru.html b/doc/walkthru.html
new file mode 100644
index 0000000..b135e63
--- /dev/null
+++ b/doc/walkthru.html
@@ -0,0 +1,96 @@
+<html>
+<head>
+<title>OpenLayers examples walkthrough</title>
+<style type="text/css">
+    a { color:blue; text-decoration: none; }
+    a:hover { text-decoration: underline; }
+</style>
+<base href="http://openlayers.org/dev/examples/">
+</head>
+<body style="font-family: sans-serif">
+<h1><pre style="font-size: larger"><ol></pre></h1>
+<p>API documentation: <a href="http://dev.openlayers.org/docs/">http://dev.openlayers.org/docs/</a></p>
+<p>Examples: <a href="http://dev.openlayers.org/examples/">http://openlayers.org/dev/examples/</a></p>
+<h2>Maps</h2>
+<ol>
+    <li><a href="../examples/lite.html">Basic example</a></li>
+    <li><a href="../examples/layerswitcher.html">Layer switcher (aka legend)</a></li>
+    <li><a href="../examples/example.html">Base layers versus overlays</a></li>
+    <li><a href="../examples/multiserver.html">Multiple WMS mirrors</a></li>
+    <li><a href="../examples/fullScreen.html">Full screen map</a></li>
+    <li><a href="../examples/wrapDateLine.html">Wrapping the date line</a></li>
+    <li><a href="../examples/projected-map.html">Other cartographic projections</a></li>
+    <li><a href="../examples/layer-opacity.html">Translucent overlays</a></li>
+</ol>
+
+<h2>Raster Layers</h2>
+<ol>
+    <li><a href="../examples/wms-untiled.html">Untiled WMS layer</a></li>
+    <li><a href="../examples/kamap.html">Ka-Map layer</a></li>
+    <li><a href="../examples/mapserver.html">MapServer layer</a></li>
+    <li><a href="../examples/worldwind.html">Worldwind layer</a></li>
+    <li><a href="../examples/tms.html">TMS layer</a></li>
+    <li><a href="../examples/image-layer.html">Image layer</a></li>
+    <li><a href="../examples/google.html">Google layer</a></li>
+    <li><a href="../examples/ve.html">VirtualEarth layer</a></li>
+    <li><a href="../examples/spherical-mercator.html">Spherical Mercator ("EPSG:900913")</a></li>
+    <li><a href="http://tilecache.org/">TileCache</a></li>
+</ol>
+
+<h2>Marker Layers</h2>
+<ol>
+    <li><a href="../examples/markers.html">Markers</a></li>
+    <li><a href="../examples/markerResize.html">Changing marker properties dynamically</a></li>
+    <li><a href="../examples/popups.html">Popups</a></li>
+    <li><a href="../examples/georss.html">GeoRSS</a> (<a href="georss.xml">example data</a>)</a></li>
+    <li><a href="../examples/georss-markers.html">GeoRSS with custom markers</a></li>
+    <li><a href="../examples/wfs.html">Point layer from WFS</a></li>
+    <li><a href="../examples/getfeatureinfo.html">WFS GetFeatureInfo example</a></li>
+</ol>
+
+<h2>Events and Controls</h2>
+<ol>
+    <li><a href="../examples/navtoolbar.html">Navigation tools on the map</a></li>
+    <li><a href="../examples/navtoolbar-outsidemap.html">Navigation toolbar off the map</a></li>
+    <li><a href="../examples/mouse-position.html">Tracking the mouse position</a></li>
+    <li><a href="../examples/overview.html">Overview map</a></li>
+    <li><a href="../examples/attribution.html">Layer attribution</a></li>
+    <li><a href="../examples/controls.html">Full range of controls</a></li>
+    <li><a href="../examples/custom-control.html">Custom controls #1</a></li>
+    <li><a href="../examples/custom-control.html">Custom controls #2</a></li>
+    <li><a href="../examples/custom-style.html">Custom control styles</a></li>
+    <li><a href="../examples/click.html">Trapping click events</a></li>
+    <li><a href="../examples/layerLoadMonitoring.html">Tracking map events</a></li>
+</ol>
+
+<h2>Vector Layers</h2>
+<ol>
+    <li><a href="../examples/vector-features.html">Generating features in JavaScript</a></li>
+    <li><a href="../examples/gml-layer.html">Loading features from GML</a></li>
+    <li><a href="../examples/kml-layer.html">Loading features from KML</a></li>
+    <li><a href="../examples/gml-serialize.html">Serializing features to GML</a></li>
+    <li><a href="../examples/vector-formats.html">Serializing to other formats</a></li>
+    <li><a href="../examples/select-feature.html">Selecting features</a></li>
+    <li><a href="../examples/select-feature-openpopup.html">Attaching popups to features</a></li>
+</ol>
+
+<h2>Editing Tools</h2>
+<ol>
+    <li><a href="../examples/draw-feature.html">Drawing features</a></li>
+    <li><a href="../examples/editingtoolbar.html">Editing toolbar</a> (<a href="editingtoolbar-outside.html">outside the map</a>)</li>
+    <li><a href="../examples/regular-polygons.html">Creating regular polygons</a></li>
+    <li><a href="../examples/modify-feature.html">Modifying features</a></li>
+    <li><a href="../examples/resize-features.html">Resizing features</a></li>
+    <li><a href="../examples/rotate-features.html">Rotating features</a></li>
+    <li><a href="../examples/wfs-t.html">Transactional WFS example</a></li>
+    <li><a href="http://featureserver.org/">FeatureServer</a></li>
+</ol>
+
+<h2>Testing</h2>
+<ol>
+    <li><a href="../tests/run-tests.html">Test.AnotherWay suite</a></li>
+</ol>
+
+<h1><pre style="font-size: larger"></ol></pre></h1>
+</body>
+</html>
diff --git a/doc_config/Data/ClassHierarchy.nd b/doc_config/Data/ClassHierarchy.nd
new file mode 100644
index 0000000..c2257f2
Binary files /dev/null and b/doc_config/Data/ClassHierarchy.nd differ
diff --git a/doc_config/Data/ConfigFileInfo.nd b/doc_config/Data/ConfigFileInfo.nd
new file mode 100644
index 0000000..fbb0e5b
--- /dev/null
+++ b/doc_config/Data/ConfigFileInfo.nd
@@ -0,0 +1 @@
+$
L��GX�pL��GX�pL��
\ No newline at end of file
diff --git a/doc_config/Data/FileInfo.nd b/doc_config/Data/FileInfo.nd
new file mode 100644
index 0000000..e738b8a
--- /dev/null
+++ b/doc_config/Data/FileInfo.nd
@@ -0,0 +1,289 @@
+Development Release 12-07-2007 (1.35 base)
+JavaScript
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomToMaxExtent.js	1283463805	1	OpenLayers.Control.ZoomToMaxExtent
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tween.js	1283463805	1	OpenLayers.Tween
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Marker/Box.js	1283463805	1	OpenLayers.Marker.Box
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/vi.js	1283463805	1	OpenLayers.Lang["vi"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Box.js	1283463805	1	OpenLayers.Handler.Box
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS/v1_0_0.js	1283463805	1	OpenLayers.Protocol.WFS.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OSM.js	1283463805	1	OpenLayers.Format.OSM
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/gl.js	1283463805	1	OpenLayers.Lang["gl"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/nn.js	1283463805	1	OpenLayers.Lang["nn"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Filter/v1_1_0.js	1283463805	1	OpenLayers.Format.Filter.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFS.js	1283463805	1	OpenLayers.Format.WFS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js	1283463805	1	OpenLayers.Format.WFSCapabilities/v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/VirtualEarth.js	1283463805	1	OpenLayers.Layer.VirtualEarth
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WMS/Post.js	1283463805	1	OpenLayers.Layer.WMS.Post
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomIn.js	1283463805	1	OpenLayers.Control.ZoomIn
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_1_0.js	1283463805	1	OpenLayers.Format.WMSCapabilities/v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GPX.js	1283463805	1	OpenLayers.Format.GPX
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities.js	1283463805	1	OpenLayers.Format.WMSCapabilities
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Filter/v1.js	1283463805	1	OpenLayers.Format.Filter.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WMS.js	1283463805	1	OpenLayers.Layer.WMS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Boxes.js	1283463805	1	OpenLayers.Layer.Boxes
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Text.js	1283463805	1	OpenLayers.Format.Text
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Scale.js	1283463805	1	OpenLayers.Control.Scale
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Click.js	1283463805	1	OpenLayers.Handler.Click
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SOSCapabilities/v1_0_0.js	1283463805	1	OpenLayers.Format.SOSCapabilities.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/MultiPolygon.js	1283463805	1	OpenLayers.Geometry.MultiPolygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes.js	1283463805	1	OpenLayers Base Types
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/FixedZoomLevels.js	1283463805	1	OpenLayers.Layer.FixedZoomLevels
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry.js	1283463805	1	OpenLayers.Geometry
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter/FeatureId.js	1283463805	1	OpenLayers.Filter.FeatureId
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter.js	1283463805	1	OpenLayers.Filter
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/RegularPolygon.js	1283463805	1	OpenLayers.Handler.RegularPolygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Panel.js	1283463805	1	OpenLayers.Control.Panel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/MultiLineString.js	1283463805	1	OpenLayers.Geometry.MultiLineString
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ModifyFeature.js	1283463805	1	OpenLayers.Control.ModifyFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Refresh.js	1283463805	1	OpenLayers.Strategy.Refresh
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Attribution.js	1283463805	1	OpenLayers.Control.Attribution
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers.js	1284024673	1	OpenLayers
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/SelectFeature.js	1283463805	1	OpenLayers.Control.SelectFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/es.js	1283463805	1	OpenLayers.Lang["es"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/te.js	1283463805	1	OpenLayers.Lang["te"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/hsb.js	1283463805	1	OpenLayers.Lang["hsb"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Grid.js	1283463805	1	OpenLayers.Layer.Grid
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/da-DK.js	1283463805	1	OpenLayers.Lang["da-DK"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomOut.js	1283463805	1	OpenLayers.Control.ZoomOut
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Polygon.js	1283463805	1	OpenLayers.Geometry.Polygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSCommon/v1_1_0.js	1283463805	1	OpenLayers.Format.OWSCommon.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ar.js	1283463805	1	OpenLayers.Lang["ar"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SOSCapabilities.js	1283463805	1	OpenLayers.Format.SOSCapabilities
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Style.js	1283463805	1	OpenLayers.Style
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/XYZ.js	1283463805	1	OpenLayers.Layer.XYZ
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/hu.js	1283463805	1	OpenLayers.Lang["hu"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer.js	1283463805	1	OpenLayers.Symbolizer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Feature.js	1283463805	1	OpenLayers.Handler.Feature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ja.js	1283463805	1	OpenLayers.Lang["ja"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/is.js	1283463805	1	OpenLayers.Lang["is"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer/Canvas.js	1283463805	1	OpenLayers.Renderer.Canvas
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Filter/v1_0_0.js	1283463805	1	OpenLayers.Format.Filter.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/TMS.js	1283463805	1	OpenLayers.Layer.TMS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/OverviewMap.js	1283463805	1	OpenLayers.Control.OverviewMap
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/WMSGetFeatureInfo.js	1283463805	1	OpenLayers.Control.WMSGetFeatureInfo
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/hr.js	1283463805	1	OpenLayers.Lang["hr"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/bg.js	1283463805	1	OpenLayers.Lang["bg"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ca.js	1283463805	1	OpenLayers.Lang["ca"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSCapabilities/v1_1_0.js	1283463805	1	OpenLayers.Format.WFSCapabilities/v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/en-CA.js	1283463805	1	OpenLayers.Lang["en-CA"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/LinearRing.js	1283463805	1	OpenLayers.Geometry.LinearRing
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/MultiPoint.js	1283463805	1	OpenLayers.Geometry.MultiPoint
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Navigation.js	1283463805	1	OpenLayers.Control.Navigation
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSContext/v0_3_1.js	1283463805	1	OpenLayers.Format.OWSContext.v0_3_1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/MapServer/Untiled.js	1283463805	1	OpenLayers.Layer.MapServer.Untiled
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMTSCapabilities/v1_0_0.js	1283463805	1	OpenLayers.Format.WMTSCapabilities.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/license.txt	1181603869	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/license.txt
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Line.js	1283463805	1	OpenLayers.Symbolizer.Line
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/GeoRSS.js	1283463805	1	OpenLayers.Layer.GeoRSS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Events.js	1283463805	1	OpenLayers.Event
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Atom.js	1283463805	1	OpenLayers.Format.Atom
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SOSGetObservation.js	1283463805	1	OpenLayers.Format.SOSGetObservation
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Cluster.js	1283463805	1	OpenLayers.Strategy.Cluster
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/fur.js	1283463805	1	OpenLayers.Lang["fur"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ksh.js	1283463805	1	OpenLayers.Lang["ksh"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/JSON.js	1283463805	1	OpenLayers.Format.JSON
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/firebugx.js	1202500315	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/firebugx.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSCommon/v1.js	1283463805	1	OpenLayers.Format.OWSCommon.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Vector/RootContainer.js	1283463805	1	OpenLayers.Layer.Vector.RootContainer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SOS/v1_0_0.js	1283463805	1	OpenLayers.Protocol.SOS.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SLD/v1.js	1283463805	1	OpenLayers.Format.SLD.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Save.js	1283463805	1	OpenLayers.Strategy.Save
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/PanZoom.js	1283463805	1	OpenLayers.Control.PanZoom
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer/VML.js	1283463805	1	OpenLayers.Renderer.VML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Pixel.js	1283463805	1	OpenLayers.Pixel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/be-tarask.js	1283463805	1	OpenLayers.Lang["be-tarask"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GML/v2.js	1283463805	1	OpenLayers.Format.GML.v2
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/br.js	1283463805	1	OpenLayers.Lang["br"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMC/v1.js	1283463805	1	OpenLayers.Format.WMC.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Text.js	1283463805	1	OpenLayers.Symbolizer.Text
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tile.js	1283463805	1	OpenLayers.Tile
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/ArcXML.js	1283463805	1	OpenLayers.Format.ArcXML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Rule.js	1283463805	1	OpenLayers.Rule
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/oc.js	1283463805	1	OpenLayers.Lang["oc"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS/v1_1_0.js	1283463805	1	OpenLayers.Protocol.WFS.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SOS.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SOS.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter/Spatial.js	1283463805	1	OpenLayers.Filter.Spatial
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/zh-TW.js	1283463805	1	OpenLayers.Lang["zh-TW"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/GML.js	1283463805	1	OpenLayers.Layer.GML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/MultiMap.js	1283463805	1	OpenLayers.Layer.MultiMap
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format.js	1283463805	1	OpenLayers.Format
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST/v1_0_0.js	1283463805	1	OpenLayers.Format.WFST.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Class.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Class.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer.js	1283463805	1	OpenLayers.Layer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMC/v1_1_0.js	1283463805	1	OpenLayers.Format.WMC.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Element.js	1283463805	1	OpenLayers.Element
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/WMTSGetFeatureInfo.js	1283463805	1	OpenLayers.Control.WMTSGetFeatureInfo
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMC/v1_0_0.js	1283463805	1	OpenLayers.Format.WMC.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Markers.js	1283463805	1	OpenLayers.Layer.Markers
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/LonLat.js	1283463805	1	OpenLayers.LonLat
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Permalink.js	1283463805	1	OpenLayers.Control.Permalink
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/MouseToolbar.js	1283463805	1	OpenLayers.Control.MouseToolbar
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/zh-CN.js	1283463805	1	OpenLayers.Lang["zh-CN"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Pan.js	1283463805	1	OpenLayers.Control.Pan
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/EventPane.js	1283463805	1	OpenLayers.Layer.EventPane
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSCommon/v1_0_0.js	1283463805	1	OpenLayers.Format.OWSCommon.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1.js	1283463805	1	OpenLayers.Format.WMSCapabilities.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Yahoo.js	1283463805	1	OpenLayers.Layer.Yahoo
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetRecords.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetRecords.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol.js	1283463805	1	OpenLayers.Protocol
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_1.js	1283463805	1	OpenLayers.Format.WMSCapabilities.v1_1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetDomain/v2_0_2.js	1283463805	1	OpenLayers.Format.CSWGetDomain.v2_0_2
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/firebug.js	1202500315	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/firebug.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Keyboard.js	1283463805	1	OpenLayers.handler.Keyboard
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/km.js	1283463805	1	OpenLayers.Lang["km"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/nds.js	1283463805	1	OpenLayers.Lang["nds"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/MapGuide.js	1283463805	1	OpenLayers.Layer.MapGuide
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup/Framed.js	1283463805	1	OpenLayers.Popup.Framed
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/ArcGIS93Rest.js	1283463805	1	OpenLayers.Layer.ArcGIS93Rest
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Curve.js	1283463805	1	OpenLayers.Geometry.Curve
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Raster.js	1283463805	1	OpenLayers.Symbolizer.Raster
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Style2.js	1283463805	1	OpenLayers.Style2
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Vector.js	1283463805	1	OpenLayers.Layer.Vector
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSCapabilities/v1.js	1283463805	1	OpenLayers.Format.WFSCapabilities.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ru.js	1283463805	1	OpenLayers.Lang["ru"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GeoRSS.js	1283463805	1	OpenLayers.Format.GeoRSS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomBox.js	1283463805	1	OpenLayers.Control.ZoomBox
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/ArcXML/Features.js	1283463805	1	OpenLayers.Format.ArcXML.Features
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/gsw.js	1283463805	1	OpenLayers.Lang["gsw"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/io.js	1283463805	1	OpenLayers.Lang["io"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/readme.txt	1181603869	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Firebug/readme.txt
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/BBOX.js	1283463805	1	OpenLayers.Strategy.BBOX
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMC.js	1283463805	1	OpenLayers.Format.WMC
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SOSGetFeatureOfInterest.js	1283463805	1	OpenLayers.Format.SOSGetFeatureOfInterest
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Request.js	1283463805	1	OpenLayers.Request
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WKT.js	1283463805	1	OpenLayers.Format.WKT
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SQL.js	1283463805	1	OpenLayers.Protocol.SQL
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Util.js	1283463805	1	Util
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSGetFeatureInfo.js	1283463805	1	OpenLayers.Format.WMSGetFeatureInfo
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSDescribeLayer.js	1283463805	1	OpenLayers.Format.WMSDescribeLayer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GeoJSON.js	1283463805	1	OpenLayers.Format.GeoJSON
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Projection.js	1283463805	1	OpenLayers.Projection
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Ajax.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Ajax.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/MousePosition.js	1283463805	1	OpenLayers.Control.MousePosition
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/it.js	1283463805	1	OpenLayers.Lang["it"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/PanZoomBar.js	1283463805	1	OpenLayers.Control.PanZoomBar
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/KeyboardDefaults.js	1283463805	1	OpenLayers.Control.KeyboardDefaults
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/HTTP.js	1283463805	1	OpenLayers.Protocol.HTTP
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/HTTPRequest.js	1283463805	1	OpenLayers.Layer.HTTPRequest
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/fr.js	1283463805	1	OpenLayers.Lang["fr"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WFS.js	1283463805	1	OpenLayers.Layer.WFS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Map.js	1283463805	1	OpenLayers.Map
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/nl.js	1283463805	1	OpenLayers.Lang["nl"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SLD.js	1283463805	1	OpenLayers.Format.SLD
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/SLD/v1_0_0.js	1283463805	1	OpenLayers.Format.SLD.v1_0_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WMS/Untiled.js	1283463805	1	OpenLayers.Layer.WMS.Untiled
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/PointTrack.js	1283463805	1	OpenLayers.Layer.PointTrack
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMTSCapabilities.js	1283463805	1	OpenLayers.Format.WMTSCapabilities
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/fi.js	1283463805	1	OpenLayers.Lang["fi"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Surface.js	1283463805	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Surface.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control.js	1283463805	1	OpenLayers.Control
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST/v1.js	1283463805	1	OpenLayers.Format.WFST.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/TileCache.js	1283463805	1	OpenLayers.Layer.TileCache
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Rico/Color.js	1201963564	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Rico/Color.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSCapabilities.js	1283463805	1	OpenLayers.Format.WFSCapabilities
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang.js	1283463805	1	OpenLayers.Lang
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Request/XMLHttpRequest.js	1277709397	1	OpenLayers.Request.XMLHttpRequest
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tile/Image.js	1283463805	1	OpenLayers.Tile.Image
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetDomain.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetDomain.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/TransformFeature.js	1283463805	1	OpenLayers.Control.TransformFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/OWSContext.js	1283463805	1	OpenLayers.Format.OWSContext
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Image.js	1283463805	1	OpenLayers.Layer.Image
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/DrawFeature.js	1283463805	1	OpenLayers.Control.DrawFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WMTS.js	1283463805	1	OpenLayers.Layer.WMTS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Feature/WFS.js	1283463805	1	OpenLayers.Feature.WFS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy.js	1283463805	1	OpenLayers.Strategy
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ArgParser.js	1283463805	1	OpenLayers.Control.ArgParser
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter/Comparison.js	1283463805	1	OpenLayers.Filter.Comparison
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/sk.js	1283463805	1	OpenLayers.Lang["sk"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Gears/gears_init.js	1221231425	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Gears/gears_init.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Snapping.js	1283463805	1	OpenLayers.Control.Snapping
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer/Elements.js	1283463805	1	OpenLayers.ElementsIndexer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Button.js	1283463805	1	OpenLayers.Control.Button
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/NavToolbar.js	1283463805	1	OpenLayers.Control.NavToolbar
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/NavigationHistory.js	1283463805	1	OpenLayers.Control.NavigationHistory
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/KaMap.js	1283463805	1	OpenLayers.Layer.KaMap
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Collection.js	1283463805	1	OpenLayers.Geometry.Collection
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Google/v3.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Google/v3.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Zoomify.js	1283463805	1	OpenLayers.Layer.Zoomify
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ScaleLine.js	1283463805	1	OpenLayers.Control.ScaleLine
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/el.js	1283463805	1	OpenLayers.Lang["el"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Console.js	1283463805	1	OpenLayers.Console
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Bounds.js	1283463805	1	OpenLayers.Bounds
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Icon.js	1283463805	1	OpenLayers.Icon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer/SVG.js	1283463805	1	OpenLayers.Renderer.SVG
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Hover.js	1283463805	1	OpenLayers.Handler.Hover
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tile/Image/IFrame.js	1283463805	1	OpenLayers.Tile.Image.IFrame
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GML/Base.js	1283463805	1	OpenLayers.Format.GML.Base
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/ia.js	1283463805	1	OpenLayers.Lang["ia"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/DragFeature.js	1283463805	1	OpenLayers.Control.DragFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Filter.js	1283463805	1	OpenLayers.Strategy.Filter
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Text.js	1283463805	1	OpenLayers.Layer.Text
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Context.js	1283463805	1	OpenLayers.Format.Context
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/LayerSwitcher.js	1283463805	1	OpenLayers.Control.LayerSwitcher
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/de.js	1283463805	1	OpenLayers.Lang["de"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Point.js	1283463805	1	OpenLayers.Geometry.Point
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/nb.js	1283463805	1	OpenLayers.Lang["nb"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/SQL/Gears.js	1283463805	1	OpenLayers.Protocol.SQL.Gears
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/pt-BR.js	1283463805	1	OpenLayers.Lang["pt-br"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/ArcIMS.js	1283463805	1	OpenLayers.Layer.ArcIMS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFST/v1_1_0.js	1283463805	1	OpenLayers.Format.WFST.v1_1_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/Google.js	1283463805	1	OpenLayers.Layer.Google
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/PanPanel.js	1283463805	1	OpenLayers.Control.PanPanel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GML.js	1283463805	1	OpenLayers.Format.GML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/SingleFile.js	1283463805	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/SingleFile.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/SphericalMercator.js	1283463805	1	OpenLayers.Layer.SphericalMercator
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Measure.js	1283463805	1	OpenLayers.Control.Measure
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Split.js	1283463805	1	OpenLayers.Control.Split
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/LineString.js	1283463805	1	OpenLayers.Geometry.LineString
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/id.js	1283463805	1	OpenLayers.Lang["id"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup/AnchoredBubble.js	1283463805	1	OpenLayers.Popup.AnchoredBubble
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSDescribeFeatureType.js	1283463805	1	/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WFSDescribeFeatureType.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/ZoomPanel.js	1283463805	1	OpenLayers.Control.ZoomPanel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Tile/WFS.js	1283463805	1	OpenLayers.Tile.WFS
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_3.js	1283463805	1	OpenLayers.Format.WMSCapabilities/v1_3
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/BaseTypes/Size.js	1283463805	1	OpenLayers.Size
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Polygon.js	1283463805	1	OpenLayers.Symbolizer.Polygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_1_1.js	1283463805	1	OpenLayers.Format.WMSCapabilities/v1_1_1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/EditingToolbar.js	1283463805	1	OpenLayers.Control.EditingToolbar
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js	1283463805	1	OpenLayers.Format.CSWGetRecords.v2_0_2
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/KaMapCache.js	1283463805	1	OpenLayers.Layer.KaMapCache
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/GetFeature.js	1283463805	1	OpenLayers.Control.GetFeature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/MouseDefaults.js	1283463805	1	OpenLayers.Control.MouseDefaults
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Drag.js	1283463805	1	OpenLayers.Handler.Drag
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSCapabilities/v1_3_0.js	1283463805	1	OpenLayers.Format.WMSCapabilities/v1_3_0
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup/FramedCloud.js	1283463805	1	OpenLayers.Popup.FramedCloud
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Paging.js	1283463805	1	OpenLayers.Strategy.Paging
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Polygon.js	1283463805	1	OpenLayers.Handler.Polygon
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Symbolizer/Point.js	1283463805	1	OpenLayers.Symbolizer.Point
+/home/crschmidt/2.10/OpenLayers-2.10/lib/Rico/Corner.js	1201963564	0	/home/crschmidt/2.10/OpenLayers-2.10/lib/Rico/Corner.js
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Feature.js	1283463805	1	OpenLayers.Feature
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/en.js	1283463805	1	OpenLayers.Lang["en"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Marker.js	1283463805	1	OpenLayers.Marker
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler.js	1283463805	1	OpenLayers.Handler
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Geometry/Rectangle.js	1283463805	1	OpenLayers.Geometry.Rectangle
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/sv-SE.js	1283463805	1	OpenLayers.Lang["sv"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/MouseWheel.js	1283463805	1	OpenLayers.Handler.MouseWheel
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/cs-CZ.js	1283463805	1	OpenLayers.Lang["cs-CZ"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Strategy/Fixed.js	1283463805	1	OpenLayers.Strategy.Fixed
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/WorldWind.js	1283463805	1	OpenLayers.Layer.WorldWind
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup/Anchored.js	1283463805	1	OpenLayers.Popup.Anchored
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Popup.js	1283463805	1	OpenLayers.Popup
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Point.js	1283463805	1	OpenLayers.Handler.Point
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/StyleMap.js	1283463805	1	OpenLayers.StyleMap
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/KML.js	1283463805	1	OpenLayers.Format.KML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Filter/Logical.js	1283463805	1	OpenLayers.Filter.Logical
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/XML.js	1283463805	1	OpenLayers.Format.XML
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/DragPan.js	1283463805	1	OpenLayers.Control.DragPan
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Renderer.js	1283463805	1	OpenLayers.Renderer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Layer/MapServer.js	1283463805	1	OpenLayers.Layer.MapServer
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Handler/Path.js	1283463805	1	OpenLayers.Handler.Path
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/Filter.js	1283463805	1	OpenLayers.Format.Filter
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Lang/pt.js	1283463805	1	OpenLayers.Lang["pt"]
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/Graticule.js	1283463805	1	OpenLayers.Control.Graticule
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Protocol/WFS/v1.js	1283463805	1	OpenLayers.Protocol.WFS.v1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js	1283463805	1	OpenLayers.Format.WMSDescribeLayer.v1_1
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Feature/Vector.js	1283463805	1	OpenLayers.Feature.Vector
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Control/SLDSelect.js	1283463805	1	OpenLayers.Control.SLDSelect
+/home/crschmidt/2.10/OpenLayers-2.10/lib/OpenLayers/Format/GML/v3.js	1283463805	1	OpenLayers.Format.GML.v3
diff --git a/doc_config/Data/ImageFileInfo.nd b/doc_config/Data/ImageFileInfo.nd
new file mode 100644
index 0000000..550e24b
Binary files /dev/null and b/doc_config/Data/ImageFileInfo.nd differ
diff --git a/doc_config/Data/ImageReferenceTable.nd b/doc_config/Data/ImageReferenceTable.nd
new file mode 100644
index 0000000..a3ed9fa
Binary files /dev/null and b/doc_config/Data/ImageReferenceTable.nd differ
diff --git a/doc_config/Data/IndexInfo.nd b/doc_config/Data/IndexInfo.nd
new file mode 100644
index 0000000..83a62e4
Binary files /dev/null and b/doc_config/Data/IndexInfo.nd differ
diff --git a/doc_config/Data/PreviousMenuState.nd b/doc_config/Data/PreviousMenuState.nd
new file mode 100644
index 0000000..bf41f62
Binary files /dev/null and b/doc_config/Data/PreviousMenuState.nd differ
diff --git a/doc_config/Data/PreviousSettings.nd b/doc_config/Data/PreviousSettings.nd
new file mode 100644
index 0000000..274c3eb
Binary files /dev/null and b/doc_config/Data/PreviousSettings.nd differ
diff --git a/doc_config/Data/SymbolTable.nd b/doc_config/Data/SymbolTable.nd
new file mode 100644
index 0000000..0475a68
Binary files /dev/null and b/doc_config/Data/SymbolTable.nd differ
diff --git a/doc_config/Languages.txt b/doc_config/Languages.txt
new file mode 100644
index 0000000..ce0f107
--- /dev/null
+++ b/doc_config/Languages.txt
@@ -0,0 +1,113 @@
+Format: Development Release 12-07-2007 (1.35 base)
+
+# This is the Natural Docs languages file for this project.  If you change
+# anything here, it will apply to THIS PROJECT ONLY.  If you'd like to change
+# something for all your projects, edit the Languages.txt in Natural Docs'
+# Config directory instead.
+
+
+# You can prevent certain file extensions from being scanned like this:
+# Ignore Extensions: [extension] [extension] ...
+
+
+#-------------------------------------------------------------------------------
+# SYNTAX:
+#
+# Unlike other Natural Docs configuration files, in this file all comments
+# MUST be alone on a line.  Some languages deal with the # character, so you
+# cannot put comments on the same line as content.
+#
+# Also, all lists are separated with spaces, not commas, again because some
+# languages may need to use them.
+#
+# Language: [name]
+# Alter Language: [name]
+#    Defines a new language or alters an existing one.  Its name can use any
+#    characters.  If any of the properties below have an add/replace form, you
+#    must use that when using Alter Language.
+#
+#    The language Shebang Script is special.  It's entry is only used for
+#    extensions, and files with those extensions have their shebang (#!) lines
+#    read to determine the real language of the file.  Extensionless files are
+#    always treated this way.
+#
+#    The language Text File is also special.  It's treated as one big comment
+#    so you can put Natural Docs content in them without special symbols.  Also,
+#    if you don't specify a package separator, ignored prefixes, or enum value
+#    behavior, it will copy those settings from the language that is used most
+#    in the source tree.
+#
+# Extensions: [extension] [extension] ...
+# [Add/Replace] Extensions: [extension] [extension] ...
+#    Defines the file extensions of the language's source files.  You can
+#    redefine extensions found in the main languages file.  You can use * to
+#    mean any undefined extension.
+#
+# Shebang Strings: [string] [string] ...
+# [Add/Replace] Shebang Strings: [string] [string] ...
+#    Defines a list of strings that can appear in the shebang (#!) line to
+#    designate that it's part of the language.  You can redefine strings found
+#    in the main languages file.
+#
+# Ignore Prefixes in Index: [prefix] [prefix] ...
+# [Add/Replace] Ignored Prefixes in Index: [prefix] [prefix] ...
+#
+# Ignore [Topic Type] Prefixes in Index: [prefix] [prefix] ...
+# [Add/Replace] Ignored [Topic Type] Prefixes in Index: [prefix] [prefix] ...
+#    Specifies prefixes that should be ignored when sorting symbols in an
+#    index.  Can be specified in general or for a specific topic type.
+#
+#------------------------------------------------------------------------------
+# For basic language support only:
+#
+# Line Comments: [symbol] [symbol] ...
+#    Defines a space-separated list of symbols that are used for line comments,
+#    if any.
+#
+# Block Comments: [opening sym] [closing sym] [opening sym] [closing sym] ...
+#    Defines a space-separated list of symbol pairs that are used for block
+#    comments, if any.
+#
+# Package Separator: [symbol]
+#    Defines the default package separator symbol.  The default is a dot.
+#
+# [Topic Type] Prototype Enders: [symbol] [symbol] ...
+#    When defined, Natural Docs will attempt to get a prototype from the code
+#    immediately following the topic type.  It stops when it reaches one of
+#    these symbols.  Use \n for line breaks.
+#
+# Line Extender: [symbol]
+#    Defines the symbol that allows a prototype to span multiple lines if
+#    normally a line break would end it.
+#
+# Enum Values: [global|under type|under parent]
+#    Defines how enum values are referenced.  The default is global.
+#    global       - Values are always global, referenced as 'value'.
+#    under type   - Values are under the enum type, referenced as
+#               'package.enum.value'.
+#    under parent - Values are under the enum's parent, referenced as
+#               'package.value'.
+#
+# Perl Package: [perl package]
+#    Specifies the Perl package used to fine-tune the language behavior in ways
+#    too complex to do in this file.
+#
+#------------------------------------------------------------------------------
+# For full language support only:
+#
+# Full Language Support: [perl package]
+#    Specifies the Perl package that has the parsing routines necessary for full
+#    language support.
+#
+#-------------------------------------------------------------------------------
+
+# The following languages are defined in the main file, if you'd like to alter
+# them:
+#
+#    Text File, Shebang Script, C/C++, C#, Java, JavaScript, Perl, Python,
+#    PHP, SQL, Visual Basic, Pascal, Assembly, Ada, Tcl, Ruby, Makefile,
+#    ActionScript, ColdFusion, R, Fortran
+
+# If you add a language that you think would be useful to other developers
+# and should be included in Natural Docs by default, please e-mail it to
+# languages [at] naturaldocs [dot] org.
diff --git a/doc_config/Menu.txt b/doc_config/Menu.txt
new file mode 100644
index 0000000..93cff7d
--- /dev/null
+++ b/doc_config/Menu.txt
@@ -0,0 +1,480 @@
+Format: Development Release 12-07-2007 (1.35 base)
+
+
+Title: OpenLayers
+SubTitle: JavaScript Mapping Library
+
+# You can add a footer to your documentation like this:
+# Footer: [text]
+# If you want to add a copyright notice, this would be the place to do it.
+
+# You can add a timestamp to your documentation like one of these:
+# Timestamp: Generated on month day, year
+# Timestamp: Updated mm/dd/yyyy
+# Timestamp: Last updated mon day
+#
+#   m     - One or two digit month.  January is "1"
+#   mm    - Always two digit month.  January is "01"
+#   mon   - Short month word.  January is "Jan"
+#   month - Long month word.  January is "January"
+#   d     - One or two digit day.  1 is "1"
+#   dd    - Always two digit day.  1 is "01"
+#   day   - Day with letter extension.  1 is "1st"
+#   yy    - Two digit year.  2006 is "06"
+#   yyyy  - Four digit year.  2006 is "2006"
+#   year  - Four digit year.  2006 is "2006"
+
+
+# --------------------------------------------------------------------------
+# 
+# Cut and paste the lines below to change the order in which your files
+# appear on the menu.  Don't worry about adding or removing files, Natural
+# Docs will take care of that.
+# 
+# You can further organize the menu by grouping the entries.  Add a
+# "Group: [name] {" line to start a group, and add a "}" to end it.
+# 
+# You can add text and web links to the menu by adding "Text: [text]" and
+# "Link: [name] ([URL])" lines, respectively.
+# 
+# The formatting and comments are auto-generated, so don't worry about
+# neatness when editing the file.  Natural Docs will clean it up the next
+# time it is run.  When working with groups, just deal with the braces and
+# forget about the indentation and comments.
+# 
+# --------------------------------------------------------------------------
+
+
+Group: OpenLayers  {
+
+   File: OpenLayers  (no auto-title, OpenLayers.js)
+
+   Group: BaseTypes  {
+
+      File: Base Types  (no auto-title, OpenLayers/BaseTypes.js)
+      File: Bounds  (no auto-title, OpenLayers/BaseTypes/Bounds.js)
+      File: Class  (no auto-title, OpenLayers/BaseTypes/Class.js)
+      File: Element  (no auto-title, OpenLayers/BaseTypes/Element.js)
+      File: LonLat  (no auto-title, OpenLayers/BaseTypes/LonLat.js)
+      File: Pixel  (no auto-title, OpenLayers/BaseTypes/Pixel.js)
+      File: Size  (no auto-title, OpenLayers/BaseTypes/Size.js)
+      }  # Group: BaseTypes
+
+   Group: Control  {
+
+      File: Control  (no auto-title, OpenLayers/Control.js)
+
+      Group: Control  {
+
+         File: ArgParser  (no auto-title, OpenLayers/Control/ArgParser.js)
+         File: Attribution  (no auto-title, OpenLayers/Control/Attribution.js)
+         File: Button  (no auto-title, OpenLayers/Control/Button.js)
+         File: DragFeature  (no auto-title, OpenLayers/Control/DragFeature.js)
+         File: DragPan  (no auto-title, OpenLayers/Control/DragPan.js)
+         File: DrawFeature  (no auto-title, OpenLayers/Control/DrawFeature.js)
+         File: EditingToolbar  (no auto-title, OpenLayers/Control/EditingToolbar.js)
+         File: GetFeature  (no auto-title, OpenLayers/Control/GetFeature.js)
+         File: Graticule  (OpenLayers/Control/Graticule.js)
+         File: KeyboardDefaults  (no auto-title, OpenLayers/Control/KeyboardDefaults.js)
+         File: LayerSwitcher  (no auto-title, OpenLayers/Control/LayerSwitcher.js)
+         File: Measure  (no auto-title, OpenLayers/Control/Measure.js)
+         File: ModifyFeature  (no auto-title, OpenLayers/Control/ModifyFeature.js)
+         File: MouseDefaults  (no auto-title, OpenLayers/Control/MouseDefaults.js)
+         File: MousePosition  (no auto-title, OpenLayers/Control/MousePosition.js)
+         File: MouseToolbar  (no auto-title, OpenLayers/Control/MouseToolbar.js)
+         File: Navigation  (no auto-title, OpenLayers/Control/Navigation.js)
+         File: NavigationHistory  (no auto-title, OpenLayers/Control/NavigationHistory.js)
+         File: NavToolbar  (no auto-title, OpenLayers/Control/NavToolbar.js)
+         File: OverviewMap  (no auto-title, OpenLayers/Control/OverviewMap.js)
+         File: Pan  (no auto-title, OpenLayers/Control/Pan.js)
+         File: Panel  (no auto-title, OpenLayers/Control/Panel.js)
+         File: PanPanel  (no auto-title, OpenLayers/Control/PanPanel.js)
+         File: PanZoom  (no auto-title, OpenLayers/Control/PanZoom.js)
+         File: PanZoomBar  (no auto-title, OpenLayers/Control/PanZoomBar.js)
+         File: Permalink  (no auto-title, OpenLayers/Control/Permalink.js)
+         File: Scale  (no auto-title, OpenLayers/Control/Scale.js)
+         File: ScaleLine  (no auto-title, OpenLayers/Control/ScaleLine.js)
+         File: SelectFeature  (no auto-title, OpenLayers/Control/SelectFeature.js)
+         File: SLDSelect  (OpenLayers/Control/SLDSelect.js)
+         File: Snapping  (no auto-title, OpenLayers/Control/Snapping.js)
+         File: Split  (no auto-title, OpenLayers/Control/Split.js)
+         File: TransformFeature  (OpenLayers/Control/TransformFeature.js)
+         File: WMSGetFeatureInfo  (OpenLayers/Control/WMSGetFeatureInfo.js)
+         File: WMTSGetFeatureInfo  (OpenLayers/Control/WMTSGetFeatureInfo.js)
+         File: ZoomBox  (no auto-title, OpenLayers/Control/ZoomBox.js)
+         File: ZoomIn  (no auto-title, OpenLayers/Control/ZoomIn.js)
+         File: ZoomOut  (no auto-title, OpenLayers/Control/ZoomOut.js)
+         File: ZoomPanel  (no auto-title, OpenLayers/Control/ZoomPanel.js)
+         File: ZoomToMaxExtent  (no auto-title, OpenLayers/Control/ZoomToMaxExtent.js)
+         }  # Group: Control
+
+      }  # Group: Control
+
+   Group: Feature  {
+
+      File: Feature  (no auto-title, OpenLayers/Feature.js)
+      File: Vector  (no auto-title, OpenLayers/Feature/Vector.js)
+      File: WFS  (no auto-title, OpenLayers/Feature/WFS.js)
+      }  # Group: Feature
+
+   Group: Filter  {
+
+      File: Filter  (no auto-title, OpenLayers/Filter.js)
+      File: Comparison  (no auto-title, OpenLayers/Filter/Comparison.js)
+      File: FeatureId  (no auto-title, OpenLayers/Filter/FeatureId.js)
+      File: Logical  (no auto-title, OpenLayers/Filter/Logical.js)
+      File: Spatial  (no auto-title, OpenLayers/Filter/Spatial.js)
+      }  # Group: Filter
+
+   Group: Format  {
+
+      File: Format  (no auto-title, OpenLayers/Format.js)
+
+      Group: Filter  {
+
+         File: Filter  (no auto-title, OpenLayers/Format/Filter.js)
+         File: v1  (no auto-title, OpenLayers/Format/Filter/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Format/Filter/v1_0_0.js)
+         File: v1_1_0  (OpenLayers/Format/Filter/v1_1_0.js)
+         }  # Group: Filter
+
+      Group: GML  {
+
+         File: GML  (no auto-title, OpenLayers/Format/GML.js)
+         File: Base  (no auto-title, OpenLayers/Format/GML/Base.js)
+         File: v2  (no auto-title, OpenLayers/Format/GML/v2.js)
+         File: v3  (no auto-title, OpenLayers/Format/GML/v3.js)
+         }  # Group: GML
+
+      Group: SLD  {
+
+         File: SLD  (no auto-title, OpenLayers/Format/SLD.js)
+         File: v1  (no auto-title, OpenLayers/Format/SLD/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Format/SLD/v1_0_0.js)
+         }  # Group: SLD
+
+      Group: WFSCapabilities  {
+
+         File: WFSCapabilities  (no auto-title, OpenLayers/Format/WFSCapabilities.js)
+         File: v1  (no auto-title, OpenLayers/Format/WFSCapabilities/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Format/WFSCapabilities/v1_0_0.js)
+         File: v1_1_0  (no auto-title, OpenLayers/Format/WFSCapabilities/v1_1_0.js)
+         }  # Group: WFSCapabilities
+
+      Group: WFST  {
+
+         File: WFST  (no auto-title, OpenLayers/Format/WFST.js)
+         File: v1  (OpenLayers/Format/WFST/v1.js)
+         File: v1_0_0  (OpenLayers/Format/WFST/v1_0_0.js)
+         File: v1_1_0  (OpenLayers/Format/WFST/v1_1_0.js)
+         }  # Group: WFST
+
+      Group: WMC  {
+
+         File: WMC  (no auto-title, OpenLayers/Format/WMC.js)
+         File: v1  (no auto-title, OpenLayers/Format/WMC/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Format/WMC/v1_0_0.js)
+         File: v1_1_0  (no auto-title, OpenLayers/Format/WMC/v1_1_0.js)
+         }  # Group: WMC
+
+      Group: WMSCapabilities  {
+
+         File: WMSCapabilities  (no auto-title, OpenLayers/Format/WMSCapabilities.js)
+         File: v1  (no auto-title, OpenLayers/Format/WMSCapabilities/v1.js)
+         File: v1_1  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1.js)
+         File: v1_1_0  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1_0.js)
+         File: v1_1_1  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_1_1.js)
+         File: v1_3  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_3.js)
+         File: v1_3_0  (no auto-title, OpenLayers/Format/WMSCapabilities/v1_3_0.js)
+         }  # Group: WMSCapabilities
+
+      Group: WMSDescribeLayer  {
+
+         File: WMSDescribeLayer  (no auto-title, OpenLayers/Format/WMSDescribeLayer.js)
+         File: v1_1  (no auto-title, OpenLayers/Format/WMSDescribeLayer/v1_1.js)
+         }  # Group: WMSDescribeLayer
+
+      Group: Format  {
+
+         File: ArcXML  (no auto-title, OpenLayers/Format/ArcXML.js)
+         File: ArcXML.Features  (no auto-title, OpenLayers/Format/ArcXML/Features.js)
+         File: Atom  (no auto-title, OpenLayers/Format/Atom.js)
+         File: Context  (OpenLayers/Format/Context.js)
+         File: CSWGetDomain.DEFAULTS  (no auto-title, OpenLayers/Format/CSWGetDomain.js)
+         File: CSWGetDomain.v2_0_2  (no auto-title, OpenLayers/Format/CSWGetDomain/v2_0_2.js)
+         File: CSWGetRecords.DEFAULTS  (no auto-title, OpenLayers/Format/CSWGetRecords.js)
+         File: CSWGetRecords.v2_0_2  (no auto-title, OpenLayers/Format/CSWGetRecords/v2_0_2.js)
+         File: GeoJSON  (no auto-title, OpenLayers/Format/GeoJSON.js)
+         File: GeoRSS  (no auto-title, OpenLayers/Format/GeoRSS.js)
+         File: GPX  (no auto-title, OpenLayers/Format/GPX.js)
+         File: JSON  (no auto-title, OpenLayers/Format/JSON.js)
+         File: KML  (no auto-title, OpenLayers/Format/KML.js)
+         File: OSM  (no auto-title, OpenLayers/Format/OSM.js)
+
+         Group: OWSCommon  {
+
+            File: v1  (OpenLayers/Format/OWSCommon/v1.js)
+            File: v1_0_0  (OpenLayers/Format/OWSCommon/v1_0_0.js)
+            File: v1_1_0  (OpenLayers/Format/OWSCommon/v1_1_0.js)
+            }  # Group: OWSCommon
+
+         File: OWSContext  (OpenLayers/Format/OWSContext.js)
+         File: OWSContext.v0_3_1  (OpenLayers/Format/OWSContext/v0_3_1.js)
+         File: SOSCapabilities  (OpenLayers/Format/SOSCapabilities.js)
+         File: SOSCapabilities.v1_0_0  (OpenLayers/Format/SOSCapabilities/v1_0_0.js)
+         File: SOSGetFeatureOfInterest  (OpenLayers/Format/SOSGetFeatureOfInterest.js)
+         File: SOSGetObservation  (OpenLayers/Format/SOSGetObservation.js)
+         File: Text  (no auto-title, OpenLayers/Format/Text.js)
+         File: WFS  (no auto-title, OpenLayers/Format/WFS.js)
+         File: WFSDescribeFeatureType  (no auto-title, OpenLayers/Format/WFSDescribeFeatureType.js)
+         File: WKT  (no auto-title, OpenLayers/Format/WKT.js)
+         File: WMSGetFeatureInfo  (no auto-title, OpenLayers/Format/WMSGetFeatureInfo.js)
+         File: WMTSCapabilities  (OpenLayers/Format/WMTSCapabilities.js)
+         File: WMTSCapabilities.v1_0_0  (OpenLayers/Format/WMTSCapabilities/v1_0_0.js)
+         File: XML  (no auto-title, OpenLayers/Format/XML.js)
+         }  # Group: Format
+
+      }  # Group: Format
+
+   Group: Geometry  {
+
+      File: Geometry  (no auto-title, OpenLayers/Geometry.js)
+      File: Collection  (no auto-title, OpenLayers/Geometry/Collection.js)
+      File: Curve  (no auto-title, OpenLayers/Geometry/Curve.js)
+      File: LinearRing  (no auto-title, OpenLayers/Geometry/LinearRing.js)
+      File: LineString  (no auto-title, OpenLayers/Geometry/LineString.js)
+      File: MultiLineString  (no auto-title, OpenLayers/Geometry/MultiLineString.js)
+      File: MultiPoint  (no auto-title, OpenLayers/Geometry/MultiPoint.js)
+      File: MultiPolygon  (no auto-title, OpenLayers/Geometry/MultiPolygon.js)
+      File: Point  (no auto-title, OpenLayers/Geometry/Point.js)
+      File: Polygon  (no auto-title, OpenLayers/Geometry/Polygon.js)
+      File: Rectangle  (no auto-title, OpenLayers/Geometry/Rectangle.js)
+      }  # Group: Geometry
+
+   Group: Handler  {
+
+      File: Handler  (no auto-title, OpenLayers/Handler.js)
+      File: Box  (no auto-title, OpenLayers/Handler/Box.js)
+      File: Click  (no auto-title, OpenLayers/Handler/Click.js)
+      File: Drag  (no auto-title, OpenLayers/Handler/Drag.js)
+      File: Feature  (no auto-title, OpenLayers/Handler/Feature.js)
+      File: Hover  (no auto-title, OpenLayers/Handler/Hover.js)
+      File: Keyboard  (no auto-title, OpenLayers/Handler/Keyboard.js)
+      File: MouseWheel  (no auto-title, OpenLayers/Handler/MouseWheel.js)
+      File: Path  (no auto-title, OpenLayers/Handler/Path.js)
+      File: Point  (no auto-title, OpenLayers/Handler/Point.js)
+      File: Polygon  (no auto-title, OpenLayers/Handler/Polygon.js)
+      File: RegularPolygon  (no auto-title, OpenLayers/Handler/RegularPolygon.js)
+      }  # Group: Handler
+
+   Group: Lang  {
+
+      File: Lang  (no auto-title, OpenLayers/Lang.js)
+      File: ar  (no auto-title, OpenLayers/Lang/ar.js)
+      File: be-tarask  (no auto-title, OpenLayers/Lang/be-tarask.js)
+      File: bg  (no auto-title, OpenLayers/Lang/bg.js)
+      File: br  (no auto-title, OpenLayers/Lang/br.js)
+      File: ca  (no auto-title, OpenLayers/Lang/ca.js)
+      File: cs-CZ  (no auto-title, OpenLayers/Lang/cs-CZ.js)
+      File: da-DK  (no auto-title, OpenLayers/Lang/da-DK.js)
+      File: de  (no auto-title, OpenLayers/Lang/de.js)
+      File: en  (no auto-title, OpenLayers/Lang/en.js)
+      File: en-CA  (no auto-title, OpenLayers/Lang/en-CA.js)
+      File: es  (no auto-title, OpenLayers/Lang/es.js)
+      File: el  (no auto-title, OpenLayers/Lang/el.js)
+      File: fi  (no auto-title, OpenLayers/Lang/fi.js)
+      File: fr  (no auto-title, OpenLayers/Lang/fr.js)
+      File: fur  (no auto-title, OpenLayers/Lang/fur.js)
+      File: gl  (no auto-title, OpenLayers/Lang/gl.js)
+      File: gsw  (no auto-title, OpenLayers/Lang/gsw.js)
+      File: hr  (no auto-title, OpenLayers/Lang/hr.js)
+      File: hsb  (no auto-title, OpenLayers/Lang/hsb.js)
+      File: hu  (no auto-title, OpenLayers/Lang/hu.js)
+      File: ia  (no auto-title, OpenLayers/Lang/ia.js)
+      File: id  (no auto-title, OpenLayers/Lang/id.js)
+      File: io  (no auto-title, OpenLayers/Lang/io.js)
+      File: is  (no auto-title, OpenLayers/Lang/is.js)
+      File: it  (no auto-title, OpenLayers/Lang/it.js)
+      File: ja  (no auto-title, OpenLayers/Lang/ja.js)
+      File: km  (no auto-title, OpenLayers/Lang/km.js)
+      File: ksh  (no auto-title, OpenLayers/Lang/ksh.js)
+      File: nds  (no auto-title, OpenLayers/Lang/nds.js)
+      File: nb  (no auto-title, OpenLayers/Lang/nb.js)
+      File: nl  (no auto-title, OpenLayers/Lang/nl.js)
+      File: nn  (no auto-title, OpenLayers/Lang/nn.js)
+      File: oc  (no auto-title, OpenLayers/Lang/oc.js)
+      File: pt  (no auto-title, OpenLayers/Lang/pt.js)
+      File: pt-BR  (no auto-title, OpenLayers/Lang/pt-BR.js)
+      File: ru  (no auto-title, OpenLayers/Lang/ru.js)
+      File: sk  (no auto-title, OpenLayers/Lang/sk.js)
+      File: sv-SE  (no auto-title, OpenLayers/Lang/sv-SE.js)
+      File: te  (no auto-title, OpenLayers/Lang/te.js)
+      File: vi  (no auto-title, OpenLayers/Lang/vi.js)
+      File: zh-CN  (no auto-title, OpenLayers/Lang/zh-CN.js)
+      File: zh-TW  (no auto-title, OpenLayers/Lang/zh-TW.js)
+      }  # Group: Lang
+
+   Group: Layer  {
+
+      File: Layer  (no auto-title, OpenLayers/Layer.js)
+
+      Group: Layer  {
+
+         File: ArcGIS93Rest  (no auto-title, OpenLayers/Layer/ArcGIS93Rest.js)
+         File: ArcIMS  (no auto-title, OpenLayers/Layer/ArcIMS.js)
+         File: Boxes  (no auto-title, OpenLayers/Layer/Boxes.js)
+         File: EventPane  (no auto-title, OpenLayers/Layer/EventPane.js)
+         File: FixedZoomLevels  (no auto-title, OpenLayers/Layer/FixedZoomLevels.js)
+         File: GeoRSS  (no auto-title, OpenLayers/Layer/GeoRSS.js)
+         File: GML  (no auto-title, OpenLayers/Layer/GML.js)
+         File: Google  (no auto-title, OpenLayers/Layer/Google.js)
+         File: Grid  (no auto-title, OpenLayers/Layer/Grid.js)
+         File: HTTPRequest  (no auto-title, OpenLayers/Layer/HTTPRequest.js)
+         File: Image  (no auto-title, OpenLayers/Layer/Image.js)
+         File: KaMap  (no auto-title, OpenLayers/Layer/KaMap.js)
+         File: KaMapCache  (no auto-title, OpenLayers/Layer/KaMapCache.js)
+         File: MapGuide  (no auto-title, OpenLayers/Layer/MapGuide.js)
+         File: MapServer  (no auto-title, OpenLayers/Layer/MapServer.js)
+         File: MapServer.Untiled  (no auto-title, OpenLayers/Layer/MapServer/Untiled.js)
+         File: Markers  (no auto-title, OpenLayers/Layer/Markers.js)
+         File: MultiMap  (no auto-title, OpenLayers/Layer/MultiMap.js)
+         File: PointTrack  (no auto-title, OpenLayers/Layer/PointTrack.js)
+         File: SphericalMercator  (no auto-title, OpenLayers/Layer/SphericalMercator.js)
+         File: Text  (no auto-title, OpenLayers/Layer/Text.js)
+         File: TileCache  (no auto-title, OpenLayers/Layer/TileCache.js)
+         File: TMS  (no auto-title, OpenLayers/Layer/TMS.js)
+         File: Vector  (no auto-title, OpenLayers/Layer/Vector.js)
+         File: Vector.RootContainer  (no auto-title, OpenLayers/Layer/Vector/RootContainer.js)
+         File: VirtualEarth  (no auto-title, OpenLayers/Layer/VirtualEarth.js)
+         File: WFS  (no auto-title, OpenLayers/Layer/WFS.js)
+         File: WMS  (no auto-title, OpenLayers/Layer/WMS.js)
+         File: WMS.Untiled  (no auto-title, OpenLayers/Layer/WMS/Untiled.js)
+         File: WMS.Post  (no auto-title, OpenLayers/Layer/WMS/Post.js)
+         File: WorldWind  (no auto-title, OpenLayers/Layer/WorldWind.js)
+         File: Yahoo  (no auto-title, OpenLayers/Layer/Yahoo.js)
+         File: XYZ  (no auto-title, OpenLayers/Layer/XYZ.js)
+         File: Google/v3.js  (OpenLayers/Layer/Google/v3.js)
+         File: WMTS  (OpenLayers/Layer/WMTS.js)
+         File: Zoomify  (OpenLayers/Layer/Zoomify.js)
+         }  # Group: Layer
+
+      }  # Group: Layer
+
+   Group: Marker  {
+
+      File: Marker  (no auto-title, OpenLayers/Marker.js)
+      File: Box  (no auto-title, OpenLayers/Marker/Box.js)
+      }  # Group: Marker
+
+   Group: Popup  {
+
+      File: Popup  (no auto-title, OpenLayers/Popup.js)
+      File: Anchored  (no auto-title, OpenLayers/Popup/Anchored.js)
+      File: AnchoredBubble  (no auto-title, OpenLayers/Popup/AnchoredBubble.js)
+      File: Framed  (no auto-title, OpenLayers/Popup/Framed.js)
+      File: FramedCloud  (no auto-title, OpenLayers/Popup/FramedCloud.js)
+      }  # Group: Popup
+
+   Group: Protocol  {
+
+      File: Protocol  (no auto-title, OpenLayers/Protocol.js)
+      File: HTTP  (no auto-title, OpenLayers/Protocol/HTTP.js)
+
+      Group: SQL  {
+
+         File: SQL  (no auto-title, OpenLayers/Protocol/SQL.js)
+         File: Gears  (no auto-title, OpenLayers/Protocol/SQL/Gears.js)
+         }  # Group: SQL
+
+      Group: WFS  {
+
+         File: WFS  (no auto-title, OpenLayers/Protocol/WFS.js)
+         File: v1  (no auto-title, OpenLayers/Protocol/WFS/v1.js)
+         File: v1_0_0  (no auto-title, OpenLayers/Protocol/WFS/v1_0_0.js)
+         File: v1_1_0  (no auto-title, OpenLayers/Protocol/WFS/v1_1_0.js)
+         }  # Group: WFS
+
+      File: Protocol/SOS.js  (OpenLayers/Protocol/SOS.js)
+      File: v1_0_0  (OpenLayers/Protocol/SOS/v1_0_0.js)
+      }  # Group: Protocol
+
+   Group: Renderer  {
+
+      File: Renderer  (no auto-title, OpenLayers/Renderer.js)
+      File: Canvas  (no auto-title, OpenLayers/Renderer/Canvas.js)
+      File: Elements  (no auto-title, OpenLayers/Renderer/Elements.js)
+      File: SVG  (no auto-title, OpenLayers/Renderer/SVG.js)
+      File: VML  (no auto-title, OpenLayers/Renderer/VML.js)
+      }  # Group: Renderer
+
+   Group: Request  {
+
+      File: Request  (no auto-title, OpenLayers/Request.js)
+      File: XMLHttpRequest  (no auto-title, OpenLayers/Request/XMLHttpRequest.js)
+      }  # Group: Request
+
+   Group: Strategy  {
+
+      File: Strategy  (no auto-title, OpenLayers/Strategy.js)
+
+      Group: Strategy  {
+
+         File: BBOX  (no auto-title, OpenLayers/Strategy/BBOX.js)
+         File: Cluster  (no auto-title, OpenLayers/Strategy/Cluster.js)
+         File: Filter  (OpenLayers/Strategy/Filter.js)
+         File: Fixed  (no auto-title, OpenLayers/Strategy/Fixed.js)
+         File: Paging  (no auto-title, OpenLayers/Strategy/Paging.js)
+         File: Refresh  (OpenLayers/Strategy/Refresh.js)
+         File: Save  (OpenLayers/Strategy/Save.js)
+         }  # Group: Strategy
+
+      }  # Group: Strategy
+
+   Group: Tile  {
+
+      File: Tile  (no auto-title, OpenLayers/Tile.js)
+      File: Image  (no auto-title, OpenLayers/Tile/Image.js)
+      File: WFS  (no auto-title, OpenLayers/Tile/WFS.js)
+      File: IFrame  (OpenLayers/Tile/Image/IFrame.js)
+      }  # Group: Tile
+
+   Group: OpenLayers  {
+
+      File: Ajax  (no auto-title, OpenLayers/Ajax.js)
+      File: Console  (no auto-title, OpenLayers/Console.js)
+      File: Events  (no auto-title, OpenLayers/Events.js)
+      File: Icon  (no auto-title, OpenLayers/Icon.js)
+      File: Map  (no auto-title, OpenLayers/Map.js)
+      File: Projection  (no auto-title, OpenLayers/Projection.js)
+      File: Rule  (no auto-title, OpenLayers/Rule.js)
+      File: Style  (no auto-title, OpenLayers/Style.js)
+      File: Style2  (OpenLayers/Style2.js)
+      File: StyleMap  (no auto-title, OpenLayers/StyleMap.js)
+      File: Symbolizer  (OpenLayers/Symbolizer.js)
+
+      Group: Symbolizer  {
+
+         File: Line  (OpenLayers/Symbolizer/Line.js)
+         File: Point  (OpenLayers/Symbolizer/Point.js)
+         File: Polygon  (OpenLayers/Symbolizer/Polygon.js)
+         File: Raster  (OpenLayers/Symbolizer/Raster.js)
+         File: Text  (OpenLayers/Symbolizer/Text.js)
+         }  # Group: Symbolizer
+
+      File: Tween  (no auto-title, OpenLayers/Tween.js)
+      File: Util  (no auto-title, OpenLayers/Util.js)
+      }  # Group: OpenLayers
+
+   }  # Group: OpenLayers
+
+Group: Index  {
+
+   Index: Everything
+   Class Index: Classes
+   Constant Index: Constants
+   Function Index: Functions
+   Property Index: Properties
+   File Index: Files
+   Constructor Index: Constructor
+   }  # Group: Index
+
diff --git a/doc_config/OL.css b/doc_config/OL.css
new file mode 100644
index 0000000..a397119
--- /dev/null
+++ b/doc_config/OL.css
@@ -0,0 +1,20 @@
+p {
+    text-indent: 0; margin-bottom: 1em;
+}
+
+.MGroup {
+    font-variant: normal;
+    margin: 0.4em 0 0em 10px
+}
+
+.MTitle {
+    font-variant: normal;
+}
+
+.CGroup .CTitle {
+    font-variant: normal;
+}
+
+.SGroup .SEntry {
+    font-variant: normal;
+}
\ No newline at end of file
diff --git a/doc_config/Topics.txt b/doc_config/Topics.txt
new file mode 100644
index 0000000..2823c71
--- /dev/null
+++ b/doc_config/Topics.txt
@@ -0,0 +1,102 @@
+Format: Development Release 12-07-2007 (1.35 base)
+
+# This is the Natural Docs topics file for this project.  If you change anything
+# here, it will apply to THIS PROJECT ONLY.  If you'd like to change something
+# for all your projects, edit the Topics.txt in Natural Docs' Config directory
+# instead.
+
+
+# If you'd like to prevent keywords from being recognized by Natural Docs, you
+# can do it like this:
+# Ignore Keywords: [keyword], [keyword], ...
+#
+# Or you can use the list syntax like how they are defined:
+# Ignore Keywords:
+#    [keyword]
+#    [keyword], [plural keyword]
+#    ...
+
+
+#-------------------------------------------------------------------------------
+# SYNTAX:
+#
+# Topic Type: [name]
+# Alter Topic Type: [name]
+#    Creates a new topic type or alters one from the main file.  Each type gets
+#    its own index and behavior settings.  Its name can have letters, numbers,
+#    spaces, and these charaters: - / . '
+#
+# Plural: [name]
+#    Sets the plural name of the topic type, if different.
+#
+# Keywords:
+#    [keyword]
+#    [keyword], [plural keyword]
+#    ...
+#    Defines or adds to the list of keywords for the topic type.  They may only
+#    contain letters, numbers, and spaces and are not case sensitive.  Plural
+#    keywords are used for list topics.  You can redefine keywords found in the
+#    main topics file.
+#
+# Index: [yes|no]
+#    Whether the topics get their own index.  Defaults to yes.  Everything is
+#    included in the general index regardless of this setting.
+#
+# Scope: [normal|start|end|always global]
+#    How the topics affects scope.  Defaults to normal.
+#    normal        - Topics stay within the current scope.
+#    start         - Topics start a new scope for all the topics beneath it,
+#                    like class topics.
+#    end           - Topics reset the scope back to global for all the topics
+#                    beneath it.
+#    always global - Topics are defined as global, but do not change the scope
+#                    for any other topics.
+#
+# Class Hierarchy: [yes|no]
+#    Whether the topics are part of the class hierarchy.  Defaults to no.
+#
+# Page Title If First: [yes|no]
+#    Whether the topic's title becomes the page title if it's the first one in
+#    a file.  Defaults to no.
+#
+# Break Lists: [yes|no]
+#    Whether list topics should be broken into individual topics in the output.
+#    Defaults to no.
+#
+# Can Group With: [type], [type], ...
+#    Defines a list of topic types that this one can possibly be grouped with.
+#    Defaults to none.
+#-------------------------------------------------------------------------------
+
+# The following topics are defined in the main file, if you'd like to alter
+# their behavior or add keywords:
+#
+#    Generic, Class, Interface, Section, File, Group, Function, Variable,
+#    Property, Type, Constant, Enumeration, Event, Delegate, Macro,
+#    Database, Database Table, Database View, Database Index, Database
+#    Cursor, Database Trigger, Cookie, Build Target
+
+# If you add something that you think would be useful to other developers
+# and should be included in Natural Docs by default, please e-mail it to
+# topics [at] naturaldocs [dot] org.
+
+
+Topic Type: Constructor
+
+   Class Hierarchy: Yes
+   Keywords:
+      constructor
+      initialize
+
+
+Alter Topic Type: Function
+
+   Add Keywords:
+      apimethod
+      apifunction
+
+
+Alter Topic Type: Property
+
+   Add Keywords:
+      apiproperty
diff --git a/examples/GMLParser.html b/examples/GMLParser.html
new file mode 100644
index 0000000..962b2ef
--- /dev/null
+++ b/examples/GMLParser.html
@@ -0,0 +1,43 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers GML Parser</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        function parseData(req) {
+          g =  new OpenLayers.Format.GML();
+          html = ""
+          features = g.read(req.responseText);
+          for(var feat in features) {
+            html += "Feature: Geometry: "+ features[feat].geometry+",";
+                html += "<ul>";
+            for (var j in features[feat].attributes) {
+                html += "<li>"+j+":"+features[feat].attributes[j]+"</li>";
+            }
+                html += "</ul>"
+          }
+          document.getElementById('output').innerHTML = html;
+        }
+        function load() {
+            OpenLayers.loadURL("gml/owls.xml", "", null, parseData);
+        }
+    </script>
+  </head>
+  <body onload="load()">
+      <h1 id="title">GML Parser Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+          Demonstrate the operation of the GML parser.
+      </p>
+
+      <div id="output"></div>
+
+      <div id="docs">
+          This script reads data from a GML file and parses out the coordinates, appending them to a HTML string with markup tags.
+          This markup is dumped to an element in the page.
+    </div>
+  </body>
+</html>
diff --git a/examples/Jugl.js b/examples/Jugl.js
new file mode 100644
index 0000000..38014ef
--- /dev/null
+++ b/examples/Jugl.js
@@ -0,0 +1,84 @@
+/**
+ * Jugl.js -- JavaScript Template Library
+ *
+ * Copyright 2007 Tim Schaub
+ * Released under the MIT license.  Please see
+ * http://svn.tschaub.net/jugl/trunk/license.txt for the full license.
+ */
+
+(function(){var Jugl={prefix:"jugl",namespaceURI:"http://namespace.jugl.org/"};Jugl.Array={indexOf:function(array,obj){for(var i=0;i<array.length;i++){if(array[i]==obj)return i;}
+return-1;}};Jugl.Function={bind:function(method,object){var args=[];for(var i=2;i<arguments.length;++i){args.push(arguments[i]);}
+return function(){for(var i=0;i<arguments.length;++i){args.push(arguments[i]);}
+return method.apply(object,args);}}};Jugl.Node={appendChild:function(parent,child){if(typeof(parent)=="string"){var obj=document.getElementById(parent);if(!obj){throw Error("Element id not found: "+parent);}
+parent=obj;}
+if(typeof(child)=="string"){var obj=document.getElementById(child);if(!obj){throw Error("Element id not found: "+child);}
+child=obj;}
+if(child.namespaceURI&&child.xml){var wrapper=document.createElement('div');wrapper.innerHTML=child.xml;var children=wrapper.childNodes;for(var i=0;i<children.length;++i){parent.appendChild(children[i]);}}else{if(parent.ownerDocument&&parent.ownerDocument.importNode){child=parent.ownerDocument.importNode(child,true);}
+parent.appendChild(child);}
+return child;}};Jugl.Object={extend:function(destination,source){destination=destination||{};source=source||{};for(property in source){destination[property]=source[property];}
+return destination;},applyDefaults:function(destination,source){destination=destination||{};source=source||{};for(property in source){if(destination[property]===undefined){destination[property]=source[property];}}
+return destination;}};Jugl.Request={loadTemplate:function(url,onComplete,caller){var createTemplate=function(request){var doc,template;try{doc=request.responseXML;template=new Jugl.Template(doc.documentElement);}catch(invalidXML){try{doc=document.createElement("div");doc.innerHTML=request.responseText;template=new Jugl.Template(doc.firstChild);}catch(invalidHTML){var msg="Can't make HTML out of response: "+
+request.responseText;Jugl.Console.error(msg);throw invalidHTML;}}
+var complete=Jugl.Function.bind(onComplete,caller);complete(template);}
+Jugl.Request.loadUrl(url,createTemplate);},loadUrl:function(url,onComplete,caller){var complete=(caller)?Jugl.Function.bind(onComplete,caller):onComplete;var request=Jugl.Request.createXMLHttpRequest();request.open("GET",url);request.onreadystatechange=function(){if(request.readyState==4){complete(request);}}
+request.send(null);},createXMLHttpRequest:function(){if(typeof XMLHttpRequest!="undefined"){return new XMLHttpRequest();}else if(typeof ActiveXObject!="undefined"){return new ActiveXObject("Microsoft.XMLHTTP");}else{throw new Error("XMLHttpRequest not supported");}}};Jugl.Class=function(){var Class=function(){if(this===Jugl){var msg="Create an instance of a Jugl "+"class with the new keyword";throw Error(msg);}
+this.initialize.apply(this,arguments);}
+var extended={toString:function(){return"["+this.CLASS_NAME+"]";}};var parent;for(var i=0;i<arguments.length;++i){if(typeof arguments[i]=="function"){parent=arguments[i].prototype;}else{parent=arguments[i];}
+Jugl.Object.extend(extended,parent);}
+Class.prototype=extended;return Class;};Jugl.Console={log:function(){},debug:function(){},info:function(){},warn:function(){},error:function(){},assert:function(){},dir:function(){},dirxml:function(){},trace:function(){},group:function(){},groupEnd:function(){},time:function(){},timeEnd:function(){},profile:function(){},profileEnd:function(){},count:function(){}};(function(){if(window.console){var scripts=document.getElementsByTagName("script");for(var i=0;i<scripts.length;++i){if(script [...]
+return items;},splitExpressionPrefix:function(){var items=this.splitAttributeValue();if(!items||(items[0]!='structure'&&items[0]!='text')){items=[null,this.nodeValue];}
+return items;},getAttributeValues:function(){var trimmed=this.nodeValue.replace(/[\t\n]/g,"").replace(/;\s*$/,"");var tabbed=trimmed.replace(/;;/g,"\t");var newlined=tabbed.split(";").join("\n");return newlined.replace(/\t/g,";").split(/\n/g);},removeSelf:function(){this.element.removeAttributeNode(this);},process:function(){return this.processAttribute[this.type].apply(this,[]);},evalInScope:function(str){var expression="with(this.element.scope){"+str+"}";return eval(expression);},proce [...]
+this.removeSelf();return true;},"condition":function(){var proceed;try{proceed=!!(this.evalInScope(this.nodeValue));}catch(err){var message=err.name+": "+err.message+"\n"+"attribute: "+this.nodeName;Jugl.Console.error(message);throw err;}
+this.removeSelf();if(!proceed){this.element.removeSelf();}
+return proceed;},"repeat":function(){var pair=this.splitAttributeValue();var key=pair[0];var list=this.evalInScope(pair[1]);this.removeSelf();if(!(list instanceof Array)){var items=new Array();for(var p in list){items.push(p);}
+list=items;}
+var element;var previousSibling=this.element;var length=list.length;for(var i=0;i<length;++i){element=this.element.clone();element.scope[key]=list[i];element.scope.repeat[key]={index:i,number:i+1,even:!(i%2),odd:!!(i%2),start:(i==0),end:(i==length-1),length:length};previousSibling.insertAfter(element);element.process();previousSibling=element;}
+this.element.removeSelf();return false;},"content":function(){var pair=this.splitExpressionPrefix();var str;try{str=this.evalInScope(pair[1]);}catch(err){Jugl.Console.error("Failed to eval in element scope: "+
+pair[1]);throw err;}
+this.removeSelf();if(pair[0]=='structure'){try{this.element.node.innerHTML=str;}catch(err){var wrapper=document.createElement('div');var msg;try{wrapper.innerHTML=str;}catch(invalidHTML){msg="Can't transform string into valid HTML : "+
+str;Jugl.Console.error(msg);throw invalidHTML;}
+if(this.element.node.xml&&this.template.xmldom){while(this.element.node.firstChild){this.element.node.removeChild(this.element.node.firstChild);}
+this.template.xmldom.loadXML(wrapper.outerHTML);var children=this.template.xmldom.firstChild.childNodes;try{for(var i=0;i<children.length;++i){this.element.node.appendChild(children[i]);}}catch(invalidXML){msg="Can't transform string into valid XHTML : "+
+str;Jugl.Console.error(msg);throw invalidXML;}}else{try{this.element.node.innerHTML=wrapper.innerHTML;}catch(invalidXML){msg="Can't transform string into valid XHTML : "+
+str;Jugl.Console.error(msg);throw invalidXML;}}}}else{var text;if(this.element.node.xml&&this.template.xmldom){text=this.template.xmldom.createTextNode(str);}else{text=document.createTextNode(str);}
+var child=new Jugl.Element(this.template,text);this.element.removeChildNodes();this.element.appendChild(child);}
+return true;},"replace":function(){var pair=this.splitExpressionPrefix();var str;try{str=this.evalInScope(pair[1]);}catch(err){Jugl.Console.error("Failed to eval in element scope: "+
+pair[1]);throw err;}
+this.removeSelf();if(pair[0]=='structure'){var wrapper=document.createElement('div');try{wrapper.innerHTML=str;}catch(err){msg="Can't transform string into valid HTML : "+
+str;Jugl.Console.error(msg);throw err;}
+if(this.element.node.xml&&this.template.xmldom){try{this.template.xmldom.loadXML(wrapper.outerHTML);}catch(err){msg="Can't transform string into valid XML : "+
+str;Jugl.Console.error(msg);throw err;}
+wrapper=this.template.xmldom.firstChild;}
+while(wrapper.firstChild){var child=wrapper.removeChild(wrapper.firstChild);if(this.element.node.ownerDocument&&this.element.node.ownerDocument.importNode){if(child.ownerDocument!=this.element.node.ownerDocument){child=this.element.node.ownerDocument.importNode(child,true);}}
+this.element.node.parentNode.insertBefore(child,this.element.node);}}else{var text;if(this.element.node.xml&&this.template.xmldom){text=this.template.xmldom.createTextNode(str);}else{text=document.createTextNode(str);}
+var replacement=new Jugl.Element(this.template,text);this.element.insertBefore(replacement);}
+this.element.removeSelf();return true;},"attributes":function(){var values=this.getAttributeValues();var pair,name,value;for(var i=0;i<values.length;++i){pair=this.splitAttributeValue(values[i]);name=pair[0];value=this.evalInScope(pair[1]);if(value!==false){this.element.setAttribute(name,value);}}
+this.removeSelf();return true;},"omit-tag":function(){var omit;try{omit=((this.nodeValue=="")||!!(this.evalInScope(this.nodeValue)));}catch(err){Jugl.Console.error("Failed to eval in element scope: "+
+this.nodeValue);throw err;}
+this.removeSelf();if(omit){var children=this.element.getChildNodes();var child;for(var i=0;i<children.length;++i){this.element.insertBefore(children[i]);}
+this.element.removeSelf();}},"reflow":function(){var reflow;try{reflow=((this.nodeValue=="")||!!(this.evalInScope(this.nodeValue)));}catch(err){Jugl.Console.error("Failed to eval in element scope: "+
+this.nodeValue);throw err;}
+this.removeSelf();if(reflow){if(this.element.node.outerHTML){this.element.node.outerHTML=this.element.node.outerHTML;}else{this.element.node.innerHTML=this.element.node.innerHTML;}}}},CLASS_NAME:"Jugl.Attribute"});Jugl.Element=Jugl.Class({template:null,node:null,scope:null,initialize:function(template,node){this.template=template;this.node=node;this.scope=new Object();this.scope.repeat=new Object();},clone:function(){var node=this.node.cloneNode(true);node.removeAttribute("id");var eleme [...]
+localName);}
+if(node&&!node.specified){node=false;}}
+var attribute;if(node){attribute=new Jugl.Attribute(this,node,localName);}else{attribute=node;}
+return attribute;},setAttribute:function(name,value){this.node.setAttribute(name,value);},removeAttributeNode:function(attribute){this.node.removeAttributeNode(attribute.node);},getChildNodes:function(){var numNodes=this.node.childNodes.length;var children=new Array(numNodes);var node,scope;for(var i=0;i<numNodes;++i){node=new Jugl.Element(this.template,this.node.childNodes[i]);node.scope=Jugl.Object.extend({},this.scope);children[i]=node;}
+return children;},removeChildNodes:function(){while(this.node.hasChildNodes()){this.node.removeChild(this.node.firstChild);}},removeChild:function(element){this.node.removeChild(element.node);return node;},removeSelf:function(){this.node.parentNode.removeChild(this.node);},importNode:function(element){if(this.node.ownerDocument&&this.node.ownerDocument.importNode){if(element.node.ownerDocument!=this.node.ownerDocument){element.node=this.node.ownerDocument.importNode(element.node,true);}} [...]
+series[i]+" attribute");throw err;}
+if(!keepProcessing){return;}}}
+var content=this.getAttribute("content");if(content){try{content.process();}catch(err){Jugl.Console.error("Failed to process content attribute");throw err;}}else{var replace=this.getAttribute("replace");if(replace){try{replace.process();}catch(err){Jugl.Console.error("Failed to process replace attribute");throw err;}}}
+var attributes=this.getAttribute("attributes");if(attributes){try{attributes.process();}catch(err){Jugl.Console.error("Failed to process attributes attribute");throw err;}}
+if(!content&&!replace){this.processChildNodes();}
+var omit=this.getAttribute("omit-tag");if(omit){try{omit.process();}catch(err){Jugl.Console.error("Failed to process omit-tag attribute");throw err;}}
+var reflow=this.getAttribute("reflow");if(reflow){try{reflow.process();}catch(err){Jugl.Console.error("Failed to process reflow attribute");throw err;}}},processChildNodes:function(){var children=this.getChildNodes();for(var i=0;i<children.length;++i){try{children[i].process();}catch(err){Jugl.Console.error("Failed to process child node: "+i);throw err;}}},CLASS_NAME:"Jugl.Element"});Jugl.Template=Jugl.Class({node:null,usingNS:false,xhtmlns:"http://www.w3.org/1999/xhtml",xmldom:window.Ac [...]
+config=config||{};if(typeof(config.node)=="string"){config.node=document.getElementById(config.node);if(!config.node){throw Error("Element id not found: "+config.node);}}
+if(config.node){this.node=config.node;this.loaded=true;}else if(config.url){this.load({url:config.url,callback:config.callback,scope:config.scope});}},process:function(config){if(config&&!config.context&&!config.clone&&!config.string&&!config.parent){config={context:config}}
+config=Jugl.Object.applyDefaults(config,{context:null,clone:false,string:false});if(this.node.getAttributeNodeNS){if(this.node.getAttributeNodeNS(Jugl.xhtmlns,Jugl.prefix)){this.usingNS=true;}}
+var element=new Jugl.Element(this,this.node);if(config.clone){element=element.clone();}
+if(config.context){element.scope=config.context;}
+try{element.process();}catch(err){Jugl.Console.error("Failed to process "+
+this.node.nodeName+" node");throw err;}
+var data;if(config.string){if(element.node.innerHTML){data=element.node.innerHTML;}else{if(this.xmldom){data=element.node.xml;}else{var serializer=new XMLSerializer();data=serializer.serializeToString(element.node);}}}else{data=element.node;if(config.parent){if(config.clone){data=Jugl.Node.appendChild(config.parent,element.node);}else{this.appendTo(config.parent);}}}
+return data;},load:function(config){if(typeof config=="string"){config={url:config};}
+config=config||{};this.loading=true;var setNode=function(template){this.node=template.node;this.loading=false;this.loaded=true;if(config.callback){config.callback.apply(config.scope,[template]);}}
+Jugl.Request.loadTemplate(config.url,setNode,this);},appendTo:function(parent){this.node=Jugl.Node.appendChild(parent,this.node);return this;},CLASS_NAME:"Jugl.Template"});window["http://jugl.tschaub.net/trunk/lib/Jugl.js"]=Jugl;})();
\ No newline at end of file
diff --git a/examples/KMLParser.html b/examples/KMLParser.html
new file mode 100644
index 0000000..068c087
--- /dev/null
+++ b/examples/KMLParser.html
@@ -0,0 +1,47 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers KML Parser Example</title>
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        function parseData(req) {
+          g =  new OpenLayers.Format.KML({extractStyles: true});
+          html = ""
+          features = g.read(req.responseText);
+          for(var feat in features) {
+            html += "Feature: Geometry: "+ features[feat].geometry+",";
+                html += "<ul>";
+            for (var j in features[feat].attributes) {
+                html += "<li>Attribute "+j+":"+features[feat].attributes[j]+"</li>";
+            }
+                html += "</ul>"
+                html += "<ul>";
+            for (var j in features[feat].style) {
+                html += "<li>Style "+j+":"+features[feat].style[j]+"</li>";
+            }
+                html += "</ul>"
+          }
+          document.getElementById('output').innerHTML = html;
+        }
+        function load() {
+            OpenLayers.loadURL("kml/lines.kml", "", null, parseData);
+        }
+    </script>
+  </head>
+  <body onload="load()">
+      <h1 id="title">KML Parser Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+          Demonstrate the operation of the KML parser.
+      </p>
+
+      <div id="output"></div>
+
+      <div id="docs">
+          This script reads data from a KML file and parses out the coordinates, appending them to a HTML string with markup tags.
+          This markup is dumped to an element in the page.
+    </div>
+  </body>
+</html>
diff --git a/examples/SLDSelect.html b/examples/SLDSelect.html
new file mode 100644
index 0000000..470adee
--- /dev/null
+++ b/examples/SLDSelect.html
@@ -0,0 +1,196 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers SLD based selection control</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .olControlSLDSelectBoxActive {
+            cursor: crosshair;
+        }
+        .olControlSLDSelectPolygonActive {
+            cursor: crosshair;
+        }
+        .olControlSLDSelectLineActive {
+            cursor: crosshair;
+        }
+        .olControlSLDSelectPointActive {
+            cursor: pointer;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, controls, layers;
+
+        function init(){
+            OpenLayers.ProxyHost= "proxy.cgi?url=";
+            map = new OpenLayers.Map('map', {allOverlays: true, controls: []});
+            var url = "http://demo.opengeo.org/geoserver/wms";
+            layers = {
+                states: new OpenLayers.Layer.WMS("State boundary", url,
+                    {layers: 'topp:tasmania_state_boundaries', format: 'image/gif', transparent: 'TRUE'},
+                    {singleTile: true}),
+                roads: new OpenLayers.Layer.WMS("Roads", url,
+                    {layers: 'topp:tasmania_roads', format: 'image/gif', transparent: 'TRUE'},
+                    {singleTile: true}),
+                waterbodies: new OpenLayers.Layer.WMS("Water bodies", url,
+                    {layers: 'topp:tasmania_water_bodies', format: 'image/gif', transparent: 'TRUE'},
+                    {singleTile: true}),
+                cities: new OpenLayers.Layer.WMS("Cities", url,
+                    {layers: 'topp:tasmania_cities', format: 'image/gif', transparent: 'TRUE'},
+                    {singleTile: true})
+            };
+
+            for (var key in layers) {
+                map.addLayer(layers[key]);
+            }
+
+            map.setCenter(new OpenLayers.LonLat(146.65748632815,-42.230763671875), 7);
+
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+
+            controls = {
+                navigation: new OpenLayers.Control.Navigation(),
+                box: new OpenLayers.Control.SLDSelect(
+                    OpenLayers.Handler.RegularPolygon,
+                    {
+                        displayClass: 'olControlSLDSelectBox', 
+                        layers: [layers['waterbodies']],
+                        handlerOptions: {irregular: true}
+                    }
+                ),
+                polygon: new OpenLayers.Control.SLDSelect(
+                    OpenLayers.Handler.Polygon,
+                    {
+                        displayClass: 'olControlSLDSelectPolygon',
+                        layers: [layers['waterbodies']]
+                    }
+                ),
+                line: new OpenLayers.Control.SLDSelect(
+                    OpenLayers.Handler.Path,
+                    {
+                        displayClass: 'olControlSLDSelectLine',
+                        layers: [layers['waterbodies']]
+                    }
+                ),
+                point: new OpenLayers.Control.SLDSelect(
+                    OpenLayers.Handler.Click,
+                    {
+                        displayClass: 'olControlSLDSelectPoint',
+                        layers: [layers['waterbodies']]
+                    }
+                ),
+                circle: new OpenLayers.Control.SLDSelect(
+                    OpenLayers.Handler.RegularPolygon,
+                    {
+                        displayClass: 'olControlSLDSelectBox',
+                        layers: [layers['waterbodies']],
+                        handlerOptions: {sides: 30}
+                    }
+                )
+            };
+
+            for(var key in controls) {
+                map.addControl(controls[key]);
+            }
+        }
+
+        function toggleControl(element) {
+            for(var key in controls) {
+                var control = controls[key];
+                if(element.value == key && element.checked) {
+                    control.activate();
+                } else {
+                    control.deactivate();
+                }
+            }
+        }
+
+        function toggleSelectionLayer(element) {
+            var selectLayers = [];
+            var elements = element.value.split("_");
+            for (var key in layers) {
+                var layer = layers[key];
+                for (var i=0, len=elements.length; i<len; i++) {
+                    var value = elements[i];
+                    if (value == key && element.checked) {
+                        selectLayers.push(layer);
+                    }
+                }
+            }
+            for (var i=0, len=this.map.controls.length; i<len; i++) {
+                var control = this.map.controls[i];
+                if (control instanceof OpenLayers.Control.SLDSelect) {
+                    control.setLayers(selectLayers);
+                }
+            }
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">SLD based selection on WMS layers</h1>
+
+    <div id="tags"></div>
+
+    <div id="shortdesc">Using Styled Layer Descriptors to make a selection on WMS layers</div>
+
+    <div id="map" style="width: 512; height: 256; border: 1px solid red;"></div>
+
+    <div id="docs">
+        This example uses the OpenLayers.Control.SLDSelect to select features in a WMS
+        layer. The features are highlighted using Styled Layer Descriptors (SLD). The
+        control supports point, box, line and polygon selection modes by configuring the
+        appriopriate handler.
+    </div>
+
+    <div id="controls">
+        <ul id="controlToggle"><b>Map Controls</b>
+            <li>
+                <input type="radio" name="control" value="navigation" id="noneToggle" onclick="toggleControl(this);" CHECKED>
+                <label for="noneToggle">navigate</label>
+            </li>
+            <li>
+                <input type="radio" name="control" value="box" id="boxToggle" onclick="toggleControl(this);">
+                <label for="boxToggle">SLD select with box</label>
+            </li>
+            <li>
+                <input type="radio" name="control" value="polygon" id="polygonToggle" onclick="toggleControl(this);">
+                <label for="polygonToggle">SLD select with polygon</label>
+            </li>
+            <li>
+                <input type="radio" name="control" value="line" id="lineToggle" onclick="toggleControl(this);">
+                <label for="lineToggle">SLD select with line</label>
+            </li>
+            <li>
+                <input type="radio" name="control" value="point" id="pointToggle" onclick="toggleControl(this);">
+                <label for="pointToggle">SLD select with point</label>
+            </li>
+            <li>
+                <input type="radio" name="control" value="circle" id="circleToggle" onclick="toggleControl(this);">
+                <label for="circleToggle">SLD select with circle</label>
+            </li>
+        </ul>
+    </div>
+    <div id="layers">
+        <ul id="layerToggle"><b>Selection layer</b>
+            <li>
+                <input type="radio" name="layer" value="waterbodies" id="waterbodiesToggle" onclick="toggleSelectionLayer(this);" CHECKED>
+                <label for="noneToggle">Water bodies</label>
+            </li>
+            <li>
+                <input type="radio" name="layer" value="cities" id="citiesToggle" onclick="toggleSelectionLayer(this);">
+                <label for="citiesToggle">Cities</label>
+            </li>
+            <li>
+                <input type="radio" name="layer" value="roads" id="roadsToggle" onclick="toggleSelectionLayer(this);">
+                <label for="roadsToggle">Roads</label>
+            </li>
+            <li>
+                <input type="radio" name="layer" value="roads_cities" id="roadsCitiesToggle" onclick="toggleSelectionLayer(this);">
+                <label for="roadsCitiesToggle">Roads and cities</label>
+            </li>
+        </ul>
+    </div>
+
+  </body>
+</html>
diff --git a/examples/WMSDescribeLayerParser.html b/examples/WMSDescribeLayerParser.html
new file mode 100644
index 0000000..1ef78c3
--- /dev/null
+++ b/examples/WMSDescribeLayerParser.html
@@ -0,0 +1,41 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers WMSDescribeLayer Parser Example</title>
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        function parseData(req) {
+          format =  new OpenLayers.Format.WMSDescribeLayer();
+          html = "<br />"
+          resp = format.read(req.responseText);
+          for(var i = 0; i < resp.length; i++) {
+            html += "Layer: typeName: "+ resp[i].typeName+",";
+                html += "<ul>";
+                html += "<li>owsURL: "+resp[i].owsURL+"</li>";
+                html += "<li>owsType: "+resp[i].owsType+"</li>";
+                html += "</ul>"
+          }
+          document.getElementById('output').innerHTML = html;
+        }
+        function load() {
+            OpenLayers.loadURL("xml/wmsdescribelayer.xml", "", null, parseData);
+        }
+    </script>
+  </head>
+  <body onload="load()">
+      <h1 id="title">WMSDescribeLayer Parser Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+          Demonstrate the operation of the WMSDescribeLayer parser.
+      </p>
+
+      <div id="output"></div>
+
+      <div id="docs">
+          This script reads data from a file and parses out the coordinates, appending them to a HTML string with markup tags.
+          This markup is dumped to an element in the page.
+    </div>
+  </body>
+</html>
diff --git a/examples/WMSPost.html b/examples/WMSPost.html
new file mode 100644
index 0000000..2379598
--- /dev/null
+++ b/examples/WMSPost.html
@@ -0,0 +1,175 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Basic WMS Example via HTTP-POST protocol</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init(){
+            var sld = '<StyledLayerDescriptor version="1.0.0">';
+                sld+= '<NamedLayer>';
+                sld+= '<Name>topp:tasmania_roads</Name>';
+                sld+= '<UserStyle>';
+                sld+= '<IsDefault>1</IsDefault>';
+                sld+= '<FeatureTypeStyle>';
+                sld+= '<Rule>';
+                sld+= '<LineSymbolizer>';
+                sld+= '<Stroke>';
+                sld+= '<CssParameter name="stroke">';
+                sld+= '<Literal>#787878</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '<CssParameter name="stroke-width">';
+                sld+= '<Literal>2</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '</Stroke>';
+                sld+= '</LineSymbolizer>';
+                sld+= '</Rule>';
+                sld+= '</FeatureTypeStyle>';
+                sld+= '</UserStyle>';
+                sld+= '</NamedLayer>';
+
+                sld+= '<NamedLayer>';
+                sld+= '<Name>topp:tasmania_water_bodies</Name>';
+                sld+= '<UserStyle>';
+                sld+= '<IsDefault>1</IsDefault>';
+                sld+= '<FeatureTypeStyle>';
+                sld+= '<Rule>';
+                sld+= '<LineSymbolizer>';
+                sld+= '<Stroke>';
+                sld+= '<CssParameter name="stroke">';
+                sld+= '<Literal>#4F94CD</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '<CssParameter name="stroke-width">';
+                sld+= '<Literal>3</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '</Stroke>';
+                sld+= '</LineSymbolizer>';
+                sld+= '<PolygonSymbolizer>';
+                sld+= '<Fill>';
+                sld+= '<CssParameter name="fill">';
+                sld+= '<Literal>#63B8FF</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '</Fill>';
+                sld+= '</PolygonSymbolizer>';
+                sld+= '</Rule>';
+                sld+= '</FeatureTypeStyle>';
+                sld+= '</UserStyle>';
+                sld+= '</NamedLayer>';
+
+                sld+= '<NamedLayer>';
+                sld+= '<Name>topp:tasmania_cities</Name>';
+                sld+= '<UserStyle>';
+                sld+= '<IsDefault>1</IsDefault>';
+                sld+= '<FeatureTypeStyle>';
+                sld+= '<Rule>';
+                sld+= '<PointSymbolizer>';
+                sld+= '<Graphic>';
+                sld+= '<Mark>';
+                sld+= '<WellKnownName>cross</WellKnownName>';
+                sld+= '<Fill>';
+                sld+= '<CssParameter name="fill">';
+                sld+= '<Literal>#00FF00</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '</Fill>';
+                sld+= '</Mark>';
+                sld+= '<Size>15</Size>';
+                sld+= '</Graphic>';
+                sld+= '</PointSymbolizer>';
+                sld+= '<TextSymbolizer>';
+                sld+= '<Label><PropertyName>CITY_NAME</PropertyName></Label>';
+                sld+= '<Font>';
+                sld+= '<SvgParameter name="font-size">15</SvgParameter>';
+                sld+= '</Font>';
+                sld+= '</TextSymbolizer>';
+                sld+= '</Rule>';
+                sld+= '</FeatureTypeStyle>';
+                sld+= '</UserStyle>';
+                sld+= '</NamedLayer>';
+
+                sld+= '<NamedLayer>';
+                sld+= '<Name>topp:tasmania_state_boundaries</Name>';
+                sld+= '<UserStyle>';
+                sld+= '<IsDefault>1</IsDefault>';
+                sld+= '<FeatureTypeStyle>';
+                sld+= '<Rule>';
+                sld+= '<PolygonSymbolizer>';
+                sld+= '<Fill>';
+                sld+= '<CssParameter name="fill">';
+                sld+= '<Literal>#8B8989</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '<CssParameter name="fill-opacity">';
+                sld+= '<Literal>0.2</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '</Fill>';
+                sld+= '<Stroke>';
+                sld+= '<CssParameter name="stroke">';
+                sld+= '<Literal>#FF4040</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '<CssParameter name="stroke-width">';
+                sld+= '<Literal>2</Literal>';
+                sld+= '</CssParameter>';
+                sld+= '</Stroke>';
+                sld+= '</PolygonSymbolizer>';
+                sld+= '</Rule>';
+                sld+= '</FeatureTypeStyle>';
+                sld+= '</UserStyle>';
+                sld+= '</NamedLayer>';
+
+                sld+= '</StyledLayerDescriptor>';
+
+            map = new OpenLayers.Map('map');
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+
+            var layer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {
+                    layers: 'basic'
+                }
+            );
+
+            var rcbw = new OpenLayers.Layer.WMS.Post("Roads, Cities, Boundaries, Water",
+                "http://demo.opengeo.org/geoserver/wms", 
+                {
+                    'layers': 'topp:tasmania_roads,topp:tasmania_water_bodies,topp:tasmania_state_boundaries,topp:tasmania_cities',
+                    transparent: true,
+                    format: 'image/jpeg',
+                    sld_body: sld
+                },
+                {
+                    isBaseLayer: false,
+                    unsupportedBrowsers: []
+                }
+            );
+            map.addLayers([layer, rcbw]);
+            map.setCenter(new OpenLayers.LonLat(146.65748632815,-42.230763671875), 7);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Basic WMS Example via HTTP-POST protocol with a large SLD
+    included</h1>
+
+    <div id="tags"></div>
+
+    <div id="shortdesc">Creating a WMS layer with a large SLD in the sld_body</div>
+
+    <div id="map" style="width: 512; height: 256; border: 1px solid red;"></div>
+
+    <div id="docs">
+        This example uses a large SLD created on the client side to style a WMS
+        layer.  This example uses a WMS.Post layer which transfers data via the
+        HTTP-POST protocol. <br>
+        NOTE: Opera is not able to display transparent tiles with this layer,
+        and in some Firefox browsers can appear ugly viewport-shaking effects
+        while dragging arround. Use the 'unsupportedBrowsers' property to
+        control which browsers should use plain image tiles (like Layer.WMS)
+        instead. The default setting (["mozilla", "firefox", "opera"])
+        excludes problematic browsers without removing the ability to use long
+        request parameters, because all these browsers support long urls via
+        GET.
+    </div>
+  </body>
+</html>
diff --git a/examples/accessible.html b/examples/accessible.html
new file mode 100644
index 0000000..8e8e85c
--- /dev/null
+++ b/examples/accessible.html
@@ -0,0 +1,139 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Accessible Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            table {
+                border: 1 px solid white;
+                padding: 0;
+            }
+            td {
+                text-align: center;
+            }
+            a {
+                text-decoration: none;
+                font-size: 1.2em;
+            }
+            a em {
+                font-style: normal;
+                font-weight: normal;
+                text-decoration: underline;
+            }
+            a:hover {
+                text-decoration: underline;
+            }
+            a.api {
+                font-size:1em;
+                text-decoration:underline;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map = null;
+            function init(){
+                var options = {
+                    controls: [new OpenLayers.Control.KeyboardDefaults()]
+                };
+                map = new OpenLayers.Map('map', options);
+                var wms = new OpenLayers.Layer.WMS(
+                    "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0?",
+                    {layers: 'basic'}
+                );
+                map.addLayer(wms);
+                map.zoomToMaxExtent();
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Accessible Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Demonstrate how to use the KeyboardDefaults option parameter for layer types.
+        </p>
+
+        <table>
+            <tbody>
+                <tr>
+                    <td>
+                        <a href="javascript: void map.zoomOut();"
+                           accesskey="o">
+                            zoom <em>o</em>ut
+                        </a>
+                    </td>
+                    <td>
+                        <a href="javascript: void map.pan(0, -map.getSize().h / 4);"
+                           accesskey="n">
+                            pan <em>n</em>orth
+                        </a>
+                    </td>
+                    <td>
+                        <a href="javascript: void map.zoomIn();"
+                           accesskey="i">
+                            zoom <em>i</em>n
+                        </a>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <a href="javascript: void map.pan(-map.getSize().w / 4, 0);"
+                           accesskey="w">
+                            pan <em>w</em>est
+                        </a>
+                    </td>
+                    <td id="map" class="smallmap"></td>
+                    <td>
+                        <a href="javascript: void map.pan(map.getSize().w / 4, 0);"
+                           accesskey="e">
+                            pan <em>e</em>ast
+                        </a>
+                    </td>
+                </tr>
+                <tr>
+                    <td> </td>
+                    <td>
+                        <a href="javascript: void map.pan(0, map.getSize().h / 4);"
+                           accesskey="s">
+                            pan <em>s</em>outh
+                        </a>
+                    </td>
+                    <td> </td>
+                </tr>
+            </tbody>
+        </table>
+
+        <div id="docs">
+            <p>Navigate the map in one of three ways:
+                <ul>
+                    <li>Click on the named links to zoom and pan</li>
+                    <li>Use following keys to pan and zoom:
+                        <ul>
+                            <li>+ (zoom in)</li>
+                            <li>- (zoom out)</li>
+                            <li>up-arrow (pan north)</li>
+                            <li>down-arrow (pan south)</li>
+                            <li>left-arrow (pan east)</li>
+                            <li>right-arrow (pan west)</li>
+                        </ul>
+                    </li>
+                    <li>If access keys work for links in your browser, use:
+                        <ul>
+                            <li>i (zoom in)</li>
+                            <li>o (zoom out)</li>
+                            <li>n (pan north)</li>
+                            <li>s (pan south)</li>
+                            <li>e (pan east)</li>
+                            <li>w (pan west)</li>
+                        </ul>
+                    </li>
+                </ul>
+            </p>
+
+            This is an example of using alternate methods to control panning and zooming.  This approach uses map.pan() and map.zoom().  You'll note that to pan, additional math is necessary along with map.size() in order to set the distance to pan.
+        </div>
+    </body>
+</html>
diff --git a/examples/all-overlays-google.html b/examples/all-overlays-google.html
new file mode 100644
index 0000000..cc3e2da
--- /dev/null
+++ b/examples/all-overlays-google.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers All Overlays with Google and OSM</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+        <link rel="stylesheet" href="../theme/default/google.css" type="text/css">
+        <link rel="stylesheet" href="style.css" type="text/css">
+        <script src="http://maps.google.com/maps/api/js?sensor=false"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="all-overlays-google.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">All Overlays with Google and OSM</h1>
+        <p id="shortdesc">
+            Using the Google and OSM layers as overlays.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                Using the allOverlays property on the map, the first layer added
+                must initially be visible.  This example demonstrates the use of 
+                a Google layer and an OSM layer treated as overlays.
+            </p><p>
+                See the <a href="all-overlays-google.js" target="_blank">
+                all-overlays-google.js source</a> to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/all-overlays-google.js b/examples/all-overlays-google.js
new file mode 100644
index 0000000..f26d3fc
--- /dev/null
+++ b/examples/all-overlays-google.js
@@ -0,0 +1,19 @@
+var map;
+
+function init() {
+
+    map = new OpenLayers.Map({
+        div: "map",
+        allOverlays: true
+    });
+
+    var osm = new OpenLayers.Layer.OSM();
+    var gmap = new OpenLayers.Layer.Google("Google Streets", {visibility: false});
+
+    // note that first layer must be visible
+    map.addLayers([osm, gmap]);
+
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    map.zoomToMaxExtent();
+
+}
diff --git a/examples/all-overlays.html b/examples/all-overlays.html
new file mode 100644
index 0000000..7850f05
--- /dev/null
+++ b/examples/all-overlays.html
@@ -0,0 +1,69 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>All Overlays Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map;
+            function init() {
+                map = new OpenLayers.Map({
+                    div: "map",
+                    allOverlays: true,
+                    maxExtent: new OpenLayers.Bounds(
+                        1549471.9221, 6403610.94, 1550001.32545, 6404015.8
+                    )
+                });
+
+                // give the features some style
+                var styles = new OpenLayers.StyleMap({
+                    "default": {
+                        strokeWidth: 2
+                    },
+                    "select": {
+                        strokeColor: "#0099cc",
+                        strokeWidth: 4
+                    }
+                });
+            
+                // add rules from the above lookup table
+                styles.addUniqueValueRules("default", "RP_TYPE", {
+                    10: {strokeColor: "#000000", strokeWidth: 2},
+                    12: {strokeColor: "#222222", strokeWidth: 2},
+                    14: {strokeColor: "#444444", strokeWidth: 2},
+                    16: {strokeColor: "#666666", strokeWidth: 2},
+                    18: {strokeColor: "#888888", strokeWidth: 2},
+                    19: {strokeColor: "#666666", strokeWidth: 1}
+                });
+
+                var vectors = new OpenLayers.Layer.Vector("Lines", {
+                    strategies: [new OpenLayers.Strategy.Fixed()],                
+                    protocol: new OpenLayers.Protocol.HTTP({
+                        url: "data/roads.json",
+                        format: new OpenLayers.Format.GeoJSON()
+                    }),
+                    styleMap: styles
+                });
+            
+                map.addLayer(vectors);
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                map.zoomToMaxExtent();
+
+            }            
+
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">OpenLayers Overlays Only Example</h1>
+        <p id="shortdesc">
+            Demonstrates a map with overlays only.
+        </p>
+        <div id="map" class="smallmap"></div>    
+        <div id="docs">
+            To create a map that allows any draw order with all layer types
+            and lets you set the visibility of any layer independently, set
+            the allOverlays property on the map to true.
+        </div>
+    </body>
+</html>
diff --git a/examples/animated_panning.html b/examples/animated_panning.html
new file mode 100644
index 0000000..65e6a0b
--- /dev/null
+++ b/examples/animated_panning.html
@@ -0,0 +1,92 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Animated Panning of the Map via map.panTo</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer, running = false;
+
+        OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
+            defaultHandlerOptions: {
+                'single': true,
+                'delay': 200
+            },
+
+            initialize: function(options) {
+                this.handlerOptions = OpenLayers.Util.extend(
+                    {}, this.defaultHandlerOptions
+                );
+                OpenLayers.Control.prototype.initialize.apply(
+                    this, arguments
+                ); 
+                this.handler = new OpenLayers.Handler.Click(
+                    this, {
+                        'click': this.onClick 
+                    }, this.handlerOptions
+                );
+            }, 
+
+            onClick: function(evt) {  
+                map.panTo(map.getLonLatFromPixel(evt.xy));
+            }   
+
+        });
+
+        function init(){
+            map = new OpenLayers.Map('map', {numZoomLevels: 2});
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+                
+            map.addLayer(layer);
+            map.zoomToMaxExtent();
+            var click = new OpenLayers.Control.Click();
+            map.addControl(click);
+            click.activate();
+            map.addControl(new OpenLayers.Control.OverviewMap());
+
+            map2 = new OpenLayers.Map('map2', {'panMethod': null, numZoomLevels: 2} );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+                
+            map2.addLayer(layer);
+            map2.zoomToMaxExtent();
+        }
+
+        function setCenterInterval() {
+            if (!running) {
+                setCenter();
+                running = setInterval('setCenter()', 500);
+            } else {
+                clearInterval(running);
+                running = false;
+            }    
+        }
+        
+        function setCenter() {
+            var lon = Math.random() * 360 - 180;
+            var lat = Math.random() * 180 - 90;
+            var lonlat = new OpenLayers.LonLat(lon, lat);
+            map.panTo(lonlat);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">map.panTo Example</h1>
+    <div id="tags">map.panTo</div>
+    <div id="shortdesc">Show animated panning effects in the map</div>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+        <p>This is an example of transition effects. If the new random center is in the current extent, the map will pan smoothly. <br />
+        The random selection will continue until you press it again. Additionally, you can single click in the map to pan smoothly
+        to that area, or use the pan control to pan smoothly.
+        </p>
+    </div>
+    <button onclick="setCenterInterval()">Start/stop random recenter</button>
+    <div id="map2" class="smallmap"></div>
+    <div>    
+    <p>To turn off Animated Panning, create a map with an panMethod set to
+        null. </p>
+    </div>
+  </body>
+</html>
diff --git a/examples/animator.js b/examples/animator.js
new file mode 100644
index 0000000..abe5403
--- /dev/null
+++ b/examples/animator.js
@@ -0,0 +1,670 @@
+/*  
+	Animator.js 1.1.9
+	
+	This library is released under the BSD license:
+
+	Copyright (c) 2006, Bernard Sumption. All rights reserved.
+	
+	Redistribution and use in source and binary forms, with or without
+	modification, are permitted provided that the following conditions are met:
+	
+	Redistributions of source code must retain the above copyright notice, this
+	list of conditions and the following disclaimer. Redistributions in binary
+	form must reproduce the above copyright notice, this list of conditions and
+	the following disclaimer in the documentation and/or other materials
+	provided with the distribution. Neither the name BernieCode nor
+	the names of its contributors may be used to endorse or promote products
+	derived from this software without specific prior written permission. 
+	
+	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+	AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+	IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+	ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+	ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+	DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+	SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+	CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+	LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+	OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+	DAMAGE.
+
+*/
+
+
+// Applies a sequence of numbers between 0 and 1 to a number of subjects
+// construct - see setOptions for parameters
+function Animator(options) {
+	this.setOptions(options);
+	var _this = this;
+	this.timerDelegate = function(){_this.onTimerEvent()};
+	this.subjects = [];
+	this.target = 0;
+	this.state = 0;
+	this.lastTime = null;
+};
+Animator.prototype = {
+	// apply defaults
+	setOptions: function(options) {
+		this.options = Animator.applyDefaults({
+			interval: 20,  // time between animation frames
+			duration: 400, // length of animation
+			onComplete: function(){},
+			onStep: function(){},
+			transition: Animator.tx.easeInOut
+		}, options);
+	},
+	// animate from the current state to provided value
+	seekTo: function(to) {
+		this.seekFromTo(this.state, to);
+	},
+	// animate from the current state to provided value
+	seekFromTo: function(from, to) {
+		this.target = Math.max(0, Math.min(1, to));
+		this.state = Math.max(0, Math.min(1, from));
+		this.lastTime = new Date().getTime();
+		if (!this.intervalId) {
+			this.intervalId = window.setInterval(this.timerDelegate, this.options.interval);
+		}
+	},
+	// animate from the current state to provided value
+	jumpTo: function(to) {
+		this.target = this.state = Math.max(0, Math.min(1, to));
+		this.propagate();
+	},
+	// seek to the opposite of the current target
+	toggle: function() {
+		this.seekTo(1 - this.target);
+	},
+	// add a function or an object with a method setState(state) that will be called with a number
+	// between 0 and 1 on each frame of the animation
+	addSubject: function(subject) {
+		this.subjects[this.subjects.length] = subject;
+		return this;
+	},
+	// remove all subjects
+	clearSubjects: function() {
+		this.subjects = [];
+	},
+	// forward the current state to the animation subjects
+	propagate: function() {
+		var value = this.options.transition(this.state);
+		for (var i=0; i<this.subjects.length; i++) {
+			if (this.subjects[i].setState) {
+				this.subjects[i].setState(value);
+			} else {
+				this.subjects[i](value);
+			}
+		}
+	},
+	// called once per frame to update the current state
+	onTimerEvent: function() {
+		var now = new Date().getTime();
+		var timePassed = now - this.lastTime;
+		this.lastTime = now;
+		var movement = (timePassed / this.options.duration) * (this.state < this.target ? 1 : -1);
+		if (Math.abs(movement) >= Math.abs(this.state - this.target)) {
+			this.state = this.target;
+		} else {
+			this.state += movement;
+		}
+		
+		try {
+			this.propagate();
+		} finally {
+			this.options.onStep.call(this);
+			if (this.target == this.state) {
+				window.clearInterval(this.intervalId);
+				this.intervalId = null;
+				this.options.onComplete.call(this);
+			}
+		}
+	},
+	// shortcuts
+	play: function() {this.seekFromTo(0, 1)},
+	reverse: function() {this.seekFromTo(1, 0)},
+	// return a string describing this Animator, for debugging
+	inspect: function() {
+		var str = "#<Animator:\n";
+		for (var i=0; i<this.subjects.length; i++) {
+			str += this.subjects[i].inspect();
+		}
+		str += ">";
+		return str;
+	}
+}
+// merge the properties of two objects
+Animator.applyDefaults = function(defaults, prefs) {
+	prefs = prefs || {};
+	var prop, result = {};
+	for (prop in defaults) result[prop] = prefs[prop] !== undefined ? prefs[prop] : defaults[prop];
+	return result;
+}
+// make an array from any object
+Animator.makeArray = function(o) {
+	if (o == null) return [];
+	if (!o.length) return [o];
+	var result = [];
+	for (var i=0; i<o.length; i++) result[i] = o[i];
+	return result;
+}
+// convert a dash-delimited-property to a camelCaseProperty (c/o Prototype, thanks Sam!)
+Animator.camelize = function(string) {
+	var oStringList = string.split('-');
+	if (oStringList.length == 1) return oStringList[0];
+	
+	var camelizedString = string.indexOf('-') == 0
+		? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
+		: oStringList[0];
+	
+	for (var i = 1, len = oStringList.length; i < len; i++) {
+		var s = oStringList[i];
+		camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
+	}
+	return camelizedString;
+}
+// syntactic sugar for creating CSSStyleSubjects
+Animator.apply = function(el, style, options) {
+	if (style instanceof Array) {
+		return new Animator(options).addSubject(new CSSStyleSubject(el, style[0], style[1]));
+	}
+	return new Animator(options).addSubject(new CSSStyleSubject(el, style));
+}
+// make a transition function that gradually accelerates. pass a=1 for smooth
+// gravitational acceleration, higher values for an exaggerated effect
+Animator.makeEaseIn = function(a) {
+	return function(state) {
+		return Math.pow(state, a*2); 
+	}
+}
+// as makeEaseIn but for deceleration
+Animator.makeEaseOut = function(a) {
+	return function(state) {
+		return 1 - Math.pow(1 - state, a*2); 
+	}
+}
+// make a transition function that, like an object with momentum being attracted to a point,
+// goes past the target then returns
+Animator.makeElastic = function(bounces) {
+	return function(state) {
+		state = Animator.tx.easeInOut(state);
+		return ((1-Math.cos(state * Math.PI * bounces)) * (1 - state)) + state; 
+	}
+}
+// make an Attack Decay Sustain Release envelope that starts and finishes on the same level
+// 
+Animator.makeADSR = function(attackEnd, decayEnd, sustainEnd, sustainLevel) {
+	if (sustainLevel == null) sustainLevel = 0.5;
+	return function(state) {
+		if (state < attackEnd) {
+			return state / attackEnd;
+		}
+		if (state < decayEnd) {
+			return 1 - ((state - attackEnd) / (decayEnd - attackEnd) * (1 - sustainLevel));
+		}
+		if (state < sustainEnd) {
+			return sustainLevel;
+		}
+		return sustainLevel * (1 - ((state - sustainEnd) / (1 - sustainEnd)));
+	}
+}
+// make a transition function that, like a ball falling to floor, reaches the target and/
+// bounces back again
+Animator.makeBounce = function(bounces) {
+	var fn = Animator.makeElastic(bounces);
+	return function(state) {
+		state = fn(state); 
+		return state <= 1 ? state : 2-state;
+	}
+}
+ 
+// pre-made transition functions to use with the 'transition' option
+Animator.tx = {
+	easeInOut: function(pos){
+		return ((-Math.cos(pos*Math.PI)/2) + 0.5);
+	},
+	linear: function(x) {
+		return x;
+	},
+	easeIn: Animator.makeEaseIn(1.5),
+	easeOut: Animator.makeEaseOut(1.5),
+	strongEaseIn: Animator.makeEaseIn(2.5),
+	strongEaseOut: Animator.makeEaseOut(2.5),
+	elastic: Animator.makeElastic(1),
+	veryElastic: Animator.makeElastic(3),
+	bouncy: Animator.makeBounce(1),
+	veryBouncy: Animator.makeBounce(3)
+}
+
+// animates a pixel-based style property between two integer values
+function NumericalStyleSubject(els, property, from, to, units) {
+	this.els = Animator.makeArray(els);
+	if (property == 'opacity' && window.ActiveXObject) {
+		this.property = 'filter';
+	} else {
+		this.property = Animator.camelize(property);
+	}
+	this.from = parseFloat(from);
+	this.to = parseFloat(to);
+	this.units = units != null ? units : 'px';
+}
+NumericalStyleSubject.prototype = {
+	setState: function(state) {
+		var style = this.getStyle(state);
+		var visibility = (this.property == 'opacity' && state == 0) ? 'hidden' : '';
+		var j=0;
+		for (var i=0; i<this.els.length; i++) {
+			try {
+				this.els[i].style[this.property] = style;
+			} catch (e) {
+				// ignore fontWeight - intermediate numerical values cause exeptions in firefox
+				if (this.property != 'fontWeight') throw e;
+			}
+			if (j++ > 20) return;
+		}
+	},
+	getStyle: function(state) {
+		state = this.from + ((this.to - this.from) * state);
+		if (this.property == 'filter') return "alpha(opacity=" + Math.round(state*100) + ")";
+		if (this.property == 'opacity') return state;
+		return Math.round(state) + this.units;
+	},
+	inspect: function() {
+		return "\t" + this.property + "(" + this.from + this.units + " to " + this.to + this.units + ")\n";
+	}
+}
+
+// animates a colour based style property between two hex values
+function ColorStyleSubject(els, property, from, to) {
+	this.els = Animator.makeArray(els);
+	this.property = Animator.camelize(property);
+	this.to = this.expandColor(to);
+	this.from = this.expandColor(from);
+	this.origFrom = from;
+	this.origTo = to;
+}
+
+ColorStyleSubject.prototype = {
+	// parse "#FFFF00" to [256, 256, 0]
+	expandColor: function(color) {
+		var hexColor, red, green, blue;
+		hexColor = ColorStyleSubject.parseColor(color);
+		if (hexColor) {
+			red = parseInt(hexColor.slice(1, 3), 16);
+			green = parseInt(hexColor.slice(3, 5), 16);
+			blue = parseInt(hexColor.slice(5, 7), 16);
+			return [red,green,blue]
+		}
+		if (window.DEBUG) {
+			alert("Invalid colour: '" + color + "'");
+		}
+	},
+	getValueForState: function(color, state) {
+		return Math.round(this.from[color] + ((this.to[color] - this.from[color]) * state));
+	},
+	setState: function(state) {
+		var color = '#'
+				+ ColorStyleSubject.toColorPart(this.getValueForState(0, state))
+				+ ColorStyleSubject.toColorPart(this.getValueForState(1, state))
+				+ ColorStyleSubject.toColorPart(this.getValueForState(2, state));
+		for (var i=0; i<this.els.length; i++) {
+			this.els[i].style[this.property] = color;
+		}
+	},
+	inspect: function() {
+		return "\t" + this.property + "(" + this.origFrom + " to " + this.origTo + ")\n";
+	}
+}
+
+// return a properly formatted 6-digit hex colour spec, or false
+ColorStyleSubject.parseColor = function(string) {
+	var color = '#', match;
+	if(match = ColorStyleSubject.parseColor.rgbRe.exec(string)) {
+		var part;
+		for (var i=1; i<=3; i++) {
+			part = Math.max(0, Math.min(255, parseInt(match[i])));
+			color += ColorStyleSubject.toColorPart(part);
+		}
+		return color;
+	}
+	if (match = ColorStyleSubject.parseColor.hexRe.exec(string)) {
+		if(match[1].length == 3) {
+			for (var i=0; i<3; i++) {
+				color += match[1].charAt(i) + match[1].charAt(i);
+			}
+			return color;
+		}
+		return '#' + match[1];
+	}
+	return false;
+}
+// convert a number to a 2 digit hex string
+ColorStyleSubject.toColorPart = function(number) {
+	if (number > 255) number = 255;
+	var digits = number.toString(16);
+	if (number < 16) return '0' + digits;
+	return digits;
+}
+ColorStyleSubject.parseColor.rgbRe = /^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i;
+ColorStyleSubject.parseColor.hexRe = /^\#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
+
+// Animates discrete styles, i.e. ones that do not scale but have discrete values
+// that can't be interpolated
+function DiscreteStyleSubject(els, property, from, to, threshold) {
+	this.els = Animator.makeArray(els);
+	this.property = Animator.camelize(property);
+	this.from = from;
+	this.to = to;
+	this.threshold = threshold || 0.5;
+}
+
+DiscreteStyleSubject.prototype = {
+	setState: function(state) {
+		var j=0;
+		for (var i=0; i<this.els.length; i++) {
+			this.els[i].style[this.property] = state <= this.threshold ? this.from : this.to; 
+		}
+	},
+	inspect: function() {
+		return "\t" + this.property + "(" + this.from + " to " + this.to + " @ " + this.threshold + ")\n";
+	}
+}
+
+// animates between two styles defined using CSS.
+// if style1 and style2 are present, animate between them, if only style1
+// is present, animate between the element's current style and style1
+function CSSStyleSubject(els, style1, style2) {
+	els = Animator.makeArray(els);
+	this.subjects = [];
+	if (els.length == 0) return;
+	var prop, toStyle, fromStyle;
+	if (style2) {
+		fromStyle = this.parseStyle(style1, els[0]);
+		toStyle = this.parseStyle(style2, els[0]);
+	} else {
+		toStyle = this.parseStyle(style1, els[0]);
+		fromStyle = {};
+		for (prop in toStyle) {
+			fromStyle[prop] = CSSStyleSubject.getStyle(els[0], prop);
+		}
+	}
+	// remove unchanging properties
+	var prop;
+	for (prop in fromStyle) {
+		if (fromStyle[prop] == toStyle[prop]) {
+			delete fromStyle[prop];
+			delete toStyle[prop];
+		}
+	}
+	// discover the type (numerical or colour) of each style
+	var prop, units, match, type, from, to;
+	for (prop in fromStyle) {
+		var fromProp = String(fromStyle[prop]);
+		var toProp = String(toStyle[prop]);
+		if (toStyle[prop] == null) {
+			if (window.DEBUG) alert("No to style provided for '" + prop + '"');
+			continue;
+		}
+		
+		if (from = ColorStyleSubject.parseColor(fromProp)) {
+			to = ColorStyleSubject.parseColor(toProp);
+			type = ColorStyleSubject;
+		} else if (fromProp.match(CSSStyleSubject.numericalRe)
+				&& toProp.match(CSSStyleSubject.numericalRe)) {
+			from = parseFloat(fromProp);
+			to = parseFloat(toProp);
+			type = NumericalStyleSubject;
+			match = CSSStyleSubject.numericalRe.exec(fromProp);
+			var reResult = CSSStyleSubject.numericalRe.exec(toProp);
+			if (match[1] != null) {
+				units = match[1];
+			} else if (reResult[1] != null) {
+				units = reResult[1];
+			} else {
+				units = reResult;
+			}
+		} else if (fromProp.match(CSSStyleSubject.discreteRe)
+				&& toProp.match(CSSStyleSubject.discreteRe)) {
+			from = fromProp;
+			to = toProp;
+			type = DiscreteStyleSubject;
+			units = 0;   // hack - how to get an animator option down to here
+		} else {
+			if (window.DEBUG) {
+				alert("Unrecognised format for value of "
+					+ prop + ": '" + fromStyle[prop] + "'");
+			}
+			continue;
+		}
+		this.subjects[this.subjects.length] = new type(els, prop, from, to, units);
+	}
+}
+
+CSSStyleSubject.prototype = {
+	// parses "width: 400px; color: #FFBB2E" to {width: "400px", color: "#FFBB2E"}
+	parseStyle: function(style, el) {
+		var rtn = {};
+		// if style is a rule set
+		if (style.indexOf(":") != -1) {
+			var styles = style.split(";");
+			for (var i=0; i<styles.length; i++) {
+				var parts = CSSStyleSubject.ruleRe.exec(styles[i]);
+				if (parts) {
+					rtn[parts[1]] = parts[2];
+				}
+			}
+		}
+		// else assume style is a class name
+		else {
+			var prop, value, oldClass;
+			oldClass = el.className;
+			el.className = style;
+			for (var i=0; i<CSSStyleSubject.cssProperties.length; i++) {
+				prop = CSSStyleSubject.cssProperties[i];
+				value = CSSStyleSubject.getStyle(el, prop);
+				if (value != null) {
+					rtn[prop] = value;
+				}
+			}
+			el.className = oldClass;
+		}
+		return rtn;
+		
+	},
+	setState: function(state) {
+		for (var i=0; i<this.subjects.length; i++) {
+			this.subjects[i].setState(state);
+		}
+	},
+	inspect: function() {
+		var str = "";
+		for (var i=0; i<this.subjects.length; i++) {
+			str += this.subjects[i].inspect();
+		}
+		return str;
+	}
+}
+// get the current value of a css property, 
+CSSStyleSubject.getStyle = function(el, property){
+	var style;
+	if(document.defaultView && document.defaultView.getComputedStyle){
+		style = document.defaultView.getComputedStyle(el, "").getPropertyValue(property);
+		if (style) {
+			return style;
+		}
+	}
+	property = Animator.camelize(property);
+	if(el.currentStyle){
+		style = el.currentStyle[property];
+	}
+	return style || el.style[property]
+}
+
+
+CSSStyleSubject.ruleRe = /^\s*([a-zA-Z\-]+)\s*:\s*(\S(.+\S)?)\s*$/;
+CSSStyleSubject.numericalRe = /^-?\d+(?:\.\d+)?(%|[a-zA-Z]{2})?$/;
+CSSStyleSubject.discreteRe = /^\w+$/;
+
+// required because the style object of elements isn't enumerable in Safari
+/*
+CSSStyleSubject.cssProperties = ['background-color','border','border-color','border-spacing',
+'border-style','border-top','border-right','border-bottom','border-left','border-top-color',
+'border-right-color','border-bottom-color','border-left-color','border-top-width','border-right-width',
+'border-bottom-width','border-left-width','border-width','bottom','color','font-size','font-size-adjust',
+'font-stretch','font-style','height','left','letter-spacing','line-height','margin','margin-top',
+'margin-right','margin-bottom','margin-left','marker-offset','max-height','max-width','min-height',
+'min-width','orphans','outline','outline-color','outline-style','outline-width','overflow','padding',
+'padding-top','padding-right','padding-bottom','padding-left','quotes','right','size','text-indent',
+'top','width','word-spacing','z-index','opacity','outline-offset'];*/
+
+
+CSSStyleSubject.cssProperties = ['azimuth','background','background-attachment','background-color','background-image','background-position','background-repeat','border-collapse','border-color','border-spacing','border-style','border-top','border-top-color','border-right-color','border-bottom-color','border-left-color','border-top-style','border-right-style','border-bottom-style','border-left-style','border-top-width','border-right-width','border-bottom-width','border-left-width','border- [...]
+
+
+// chains several Animator objects together
+function AnimatorChain(animators, options) {
+	this.animators = animators;
+	this.setOptions(options);
+	for (var i=0; i<this.animators.length; i++) {
+		this.listenTo(this.animators[i]);
+	}
+	this.forwards = false;
+	this.current = 0;
+}
+
+AnimatorChain.prototype = {
+	// apply defaults
+	setOptions: function(options) {
+		this.options = Animator.applyDefaults({
+			// by default, each call to AnimatorChain.play() calls jumpTo(0) of each animator
+			// before playing, which can cause flickering if you have multiple animators all
+			// targeting the same element. Set this to false to avoid this.
+			resetOnPlay: true
+		}, options);
+	},
+	// play each animator in turn
+	play: function() {
+		this.forwards = true;
+		this.current = -1;
+		if (this.options.resetOnPlay) {
+			for (var i=0; i<this.animators.length; i++) {
+				this.animators[i].jumpTo(0);
+			}
+		}
+		this.advance();
+	},
+	// play all animators backwards
+	reverse: function() {
+		this.forwards = false;
+		this.current = this.animators.length;
+		if (this.options.resetOnPlay) {
+			for (var i=0; i<this.animators.length; i++) {
+				this.animators[i].jumpTo(1);
+			}
+		}
+		this.advance();
+	},
+	// if we have just play()'d, then call reverse(), and vice versa
+	toggle: function() {
+		if (this.forwards) {
+			this.seekTo(0);
+		} else {
+			this.seekTo(1);
+		}
+	},
+	// internal: install an event listener on an animator's onComplete option
+	// to trigger the next animator
+	listenTo: function(animator) {
+		var oldOnComplete = animator.options.onComplete;
+		var _this = this;
+		animator.options.onComplete = function() {
+			if (oldOnComplete) oldOnComplete.call(animator);
+			_this.advance();
+		}
+	},
+	// play the next animator
+	advance: function() {
+		if (this.forwards) {
+			if (this.animators[this.current + 1] == null) return;
+			this.current++;
+			this.animators[this.current].play();
+		} else {
+			if (this.animators[this.current - 1] == null) return;
+			this.current--;
+			this.animators[this.current].reverse();
+		}
+	},
+	// this function is provided for drop-in compatibility with Animator objects,
+	// but only accepts 0 and 1 as target values
+	seekTo: function(target) {
+		if (target <= 0) {
+			this.forwards = false;
+			this.animators[this.current].seekTo(0);
+		} else {
+			this.forwards = true;
+			this.animators[this.current].seekTo(1);
+		}
+	}
+}
+
+// an Accordion is a class that creates and controls a number of Animators. An array of elements is passed in,
+// and for each element an Animator and a activator button is created. When an Animator's activator button is
+// clicked, the Animator and all before it seek to 0, and all Animators after it seek to 1. This can be used to
+// create the classic Accordion effect, hence the name.
+// see setOptions for arguments
+function Accordion(options) {
+	this.setOptions(options);
+	var selected = this.options.initialSection, current;
+	if (this.options.rememberance) {
+		current = document.location.hash.substring(1);
+	}
+	this.rememberanceTexts = [];
+	this.ans = [];
+	var _this = this;
+	for (var i=0; i<this.options.sections.length; i++) {
+		var el = this.options.sections[i];
+		var an = new Animator(this.options.animatorOptions);
+		var from = this.options.from + (this.options.shift * i);
+		var to = this.options.to + (this.options.shift * i);
+		an.addSubject(new NumericalStyleSubject(el, this.options.property, from, to, this.options.units));
+		an.jumpTo(0);
+		var activator = this.options.getActivator(el);
+		activator.index = i;
+		activator.onclick = function(){_this.show(this.index)};
+		this.ans[this.ans.length] = an;
+		this.rememberanceTexts[i] = activator.innerHTML.replace(/\s/g, "");
+		if (this.rememberanceTexts[i] === current) {
+			selected = i;
+		}
+	}
+	this.show(selected);
+}
+
+Accordion.prototype = {
+	// apply defaults
+	setOptions: function(options) {
+		this.options = Object.extend({
+			// REQUIRED: an array of elements to use as the accordion sections
+			sections: null,
+			// a function that locates an activator button element given a section element.
+			// by default it takes a button id from the section's "activator" attibute
+			getActivator: function(el) {return document.getElementById(el.getAttribute("activator"))},
+			// shifts each animator's range, for example with options {from:0,to:100,shift:20}
+			// the animators' ranges will be 0-100, 20-120, 40-140 etc.
+			shift: 0,
+			// the first page to show
+			initialSection: 0,
+			// if set to true, document.location.hash will be used to preserve the open section across page reloads 
+			rememberance: true,
+			// constructor arguments to the Animator objects
+			animatorOptions: {}
+		}, options || {});
+	},
+	show: function(section) {
+		for (var i=0; i<this.ans.length; i++) {
+			this.ans[i].seekTo(i > section ? 1 : 0);
+		}
+		if (this.options.rememberance) {
+			document.location.hash = this.rememberanceTexts[section];
+		}
+	}
+}
diff --git a/examples/arcgis93rest.html b/examples/arcgis93rest.html
new file mode 100644
index 0000000..9cf6e3f
--- /dev/null
+++ b/examples/arcgis93rest.html
@@ -0,0 +1,64 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        var layer;
+
+        function init(){
+            var mapOptions = {
+                maxExtent: new OpenLayers.Bounds(-174,18.4,-63.5,71),
+                maxResolution: 0.25,
+                projection: "EPSG:4326"};
+            map = new OpenLayers.Map( 'map', mapOptions );
+            layer = new OpenLayers.Layer.ArcGIS93Rest( "ArcGIS Server Layer",
+                    "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/export", 
+                    {layers: "show:0,2"});
+            map.addLayer(layer);
+
+            map.addControl( new OpenLayers.Control.MousePosition() );
+            
+            map.setCenter(new OpenLayers.LonLat(-115, 45), 0);
+        }
+        
+        function enableFilter() {
+            layer.setLayerFilter(2, "STATE_NAME LIKE '%" + document.getElementById('filterValueField').value + "%'");
+            layer.redraw();
+        }
+        function disableFilter() {
+            layer.setLayerFilter(2, null);
+            layer.redraw();
+        }
+        function updateButton() {
+            document.getElementById('filterButton').value = "Show '" +
+                document.getElementById('filterValueField').value + "' States";
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">ArcGIS Server 9.3 Rest API Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Shows the basic use of openlayers using an ArcGIS Server 9.3 Rest API layer
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        This is an example of how to add an ArcGIS Server 9.3 Rest API layer to the OpenLayers window.
+    </div>
+    <input id="filterValueField" type="textfield" value="A"/>
+    <input id="filterButton" type="button" onclick="enableFilter();" value="Filter States"/>
+    <input type="button" onclick="disableFilter();" value="Show All States"/>
+    <br>
+    (Filter is case sensitive.)
+  </body>
+</html>
+
+
+
+
diff --git a/examples/arcims-thematic.html b/examples/arcims-thematic.html
new file mode 100644
index 0000000..806696f
--- /dev/null
+++ b/examples/arcims-thematic.html
@@ -0,0 +1,77 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>ArcIMS Thematic Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 0;
+        var lat = 0;
+        var zoom = 1;
+        var map, layer;
+        var query, renderer;
+
+        function init() {
+            OpenLayers.ProxyHost = "proxy.cgi?url=";
+            
+            map = new OpenLayers.Map('map');
+            
+            query = {where: "FIPS_ID>100 AND FIPS_ID<200"};
+            
+            renderer = {
+                type: 'valuemap',
+                lookupfield: 'FIPS_ID',
+                ranges: [
+                    { lower: 100, upper: 120, symbol: { type: 'simplepolygon', fillcolor: '255,0,0' } },
+                    { lower: 120, upper: 140, symbol: { type: 'simplepolygon', fillcolor: '255,255,0' } },
+                    { lower: 140, upper: 160, symbol: { type: 'simplepolygon', fillcolor: '0,255,0' } },
+                    { lower: 160, upper: 180, symbol: { type: 'simplepolygon', fillcolor: '0,255,255' } },
+                    { lower: 180, upper: 200, symbol: { type: 'simplepolygon', fillcolor: '0,0,255' } }
+                ]
+            };
+            
+            var options = {
+                layers: [{
+                    id: "1", 
+                    visible: true,
+                    query: query,
+                    renderer: renderer
+                }],
+                serviceName: "OpenLayers_Sample",
+                singleTile: true,
+                async: true
+            };
+            
+            layer = new OpenLayers.Layer.ArcIMS(
+                "Global Sample Map",
+                "http://sample.azavea.com/servlet/com.esri.esrimap.Esrimap",
+                options
+            );
+            map.addLayer(layer);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">ArcIMS Thematic Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Shows the advanced use of OpenLayers using a thematic ArcIMS layer
+    </p>
+
+    <div id="map" class="smallmap"></div>
+    
+    <div id="docs">
+        <p>This is an example of how to add an ArcIMS layer to an OpenLayers map.</p>
+        
+        <p>Following the ArcXML convention to create a thematic (or chloropleth) map,
+        a layer definition is created with a query and a renderer to select portions
+        of the map data, and change their representation in the generated map tiles.</p>
+    </div>
+
+  </body>
+</html>
diff --git a/examples/arcims.html b/examples/arcims.html
new file mode 100644
index 0000000..fb7a771
--- /dev/null
+++ b/examples/arcims.html
@@ -0,0 +1,52 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>ArcIMS Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 0;
+        var lat = 0;
+        var zoom = 1;
+        var map, layer;
+
+        function init(){
+            OpenLayers.ProxyHost = "proxy.cgi?url=";
+            
+            map = new OpenLayers.Map( 'map' );
+            
+            var options = {
+              serviceName: "OpenLayers_Sample",
+              async: true
+            };
+            
+            layer = new OpenLayers.Layer.ArcIMS( "Global Sample Map",
+                    "http://sample.azavea.com/servlet/com.esri.esrimap.Esrimap", options );
+            map.addLayer(layer);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">ArcIMS Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Shows the basic use of OpenLayers using an ArcIMS layer
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        This is an example of how to add an ArcIMS layer to the OpenLayers window.
+    </div>
+
+  </body>
+</html>
+
+
+
+
diff --git a/examples/attribution.html b/examples/attribution.html
new file mode 100644
index 0000000..1fbd97f
--- /dev/null
+++ b/examples/attribution.html
@@ -0,0 +1,54 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Attribution Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+
+        <script type="text/javascript">
+            var map;
+            function init(){
+                map = new OpenLayers.Map('map');
+
+                var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'},
+                    {'attribution': 'Provided by OSGeo'});
+
+                var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
+                    "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                    {layers: "landsat7"},{attribution:"Provided by Telascience"});
+
+                var vector = new OpenLayers.Layer.Vector("Simple Geometry",
+                              {attribution:"Vector Attibution in 2nd arg"});
+
+                map.addLayers([ol_wms, jpl_wms, vector]);
+
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                map.addControl(new OpenLayers.Control.Attribution());
+                // map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+                map.zoomToMaxExtent();
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Attribution Example</h1>
+
+        <div id="tags">
+            copyright watermark logo attribution
+        </div>
+
+        <p id="shortdesc">
+          Shows the use of the attribution layer option on a number of layer types.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs">
+            This is an example of how to add an attribution block to the OpenLayers window.  In order to use an
+            attribution block, an attribution parameter must be set in each layer that requires attribution. In
+            addition, an attribution control must be added to the map, though one is added to all OpenLayers Maps by default. 
+            Be aware that this is a layer *option*: the options hash goes in
+            different places depending on the layer type you are using.  
+        </div>
+    </body>
+</html>
diff --git a/examples/baseLayers.html b/examples/baseLayers.html
new file mode 100644
index 0000000..c089c84
--- /dev/null
+++ b/examples/baseLayers.html
@@ -0,0 +1,96 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Base Layers Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            #controls
+            {
+                width: 512px;
+            }
+        </style>
+
+        <!-- this gmaps key generated for http://openlayers.org/dev/ -->
+        <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghSPUCi5aRYVveCcVYxzezM4iaj_gxQ9t-UajFL70jfcpquH5l1IJ-Zyyw'></script>
+        <!-- Localhost key -->
+        <!-- <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTS6gjckBmeABOGXIUiOiZObZESPg'></script>-->
+        <script type="text/javascript" src="http://clients.multimap.com/API/maps/1.1/metacarta_04"></script>
+        <script src='http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1'></script>
+        <script src="http://api.maps.yahoo.com/ajaxymap?v=3.0&appid=euzuro-openlayers"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var lon = 5;
+            var lat = 40;
+            var zoom = 5;
+            var map, markers;
+            var barcelona = new OpenLayers.LonLat(2.13134765625,
+                                                  41.37062534198901);
+            var madrid = new OpenLayers.LonLat(-3.6968994140625,
+                                              40.428314208984375);
+
+            function init(){
+                map = new OpenLayers.Map( 'map' );
+
+                var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                          "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                          {layers: 'basic'} );
+                var google = new OpenLayers.Layer.Google( "Google Hybrid" , {type: G_HYBRID_MAP });
+                var ve = new OpenLayers.Layer.VirtualEarth( "VE");
+                var yahoo = new OpenLayers.Layer.Yahoo( "Yahoo");
+                var mm = new OpenLayers.Layer.MultiMap( "MultiMap");
+
+
+                map.addLayers([wms, google, ve, yahoo, mm]);
+
+                markers = new OpenLayers.Layer.Markers("markers");
+                map.addLayer(markers);
+
+                map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+                map.addControl( new OpenLayers.Control.LayerSwitcher() );
+                map.addControl( new OpenLayers.Control.MousePosition() );
+
+            }
+
+            function add() {
+                var url = 'http://www.openlayers.org/dev/img/marker.png';
+                var sz = new OpenLayers.Size(21, 25);
+                var calculateOffset = function(size) {
+                                    return new OpenLayers.Pixel(-(size.w/2), -size.h);
+                                 };
+                var icon = new OpenLayers.Icon(url, sz, null, calculateOffset);
+                marker = new OpenLayers.Marker(barcelona, icon);
+                markers.addMarker(marker);
+
+                marker = new OpenLayers.Marker(madrid, icon.clone());
+                markers.addMarker(marker);
+
+            }
+
+            function remove() {
+                markers.removeMarker(marker);
+            }
+
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Base Layers Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+           This example shows the use base layers from multiple commercial map image providers.
+        </p>
+
+        <div id="controls">
+            <div id="map" class="smallmap"></div>
+
+            <div style="background-color:green" onclick="add()"> click to add a marker to the map</div>
+            <div style="background-color:red" onclick="remove()"> click to remove the marker from the map</div>
+        </div>
+        
+        <div id="docs">
+       </div>
+    </body>
+</html>
diff --git a/examples/behavior-fixed-http-gml.html b/examples/behavior-fixed-http-gml.html
new file mode 100644
index 0000000..58cd488
--- /dev/null
+++ b/examples/behavior-fixed-http-gml.html
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Vector Behavior Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map;
+        
+            function init(){
+                map = new OpenLayers.Map('map');
+                var wms = new OpenLayers.Layer.WMS(
+                    "OpenLayers WMS", "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'}
+                );
+
+                var layer = new OpenLayers.Layer.Vector("GML", {
+                    strategies: [new OpenLayers.Strategy.Fixed()],
+                    protocol: new OpenLayers.Protocol.HTTP({
+                        url: "gml/polygon.xml",
+                        format: new OpenLayers.Format.GML()
+                    })
+                });
+
+                map.addLayers([wms, layer]);
+                map.zoomToExtent(new OpenLayers.Bounds(
+                    -3.92, 44.34, 4.87, 49.55
+                ));
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Vector Behavior Example (Fixed/HTTP/GML)</h1>
+        <p id="shortdesc">
+            Vector layer with a Fixed strategy, HTTP protocol, and GML format.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            The vector layer shown uses the Fixed strategy, the HTTP protocol,
+            and the GML format.
+            The Fixed strategy is a simple strategy that fetches features once
+            and never re-requests new data.
+            The HTTP protocol makes requests using HTTP verbs.  It should be
+            constructed with a url that corresponds to a collection of features
+            (a resource on some server).
+            The GML format is used to serialize features.
+        </div>
+    </body>
+</html>
diff --git a/examples/bing.html b/examples/bing.html
new file mode 100644
index 0000000..f53e8a5
--- /dev/null
+++ b/examples/bing.html
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Bing Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <script src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2&mkt=en-us"></script>
+
+    <script src="../lib/OpenLayers.js"></script>
+    <script>
+
+        var map;
+
+        function init(){
+            map = new OpenLayers.Map("map");
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+
+            var shaded = new OpenLayers.Layer.VirtualEarth("Shaded", {
+                type: VEMapStyle.Shaded
+            });
+            var hybrid = new OpenLayers.Layer.VirtualEarth("Hybrid", {
+                type: VEMapStyle.Hybrid
+            });
+            var aerial = new OpenLayers.Layer.VirtualEarth("Aerial", {
+                type: VEMapStyle.Aerial
+            });
+
+            map.addLayers([shaded, hybrid, aerial]);
+
+            map.setCenter(new OpenLayers.LonLat(-110, 45), 3);
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Bing Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrates the use of Bing layers.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+    <div id="docs">This example demonstrates the ability to create layers using tiles from Bing maps.</div>
+  </body>
+</html>
+
+
diff --git a/examples/boxes-vector.html b/examples/boxes-vector.html
new file mode 100644
index 0000000..ac1196e
--- /dev/null
+++ b/examples/boxes-vector.html
@@ -0,0 +1,54 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Boxes Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var box_extents = [
+                [-10, 50, 5, 60],
+                [-75, 41, -71, 44],
+                [-122.6, 37.6, -122.3, 37.9],
+                [10, 10, 20, 20]
+            ];
+            var map;
+            function init(){
+                map = new OpenLayers.Map('map');
+
+                var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'} );
+
+                var boxes  = new OpenLayers.Layer.Vector( "Boxes" );
+    
+                for (var i = 0; i < box_extents.length; i++) {
+                    ext = box_extents[i];
+                    bounds = new OpenLayers.Bounds(ext[0], ext[1], ext[2], ext[3]);
+                    
+                    box = new OpenLayers.Feature.Vector(bounds.toGeometry());
+                    boxes.addFeatures(box);
+                }
+
+                map.addLayers([ol_wms, boxes]);
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                var sf = new OpenLayers.Control.SelectFeature(boxes);
+                map.addControl(sf);
+                sf.activate();
+                map.zoomToMaxExtent();
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Boxes Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Demonstrate marker and box type annotations on a map.
+        </p>
+        
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs"></div>
+    </body>
+</html>
diff --git a/examples/boxes.html b/examples/boxes.html
new file mode 100644
index 0000000..5179e24
--- /dev/null
+++ b/examples/boxes.html
@@ -0,0 +1,53 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Boxes Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var box_extents = [
+                [-10, 50, 5, 60],
+                [-75, 41, -71, 44],
+                [-122.6, 37.6, -122.3, 37.9],
+                [10, 10, 20, 20]
+            ];
+            var map;
+            function init(){
+                map = new OpenLayers.Map('map');
+
+                var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'} );
+
+                var boxes  = new OpenLayers.Layer.Boxes( "Boxes" );
+    
+                for (var i = 0; i < box_extents.length; i++) {
+                    ext = box_extents[i];
+                    bounds = new OpenLayers.Bounds(ext[0], ext[1], ext[2], ext[3]);
+                    box = new OpenLayers.Marker.Box(bounds);
+                    box.events.register("click", box, function (e) {
+                        this.setBorder("yellow");
+                    });
+                    boxes.addMarker(box);
+                }
+
+                map.addLayers([ol_wms, boxes]);
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                map.zoomToMaxExtent();
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Boxes Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Demonstrate marker and box type annotations on a map.
+        </p>
+        
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs"></div>
+    </body>
+</html>
diff --git a/examples/browser-name.html b/examples/browser-name.html
new file mode 100644
index 0000000..0fdcd5e
--- /dev/null
+++ b/examples/browser-name.html
@@ -0,0 +1,89 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        // making this a global variable so that it is accessible for
+        // debugging/inspecting in Firebug
+        var map = null;
+
+        function init(){
+
+            //set title name to include Browser Detection
+            // this is the only way to test the functionality
+            // of the getBrowserName() function
+            //
+            var header = OpenLayers.Util.getElement("browserHeader");
+            header.innerHTML = "(browser: ";
+            var browserCode = OpenLayers.Util.getBrowserName();
+            switch (browserCode) {
+                case "opera":
+                    browserName = "Opera";
+                    break;
+                case "msie":
+                    browserName = "Internet Explorer";
+                    break;
+                case "safari":
+                    browserName = "Safari";
+                    break;
+                case "firefox":
+                    browserName = "FireFox";
+                    break;
+                case "mozilla":
+                    browserName = "Mozilla";
+                    break;
+                default:
+                    browserName = "detection error"
+                    break;
+            }
+            header.innerHTML += browserName + ")";
+
+            map = new OpenLayers.Map('map');
+
+            var options = {
+                            resolutions: [1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.00137329101]
+            };
+
+            var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'},
+                options);
+
+            var options2 = {
+                            resolutions: [0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.00137329101]
+            };
+            var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
+                "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                {layers: "landsat7"}, options2);
+
+            var dm_wms = new OpenLayers.Layer.WMS( "DM Solutions Demo",
+                "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
+                {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
+                         "prov_bound,fedlimit,rail,road,popplace",
+                 transparent: "true", format: "image/png"},
+                 {minResolution: 0.17578125,
+                  maxResolution: 0.703125});
+
+            map.addLayers([ol_wms, jpl_wms, dm_wms]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            // map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title" style="display:inline;">Example Showing Browser Name</h1>
+    <h3 id="browserHeader" style="display:inline;"></h3>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate a simple map that shows the browser name.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/buffer.html b/examples/buffer.html
new file mode 100644
index 0000000..ce61c3d
--- /dev/null
+++ b/examples/buffer.html
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Buffer Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var lon = 0;
+            var lat = 0;
+            var zoom = 2;
+            var map, layer;
+
+            function init(){
+                map = new OpenLayers.Map( 'map' );
+                layer = new OpenLayers.Layer.WMS( "0 buffer: OpenLayers WMS",
+                        "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                        {layers: 'basic'}, {'buffer':0} );
+                map.addLayer(layer);
+                layer = new OpenLayers.Layer.WMS( "1 buffer: OpenLayers WMS",
+                        "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                        {layers: 'basic'}, {'buffer':1} );
+                map.addLayer(layer);
+                layer = new OpenLayers.Layer.WMS( "4 buffer: OpenLayers WMS",
+                        "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                        {layers: 'basic'}, {'buffer':4} );
+                map.addLayer(layer);
+                map.addControl(new OpenLayers.Control.LayerSwitcher())
+                map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Buffer Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            This example shows the use of the buffer layer option for any layer that inherits from OpenLayers.Layer.Grid.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs">
+            Use the buffer property to control how many tiles are included
+            outside the visible map area. Default is 2.
+        </div>
+    </body>
+</html>
diff --git a/examples/canvas.html b/examples/canvas.html
new file mode 100644
index 0000000..7039756
--- /dev/null
+++ b/examples/canvas.html
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>Canvas Renderer Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+        <script src="canvas.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Canvas Renderer Example</h1>
+        <p id="shortdesc">
+            Demonstrates the use of the canvas renderer with a vector layer.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                This example shows a vector layer that uses the Canvas renderer
+                where available. The order of the renderers given in the layer
+                options is used to locate the first available renderer.
+            </p>
+            <p>
+                See the <a href="canvas.js" target="_blank">canvas.js source</a>
+                to see how this is done.
+            </p> 
+        </div>
+    </body>
+</html>
diff --git a/examples/canvas.js b/examples/canvas.js
new file mode 100644
index 0000000..f9f0d3b
--- /dev/null
+++ b/examples/canvas.js
@@ -0,0 +1,62 @@
+var map, layer, styleMap;
+OpenLayers.ProxyHost = "proxy.cgi?url=";
+
+function init() {
+    map = new OpenLayers.Map({
+        div: "map",
+        projection: new OpenLayers.Projection("EPSG:900913"),
+        displayProjection: new OpenLayers.Projection("EPSG:4326"),
+        units: "m",
+        maxResolution: 156543.0339,
+        maxExtent: new OpenLayers.Bounds(
+            -20037508, -20037508, 20037508, 20037508
+        )
+    });
+
+    var g = new OpenLayers.Layer.Google("Google Layer", {
+        sphericalMercator: true
+    });
+    map.addLayers([g]);
+
+    // prepare to style the data
+    styleMap = new OpenLayers.StyleMap({
+        strokeColor: "black",
+        strokeWidth: 2,
+        strokeOpacity: 0.5,
+        fillOpacity: 0.2
+    });
+
+    // create a color table for state FIPS code
+    var colors = ["red", "orange", "yellow", "green", "blue", "purple"];
+    var code, fips = {};
+    for(var i=1; i<=66; ++i) {
+        code = "0" + i;
+        code = code.substring(code.length - 2);
+        fips[code] = {fillColor: colors[i % colors.length]};
+    }
+    // add unique value rules with your color lookup
+    styleMap.addUniqueValueRules("default", "STATE_FIPS", fips);
+    
+    // create a vector layer using the canvas renderer (where available)
+    var wfs = new OpenLayers.Layer.Vector("States", {
+        strategies: [new OpenLayers.Strategy.BBOX()],
+        protocol: new OpenLayers.Protocol.WFS({
+            version: "1.1.0",
+            srsName: "EPSG:900913",
+            url:  "http://demo.opengeo.org/geoserver/wfs",
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp"
+        }),
+        styleMap: styleMap,
+        renderers: ["Canvas", "SVG", "VML"]
+    });
+    map.addLayer(wfs);
+
+    // if you want to use Geographic coords, transform to ESPG:900913
+    var ddBounds = new OpenLayers.Bounds(
+        -73.839111,40.287907,-68.214111,44.441624
+    );
+    map.zoomToExtent(
+        ddBounds.transform(map.displayProjection, map.getProjectionObject())
+    );
+}
diff --git a/examples/click-handler.html b/examples/click-handler.html
new file mode 100644
index 0000000..5d73401
--- /dev/null
+++ b/examples/click-handler.html
@@ -0,0 +1,227 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Click Handler Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            #map {
+                width: 340px;
+                height: 170px;
+                border: 1px solid gray;
+            }
+            #west {
+                width: 350px;
+            }
+            #east {
+                position: absolute;
+                left: 370px;
+                top: 3em;
+            }
+
+            table td {
+                text-align: center;
+                margin: 0;
+                border: 1px solid gray;
+            }
+            textarea.output {
+                text-align: left;
+                font-size: 0.9em;
+                width: 250px;
+                height: 65px;
+                overflow: auto;
+            }
+        </style>
+        <script src="../lib/Firebug/firebug.js"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+
+            OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
+                defaultHandlerOptions: {
+                    'single': true,
+                    'double': false,
+                    'pixelTolerance': 0,
+                    'stopSingle': false,
+                    'stopDouble': false
+                },
+
+                initialize: function(options) {
+                    this.handlerOptions = OpenLayers.Util.extend(
+                        {}, this.defaultHandlerOptions
+                    );
+                    OpenLayers.Control.prototype.initialize.apply(
+                        this, arguments
+                    ); 
+                    this.handler = new OpenLayers.Handler.Click(
+                        this, {
+                            'click': this.onClick,
+                            'dblclick': this.onDblclick 
+                        }, this.handlerOptions
+                    );
+                }, 
+
+                onClick: function(evt) {
+                    var output = document.getElementById(this.key + "Output");
+                    var msg = "click " + evt.xy;
+                    output.value = output.value + msg + "\r\n";
+                },
+
+                onDblclick: function(evt) {  
+                    var output = document.getElementById(this.key + "Output");
+                    var msg = "dblclick " + evt.xy;
+                    output.value = output.value + msg + "\n";
+                }   
+
+            });
+
+            var map, controls; 
+
+            function init(){
+        
+                map = new OpenLayers.Map('map');
+                var layer = new OpenLayers.Layer.WMS(
+                    "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'}
+                );
+                map.addLayers([layer]);
+                
+                controls = {
+                    "single": new OpenLayers.Control.Click({
+                        handlerOptions: {
+                            "single": true
+                        }
+                    }),
+                    "double": new OpenLayers.Control.Click({
+                        handlerOptions: {
+                            "single": false,
+                            "double": true
+                        }
+                    }),
+                    "both": new OpenLayers.Control.Click({
+                        handlerOptions: {
+                            "single": true,
+                            "double": true
+                        }
+                    }),
+                    "drag": new OpenLayers.Control.Click({
+                        handlerOptions: {
+                            "single": true,
+                            "pixelTolerance": null
+                        }
+                    }),
+                    "stopsingle": new OpenLayers.Control.Click({
+                        handlerOptions: {
+                            "single": true,
+                            "stopSingle": true
+                        }
+                    }),
+                    "stopdouble": new OpenLayers.Control.Click({
+                        handlerOptions: {
+                            "single": false,
+                            "double": true,
+                            "stopDouble": true
+                        }
+                    })
+                };
+
+                var props = document.getElementById("props");
+                var control;
+                for(var key in controls) {
+                    control = controls[key];
+                    // only to route output here
+                    control.key = key;
+                    map.addControl(control);
+                }
+
+                map.zoomToMaxExtent();
+            }
+            
+            function toggle(key) {
+                var control = controls[key];
+                if(control.active) {
+                    control.deactivate();
+                } else {
+                    control.activate();
+                }
+                var status = document.getElementById(key + "Status");
+                status.innerHTML = control.active ? "on" : "off";
+                var output = document.getElementById(key + "Output");
+                output.value = "";
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Click Handler Example</h1>
+        <div id="west">
+    
+            <div id="tags">
+            </div>
+    
+            <p id="shortdesc">
+                This example shows the use of the click handler.
+            </p>
+    
+            <div id="map" class="smallmap"></div>
+            <p>
+                The click handler can be used to gain more flexibility over handling
+                click events.  The handler can be constructed with options to handle
+                only single click events, to handle single and double-click events,
+                to ignore clicks that include a drag, and to stop propagation of
+                single and/or double-click events.  A single click is a click that
+                is not followed by another click for more than 300ms.  This delay
+                is configured with the delay property.
+            </p>
+            <p>
+                The options to stop single and double clicks have to do with
+                stopping event propagation on the map events listener queue
+                (not stopping events from cascading to other elements).  The
+                ability to stop an event from propagating has to do with the
+                order in which listeners are registered.  With stopSingle or
+                stopDouble true, a click handler will stop propagation to all
+                listeners that were registered (or all handlers that were
+                activated) before the click handler was activated.  So, for
+                example, activating a click handler with stopDouble true after
+                the navigation control is active will stop double-clicks from
+                zooming in.
+            </p>
+        </div>
+        <div id="east">
+            <table>
+                <caption>Controls with click handlers (toggle on/off to clear output)</caption>
+                <tbody>
+                    <tr>
+                        <td>single only</td>
+                        <td><button id="singleStatus" onclick="toggle('single')">off</button></td>
+                        <td><textarea class="output" id="singleOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>double only</td>
+                        <td><button id="doubleStatus" onclick="toggle('double')">off</button></td>
+                        <td><textarea class="output" id="doubleOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>both</td>
+                        <td><button id="bothStatus" onclick="toggle('both')">off</button></td>
+                        <td><textarea class="output" id="bothOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>single with drag</td>
+                        <td><button id="dragStatus" onclick="toggle('drag')">off</button></td>
+                        <td><textarea class="output" id="dragOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>single with stop</td>
+                        <td><button id="stopsingleStatus" onclick="toggle('stopsingle')">off</button></td>
+                        <td><textarea class="output" id="stopsingleOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>double with stop</td>
+                        <td><button id="stopdoubleStatus" onclick="toggle('stopdouble')">off</button></td>
+                        <td><textarea class="output" id="stopdoubleOutput"></textarea></td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+    </body>
+</html>
diff --git a/examples/click.html b/examples/click.html
new file mode 100644
index 0000000..5a3d931
--- /dev/null
+++ b/examples/click.html
@@ -0,0 +1,81 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Click Event Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
+                defaultHandlerOptions: {
+                    'single': true,
+                    'double': false,
+                    'pixelTolerance': 0,
+                    'stopSingle': false,
+                    'stopDouble': false
+                },
+
+                initialize: function(options) {
+                    this.handlerOptions = OpenLayers.Util.extend(
+                        {}, this.defaultHandlerOptions
+                    );
+                    OpenLayers.Control.prototype.initialize.apply(
+                        this, arguments
+                    ); 
+                    this.handler = new OpenLayers.Handler.Click(
+                        this, {
+                            'click': this.trigger
+                        }, this.handlerOptions
+                    );
+                }, 
+
+                trigger: function(e) {
+                    var lonlat = map.getLonLatFromViewPortPx(e.xy);
+                    alert("You clicked near " + lonlat.lat + " N, " +
+                                              + lonlat.lon + " E");
+                }
+
+            });
+            var map;
+            function init(){
+                map = new OpenLayers.Map('map');
+
+                var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'} );
+
+            var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
+                "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                {layers: "landsat7"});
+
+                jpl_wms.setVisibility(false);
+
+                map.addLayers([ol_wms, jpl_wms]);
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                // map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+                map.zoomToMaxExtent();
+                
+                var click = new OpenLayers.Control.Click();
+                map.addControl(click);
+                click.activate();
+
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Click Event Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            This example shows the use of the click handler and getLonLatFromViewPortPx functions to trigger events on mouse click. 
+
+        </p>
+
+        <div id="map" class="smallmap"></div>
+    
+        <div id="docs">
+            Using the Click handler allows you to (for example) catch clicks without catching double clicks, something that standard browser events don't do for you. (Try double clicking: you'll zoom in, whereas using the browser click event, you would just get two alerts.) This example click control shows you how to use it. 
+        </div>
+    </body>
+</html>
diff --git a/examples/controls.html b/examples/controls.html
new file mode 100644
index 0000000..de59e22
--- /dev/null
+++ b/examples/controls.html
@@ -0,0 +1,63 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Map Controls Example</title>
+
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map;
+            function init(){
+                map = new OpenLayers.Map('map', {
+                    controls: [
+                        new OpenLayers.Control.Navigation(),
+                        new OpenLayers.Control.PanZoomBar(),
+                        new OpenLayers.Control.LayerSwitcher({'ascending':false}),
+                        new OpenLayers.Control.Permalink(),
+                        new OpenLayers.Control.ScaleLine(),
+                        new OpenLayers.Control.Permalink('permalink'),
+                        new OpenLayers.Control.MousePosition(),
+                        new OpenLayers.Control.OverviewMap(),
+                        new OpenLayers.Control.KeyboardDefaults()
+                    ],
+                    numZoomLevels: 6
+                    
+                });
+    
+
+                var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} );
+                var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
+                    "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                    {layers: "landsat7"});
+                var dm_wms = new OpenLayers.Layer.WMS( "DM Solutions Demo",
+                    "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
+                    {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
+                             "prov_bound,fedlimit,rail,road,popplace",
+                     transparent: "true", format: "image/png" });
+
+                jpl_wms.setVisibility(false);
+                dm_wms.setVisibility(false);
+
+                map.addLayers([ol_wms, jpl_wms, dm_wms]);
+                if (!map.getCenter()) map.zoomToMaxExtent();
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Map Controls Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Attach zooming, panning, layer switcher, overview map, and permalink map controls to an OpenLayers window.
+        </p>
+
+        <a style="float:right" href="" id="permalink">Permalink</a>
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs"></div>
+    </body>
+</html>
diff --git a/examples/custom-control-point.html b/examples/custom-control-point.html
new file mode 100644
index 0000000..3ff3199
--- /dev/null
+++ b/examples/custom-control-point.html
@@ -0,0 +1,56 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Custom Control Point Examle</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( $('map') );
+
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+
+            var control = new OpenLayers.Control();
+            OpenLayers.Util.extend(control, {
+                draw: function () {
+                    // this Handler.Point will intercept the shift-mousedown
+                    // before Control.MouseDefault gets to see it
+                    this.point = new OpenLayers.Handler.Point( control,
+                        {"done": this.notice},
+                        {keyMask: OpenLayers.Handler.MOD_SHIFT});
+                    this.point.activate();
+                },
+
+                notice: function (bounds) {
+                    document.getElementById('bounds').innerHTML = bounds;
+                }
+            });
+
+            map.addLayer(layer);
+            map.addControl(control);
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">Custom Control Point Example</h1>
+
+      <div id="tags">
+      </div>
+
+      <p id="shortdesc">
+          Demonstrate the addition of a point reporting control to the OpenLayers window.
+      </p>
+
+    <div id="map" class="smallmap"></div>
+    <div id="bounds"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/custom-control.html b/examples/custom-control.html
new file mode 100644
index 0000000..203ddcd
--- /dev/null
+++ b/examples/custom-control.html
@@ -0,0 +1,59 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>Custom Control Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var lon = 5;
+            var lat = 40;
+            var zoom = 5;
+            var map, layer;
+
+            function init(){
+                map = new OpenLayers.Map('map');
+                layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                        "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+
+                var control = new OpenLayers.Control();
+                OpenLayers.Util.extend(control, {
+                    draw: function () {
+                        // this Handler.Box will intercept the shift-mousedown
+                        // before Control.MouseDefault gets to see it
+                        this.box = new OpenLayers.Handler.Box( control,
+                            {"done": this.notice},
+                            {keyMask: OpenLayers.Handler.MOD_SHIFT});
+                        this.box.activate();
+                    },
+
+                    notice: function (bounds) {
+                        var ll = map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.left, bounds.bottom)); 
+                        var ur = map.getLonLatFromPixel(new OpenLayers.Pixel(bounds.right, bounds.top)); 
+                        alert(ll.lon.toFixed(4) + ", " + 
+                              ll.lat.toFixed(4) + ", " + 
+                              ur.lon.toFixed(4) + ", " + 
+                              ur.lat.toFixed(4));
+                    }
+                });
+
+                map.addLayer(layer);
+                map.addControl(control);
+                map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Custom Control Example</h1>
+
+          <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Demonstrate the addition of a draggable rectangle to the OpenLayers window.
+        </p>
+      
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs"></div>
+    </body>
+</html>
diff --git a/examples/custom-style.html b/examples/custom-style.html
new file mode 100644
index 0000000..729ae50
--- /dev/null
+++ b/examples/custom-style.html
@@ -0,0 +1,61 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>Custom Style Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            p {
+                width: 500px;
+            }
+            div.olControlMousePosition {
+                font-family: Verdana;
+                font-size: 0.5em;
+                color: red;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var lon = 5;
+            var lat = 40;
+            var zoom = 5;
+            var map, layer;
+
+            function init(){
+                var options = {theme: null};
+                map = new OpenLayers.Map('map', options);
+                layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                        "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+
+                map.addControl(new OpenLayers.Control.MousePosition());
+                map.addLayer(layer);
+                map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Custom Style Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Demonstrate changing CSS styles on controls in the OpenLayers window.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs">
+           <p>If you care to modify the style of any OpenLayers element, include
+           the default stylesheet as a link and declare any style modifications
+           below that link.  These style declarations can be in other linked
+           stylesheets or in style tags.  In addition, construct your map with
+           options that include {theme: null}.  This will disable the default
+           method of loading the stylesheet and allow you to declare style rules
+           in your own linked stylesheets or style tags.</p>
+           <p>This example shows how to declare the font family, size, and color
+           for the mouse position.  Note that only the style keys that you want to
+           modify (change from the default) need to be specified.</p>
+        </div>
+    </body>
+</html>
diff --git a/examples/data/line.json b/examples/data/line.json
new file mode 100644
index 0000000..942a920
--- /dev/null
+++ b/examples/data/line.json
@@ -0,0 +1,10 @@
+{
+    "type": "FeatureCollection",
+    "features": [
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_458", "properties":{}, "geometry":{"type":"LineString", "coordinates":[[-121.640625, 24.2578125], [-78.046875, 27.7734375], [-45.703125, 24.9609375], [-13.359375, 16.5234375], [12.65625, 6.6796875], [39.375, 1.0546875], [76.640625, 1.0546875], [108.28125, 1.7578125], [156.09375, 15.8203125]]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}},
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_1111", "properties":{}, "geometry":{"type":"LineString", "coordinates":[[-122.34375, -35.5078125], [-48.515625, -33.3984375], [-5.625, -37.6171875], [20.390625, -32.6953125], [69.609375, -34.1015625], [121.640625, -38.3203125], [150.46875, -33.3984375]]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}},
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_634", "properties":{}, "geometry":{"type":"LineString", "coordinates":[[-54.84375, 69.9609375], [-56.953125, 31.9921875], [-56.953125, 5.2734375], [-65.390625, -34.8046875], [-66.09375, -61.5234375]]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}},
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_820", "properties":{}, "geometry":{"type":"LineString", "coordinates":[[39.375, 58.0078125], [42.890625, 25.6640625], [42.1875, -1.0546875], [37.96875, -50.2734375], [37.265625, -64.3359375]]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}},
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_1280", "properties":{}, "geometry":{"type":"LineString", "coordinates":[[101.25, 42.5390625], [106.875, 13.7109375], [106.171875, -17.9296875], [104.765625, -49.5703125], [102.65625, -67.1484375]]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}
+    ]
+}
\ No newline at end of file
diff --git a/examples/data/point.json b/examples/data/point.json
new file mode 100644
index 0000000..96b934e
--- /dev/null
+++ b/examples/data/point.json
@@ -0,0 +1,8 @@
+{
+    "type": "FeatureCollection",
+    "features": [
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_1721", "properties":{}, "geometry":{"type":"Point", "coordinates":[-89.296875, -14.4140625]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}},
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_1715", "properties":{}, "geometry":{"type":"Point", "coordinates":[-25.3125, -54.4921875]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}},
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_1709", "properties":{}, "geometry":{"type":"Point", "coordinates":[73.828125, -23.5546875]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}
+    ]
+}
\ No newline at end of file
diff --git a/examples/data/poly.json b/examples/data/poly.json
new file mode 100644
index 0000000..f15c0e9
--- /dev/null
+++ b/examples/data/poly.json
@@ -0,0 +1,9 @@
+{
+    "type": "FeatureCollection",
+    "features": [
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_1489", "properties":{}, "geometry":{"type":"Polygon", "coordinates":[[[-109.6875, 63.6328125], [-112.5, 35.5078125], [-85.078125, 34.8046875], [-68.90625, 39.7265625], [-68.203125, 67.1484375], [-109.6875, 63.6328125]]]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}},
+        {"type":"Feature", "id":"OpenLayers.Feature.Vector_1668", "properties":{}, "geometry":{"type":"Polygon", "coordinates":[[[-40.78125, 65.0390625], [-40.078125, 34.8046875], [-12.65625, 25.6640625], [21.09375, 17.2265625], [22.5, 58.0078125], [-40.78125, 65.0390625]]]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}
+    ]
+}
+
+
diff --git a/examples/data/roads.json b/examples/data/roads.json
new file mode 100644
index 0000000..c6d4866
--- /dev/null
+++ b/examples/data/roads.json
@@ -0,0 +1,349 @@
+{
+"type": "FeatureCollection",
+"features": [
+{ "type": "Feature", "properties": { "LINK_ID": 30760460.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "KVARNGATAN", "L_REFADDR": "24", "L_NREFADDR": "22", "R_REFADDR": "27", "R_NREFADDR": "23", "SPEED_CAT": "6", "ZIPCODE": "59333", "SHAPE_LEN": 41.871700 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549555.330250, 6403958.170400 ], [ 1549594.439950, 6403973.130400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730499.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 2, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 46.382600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549497.669850, 6403707.960000 ], [ 1549491.100000, 6403710.100000 ], [ 1549488.039950, 6403716.750400 ], [ 1549488.540100, 6403724.55 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760556.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "BRUNNSGATAN", "L_REFADDR": "24", "L_NREFADDR": "16", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 70.310600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549754.276900, 6403854.802400 ], [ 1549728.459850, 6403920.200000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760712.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "9", "R_NREFADDR": "9", "SPEED_CAT": "6", "ZIPCODE": "59332", "SHAPE_LEN": 40.068900 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549571.899950, 6403675.450400 ], [ 1549592.674200, 6403684.530400 ], [ 1549608.619850, 6403691.500000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30837043.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "BREDGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 78.203400 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549741.089950, 6403765.520000 ], [ 1549730.790150, 6403779.880000 ], [ 1549703.919950, 6403834.130400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80545558.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "NORRA VARVSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 20.687400 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549909.400050, 6403973.670400 ], [ 1549900.829950, 6403992.491200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760549.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "38", "L_NREFADDR": "36", "R_REFADDR": "33", "R_NREFADDR": "31", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 32.788800 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549878.029900, 6403861.890400 ], [ 1549867.520100, 6403892.960000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547479.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "BREDGATAN", "L_REFADDR": "18", "L_NREFADDR": "14", "R_REFADDR": "15", "R_NREFADDR": "13", "SPEED_CAT": "8", "ZIPCODE": "59330", "SHAPE_LEN": 15.654700 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549645.069900, 6403971.520000 ], [ 1549638.940000, 6403985.930400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760575.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "BREDGATAN", "L_REFADDR": "24", "L_NREFADDR": "14", "R_REFADDR": "19", "R_NREFADDR": "13", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 118.385000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549703.919950, 6403834.130400 ], [ 1549656.739950, 6403942.710400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760608.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "32", "L_NREFADDR": "32", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 74.462800 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549566.450100, 6403780.090400 ], [ 1549635.170150, 6403808.780000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547481.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "KVARNGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 13.834500 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549625.900050, 6403981.310400 ], [ 1549638.940000, 6403985.930400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730495.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 63.537000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549535.370100, 6403692.830400 ], [ 1549549.530050, 6403703.030400 ], [ 1549570.300100, 6403708.850400 ], [ 1549570.600050, 6403733.36 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80545560.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 20.545100 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549927.119850, 6403985.020000 ], [ 1549944.182350, 6403996.455200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760664.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "3", "R_NREFADDR": "1", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 59.030600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549679.130150, 6403720.210400 ], [ 1549717.099900, 6403730.700000 ], [ 1549726.590150, 6403734.160000 ], [ 154973 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547480.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "KVARNGATAN", "L_REFADDR": "20", "L_NREFADDR": "20", "R_REFADDR": "21", "R_NREFADDR": "21", "SPEED_CAT": "6", "ZIPCODE": "59333", "SHAPE_LEN": 12.375300 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549614.030150, 6403977.820000 ], [ 1549621.149850, 6403980.140000 ], [ 1549625.900050, 6403981.310400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760739.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "13", "R_NREFADDR": "11", "SPEED_CAT": "6", "ZIPCODE": "59332", "SHAPE_LEN": 57.793000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549522.250000, 6403645.880000 ], [ 1549571.899950, 6403675.450400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80545557.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "NORRA VARVSGATAN", "L_REFADDR": "26", "L_NREFADDR": "20", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 62.216100 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549929.770050, 6403914.890400 ], [ 1549909.400050, 6403973.670400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760610.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "SLOTTSHOLMSV�GEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 60.324700 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549921.910100, 6403780.010400 ], [ 1549931.136800, 6403785.640000 ], [ 1549946.150050, 6403794.800000 ], [ 1549960.880 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760475.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "SP�TORGET", "L_REFADDR": "9", "L_NREFADDR": "1", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "8", "ZIPCODE": "59330", "SHAPE_LEN": 70.301600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549656.739950, 6403942.710400 ], [ 1549631.800000, 6403936.830400 ], [ 1549614.030150, 6403977.820000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547460.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "KVARNGATAN", "L_REFADDR": "30", "L_NREFADDR": "26", "R_REFADDR": "31", "R_NREFADDR": "29", "SPEED_CAT": "6", "ZIPCODE": "59333", "SHAPE_LEN": 62.288000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549496.649950, 6403937.400000 ], [ 1549525.699950, 6403946.670400 ], [ 1549555.330250, 6403958.170400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547482.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 22.019100 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549645.069900, 6403971.520000 ], [ 1549637.249850, 6403978.110400 ], [ 1549633.070150, 6403979.170400 ], [ 1549625.900050, 6403981.310 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730502.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 2, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 26.440100 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549535.370100, 6403692.830400 ], [ 1549528.510100, 6403718.360000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730491.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "48", "L_NREFADDR": "48", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 53.485400 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549608.619850, 6403691.500000 ], [ 1549600.079850, 6403708.100000 ], [ 1549584.219950, 6403739.090400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760461.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 2, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "R�DHUSGATAN", "L_REFADDR": "52", "L_NREFADDR": "50", "R_REFADDR": "43", "R_NREFADDR": "41", "SPEED_CAT": "6", "ZIPCODE": "59333", "SHAPE_LEN": 62.397200 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549555.330250, 6403958.170400 ], [ 1549531.400050, 6404015.800000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760674.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 13.834500 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549666.080050, 6403715.590400 ], [ 1549679.130150, 6403720.210400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80545555.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "SLOTTSHOLMSV�GEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 185.679000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549968.489850, 6403817.350400 ], [ 1549977.779900, 6403836.400000 ], [ 1549983.460050, 6403858.740000 ], [ 1549982.53 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760515.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "NORRA VARVSGATAN", "L_REFADDR": "30", "L_NREFADDR": "28", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 22.968600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549938.960000, 6403893.840000 ], [ 1549929.770050, 6403914.890400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760497.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "KVARNGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59333", "SHAPE_LEN": 24.829800 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549488.599950, 6403913.910400 ], [ 1549496.649950, 6403937.400000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30837044.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 146.769000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549776.080150, 6403777.100000 ], [ 1549785.590000, 6403778.330400 ], [ 1549886.280100, 6403772.890400 ], [ 1549908.48445 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760477.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "BRUNNSGATAN", "L_REFADDR": "14", "L_NREFADDR": "12", "R_REFADDR": "19", "R_NREFADDR": "11", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 78.700300 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549723.519950, 6403934.620000 ], [ 1549697.600000, 6404008.930400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760542.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "22", "L_NREFADDR": "18", "R_REFADDR": "29", "R_NREFADDR": "21", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 34.587000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549798.179850, 6403867.590400 ], [ 1549830.790050, 6403879.130400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760457.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "NYGATAN", "L_REFADDR": "8", "L_NREFADDR": "6", "R_REFADDR": "15", "R_NREFADDR": "7", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 45.468000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549796.459950, 6403958.910400 ], [ 1549839.739900, 6403972.810400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573703846.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 8.208130 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549734.260050, 6403739.820000 ], [ 1549738.939900, 6403746.560000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760631.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 46.824600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549741.290150, 6403748.820000 ], [ 1549753.539450, 6403766.201600 ], [ 1549754.750100, 6403767.920000 ], [ 1549761.249950 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760491.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "BRUNNSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 15.240700 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549728.459850, 6403920.200000 ], [ 1549723.519950, 6403934.620000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760566.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "NORRA VARVSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 54.648300 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549960.410100, 6403843.980000 ], [ 1549959.139950, 6403850.640000 ], [ 1549952.470000, 6403860.580000 ], [ 1549938.960 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547447.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 13.369300 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549927.421200, 6403767.822400 ], [ 1549921.910100, 6403780.010400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730503.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 44.681900 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549528.510100, 6403718.360000 ], [ 1549570.600050, 6403733.360000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80545559.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 21.047100 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549909.400050, 6403973.670400 ], [ 1549927.119850, 6403985.020000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547444.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 46.504800 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549967.599100, 6403744.932000 ], [ 1549943.650000, 6403755.770400 ], [ 1549927.421200, 6403767.822400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730492.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 44.681800 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549584.219950, 6403739.090400 ], [ 1549566.450100, 6403780.090400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760700.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "7", "R_NREFADDR": "5", "SPEED_CAT": "6", "ZIPCODE": "59332", "SHAPE_LEN": 62.310700 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549608.619850, 6403691.500000 ], [ 1549666.080050, 6403715.590400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760611.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 51.110800 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549921.910100, 6403780.010400 ], [ 1549913.480000, 6403787.710400 ], [ 1549891.640000, 6403820.850400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547478.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "BREDGATAN", "L_REFADDR": "24", "L_NREFADDR": "20", "R_REFADDR": "19", "R_NREFADDR": "17", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 31.088600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549656.739950, 6403942.710400 ], [ 1549645.069900, 6403971.520000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760451.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "KVARNGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59333", "SHAPE_LEN": 20.146600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549594.439950, 6403973.130400 ], [ 1549614.030150, 6403977.820000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760525.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "16", "L_NREFADDR": "14", "R_REFADDR": "19", "R_NREFADDR": "15", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 39.254300 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549830.790050, 6403879.130400 ], [ 1549867.520100, 6403892.960000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760497.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59333", "SHAPE_LEN": 24.829800 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549488.599950, 6403913.910400 ], [ 1549496.649950, 6403937.400000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573703847.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 3.259030 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549738.939900, 6403746.560000 ], [ 1549741.290150, 6403748.820000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730500.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 31.544900 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549528.510100, 6403718.360000 ], [ 1549511.590050, 6403738.200000 ], [ 1549506.220000, 6403739.250400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730504.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 32.542600 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549497.669850, 6403707.960000 ], [ 1549528.510100, 6403718.360000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760589.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "", "CHANGED": "", "USERID": "", "ST_NAME": "BRUNNSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "23", "R_NREFADDR": "21", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 47.569300 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549771.489900, 6403810.460000 ], [ 1549754.276900, 6403854.802400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270836", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 34.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549967.599100, 6403744.932000 ], [ 1549999.352500, 6403730.830400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270839", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 9.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549967.599100, 6403744.932000 ], [ 1549975.575600, 6403750.824800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270840", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 18.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549975.575600, 6403750.824800 ], [ 1549992.301750, 6403743.152800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 22, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270840", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 16.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1550001.325450, 6403756.464000 ], [ 1549992.301750, 6403743.152800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270842", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 12.300000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549927.421200, 6403767.822400 ], [ 1549936.717550, 6403775.876000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270842", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 46.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549936.717550, 6403775.876000 ], [ 1549958.789600, 6403758.524000 ], [ 1549975.575600, 6403750.824800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547691.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 2, "LOGKOD": "R", "CHANGED": "0808270844", "USERID": "LO-JKP", "ST_NAME": "NORRA BANGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 209.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549937.660100, 6403662.140000 ], [ 1549881.800100, 6403701.550400 ], [ 1549764.730000, 6403731.290400  [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547691.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 2, "LOGKOD": "R", "CHANGED": "0808270844", "USERID": "LO-JKP", "ST_NAME": "NORRA BANGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 11.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549745.501350, 6403736.423200 ], [ 1549734.260050, 6403739.820000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270847", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 32.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549927.421200, 6403767.822400 ], [ 1549930.803600, 6403753.404000 ], [ 1549928.832400, 6403735.662400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270847", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 53.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549928.832400, 6403735.662400 ], [ 1549962.732350, 6403727.381600 ], [ 1549967.599100, 6403744.932000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270848", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 44.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549928.832400, 6403735.662400 ], [ 1549886.025300, 6403747.621600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270848", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 11.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549886.025300, 6403747.621600 ], [ 1549875.211350, 6403750.643200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270848", "USERID": "LO-JKP", "ST_NAME": "STATIONSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 19.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549888.409150, 6403767.056000 ], [ 1549886.025300, 6403747.621600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270922", "USERID": "LO-JKP", "ST_NAME": "HALLSTR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 20.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549745.501350, 6403736.423200 ], [ 1549760.669300, 6403722.331200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270923", "USERID": "LO-JKP", "ST_NAME": "HALLSTR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 126.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549760.669300, 6403722.331200 ], [ 1549771.919700, 6403716.340800 ], [ 1549815.248650, 6403610.940000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547535.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 1, "LOGKOD": "R", "CHANGED": "0808270933", "USERID": "LO-JKP", "ST_NAME": "ESPLANADEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "5", "R_NREFADDR": "1", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 5.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549681.045700, 6403715.598400 ], [ 1549679.130150, 6403720.210400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270933", "USERID": "LO-JKP", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 68.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549745.501350, 6403736.423200 ], [ 1549740.387150, 6403731.321600 ], [ 1549681.045700, 6403715.598400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760732.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 2, "LOGKOD": "R", "CHANGED": "0808270934", "USERID": "LO-JKP", "ST_NAME": "ESPLANADEN", "L_REFADDR": "2", "L_NREFADDR": "2", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59332", "SHAPE_LEN": 56.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549683.510050, 6403654.550400 ], [ 1549667.935400, 6403709.100000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760732.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 2, "LOGKOD": "R", "CHANGED": "0808270934", "USERID": "LO-JKP", "ST_NAME": "ESPLANADEN", "L_REFADDR": "2", "L_NREFADDR": "2", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59332", "SHAPE_LEN": 6.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549667.935400, 6403709.100000 ], [ 1549666.080050, 6403715.590400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270934", "USERID": "LO-JKP", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 14.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549681.045700, 6403715.598400 ], [ 1549667.935400, 6403709.100000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270935", "USERID": "LO-JKP", "ST_NAME": "HALLSTR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 40.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549763.755600, 6403714.004800 ], [ 1549738.019750, 6403704.509600 ], [ 1549731.660600, 6403715.640800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547428.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270936", "USERID": "LO-JKP", "ST_NAME": "HALLSTR�MSGATAN", "L_REFADDR": "10", "L_NREFADDR": "2", "R_REFADDR": "1", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59331", "SHAPE_LEN": 15.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549766.018350, 6403708.067200 ], [ 1549763.755600, 6403714.004800 ], [ 1549760.669300, 6403722.33 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270936", "USERID": "LO-JKP", "ST_NAME": "HALLSTR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 48.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549766.018350, 6403708.067200 ], [ 1549736.048550, 6403696.628800 ], [ 1549743.183300, 6403681.558400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547428.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270936", "USERID": "LO-JKP", "ST_NAME": "HALLSTR�MSGATAN", "L_REFADDR": "10", "L_NREFADDR": "2", "R_REFADDR": "1", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59331", "SHAPE_LEN": 22.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549774.118750, 6403686.709600 ], [ 1549766.018350, 6403708.067200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270936", "USERID": "LO-JKP", "ST_NAME": "HALLSTR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 36.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549774.118750, 6403686.709600 ], [ 1549747.876450, 6403676.916800 ], [ 1549751.868550, 6403670.136800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547428.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808270937", "USERID": "LO-JKP", "ST_NAME": "HALLSTR�MSGATAN", "L_REFADDR": "10", "L_NREFADDR": "2", "R_REFADDR": "1", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59331", "SHAPE_LEN": 25.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549783.651700, 6403662.588800 ], [ 1549778.530150, 6403674.660000 ], [ 1549774.118750, 6403686.70 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547535.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 1, "LOGKOD": "R", "CHANGED": "0808270938", "USERID": "LO-JKP", "ST_NAME": "ESPLANADEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "5", "R_NREFADDR": "1", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 18.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549703.060000, 6403662.590400 ], [ 1549695.854900, 6403679.940000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547535.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 1, "LOGKOD": "R", "CHANGED": "0808270938", "USERID": "LO-JKP", "ST_NAME": "ESPLANADEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "5", "R_NREFADDR": "1", "SPEED_CAT": "6", "ZIPCODE": "59331", "SHAPE_LEN": 38.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549695.854900, 6403679.940000 ], [ 1549681.045700, 6403715.598400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270938", "USERID": "LO-JKP", "ST_NAME": "ESPLANADEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 27.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549695.854900, 6403679.940000 ], [ 1549710.817400, 6403684.797600 ], [ 1549716.384850, 6403674.867200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808270939", "USERID": "LO-JKP", "ST_NAME": "ESPLANADEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 18.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549704.982200, 6403658.172000 ], [ 1549717.515000, 6403662.725600 ], [ 1549719.527500, 6403657.506400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271124", "USERID": "LO-JKP", "ST_NAME": "F�NGELSETORGET", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 192.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549908.200950, 6403637.271200 ], [ 1549910.100750, 6403648.924800 ], [ 1549887.237000, 6403693.868800 ], [ 154 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 1900112527.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 2, "LOGKOD": "R", "CHANGED": "0808271126", "USERID": "LO-JKP", "ST_NAME": "F�NGELSETORGET", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 100.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549809.770450, 6403695.048800 ], [ 1549792.424450, 6403687.958400 ], [ 1549824.218800, 6403612.351200 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271126", "USERID": "LO-JKP", "ST_NAME": "F�NGELSETOGET", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 17.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549817.102950, 6403710.910400 ], [ 1549809.770450, 6403695.048800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547449.000000, "RP_TYPE": 10, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271128", "USERID": "LO-JKP", "ST_NAME": "S�DRA VARVSGATAN", "L_REFADDR": "40", "L_NREFADDR": "32", "R_REFADDR": "21", "R_NREFADDR": "15", "SPEED_CAT": "6", "ZIPCODE": "59350", "SHAPE_LEN": 23.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549989.554600, 6403806.848000 ], [ 1549976.880050, 6403812.990400 ], [ 1549968.489850, 640381 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730501.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271500", "USERID": "LO-JKP", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 9.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549570.600050, 6403733.360000 ], [ 1549579.722100, 6403737.201600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730501.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271500", "USERID": "LO-JKP", "ST_NAME": "", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 4.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549579.722100, 6403737.201600 ], [ 1549584.219950, 6403739.090400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 573730505.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271504", "USERID": "LO-JKP", "ST_NAME": "L�ROVERKSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59333", "SHAPE_LEN": 79.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549471.922100, 6403800.288000 ], [ 1549539.838900, 6403825.187200 ], [ 1549546.809850, 6403827.740000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271508", "USERID": "LO-JKP", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59332", "SHAPE_LEN": 23.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549574.529850, 6403669.305600 ], [ 1549580.125650, 6403672.576800 ], [ 1549595.345750, 6403678.918400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271508", "USERID": "LO-JKP", "ST_NAME": "S�DRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59332", "SHAPE_LEN": 80.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549595.345750, 6403678.918400 ], [ 1549617.976400, 6403688.348000 ], [ 1549648.329450, 6403702.939200 ], [ [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271508", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59333", "SHAPE_LEN": 68.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549579.722100, 6403737.201600 ], [ 1549586.633550, 6403729.352000 ], [ 1549598.065250, 6403704.509600 ], [ 15 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271508", "USERID": "LO-JKP", "ST_NAME": "KVARNGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59333", "SHAPE_LEN": 185.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549495.671350, 6403901.486400 ], [ 1549498.716350, 6403900.056000 ], [ 1549509.356700, 6403886.655200 ], [ 1549520 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547462.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271508", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "44", "L_NREFADDR": "38", "R_REFADDR": "61", "R_NREFADDR": "53", "SPEED_CAT": "7", "ZIPCODE": "59333", "SHAPE_LEN": 14.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549501.325600, 6403908.552800 ], [ 1549497.550150, 6403911.790400 ], [ 1549488.599950, 640391 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271508", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59333", "SHAPE_LEN": 9.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549495.671350, 6403901.486400 ], [ 1549501.325600, 6403908.552800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271509", "USERID": "LO-JKP", "ST_NAME": "SLOTTHOLMSLEDEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 29.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549745.501350, 6403736.423200 ], [ 1549760.487650, 6403761.674400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271509", "USERID": "LO-JKP", "ST_NAME": "SLOTTHOLMSLEDEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 130.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549760.487650, 6403761.674400 ], [ 1549773.107600, 6403768.775200 ], [ 1549794.000150, 6403771.925600 ], [ 15 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760574.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271509", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "26", "L_NREFADDR": "24", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 5.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549703.919950, 6403834.130400 ], [ 1549709.114300, 6403836.262400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760574.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271509", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "26", "L_NREFADDR": "24", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 48.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549709.114300, 6403836.262400 ], [ 1549754.276900, 6403854.802400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760590.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271510", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "30", "L_NREFADDR": "28", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 37.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549635.170150, 6403808.780000 ], [ 1549670.099800, 6403821.660000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271510", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 45.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549670.099800, 6403821.660000 ], [ 1549661.138750, 6403843.681600 ], [ 1549652.074100, 6403839.340800 ], [ 15496 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760590.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271511", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "30", "L_NREFADDR": "28", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 4.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549670.099800, 6403821.660000 ], [ 1549674.526600, 6403823.292000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760590.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271511", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "30", "L_NREFADDR": "28", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 31.300000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549674.526600, 6403823.292000 ], [ 1549703.919950, 6403834.130400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271511", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 23.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549674.526600, 6403823.292000 ], [ 1549664.644350, 6403844.952000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271512", "USERID": "LO-JKP", "ST_NAME": "BREDGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 47.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549760.487650, 6403761.674400 ], [ 1549753.539450, 6403766.201600 ], [ 1549734.473200, 6403778.625600 ], [ 1549728.0 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271513", "USERID": "LO-JKP", "ST_NAME": "BREDGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 9.300000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549728.022350, 6403793.287200 ], [ 1549724.270700, 6403801.813600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271513", "USERID": "LO-JKP", "ST_NAME": "BREDGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 37.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549724.270700, 6403801.813600 ], [ 1549709.114300, 6403836.262400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271514", "USERID": "LO-JKP", "ST_NAME": "BREDGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 51.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549754.276900, 6403854.802400 ], [ 1549737.228050, 6403806.618400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271514", "USERID": "LO-JKP", "ST_NAME": "BREDGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 13.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549737.228050, 6403806.618400 ], [ 1549724.270700, 6403801.813600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547503.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271514", "USERID": "LO-JKP", "ST_NAME": "BRUNNSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "25", "R_NREFADDR": "25", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 17.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549774.889100, 6403793.607200 ], [ 1549771.489900, 6403810.460000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271514", "USERID": "LO-JKP", "ST_NAME": "BRUNNSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 40.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549737.228050, 6403806.618400 ], [ 1549769.560700, 6403793.607200 ], [ 1549774.889100, 6403793.607200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547503.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271515", "USERID": "LO-JKP", "ST_NAME": "BRUNNSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "25", "R_NREFADDR": "25", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 14.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549776.080150, 6403777.100000 ], [ 1549775.301400, 6403791.567200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547503.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271515", "USERID": "LO-JKP", "ST_NAME": "BRUNNSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "25", "R_NREFADDR": "25", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 2.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549775.301400, 6403791.567200 ], [ 1549774.889100, 6403793.607200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271516", "USERID": "LO-JKP", "ST_NAME": "SLOTTHOLMSLEDEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 23.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549888.409150, 6403767.056000 ], [ 1549894.924400, 6403766.804800 ], [ 1549911.882600, 6403767.984800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271516", "USERID": "LO-JKP", "ST_NAME": "SLOTTHOLMSLEDEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 15.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549911.882600, 6403767.984800 ], [ 1549927.421200, 6403767.822400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760596.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271516", "USERID": "LO-JKP", "ST_NAME": "NORRA J�RNV�GSGATAN", "L_REFADDR": "12", "L_NREFADDR": "6", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 68.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549818.068600, 6403799.888800 ], [ 1549884.091550, 6403818.700000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760596.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271516", "USERID": "LO-JKP", "ST_NAME": "NORRA J�RNV�GSGATAN", "L_REFADDR": "12", "L_NREFADDR": "6", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 7.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549884.091550, 6403818.700000 ], [ 1549891.640000, 6403820.850400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271516", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 58.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549911.882600, 6403767.984800 ], [ 1549908.484450, 6403777.327200 ], [ 1549905.284050, 6403786.126400 ], [ 1549884 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760579.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271517", "USERID": "LO-JKP", "ST_NAME": "NORRA J�RNV�GSGATAN", "L_REFADDR": "4", "L_NREFADDR": "2", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 6.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549891.640000, 6403820.850400 ], [ 1549897.839200, 6403822.604000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271517", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 61.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549936.717550, 6403775.876000 ], [ 1549931.136800, 6403785.640000 ], [ 1549927.257050, 6403792.427200 ], [ 1549897 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271517", "USERID": "LO-JKP", "ST_NAME": "SLOTTSHOLMSLEDEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 7.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549982.841250, 6403805.048000 ], [ 1549989.554600, 6403806.848000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271518", "USERID": "LO-JKP", "ST_NAME": "SLOTTSHOLMSLEDEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 14.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549775.301400, 6403791.567200 ], [ 1549789.273750, 6403792.036800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808271518", "USERID": "LO-JKP", "ST_NAME": "SLOTTSHOLMSLEDEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 116.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549789.273750, 6403792.036800 ], [ 1549820.418850, 6403786.116800 ], [ 1549862.599800, 6403784.936000 ], [ 1 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 16, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808271518", "USERID": "LO-JKP", "ST_NAME": "NORRA J�RNV�GSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 29.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549818.068600, 6403799.888800 ], [ 1549789.273750, 6403792.036800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547461.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280759", "USERID": "LO-JKP", "ST_NAME": "V�RDTR�DSPLAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "7", "R_NREFADDR": "3", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 93.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549635.170150, 6403808.780000 ], [ 1549633.900000, 6403814.330400 ], [ 1549618.609900, 6403847.560000  [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547461.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280759", "USERID": "LO-JKP", "ST_NAME": "V�RDTR�DSPLAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "7", "R_NREFADDR": "3", "SPEED_CAT": "6", "ZIPCODE": "59330", "SHAPE_LEN": 51.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549590.180100, 6403883.960800 ], [ 1549568.259950, 6403874.780000 ], [ 1549542.790100, 6403864.450400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280759", "USERID": "LO-JKP", "ST_NAME": "V�RDTR�DSPLAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 99.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549555.330250, 6403958.170400 ], [ 1549562.119900, 6403948.800800 ], [ 1549569.040100, 6403929.018400 ], [ 15495 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760476.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280801", "USERID": "LO-JKP", "ST_NAME": "NYGATAN", "L_REFADDR": "12", "L_NREFADDR": "10", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 62.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549723.519950, 6403934.620000 ], [ 1549782.972000, 6403954.418400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760476.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280801", "USERID": "LO-JKP", "ST_NAME": "NYGATAN", "L_REFADDR": "12", "L_NREFADDR": "10", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 14.200000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549782.972000, 6403954.418400 ], [ 1549796.459950, 6403958.910400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760555.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280803", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "33", "R_NREFADDR": "31", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 37.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549754.276900, 6403854.802400 ], [ 1549789.877500, 6403865.172000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760555.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280803", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "33", "R_NREFADDR": "31", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 8.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549789.877500, 6403865.172000 ], [ 1549798.179850, 6403867.590400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280803", "USERID": "LO-JKP", "ST_NAME": "G�STA BERNARDS GATA", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 44.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549763.127350, 6403899.236800 ], [ 1549769.602000, 6403885.904800 ], [ 1549772.571400, 6403880.964800 ], [ [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280805", "USERID": "LO-JKP", "ST_NAME": "GR�NA GR�ND", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 42.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549782.972000, 6403954.418400 ], [ 1549793.934000, 6403923.878400 ], [ 1549786.164350, 6403917.663200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280805", "USERID": "LO-JKP", "ST_NAME": "GR�NA GR�ND", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 29.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549786.164350, 6403917.663200 ], [ 1549763.127350, 6403899.236800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760512.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 2, "LOGKOD": "R", "CHANGED": "0808280806", "USERID": "LO-JKP", "ST_NAME": "TR�DG�RDSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "3", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 16.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549763.127350, 6403899.236800 ], [ 1549754.840050, 6403906.050400 ], [ 1549749.691200, 6403908.812000 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760512.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 2, "LOGKOD": "R", "CHANGED": "0808280806", "USERID": "LO-JKP", "ST_NAME": "TR�DG�RDSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "3", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 24.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549749.691200, 6403908.812000 ], [ 1549728.459850, 6403920.200000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280806", "USERID": "LO-JKP", "ST_NAME": "G�STA BERNARDS GATA", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 49.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549786.477600, 6403917.288000 ], [ 1549786.164350, 6403917.663200 ], [ 1549781.471200, 6403923.288000 ], [ [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280806", "USERID": "LO-JKP", "ST_NAME": "G�STA BERNARDS GATA", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 7.300000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549757.605750, 6403919.492000 ], [ 1549762.549850, 6403914.117600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280806", "USERID": "LO-JKP", "ST_NAME": "G�STA BERNARDS GATA", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 13.300000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549749.691200, 6403908.812000 ], [ 1549757.605750, 6403919.492000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760580.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280807", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "42", "L_NREFADDR": "40", "R_REFADDR": "37", "R_NREFADDR": "35", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 25.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549891.640000, 6403820.850400 ], [ 1549883.651250, 6403844.940000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760580.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280807", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "42", "L_NREFADDR": "40", "R_REFADDR": "37", "R_NREFADDR": "35", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 17.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549883.651250, 6403844.940000 ], [ 1549878.029900, 6403861.890400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280807", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 19.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549883.651250, 6403844.940000 ], [ 1549902.215600, 6403851.322400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760588.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "R", "CHANGED": "0808280808", "USERID": "LO-JKP", "ST_NAME": "�TERV�NDSGATAN", "L_REFADDR": "24", "L_NREFADDR": "14", "R_REFADDR": "23", "R_NREFADDR": "15", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 85.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549771.489900, 6403810.460000 ], [ 1549848.872800, 6403847.815200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760588.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "R", "CHANGED": "0808280808", "USERID": "LO-JKP", "ST_NAME": "�TERV�NDSGATAN", "L_REFADDR": "24", "L_NREFADDR": "14", "R_REFADDR": "23", "R_NREFADDR": "15", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 32.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549848.872800, 6403847.815200 ], [ 1549878.029900, 6403861.890400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280808", "USERID": "LO-JKP", "ST_NAME": "�TERV�NDSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 16.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549848.872800, 6403847.815200 ], [ 1549858.013750, 6403836.851200 ], [ 1549859.956250, 6403835.057600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280808", "USERID": "LO-JKP", "ST_NAME": "�TERV�NDSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 8.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549859.956250, 6403835.057600 ], [ 1549865.800200, 6403829.660800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280808", "USERID": "LO-JKP", "ST_NAME": "�TERV�NDSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 7.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549859.956250, 6403835.057600 ], [ 1549866.996150, 6403838.471200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760516.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280809", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "12", "L_NREFADDR": "2", "R_REFADDR": "13", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 39.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549867.520100, 6403892.960000 ], [ 1549904.353050, 6403905.936000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760516.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280809", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "12", "L_NREFADDR": "2", "R_REFADDR": "13", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 26.900000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549904.353050, 6403905.936000 ], [ 1549929.770050, 6403914.890400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760548.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280809", "USERID": "LO-JKP", "ST_NAME": "�TERV�NDSGATAN", "L_REFADDR": "12", "L_NREFADDR": "2", "R_REFADDR": "13", "R_NREFADDR": "13", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 43.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549878.029900, 6403861.890400 ], [ 1549916.095200, 6403881.850400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760548.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280809", "USERID": "LO-JKP", "ST_NAME": "�TERV�NDSGATAN", "L_REFADDR": "12", "L_NREFADDR": "2", "R_REFADDR": "13", "R_NREFADDR": "13", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 25.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549916.095200, 6403881.850400 ], [ 1549938.960000, 6403893.840000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280809", "USERID": "LO-JKP", "ST_NAME": "B�TSMANSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 26.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549904.353050, 6403905.936000 ], [ 1549912.608150, 6403888.475200 ], [ 1549916.095200, 6403881.850400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760517.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280811", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "34", "L_NREFADDR": "24", "R_REFADDR": "29", "R_NREFADDR": "19", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 23.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549848.114000, 6403950.774400 ], [ 1549839.739900, 6403972.810400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280811", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 30.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549848.114000, 6403950.774400 ], [ 1549869.289000, 6403957.700800 ], [ 1549866.484800, 6403965.702400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760517.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280812", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "34", "L_NREFADDR": "24", "R_REFADDR": "29", "R_NREFADDR": "19", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 36.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549867.520100, 6403892.960000 ], [ 1549856.605700, 6403927.937600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760517.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280812", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "34", "L_NREFADDR": "24", "R_REFADDR": "29", "R_NREFADDR": "19", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 24.400000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549856.605700, 6403927.937600 ], [ 1549855.749950, 6403930.680000 ], [ 1549848.114000, 6403950.774 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280812", "USERID": "LO-JKP", "ST_NAME": "STR�MSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 22.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549856.605700, 6403927.937600 ], [ 1549842.391850, 6403922.888000 ], [ 1549839.991550, 6403930.109600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760453.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280813", "USERID": "LO-JKP", "ST_NAME": "NYGATAN", "L_REFADDR": "4", "L_NREFADDR": "2", "R_REFADDR": "5", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 44.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549839.739900, 6403972.810400 ], [ 1549882.122450, 6403986.464000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760453.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280814", "USERID": "LO-JKP", "ST_NAME": "NYGATAN", "L_REFADDR": "4", "L_NREFADDR": "2", "R_REFADDR": "5", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 4.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549882.122450, 6403986.464000 ], [ 1549885.859750, 6403988.054400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760453.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808280814", "USERID": "LO-JKP", "ST_NAME": "NYGATAN", "L_REFADDR": "4", "L_NREFADDR": "2", "R_REFADDR": "5", "R_NREFADDR": "1", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 15.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549885.859750, 6403988.054400 ], [ 1549900.829950, 6403992.491200 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808280814", "USERID": "LO-JKP", "ST_NAME": "NYGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 30.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549885.859750, 6403988.054400 ], [ 1549892.433450, 6403972.732800 ], [ 1549900.598950, 6403962.172000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808281227", "USERID": "LO-JKP", "ST_NAME": "S�DRA VARVSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 43.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549936.717550, 6403775.876000 ], [ 1549969.438000, 6403803.858400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808281227", "USERID": "LO-JKP", "ST_NAME": "S�DRA VARVSGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59331", "SHAPE_LEN": 13.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549969.438000, 6403803.858400 ], [ 1549982.841250, 6403805.048000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760579.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808281227", "USERID": "LO-JKP", "ST_NAME": "NORRA J�RNV�GSGATAN", "L_REFADDR": "4", "L_NREFADDR": "2", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 37.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549897.839200, 6403822.604000 ], [ 1549934.253900, 6403832.906400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760579.000000, "RP_TYPE": 14, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808281227", "USERID": "LO-JKP", "ST_NAME": "NORRA J�RNV�GSGATAN", "L_REFADDR": "4", "L_NREFADDR": "2", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "7", "ZIPCODE": "59330", "SHAPE_LEN": 29.500000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549934.253900, 6403832.906400 ], [ 1549957.490050, 6403839.480000 ], [ 1549960.410100, 6403843.9 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 19, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808281227", "USERID": "LO-JKP", "ST_NAME": "SLOTTSHOLMSLEDEN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59330", "SHAPE_LEN": 45.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549969.438000, 6403803.858400 ], [ 1549962.209450, 6403808.998400 ], [ 1549954.459400, 6403814.508800 ], [ 15 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547462.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808290805", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "44", "L_NREFADDR": "38", "R_REFADDR": "61", "R_NREFADDR": "53", "SPEED_CAT": "7", "ZIPCODE": "59333", "SHAPE_LEN": 23.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549546.809850, 6403827.740000 ], [ 1549537.632500, 6403849.605600 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 80547462.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808290805", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "44", "L_NREFADDR": "38", "R_REFADDR": "61", "R_NREFADDR": "53", "SPEED_CAT": "7", "ZIPCODE": "59333", "SHAPE_LEN": 70.100000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549537.632500, 6403849.605600 ], [ 1549533.320150, 6403859.880000 ], [ 1549518.660050, 640388 [...]
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808290805", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59333", "SHAPE_LEN": 46.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549537.632500, 6403849.605600 ], [ 1549561.402400, 6403858.662400 ], [ 1549569.328850, 6403839.652000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760609.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808290829", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "46", "L_NREFADDR": "46", "R_REFADDR": "65", "R_NREFADDR": "63", "SPEED_CAT": "7", "ZIPCODE": "59333", "SHAPE_LEN": 26.800000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549566.450100, 6403780.090400 ], [ 1549555.974950, 6403804.818400 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760609.000000, "RP_TYPE": 12, "RP_FUNC": 1, "DIRECTION": 0, "LOGKOD": "R", "CHANGED": "0808290829", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "46", "L_NREFADDR": "46", "R_REFADDR": "65", "R_NREFADDR": "63", "SPEED_CAT": "7", "ZIPCODE": "59333", "SHAPE_LEN": 24.700000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549555.974950, 6403804.818400 ], [ 1549546.809850, 6403827.740000 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 0.000000, "RP_TYPE": 18, "RP_FUNC": 0, "DIRECTION": 0, "LOGKOD": "D", "CHANGED": "0808290829", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "", "L_NREFADDR": "", "R_REFADDR": "", "R_NREFADDR": "", "SPEED_CAT": "", "ZIPCODE": "59333", "SHAPE_LEN": 37.600000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549555.974950, 6403804.818400 ], [ 1549577.560500, 6403813.319200 ], [ 1549572.603450, 6403826.820800 ] ] } }
+,
+{ "type": "Feature", "properties": { "LINK_ID": 30760474.000000, "RP_TYPE": 12, "RP_FUNC": 0, "DIRECTION": 1, "LOGKOD": "R", "CHANGED": "0808290830", "USERID": "LO-JKP", "ST_NAME": "�STRA KYRKOGATAN", "L_REFADDR": "36", "L_NREFADDR": "32", "R_REFADDR": "51", "R_NREFADDR": "49", "SPEED_CAT": "6", "ZIPCODE": "59333", "SHAPE_LEN": 58.000000 }, "geometry": { "type": "LineString", "coordinates": [ [ 1549496.649950, 6403937.400000 ], [ 1549483.100050, 6403973.990400 ], [ 1549475.242550, 640399 [...]
+
+]
+}
diff --git a/examples/debug.html b/examples/debug.html
new file mode 100644
index 0000000..a960bea
--- /dev/null
+++ b/examples/debug.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Debug Example</title>
+        <link rel="stylesheet" href="style.css" type="text/css" />        
+        <script src="../lib/Firebug/firebug.js"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            function consoleLog() {
+                OpenLayers.Console.log("This is the result of an OpenLayers.Console.log() call");
+            }
+            function consoleWarn() {
+                OpenLayers.Console.warn("This is the result of an OpenLayers.Console.warn() call");
+            }
+            function consoleError() {
+                OpenLayers.Console.error("This is the result of an OpenLayers.Console.error() call");
+            }
+            function consoleDir() {
+                OpenLayers.Console.dir(OpenLayers);
+            }
+            function consoleDirxml() {
+                OpenLayers.Console.dirxml(document.getElementsByTagName('body')[0]);
+            }
+        </script>
+    </head>
+    <body>
+        <h1 id="title">Debug Example</h1>
+
+        <div id="tags"></div>
+
+        <p id="shortdesc">
+            Demonstrate console calls to a Firebug console. Requires Firefox. Mostly for developers.
+        </p>
+
+        <div id="docs">
+            <p>To run OpenLayers in debug mode, include the following script
+            tag <b>before</b> the tag that loads OpenLayers:
+
+            <pre>    <script src="../lib/Firebug/firebug.js"></script></pre>
+
+            The path to firebug.js must be relative to your
+            html file.  With this script included calls to OpenLayers.Console
+            will be displayed in the Firebug console.  For browsers without
+            the Firebug extension, the script creates a Firebug Lite console.
+            This console can be opened by hitting <b>F12</b> or <b>Ctrl+Shift+L</b>
+            (<b>?+Shift+L</b> on a Mac).  If you want the Firebug Lite console
+            to be open when the page loads, add <b>debug="true"</b> to the opening
+            html tag of your page.  Open the console and click on the links below
+            to see console calls.</p>
+            <ul>
+                <li>
+                    <a href="javascript: void(consoleLog());">OpenLayers.Console.log()</a>
+                </li>
+                <li>
+                    <a href="javascript: void(consoleWarn());">OpenLayers.Console.warn()</a>
+                </li>
+                <li>
+                    <a href="javascript: void(consoleError());">OpenLayers.Console.error()</a>
+                </li>
+                <li>
+                    <a href="javascript: void(consoleDir());">OpenLayers.Console.dir()</a>
+                </li>
+                <li>
+                    <a href="javascript: void(consoleDirxml());">OpenLayers.Console.dirxml()</a>
+                </li>
+            </ul>
+            <p>The Firebug website has a complete list of
+            <a href="http://www.getfirebug.com/console.html">console calls</a>.
+            Note that not all are supported with Firebug Lite.</p>
+        </div>
+    </body>
+</html>
diff --git a/examples/document-drag.html b/examples/document-drag.html
new file mode 100644
index 0000000..9db32a1
--- /dev/null
+++ b/examples/document-drag.html
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Document Drag Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        function init(){
+            map = new OpenLayers.Map( 'map', {controls: [
+                new OpenLayers.Control.Navigation({documentDrag: true}),
+                new OpenLayers.Control.PanZoom(),
+                new OpenLayers.Control.ArgParser(),
+                new OpenLayers.Control.Attribution()
+            ]} );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} );
+            map.addLayer(layer);
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Document Drag Example</h1>
+
+    <div id="tags"></div>
+
+    <div id="shortdesc">Keep on dragging even when the mouse cursor moves outside of the map</div>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        This example shows how to make a map draggable outside of the map itself.
+    </div>
+  </body>
+</html>
diff --git a/examples/doubleSetCenter.html b/examples/doubleSetCenter.html
new file mode 100644
index 0000000..a3fb1a2
--- /dev/null
+++ b/examples/doubleSetCenter.html
@@ -0,0 +1,32 @@
+<html>
+    <head>
+        <title>OpenLayers Double Set Center Example</title>
+       
+        <script src="../lib/OpenLayers.js"></script>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+    </head>
+    <body>
+        <h1 id="title">Double Set Center Example</h1>
+
+        <div id="tags"></div>
+
+        <p id="shortdesc">
+            Demonstrate the behavior of two calls to set the center after instatiating the layer object.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+    
+        <script defer="defer" type="text/javascript">
+            var map = new OpenLayers.Map('map');
+            var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(wms);
+            map.setCenter(new OpenLayers.LonLat(100,10));
+            map.setCenter(new OpenLayers.LonLat(1,1));
+        </script>
+
+        <div id="docs"></div>
+    </body>
+</html>
+
diff --git a/examples/drag-feature.html b/examples/drag-feature.html
new file mode 100644
index 0000000..1e6d21c
--- /dev/null
+++ b/examples/drag-feature.html
@@ -0,0 +1,102 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>Drag Feature Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            #controls {
+                width: 512px;
+            }
+            #controlToggle {
+                padding-left: 1em;
+            }
+            #controlToggle li {
+                list-style: none;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map, vectors, controls;
+            function init(){
+                map = new OpenLayers.Map('map');
+                var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'});
+    
+                vectors = new OpenLayers.Layer.Vector("Vector Layer");
+
+                map.addLayers([wms, vectors]);
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                map.addControl(new OpenLayers.Control.MousePosition());
+
+                controls = {
+                    point: new OpenLayers.Control.DrawFeature(vectors,
+                                OpenLayers.Handler.Point),
+                    line: new OpenLayers.Control.DrawFeature(vectors,
+                                OpenLayers.Handler.Path),
+                    polygon: new OpenLayers.Control.DrawFeature(vectors,
+                                OpenLayers.Handler.Polygon),
+                    drag: new OpenLayers.Control.DragFeature(vectors)
+                };
+
+                for(var key in controls) {
+                    map.addControl(controls[key]);
+                }
+
+                map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+                document.getElementById('noneToggle').checked = true;
+            }
+
+            function toggleControl(element) {
+                for(key in controls) {
+                    var control = controls[key];
+                    if(element.value == key && element.checked) {
+                        control.activate();
+                    } else {
+                        control.deactivate();
+                    }
+                }
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Drag Feature Example</h1>
+
+        <div id="tags"></div>
+
+        <p id="shortdesc">
+            Demonstrates point, line and polygon creation and editing.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+        
+        <div id="controls">
+            <ul id="controlToggle">
+                <li>
+                    <input type="radio" name="type" value="none" id="noneToggle"
+                           onclick="toggleControl(this);" checked="checked" />
+                    <label for="noneToggle">navigate</label>
+                </li>
+                <li>
+                    <input type="radio" name="type" value="point" id="pointToggle" onclick="toggleControl(this);" />
+                    <label for="pointToggle">draw point</label>
+                </li>
+                <li>
+                    <input type="radio" name="type" value="line" id="lineToggle" onclick="toggleControl(this);" />
+                    <label for="lineToggle">draw line</label>
+                </li>
+                <li>
+                    <input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
+                    <label for="polygonToggle">draw polygon</label>
+                </li>
+                <li>
+                    <input type="radio" name="type" value="drag" id="dragToggle"
+                           onclick="toggleControl(this);" />
+                    <label for="dragToggle">drag feature</label>
+                </li>
+            </ul>
+        </div>
+
+        <div id="docs"></div>
+    </body>
+</html>
diff --git a/examples/draw-feature.html b/examples/draw-feature.html
new file mode 100644
index 0000000..a84791c
--- /dev/null
+++ b/examples/draw-feature.html
@@ -0,0 +1,109 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>Draw Feature Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            #controlToggle li {
+                list-style: none;
+            }
+            p {
+                width: 512px;
+            }
+
+            /* avoid pink tiles */
+            .olImageLoadError {
+                background-color: transparent !important;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map, drawControls;
+            function init(){
+                map = new OpenLayers.Map('map');
+
+                var wmsLayer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'});
+
+                var pointLayer = new OpenLayers.Layer.Vector("Point Layer");
+                var lineLayer = new OpenLayers.Layer.Vector("Line Layer");
+                var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");
+
+                map.addLayers([wmsLayer, pointLayer, lineLayer, polygonLayer]);
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                map.addControl(new OpenLayers.Control.MousePosition());
+
+                drawControls = {
+                    point: new OpenLayers.Control.DrawFeature(pointLayer,
+                                OpenLayers.Handler.Point),
+                    line: new OpenLayers.Control.DrawFeature(lineLayer,
+                                OpenLayers.Handler.Path),
+                    polygon: new OpenLayers.Control.DrawFeature(polygonLayer,
+                                OpenLayers.Handler.Polygon)
+                };
+
+                for(var key in drawControls) {
+                    map.addControl(drawControls[key]);
+                }
+
+                map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+
+                document.getElementById('noneToggle').checked = true;
+            }
+
+            function toggleControl(element) {
+                for(key in drawControls) {
+                    var control = drawControls[key];
+                    if(element.value == key && element.checked) {
+                        control.activate();
+                    } else {
+                        control.deactivate();
+                    }
+                }
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">OpenLayers Draw Feature Example</h1>
+
+        <div id="tags"></div>
+
+        <p id="shortdesc">
+            Demonstrate on-screen digitizing tools for point, line, and polygon creation.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+    
+        <ul id="controlToggle">
+            <li>
+                <input type="radio" name="type" value="none" id="noneToggle"
+                       onclick="toggleControl(this);" checked="checked" />
+                <label for="noneToggle">navigate</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="point" id="pointToggle" onclick="toggleControl(this);" />
+                <label for="pointToggle">draw point</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="line" id="lineToggle" onclick="toggleControl(this);" />
+                <label for="lineToggle">draw line</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
+                <label for="polygonToggle">draw polygon</label>
+            </li>
+        </ul>
+
+        <div id="docs">
+            <p>With the point drawing control active, click on the map to add a point.  You can drag the point
+            before letting the mouse up if you want to adjust the position.</p>
+            <p>With the line drawing control active, click on the map to add the points that make up your line.
+            Double-click to finish drawing.</p>
+            <p>With the polygon drawing control active, click on the map to add the points that make up your
+            polygon.  Double-click to finish drawing.</p>
+            <p>Hold down the shift key while drawing to activate freehand mode.  While drawing lines or polygons
+            in freehand mode, hold the mouse down and a point will be added with every mouse movement.<p>
+        </div>
+    </body>
+</html>
diff --git a/examples/dynamic-text-layer.html b/examples/dynamic-text-layer.html
new file mode 100644
index 0000000..6bc5edf
--- /dev/null
+++ b/examples/dynamic-text-layer.html
@@ -0,0 +1,90 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Vector Behavior Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map;
+        
+            function init(){
+                map = new OpenLayers.Map('map');
+                var wms = new OpenLayers.Layer.WMS(
+                    "OpenLayers WMS", "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'}
+                );
+
+                var layer = new OpenLayers.Layer.Vector("POIs", {
+                    strategies: [new OpenLayers.Strategy.BBOX({resFactor: 1.1})],
+                    protocol: new OpenLayers.Protocol.HTTP({
+                        url: "textfile.txt",
+                        format: new OpenLayers.Format.Text()
+                    })
+                });
+
+                map.addLayers([wms, layer]);
+                map.zoomToMaxExtent();
+
+                // Interaction; not needed for initial display.
+                selectControl = new OpenLayers.Control.SelectFeature(layer);
+                map.addControl(selectControl);
+                selectControl.activate();
+                layer.events.on({
+                    'featureselected': onFeatureSelect,
+                    'featureunselected': onFeatureUnselect
+                });
+            }
+             
+
+            // Needed only for interaction, not for the display.
+            function onPopupClose(evt) {
+                // 'this' is the popup.
+                selectControl.unselect(this.feature);
+            }
+            function onFeatureSelect(evt) {
+                feature = evt.feature;
+                popup = new OpenLayers.Popup.FramedCloud("featurePopup",
+                                         feature.geometry.getBounds().getCenterLonLat(),
+                                         new OpenLayers.Size(100,100),
+                                         "<h2>"+feature.attributes.title + "</h2>" +
+                                         feature.attributes.description,
+                                         null, true, onPopupClose);
+                feature.popup = popup;
+                popup.feature = feature;
+                map.addPopup(popup);
+            }
+            function onFeatureUnselect(evt) {
+                feature = evt.feature;
+                if (feature.popup) {
+                    popup.feature = null;
+                    map.removePopup(feature.popup);
+                    feature.popup.destroy();
+                    feature.popup = null;
+                }
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Dynamic POIs via a Text Layer</h1>
+        <p id="shortdesc">
+           Loading dynamic data from a text file. 
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            The vector layer shown uses the BBOX strategy, the HTTP protocol,
+            and the Text format.
+            This setup appends "?bbox=west,south,east,north" to every
+            request. This allows you to configure the location as something
+            like 'textfile.php', and take the '?bbox=' parameter to select
+            data from a database or the like.
+<br /><br />
+            There is nothing about this example that limits it to text files;
+            you can do the same thing with KML, GeoJSON, etc.
+            <br /><br />
+            This is an alternative to something like the <a href="http://wiki.openstreetmap.org/index.php/OpenLayers_Dynamic_POI">OpenStreetMap "Dynamic POI"</a> example. The Layer is a standard vector layer, and interaction can be
+            configured via the SelectFeature control, as you can see in the 
+            latter half of the code, which allows you to open a popup when
+            a feature is selected.
+        </div>
+    </body>
+</html>
diff --git a/examples/editingtoolbar-outside.html b/examples/editingtoolbar-outside.html
new file mode 100644
index 0000000..8ff6745
--- /dev/null
+++ b/examples/editingtoolbar-outside.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Custom Editing Toolbar</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .olControlEditingToolbar  {
+            float:left;
+            right: 0px;
+            height: 30px; 
+            width: 150px;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map('map', {theme: null});
+            layer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: "basic"}
+            );
+            map.addLayer(layer);
+
+            vlayer = new OpenLayers.Layer.Vector( "Editable" );
+            map.addLayer(vlayer);
+            var container = document.getElementById("panel");
+            var panel = new OpenLayers.Control.EditingToolbar(
+                vlayer, {div: container}
+            );
+            map.addControl(panel);
+            
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers EditingToolbar Outside Viewport</h1>
+    <p id="shortdesc">
+        Display an editing toolbar panel outside the map viewport.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <div id="panel" class="olControlEditingToolbar"></div>
+  </body>
+</html>
diff --git a/examples/editingtoolbar.html b/examples/editingtoolbar.html
new file mode 100644
index 0000000..88ea2b3
--- /dev/null
+++ b/examples/editingtoolbar.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Editing Toolbar Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="../lib/Firebug/debug.js"></script>
+        <script type="text/javascript">
+            var lon = 5;
+            var lat = 40;
+            var zoom = 5;
+            var map, layer;
+
+            function init(){
+                layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                        "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+    
+                vlayer = new OpenLayers.Layer.Vector( "Editable" );
+                map = new OpenLayers.Map( 'map', {
+                    controls: [
+                        new OpenLayers.Control.PanZoom(),
+                        new OpenLayers.Control.EditingToolbar(vlayer)
+                    ]
+                });
+                map.addLayers([layer, vlayer]);
+    
+                map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Editing Toolbar Example</h1>
+
+        <div id="tags"></div>
+
+        <p id="shortdesc">
+            Demonstrate polygon, polyline and point creation and editing tools.
+        </p>
+
+        <div id="panel"></div>
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs"></div>
+    </body>
+</html>
diff --git a/examples/events.html b/examples/events.html
new file mode 100644
index 0000000..184b4ab
--- /dev/null
+++ b/examples/events.html
@@ -0,0 +1,150 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Event Handling</title>
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            #panel {
+                margin: 5px;
+                height: 30px; 
+                width: 200px;
+            }
+            #panel div { 
+                float: left;
+                margin-left: 5px;
+                width: 25px;
+                height: 25px;
+                border: 1px solid gray;
+            }
+            #output {
+                position: absolute;
+                left: 550px;
+                top: 40px;
+                width: 350px;
+                height: 400px;
+            }
+            div.blueItemInactive {
+                background-color: #aac;
+            }
+            div.blueItemActive {
+                background-color: #33c;
+            }
+            div.orangeItemInactive {
+                background-color: #ca6;
+            }
+            div.orangeItemActive {
+                background-color: #ea0;
+            }
+            div.greenItemInactive {
+                background-color: #aca;
+            }
+            div.greenItemActive {
+                background-color: #3c3;
+            }
+                
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map, panel;
+
+            function init(){
+                
+                // define custom map event listeners
+                function mapEvent(event) {
+                    log(event.type);
+                }
+                function mapBaseLayerChanged(event) {
+                    log(event.type + " " + event.layer.name);
+                }
+                function mapLayerChanged(event) {
+                    log(event.type + " " + event.layer.name + " " + event.property);
+                }
+                map = new OpenLayers.Map('map', {
+                    eventListeners: {
+                        "moveend": mapEvent,
+                        "zoomend": mapEvent,
+                        "changelayer": mapLayerChanged,
+                        "changebaselayer": mapBaseLayerChanged
+                    }
+                });
+
+                panel = new OpenLayers.Control.Panel(
+                    {div: document.getElementById("panel")}
+                );
+                
+                // define custom event listeners
+                function toolActivate(event) {
+                    log("activate " + event.object.displayClass);
+                }
+                function toolDeactivate(event) {
+                    log("deactivate " + event.object.displayClass);
+                }
+                
+                // Multiple objects can share listeners with the same scope
+                var toolListeners = {
+                    "activate": toolActivate,
+                    "deactivate": toolDeactivate
+                };
+                var blue = new OpenLayers.Control({
+                    type: OpenLayers.Control.TYPE_TOGGLE,
+                    eventListeners: toolListeners,
+                    displayClass: "blue"
+                });
+                var orange = new OpenLayers.Control({
+                    type: OpenLayers.Control.TYPE_TOGGLE,
+                    eventListeners: toolListeners,
+                    displayClass: "orange"
+                });
+                var green = new OpenLayers.Control({
+                    type: OpenLayers.Control.TYPE_TOGGLE,
+                    eventListeners: toolListeners,
+                    displayClass: "green"
+                });
+                
+                // add buttons to a panel
+                panel.addControls([blue, orange, green]);
+                map.addControl(panel);
+                
+                var vmap = new OpenLayers.Layer.WMS(
+                    "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'}
+                );
+                var landsat = new OpenLayers.Layer.WMS(
+                    "NASA Global Mosaic",
+                    "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                    {layers: "landsat7"}
+                );
+                var nexrad = new OpenLayers.Layer.WMS(
+                    "Nexrad",
+                    "http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi",
+                    {layers:"nexrad-n0r-wmst", transparent: "TRUE", format: 'image/png'},
+                    {isBaseLayer: false}
+                );
+
+
+                map.addLayers([vmap, landsat, nexrad]);
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                map.zoomToMaxExtent();
+
+            }
+            function log(msg) {
+                document.getElementById("output").innerHTML += msg + "\n";
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Event Handling</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Demonstrating various styles of event handling in OpenLayers.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+        <div id="panel"></div>
+        <textarea id="output"></textarea>
+        <div id="docs"></div>
+    </body>
+</html>
diff --git a/examples/example-list.html b/examples/example-list.html
new file mode 100644
index 0000000..038b957
--- /dev/null
+++ b/examples/example-list.html
@@ -0,0 +1,239 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN">
+<html>
+    <head>
+        <!-- This is the example list source: if you are trying to look at the 
+        source of an example, YOU ARE IN THE WRONG PLACE. If you want to view
+        the source of just one example, you can typically choose 
+        "This Frame -> View source" when right clicking on the exmaple. If not,
+        choose to open the example in a new window (via the context menu 
+        click on the link), and view source from there. -->  
+        <title>OpenLayers Examples</title>
+        <link rel="alternate" href="example-list.xml" type="application/atom+xml" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            html, body {
+                height: 100%;
+                overflow: hidden;
+                margin: 0;
+                padding: 0;
+                line-height: 1.25em;
+            }
+            .ex_container{
+                border-bottom: 1px solid #cccccc;
+            }
+            .ex_container a {
+                text-decoration: none;
+                padding: 5px 1em;
+                display: block;
+            }
+            .ex_container a:hover {
+                background-color: #eeeeee;
+            }
+            .ex_title{
+                display: inline;
+                font-weight: bold;
+                color: #333;
+            }
+            .ex_filename {
+                font-weight: normal;
+                font-size: 0.8em;
+                color: #ccc
+            }
+            .ex_description{
+                color: #222;
+                padding: 3px;
+            }
+            .ex_classes{
+                font-size: .7em;
+                color: grey;
+                display: none;
+            }
+            #toc {
+                width: 30%;
+                height: 100%;
+            }
+            #filter {
+                top: 0px;
+                height: 50px;
+                padding: 10px 1em 10px 1em;
+            }
+            #examples {
+                border-top: 1px solid #cccccc;
+                position: absolute;
+                width: 30%;
+                top: 70px;
+                bottom: 0px;
+                overflow: auto;
+                list-style: none;
+                margin: 0;
+                padding: 0;
+            }
+            #examples ul {
+                list-style: none;
+                margin: 0;
+                padding: 0;
+            }
+            #examples ul li {
+                display: block;
+                margin: 0;
+                padding: 0;
+            }
+            #exwin {
+                position: absolute;
+                top: 0;
+                left: 30%;
+                width: 70%;
+                height: 100%;
+                border: none;
+                border-left: 1px solid #cccccc;
+                margin: 0;
+            }
+        </style>
+        <script type="text/javascript" src="Jugl.js"></script>
+        <script type="text/javascript" src="example-list.js"></script>
+        <script type="text/javascript">
+            // import
+            var Jugl = window["http://jugl.tschaub.net/trunk/lib/Jugl.js"];
+            var template, target;
+
+            function listExamples(examples) {
+                target.innerHTML = "";
+                var node = template.process({
+                    context: {examples: examples},
+                    clone: true,
+                    parent: target
+                });
+                document.getElementById("count").innerHTML = "(" + examples.length + ")";
+            }
+            
+            var timerId;
+            function inputChange() {
+                if(timerId) {
+                    window.clearTimeout(timerId);
+                }
+                var text = this.value;
+                timerId = window.setTimeout(function() {
+                    filterList(text);
+                }, 500);
+            }
+            
+            function filterList(text) {
+                var examples;
+                if(text.length < 2) {
+                    examples = info.examples;
+                } else {
+                    var words = text.split(/\W+/);
+                    var scores = {};
+                    for(var i=0; i<words.length; ++i) {
+                        var word = words[i].toLowerCase()
+                        var dict = info.index[word];
+                        if(dict) {
+                            for(exIndex in dict) {
+                                var count = dict[exIndex];
+                                if(scores[exIndex]) {
+                                    if(scores[exIndex][word]) {
+                                        scores[exIndex][word] += count;
+                                    } else {
+                                        scores[exIndex][word] = count;
+                                    }
+                                } else {
+                                    scores[exIndex] = {};
+                                    scores[exIndex][word] = count;
+                                }
+                            }
+                        }
+                    }
+                    examples = [];
+                    for(var j in scores) {
+                        var ex = info.examples[j];
+                        ex.score = scores[j];
+                        examples.push(ex);
+                    }
+                    // sort examples by first by number of words matched, then
+                    // by word frequency
+                    examples.sort(function(a, b) {
+                        var cmp;
+                        var aWords = 0, bWords = 0;
+                        var aScore = 0, bScore = 0;
+                        for(var i in a.score) {
+                            aScore += a.score[i];
+                            aWords += 1;
+                        }
+                        for(var j in b.score) {
+                            bScore += b.score[j];
+                            bWords += 1;
+                        }
+                        if(aWords == bWords) {
+                            cmp = bScore - aScore;
+                        } else {
+                            cmp = bWords - aWords;
+                        }
+                        return cmp;
+                    });
+                }
+                listExamples(examples);
+            }
+            
+            function showAll() {
+                document.getElementById("keywords").value = "";
+                listExamples(info.examples);
+            }
+            
+            function parseQuery() {
+                var params = {};
+                var list = window.location.search.substring(1).split("&");
+                for(var i=0; i<list.length; ++i) {
+                    var pair = list[i].split("=");
+                    if(pair.length == 2) {
+                        params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
+                    }
+                }
+                if(params["q"]) {
+                    var input = document.getElementById("keywords");
+                    input.value = params["q"];
+                    inputChange.call(input);
+                }
+            }
+            window.onload = function() {
+                template = new Jugl.Template("template");
+                target = document.getElementById("examples");
+                listExamples(info.examples);
+                document.getElementById("exwin").src = "../examples/example.html";
+                document.getElementById("keywords").onkeyup = inputChange
+                parseQuery();
+            };
+        </script>
+    </head>
+    <body>
+        <div id="toc">
+            <div id="filter">
+                <p>
+                    <label for="keywords">Filter by keywords</label><br />
+                    <input type="text" id="keywords" />
+                    <span id="count"></span><br />
+                    <a href="javascript:void showAll();">show all</a>
+                </p>
+            </div>
+            <div id="examples"></div>
+        </div>
+        <iframe id="exwin" name="exwin" frameborder="0"></iframe>        
+        <div style="display: none;">
+            <ul id="template">
+                <li class="ex_container" jugl:repeat="example examples">
+                    <a jugl:attributes="href example.link" target="exwin">
+                        <h5 class="ex_title">
+                            <span jugl:replace="example.title">title</span><br />
+                            <span class="ex_filename" jugl:content="'(' + example.example + ')'">filename</span>
+                        </h5>
+                        <div class="ex_description" jugl:content="example.shortdesc">
+                            Short Description goes here
+                        </div>
+                        <p class="ex_classes" jugl:content="example.classes">
+                            Related Classes go here
+                        </p>
+                    </a>
+                </li>
+            </ul>
+        </div>
+    </body>
+</html>
diff --git a/examples/example.html b/examples/example.html
new file mode 100644
index 0000000..ce4d178
--- /dev/null
+++ b/examples/example.html
@@ -0,0 +1,55 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        // making this a global variable so that it is accessible for
+        // debugging/inspecting in Firebug
+        var map = null;
+
+        function init(){
+
+            map = new OpenLayers.Map('map');
+
+            var ol_wms = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}
+            );
+
+            var jpl_wms = new OpenLayers.Layer.WMS(
+                "NASA Global Mosaic",
+                "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                {layers: "landsat7"}
+            );
+
+            var dm_wms = new OpenLayers.Layer.WMS(
+                "Canadian Data",
+                "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
+                {
+                    layers: "bathymetry,land_fn,park,drain_fn,drainage," +
+                            "prov_bound,fedlimit,rail,road,popplace",
+                    transparent: "true",
+                    format: "image/png"
+                },
+                {isBaseLayer: false, visibility: false}
+            );
+
+            map.addLayers([ol_wms, jpl_wms, dm_wms]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Example</h1>
+    <div id="tags"></div>
+    <p id="shortdesc">
+        Demonstrate a simple map with an overlay that includes layer switching controls.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/filter-strategy.html b/examples/filter-strategy.html
new file mode 100644
index 0000000..0bc4c17
--- /dev/null
+++ b/examples/filter-strategy.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers Filter Strategy Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+        <link rel="stylesheet" href="../theme/default/google.css" type="text/css">
+        <link rel="stylesheet" href="style.css" type="text/css">
+        <script src="../lib/OpenLayers.js"></script>
+        <script>OpenLayers.ImgPath = "../img/";</script>
+        <script src="filter-strategy.js"></script>
+        <style>
+            .olControlAttribution {
+                font-size: 9px;
+                bottom: 2px;
+            }
+        </style>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Filter Strategy</h1>
+        <p id="shortdesc">
+            Demonstrates the filter strategy for limiting features passed to the layer.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <label for="span">time span (seconds)</label>
+        <select id="span" name="span">
+            <option value="15">15</option>
+            <option value="30">30</option>
+            <option value="60" selected>60</option>
+            <option value="120">120</option>
+            <option value="240">240</option>
+        </select>
+        <input type="button" id="start" value="start">
+        <input type="button" id="stop" value="stop"><br><br>
+        <div id="docs">
+            <p>
+                This example uses a filter strategy to limit the features that are passed
+                to a layer.  Features bound for this layer have a <code>when</code> attribute
+                with date values.  A filter strategy is constructed with a between filter
+                that limits the span of dates shown.  A simple animation cycles through
+                the domain of the <code>when</code> values, calling <code>setFilter</code>
+                on the strategy with an updated filter.
+            </p><p>
+                View the <a href="filter-strategy.js" target="_blank">filter-strategy.js</a>
+                source to see how this is done
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/filter-strategy.js b/examples/filter-strategy.js
new file mode 100644
index 0000000..1c7802c
--- /dev/null
+++ b/examples/filter-strategy.js
@@ -0,0 +1,89 @@
+var map, filter, filterStrategy;
+
+var startDate = new Date(1272736800000); // lower bound of when values
+var endDate = new Date(1272737100000); // upper value of when values
+var step = 8; // sencods to advance each interval
+var interval = 0.125; // seconds between each step in the animation
+
+function init() {
+
+    // add behavior to elements
+    document.getElementById("start").onclick = startAnimation;
+    document.getElementById("stop").onclick = stopAnimation;
+    var spanEl = document.getElementById("span");
+
+    var mercator = new OpenLayers.Projection("EPSG:900913");
+    var geographic = new OpenLayers.Projection("EPSG:4326");
+    map = new OpenLayers.Map("map");
+    
+    var osm = new OpenLayers.Layer.OSM();
+    
+    filter = new OpenLayers.Filter.Comparison({
+        type: OpenLayers.Filter.Comparison.BETWEEN,
+        property: "when",
+        lowerBoundary: startDate,
+        upperBoundary: new Date(startDate.getTime() + (parseInt(spanEl.value, 10) * 1000))
+    });
+
+    filterStrategy = new OpenLayers.Strategy.Filter({filter: filter});
+
+    var flights = new OpenLayers.Layer.Vector("Aircraft Locations", {
+        projection: geographic,
+        strategies: [new OpenLayers.Strategy.Fixed(), filterStrategy],
+        protocol: new OpenLayers.Protocol.HTTP({
+            url: "kml-track.kml",
+            format: new OpenLayers.Format.KML({
+                extractTracks: true
+                //,extractStyles: true // use style from KML instead of styleMap below
+            })
+        }),
+        styleMap: new OpenLayers.StyleMap({
+            "default": new OpenLayers.Style({
+                graphicName: "circle",
+                pointRadius: 3,
+                fillOpacity: 0.25,
+                fillColor: "#ffcc66",
+                strokeColor: "#ff9933",
+                strokeWidth: 1
+            })
+        }),
+        renderers: ["Canvas", "SVG", "VML"]
+    });
+    
+    map.addLayers([osm, flights]);
+    map.setCenter(new OpenLayers.LonLat(-93.2735, 44.8349).transform(geographic, mercator), 8);
+    
+};
+
+var animationTimer;
+var currentDate;
+function startAnimation() {
+    if (animationTimer) {
+        stopAnimation(true);
+    }
+    if (!currentDate) {
+        currentDate = startDate;
+    }
+    var spanEl = document.getElementById("span");
+    var next = function() {
+        var span = parseInt(spanEl.value, 10);
+        if (currentDate < endDate) {
+            filter.lowerBoundary = currentDate;
+            filter.upperBoundary = new Date(currentDate.getTime() + (span * 1000));
+            filterStrategy.setFilter(filter);
+            currentDate = new Date(currentDate.getTime() + (step * 1000))
+        } else {
+            stopAnimation(true);
+        }
+    }
+    animationTimer = window.setInterval(next, interval * 1000);
+}
+
+function stopAnimation(reset) {
+    window.clearInterval(animationTimer);
+    animationTimer = null;
+    if (reset === true) {
+        currentDate = null;
+    }
+}
+
diff --git a/examples/filter.html b/examples/filter.html
new file mode 100644
index 0000000..661ea87
--- /dev/null
+++ b/examples/filter.html
@@ -0,0 +1,99 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style>
+    #in {
+        width: 90%;
+        height: 250px;
+    }
+    #out0, #out1 {
+        height: 100px;
+        width: 90%;
+        overflow: auto;
+    }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        
+        var filter_1_0 = new OpenLayers.Format.Filter({version: "1.0.0"});
+        var filter_1_1 = new OpenLayers.Format.Filter({version: "1.1.0"});
+        var xml = new OpenLayers.Format.XML();
+        
+        var filter;
+        function write() {
+            var code = input.value;
+            try {
+                eval(code);
+            } catch(err) {
+                out0.value = err.message;
+                out1.value = "";
+            }
+            try {
+                out0.value = xml.write(filter_1_0.write(filter));
+            } catch(err) {
+                out0.value = err.message;
+                if(err.lineNumber != undefined) {
+                    out0.value += " (line " + err.lineNumber + " " +
+                                        err.fileName + ")";
+                }
+            }
+            try {
+                out1.value = xml.write(filter_1_1.write(filter));
+            } catch(err) {
+                out1.value = err.message;
+                if(err.lineNumber != undefined) {
+                    out1.value += " (line " + err.lineNumber + " " +
+                                        err.fileName + ")";
+                }
+            }
+        }
+        
+        var input, out0;
+        window.onload = function() {
+            input = document.getElementById("in");
+            out0 = document.getElementById("out0");
+            out1 = document.getElementById("out1");
+            out0.value = "";
+            out1.value = "";
+            document.getElementById("write").onclick = write;
+        };
+
+    </script>
+  </head>
+  <body>
+    <h1 id="title">Filter Encoding</h1>
+    <p id="shortdesc">
+        Using the filter format write out filter objects.
+    </p>
+    <textarea id="in">
+filter = new OpenLayers.Filter.Logical({
+    type: OpenLayers.Filter.Logical.AND,
+    filters: [
+        new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.LIKE,
+            property: "person",
+            value: "me"
+        }),
+        new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+            property: "mean",
+            value: "yes"
+        }),
+        new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value: new OpenLayers.Bounds(-180, -90, 180, 90),
+            projection: "EPSG:4326"
+        })
+    ]
+});
+    </textarea>
+    <button id="write">write</button><br />
+    Filter Encoding 1.0
+    <textarea id="out0"></textarea><br />
+    Filter Encoding 1.1
+    <textarea id="out1"></textarea><br />
+    <p id="docs">
+    </p>
+  </body>
+</html>
diff --git a/examples/fractional-zoom.html b/examples/fractional-zoom.html
new file mode 100644
index 0000000..af5744a
--- /dev/null
+++ b/examples/fractional-zoom.html
@@ -0,0 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init() {
+            map = new OpenLayers.Map('map', 
+                 {controls: [new OpenLayers.Control.Navigation(), 
+                             new OpenLayers.Control.PanZoomBar()], 
+                  numZoomLevels: 10 });
+            var wms = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}
+            );
+            map.addLayers([wms]);
+
+            map.events.register("moveend", null, displayZoom);
+
+            map.zoomToMaxExtent();
+            
+            update(document.getElementById("fractional"));
+            
+        }
+        
+        function displayZoom() {
+            document.getElementById("zoom").innerHTML = map.zoom.toFixed(4);
+        }
+        
+        function update(input) {
+            map.fractionalZoom = input.checked;
+            map.zoomTo(Math.round(map.zoom));
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Fractional Zoom Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+            Shows the use of a map with fractional (or non-discrete) zoom levels.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+        <input type="checkbox" name="fractional"
+               id="fractional" checked="checked" onclick="update(this)" />
+        <label for="fractional">Fractional Zoom</label>
+        (zoom: <span id="zoom"></span>)
+        <br /><br />
+    <div id="docs">
+            <p>
+            Setting the map.fractionalZoom property to true allows zooming to
+            an arbitrary level (between the min and max resolutions).  This
+            can be demonstrated by shift-dragging a box to zoom to an arbitrary
+            extent.
+            </p>
+    </div>
+  </body>
+</html>
+
+
+
+
diff --git a/examples/fullScreen.html b/examples/fullScreen.html
new file mode 100644
index 0000000..8cfe599
--- /dev/null
+++ b/examples/fullScreen.html
@@ -0,0 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>Full Screen Example</title>        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            body {
+                margin: 0;
+            }
+            #map {
+                width: 100%;
+                height: 100%;
+            }
+
+            #text {
+                position: absolute;
+                bottom: 1em;
+                left: 1em;
+                width: 512px;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map;
+            function init(){
+                map = new OpenLayers.Map('map');
+
+            var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} );
+            var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
+                "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                {layers: "landsat7"});
+
+                var dm_wms = new OpenLayers.Layer.WMS( "DM Solutions Demo",
+                    "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
+                    {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
+                             "prov_bound,fedlimit,rail,road,popplace",
+                     transparent: "true", format: "image/png" });
+
+                map.addLayers([ol_wms, jpl_wms, dm_wms]);
+                map.addControl(new OpenLayers.Control.LayerSwitcher());
+                // map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+                map.zoomToMaxExtent();
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <div id="map"></div>
+
+          <div id="text">
+              <h1 id="title">Full Screen Example</h1>
+
+              <div id="tags"></div>
+
+              <p id="shortdesc">
+                Demonstrate a map that fill the entire browser window.
+            </p>
+
+            <div id="docs">
+                This example uses CSS to define the dimensions of the map element in order to fill the screen.
+                When the user resizes the window, the map size changes correspondingly. No scroll bars!
+            </div>
+        </div>
+    </body>
+</html>
diff --git a/examples/geojson.html b/examples/geojson.html
new file mode 100644
index 0000000..5197a71
--- /dev/null
+++ b/examples/geojson.html
@@ -0,0 +1,62 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map' );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} );
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            var featurecollection = {
+              "type": "FeatureCollection", 
+              "features": [
+                {"geometry": {
+                    "type": "GeometryCollection", 
+                    "geometries": [
+                        {
+                            "type": "LineString", 
+                            "coordinates": 
+                                [[11.0878902207, 45.1602390564], 
+                                [15.01953125, 48.1298828125]]
+                        }, 
+                        {
+                            "type": "Polygon", 
+                            "coordinates": 
+                                [[[11.0878902207, 45.1602390564], 
+                                  [14.931640625, 40.9228515625], 
+                                  [0.8251953125, 41.0986328125], 
+                                  [7.63671875, 48.96484375], 
+                                  [11.0878902207, 45.1602390564]]]
+                        },
+                        {
+                            "type":"Point", 
+                            "coordinates":[15.87646484375, 44.1748046875]
+                        }
+                    ]
+                }, 
+                "type": "Feature", 
+                "properties": {}}
+              ]
+           };
+           var geojson_format = new OpenLayers.Format.GeoJSON();
+           var vector_layer = new OpenLayers.Layer.Vector(); 
+           map.addLayer(vector_layer);
+           vector_layer.addFeatures(geojson_format.read(featurecollection));
+
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">GeoJSON Example</h1>
+    <div id="map" class="smallmap"></div>
+  </body>
+</html>
diff --git a/examples/georss-flickr.html b/examples/georss-flickr.html
new file mode 100644
index 0000000..8c4426e
--- /dev/null
+++ b/examples/georss-flickr.html
@@ -0,0 +1,100 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .olPopupContent {
+            font-size: smaller;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer, markerLayer, style, popup;
+        
+
+        function init(){
+            map = new OpenLayers.Map('map', {maxResolution:'auto'});
+            
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            
+            // create a property style that reads the externalGraphic url from
+            // the thumbail attribute of the rss item
+            style = new OpenLayers.Style({externalGraphic: "${thumbnail}"});
+            
+            // create a rule with a point symbolizer that will make the thumbnail
+            // larger if the title of the rss item contains "powder"
+            var rule = new OpenLayers.Rule({
+                symbolizer: {pointRadius: 30},
+                filter: new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LIKE,
+                    property: "title",
+                    value: "*powder*"
+                })
+            });
+            rule.filter.value2regex("*");
+            
+            // If the above rule does not apply, use a smaller pointRadius.
+            var elseRule = new OpenLayers.Rule({
+                elseFilter: true,
+                symbolizer: {pointRadius: 20}
+            });
+            
+            style.addRules([rule, elseRule]);
+            
+            // Create a GML layer with GeoRSS format and a style map.
+            markerLayer = new OpenLayers.Layer.GML("Some images from Flickr",
+                                                   "xml/georss-flickr.xml", {
+                format: OpenLayers.Format.GeoRSS,
+                formatOptions: {
+                    // adds the thumbnail attribute to the feature
+                    createFeatureFromItem: function(item) {
+                        var feature = OpenLayers.Format.GeoRSS.prototype
+                                .createFeatureFromItem.apply(this, arguments);
+                        feature.attributes.thumbnail =
+                                this.getElementsByTagNameNS(
+                                item, "*", "thumbnail")[0].getAttribute("url");
+                        return feature;
+                    }
+                },
+                // Giving the style map keys for "default" and "select"
+                // rendering intent, to make the image larger when selected
+                styleMap: new OpenLayers.StyleMap({
+                    "default": style,
+                    "select": new OpenLayers.Style({pointRadius: 35})
+                })
+            });
+            map.addLayer(markerLayer);
+            
+            // control that will show a popup when clicking on a thumbnail
+            var popupControl = new OpenLayers.Control.SelectFeature(markerLayer, {
+              onSelect: function(feature) {
+                  var pos = feature.geometry;
+                  if (popup) {
+                      map.removePopup(popup);
+                  }
+                  popup = new OpenLayers.Popup("popup",
+                      new OpenLayers.LonLat(pos.x, pos.y),
+                      new OpenLayers.Size(254,320),
+                      "<h3>" + feature.attributes.title + "</h3>" +
+                      feature.attributes.description,
+                      true);
+                  map.addPopup(popup);
+              }
+            }); 
+            map.addControl(popupControl);
+            
+            popupControl.activate();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">GeoRSS from Flickr in OpenLayers</h1>
+    <p>The displayed GeoRSS feed has a <tt><media:thumbnail/></tt> property for each item. An extended <tt>createFeatureFromItem()</tt> function is used to add this attribute to the attributes hash of each feature read in by <tt>OpenLayers.Format.GeoRSS</tt>. The example is configured with a style to render each item with its thumbnail image. Also, to show how rules work, we defined a rule that if the title of an rss item contains "powder", it will be rendered larger than the others.</p>
+    <div id="map" class="smallmap"></div>
+  </body>
+</html>
diff --git a/examples/georss-markers.html b/examples/georss-markers.html
new file mode 100644
index 0000000..32e96e8
--- /dev/null
+++ b/examples/georss-markers.html
@@ -0,0 +1,39 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers GeoRSS Marker Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+
+        OpenLayers.ProxyHost = "/proxy/?url=";
+        function init(){
+            map = new OpenLayers.Map('map', {maxResolution:'auto'});
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            var newl = new OpenLayers.Layer.GeoRSS( 'GeoRSS', 'georss.xml');
+            map.addLayer(newl);
+            var yelp = new OpenLayers.Icon("http://openlayers.org/~crschmidt/yelp.png", new OpenLayers.Size(20,29));
+            var newl = new OpenLayers.Layer.GeoRSS( 'Yelp GeoRSS', 'yelp-georss.xml', {'icon':yelp});
+            map.addLayer(newl);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">GeoRSS Marker Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate loading a GeoRSS feed using the GeoRSS parser.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/georss.html b/examples/georss.html
new file mode 100644
index 0000000..0bf866a
--- /dev/null
+++ b/examples/georss.html
@@ -0,0 +1,57 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers GeoRSS Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+
+        OpenLayers.ProxyHost = "/proxy/?url=";
+        function init(){
+            map = new OpenLayers.Map('map', {maxResolution:'auto'});
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+        }
+        function addUrl() {
+            var urlObj = OpenLayers.Util.getElement('url');
+            var value = urlObj.value;
+            var parts = value.split("/");
+                var newl = new OpenLayers.Layer.GeoRSS( parts[parts.length-1], value);
+                map.addLayer(newl);
+            urlObj.value = "";
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">GeoRSS Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Display a couple of locally cached georss feeds on an a basemap.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p>This demo uses the OpenLayers GeoRSS parser, which supports GeoRSS Simple and W3C GeoRSS. Only points are
+        currently supported.  The OpenLayers GeoRSS parser will automatically connect an information bubble to the map
+        markers, similar to Google maps.  In addition, the parser can use custom PNG icons for markers.  A sample GeoRSS
+        file (georss.xml) is included.
+
+        <form onsubmit="return false;">
+               GeoRSS URL: <input type="text" id="url" size="50" value="georss.xml" />
+               <input type="submit" onclick="addUrl(); return false;" value="Load Feed" onsubmit="addUrl(); return false;" />
+        </form>
+
+        <p>The above input box allows the input of a URL to a GeoRSS feed. This feed can be local to the HTML page --
+        for example, entering 'georss.xml' will work by default, because there is a local file in the directory called
+        georss.xml -- or, with a properly set up ProxyHost variable (as is used here), it will be able to load any
+        HTTP URL which contains GeoRSS and display it. Anything else will simply have no effect.</p>
+    </div>
+  </body>
+</html>
diff --git a/examples/georss.xml b/examples/georss.xml
new file mode 100644
index 0000000..fecf77a
--- /dev/null
+++ b/examples/georss.xml
@@ -0,0 +1,378 @@
+<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/css" href="/css/rss.css" ?>
+
+<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xmlns="http://purl.org/rss/1.0/"
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns:georss="http://www.georss.org/georss">
+<docs>This is an RSS file.  Copy the URL into your aggregator of choice.  If you don't know what this means and want to learn more, please see: <span>http://platial.typepad.com/news/2006/04/really_simple_t.html</span> for more info.</docs><channel rdf:about="http://platial.com">
+<link>http://platial.com</link>
+<title>Crschmidt's Places At Platial</title>
+<description></description>
+<items>
+<rdf:Seq>
+<rdf:li resource="http://platial.com/place/90306"/>
+<rdf:li resource="http://platial.com/place/67230"/>
+<rdf:li resource="http://platial.com/place/65645"/>
+<rdf:li resource="http://platial.com/place/62200"/>
+<rdf:li resource="http://platial.com/place/28232"/>
+<rdf:li resource="http://platial.com/place/43666"/>
+<rdf:li resource="http://platial.com/place/28394"/>
+<rdf:li resource="http://platial.com/place/28251"/>
+<rdf:li resource="http://platial.com/place/28392"/>
+<rdf:li resource="http://platial.com/place/28391"/>
+<rdf:li resource="http://platial.com/place/28231"/>
+<rdf:li resource="http://platial.com/place/28393"/>
+<rdf:li resource="http://platial.com/place/31685"/>
+<rdf:li resource="http://platial.com/place/28596"/>
+<rdf:li resource="http://platial.com/place/28595"/>
+<rdf:li resource="http://platial.com/place/28594"/>
+<rdf:li resource="http://platial.com/place/28593"/>
+<rdf:li resource="http://platial.com/place/28592"/>
+<rdf:li resource="http://platial.com/place/28591"/>
+<rdf:li resource="http://platial.com/place/28590"/>
+<rdf:li resource="http://platial.com/place/28589"/>
+<rdf:li resource="http://platial.com/place/28588"/>
+<rdf:li resource="http://platial.com/place/28587"/>
+<rdf:li resource="http://platial.com/place/28586"/>
+<rdf:li resource="http://platial.com/place/28585"/>
+<rdf:li resource="http://platial.com/place/28584"/>
+<rdf:li resource="http://platial.com/place/28583"/>
+<rdf:li resource="http://platial.com/place/28582"/>
+<rdf:li resource="http://platial.com/place/28581"/>
+<rdf:li resource="http://platial.com/place/28580"/>
+<rdf:li resource="http://platial.com/place/28579"/>
+<rdf:li resource="http://platial.com/place/28578"/>
+<rdf:li resource="http://platial.com/place/28577"/>
+<rdf:li resource="http://platial.com/place/28576"/>
+<rdf:li resource="http://platial.com/place/28575"/>
+<rdf:li resource="http://platial.com/place/28574"/>
+<rdf:li resource="http://platial.com/place/28573"/>
+<rdf:li resource="http://platial.com/place/28572"/>
+<rdf:li resource="http://platial.com/place/28571"/>
+<rdf:li resource="http://platial.com/place/28570"/>
+</rdf:Seq>
+</items>
+</channel>
+<item rdf:about="http://platial.com/place/90306">
+<link>http://platial.com/place/90306</link>
+<title>Knitting Room</title>
+<description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington [...]
+<georss:point>42.405696 -71.142197</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-06-08T17:35:01.942452+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/67230">
+<link>http://platial.com/place/67230</link>
+<title>Knitting Room</title>
+<description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington [...]
+<georss:point>42.405524 -71.142273</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-24T11:35:26.733857+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/65645">
+<link>http://platial.com/place/65645</link>
+<title>†¢¢™£ˆøœ</title>
+<description><![CDATA[ijeª£∆µˆ˚î<br/>Address: 151 Erie St., Cambridge, MA<br/>Tags: platial graffiti<br /><br /><a href="http://platial.com/place/65645">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/65645">Grab this on Platial</a> ]]></description>
+<georss:point>42.352455 -71.110210</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-20T08:56:12.696224+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/62200">
+<link>http://platial.com/place/62200</link>
+<title>Allen Hall</title>
+<description><![CDATA[My dorm at UIUC.<br/>Address: 1301 W Gregory Dr, Urbana, IL<br/>Tags: dorm, uiuc, college<br/><a href="http://platial.com/place/62200"><img src="http://platial.comhttp://static.flickr.com/4/8576450_0d59cc2531_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/62200">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/62200">Grab this on Platial</a> ]]></description>
+<georss:point>40.104172 -88.220623</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-14T08:01:01.872873+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28232">
+<link>http://platial.com/place/28232</link>
+<title>Bagby Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C. However, the area around the springs are not exactly well looked upon by people who know the place.
+
+<br/>Tags: 20s, rosalie, romance, childhood, hike, camping, soak, relax, beautiful, hot springs, bathhouse, favorite, popular, crowded, organized, honeymoon tub, plumbing made from hollowed out trees, hot springs, mt hood, notorious car break in spot, rash, bacteria<br /><br /><a href="http://platial.com/place/28232">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28232">Grab this on Platial</a> ]]></description>
+<georss:point>44.936000 -122.173000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:10:18.553063+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/43666">
+<link>http://platial.com/place/43666</link>
+<title>Shooting Location for "The Field of Dreams" Film</title>
+<description><![CDATA[1989's Field of Dreams was a Best Picture Academy Award nominee, and the baseball field in the cornfield still stands today, and has become quite a tourist destination.  Games are occasionally played at the field, re-enacting professional baseball at the turn of the 20th Century.<br/>Address: Dyersville, Iowa<br/>Tags: iowa, baseball, movie locations, field of dreams, kevin costner, costner, dyersville, kinsella, james earl jones, chicago black sox, shoeless joe, jo [...]
+<georss:point>42.481213 -91.111679</georss:point>
+<dc:creator>echinodermata</dc:creator>
+<dc:date>2006-03-23T11:40:17.654061+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28394">
+<link>http://platial.com/place/28394</link>
+<title>Moffetts (Bonneville) Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 97  degress F, 36  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28394">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28394">Grab this on Platial</a> ]]></description>
+<georss:point>45.658000 -121.962000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:27.329816+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28251">
+<link>http://platial.com/place/28251</link>
+<title>Austin Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 186  degress F, 86  degress C<br/>Tags: soak, hot springs, relax, nature, popular, crowded<br /><br /><a href="http://platial.com/place/28251">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28251">Grab this on Platial</a> ]]></description>
+<georss:point>45.021000 -122.009000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:11:04.489886+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28392">
+<link>http://platial.com/place/28392</link>
+<title>Rock Creek Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28392">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28392">Grab this on Platial</a> ]]></description>
+<georss:point>45.723000 -121.927000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:22.636855+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28391">
+<link>http://platial.com/place/28391</link>
+<title>St. Martins (Wind River) Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 120  degress F, 49  degress C<br/>Tags: hot springs, soak, relax, nature, wonderful<br /><br /><a href="http://platial.com/place/28391">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28391">Grab this on Platial</a> ]]></description>
+<georss:point>45.728000 -121.800000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:20.383244+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28231">
+<link>http://platial.com/place/28231</link>
+<title>Breitenbush Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br/>Tags: hot springs, resort, relax, nature, beautiful, http:www.breitenbush.com, soaking<br /><br /><a href="http://platial.com/place/28231">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28231">Grab this on Platial</a> ]]></description>
+<georss:point>44.782000 -121.975000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:10:16.529195+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28393">
+<link>http://platial.com/place/28393</link>
+<title>Collins Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 122  degress F, 50  degress C<br/>Tags: portland, nice, hot springs, soak<br /><br /><a href="http://platial.com/place/28393">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28393">Grab this on Platial</a> ]]></description>
+<georss:point>45.701000 -121.728000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:24.648745+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/31685">
+<link>http://platial.com/place/31685</link>
+<title>Darwin's Ltd.</title>
+<description><![CDATA[Nice little coffee shop/cafe, free Wifi, close enough to walk from Harvard Square.<br/>Address: 148 Mount Auburn St, Cambridge, MA<br/>Tags: coffee, beer, sandwiches, freewifi<br/><a href="http://platial.com/place/31685"><img src="http://platial.comhttp://static.flickr.com/38/84885937_74fd3d1025_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/31685">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/31685">Grab this on Platial</a> ]] [...]
+<georss:point>42.373974 -71.125053</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-10T09:24:08.152985+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28596">
+<link>http://platial.com/place/28596</link>
+<title>Huckleberry Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, Boiling  degress C<br /><br /><a href="http://platial.com/place/28596">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28596">Grab this on Platial</a> ]]></description>
+<georss:point>44.115000 -110.684000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:32.283094+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28595">
+<link>http://platial.com/place/28595</link>
+<title>South Entrance Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 156  degress F, 69  degress C<br/><a href="http://platial.com/place/28595"><img src="http://platial.comhttp://static.flickr.com/52/130989872_f1457f68b5_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28595">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28595">Grab this on Platial</a> ]]></description>
+<georss:point>44.142000 -110.656000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:30.279497+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28594">
+<link>http://platial.com/place/28594</link>
+<title>Crawfish Creek Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br/><a href="http://platial.com/place/28594"><img src="http://platial.comhttp://static.flickr.com/52/128312256_d6a879924c_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28594">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28594">Grab this on Platial</a> ]]></description>
+<georss:point>44.157000 -110.699000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:28.280271+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28593">
+<link>http://platial.com/place/28593</link>
+<title>Crawfish Creek Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 138  degress F, 59  degress C<br /><br /><a href="http://platial.com/place/28593">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28593">Grab this on Platial</a> ]]></description>
+<georss:point>44.165000 -110.723000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:20.364077+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28592">
+<link>http://platial.com/place/28592</link>
+<title>Snake Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br /><br /><a href="http://platial.com/place/28592">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28592">Grab this on Platial</a> ]]></description>
+<georss:point>44.169000 -110.583000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:12.234974+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28591">
+<link>http://platial.com/place/28591</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 142  degress F, 61  degress C<br /><br /><a href="http://platial.com/place/28591">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28591">Grab this on Platial</a> ]]></description>
+<georss:point>44.187000 -110.726000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:10.027857+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28590">
+<link>http://platial.com/place/28590</link>
+<title>Hot Springs on Upper Snake River, WY</title>
+<description><![CDATA[Hot spring, temperature: 167  degress F, 75  degress C<br /><br /><a href="http://platial.com/place/28590">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28590">Grab this on Platial</a> ]]></description>
+<georss:point>44.204000 -110.486000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:07.79658+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28589">
+<link>http://platial.com/place/28589</link>
+<title>Hot Springs on lewis Lake, WY</title>
+<description><![CDATA[Hot spring, temperature: 154  degress F, 68  degress C<br /><br /><a href="http://platial.com/place/28589">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28589">Grab this on Platial</a> ]]></description>
+<georss:point>44.276000 -110.636000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:05.683418+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28588">
+<link>http://platial.com/place/28588</link>
+<title>Rustic Geyser, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28588">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28588">Grab this on Platial</a> ]]></description>
+<georss:point>44.282000 -110.506000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:03.66329+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28587">
+<link>http://platial.com/place/28587</link>
+<title>Bechler River Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 194  degress F, 90  degress C<br /><br /><a href="http://platial.com/place/28587">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28587">Grab this on Platial</a> ]]></description>
+<georss:point>44.285000 -110.900000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:01.611442+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28586">
+<link>http://platial.com/place/28586</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28586">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28586">Grab this on Platial</a> ]]></description>
+<georss:point>44.290000 -110.504000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:59.658699+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28585">
+<link>http://platial.com/place/28585</link>
+<title>Heart Lake Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature:  Middle Group  degress F, 174  degress C<br /><br /><a href="http://platial.com/place/28585">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28585">Grab this on Platial</a> ]]></description>
+<georss:point>44.299000 -110.517000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:57.181801+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28584">
+<link>http://platial.com/place/28584</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28584">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28584">Grab this on Platial</a> ]]></description>
+<georss:point>44.307000 -110.526000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:55.240485+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28583">
+<link>http://platial.com/place/28583</link>
+<title>Hot Springs on lewis Lake, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28583">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28583">Grab this on Platial</a> ]]></description>
+<georss:point>44.309000 -110.654000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:53.22295+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28582">
+<link>http://platial.com/place/28582</link>
+<title>Shoshone Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28582">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28582">Grab this on Platial</a> ]]></description>
+<georss:point>44.354000 -110.800000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:51.179049+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28581">
+<link>http://platial.com/place/28581</link>
+<title>Hot Springs on Continental Divide, WY</title>
+<description><![CDATA[Hot spring, temperature: 189  degress F, 87  degress C<br /><br /><a href="http://platial.com/place/28581">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28581">Grab this on Platial</a> ]]></description>
+<georss:point>44.401000 -110.936000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:49.077176+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28580">
+<link>http://platial.com/place/28580</link>
+<title>Hot Springs on Upper Firehole River, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28580">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28580">Grab this on Platial</a> ]]></description>
+<georss:point>44.404000 -110.824000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:47.054664+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28579">
+<link>http://platial.com/place/28579</link>
+<title>Summit Lake Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 162  degress F, 72  degress C<br /><br /><a href="http://platial.com/place/28579">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28579">Grab this on Platial</a> ]]></description>
+<georss:point>44.410000 -110.953000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:45.039394+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28578">
+<link>http://platial.com/place/28578</link>
+<title>Lone Star Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature:  Footbridge  degress F, 183  degress C<br /><br /><a href="http://platial.com/place/28578">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28578">Grab this on Platial</a> ]]></description>
+<georss:point>44.414000 -110.817000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:42.938808+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28577">
+<link>http://platial.com/place/28577</link>
+<title>West. Thumb Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28577">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28577">Grab this on Platial</a> ]]></description>
+<georss:point>44.417000 -110.570000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:40.90238+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28576">
+<link>http://platial.com/place/28576</link>
+<title>Lone Star Geyser, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28576">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28576">Grab this on Platial</a> ]]></description>
+<georss:point>44.418000 -110.805000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:38.844625+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28575">
+<link>http://platial.com/place/28575</link>
+<title>Smoke Jumper Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28575">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28575">Grab this on Platial</a> ]]></description>
+<georss:point>44.421000 -110.952000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:36.818513+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28574">
+<link>http://platial.com/place/28574</link>
+<title>West. Thumb Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 196  degress F, 91  degress C<br /><br /><a href="http://platial.com/place/28574">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28574">Grab this on Platial</a> ]]></description>
+<georss:point>44.422000 -110.574000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:34.767729+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28573">
+<link>http://platial.com/place/28573</link>
+<title>Potts Hot Spring Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28573">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28573">Grab this on Platial</a> ]]></description>
+<georss:point>44.433000 -110.581000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:32.749915+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28572">
+<link>http://platial.com/place/28572</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28572">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28572">Grab this on Platial</a> ]]></description>
+<georss:point>44.433000 -110.813000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:30.829745+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28571">
+<link>http://platial.com/place/28571</link>
+<title>Hot Springs on Continental Divide, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28571">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28571">Grab this on Platial</a> ]]></description>
+<georss:point>44.438000 -110.977000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:28.730401+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28570">
+<link>http://platial.com/place/28570</link>
+<title>SouthEastern Group, WY</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28570">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28570">Grab this on Platial</a> ]]></description>
+<georss:point>44.459000 -110.817000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:26.706763+00:00</dc:date>
+</item>
+</rdf:RDF>
diff --git a/examples/getfeature-wfs.html b/examples/getfeature-wfs.html
new file mode 100644
index 0000000..9141748
--- /dev/null
+++ b/examples/getfeature-wfs.html
@@ -0,0 +1,83 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <title>WFS: GetFeature Example (GeoServer)</title>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer, select, hover, control;
+
+        function init(){
+            OpenLayers.ProxyHost= "proxy.cgi?url=";
+            map = new OpenLayers.Map('map', {
+                controls: [
+                    new OpenLayers.Control.PanZoom(),
+                    new OpenLayers.Control.Permalink(),
+                    new OpenLayers.Control.Navigation()
+                ]
+            });
+            layer = new OpenLayers.Layer.WMS(
+                "States WMS/WFS",
+                "http://demo.opengeo.org/geoserver/ows",
+                {layers: 'topp:states', format: 'image/gif'}
+            );
+            select = new OpenLayers.Layer.Vector("Selection", {styleMap: 
+                new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"])
+            });
+            hover = new OpenLayers.Layer.Vector("Hover");
+            map.addLayers([layer, hover, select]);
+            
+            control = new OpenLayers.Control.GetFeature({
+                protocol: OpenLayers.Protocol.WFS.fromWMSLayer(layer),
+                box: true,
+                hover: true,
+                multipleKey: "shiftKey",
+                toggleKey: "ctrlKey"
+            });
+            control.events.register("featureselected", this, function(e) {
+                select.addFeatures([e.feature]);
+            });
+            control.events.register("featureunselected", this, function(e) {
+                select.removeFeatures([e.feature]);
+            });
+            control.events.register("hoverfeature", this, function(e) {
+                hover.addFeatures([e.feature]);
+            });
+            control.events.register("outfeature", this, function(e) {
+                hover.removeFeatures([e.feature]);
+            });
+            map.addControl(control);
+            control.activate();
+
+            map.setCenter(new OpenLayers.Bounds(-140.444336,25.115234,-44.438477,50.580078).getCenterLonLat(), 3);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+<h1 id="title">WFS GetFeature Example (GeoServer)</h1>
+
+<div id="tags">
+</div>
+
+<p id="shortdesc">
+    Shows how to use the GetFeature control to select features from a WMS layer.
+</p>
+
+<div id="map" class="smallmap"></div>
+
+<div id="docs">
+    <p>
+        Click or drag a box to select features, use the Shift key to add
+        features to the selection, use the Ctrl key to toggle a feature's
+        selected status. Note that this control also has a hover option, which
+        is enabled in this example. This gives you a visual feedback by loading
+        the feature underneath the mouse pointer from the WFS, but causes a lot
+        of GetFeature requests to be issued.
+    </p>
+</div>
+  </body>
+</html>
+
+
+
+</div>
diff --git a/examples/getfeatureinfo-control.html b/examples/getfeatureinfo-control.html
new file mode 100644
index 0000000..4943cdb
--- /dev/null
+++ b/examples/getfeatureinfo-control.html
@@ -0,0 +1,216 @@
+<html>
+  <head>
+    <title>OpenLayers WMS Feature Info Example (GeoServer)</title>
+    <script src="../lib/OpenLayers.js"></script>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        ul, li {
+            padding-left: 0px;
+            margin-left: 0px;
+            list-style: none;
+        }
+        #info {
+            position: absolute;
+            top: 6em;
+            left: 550px;
+        }
+        #info table td {
+            border:1px solid #ddd;
+            border-collapse: collapse;
+            margin: 0;
+            padding: 0;
+            font-size: 90%;
+            padding: .2em .1em;
+            background:#fff;
+	}
+	#info table th{
+	    padding:.2em .2em;
+            text-transform: uppercase;
+            font-weight: bold;
+            background: #eee;
+	}
+	tr.odd td {
+            background:#eee;
+	}
+	table.featureInfo caption {
+            text-align:left;
+            font-size:100%;
+            font-weight:bold;
+            padding:.2em .2em;
+	}
+
+
+    </style>
+  <script defer="defer" type="text/javascript">
+    OpenLayers.ProxyHost = "proxy.cgi?url=";
+    
+    var map, infocontrols, water, highlightlayer;
+    
+    function load() {
+        map = new OpenLayers.Map('map', {
+            maxExtent: new OpenLayers.Bounds(143.834,-43.648,148.479,-39.573)
+        });
+
+        var political = new OpenLayers.Layer.WMS("State Boundaries",
+            "http://demo.opengeo.org/geoserver/wms", 
+            {'layers': 'topp:tasmania_state_boundaries', transparent: true, format: 'image/gif'},
+            {isBaseLayer: true}
+        );
+
+        var roads = new OpenLayers.Layer.WMS("Roads",
+            "http://demo.opengeo.org/geoserver/wms", 
+            {'layers': 'topp:tasmania_roads', transparent: true, format: 'image/gif'},
+            {isBaseLayer: false}
+        );
+
+        var cities = new OpenLayers.Layer.WMS("Cities",
+            "http://demo.opengeo.org/geoserver/wms", 
+            {'layers': 'topp:tasmania_cities', transparent: true, format: 'image/gif'},
+            {isBaseLayer: false}
+        );
+
+        water = new OpenLayers.Layer.WMS("Bodies of Water",
+            "http://demo.opengeo.org/geoserver/wms", 
+            {'layers': 'topp:tasmania_water_bodies', transparent: true, format: 'image/gif'},
+            {isBaseLayer: false}
+        );
+
+        highlightLayer = new OpenLayers.Layer.Vector("Highlighted Features", {
+            displayInLayerSwitcher: false, 
+            isBaseLayer: false 
+            }
+        );
+
+        infoControls = {
+            click: new OpenLayers.Control.WMSGetFeatureInfo({
+                url: 'http://demo.opengeo.org/geoserver/wms', 
+                title: 'Identify features by clicking',
+                layers: [water],
+                queryVisible: true
+            }),
+            hover: new OpenLayers.Control.WMSGetFeatureInfo({
+                url: 'http://demo.opengeo.org/geoserver/wms', 
+                title: 'Identify features by clicking',
+                layers: [water],
+                hover: true,
+                // defining a custom format options here
+                formatOptions: {
+                    typeName: 'water_bodies', 
+                    featureNS: 'http://www.openplans.org/topp'
+                },
+                queryVisible: true
+            })
+        }
+
+        map.addLayers([political, roads, cities, water, highlightLayer]); 
+        for (var i in infoControls) { 
+            infoControls[i].events.register("getfeatureinfo", this, showInfo);
+            map.addControl(infoControls[i]); 
+        }
+
+        map.addControl(new OpenLayers.Control.LayerSwitcher());
+
+        infoControls.click.activate();
+        map.zoomToMaxExtent();
+    }
+
+    function showInfo(evt) {
+        if (evt.features && evt.features.length) {
+             highlightLayer.destroyFeatures();
+             highlightLayer.addFeatures(evt.features);
+             highlightLayer.redraw();
+        } else {
+            $('responseText').innerHTML = evt.text;
+        }
+    }
+
+    function toggleControl(element) {
+        for (var key in infoControls) {
+            var control = infoControls[key];
+            if (element.value == key && element.checked) {
+                control.activate();
+            } else {
+                control.deactivate();
+            }
+        }
+    }
+
+    function toggleFormat(element) {
+        for (var key in infoControls) {
+            var control = infoControls[key];
+            control.infoFormat = element.value;
+        }
+    }
+
+    function toggleLayers(element) {
+        for (var key in infoControls) {
+            var control = infoControls[key];
+            if (element.value == 'Specified') {
+                control.layers = [water];
+            } else {
+                control.layers = null;
+            }
+        }
+    }
+
+    // function toggle(key
+  </script>
+  </head>
+  <body onload="load()">
+      <h1 id="title">Feature Info Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+        Demonstrates the WMSGetFeatureInfo control for fetching information about a position from WMS (via GetFeatureInfo request).
+      </p>
+
+    <div id="info">
+        <h1>Tasmania</h1>
+        <p>Click on the map to get feature info.</p>
+        <div id="responseText">
+        </div>
+    </div>
+      <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+    </div>
+        <ul id="control">
+            <li>
+                <input type="radio" name="controlType" value="click" id="click"
+                       onclick="toggleControl(this);" checked="checked" />
+                <label for="click">Click</label>
+            </li>
+            <li>
+                <input type="radio" name="controlType" value="hover" id="hover" 
+                       onclick="toggleControl(this);" />
+                <label for="hover">Hover</label>
+            </li>
+        </ul>
+        <ul id="format">
+            <li>
+                <input type="radio" name="formatType" value="text/html" id="html"
+                       onclick="toggleFormat(this);" checked="checked" />
+                <label for="html">Show HTML Description</label>
+            </li>
+            <li>
+                <input type="radio" name="formatType" value="application/vnd.ogc.gml" id="highlight" 
+                       onclick="toggleFormat(this);" />
+                <label for="highlight">Highlight Feature on Map</label>
+            </li>
+        </ul>
+        <ul id="layers">
+            <li>
+                <input type="radio" name="layerSelection" value="Specified" id="Specified"
+                       onclick="toggleLayers(this);" checked="checked" />
+                <label for="Specified">Get water body info</label>
+            </li>
+            <li>
+                <input type="radio" name="layerSelection" value="Auto" id="Auto" 
+                       onclick="toggleLayers(this);" />
+                <label for="Auto">Get info for visible layers</label>
+            </li>
+        </ul>
+  </body>
+</html>
diff --git a/examples/getfeatureinfo-popup.html b/examples/getfeatureinfo-popup.html
new file mode 100644
index 0000000..16476b7
--- /dev/null
+++ b/examples/getfeatureinfo-popup.html
@@ -0,0 +1,90 @@
+<html>
+  <head>
+    <title>GetFeatureInfo Popup</title>
+    <script src="../lib/OpenLayers.js"></script>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script>
+    OpenLayers.ProxyHost = "proxy.cgi?url=";
+    
+    var map, info;
+    
+    function load() {
+        map = new OpenLayers.Map({
+            div: "map",
+            maxExtent: new OpenLayers.Bounds(143.834,-43.648,148.479,-39.573)
+        });
+
+        var political = new OpenLayers.Layer.WMS("State Boundaries",
+            "http://demo.opengeo.org/geoserver/wms", 
+            {'layers': 'topp:tasmania_state_boundaries', transparent: true, format: 'image/gif'},
+            {isBaseLayer: true}
+        );
+
+        var roads = new OpenLayers.Layer.WMS("Roads",
+            "http://demo.opengeo.org/geoserver/wms", 
+            {'layers': 'topp:tasmania_roads', transparent: true, format: 'image/gif'},
+            {isBaseLayer: false}
+        );
+
+        var cities = new OpenLayers.Layer.WMS("Cities",
+            "http://demo.opengeo.org/geoserver/wms", 
+            {'layers': 'topp:tasmania_cities', transparent: true, format: 'image/gif'},
+            {isBaseLayer: false}
+        );
+
+        var water = new OpenLayers.Layer.WMS("Bodies of Water",
+            "http://demo.opengeo.org/geoserver/wms", 
+            {'layers': 'topp:tasmania_water_bodies', transparent: true, format: 'image/gif'},
+            {isBaseLayer: false}
+        );
+
+        var highlight = new OpenLayers.Layer.Vector("Highlighted Features", {
+            displayInLayerSwitcher: false, 
+            isBaseLayer: false 
+        });
+        
+        map.addLayers([political, roads, cities, water, highlight]); 
+
+        info = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: 'http://demo.opengeo.org/geoserver/wms', 
+            title: 'Identify features by clicking',
+            queryVisible: true,
+            eventListeners: {
+                getfeatureinfo: function(event) {
+                    map.addPopup(new OpenLayers.Popup.FramedCloud(
+                        "chicken", 
+                        map.getLonLatFromPixel(event.xy),
+                        null,
+                        event.text,
+                        null,
+                        true
+                    ));
+                }
+            }
+        });
+        map.addControl(info);
+        info.activate();
+
+        map.addControl(new OpenLayers.Control.LayerSwitcher());
+        map.zoomToMaxExtent();
+    }
+
+  </script>
+  </head>
+  <body onload="load()">
+      <h1 id="title">Feature Info in Popup</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+        Demonstrates the WMSGetFeatureInfo control for fetching information
+        about a position from WMS (via GetFeatureInfo request).  Results
+        are displayed in a popup.
+      </p>
+
+      <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/getfeatureinfo.html b/examples/getfeatureinfo.html
new file mode 100644
index 0000000..bfe56bf
--- /dev/null
+++ b/examples/getfeatureinfo.html
@@ -0,0 +1,62 @@
+<html>
+  <head>
+    <title>OpenLayers Feature Info Example</title>
+    <script src="../lib/OpenLayers.js"></script>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        ul, li { padding-left: 0px; margin-left: 0px; }
+    </style>
+  </head>
+  <body>
+      <h1 id="title">Feature Info Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+        Demonstrates sending a GetFeatureInfo query to an OWS. Returns information about a map feature in the side DIV.
+      </p>
+
+    <a id="permalink" href="">Permalink</a><br />
+
+    <div style="float:right;width:28%">
+        <h1 style="font-size:1.3em;">CIA Factbook</h1>
+        <p style="font-size:.8em;">Click a country to see statistics about the country below.</p>
+        <div id="nodeList">
+        </div>
+    </div>
+      <div id="map" class="smallmap"></div>
+
+  <script defer="defer" type="text/javascript">
+    OpenLayers.ProxyHost = "/dev/examples/proxy.cgi?url=";
+    var map = new OpenLayers.Map('map', {'maxResolution':'auto'});
+
+    var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+        "http://world.freemap.in/cgi-bin/mapserv?map=/www/freemap.in/world/map/factbook.map", {'layers': 'factbook'} );
+    map.addLayer(wms);
+    map.addControl(new OpenLayers.Control.Permalink('permalink'));
+    map.zoomToMaxExtent();
+    map.events.register('click', map, function (e) {
+            OpenLayers.Util.getElement('nodeList').innerHTML = "Loading... please wait...";
+            var url =  wms.getFullRequestString({
+                            REQUEST: "GetFeatureInfo",
+                            EXCEPTIONS: "application/vnd.ogc.se_xml",
+                            BBOX: wms.map.getExtent().toBBOX(),
+                            X: e.xy.x,
+                            Y: e.xy.y,
+                            INFO_FORMAT: 'text/html',
+                            QUERY_LAYERS: wms.params.LAYERS,
+                            WIDTH: wms.map.size.w,
+                            HEIGHT: wms.map.size.h});
+            OpenLayers.loadURL(url, '', this, setHTML);
+            OpenLayers.Event.stop(e);
+      });
+    function setHTML(response) {
+        OpenLayers.Util.getElement('nodeList').innerHTML = response.responseText;
+    }
+  </script>
+
+    <div id="docs">
+    </div>
+  </body>
+</html>
diff --git a/examples/gml-layer.html b/examples/gml-layer.html
new file mode 100644
index 0000000..ae9ea0a
--- /dev/null
+++ b/examples/gml-layer.html
@@ -0,0 +1,36 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+      <title>OpenLayers GML Layer Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            map.zoomToExtent(new OpenLayers.Bounds(-3.922119,44.335327,4.866943,49.553833));
+            map.addLayer(new OpenLayers.Layer.GML("GML", "gml/polygon.xml"));
+        }
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">GML Layer Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+          Loads locally stored GML vector data on a basemap. Includes GML example file.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/gml/line.xml b/examples/gml/line.xml
new file mode 100644
index 0000000..4f42499
--- /dev/null
+++ b/examples/gml/line.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd                         http://mapserver.gis.umn.edu/mapserver http://aneto.oco/cgi-bin/worldwfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFea [...]
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-3.924027,46.037889 2.193186,47.897181</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember>
+      <ms:line fid="1">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-0.631235,46.037889 2.193186,46.704963</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:LineString srsName="EPSG:4326">
+          <gml:coordinates>-0.631235,46.307557 -0.262215,46.577225 0.106805,46.477874 0.220349,46.293364 0.475824,46.406909 0.887424,46.350136 1.029354,46.563032 1.213864,46.648191 1.526112,46.421102 1.795780,46.066275 2.108028,46.037889 2.178993,46.250785 2.193186,46.492067 2.193186,46.492067 2.051255,46.704963 2.051255,46.704963 </gml:coordinates>
+        </gml:LineString>
+        </ms:msGeometry>
+        <ms:ogc_fid>1</ms:ogc_fid>
+        <ms:name/>
+        <ms:id>0</ms:id>
+      </ms:line>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:line fid="2">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-3.924027,46.279171 -1.127992,47.897181</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:LineString srsName="EPSG:4326">
+          <gml:coordinates>-1.127992,46.279171 -1.369275,46.364329 -1.624750,46.406909 -1.866032,46.492067 -1.993770,46.704963 -2.178280,46.846894 -1.979577,47.059790 -2.164087,47.144948 -2.135700,47.215914 -2.093121,47.357844 -2.277631,47.258493 -2.391176,47.301072 -2.490527,47.315265 -2.476334,47.443003 -2.575686,47.599127 -2.703423,47.542354 -2.873740,47.471389 -3.285339,47.670092 -3.597587,47.769443 -3.824676,47.840409 -3.924027,47.897181 </gml:coordinates>
+        </gml:LineString>
+        </ms:msGeometry>
+        <ms:ogc_fid>2</ms:ogc_fid>
+        <ms:name/>
+        <ms:id>0</ms:id>
+      </ms:line>
+    </gml:featureMember>
+</wfs:FeatureCollection>
\ No newline at end of file
diff --git a/examples/gml/multipoint.xml b/examples/gml/multipoint.xml
new file mode 100644
index 0000000..803fd47
--- /dev/null
+++ b/examples/gml/multipoint.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd                         http://mapserver.gis.umn.edu/mapserver http://aneto.oco/cgi-bin/worldwfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFea [...]
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>0.490018,45.001795 3.016384,45.839186</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember>
+      <ms:multipoint fid="1">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>0.930003,45.001795 3.016384,45.541131</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:MultiPoint srsName="EPSG:4326">
+          <gml:pointMember>
+            <gml:Point>
+              <gml:coordinates>2.079641,45.001795</gml:coordinates>
+            </gml:Point>
+          </gml:pointMember>
+          <gml:pointMember>
+            <gml:Point>
+              <gml:coordinates>2.718330,45.541131</gml:coordinates>
+            </gml:Point>
+          </gml:pointMember>
+          <gml:pointMember>
+            <gml:Point>
+              <gml:coordinates>3.016384,45.143725</gml:coordinates>
+            </gml:Point>
+          </gml:pointMember>
+          <gml:pointMember>
+            <gml:Point>
+              <gml:coordinates>0.930003,45.001795</gml:coordinates>
+            </gml:Point>
+          </gml:pointMember>
+        </gml:MultiPoint>
+        </ms:msGeometry>
+        <ms:ogc_fid>1</ms:ogc_fid>
+        <ms:name>4 points</ms:name>
+        <ms:id>1</ms:id>
+      </ms:multipoint>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:multipoint fid="2">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>0.490018,45.654676 1.157092,45.839186</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:MultiPoint srsName="EPSG:4326">
+          <gml:pointMember>
+            <gml:Point>
+              <gml:coordinates>0.490018,45.654676</gml:coordinates>
+            </gml:Point>
+          </gml:pointMember>
+          <gml:pointMember>
+            <gml:Point>
+              <gml:coordinates>1.157092,45.839186</gml:coordinates>
+            </gml:Point>
+          </gml:pointMember>
+        </gml:MultiPoint>
+        </ms:msGeometry>
+        <ms:ogc_fid>2</ms:ogc_fid>
+        <ms:name>2 points</ms:name>
+        <ms:id>2</ms:id>
+      </ms:multipoint>
+    </gml:featureMember>
+</wfs:FeatureCollection>
\ No newline at end of file
diff --git a/examples/gml/multipolygon.xml b/examples/gml/multipolygon.xml
new file mode 100644
index 0000000..bcdb39e
--- /dev/null
+++ b/examples/gml/multipolygon.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd                         http://mapserver.gis.umn.edu/mapserver http://aneto.oco/cgi-bin/worldwfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFea [...]
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-1.738295,46.307557 3.754424,47.244300</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember>
+      <ms:multipolygon fid="1">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-1.738295,46.605612 1.767394,47.244300</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:MultiPolygon srsName="EPSG:4326">
+        <gml:polygonMember>
+          <gml:Polygon>
+            <gml:outerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>1.313216,46.690770 1.000968,46.861087 0.887424,47.059790 1.142899,47.244300 1.355795,47.244300 1.554498,47.017211 1.710622,47.059790 1.767394,46.747542 1.313216,46.690770 1.313216,46.690770 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:outerBoundaryIs>
+          </gml:Polygon>
+        </gml:polygonMember>
+        <gml:polygonMember>
+          <gml:Polygon>
+            <gml:outerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>0.731300,46.605612 -0.191250,46.704963 -0.191250,46.846894 0.177770,46.988824 0.447438,46.960438 0.589369,46.804315 0.688721,46.832701 0.731300,46.605612 0.731300,46.605612 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:outerBoundaryIs>
+          </gml:Polygon>
+        </gml:polygonMember>
+        <gml:polygonMember>
+          <gml:Polygon>
+            <gml:outerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>-1.610557,46.733349 -1.184765,46.704963 -1.198958,46.704963 -0.943483,46.619805 -0.915096,46.818508 -0.659621,46.775928 -0.688007,47.017211 -0.943483,47.003018 -1.127992,47.088176 -1.397661,47.102369 -1.624750,47.073983 -1.738295,46.917859 -1.610557,46.733349 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:outerBoundaryIs>
+          </gml:Polygon>
+        </gml:polygonMember>
+        </gml:MultiPolygon>
+        </ms:msGeometry>
+        <ms:ogc_fid>1</ms:ogc_fid>
+        <ms:name>My first Multipolygon</ms:name>
+        <ms:id>0</ms:id>
+      </ms:multipolygon>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:multipolygon fid="2">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>2.789295,46.392716 3.754424,46.903666</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:Polygon srsName="EPSG:4326">
+          <gml:outerBoundaryIs>
+            <gml:LinearRing>
+              <gml:coordinates>2.959612,46.392716 2.789295,46.775928 3.172508,46.903666 3.498949,46.903666 3.498949,46.662384 3.754424,46.563032 2.959612,46.392716 </gml:coordinates>
+            </gml:LinearRing>
+          </gml:outerBoundaryIs>
+        </gml:Polygon>
+        </ms:msGeometry>
+        <ms:ogc_fid>2</ms:ogc_fid>
+        <ms:name>My second Multipolygon</ms:name>
+        <ms:id>0</ms:id>
+      </ms:multipolygon>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:multipolygon fid="3">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>2.207379,46.307557 2.803488,47.045597</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:MultiPolygon srsName="EPSG:4326">
+        <gml:polygonMember>
+          <gml:Polygon>
+            <gml:outerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>2.292538,46.804315 2.207379,47.017211 2.391889,47.045597 2.562206,46.832701 2.292538,46.804315 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:outerBoundaryIs>
+          </gml:Polygon>
+        </gml:polygonMember>
+        <gml:polygonMember>
+          <gml:Polygon>
+            <gml:outerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>2.789295,46.307557 2.789295,46.307557 2.803488,46.506260 2.618978,46.676577 2.349310,46.633998 2.448661,46.392716 2.789295,46.307557 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:outerBoundaryIs>
+          </gml:Polygon>
+        </gml:polygonMember>
+        </gml:MultiPolygon>
+        </ms:msGeometry>
+        <ms:ogc_fid>3</ms:ogc_fid>
+        <ms:name>My third Multipolygon</ms:name>
+        <ms:id>0</ms:id>
+      </ms:multipolygon>
+    </gml:featureMember>
+</wfs:FeatureCollection>
\ No newline at end of file
diff --git a/examples/gml/owls.xml b/examples/gml/owls.xml
new file mode 100644
index 0000000..4a001ec
--- /dev/null
+++ b/examples/gml/owls.xml
@@ -0,0 +1,156 @@
+<?xml version='1.0' encoding="ISO-8859-1" ?>
+<wfs:FeatureCollection
+   xmlns:bsc="http://www.bsc-eoc.org/bsc"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-basic.xsd 
+                       http://www.bsc-eoc.org/bsc http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=OWLS&OUTPUTFORMAT=XMLSCHEMA">
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-89.817223,45.005555 -74.755001,51.701388</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember><bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.771668,45.891110 -79.771668,45.891110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.771668,45.891110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.755834,46.365277 -83.755834,46.365277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:owlname>owl</bsc:owlname>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.755834,46.365277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.808612,46.175277 -83.808612,46.175277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.808612,46.175277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-84.111112,46.309166 -84.111112,46.309166</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-84.111112,46.309166</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.678612,46.821110 -83.678612,46.821110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.678612,46.821110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.664445,46.518888 -83.664445,46.518888</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.664445,46.518888</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-80.613334,46.730277 -80.613334,46.730277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-80.613334,46.730277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.676946,45.428054 -79.676946,45.428054</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.676946,45.428054</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.853056,46.236944 -83.853056,46.236944</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.853056,46.236944</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-82.289167,45.896388 -82.289167,45.896388</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-82.289167,45.896388</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+</wfs:FeatureCollection>
+
diff --git a/examples/gml/point.xml b/examples/gml/point.xml
new file mode 100644
index 0000000..10a4820
--- /dev/null
+++ b/examples/gml/point.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd                         http://mapserver.gis.umn.edu/mapserver http://aneto.oco/cgi-bin/worldwfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFea [...]
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-0.608315,44.857522 -0.021418,45.477577</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember>
+      <ms:point fid="1">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-0.608315,44.857522 -0.608315,44.857522</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-0.608315,44.857522</gml:coordinates>
+        </gml:Point>
+        </ms:msGeometry>
+        <ms:ogc_fid>1</ms:ogc_fid>
+        <ms:name>Bordeaux</ms:name>
+        <ms:id>124</ms:id>
+      </ms:point>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:point fid="2">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-0.021418,45.477577 -0.021418,45.477577</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-0.021418,45.477577</gml:coordinates>
+        </gml:Point>
+        </ms:msGeometry>
+        <ms:ogc_fid>2</ms:ogc_fid>
+        <ms:name>Barbezieux</ms:name>
+        <ms:id>0</ms:id>
+      </ms:point>
+    </gml:featureMember>
+</wfs:FeatureCollection>
\ No newline at end of file
diff --git a/examples/gml/polygon.xml b/examples/gml/polygon.xml
new file mode 100644
index 0000000..e4f6903
--- /dev/null
+++ b/examples/gml/polygon.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd                         http://mapserver.gis.umn.edu/mapserver http://aneto.oco/cgi-bin/worldwfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFea [...]
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-0.768746,47.003018 3.002191,47.925567</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember>
+      <ms:polygon fid="1">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-0.768746,47.003018 0.532597,47.925567</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:MultiPolygon srsName="EPSG:4326">
+        <gml:polygonMember>
+          <gml:Polygon>
+            <gml:outerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>-0.318987,47.003018 -0.768746,47.358268 -0.574463,47.684285 -0.347374,47.854602 -0.006740,47.925567 0.135191,47.726864 0.149384,47.599127 0.419052,47.670092 0.532597,47.428810 0.305508,47.443003 0.475824,47.144948 0.064225,47.201721 -0.318987,47.003018 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:outerBoundaryIs>
+            <gml:innerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>-0.035126,47.485582 -0.035126,47.485582 -0.049319,47.641706 -0.233829,47.655899 -0.375760,47.457196 -0.276408,47.286879 -0.035126,47.485582 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:innerBoundaryIs>
+          </gml:Polygon>
+        </gml:polygonMember>
+        </gml:MultiPolygon>
+        </ms:msGeometry>
+        <ms:ogc_fid>1</ms:ogc_fid>
+        <ms:name>My Polygon with hole</ms:name>
+        <ms:id>0</ms:id>
+      </ms:polygon>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:polygon fid="2">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>1.511919,47.088176 3.002191,47.882988</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:Polygon srsName="EPSG:4326">
+          <gml:outerBoundaryIs>
+            <gml:LinearRing>
+              <gml:coordinates>1.625463,47.357844 1.511919,47.741057 1.880938,47.882988 2.420275,47.797830 2.789295,47.485582 3.002191,47.457196 2.874453,47.088176 2.178993,47.343651 1.625463,47.357844 </gml:coordinates>
+            </gml:LinearRing>
+          </gml:outerBoundaryIs>
+        </gml:Polygon>
+        </ms:msGeometry>
+        <ms:ogc_fid>2</ms:ogc_fid>
+        <ms:name>My simple Polygon</ms:name>
+        <ms:id>0</ms:id>
+      </ms:polygon>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:polygon fid="3">
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>0.000000,45.000000 2.000000,47.000000</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <ms:msGeometry>
+        <gml:MultiPolygon srsName="EPSG:4326">
+        <gml:polygonMember>
+          <gml:Polygon>
+            <gml:outerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>0.000000,45.000000 2.000000,45.000000 2.000000,47.000000 0.000000,47.000000 0.000000,45.000000 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:outerBoundaryIs>
+            <gml:innerBoundaryIs>
+              <gml:LinearRing>
+                <gml:coordinates>0.500000,45.500000 1.500000,45.500000 1.500000,46.500000 0.500000,46.500000 0.500000,45.500000 </gml:coordinates>
+              </gml:LinearRing>
+            </gml:innerBoundaryIs>
+          </gml:Polygon>
+        </gml:polygonMember>
+        </gml:MultiPolygon>
+        </ms:msGeometry>
+        <ms:ogc_fid>3</ms:ogc_fid>
+        <ms:name>my polygon with hole</ms:name>
+        <ms:id>3</ms:id>
+      </ms:polygon>
+    </gml:featureMember>
+</wfs:FeatureCollection>
\ No newline at end of file
diff --git a/examples/google-reproject.html b/examples/google-reproject.html
new file mode 100644
index 0000000..4272752
--- /dev/null
+++ b/examples/google-reproject.html
@@ -0,0 +1,57 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Google with Overlay Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <!-- this gmaps key generated for http://openlayers.org/dev/ -->
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            var satellite = new OpenLayers.Layer.Google(
+                "Google Satellite" , {type: G_SATELLITE_MAP}
+            );
+
+            var wms = new OpenLayers.Layer.WMS(
+                "World Map",
+                "http://world.freemap.in/cgi-bin/mapserv",
+                {
+                    map: '/www/freemap.in/world/map/factbooktrans.map',
+                    transparent: 'TRUE',
+                    layers: 'factbook'
+                },
+                {'reproject': true}
+            );
+
+            map.addLayers([satellite, wms]);
+
+            map.setCenter(new OpenLayers.LonLat(10.205188,48.857593), 5);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Google with Overlay Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate a Google basemap used with boundary overlay layer.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        An overlay in a Geographic projection can be stretched to somewhat
+        line up with Google tiles (in a Mercator projection).  Results get
+        worse farther from the equator.  Use the "reproject" option on a
+        layer to get this behavior.  Use the sphericalMercator option on
+        a Google layer to get proper overlays (with other layers in
+        Spherical Mercator).
+    </div>
+  </body>
+</html>
diff --git a/examples/google-v3-alloverlays.html b/examples/google-v3-alloverlays.html
new file mode 100644
index 0000000..08b360b
--- /dev/null
+++ b/examples/google-v3-alloverlays.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers Google (v3) Layer Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+        <link rel="stylesheet" href="../theme/default/google.css" type="text/css">
+        <link rel="stylesheet" href="style.css" type="text/css">
+        <script src="http://maps.google.com/maps/api/js?sensor=false"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="google-v3-alloverlays.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Google (v3) allOverlays Layer Example</h1>
+        <p id="shortdesc">
+            Demonstrate use the Google Maps v3 API with allOverlays set to true on the map.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                You can also use Google layers as overlays, e.g. in a map with
+                allOverlays set to true. Note some of the layers disappear as
+                you zoom in to levels that are not supported by all layers.  See the 
+                <a href="google-v3-alloverlays.js" target="_blank">google-v3-alloverlays.js source</a> 
+                to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/google-v3-alloverlays.js b/examples/google-v3-alloverlays.js
new file mode 100644
index 0000000..e2e4da4
--- /dev/null
+++ b/examples/google-v3-alloverlays.js
@@ -0,0 +1,35 @@
+var map;
+
+function init() {
+    map = new OpenLayers.Map('map', {allOverlays: true});
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    
+    // the SATELLITE layer has all 22 zoom level, so we add it first to
+    // become the internal base layer that determines the zoom levels of the
+    // map.
+    var gsat = new OpenLayers.Layer.Google(
+        "Google Satellite",
+        {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22}
+    );
+    var gphy = new OpenLayers.Layer.Google(
+        "Google Physical",
+        {type: google.maps.MapTypeId.TERRAIN, visibility: false}
+    );
+    var gmap = new OpenLayers.Layer.Google(
+        "Google Streets", // the default
+        {numZoomLevels: 20, visibility: false}
+    );
+    var ghyb = new OpenLayers.Layer.Google(
+        "Google Hybrid",
+        {type: google.maps.MapTypeId.HYBRID, numZoomLevels: 22, visibility: false}
+    );
+
+    map.addLayers([gsat, gphy, gmap, ghyb]);
+
+    // Google.v3 uses EPSG:900913 as projection, so we have to
+    // transform our coordinates
+    map.setCenter(new OpenLayers.LonLat(10.2, 48.9).transform(
+        new OpenLayers.Projection("EPSG:4326"),
+        map.getProjectionObject()
+    ), 5);
+}
diff --git a/examples/google-v3.html b/examples/google-v3.html
new file mode 100644
index 0000000..0b65073
--- /dev/null
+++ b/examples/google-v3.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers Google (v3) Layer Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+        <link rel="stylesheet" href="../theme/default/google.css" type="text/css">
+        <link rel="stylesheet" href="style.css" type="text/css">
+        <script src="http://maps.google.com/maps/api/js?sensor=false"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="google-v3.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Google (v3) Layer Example</h1>
+        <p id="shortdesc">
+            Demonstrate use the Google Maps v3 API.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                If you use the Google Maps v3 API with a Google layer, you don't
+                need to include an API key.  This layer only works in the 
+                spherical mercator projection.  See the 
+                <a href="google-v3.js" target="_blank">google-v3.js source</a> 
+                to see how this is done.
+            <p>
+                In order to position the Google attribution div in the default 
+                location, you must include the extra theme/default/google.css 
+                stylesheet.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/google-v3.js b/examples/google-v3.js
new file mode 100644
index 0000000..9c173e3
--- /dev/null
+++ b/examples/google-v3.js
@@ -0,0 +1,32 @@
+var map;
+
+function init() {
+    map = new OpenLayers.Map('map');
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    
+    var gphy = new OpenLayers.Layer.Google(
+        "Google Physical",
+        {type: google.maps.MapTypeId.TERRAIN}
+    );
+    var gmap = new OpenLayers.Layer.Google(
+        "Google Streets", // the default
+        {numZoomLevels: 20}
+    );
+    var ghyb = new OpenLayers.Layer.Google(
+        "Google Hybrid",
+        {type: google.maps.MapTypeId.HYBRID, numZoomLevels: 20}
+    );
+    var gsat = new OpenLayers.Layer.Google(
+        "Google Satellite",
+        {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22}
+    );
+
+    map.addLayers([gphy, gmap, ghyb, gsat]);
+
+    // Google.v3 uses EPSG:900913 as projection, so we have to
+    // transform our coordinates
+    map.setCenter(new OpenLayers.LonLat(10.2, 48.9).transform(
+        new OpenLayers.Projection("EPSG:4326"),
+        map.getProjectionObject()
+    ), 5);
+}
diff --git a/examples/google.html b/examples/google.html
new file mode 100644
index 0000000..3adc50f
--- /dev/null
+++ b/examples/google.html
@@ -0,0 +1,63 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Google Layer Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="../theme/default/google.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <!-- this gmaps key generated for http://openlayers.org/dev/ -->
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init() {
+            map = new OpenLayers.Map('map');
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            
+            var gphy = new OpenLayers.Layer.Google(
+                "Google Physical",
+                {type: G_PHYSICAL_MAP}
+            );
+            var gmap = new OpenLayers.Layer.Google(
+                "Google Streets", // the default
+                {numZoomLevels: 20}
+            );
+            var ghyb = new OpenLayers.Layer.Google(
+                "Google Hybrid",
+                {type: G_HYBRID_MAP, numZoomLevels: 20}
+            );
+            var gsat = new OpenLayers.Layer.Google(
+                "Google Satellite",
+                {type: G_SATELLITE_MAP, numZoomLevels: 22}
+            );
+
+
+            map.addLayers([gphy, gmap, ghyb, gsat]);
+
+            map.setCenter(new OpenLayers.LonLat(10.2, 48.9), 5);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Google Layer Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate use of the various types of Google layers.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+     <p>
+        For best performance, you must be using a version of the Google Maps
+        API which is v2.93 or higher. In order to use this version of the API,
+        it is best to simply set your application to use the string "v=2" in
+        the request, rather than tying your application to an explicit version.</p>
+     <p>
+       In order to position the Google attribution div in the default location,
+       you must include the extra theme/default/google.css stylesheet.</p>
+    </div>
+  </body>
+</html>
diff --git a/examples/graphic-name.html b/examples/graphic-name.html
new file mode 100644
index 0000000..cef30c2
--- /dev/null
+++ b/examples/graphic-name.html
@@ -0,0 +1,89 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Graphic Names</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        // user custom graphicname
+        
+        OpenLayers.Renderer.symbol.lightning = [0,0, 4,2, 6,0, 10,5, 6,3, 4,5, 0,0];
+        OpenLayers.Renderer.symbol.rectangle = [0,0, 4,0, 4,10, 0,10, 0,0];
+            
+        var map;
+
+        function init() {
+            map = new OpenLayers.Map('map');
+
+            // list of well-known graphic names
+            var graphics = ["star", "cross", "x", "square", "triangle", "circle", "lightning", "rectangle"];
+            
+            // Create one feature for each well known graphic.
+            // Give features a type attribute with the graphic name.
+            var num = graphics.length;
+            var slot = map.maxExtent.getWidth() / num;
+            var features = Array(num);
+            for(var i=0; i<graphics.length; ++i) {
+                lon = map.maxExtent.left + (i * slot) + (slot / 2);
+                features[i] = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(
+                        map.maxExtent.left + (i * slot) + (slot / 2), 0
+                    ), {
+                        type: graphics[i]
+                    }
+                );
+            }
+            
+            // Create a style map for painting the features.
+            // The graphicName property of the symbolizer is evaluated using
+            // the type attribute on each feature (set above).
+            var styles = new OpenLayers.StyleMap({
+                "default": {
+                    graphicName: "${type}",
+                    pointRadius: 10,
+                    strokeColor: "fuchsia",
+                    strokeWidth: 2,
+                    fillColor: "lime",
+                    fillOpacity: 0.6
+                },
+                "select": {
+                    pointRadius: 20,
+                    fillOpacity: 1,
+                    rotation: 45
+                }
+            });
+
+            // Create a vector layer and give it your style map.
+            var layer = new OpenLayers.Layer.Vector(
+                "Graphics", {styleMap: styles, isBaseLayer: true}
+            );
+            layer.addFeatures(features);
+            map.addLayer(layer);
+            
+            // Create a select feature control and add it to the map.
+            var select = new OpenLayers.Control.SelectFeature(layer, {hover: true});
+            map.addControl(select);
+            select.activate();
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Named Graphics Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Shows how to use well-known graphic names.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        OpenLayers supports well-known names for a few graphics.  You can use
+        the names "star", "cross", "x", "square", "triangle", and "circle" as
+        the value for the graphicName property of a symbolizer.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/examples/graticule.html b/examples/graticule.html
new file mode 100644
index 0000000..2dcd458
--- /dev/null
+++ b/examples/graticule.html
@@ -0,0 +1,111 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Graticule Example</title>
+
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            #map {
+                width: 600px;
+                height: 300px;
+                border: 1px solid black;
+                float:left;
+            }
+            #map2 {
+                width: 400px;
+                height: 400px;
+                border: 1px solid black;
+                float:left;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="http://proj4js.org/lib/proj4js-compressed.js"></script>
+        <script type="text/javascript">
+            Proj4js.defs["EPSG:42304"]="+title=Atlas of Canada, LCC +proj=lcc +lat_1=49 +lat_2=77 +lat_0=49 +lon_0=-95 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs";
+            
+            var graticuleCtl1, graticuleCtl2;
+            var map1, map2;
+            function init(){
+              initLonLat();
+              initProjected();
+            }
+            function initLonLat(){
+                graticuleCtl1 = new OpenLayers.Control.Graticule({
+                    numPoints: 2, 
+                    labelled: true
+                });
+                map1 = new OpenLayers.Map('map', {
+                    controls: [
+                      graticuleCtl1,
+                      new OpenLayers.Control.LayerSwitcher(),
+                      new OpenLayers.Control.PanZoomBar(),
+                      new OpenLayers.Control.Navigation()
+                      ]
+                });
+
+                var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'}, {wrapDateLine: true} );
+
+                map1.addLayers([ol_wms]);
+                if (!map1.getCenter()) map1.zoomToMaxExtent();
+            };
+            
+            function initProjected(){
+                var extent = new OpenLayers.Bounds(-2200000,-712631,3072800,3840000);
+                graticuleCtl2 = new OpenLayers.Control.Graticule({
+                    labelled: true,
+                    targetSize: 200
+                });
+                var mapOptions = {
+                      controls: [
+                        graticuleCtl2,
+                        new OpenLayers.Control.LayerSwitcher(),
+                        new OpenLayers.Control.PanZoomBar(),
+                        new OpenLayers.Control.Navigation()
+                      ],
+                      //scales: tempScales,
+                      maxExtent: extent,
+                      maxResolution: 50000,
+                      units: 'm',
+                      projection: 'EPSG:42304'
+                };
+                map2 = new OpenLayers.Map('map2', mapOptions);
+
+                var dm_wms = new OpenLayers.Layer.WMS( "DM Solutions Demo",
+                  "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap", {
+                     layers: "bathymetry",
+                     format: "image/png"
+                  },{
+                      singleTile: true
+                  });
+
+                map2.addLayers([dm_wms]);
+                if (!map2.getCenter()) map2.zoomToExtent(extent);
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Graticule Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Adds a Graticule control to the map to display a grid of 
+            latitude and longitude. 
+        </p>
+
+        <div id="map" class="smallmap"></div>
+        <div id="map2" class="smallmap"></div>
+
+        <div id="docs"></div>
+        <br style="clear:both" />
+        <ul>
+            <li><a href="#" 
+                onclick="graticuleCtl1.activate(); graticuleCtl2.activate(); return false;">Activate graticule controls</a></li>
+            <li><a href="#" 
+                onclick="graticuleCtl1.deactivate(); graticuleCtl2.deactivate(); return false;">Deactivate graticule controls</a></li>
+        </ul>
+    </body>
+</html>
diff --git a/examples/gutter.html b/examples/gutter.html
new file mode 100644
index 0000000..d769388
--- /dev/null
+++ b/examples/gutter.html
@@ -0,0 +1,54 @@
+<html>
+  <head>
+      <title>OpenLayers Gutter Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        p.caption {
+            width: 512px;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 2;
+        var map;
+        window.onload = function() {
+            options = {maxExtent: new OpenLayers.Bounds(-73.5295, 41.2318,
+                                                        -69.9097, 42.8883),
+                       maxResolution: 0.0003}
+            map = new OpenLayers.Map('map', options);
+            var roads15 = new OpenLayers.Layer.WMS( "Roads (15px gutter)",
+                "http://boston.freemap.in/cgi-bin/mapserv?map=/www/freemap.in/boston/map/gmaps.map&",
+                {layers: 'roads_200_40'},
+                {gutter: 15});
+            var roads = new OpenLayers.Layer.WMS( "Roads (no gutter)",
+                "http://boston.freemap.in/cgi-bin/mapserv?map=/www/freemap.in/boston/map/gmaps.map&",
+                {layers: 'roads_200_40'});
+            map.addLayers([roads, roads15]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.setCenter(new OpenLayers.LonLat(-71.848, 42.2), 0);
+        }
+    </script>
+  </head>
+  <body>
+    <h1 id="title">Gutter Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrates map tiling artifacts, and OpenLayer's facility for correcting this distortion.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p class="caption">
+            When you render tiles with certain types of symbols, there are artifacts
+            at tile edges that make symbology not look continuous.  In the center of
+            the above map (when it first loads), the large orange road is split
+            vertically by a tile.  Open the layer switcher and change to the layer
+            with a 15 pixel gutter to see how the symbology looks nicer.
+        </p>
+    </div>
+  </body>
+</html>
diff --git a/examples/highlight-feature.html b/examples/highlight-feature.html
new file mode 100644
index 0000000..cf7869c
--- /dev/null
+++ b/examples/highlight-feature.html
@@ -0,0 +1,80 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>SelectFeature Control for Select and Highlight</title> 
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #controlToggle li {
+            list-style: none;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+        var map, controls;
+
+        OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
+
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            var vectors = new OpenLayers.Layer.Vector("vector", {isBaseLayer: true});
+            map.addLayers([vectors]);
+
+            var feature = new OpenLayers.Feature.Vector(
+                OpenLayers.Geometry.fromWKT(
+                    "POLYGON((28.828125 0.3515625, 132.1875 -13.0078125, -1.40625 -59.4140625, 28.828125 0.3515625))"
+                )
+            );
+            vectors.addFeatures([feature]);
+
+            var feature2 = new OpenLayers.Feature.Vector(
+                OpenLayers.Geometry.fromWKT(
+                    "POLYGON((-120.828125 -50.3515625, -80.1875 -80.0078125, -40.40625 -20.4140625, -120.828125 -50.3515625))"
+                )
+            );
+            vectors.addFeatures([feature2]);
+
+            var report = function(e) {
+                OpenLayers.Console.log(e.type, e.feature.id);
+            };
+            
+            var highlightCtrl = new OpenLayers.Control.SelectFeature(vectors, {
+                hover: true,
+                highlightOnly: true,
+                renderIntent: "temporary",
+                eventListeners: {
+                    beforefeaturehighlighted: report,
+                    featurehighlighted: report,
+                    featureunhighlighted: report
+                }
+            });
+
+            var selectCtrl = new OpenLayers.Control.SelectFeature(vectors,
+                {clickout: true}
+            );
+
+            map.addControl(highlightCtrl);
+            map.addControl(selectCtrl);
+
+            highlightCtrl.activate();
+            selectCtrl.activate();
+
+            map.addControl(new OpenLayers.Control.EditingToolbar(vectors));
+
+            map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Select and Highlight Feature Example</h1>
+    <p id="shortdesc">
+      Select features on click, highlight features on hover.
+    </p>  
+    <div id="map" class="smallmap"></div>
+    <p>Select features by clicking on them. Just highlight features by hovering over
+    them.</p>
+  </body>
+</html>
diff --git a/examples/hover-handler.html b/examples/hover-handler.html
new file mode 100644
index 0000000..695f479
--- /dev/null
+++ b/examples/hover-handler.html
@@ -0,0 +1,211 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Hover Handler Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />        
+        <style type="text/css">
+            #map {
+                width: 340px;
+                height: 170px;
+                border: 1px solid gray;
+            }
+            #west {
+                width: 350px;
+            }
+            #east {
+                position: absolute;
+                left: 370px;
+                top: 3em;
+            }
+
+            table td {
+                text-align: center;
+                margin: 0;
+                border: 1px solid gray;
+            }
+            textarea.output {
+                text-align: left;
+                font-size: 0.9em;
+                width: 250px;
+                height: 65px;
+                overflow: auto;
+            }
+        </style>
+        <script src="../lib/Firebug/firebug.js"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+
+            OpenLayers.Control.Hover = OpenLayers.Class(OpenLayers.Control, {                
+                defaultHandlerOptions: {
+                    'delay': 500,
+                    'pixelTolerance': null,
+                    'stopMove': false
+                },
+
+                initialize: function(options) {
+                    this.handlerOptions = OpenLayers.Util.extend(
+                        {}, this.defaultHandlerOptions
+                    );
+                    OpenLayers.Control.prototype.initialize.apply(
+                        this, arguments
+                    ); 
+                    this.handler = new OpenLayers.Handler.Hover(
+                        this,
+                        {'pause': this.onPause, 'move': this.onMove},
+                        this.handlerOptions
+                    );
+                }, 
+
+                onPause: function(evt) {
+                    var output = document.getElementById(this.key + 'Output');
+                    var msg = 'pause ' + evt.xy;
+                    output.value = output.value + msg + "\r\n";
+                },
+
+                onMove: function(evt) {
+                    // if this control sent an Ajax request (e.g. GetFeatureInfo) when
+                    // the mouse pauses the onMove callback could be used to abort that
+                    // request.
+                }
+            });
+
+            var map, controls; 
+
+            function init(){
+        
+                map = new OpenLayers.Map('map');
+                var layer = new OpenLayers.Layer.WMS(
+                    'OpenLayers WMS',
+                    'http://vmap0.tiles.osgeo.org/wms/vmap0',
+                    {layers: 'basic'}
+                );
+                map.addLayers([layer]);
+                
+                controls = {
+                    'long': new OpenLayers.Control.Hover({
+                        handlerOptions: {
+                            'delay': 2000
+                        }
+                    }),
+                    'short': new OpenLayers.Control.Hover({
+                        handlerOptions: {
+                            'delay': 100
+                        }
+                    }),
+                    'tolerant': new OpenLayers.Control.Hover({
+                        handlerOptions: {
+                            'delay': 1000,
+                            'pixelTolerance': 6
+                        }
+                    }),
+                    'untolerant': new OpenLayers.Control.Hover({
+                        handlerOptions: {
+                            'delay': 1000,
+                            'pixelTolerance': 1
+                        }
+                    }),
+                    'stoppropag': new OpenLayers.Control.Hover({
+                        handlerOptions: {
+                            'stopMove': true
+                        }
+                    })
+                };
+
+                var props = document.getElementById("props");
+                var control;
+                for(var key in controls) {
+                    control = controls[key];
+                    // only to route output here
+                    control.key = key;
+                    map.addControl(control);
+                }
+
+                map.addControl(new OpenLayers.Control.MousePosition());
+                map.zoomToMaxExtent();
+            }
+            
+            function toggle(key) {
+                var control = controls[key];
+                if(control.active) {
+                    control.deactivate();
+                } else {
+                    control.activate();
+                }
+                var status = document.getElementById(key + "Status");
+                status.innerHTML = control.active ? "on" : "off";
+                var output = document.getElementById(key + "Output");
+                output.value = "";
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Hover Handler Example</h1>
+        <div id="west">
+    
+            <div id="tags">
+            </div>
+    
+            <p id="shortdesc">
+                This example shows the use of the hover handler.
+            </p>
+    
+            <div id="map" class="smallmap"></div>
+            <p>
+                The hover handler is to be used to emulate mouseovers on
+                objects on the map that aren't DOM elements. For example
+                one can use the hover hander to send WMS/GetFeatureInfo
+                requests as the user moves the mouse over the map.
+            </p>
+            <p>
+                The "delay" option specifies the number of milliseconds
+                before the event is considered a hover. Default is 500
+                milliseconds.
+            </p>
+            <p>
+                The "pixelTolerance" option specifies the maximum number
+                of pixels between mousemoves for an event to be
+                considered a hover. Default is null, which means no
+                pixel tolerance.
+            </p>
+            <p>
+                The "stopMove" option specifies whether other mousemove
+                listeners registered before the hover handler listener must
+                be notified on mousemoves or not. Default is false (meaning
+                that the other mousemove listeners will be notified on
+                mousemove).
+            </p>
+        </div>
+        <div id="east">
+            <table>
+                <caption>Controls with hover handlers (toggle on/off to clear output)</caption>
+                <tbody>
+                    <tr>
+                        <td>long delay (2 sec)</td>
+                        <td><button id="longStatus" onclick="toggle('long')">off</button></td>
+                        <td><textarea class="output" id="longOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>short delay (100 msec)</td>
+                        <td><button id="shortStatus" onclick="toggle('short')">off</button></td>
+                        <td><textarea class="output" id="shortOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>tolerant (6 pixels)</td>
+                        <td><button id="tolerantStatus" onclick="toggle('tolerant')">off</button></td>
+                        <td><textarea class="output" id="tolerantOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>untolerant (1 pixel)</td>
+                        <td><button id="untolerantStatus" onclick="toggle('untolerant')">off</button></td>
+                        <td><textarea class="output" id="untolerantOutput"></textarea></td>
+                    </tr>
+                    <tr>
+                        <td>stop propagation</td>
+                        <td><button id="stoppropagStatus" onclick="toggle('stoppropag')">off</button></td>
+                        <td><textarea class="output" id="stoppropagOutput"></textarea></td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+    </body>
+</html>
diff --git a/examples/image-layer.html b/examples/image-layer.html
new file mode 100644
index 0000000..fe0d542
--- /dev/null
+++ b/examples/image-layer.html
@@ -0,0 +1,69 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+      <title>OpenLayers Image Layer Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        p.caption {
+            width: 512px;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            var options = {numZoomLevels: 3};
+
+            var graphic = new OpenLayers.Layer.Image(
+                'City Lights',
+                'http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif',
+                new OpenLayers.Bounds(-180, -88.759, 180, 88.759),
+                new OpenLayers.Size(580, 288),
+                options
+            );
+            
+            graphic.events.on({
+                loadstart: function() {
+                    OpenLayers.Console.log("loadstart");
+                },
+                loadend: function() {
+                    OpenLayers.Console.log("loadend");
+                }
+            });
+
+            var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
+                "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                {layers: "landsat7"}, options);
+
+            map.addLayers([graphic, jpl_wms]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Image Layer Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate a single non-tiled image as a selectable base layer.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p class="caption">
+            The "City Lights" layer above is created from a single web accessible
+            image.  If you construct it without any resolution related options,
+            the layer will be given a single resolution based on the extent/size.
+            Otherwise, it behaves much like a regular layer.  This is primarily
+            intended to be used in an overview map - where another layer type
+            might not make a good overview.
+        </p>
+    </div>
+  </body>
+</html>
diff --git a/examples/intersects.html b/examples/intersects.html
new file mode 100644
index 0000000..2c70648
--- /dev/null
+++ b/examples/intersects.html
@@ -0,0 +1,183 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Geometry Intersections</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        html, body {
+            margin: 0;
+            padding: 1em;
+            font: 0.9em Verdana, Arial, sans serif;
+        }
+        input, select, textarea {
+            font: 0.9em Verdana, Arial, sans-serif;
+        }
+        h2 {
+            margin-top: 0.75em;
+            font-size: 1.6em;
+        }
+        #leftcol {
+            position: absolute;
+            top: 0;
+            left: 1em;
+            padding: 0;
+            width: 455px;
+        }
+        #map {
+            width: 450px;
+            height: 225px;
+            border: 1px solid #ccc;
+        }
+        #input {
+            width: 450px;
+        }
+        #text {
+            font-size: 0.85em;
+            margin: 1em 0 1em 0;
+            width: 100%;
+            height: 10em;
+        }
+        #info {
+            position: relative;
+            padding: 2em 0;
+            margin-left: 470px;
+        }
+        #features {
+            font-size: 0.8em;
+            width: 100%;
+            height: 200px;
+        }
+        #intersections {
+            font-size: 0.8em;
+            width: 100%;
+            height: 200px;
+        }
+        p {
+            margin: 0;
+            padding: 0.75em 0 0.75em 0;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, vectors, geojson;
+        function init(){
+            map = new OpenLayers.Map('map');
+            vectors = new OpenLayers.Layer.Vector(
+                "Vector Layer",
+                {isBaseLayer: true}
+            );
+
+            map.addLayers([vectors]);
+            map.addControl(new OpenLayers.Control.MousePosition());
+            
+            var panel = new OpenLayers.Control.EditingToolbar(vectors);
+            map.addControl(panel);
+
+            geojson = new OpenLayers.Format.GeoJSON();
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+        }
+        
+        function serialize() {
+            var str = geojson.write(vectors.features, true);
+            document.getElementById('features').value = str;
+        }
+
+        function deserialize() {
+            var element = document.getElementById('text');
+            var features = geojson.read(element.value);
+            var bounds;
+            if(features) {
+                if(features.constructor != Array) {
+                    features = [features];
+                }
+                for(var i=0; i<features.length; ++i) {
+                    if (!bounds) {
+                        bounds = features[i].geometry.getBounds();
+                    } else {
+                        bounds.extend(features[i].geometry.getBounds());
+                    }
+                    
+                }
+                vectors.addFeatures(features);
+                map.zoomToExtent(bounds);
+                var plural = (features.length > 1) ? 's' : '';
+                element.value = features.length + ' feature' + plural + ' added'
+            } else {
+                element.value = 'Bad input';
+            }
+        }
+        
+        function intersect() {
+            var features = vectors.features;
+            var feat1, feat2, intersects12, intersects21;
+            var parts = [];
+            // reset attributes
+            for(var i=0; i<features.length; ++i) {
+                features[i].attributes.intersectsWith = [];
+            }
+            for(var i=0; i<features.length-1; ++i) {
+                feat1 = features[i];
+                for(var j=i+1; j<features.length; ++j) {
+                    feat2 = features[j];
+                    intersects12 = feat1.geometry.intersects(feat2.geometry);
+                    if(intersects12) {
+                        feat1.attributes.intersectsWith.push("f" + j);
+                        parts.push("f" + i + " intersects f" + j + "\n");
+                    }
+                    intersects21 = feat2.geometry.intersects(feat1.geometry);
+                    if(intersects21) {
+                        feat2.attributes.intersectsWith.push("f" + i);
+                        parts.push("f" + j + " intersects f" +  i + "\n");
+                    }
+                    if(intersects12 != intersects21) {
+                        parts.push("trouble with " + i + " and " + j + "\n");
+                    }
+                }
+            }
+            if(parts.length > 0) {
+                document.getElementById("intersections").value = parts.join("");
+            } else {
+                document.getElementById("intersections").value = "no intersections";
+            }
+        }
+
+        // preload images
+        (function() {
+            var roots = ["draw_point", "draw_line", "draw_polygon", "pan"];
+            var onImages = [];
+            var offImages = [];
+            for(var i=0; i<roots.length; ++i) {
+                onImages[i] = new Image();
+                onImages[i].src = "../theme/default/img/" + roots[i] + "_on.png";
+                offImages[i] = new Image();
+                offImages[i].src = "../theme/default/img/" + roots[i] + "_on.png";
+            }
+        })();
+
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="leftcol">
+        <h1 id="title">OpenLayers Geometry Intersection Example</h1>
+        <p id="shortdesc">
+            Use of geometry.intersects method for testing geometry intersections.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="input">
+            <textarea id="text"></textarea> 
+            <input type="button" value="add feature" onclick="deserialize();" />
+            <span id="selected"></span>
+        </div>
+    </div>
+    <div id="info">
+        Features
+        <input type="button" value="refresh" onclick="serialize();" /><br />
+        <textarea id="features"></textarea>
+        Intersections
+        <input type="button" value="intersect all" onclick="intersect();" /><br />
+        <textarea id="intersections"></textarea>
+    </div>
+  </body>
+</html>
diff --git a/examples/kamap.html b/examples/kamap.html
new file mode 100644
index 0000000..d823922
--- /dev/null
+++ b/examples/kamap.html
@@ -0,0 +1,39 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers KaMap Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            var jpl_wms = new OpenLayers.Layer.KaMap( "Satellite",
+                    "http://www.openlayers.org/world/index.php", {g: "satellite", map: "world"});
+            var dm_wms = new OpenLayers.Layer.WMS( "Canada",
+                "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
+                {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
+                         "prov_bound,fedlimit,rail,road,popplace",
+                 transparent: "true", format: "image/png" });
+
+            map.addLayers([jpl_wms, dm_wms]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">KaMap Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate a tiled kamap layer as the base map, which can be pre-cached for higher performance.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/kamap.txt b/examples/kamap.txt
new file mode 100644
index 0000000..50fa4e0
--- /dev/null
+++ b/examples/kamap.txt
@@ -0,0 +1,508 @@
+<?php
+/*
+
+This is a PHP file to be used as a backend for a ka-Map layer. It requires
+PHP with Mapscript and libgd modules installed. The top of the file
+is a configuration section: please edit the variables in this configuration
+section to meet your needs, then rename this file to tile.php or something
+similar and put it in a web accessible directory. More information
+on the OpenLayers ka-Map layer is available from:
+
+  http://trac.openlayers.org/wiki/OpenLayers.Layer.KaMap
+
+*/
+/**********************************************************************
+ *
+ * $Id: tile.php,v 1.33 2006/02/07 03:19:55 pspencer Exp $
+ *
+ * purpose: a simple phpmapscript-based tile renderer that implements
+ *          rudimentary caching for reasonable efficiency.  Note the
+ *          cache never shrinks in this version so your disk could
+ *          easily fill up!
+ *
+ * author: Paul Spencer (pspencer at dmsolutions.ca)
+ *
+ * modifications by Daniel Morissette (dmorissette at dmsolutions.ca)
+ *
+ * Modified by Christopher Schmidt for OpenLayers redistribution.
+ * 
+ **********************************************************************
+ *
+ * Copyright (c) 2005, DM Solutions Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
+ * DEALINGS IN THE SOFTWARE.
+ *
+ **********************************************************************/
+ 
+
+/****************************************************************************** 
+ * basic system configuration
+ *
+ * kaMap! uses PHP/MapScript and the PHP GD extension to
+ * render tiles, and uses PHP/MapScript to generate initialization parameters
+ * a legend, and a keymap from the selected map file.
+ *
+ * Make sure to set the correct module names for your PHP extensions.
+ *
+ * WINDOWS USERS: you will likely need to use php_gd2.dll instead of php_gd.dll
+ */
+$szPHPMapScriptModule = 'php_mapscript.'.PHP_SHLIB_SUFFIX;
+$szPHPGDModule = 'php_gd.'.PHP_SHLIB_SUFFIX;
+
+/****************************************************************************** 
+ * tile generation parameters
+ *
+ * kaMap! generates tiles to load in the client application by first rendering
+ * larger areas from the map file and then slicing them up into smaller tiles.
+ * This approach reduces the overhead of loading PHP/MapScript and PHP GD and 
+ * drawing the map file.  These larger areas are referred to as metaTiles in
+ * the code.  You can set the size of both the small tiles and the metaTiles
+ * here.  A reasonable size for the small tiles seems to be 200 pixels square.
+ * Smaller tiles seem to cause problems in client browsers by causing too many
+ * images to be created and thus slowing performance of live dragging.  Larger
+ * tiles take longer to download to the client and are inefficient.
+ *
+ * The number of smaller tiles that form a metaTile can also be configured.
+ * This parameter allows tuning of the tile generator to ensure optimal
+ * performance and for label placement.  MapServer will produce labels only
+ * within a rendered area.  If the area is too small then features may be
+ * labelled multiple times.  If the area is too large, it may exceed MapServer,s
+ * maximum map size (by default 2000x2000) or be too resource-intensive on the
+ * server, ultimately reducing performance.
+ */
+$tileWidth = 256;
+$tileHeight = 256;
+$metaWidth = 5;
+$metaHeight = 5;
+/* $metaBuffer = Buffer size in pixels to add around metatiles to avoid 
+ * rendering issues along the edge of the map image
+ */
+$metaBuffer = 10;  
+    
+/****************************************************************************** 
+ * in-image debugging information - tile location, outlines etc.
+ * to use this, you need to remove images from your cache first.  This also
+ * affects the meta tiles - if debug is on, they are not deleted.
+ */
+$bDebug = false;
+ 
+/****************************************************************************** 
+ * aszMapFiles - an array of map files available to the application.  How this
+ * is used is determined by the application.  Each map file is entered into
+ * this array as a key->value pair.
+ *
+ * The key is the name to be used by the tile caching system to store cached
+ * tiles within the base cache directory.  This key should be a single word
+ * that uniquely identifies the map.
+ *
+ * The value associated with each key is an array of three values.  The first
+ * value is a human-readable name to be presented to the user (should the
+ * application choose to do so) and the second value is the path to the map
+ * file.  It is assumed that the map file is fully configured for use with
+ * MapServer/MapScript as no error checking or setting of values is done.  The 
+ * third value is an array of scale values for zooming.
+ */
+ 
+$aszMapFiles = array(
+  "world"   => array( "World", "/path/to/your/mapfile",
+               array( 10000  ), # in openlayers, the scale array doesn't matter.
+               "PNG24")
+
+/* Add more elements to this array to offer multiple mapfiles */
+
+);
+
+/****************************************************************************** 
+ * figure out which map file to use and set up the necessary variables for
+ * the rest of the code to use.  This does need to be done on every page load
+ * unfortunately.
+ *
+ * szMap should be set to the default map file to use but can change if
+ * this script is called with map=<mapname>. 
+ */
+$szMap = 'world';
+
+/****************************************************************************** 
+ * kaMap! caching
+ * 
+ * this is the directory within which kaMap! will create its tile cache.  The
+ * directory does NOT have to be web-accessible, but it must be writable by the
+ * web-server-user and allow creation of both directories AND files.
+ *
+ * the tile caching system will create a separate subdirectory within the base
+ * cache directory for each map file.  Within the cache directory for each map
+ * file, directories will be created for each group of layers.  Within the group
+ * directories, directories will be created at each of the configured scales
+ * for the application (see mapfile configuration above.)
+ */
+$szBaseCacheDir =  "/var/cache/kamap/";
+
+/*****  END OF CONFIGURABLE STUFF - unless you know what you are doing   *****/
+/*****                                                                   *****/
+/*****                                                                   *****/
+/*****                                                                   *****/
+/*****  END OF CONFIGURABLE STUFF - unless you know what you are doing   *****/
+
+if (isset($_REQUEST['map']) && isset($aszMapFiles[$_REQUEST['map']]))
+{
+    $szMap = $_REQUEST['map'];
+}
+
+$szMapCacheDir = $szBaseCacheDir.$szMap."/";
+$szMapName = $aszMapFiles[$szMap][0];
+$szMapFile = $aszMapFiles[$szMap][1];
+$anScales = $aszMapFiles[$szMap][2];
+setOutputFormat($aszMapFiles[$szMap][3]);
+/****************************************************************************** 
+ * output format of the map and resulting tiles
+ *
+ * The output format used with MapServer can greatly affect appearance and
+ * performance.  It is recommended to use an 8 bit format such as PNG
+ *
+ * NOTE: the tile caching code in tile.php is not configurable here.  It
+ * currently assumes that it is outputting 8bit PNG files.  If you change to
+ * PNG24 here then you will need to update tile.php to use the gd function
+ * imagecreatetruecolor.  If you change the output format to jpeg then
+ * you would need to change imagepng() to imagejpeg().  A nice enhancement
+ * would be to make that fully configurable from here.
+ */
+function setOutputFormat($szFormat)
+{
+    switch($szFormat) {
+        case "PNG24":
+            $GLOBALS['szMapImageFormat'] = 'PNG24'; //mapscript format name
+            $GLOBALS['szMapImageCreateFunction'] = "imagecreatefrompng"; // appropriate GD function
+            $GLOBALS['szImageExtension'] = '.png'; //file extension
+            $GLOBALS['szImageCreateFunction'] = "imagecreatetruecolor"; //or imagecreatetruecolor if PNG24 ...
+            $GLOBALS['szImageOutputFunction'] = "imagepng"; //or imagegif, imagejpeg ...
+            $GLOBALS['szImageHeader'] = 'image/png'; //the content-type of the image        
+            break;
+        case "GIF":
+            $GLOBALS['szMapImageFormat'] = 'GIF'; //mapscript format name
+            $GLOBALS['szMapImageCreateFunction'] = "imagecreatefromgif"; // appropriate GD function
+            $GLOBALS['szImageExtension'] = '.gif'; //file extension
+            $GLOBALS['szImageCreateFunction'] = "imagecreate"; //or imagecreatetruecolor if PNG24 ...
+            $GLOBALS['szImageOutputFunction'] = "imagegif"; //or imagegif, imagejpeg ...
+            $GLOBALS['szImageHeader'] = 'image/gif'; //the content-type of the image        
+            break;
+        case "JPEG":
+            $GLOBALS['szMapImageFormat'] = 'JPEG'; //mapscript format name
+            $GLOBALS['szMapImageCreateFunction'] = "imagecreatefromjpeg"; // appropriate GD function
+            $GLOBALS['szImageExtension'] = '.jpg'; //file extension
+            $GLOBALS['szImageCreateFunction'] = "imagecreatetruecolor"; //or imagecreatetruecolor if PNG24 ...
+            $GLOBALS['szImageOutputFunction'] = "imagejpeg"; //or imagegif, imagejpeg ...
+            $GLOBALS['szImageHeader'] = 'image/jpeg'; //the content-type of the image        
+            break;
+        case "PNG":
+            $GLOBALS['szMapImageFormat'] = 'PNG'; //mapscript format name
+            $GLOBALS['szMapImageCreateFunction'] = "imagecreatefrompng"; // appropriate GD function
+            $GLOBALS['szImageExtension'] = '.png'; //file extension
+            $GLOBALS['szImageCreateFunction'] = "imagecreate"; //or imagecreatetruecolor if PNG24 ...
+            $GLOBALS['szImageOutputFunction'] = "imagepng"; //or imagegif, imagejpeg ...
+            $GLOBALS['szImageHeader'] = 'image/png'; //the content-type of the image        
+            break;
+        case "DITHERED":
+	case "PNG8":
+            $GLOBALS['szMapImageFormat'] = 'dithered';
+            $GLOBALS['szMapImageCreateFunction'] = "imagecreatefrompng";
+            $GLOBALS['szImageExtension'] = '.png';
+            $GLOBALS['szImageCreateFunction'] = "imagecreate";
+            $GLOBALS['szImageOutputFunction'] = "imagepng";
+            $GLOBALS['szImageHeader'] = 'image/png';
+            break;
+    }
+}
+
+/**
+ * create all directories in a directory tree - found on the php web site
+ * under the mkdir function ...
+ */
+function makeDirs($strPath, $mode = 0775)
+{
+   return is_dir($strPath) or ( makeDirs(dirname($strPath), $mode) and mkdir($strPath, $mode) );
+}
+
+/**
+ * This function replaces all special characters in the given string.
+ *
+ * @param szString string - The string to convert.
+ *
+ * @return string converted
+ */
+function normalizeString($szString)
+{
+    // Normalize string by replacing all special characters
+    // e.g.    "http://my.host.com/cgi-bin/mywms?"
+    // becomes "http___my_host_com_cgi_bin_mywms_"
+    return preg_replace("/(\W)/", "_", $szString);
+}
+
+/* bug 1253 - root permissions required to delete cached files */
+$orig_umask = umask(0);
+
+/* create the main cache directory if necessary */
+if (!@is_dir($szMapCacheDir))
+    makeDirs($szMapCacheDir);
+
+/* get the various request parameters 
+ * also need to make sure inputs are clean, especially those used to
+ * build paths and filenames
+ */
+ /*
+ * the tile renderer accepts several parameters and returns a tile image from
+ * the cache, creating the tile only if necessary.
+ *
+ * all requests include the pixel location of the request at a certain scale
+ * and this script figures out the geographic location of the tile from the
+ * scale assuming that 0,0 in pixels is 0,0 in geographic units
+ * 
+ * Request parameters are:
+ *
+ * map: the name of the map to use.  This is handled by config.php.
+ * 
+ * t: top pixel position
+ * l: left pixel position
+ * s: scale
+ * g: (optional) comma-delimited list of group names to draw
+ * layers: (optional) comma-delimited list of layers to draw
+ * force: optional.  If set, force redraw of the meta tile.  This was added to
+ *        help with invalid images sometimes being generated.
+ * tileid: (optional) can be used instead of t+l to specify the tile coord.,
+ *         useful in regenerating the cache
+ */
+
+$top = isset( $_REQUEST['t'] ) ? intval($_REQUEST['t']) : 0;
+$left = isset( $_REQUEST['l'] ) ? intval($_REQUEST['l']) : 0;
+$scale = isset( $_REQUEST['s'] ) ? $_REQUEST['s'] : $anScales[0];
+$bForce = isset($_REQUEST['force'])? true : false;
+$groups = isset( $_REQUEST['g'] ) ? $_REQUEST['g'] : "";
+$layers = isset( $_REQUEST['layers'] ) ? $_REQUEST['layers'] : "";
+
+// dynamic imageformat ----------------------------------------------
+//use the function in config.php to set the output format
+if (isset($_REQUEST['i']))
+   setOutputFormat( $_REQUEST['i'] );
+//----------------------------------------------------------------
+
+/* tileid=t#####l#### can be used instead of t+l parameters. Useful in
+ * regenerating the cache for instance.
+ */
+if (isset( $_REQUEST['tileid']) &&
+    preg_match("/t(-?\d+)l(-?\d+)/", $_REQUEST['tileid'], $aMatch) )
+{
+    $top = intval($aMatch[1]);
+    $left = intval($aMatch[2]);
+}
+
+/* Calculate the metatile's top-left corner coordinates.
+ * Include the $metaBuffer around the metatile to account for various
+ * rendering issues happening around the edge of a map
+ */
+$metaLeft = floor( ($left)/($tileWidth*$metaWidth) ) * $tileWidth * $metaWidth;
+$metaTop = floor( ($top)/($tileHeight*$metaHeight) ) * $tileHeight *$metaHeight;
+$szMetaTileId = "t".$metaTop."l".$metaLeft;
+$metaLeft -= $metaBuffer;
+$metaTop -= $metaBuffer;
+
+/* caching is done by scale value, then groups and layers and finally metatile
+ * and tile id. Create a new directory if necessary
+ */
+$szGroupDir = $groups != "" ? normalizeString($groups) : "def"; 
+$szLayerDir = $layers != "" ? normalizeString($layers) : "def"; 
+
+$szCacheDir = $szMapCacheDir."/".$scale."/".$szGroupDir."/".$szLayerDir."/".$szMetaTileId;
+if (!@is_dir($szCacheDir))
+    makeDirs($szCacheDir);
+
+/* resolve cache hit - clear the os stat cache if necessary */
+$szTileId = "t".$top."l".$left;
+$szCacheFile = $szCacheDir."/".$szTileId.$szImageExtension;
+clearstatcache();
+
+$szMetaDir = $szCacheDir."/meta";
+if (!@is_Dir($szMetaDir))
+    makeDirs($szMetaDir);
+
+/* simple locking in case there are several requests for the same meta
+   tile at the same time - only draw it once to help with performance */
+$szLockFile = $szMetaDir."/lock_".$metaTop."_".$metaLeft;
+$fpLockFile = fopen($szLockFile, "a+");
+clearstatcache();
+if (!file_exists($szCacheFile) || $bForce)
+{
+    flock($fpLockFile, LOCK_EX);
+    fwrite($fpLockFile, ".");
+    
+    //check once more to see if the cache file was created while waiting for
+    //the lock
+    clearstatcache();
+    if (!file_exists($szCacheFile) || $bForce)
+    {
+        if (!extension_loaded('MapScript'))
+        {
+            dl( $szPHPMapScriptModule );
+        }
+        if (!extension_loaded('gd'))
+        {
+            dl( $szPHPGDModule);
+        }
+        
+        if (!@is_Dir($szMetaDir))
+            makeDirs($szMetaDir);    
+        
+        $oMap = ms_newMapObj($szMapFile);
+               
+        /* Metatile width/height include 2x the metaBuffer value */
+        $oMap->set('width', $tileWidth * $metaWidth + 2*$metaBuffer);
+        $oMap->set('height', $tileHeight * $metaHeight + 2*$metaBuffer);
+        
+        /* Tell MapServer to not render labels inside the metaBuffer area
+         * (new in 4.6) 
+         * TODO: Until MapServer bugs 1353/1355 are resolved, we need to
+         * pass a negative value for "labelcache_map_edge_buffer"
+         */
+        $oMap->setMetadata("labelcache_map_edge_buffer", -$metaBuffer);
+
+        $inchesPerUnit = array(1, 12, 63360.0, 39.3701, 39370.1, 4374754);
+        $geoWidth = $scale/($oMap->resolution*$inchesPerUnit[$oMap->units]);
+        $geoHeight = $scale/($oMap->resolution*$inchesPerUnit[$oMap->units]);
+        
+        /* draw the metatile */
+        $minx = $metaLeft * $geoWidth;
+        $maxx = $minx + $geoWidth * $oMap->width;
+        $maxy = -1 * $metaTop * $geoHeight;
+        $miny = $maxy - $geoHeight * $oMap->height;
+        
+        $nLayers = $oMap->numlayers;
+        $oMap->setExtent($minx,$miny,$maxx,$maxy);
+        $oMap->selectOutputFormat( $szMapImageFormat );               
+        $aszLayers = array();
+        if ($groups || $layers)
+        {
+            /* Draw only specified layers instead of default from mapfile*/
+            if ($layers)
+            {
+                $aszLayers = explode(",", $layers);
+            }
+
+            if ($groups)
+            {
+                $aszGroups = explode(",", $groups);
+            }
+
+            for($i=0;$i<$nLayers;$i++)
+            {
+                $oLayer = $oMap->getLayer($i);
+                if (($aszGroups && in_array($oLayer->group,$aszGroups)) ||
+                    ($aszLayers && in_array($oLayer->name,$aszLayers)) ||
+                    ($aszGroups && $oLayer->group == '' && 
+                     in_array( "__base__", $aszGroups)))
+                {
+                    $oLayer->set("status", MS_ON );
+                }
+                else
+                {
+                    $oLayer->set("status", MS_OFF );
+                }
+            }
+            //need transparency if groups or layers are used
+            $oMap->outputformat->set("transparent", MS_ON );
+        }
+        else
+        {
+            $oMap->outputformat->set("transparent", MS_OFF );
+        }
+
+        
+        $szMetaImg = $szMetaDir."/t".$metaTop."l".$metaLeft.$szImageExtension;
+        $oImg = $oMap->draw();
+        $oImg->saveImage($szMetaImg);
+        $oImg->free();
+        eval("\$oGDImg = ".$szMapImageCreateFunction."('".$szMetaImg."');");
+        if ($bDebug)
+        {
+            $blue = imagecolorallocate($oGDImg, 0, 0, 255);
+            imagerectangle($oGDImg, 0, 0, $tileWidth * $metaWidth - 1, $tileHeight * $metaHeight - 1, $blue );
+        }
+        for($i=0;$i<$metaWidth;$i++)
+        {
+            for ($j=0;$j<$metaHeight;$j++)
+            {
+                eval("\$oTile = ".$szImageCreateFunction."( ".$tileWidth.",".$tileHeight." );");
+                // Allocate BG color for the tile (in case the metatile has transparent BG)
+                $nTransparent = imagecolorallocate($oTile, $oMap->imagecolor->red, $oMap->imagecolor->green, $oMap->imagecolor->blue);
+                //if ($oMap->outputformat->transparent == MS_ON)
+                //{
+                    imagecolortransparent( $oTile,$nTransparent);
+                //}
+                $tileTop = $j*$tileHeight + $metaBuffer;
+                $tileLeft = $i*$tileWidth + $metaBuffer;
+                imagecopy( $oTile, $oGDImg, 0, 0, $tileLeft, $tileTop, $tileWidth, $tileHeight );
+                /* debugging stuff */
+                if ($bDebug)
+                {
+                    $black = imagecolorallocate($oTile, 1, 1, 1);
+                    $green = imagecolorallocate($oTile, 0, 128, 0 );
+                    $red = imagecolorallocate($oTile, 255, 0, 0);
+                    imagerectangle( $oTile, 1, 1, $tileWidth-2, $tileHeight-2, $green ); 
+                    imageline( $oTile, 0, $tileHeight/2, $tileWidth-1, $tileHeight/2, $red);
+                    imageline( $oTile, $tileWidth/2, 0, $tileWidth/2, $tileHeight-1, $red);
+                    imagestring ( $oTile, 3, 10, 10, ($metaLeft+$tileLeft)." x ".($metaTop+$tileTop), $black );
+                    imagestring ( $oTile, 3, 10, 30, ($minx+$i*$geoWidth)." x ".($maxy - $j*$geoHeight), $black );
+                }
+                $szTileImg = $szCacheDir."/t".($metaTop+$tileTop)."l".($metaLeft+$tileLeft).$szImageExtension;
+                eval("$szImageOutputFunction( \$oTile, '".$szTileImg."' );");
+                imagedestroy($oTile);
+                $oTile = null;
+            }
+        }
+        if ($oGDImg != null)
+        {   
+            imagedestroy($oGDImg);
+            $oGDImg = null;
+        }
+        if (!$bDebug)
+        {
+            unlink( $szMetaImg );
+        }
+    }
+    //release the exclusive lock
+    flock($fpLockFile, LOCK_UN );
+}
+
+//acquire shared lock for reading to prevent a problem that could occur
+//if a tile exists but is only partially generated.
+flock($fpLockFile, LOCK_SH);
+
+$h = fopen($szCacheFile, "r");
+header("Content-Type: ".$szImageHeader);
+header("Content-Length: " . filesize($szCacheFile));
+header("Expires: " . date( "D, d M Y H:i:s GMT", time() + 31536000 ));
+header("Cache-Control: max-age=31536000, must-revalidate" );
+fpassthru($h);
+fclose($h);
+
+//release lock
+fclose($fpLockFile);
+
+/* bug 1253 - root permissions required to delete cached files */
+umask($orig_umask);
+
+exit;
+?>
diff --git a/examples/kml-layer.html b/examples/kml-layer.html
new file mode 100644
index 0000000..e4e8e8a
--- /dev/null
+++ b/examples/kml-layer.html
@@ -0,0 +1,43 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            map.addLayer(new OpenLayers.Layer.GML("KML", "kml/lines.kml", 
+               {
+                format: OpenLayers.Format.KML, 
+                formatOptions: {
+                  extractStyles: true, 
+                  extractAttributes: true,
+                  maxDepth: 2
+                }
+               }));
+            map.zoomToExtent(new OpenLayers.Bounds(-112.306698,36.017792,-112.03204,36.18087));
+        }
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">KML Layer Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+          Demonstrates loading and displaying a KML file on top of a basemap.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/kml-track.html b/examples/kml-track.html
new file mode 100644
index 0000000..02056c0
--- /dev/null
+++ b/examples/kml-track.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers KLM Track Parsing Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+        <link rel="stylesheet" href="../theme/default/google.css" type="text/css">
+        <link rel="stylesheet" href="style.css" type="text/css">
+        <style>
+            .olControlAttribution {
+                bottom: 2px;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="kml-track.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Parsing gx:Track in KML</h1>
+        <p id="shortdesc">
+            Demonstrates parsing of gx:Track elements from KML.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                If a KML document contains <code><gx:Track></code> 
+                elements and the extractTracks property is set true on the 
+                parer, features will be created that represent track points.
+                Each feature will have a when attribute that contains the 
+                value of the relevant <code><when></code> element from 
+                the track.
+            </p>
+            <p>
+                View the <a href="kml-track.js" target="_blank">kml-track.js</a>
+                source to see how this is done.
+        </div>
+    </body>
+</html>
diff --git a/examples/kml-track.js b/examples/kml-track.js
new file mode 100644
index 0000000..5669847
--- /dev/null
+++ b/examples/kml-track.js
@@ -0,0 +1,40 @@
+var map;
+
+function init() {
+
+    var mercator = new OpenLayers.Projection("EPSG:900913");
+    var geographic = new OpenLayers.Projection("EPSG:4326");
+
+    map = new OpenLayers.Map({
+        div: "map",
+        projection: mercator,
+        layers: [
+            new OpenLayers.Layer.OSM(),
+            new OpenLayers.Layer.Vector("Aircraft Locations", {
+                projection: geographic,
+                strategies: [new OpenLayers.Strategy.Fixed()],
+                protocol: new OpenLayers.Protocol.HTTP({
+                    url: "kml-track.kml",
+                    format: new OpenLayers.Format.KML({
+                        extractTracks: true,
+                        trackAttributes: ["speed"]
+                    })
+                }),
+                styleMap: new OpenLayers.StyleMap({
+                    "default": new OpenLayers.Style({
+                        graphicName: "circle",
+                        pointRadius: 2,
+                        fillOpacity: 0.5,
+                        fillColor: "#ffcc66",
+                        strokeColor: "#666633",
+                        strokeWidth: 1,
+                    })
+                })
+            })
+        ],
+        center: new OpenLayers.LonLat(-93.2735, 44.8349).transform(geographic, mercator),
+        zoom: 8
+    });
+    
+};
+
diff --git a/examples/kml-track.kml b/examples/kml-track.kml
new file mode 100644
index 0000000..2ab90ae
--- /dev/null
+++ b/examples/kml-track.kml
@@ -0,0 +1,3359 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
+<Document>
+<Camera>
+  <gx:TimeStamp>
+    <when>2010-05-01T13:00:00-05:00</when>
+  </gx:TimeStamp>
+  <longitude>-93.2207</longitude>
+  <latitude>44.882</latitude>
+  <altitude>50000</altitude>
+  <heading>0</heading>
+  <tilt>0</tilt>
+</Camera>
+<Style id="arrival">
+  <IconStyle>
+    <Icon>
+      <href>http://maps.macnoise.com/scripts/plane.png</href>
+    </Icon>
+  </IconStyle>
+  <LineStyle>
+    <color>ff0000ff</color>
+    <width>3</width>
+  </LineStyle>
+  <PolyStyle>
+    <color>7fffffff</color>
+  </PolyStyle>
+</Style>
+<Style id="departure">
+  <IconStyle>
+    <Icon>
+      <href>http://maps.macnoise.com/scripts/plane.png</href>
+    </Icon>
+  </IconStyle>
+  <LineStyle>
+    <color>ff00ff00</color>
+    <width>3</width>
+  </LineStyle>
+  <PolyStyle>
+    <color>7fffffff</color>
+  </PolyStyle>
+</Style>
+<Style id="overflight">
+  <IconStyle>
+    <Icon>
+      <href>http://maps.macnoise.com/scripts/plane.png</href>
+    </Icon>
+  </IconStyle>
+  <LineStyle>
+    <color>ff222222</color>
+    <width>3</width>
+  </LineStyle>
+  <PolyStyle>
+    <color>7fffffff</color>
+  </PolyStyle>
+</Style>
+<Style id='rmt'>
+  <LabelStyle>
+    <color>ff0000cc</color>
+    <colorMode>normal</colorMode>
+    <scale>1</scale>
+  </LabelStyle>
+</Style>
+
+<name>Flight Tracks</name>
+<Folder>
+  <name>Arrivals</name>
+<Placemark>
+  <name>B752</name>
+  <adflag>A</adflag>
+  <flightid>DAL2973</flightid>
+  <styleUrl>#arrival</styleUrl>
+</Placemark>
+<Placemark>
+  <name>E170</name>
+  <adflag>A</adflag>
+  <flightid>TCF7521</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:04-05</when>
+    <when>2010-05-01T13:00:09-05</when>
+    <when>2010-05-01T13:00:13-05</when>
+    <when>2010-05-01T13:00:18-05</when>
+    <when>2010-05-01T13:00:23-05</when>
+    <when>2010-05-01T13:00:27-05</when>
+    <when>2010-05-01T13:00:32-05</when>
+    <when>2010-05-01T13:00:37-05</when>
+    <when>2010-05-01T13:00:41-05</when>
+    <when>2010-05-01T13:00:46-05</when>
+    <when>2010-05-01T13:00:51-05</when>
+    <when>2010-05-01T13:00:55-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <when>2010-05-01T13:01:05-05</when>
+    <when>2010-05-01T13:01:09-05</when>
+    <when>2010-05-01T13:01:14-05</when>
+    <when>2010-05-01T13:01:19-05</when>
+    <when>2010-05-01T13:01:23-05</when>
+    <when>2010-05-01T13:01:28-05</when>
+    <when>2010-05-01T13:01:33-05</when>
+    <when>2010-05-01T13:01:37-05</when>
+    <when>2010-05-01T13:01:42-05</when>
+    <when>2010-05-01T13:01:47-05</when>
+    <when>2010-05-01T13:01:51-05</when>
+    <when>2010-05-01T13:01:56-05</when>
+    <when>2010-05-01T13:02:00-05</when>
+    <when>2010-05-01T13:02:05-05</when>
+    <when>2010-05-01T13:02:10-05</when>
+    <when>2010-05-01T13:02:14-05</when>
+    <when>2010-05-01T13:02:19-05</when>
+    <when>2010-05-01T13:02:24-05</when>
+    <when>2010-05-01T13:02:28-05</when>
+    <when>2010-05-01T13:02:33-05</when>
+    <when>2010-05-01T13:02:38-05</when>
+    <when>2010-05-01T13:02:42-05</when>
+    <when>2010-05-01T13:02:47-05</when>
+    <when>2010-05-01T13:02:52-05</when>
+    <when>2010-05-01T13:02:56-05</when>
+    <when>2010-05-01T13:03:01-05</when>
+    <when>2010-05-01T13:03:06-05</when>
+    <when>2010-05-01T13:03:10-05</when>
+    <when>2010-05-01T13:03:15-05</when>
+    <when>2010-05-01T13:03:20-05</when>
+    <when>2010-05-01T13:03:24-05</when>
+    <when>2010-05-01T13:03:29-05</when>
+    <when>2010-05-01T13:03:33-05</when>
+    <when>2010-05-01T13:03:38-05</when>
+    <when>2010-05-01T13:03:43-05</when>
+    <when>2010-05-01T13:03:47-05</when>
+    <when>2010-05-01T13:03:52-05</when>
+    <when>2010-05-01T13:03:57-05</when>
+    <when>2010-05-01T13:04:01-05</when>
+    <when>2010-05-01T13:04:06-05</when>
+    <when>2010-05-01T13:04:11-05</when>
+    <when>2010-05-01T13:04:15-05</when>
+    <when>2010-05-01T13:04:20-05</when>
+    <when>2010-05-01T13:04:24-05</when>
+    <when>2010-05-01T13:04:29-05</when>
+    <when>2010-05-01T13:04:34-05</when>
+    <when>2010-05-01T13:04:38-05</when>
+    <when>2010-05-01T13:04:43-05</when>
+    <when>2010-05-01T13:04:48-05</when>
+    <when>2010-05-01T13:04:52-05</when>
+    <when>2010-05-01T13:04:57-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-93.3806146339391 44.8823651507134 2743</gx:coord>
+    <gx:coord>-93.3773041814209 44.887531728655 2743</gx:coord>
+    <gx:coord>-93.3742856469083 44.8942041806778 2743</gx:coord>
+    <gx:coord>-93.3722375106026 44.9009231720158 2743</gx:coord>
+    <gx:coord>-93.3711934089417 44.9077495987718 2712</gx:coord>
+    <gx:coord>-93.3707288919852 44.9145219645156 2712</gx:coord>
+    <gx:coord>-93.3703882714439 44.921240089024 2682</gx:coord>
+    <gx:coord>-93.3700882719793 44.9278850664392 2682</gx:coord>
+    <gx:coord>-93.369810041597 44.934389356737 2651</gx:coord>
+    <gx:coord>-93.3696836566166 44.9408553642446 2651</gx:coord>
+    <gx:coord>-93.3695425129226 44.9473561165969 2621</gx:coord>
+    <gx:coord>-93.3693185423471 44.9537360442564 2621</gx:coord>
+    <gx:coord>-93.3693194298816 44.9599975904123 2590</gx:coord>
+    <gx:coord>-93.3694031671108 44.9661411653607 2590</gx:coord>
+    <gx:coord>-93.3693840701674 44.9721433662718 2560</gx:coord>
+    <gx:coord>-93.3692180132117 44.9781295444861 2530</gx:coord>
+    <gx:coord>-93.3691451194519 44.9840448037796 2530</gx:coord>
+    <gx:coord>-93.3691016671806 44.9899713582099 2499</gx:coord>
+    <gx:coord>-93.3689494749454 44.9958413836039 2469</gx:coord>
+    <gx:coord>-93.3687664425911 45.0015898503441 2469</gx:coord>
+    <gx:coord>-93.3686331392066 45.0072067405394 2438</gx:coord>
+    <gx:coord>-93.368599726987 45.0127741072778 2438</gx:coord>
+    <gx:coord>-93.3686335399802 45.0181909829245 2408</gx:coord>
+    <gx:coord>-93.3686494842522 45.0234209328517 2377</gx:coord>
+    <gx:coord>-93.3684675008434 45.0286421277802 2377</gx:coord>
+    <gx:coord>-93.3683004008135 45.0337736830037 2347</gx:coord>
+    <gx:coord>-93.3682154531592 45.0388787100883 2347</gx:coord>
+    <gx:coord>-93.3683732351584 45.0439463933312 2316</gx:coord>
+    <gx:coord>-93.3684142261585 45.0490625635571 2286</gx:coord>
+    <gx:coord>-93.368143196103 45.0541794203461 2286</gx:coord>
+    <gx:coord>-93.367535632513 45.0592327492686 2255</gx:coord>
+    <gx:coord>-93.3659957839062 45.0642802941983 2225</gx:coord>
+    <gx:coord>-93.3633687278349 45.0690971409498 2194</gx:coord>
+    <gx:coord>-93.3595471289752 45.0735562314314 2164</gx:coord>
+    <gx:coord>-93.354507806741 45.0775832626329 2133</gx:coord>
+    <gx:coord>-93.3485772854268 45.0808293296313 2103</gx:coord>
+    <gx:coord>-93.3421088995911 45.0832469498159 2072</gx:coord>
+    <gx:coord>-93.3351951799649 45.0848109253641 2042</gx:coord>
+    <gx:coord>-93.3280418232705 45.0854246893649 2011</gx:coord>
+    <gx:coord>-93.3209037884868 45.085161376704 1981</gx:coord>
+    <gx:coord>-93.3144723535558 45.0839515303103 1920</gx:coord>
+    <gx:coord>-93.3088086501455 45.0819151336509 1859</gx:coord>
+    <gx:coord>-93.3036917357871 45.0792511074707 1828</gx:coord>
+    <gx:coord>-93.2993102013018 45.0761649196153 1798</gx:coord>
+    <gx:coord>-93.2958637974439 45.0728030913231 1768</gx:coord>
+    <gx:coord>-93.2932247031583 45.0693710694135 1737</gx:coord>
+    <gx:coord>-93.2910486937635 45.0659261208859 1707</gx:coord>
+    <gx:coord>-93.2888955993508 45.0625213360315 1646</gx:coord>
+    <gx:coord>-93.2867217490801 45.0591551785287 1615</gx:coord>
+    <gx:coord>-93.2847336413534 45.0557231883841 1554</gx:coord>
+    <gx:coord>-93.28312407167 45.0523278244803 1493</gx:coord>
+    <gx:coord>-93.2820244198825 45.0489932635616 1463</gx:coord>
+    <gx:coord>-93.280973634799 45.045699024227 1432</gx:coord>
+    <gx:coord>-93.2799787649067 45.0423671615142 1402</gx:coord>
+    <gx:coord>-93.2791066054659 45.0390946347227 1341</gx:coord>
+    <gx:coord>-93.2784127726862 45.0358634874951 1310</gx:coord>
+    <gx:coord>-93.2779112647802 45.0326008999249 1249</gx:coord>
+    <gx:coord>-93.2774525889269 45.029330264578 1219</gx:coord>
+    <gx:coord>-93.2770784201422 45.0260213245381 1188</gx:coord>
+    <gx:coord>-93.2766188240203 45.0227403501287 1158</gx:coord>
+    <gx:coord>-93.275816823547 45.0195461585342 1127</gx:coord>
+    <gx:coord>-93.2748914840222 45.0163603671711 1066</gx:coord>
+    <gx:coord>-93.2740540575136 45.0131542183389 1036</gx:coord>
+    <gx:coord>-93.2733145981662 45.010040506328 1006</gx:coord>
+    <gx:coord>-93.2724700860766 45.0070495365802 975</gx:coord>
+    <gx:coord>-93.2720166974715 45.0052389419128 957</gx:coord>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>40 0 0</gx:angles>
+    <gx:angles>50 0 0</gx:angles>
+    <gx:angles>60 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>80 0 0</gx:angles>
+    <gx:angles>90 0 0</gx:angles>
+    <gx:angles>100 0 0</gx:angles>
+    <gx:angles>110 0 0</gx:angles>
+    <gx:angles>120 0 0</gx:angles>
+    <gx:angles>130 0 0</gx:angles>
+    <gx:angles>140 0 0</gx:angles>
+    <gx:angles>150 0 0</gx:angles>
+    <gx:angles>150 0 0</gx:angles>
+    <gx:angles>150 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <speed>376</speed>
+    <speed>367</speed>
+    <speed>361</speed>
+    <speed>371</speed>
+    <speed>367</speed>
+    <speed>363</speed>
+    <speed>359</speed>
+    <speed>356</speed>
+    <speed>352</speed>
+    <speed>347</speed>
+    <speed>343</speed>
+    <speed>339</speed>
+    <speed>334</speed>
+    <speed>329</speed>
+    <speed>326</speed>
+    <speed>321</speed>
+    <speed>318</speed>
+    <speed>315</speed>
+    <speed>311</speed>
+    <speed>307</speed>
+    <speed>301</speed>
+    <speed>294</speed>
+    <speed>289</speed>
+    <speed>295</speed>
+    <speed>280</speed>
+    <speed>277</speed>
+    <speed>287</speed>
+    <speed>275</speed>
+    <speed>275</speed>
+    <speed>276</speed>
+    <speed>277</speed>
+    <speed>279</speed>
+    <speed>281</speed>
+    <speed>282</speed>
+    <speed>282</speed>
+    <speed>281</speed>
+    <speed>280</speed>
+    <speed>274</speed>
+    <speed>266</speed>
+    <speed>260</speed>
+    <speed>254</speed>
+    <speed>244</speed>
+    <speed>235</speed>
+    <speed>235</speed>
+    <speed>219</speed>
+    <speed>212</speed>
+    <speed>214</speed>
+    <speed>201</speed>
+    <speed>197</speed>
+    <speed>193</speed>
+    <speed>190</speed>
+    <speed>187</speed>
+    <speed>183</speed>
+    <speed>180</speed>
+    <speed>186</speed>
+    <speed>178</speed>
+    <speed>177</speed>
+    <speed>183</speed>
+    <speed>177</speed>
+    <speed>176</speed>
+    <speed>175</speed>
+    <speed>173</speed>
+    <speed>171</speed>
+    <speed>165</speed>
+    <speed>166</speed>
+    <speed>167</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>BE33</name>
+  <adflag>A</adflag>
+  <flightid>N38175</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:02-05</when>
+    <when>2010-05-01T13:00:07-05</when>
+    <when>2010-05-01T13:00:12-05</when>
+    <when>2010-05-01T13:00:16-05</when>
+    <when>2010-05-01T13:00:21-05</when>
+    <when>2010-05-01T13:00:25-05</when>
+    <when>2010-05-01T13:00:30-05</when>
+    <when>2010-05-01T13:00:35-05</when>
+    <when>2010-05-01T13:00:39-05</when>
+    <when>2010-05-01T13:00:44-05</when>
+    <when>2010-05-01T13:00:49-05</when>
+    <when>2010-05-01T13:00:53-05</when>
+    <when>2010-05-01T13:00:58-05</when>
+    <when>2010-05-01T13:01:03-05</when>
+    <when>2010-05-01T13:01:07-05</when>
+    <when>2010-05-01T13:01:12-05</when>
+    <when>2010-05-01T13:01:16-05</when>
+    <when>2010-05-01T13:01:21-05</when>
+    <when>2010-05-01T13:01:26-05</when>
+    <when>2010-05-01T13:01:30-05</when>
+    <when>2010-05-01T13:01:35-05</when>
+    <when>2010-05-01T13:01:40-05</when>
+    <when>2010-05-01T13:01:44-05</when>
+    <when>2010-05-01T13:01:49-05</when>
+    <when>2010-05-01T13:01:54-05</when>
+    <when>2010-05-01T13:01:58-05</when>
+    <when>2010-05-01T13:02:03-05</when>
+    <when>2010-05-01T13:02:08-05</when>
+    <when>2010-05-01T13:02:12-05</when>
+    <when>2010-05-01T13:02:17-05</when>
+    <when>2010-05-01T13:02:21-05</when>
+    <when>2010-05-01T13:02:26-05</when>
+    <when>2010-05-01T13:02:31-05</when>
+    <when>2010-05-01T13:02:35-05</when>
+    <when>2010-05-01T13:02:40-05</when>
+    <when>2010-05-01T13:02:45-05</when>
+    <when>2010-05-01T13:02:49-05</when>
+    <when>2010-05-01T13:02:54-05</when>
+    <when>2010-05-01T13:02:59-05</when>
+    <when>2010-05-01T13:03:03-05</when>
+    <when>2010-05-01T13:03:08-05</when>
+    <when>2010-05-01T13:03:13-05</when>
+    <when>2010-05-01T13:03:17-05</when>
+    <when>2010-05-01T13:03:22-05</when>
+    <when>2010-05-01T13:03:27-05</when>
+    <when>2010-05-01T13:03:31-05</when>
+    <when>2010-05-01T13:03:36-05</when>
+    <when>2010-05-01T13:03:40-05</when>
+    <when>2010-05-01T13:03:45-05</when>
+    <when>2010-05-01T13:03:50-05</when>
+    <when>2010-05-01T13:03:54-05</when>
+    <when>2010-05-01T13:03:59-05</when>
+    <when>2010-05-01T13:04:04-05</when>
+    <when>2010-05-01T13:04:08-05</when>
+    <when>2010-05-01T13:04:13-05</when>
+    <when>2010-05-01T13:04:18-05</when>
+    <when>2010-05-01T13:04:22-05</when>
+    <when>2010-05-01T13:04:27-05</when>
+    <when>2010-05-01T13:04:32-05</when>
+    <when>2010-05-01T13:04:36-05</when>
+    <when>2010-05-01T13:04:41-05</when>
+    <when>2010-05-01T13:04:46-05</when>
+    <when>2010-05-01T13:04:50-05</when>
+    <when>2010-05-01T13:04:55-05</when>
+    <when>2010-05-01T13:04:59-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-93.0144637208028 44.6541474764804 1006</gx:coord>
+    <gx:coord>-93.0162681345228 44.6547274296664 1006</gx:coord>
+    <gx:coord>-93.0196734868835 44.6559915702004 975</gx:coord>
+    <gx:coord>-93.0231899415297 44.657188463998 945</gx:coord>
+    <gx:coord>-93.0267619421777 44.6582849847887 945</gx:coord>
+    <gx:coord>-93.0302021384369 44.6594728216183 914</gx:coord>
+    <gx:coord>-93.0338776768471 44.6606515995762 914</gx:coord>
+    <gx:coord>-93.0375866343814 44.6618806707998 884</gx:coord>
+    <gx:coord>-93.0411146687035 44.6632657982455 884</gx:coord>
+    <gx:coord>-93.0447829038862 44.6646495821585 884</gx:coord>
+    <gx:coord>-93.0486933143218 44.6659856209571 914</gx:coord>
+    <gx:coord>-93.0525604964428 44.6672664774449 884</gx:coord>
+    <gx:coord>-93.0559892061682 44.6686325276705 884</gx:coord>
+    <gx:coord>-93.0595122787868 44.6700360197293 884</gx:coord>
+    <gx:coord>-93.0633002358996 44.6714677760105 884</gx:coord>
+    <gx:coord>-93.0669378047758 44.6729112967405 884</gx:coord>
+    <gx:coord>-93.0703945562928 44.6742924439153 884</gx:coord>
+    <gx:coord>-93.0739155391788 44.675662416586 853</gx:coord>
+    <gx:coord>-93.0775155708379 44.677089176175 853</gx:coord>
+    <gx:coord>-93.0809933799389 44.6786451836444 884</gx:coord>
+    <gx:coord>-93.0844890660754 44.6803751966183 884</gx:coord>
+    <gx:coord>-93.0880299182291 44.6822044360867 884</gx:coord>
+    <gx:coord>-93.0915094168569 44.6840756286875 884</gx:coord>
+    <gx:coord>-93.0948937737562 44.6859682015167 853</gx:coord>
+    <gx:coord>-93.0981262632978 44.6879373605934 853</gx:coord>
+    <gx:coord>-93.101454986707 44.6899364101225 792</gx:coord>
+    <gx:coord>-93.1050116792292 44.6917700662615 823</gx:coord>
+    <gx:coord>-93.1086488406447 44.6935571270851 792</gx:coord>
+    <gx:coord>-93.1123714592033 44.6950844029867 792</gx:coord>
+    <gx:coord>-93.1160669441025 44.6961547755501 792</gx:coord>
+    <gx:coord>-93.1198701422529 44.6969844340505 823</gx:coord>
+    <gx:coord>-93.1236851662824 44.6978291490322 823</gx:coord>
+    <gx:coord>-93.1274225659796 44.6986718065416 823</gx:coord>
+    <gx:coord>-93.1311942704264 44.6993984412966 853</gx:coord>
+    <gx:coord>-93.1349381107515 44.6999999769729 823</gx:coord>
+    <gx:coord>-93.1389399866831 44.7004676966664 823</gx:coord>
+    <gx:coord>-93.1429353283304 44.7008467726719 792</gx:coord>
+    <gx:coord>-93.1467319575358 44.7012413854652 792</gx:coord>
+    <gx:coord>-93.1499628617348 44.701745671311 256</gx:coord>
+    <gx:coord>-93.153336892791 44.7021601177798 823</gx:coord>
+    <gx:coord>-93.1573155649233 44.7025431241565 823</gx:coord>
+    <gx:coord>-93.1612285414011 44.7030631821633 853</gx:coord>
+    <gx:coord>-93.1650893906409 44.7036343060226 823</gx:coord>
+    <gx:coord>-93.168735434804 44.7041440584898 823</gx:coord>
+    <gx:coord>-93.1724202011042 44.7046128372079 823</gx:coord>
+    <gx:coord>-93.1761398862948 44.7051091435166 792</gx:coord>
+    <gx:coord>-93.1796630936383 44.7055777394683 792</gx:coord>
+    <gx:coord>-93.1832380178971 44.7060406072565 823</gx:coord>
+    <gx:coord>-93.1866638342882 44.7066093849988 823</gx:coord>
+    <gx:coord>-93.1899087146892 44.7071801343989 823</gx:coord>
+    <gx:coord>-93.193359587537 44.7076743817907 823</gx:coord>
+    <gx:coord>-93.1967000778824 44.7081822996347 823</gx:coord>
+    <gx:coord>-93.1999669003743 44.7087817760063 823</gx:coord>
+    <gx:coord>-93.2034706963438 44.7093224014614 823</gx:coord>
+    <gx:coord>-93.2071875434321 44.7097715459537 823</gx:coord>
+    <gx:coord>-93.2107765241539 44.7103153755538 823</gx:coord>
+    <gx:coord>-93.2143295791529 44.7108254548145 823</gx:coord>
+    <gx:coord>-93.2178486234666 44.7112392078782 792</gx:coord>
+    <gx:coord>-93.2211867867256 44.7116696952986 823</gx:coord>
+    <gx:coord>-93.2243580018062 44.7121483598855 823</gx:coord>
+    <gx:coord>-93.2273334445383 44.712639974576 823</gx:coord>
+    <gx:coord>-93.230487243959 44.7131510651587 823</gx:coord>
+    <gx:coord>-93.233844667064 44.7137558527546 823</gx:coord>
+    <gx:coord>-93.2369967848442 44.714497155781 823</gx:coord>
+    <gx:coord>-93.2401184808953 44.7154113173173 823</gx:coord>
+    <gx:coord>-93.2431805770012 44.7167484248595 792</gx:coord>
+    <gx:coord>-93.2437334091088 44.7170975413723 792</gx:coord>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <speed>150</speed>
+    <speed>156</speed>
+    <speed>152</speed>
+    <speed>156</speed>
+    <speed>151</speed>
+    <speed>152</speed>
+    <speed>160</speed>
+    <speed>157</speed>
+    <speed>159</speed>
+    <speed>158</speed>
+    <speed>158</speed>
+    <speed>160</speed>
+    <speed>160</speed>
+    <speed>158</speed>
+    <speed>162</speed>
+    <speed>157</speed>
+    <speed>158</speed>
+    <speed>164</speed>
+    <speed>159</speed>
+    <speed>161</speed>
+    <speed>163</speed>
+    <speed>164</speed>
+    <speed>166</speed>
+    <speed>167</speed>
+    <speed>167</speed>
+    <speed>166</speed>
+    <speed>164</speed>
+    <speed>163</speed>
+    <speed>166</speed>
+    <speed>157</speed>
+    <speed>154</speed>
+    <speed>157</speed>
+    <speed>152</speed>
+    <speed>152</speed>
+    <speed>151</speed>
+    <speed>147</speed>
+    <speed>144</speed>
+    <speed>146</speed>
+    <speed>145</speed>
+    <speed>145</speed>
+    <speed>144</speed>
+    <speed>146</speed>
+    <speed>148</speed>
+    <speed>145</speed>
+    <speed>143</speed>
+    <speed>146</speed>
+    <speed>138</speed>
+    <speed>137</speed>
+    <speed>140</speed>
+    <speed>133</speed>
+    <speed>133</speed>
+    <speed>135</speed>
+    <speed>137</speed>
+    <speed>137</speed>
+    <speed>138</speed>
+    <speed>138</speed>
+    <speed>136</speed>
+    <speed>131</speed>
+    <speed>129</speed>
+    <speed>128</speed>
+    <speed>126</speed>
+    <speed>126</speed>
+    <speed>133</speed>
+    <speed>132</speed>
+    <speed>136</speed>
+    <speed>139</speed>
+    <speed>136</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>A319</name>
+  <adflag>A</adflag>
+  <flightid>DAL1588</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:04-05</when>
+    <when>2010-05-01T13:00:08-05</when>
+    <when>2010-05-01T13:00:13-05</when>
+    <when>2010-05-01T13:00:18-05</when>
+    <when>2010-05-01T13:00:22-05</when>
+    <when>2010-05-01T13:00:27-05</when>
+    <when>2010-05-01T13:00:31-05</when>
+    <when>2010-05-01T13:00:36-05</when>
+    <when>2010-05-01T13:00:41-05</when>
+    <when>2010-05-01T13:00:45-05</when>
+    <when>2010-05-01T13:00:50-05</when>
+    <when>2010-05-01T13:00:55-05</when>
+    <when>2010-05-01T13:00:59-05</when>
+    <when>2010-05-01T13:01:04-05</when>
+    <when>2010-05-01T13:01:09-05</when>
+    <when>2010-05-01T13:01:13-05</when>
+    <when>2010-05-01T13:01:18-05</when>
+    <when>2010-05-01T13:01:22-05</when>
+    <when>2010-05-01T13:01:27-05</when>
+    <when>2010-05-01T13:01:32-05</when>
+    <when>2010-05-01T13:01:36-05</when>
+    <when>2010-05-01T13:01:41-05</when>
+    <when>2010-05-01T13:01:46-05</when>
+    <when>2010-05-01T13:01:50-05</when>
+    <when>2010-05-01T13:01:55-05</when>
+    <when>2010-05-01T13:02:00-05</when>
+    <when>2010-05-01T13:02:04-05</when>
+    <when>2010-05-01T13:02:09-05</when>
+    <when>2010-05-01T13:02:13-05</when>
+    <when>2010-05-01T13:02:18-05</when>
+    <when>2010-05-01T13:02:23-05</when>
+    <when>2010-05-01T13:02:27-05</when>
+    <when>2010-05-01T13:02:32-05</when>
+    <when>2010-05-01T13:02:37-05</when>
+    <when>2010-05-01T13:02:41-05</when>
+    <when>2010-05-01T13:02:46-05</when>
+    <when>2010-05-01T13:02:51-05</when>
+    <when>2010-05-01T13:02:55-05</when>
+    <when>2010-05-01T13:03:00-05</when>
+    <when>2010-05-01T13:03:05-05</when>
+    <when>2010-05-01T13:03:09-05</when>
+    <when>2010-05-01T13:03:14-05</when>
+    <when>2010-05-01T13:03:19-05</when>
+    <when>2010-05-01T13:03:23-05</when>
+    <when>2010-05-01T13:03:28-05</when>
+    <when>2010-05-01T13:03:33-05</when>
+    <when>2010-05-01T13:03:37-05</when>
+    <when>2010-05-01T13:03:42-05</when>
+    <when>2010-05-01T13:03:47-05</when>
+    <when>2010-05-01T13:03:51-05</when>
+    <when>2010-05-01T13:03:56-05</when>
+    <when>2010-05-01T13:04:01-05</when>
+    <when>2010-05-01T13:04:05-05</when>
+    <when>2010-05-01T13:04:10-05</when>
+    <when>2010-05-01T13:04:15-05</when>
+    <when>2010-05-01T13:04:19-05</when>
+    <when>2010-05-01T13:04:24-05</when>
+    <when>2010-05-01T13:04:29-05</when>
+    <when>2010-05-01T13:04:33-05</when>
+    <when>2010-05-01T13:04:38-05</when>
+    <when>2010-05-01T13:04:42-05</when>
+    <when>2010-05-01T13:04:47-05</when>
+    <when>2010-05-01T13:04:52-05</when>
+    <when>2010-05-01T13:04:56-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-93.6927825194056 44.7952011849485 3011</gx:coord>
+    <gx:coord>-93.6850156681578 44.7968042586582 2987</gx:coord>
+    <gx:coord>-93.6752785488692 44.7990458605003 2956</gx:coord>
+    <gx:coord>-93.6657083011645 44.8014897663497 2926</gx:coord>
+    <gx:coord>-93.6560029615388 44.803768841381 2865</gx:coord>
+    <gx:coord>-93.6462045264035 44.8058749817725 2834</gx:coord>
+    <gx:coord>-93.6365671200126 44.8080848199989 2804</gx:coord>
+    <gx:coord>-93.6269933807039 44.8102767000109 2773</gx:coord>
+    <gx:coord>-93.6175405757462 44.8123960709083 2743</gx:coord>
+    <gx:coord>-93.6082528975965 44.8146455509748 2743</gx:coord>
+    <gx:coord>-93.599077315807 44.816765612372 2743</gx:coord>
+    <gx:coord>-93.5899428762254 44.8186933623744 2743</gx:coord>
+    <gx:coord>-93.5809104439923 44.8205403457841 2743</gx:coord>
+    <gx:coord>-93.5720785209701 44.8224608846058 2743</gx:coord>
+    <gx:coord>-93.5634871751281 44.8245259755976 2743</gx:coord>
+    <gx:coord>-93.5549873819943 44.8264288380043 2743</gx:coord>
+    <gx:coord>-93.5465301417765 44.828146963076 2743</gx:coord>
+    <gx:coord>-93.5382602633868 44.8299225976982 2743</gx:coord>
+    <gx:coord>-93.5299909540853 44.8317218299661 2743</gx:coord>
+    <gx:coord>-93.5217290971281 44.8335486849228 2743</gx:coord>
+    <gx:coord>-93.5135254319341 44.8354478299135 2743</gx:coord>
+    <gx:coord>-93.5052463800971 44.8374557781543 2743</gx:coord>
+    <gx:coord>-93.4970241378696 44.8393862625467 2743</gx:coord>
+    <gx:coord>-93.4888916549316 44.8410628089589 2743</gx:coord>
+    <gx:coord>-93.48064759949 44.8427813728647 2743</gx:coord>
+    <gx:coord>-93.4722750572418 44.8445241451071 2712</gx:coord>
+    <gx:coord>-93.4639262889443 44.8463688032483 2743</gx:coord>
+    <gx:coord>-93.4556378890352 44.8482208160082 2743</gx:coord>
+    <gx:coord>-93.447407568623 44.8500947691895 2743</gx:coord>
+    <gx:coord>-93.4393642055014 44.8523517774191 2743</gx:coord>
+    <gx:coord>-93.4316071047585 44.8551246076581 2743</gx:coord>
+    <gx:coord>-93.4244028068218 44.8584705613027 2743</gx:coord>
+    <gx:coord>-93.4178621631751 44.8625068369064 2743</gx:coord>
+    <gx:coord>-93.412146307774 44.867174139387 2743</gx:coord>
+    <gx:coord>-93.4075995385136 44.8722931076546 2743</gx:coord>
+    <gx:coord>-93.4039820359465 44.8777375352403 2743</gx:coord>
+    <gx:coord>-93.4016072978871 44.8833117162528 2743</gx:coord>
+    <gx:coord>-93.4005924913122 44.8890542850171 2743</gx:coord>
+    <gx:coord>-93.4005563275156 44.8948199828389 2712</gx:coord>
+    <gx:coord>-93.401452844832 44.9002595243996 2682</gx:coord>
+    <gx:coord>-93.4032713926758 44.905357711587 2651</gx:coord>
+    <gx:coord>-93.4058979070097 44.9101654056189 2621</gx:coord>
+    <gx:coord>-93.4092802306306 44.9145600538157 2590</gx:coord>
+    <gx:coord>-93.4134192058116 44.9185233235535 2530</gx:coord>
+    <gx:coord>-93.4181155067703 44.9222086893794 2499</gx:coord>
+    <gx:coord>-93.4230280156053 44.9256003980833 2469</gx:coord>
+    <gx:coord>-93.4278299295206 44.9290448932076 2469</gx:coord>
+    <gx:coord>-93.4322535173586 44.9329315139411 2438</gx:coord>
+    <gx:coord>-93.4361102418566 44.9372336672133 2438</gx:coord>
+    <gx:coord>-93.4389664177141 44.9421107629499 2438</gx:coord>
+    <gx:coord>-93.4407103051748 44.9473646343685 2438</gx:coord>
+    <gx:coord>-93.4416032158439 44.9527430754122 2408</gx:coord>
+    <gx:coord>-93.4419308994101 44.9581538029148 2408</gx:coord>
+    <gx:coord>-93.4419313717103 44.9636029026039 2377</gx:coord>
+    <gx:coord>-93.4417378352424 44.9690628839115 2347</gx:coord>
+    <gx:coord>-93.4415990458805 44.9744028948354 2347</gx:coord>
+    <gx:coord>-93.4414478519305 44.9796663959001 2316</gx:coord>
+    <gx:coord>-93.4413557290344 44.9848518867987 2316</gx:coord>
+    <gx:coord>-93.4412896011133 44.9899566690879 2316</gx:coord>
+    <gx:coord>-93.4411625354696 44.9949926823698 2286</gx:coord>
+    <gx:coord>-93.4411216122071 45.000018474264 2225</gx:coord>
+    <gx:coord>-93.4409537301264 45.0051267594771 2194</gx:coord>
+    <gx:coord>-93.4408143120176 45.0101358999996 2133</gx:coord>
+    <gx:coord>-93.4405516208864 45.0150761969136 2103</gx:coord>
+    <gx:coord>-93.4397025278204 45.0199965135021 2042</gx:coord>
+    <gx:coord>-93.4384243921567 45.02391596133 1993.2</gx:coord>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>60 0 0</gx:angles>
+    <gx:angles>50 0 0</gx:angles>
+    <gx:angles>50 0 0</gx:angles>
+    <gx:angles>40 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>360 0 0</gx:angles>
+    <gx:angles>350 0 0</gx:angles>
+    <gx:angles>340 0 0</gx:angles>
+    <gx:angles>340 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>340 0 0</gx:angles>
+    <gx:angles>350 0 0</gx:angles>
+    <gx:angles>350 0 0</gx:angles>
+    <gx:angles>360 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <speed>390</speed>
+    <speed>383</speed>
+    <speed>397</speed>
+    <speed>390</speed>
+    <speed>405</speed>
+    <speed>388</speed>
+    <speed>386</speed>
+    <speed>397</speed>
+    <speed>377</speed>
+    <speed>373</speed>
+    <speed>367</speed>
+    <speed>362</speed>
+    <speed>357</speed>
+    <speed>350</speed>
+    <speed>345</speed>
+    <speed>353</speed>
+    <speed>336</speed>
+    <speed>334</speed>
+    <speed>346</speed>
+    <speed>332</speed>
+    <speed>331</speed>
+    <speed>330</speed>
+    <speed>331</speed>
+    <speed>332</speed>
+    <speed>331</speed>
+    <speed>331</speed>
+    <speed>345</speed>
+    <speed>333</speed>
+    <speed>332</speed>
+    <speed>344</speed>
+    <speed>331</speed>
+    <speed>331</speed>
+    <speed>329</speed>
+    <speed>326</speed>
+    <speed>324</speed>
+    <speed>320</speed>
+    <speed>314</speed>
+    <speed>307</speed>
+    <speed>298</speed>
+    <speed>291</speed>
+    <speed>284</speed>
+    <speed>276</speed>
+    <speed>271</speed>
+    <speed>268</speed>
+    <speed>266</speed>
+    <speed>267</speed>
+    <speed>270</speed>
+    <speed>274</speed>
+    <speed>279</speed>
+    <speed>283</speed>
+    <speed>288</speed>
+    <speed>291</speed>
+    <speed>292</speed>
+    <speed>290</speed>
+    <speed>288</speed>
+    <speed>286</speed>
+    <speed>281</speed>
+    <speed>278</speed>
+    <speed>286</speed>
+    <speed>273</speed>
+    <speed>271</speed>
+    <speed>280</speed>
+    <speed>270</speed>
+    <speed>274</speed>
+    <speed>263</speed>
+    <speed>268</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>E145</name>
+  <adflag>A</adflag>
+  <flightid>CHQ1453</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:01-05</when>
+    <when>2010-05-01T13:00:06-05</when>
+    <when>2010-05-01T13:00:11-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:48-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:02-05</when>
+    <when>2010-05-01T13:01:06-05</when>
+    <when>2010-05-01T13:01:11-05</when>
+    <when>2010-05-01T13:01:15-05</when>
+    <when>2010-05-01T13:01:20-05</when>
+    <when>2010-05-01T13:01:25-05</when>
+    <when>2010-05-01T13:01:29-05</when>
+    <when>2010-05-01T13:01:34-05</when>
+    <when>2010-05-01T13:01:39-05</when>
+    <when>2010-05-01T13:01:43-05</when>
+    <when>2010-05-01T13:01:48-05</when>
+    <when>2010-05-01T13:01:52-05</when>
+    <when>2010-05-01T13:01:57-05</when>
+    <when>2010-05-01T13:02:02-05</when>
+    <when>2010-05-01T13:02:06-05</when>
+    <when>2010-05-01T13:02:11-05</when>
+    <when>2010-05-01T13:02:16-05</when>
+    <when>2010-05-01T13:02:20-05</when>
+    <when>2010-05-01T13:02:25-05</when>
+    <when>2010-05-01T13:02:29-05</when>
+    <when>2010-05-01T13:02:34-05</when>
+    <when>2010-05-01T13:02:39-05</when>
+    <when>2010-05-01T13:02:43-05</when>
+    <when>2010-05-01T13:02:48-05</when>
+    <when>2010-05-01T13:02:53-05</when>
+    <when>2010-05-01T13:02:57-05</when>
+    <when>2010-05-01T13:03:02-05</when>
+    <when>2010-05-01T13:03:07-05</when>
+    <when>2010-05-01T13:03:11-05</when>
+    <when>2010-05-01T13:03:16-05</when>
+    <when>2010-05-01T13:03:21-05</when>
+    <when>2010-05-01T13:03:25-05</when>
+    <when>2010-05-01T13:03:30-05</when>
+    <when>2010-05-01T13:03:34-05</when>
+    <when>2010-05-01T13:03:39-05</when>
+    <when>2010-05-01T13:03:44-05</when>
+    <when>2010-05-01T13:03:48-05</when>
+    <when>2010-05-01T13:03:53-05</when>
+    <when>2010-05-01T13:03:58-05</when>
+    <when>2010-05-01T13:04:02-05</when>
+    <when>2010-05-01T13:04:07-05</when>
+    <when>2010-05-01T13:04:11-05</when>
+    <when>2010-05-01T13:04:16-05</when>
+    <when>2010-05-01T13:04:21-05</when>
+    <when>2010-05-01T13:04:25-05</when>
+    <when>2010-05-01T13:04:30-05</when>
+    <when>2010-05-01T13:04:35-05</when>
+    <when>2010-05-01T13:04:39-05</when>
+    <when>2010-05-01T13:04:44-05</when>
+    <when>2010-05-01T13:04:49-05</when>
+    <when>2010-05-01T13:04:53-05</when>
+    <when>2010-05-01T13:04:58-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-92.5727580977974 45.0236058844647 2530</gx:coord>
+    <gx:coord>-92.5742776202954 45.0237913896498 2530</gx:coord>
+    <gx:coord>-92.5803397933112 45.0241784662561 2499</gx:coord>
+    <gx:coord>-92.5865075192046 45.0247891381303 2469</gx:coord>
+    <gx:coord>-92.5926877928765 45.0257073410966 2469</gx:coord>
+    <gx:coord>-92.5986546763805 45.0261844476041 2438</gx:coord>
+    <gx:coord>-92.6046737535477 45.0267206733977 2438</gx:coord>
+    <gx:coord>-92.6106885874739 45.0275061986719 2438</gx:coord>
+    <gx:coord>-92.616359210337 45.027935793162 2438</gx:coord>
+    <gx:coord>-92.6220735719954 45.028379077688 2438</gx:coord>
+    <gx:coord>-92.6280403097635 45.0290552550566 2438</gx:coord>
+    <gx:coord>-92.6341725652711 45.029824064212 2438</gx:coord>
+    <gx:coord>-92.640279209769 45.0304963952702 2438</gx:coord>
+    <gx:coord>-92.6463747377703 45.0311129317319 2438</gx:coord>
+    <gx:coord>-92.6524891739589 45.0317396965059 2438</gx:coord>
+    <gx:coord>-92.6587083612282 45.0325526597288 2438</gx:coord>
+    <gx:coord>-92.6649573988971 45.0334560566121 2438</gx:coord>
+    <gx:coord>-92.6712436344147 45.0343516389227 2438</gx:coord>
+    <gx:coord>-92.6777900587447 45.0353199754833 2438</gx:coord>
+    <gx:coord>-92.6842020644974 45.0361081217423 2438</gx:coord>
+    <gx:coord>-92.6904510353584 45.0368379981793 2438</gx:coord>
+    <gx:coord>-92.6968618406938 45.0376828531019 2438</gx:coord>
+    <gx:coord>-92.7033318031208 45.0383078021685 2438</gx:coord>
+    <gx:coord>-92.709766951172 45.0386241893014 2438</gx:coord>
+    <gx:coord>-92.7161769864286 45.0390317903939 2438</gx:coord>
+    <gx:coord>-92.7225665589756 45.0396570251316 2408</gx:coord>
+    <gx:coord>-92.7288886541216 45.0403373286575 2438</gx:coord>
+    <gx:coord>-92.7352120601109 45.0409943934305 2438</gx:coord>
+    <gx:coord>-92.7414745561156 45.0416276553236 2438</gx:coord>
+    <gx:coord>-92.7477923122779 45.0424046535325 2438</gx:coord>
+    <gx:coord>-92.7541218465412 45.0434006217761 2438</gx:coord>
+    <gx:coord>-92.7601214481636 45.0440713086474 2438</gx:coord>
+    <gx:coord>-92.7660333478225 45.0444426749968 2438</gx:coord>
+    <gx:coord>-92.772102853148 45.0448779180664 2438</gx:coord>
+    <gx:coord>-92.7780236703859 45.0449122731228 2408</gx:coord>
+    <gx:coord>-92.7839974197715 45.0449532357526 2408</gx:coord>
+    <gx:coord>-92.7902562936361 45.0450709796934 2377</gx:coord>
+    <gx:coord>-92.7962688995386 45.0448540267375 2347</gx:coord>
+    <gx:coord>-92.8024120242439 45.0448640459334 2316</gx:coord>
+    <gx:coord>-92.8087530574681 45.0449050506622 2316</gx:coord>
+    <gx:coord>-92.814709697375 45.0446514037676 2286</gx:coord>
+    <gx:coord>-92.8205575663732 45.0444101119805 2255</gx:coord>
+    <gx:coord>-92.8266048584444 45.0442428819735 2225</gx:coord>
+    <gx:coord>-92.8327618067112 45.0440942522516 2194</gx:coord>
+    <gx:coord>-92.83872651911 45.0438644076684 2164</gx:coord>
+    <gx:coord>-92.8446994303267 45.043730942658 2133</gx:coord>
+    <gx:coord>-92.8506627055935 45.0435520713609 2103</gx:coord>
+    <gx:coord>-92.8563938230908 45.0431897062426 2072</gx:coord>
+    <gx:coord>-92.8622525737075 45.0428768437665 2042</gx:coord>
+    <gx:coord>-92.8680590561999 45.0424504399663 2011</gx:coord>
+    <gx:coord>-92.8739470985612 45.0422191353343 1981</gx:coord>
+    <gx:coord>-92.879905503922 45.0421676833604 1950</gx:coord>
+    <gx:coord>-92.8859780438424 45.0420919545536 1920</gx:coord>
+    <gx:coord>-92.8920993846605 45.0419574098772 1889</gx:coord>
+    <gx:coord>-92.8980850189767 45.041613347859 1859</gx:coord>
+    <gx:coord>-92.9042733870782 45.041256341571 1828</gx:coord>
+    <gx:coord>-92.9105676382912 45.0409944306292 1798</gx:coord>
+    <gx:coord>-92.9169019856279 45.0406669834687 1768</gx:coord>
+    <gx:coord>-92.9233572619921 45.0402533884047 1737</gx:coord>
+    <gx:coord>-92.9301295670095 45.0401453351324 1707</gx:coord>
+    <gx:coord>-92.9368012064813 45.0400078656145 1676</gx:coord>
+    <gx:coord>-92.943436221178 45.0397167044808 1646</gx:coord>
+    <gx:coord>-92.9503058450392 45.0396542676205 1615</gx:coord>
+    <gx:coord>-92.9570389363135 45.0394266771585 1585</gx:coord>
+    <gx:coord>-92.9637736326563 45.0390859598898 1554</gx:coord>
+    <gx:coord>-92.9705134597343 45.0387846980464 1524</gx:coord>
+    <gx:coord>-92.973755360354 45.0384258824988 1508.5</gx:coord>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <speed>235</speed>
+    <speed>246</speed>
+    <speed>239</speed>
+    <speed>244</speed>
+    <speed>234</speed>
+    <speed>232</speed>
+    <speed>238</speed>
+    <speed>227</speed>
+    <speed>228</speed>
+    <speed>229</speed>
+    <speed>229</speed>
+    <speed>232</speed>
+    <speed>236</speed>
+    <speed>238</speed>
+    <speed>249</speed>
+    <speed>243</speed>
+    <speed>245</speed>
+    <speed>255</speed>
+    <speed>247</speed>
+    <speed>248</speed>
+    <speed>248</speed>
+    <speed>247</speed>
+    <speed>256</speed>
+    <speed>247</speed>
+    <speed>246</speed>
+    <speed>254</speed>
+    <speed>244</speed>
+    <speed>245</speed>
+    <speed>242</speed>
+    <speed>239</speed>
+    <speed>246</speed>
+    <speed>235</speed>
+    <speed>232</speed>
+    <speed>240</speed>
+    <speed>231</speed>
+    <speed>232</speed>
+    <speed>234</speed>
+    <speed>234</speed>
+    <speed>233</speed>
+    <speed>232</speed>
+    <speed>233</speed>
+    <speed>232</speed>
+    <speed>229</speed>
+    <speed>229</speed>
+    <speed>237</speed>
+    <speed>227</speed>
+    <speed>225</speed>
+    <speed>233</speed>
+    <speed>224</speed>
+    <speed>225</speed>
+    <speed>228</speed>
+    <speed>228</speed>
+    <speed>240</speed>
+    <speed>233</speed>
+    <speed>236</speed>
+    <speed>248</speed>
+    <speed>243</speed>
+    <speed>246</speed>
+    <speed>250</speed>
+    <speed>253</speed>
+    <speed>255</speed>
+    <speed>257</speed>
+    <speed>257</speed>
+    <speed>266</speed>
+    <speed>261</speed>
+    <speed>265</speed>
+    <speed>275</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>E170</name>
+  <adflag>A</adflag>
+  <flightid>CPZ5695</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:11-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:25-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:48-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:02-05</when>
+    <when>2010-05-01T13:01:06-05</when>
+    <when>2010-05-01T13:01:11-05</when>
+    <when>2010-05-01T13:01:16-05</when>
+    <when>2010-05-01T13:01:20-05</when>
+    <when>2010-05-01T13:01:25-05</when>
+    <when>2010-05-01T13:01:29-05</when>
+    <when>2010-05-01T13:01:34-05</when>
+    <when>2010-05-01T13:01:39-05</when>
+    <when>2010-05-01T13:01:43-05</when>
+    <when>2010-05-01T13:01:48-05</when>
+    <when>2010-05-01T13:01:53-05</when>
+    <when>2010-05-01T13:01:57-05</when>
+    <when>2010-05-01T13:02:02-05</when>
+    <when>2010-05-01T13:02:06-05</when>
+    <when>2010-05-01T13:02:11-05</when>
+    <when>2010-05-01T13:02:16-05</when>
+    <when>2010-05-01T13:02:20-05</when>
+    <when>2010-05-01T13:02:25-05</when>
+    <when>2010-05-01T13:02:30-05</when>
+    <when>2010-05-01T13:02:34-05</when>
+    <when>2010-05-01T13:02:39-05</when>
+    <when>2010-05-01T13:02:44-05</when>
+    <when>2010-05-01T13:02:48-05</when>
+    <when>2010-05-01T13:02:53-05</when>
+    <when>2010-05-01T13:02:58-05</when>
+    <when>2010-05-01T13:03:02-05</when>
+    <when>2010-05-01T13:03:07-05</when>
+    <when>2010-05-01T13:03:11-05</when>
+    <when>2010-05-01T13:03:16-05</when>
+    <when>2010-05-01T13:03:21-05</when>
+    <when>2010-05-01T13:03:25-05</when>
+    <when>2010-05-01T13:03:30-05</when>
+    <when>2010-05-01T13:03:35-05</when>
+    <when>2010-05-01T13:03:39-05</when>
+    <when>2010-05-01T13:03:44-05</when>
+    <when>2010-05-01T13:03:48-05</when>
+    <when>2010-05-01T13:03:53-05</when>
+    <when>2010-05-01T13:03:58-05</when>
+    <when>2010-05-01T13:04:02-05</when>
+    <when>2010-05-01T13:04:07-05</when>
+    <when>2010-05-01T13:04:12-05</when>
+    <when>2010-05-01T13:04:16-05</when>
+    <when>2010-05-01T13:04:21-05</when>
+    <when>2010-05-01T13:04:25-05</when>
+    <when>2010-05-01T13:04:30-05</when>
+    <when>2010-05-01T13:04:35-05</when>
+    <when>2010-05-01T13:04:39-05</when>
+    <when>2010-05-01T13:04:44-05</when>
+    <when>2010-05-01T13:04:49-05</when>
+    <when>2010-05-01T13:04:53-05</when>
+    <when>2010-05-01T13:04:58-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-92.3689380245182 45.0389467469425 2804</gx:coord>
+    <gx:coord>-92.3759530819834 45.0380951007958 2773</gx:coord>
+    <gx:coord>-92.3831159633175 45.0369957486846 2712</gx:coord>
+    <gx:coord>-92.3901362714549 45.0355238496347 2651</gx:coord>
+    <gx:coord>-92.3970814910858 45.0339385808083 2621</gx:coord>
+    <gx:coord>-92.4043121546626 45.032585906621 2560</gx:coord>
+    <gx:coord>-92.4118367565321 45.0319048652958 2499</gx:coord>
+    <gx:coord>-92.419078934653 45.030875157485 2469</gx:coord>
+    <gx:coord>-92.4262095560369 45.0291153314744 2438</gx:coord>
+    <gx:coord>-92.4335237384463 45.0273941113051 2438</gx:coord>
+    <gx:coord>-92.4408178608932 45.0260076351757 2438</gx:coord>
+    <gx:coord>-92.4480506692593 45.0250407396261 2438</gx:coord>
+    <gx:coord>-92.4553504288427 45.0241919539362 2438</gx:coord>
+    <gx:coord>-92.4628196268122 45.0233514202756 2438</gx:coord>
+    <gx:coord>-92.4702544151504 45.0225228770055 2438</gx:coord>
+    <gx:coord>-92.47749082249 45.0211454469826 2438</gx:coord>
+    <gx:coord>-92.4849952170224 45.020108381381 2438</gx:coord>
+    <gx:coord>-92.4924975545976 45.0191930140492 2438</gx:coord>
+    <gx:coord>-92.4998773018653 45.018051767506 2438</gx:coord>
+    <gx:coord>-92.507186344501 45.0168407571941 2438</gx:coord>
+    <gx:coord>-92.5143825240876 45.0156216694574 2438</gx:coord>
+    <gx:coord>-92.5215706342598 45.0143945866018 2438</gx:coord>
+    <gx:coord>-92.5287558465591 45.0131646175633 2408</gx:coord>
+    <gx:coord>-92.535858877656 45.0118804989009 2438</gx:coord>
+    <gx:coord>-92.5428413996463 45.0103972607613 2438</gx:coord>
+    <gx:coord>-92.5499799537839 45.0091469907013 2438</gx:coord>
+    <gx:coord>-92.5571487214372 45.0079107943641 2438</gx:coord>
+    <gx:coord>-92.5643503087637 45.0069312146329 2438</gx:coord>
+    <gx:coord>-92.5715906639656 45.0060256188488 2438</gx:coord>
+    <gx:coord>-92.5787232800865 45.0051593960756 2438</gx:coord>
+    <gx:coord>-92.5859075456731 45.0042853983707 2438</gx:coord>
+    <gx:coord>-92.5932558590921 45.0033774426771 2438</gx:coord>
+    <gx:coord>-92.6008071462461 45.003154553905 2438</gx:coord>
+    <gx:coord>-92.6083537686074 45.0033879703399 2438</gx:coord>
+    <gx:coord>-92.6158581079963 45.0039900406543 2438</gx:coord>
+    <gx:coord>-92.6233760961899 45.0046768119547 2438</gx:coord>
+    <gx:coord>-92.6308149850999 45.0051419435105 2438</gx:coord>
+    <gx:coord>-92.6382172211892 45.0057401438498 2438</gx:coord>
+    <gx:coord>-92.6454696132537 45.005920412465 2438</gx:coord>
+    <gx:coord>-92.6528385211424 45.0061349890872 2438</gx:coord>
+    <gx:coord>-92.6604262143734 45.0071927884136 2438</gx:coord>
+    <gx:coord>-92.6679454156809 45.0082888895876 2438</gx:coord>
+    <gx:coord>-92.6753888547959 45.008928558351 2438</gx:coord>
+    <gx:coord>-92.6828869677601 45.0095857895273 2438</gx:coord>
+    <gx:coord>-92.6904366005728 45.0101503984089 2438</gx:coord>
+    <gx:coord>-92.6979032678841 45.0107232636276 2438</gx:coord>
+    <gx:coord>-92.7052708180676 45.0115414340457 2438</gx:coord>
+    <gx:coord>-92.7127263858549 45.0123186978698 2438</gx:coord>
+    <gx:coord>-92.7203010090271 45.0129672732945 2438</gx:coord>
+    <gx:coord>-92.7279385048165 45.0135255760157 2438</gx:coord>
+    <gx:coord>-92.7356653752599 45.0142972080147 2438</gx:coord>
+    <gx:coord>-92.7433569853567 45.0149059605824 2438</gx:coord>
+    <gx:coord>-92.7510393079923 45.0155634422272 2438</gx:coord>
+    <gx:coord>-92.7586012608679 45.0164147107502 2438</gx:coord>
+    <gx:coord>-92.7660563085583 45.0171035403725 2438</gx:coord>
+    <gx:coord>-92.7735654020359 45.0178109394289 2408</gx:coord>
+    <gx:coord>-92.7808966683949 45.0181973511467 2347</gx:coord>
+    <gx:coord>-92.7882227912656 45.0186079478789 2316</gx:coord>
+    <gx:coord>-92.7955583985804 45.0193002290468 2255</gx:coord>
+    <gx:coord>-92.802877137723 45.0198997944223 2194</gx:coord>
+    <gx:coord>-92.810330496953 45.0205558578153 2164</gx:coord>
+    <gx:coord>-92.8178805010647 45.0213805814075 2103</gx:coord>
+    <gx:coord>-92.8253364059255 45.0220160857506 2072</gx:coord>
+    <gx:coord>-92.8282952283228 45.0222965993536 2047.6</gx:coord>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <speed>277</speed>
+    <speed>288</speed>
+    <speed>283</speed>
+    <speed>291</speed>
+    <speed>283</speed>
+    <speed>284</speed>
+    <speed>298</speed>
+    <speed>288</speed>
+    <speed>288</speed>
+    <speed>286</speed>
+    <speed>287</speed>
+    <speed>287</speed>
+    <speed>286</speed>
+    <speed>286</speed>
+    <speed>299</speed>
+    <speed>289</speed>
+    <speed>289</speed>
+    <speed>299</speed>
+    <speed>287</speed>
+    <speed>286</speed>
+    <speed>284</speed>
+    <speed>282</speed>
+    <speed>292</speed>
+    <speed>281</speed>
+    <speed>281</speed>
+    <speed>291</speed>
+    <speed>280</speed>
+    <speed>280</speed>
+    <speed>281</speed>
+    <speed>282</speed>
+    <speed>283</speed>
+    <speed>284</speed>
+    <speed>286</speed>
+    <speed>287</speed>
+    <speed>287</speed>
+    <speed>286</speed>
+    <speed>295</speed>
+    <speed>285</speed>
+    <speed>286</speed>
+    <speed>297</speed>
+    <speed>287</speed>
+    <speed>289</speed>
+    <speed>290</speed>
+    <speed>288</speed>
+    <speed>298</speed>
+    <speed>288</speed>
+    <speed>289</speed>
+    <speed>302</speed>
+    <speed>292</speed>
+    <speed>294</speed>
+    <speed>294</speed>
+    <speed>294</speed>
+    <speed>304</speed>
+    <speed>290</speed>
+    <speed>288</speed>
+    <speed>297</speed>
+    <speed>284</speed>
+    <speed>284</speed>
+    <speed>284</speed>
+    <speed>285</speed>
+    <speed>286</speed>
+    <speed>278</speed>
+    <speed>282</speed>
+    <speed>288</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>DC95</name>
+  <adflag>A</adflag>
+  <flightid>DAL2858</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:03-05</when>
+    <when>2010-05-01T13:00:07-05</when>
+    <when>2010-05-01T13:00:12-05</when>
+    <when>2010-05-01T13:00:17-05</when>
+    <when>2010-05-01T13:00:21-05</when>
+    <when>2010-05-01T13:00:26-05</when>
+    <when>2010-05-01T13:00:30-05</when>
+    <when>2010-05-01T13:00:35-05</when>
+    <when>2010-05-01T13:00:40-05</when>
+    <when>2010-05-01T13:00:44-05</when>
+    <when>2010-05-01T13:00:49-05</when>
+    <when>2010-05-01T13:00:54-05</when>
+    <when>2010-05-01T13:00:58-05</when>
+    <when>2010-05-01T13:01:03-05</when>
+    <when>2010-05-01T13:01:07-05</when>
+    <when>2010-05-01T13:01:12-05</when>
+    <when>2010-05-01T13:01:17-05</when>
+    <when>2010-05-01T13:01:21-05</when>
+    <when>2010-05-01T13:01:26-05</when>
+    <when>2010-05-01T13:01:31-05</when>
+    <when>2010-05-01T13:01:35-05</when>
+    <when>2010-05-01T13:01:40-05</when>
+    <when>2010-05-01T13:01:45-05</when>
+    <when>2010-05-01T13:01:49-05</when>
+    <when>2010-05-01T13:01:54-05</when>
+    <when>2010-05-01T13:01:58-05</when>
+    <when>2010-05-01T13:02:03-05</when>
+    <when>2010-05-01T13:02:08-05</when>
+    <when>2010-05-01T13:02:12-05</when>
+    <when>2010-05-01T13:02:17-05</when>
+    <when>2010-05-01T13:02:22-05</when>
+    <when>2010-05-01T13:02:26-05</when>
+    <when>2010-05-01T13:02:31-05</when>
+    <when>2010-05-01T13:02:35-05</when>
+    <when>2010-05-01T13:02:40-05</when>
+    <when>2010-05-01T13:02:45-05</when>
+    <when>2010-05-01T13:02:49-05</when>
+    <when>2010-05-01T13:02:54-05</when>
+    <when>2010-05-01T13:02:59-05</when>
+    <when>2010-05-01T13:03:03-05</when>
+    <when>2010-05-01T13:03:08-05</when>
+    <when>2010-05-01T13:03:12-05</when>
+    <when>2010-05-01T13:03:17-05</when>
+    <when>2010-05-01T13:03:22-05</when>
+    <when>2010-05-01T13:03:26-05</when>
+    <when>2010-05-01T13:03:31-05</when>
+    <when>2010-05-01T13:03:36-05</when>
+    <when>2010-05-01T13:03:40-05</when>
+    <when>2010-05-01T13:03:45-05</when>
+    <when>2010-05-01T13:03:49-05</when>
+    <when>2010-05-01T13:03:54-05</when>
+    <when>2010-05-01T13:03:59-05</when>
+    <when>2010-05-01T13:04:03-05</when>
+    <when>2010-05-01T13:04:08-05</when>
+    <when>2010-05-01T13:04:12-05</when>
+    <when>2010-05-01T13:04:17-05</when>
+    <when>2010-05-01T13:04:22-05</when>
+    <when>2010-05-01T13:04:26-05</when>
+    <when>2010-05-01T13:04:31-05</when>
+    <when>2010-05-01T13:04:35-05</when>
+    <when>2010-05-01T13:04:40-05</when>
+    <when>2010-05-01T13:04:45-05</when>
+    <when>2010-05-01T13:04:50-05</when>
+    <when>2010-05-01T13:04:54-05</when>
+    <when>2010-05-01T13:04:58-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-93.1962465696187 44.4584257162471 3078</gx:coord>
+    <gx:coord>-93.1954858158128 44.462643897726 3078</gx:coord>
+    <gx:coord>-93.1945524569257 44.4696206853623 3048</gx:coord>
+    <gx:coord>-93.1935347734104 44.4765680167011 3048</gx:coord>
+    <gx:coord>-93.1921548885013 44.4834366892852 3048</gx:coord>
+    <gx:coord>-93.1912787899895 44.4902740201102 3048</gx:coord>
+    <gx:coord>-93.190869393024 44.496999598511 3048</gx:coord>
+    <gx:coord>-93.190355669541 44.503701889363 3048</gx:coord>
+    <gx:coord>-93.1899042890233 44.510392533924 3048</gx:coord>
+    <gx:coord>-93.1894352972433 44.5171043633827 3048</gx:coord>
+    <gx:coord>-93.1887272976791 44.523838031578 3017</gx:coord>
+    <gx:coord>-93.1882343860587 44.5305421014878 2987</gx:coord>
+    <gx:coord>-93.1878483537445 44.5373007218153 2987</gx:coord>
+    <gx:coord>-93.187206305476 44.5440099500882 2956</gx:coord>
+    <gx:coord>-93.1868272718258 44.5507044137326 2956</gx:coord>
+    <gx:coord>-93.1868012917709 44.5573772972405 2926</gx:coord>
+    <gx:coord>-93.1866210269778 44.5640837167977 2895</gx:coord>
+    <gx:coord>-93.1864907616916 44.5708828364002 2865</gx:coord>
+    <gx:coord>-93.1863883659992 44.5775823065512 2865</gx:coord>
+    <gx:coord>-93.1863783383684 44.5842436541366 2834</gx:coord>
+    <gx:coord>-93.1864309457268 44.5909344741626 2804</gx:coord>
+    <gx:coord>-93.1861870344 44.5974636699094 2804</gx:coord>
+    <gx:coord>-93.1859399656477 44.6039556552385 2804</gx:coord>
+    <gx:coord>-93.1853781106637 44.6104625660741 2773</gx:coord>
+    <gx:coord>-93.1842558921345 44.6168860904061 2743</gx:coord>
+    <gx:coord>-93.1824878787618 44.6232658876223 2712</gx:coord>
+    <gx:coord>-93.1803879773166 44.6294813300019 2743</gx:coord>
+    <gx:coord>-93.1780367881352 44.6355848757922 2743</gx:coord>
+    <gx:coord>-93.1752316985335 44.6415358145216 2743</gx:coord>
+    <gx:coord>-93.1723853204738 44.6473610477966 2743</gx:coord>
+    <gx:coord>-93.1695650439908 44.6531642714264 2743</gx:coord>
+    <gx:coord>-93.1665274417428 44.6589294401132 2743</gx:coord>
+    <gx:coord>-93.163312582578 44.6647085135481 2743</gx:coord>
+    <gx:coord>-93.160128277284 44.6704265732562 2743</gx:coord>
+    <gx:coord>-93.1572001510497 44.6760520191633 2743</gx:coord>
+    <gx:coord>-93.1543945309268 44.6816953047965 2743</gx:coord>
+    <gx:coord>-93.1513717350775 44.6874085817504 2743</gx:coord>
+    <gx:coord>-93.148373004873 44.693058643812 2743</gx:coord>
+    <gx:coord>-93.1453860883093 44.6986645847547 2743</gx:coord>
+    <gx:coord>-93.1421804531017 44.7042897996493 2743</gx:coord>
+    <gx:coord>-93.1388918899721 44.7099624804852 2743</gx:coord>
+    <gx:coord>-93.1358117624936 44.7156532681924 2743</gx:coord>
+    <gx:coord>-93.1330575833882 44.7212682920708 2743</gx:coord>
+    <gx:coord>-93.1302162164891 44.7268585149398 2743</gx:coord>
+    <gx:coord>-93.1271891227658 44.7324687008066 2743</gx:coord>
+    <gx:coord>-93.1242151781308 44.7380337584283 2743</gx:coord>
+    <gx:coord>-93.1211166531293 44.7436002967353 2743</gx:coord>
+    <gx:coord>-93.1178719942563 44.7492107287761 2743</gx:coord>
+    <gx:coord>-93.1146752953943 44.7548599499827 2743</gx:coord>
+    <gx:coord>-93.1117422413574 44.7605559725452 2743</gx:coord>
+    <gx:coord>-93.1091424380409 44.7663214899376 2743</gx:coord>
+    <gx:coord>-93.1066566399229 44.7720715320148 2743</gx:coord>
+    <gx:coord>-93.1040152138285 44.7778692510771 2743</gx:coord>
+    <gx:coord>-93.1012154435684 44.7836013270224 2743</gx:coord>
+    <gx:coord>-93.0982479017436 44.7892173348525 2743</gx:coord>
+    <gx:coord>-93.0950640890821 44.7947430846626 2743</gx:coord>
+    <gx:coord>-93.0915034480367 44.800094039287 2743</gx:coord>
+    <gx:coord>-93.0873387008124 44.8052382540424 2743</gx:coord>
+    <gx:coord>-93.0825976468131 44.8101709774442 2743</gx:coord>
+    <gx:coord>-93.0776830792116 44.815032321238 2773</gx:coord>
+    <gx:coord>-93.0728317182526 44.8197880022073 2773</gx:coord>
+    <gx:coord>-93.0680578728105 44.8244689148117 2773</gx:coord>
+    <gx:coord>-93.0633853777291 44.829181080911 2743</gx:coord>
+    <gx:coord>-93.0589797309512 44.8338258031244 2743</gx:coord>
+    <gx:coord>-93.0546552480593 44.8384413086509 2743</gx:coord>
+    <gx:coord>-93.0501805533684 44.8430463359799 2743</gx:coord>
+    <gx:coord>-93.0484252769533 44.8448678241347 2743</gx:coord>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>40 0 0</gx:angles>
+    <gx:angles>40 0 0</gx:angles>
+    <gx:angles>40 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <gx:angles>30 0 0</gx:angles>
+    <speed>378</speed>
+    <speed>370</speed>
+    <speed>381</speed>
+    <speed>373</speed>
+    <speed>384</speed>
+    <speed>367</speed>
+    <speed>365</speed>
+    <speed>377</speed>
+    <speed>362</speed>
+    <speed>362</speed>
+    <speed>362</speed>
+    <speed>362</speed>
+    <speed>376</speed>
+    <speed>361</speed>
+    <speed>362</speed>
+    <speed>375</speed>
+    <speed>361</speed>
+    <speed>361</speed>
+    <speed>359</speed>
+    <speed>358</speed>
+    <speed>355</speed>
+    <speed>353</speed>
+    <speed>352</speed>
+    <speed>362</speed>
+    <speed>347</speed>
+    <speed>346</speed>
+    <speed>355</speed>
+    <speed>339</speed>
+    <speed>336</speed>
+    <speed>335</speed>
+    <speed>333</speed>
+    <speed>343</speed>
+    <speed>329</speed>
+    <speed>329</speed>
+    <speed>340</speed>
+    <speed>325</speed>
+    <speed>325</speed>
+    <speed>326</speed>
+    <speed>327</speed>
+    <speed>338</speed>
+    <speed>325</speed>
+    <speed>325</speed>
+    <speed>336</speed>
+    <speed>322</speed>
+    <speed>322</speed>
+    <speed>324</speed>
+    <speed>325</speed>
+    <speed>338</speed>
+    <speed>326</speed>
+    <speed>327</speed>
+    <speed>339</speed>
+    <speed>326</speed>
+    <speed>337</speed>
+    <speed>324</speed>
+    <speed>323</speed>
+    <speed>334</speed>
+    <speed>321</speed>
+    <speed>332</speed>
+    <speed>318</speed>
+    <speed>317</speed>
+    <speed>314</speed>
+    <speed>310</speed>
+    <speed>318</speed>
+    <speed>303</speed>
+    <speed>306</speed>
+    <speed>311</speed>
+    <speed>322</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>B737</name>
+  <adflag>A</adflag>
+  <flightid>SWA1488</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:01-05</when>
+    <when>2010-05-01T13:00:06-05</when>
+    <when>2010-05-01T13:00:11-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:48-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:01-05</when>
+    <when>2010-05-01T13:01:06-05</when>
+    <when>2010-05-01T13:01:11-05</when>
+    <when>2010-05-01T13:01:15-05</when>
+    <when>2010-05-01T13:01:20-05</when>
+    <when>2010-05-01T13:01:25-05</when>
+    <when>2010-05-01T13:01:29-05</when>
+    <when>2010-05-01T13:01:34-05</when>
+    <when>2010-05-01T13:01:38-05</when>
+    <when>2010-05-01T13:01:43-05</when>
+    <when>2010-05-01T13:01:48-05</when>
+    <when>2010-05-01T13:01:52-05</when>
+    <when>2010-05-01T13:01:57-05</when>
+    <when>2010-05-01T13:02:02-05</when>
+    <when>2010-05-01T13:02:06-05</when>
+    <when>2010-05-01T13:02:11-05</when>
+    <when>2010-05-01T13:02:15-05</when>
+    <when>2010-05-01T13:02:20-05</when>
+    <when>2010-05-01T13:02:25-05</when>
+    <when>2010-05-01T13:02:29-05</when>
+    <when>2010-05-01T13:02:34-05</when>
+    <when>2010-05-01T13:02:39-05</when>
+    <when>2010-05-01T13:02:43-05</when>
+    <when>2010-05-01T13:02:48-05</when>
+    <when>2010-05-01T13:02:53-05</when>
+    <when>2010-05-01T13:02:57-05</when>
+    <when>2010-05-01T13:03:02-05</when>
+    <when>2010-05-01T13:03:06-05</when>
+    <when>2010-05-01T13:03:11-05</when>
+    <when>2010-05-01T13:03:16-05</when>
+    <when>2010-05-01T13:03:20-05</when>
+    <when>2010-05-01T13:03:25-05</when>
+    <when>2010-05-01T13:03:30-05</when>
+    <when>2010-05-01T13:03:34-05</when>
+    <when>2010-05-01T13:03:39-05</when>
+    <when>2010-05-01T13:03:44-05</when>
+    <when>2010-05-01T13:03:48-05</when>
+    <when>2010-05-01T13:03:53-05</when>
+    <when>2010-05-01T13:03:57-05</when>
+    <when>2010-05-01T13:04:02-05</when>
+    <when>2010-05-01T13:04:07-05</when>
+    <when>2010-05-01T13:04:11-05</when>
+    <when>2010-05-01T13:04:16-05</when>
+    <when>2010-05-01T13:04:21-05</when>
+    <when>2010-05-01T13:04:25-05</when>
+    <when>2010-05-01T13:04:30-05</when>
+    <when>2010-05-01T13:04:35-05</when>
+    <when>2010-05-01T13:04:39-05</when>
+    <when>2010-05-01T13:04:44-05</when>
+    <when>2010-05-01T13:04:49-05</when>
+    <when>2010-05-01T13:04:53-05</when>
+    <when>2010-05-01T13:04:58-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-92.7436038977339 45.0176449723009 2438</gx:coord>
+    <gx:coord>-92.745419752639 45.0178405701636 2438</gx:coord>
+    <gx:coord>-92.7525586927583 45.0181852080204 2438</gx:coord>
+    <gx:coord>-92.7599978682742 45.0189437491361 2438</gx:coord>
+    <gx:coord>-92.7673964649616 45.0200176804669 2438</gx:coord>
+    <gx:coord>-92.7743047878147 45.0206512321095 2438</gx:coord>
+    <gx:coord>-92.7812211106102 45.0212438545962 2438</gx:coord>
+    <gx:coord>-92.7880905786106 45.0219352711124 2438</gx:coord>
+    <gx:coord>-92.7948110303679 45.0225135550872 2438</gx:coord>
+    <gx:coord>-92.8016256231407 45.0231539091809 2377</gx:coord>
+    <gx:coord>-92.808436321378 45.0237782407713 2316</gx:coord>
+    <gx:coord>-92.8153060032773 45.0245123996427 2255</gx:coord>
+    <gx:coord>-92.8220950756464 45.0250388052127 2194</gx:coord>
+    <gx:coord>-92.8289929014999 45.0256725515916 2164</gx:coord>
+    <gx:coord>-92.8360303531199 45.0266058986232 2103</gx:coord>
+    <gx:coord>-92.8429329578141 45.0273764305379 2072</gx:coord>
+    <gx:coord>-92.8498901242601 45.0280031718838 2011</gx:coord>
+    <gx:coord>-92.8570769257727 45.0288350738651 1981</gx:coord>
+    <gx:coord>-92.8642468830706 45.0297437485852 1920</gx:coord>
+    <gx:coord>-92.87096733955 45.0302316004222 1859</gx:coord>
+    <gx:coord>-92.8776991433842 45.0308036595577 1828</gx:coord>
+    <gx:coord>-92.8848051869188 45.0317355139572 1768</gx:coord>
+    <gx:coord>-92.891849836226 45.032372254553 1737</gx:coord>
+    <gx:coord>-92.8988806858275 45.0330472653869 1676</gx:coord>
+    <gx:coord>-92.9059183042329 45.0336591058208 1646</gx:coord>
+    <gx:coord>-92.9127864875957 45.0340529790218 1554</gx:coord>
+    <gx:coord>-92.9198394657117 45.0347605723218 1554</gx:coord>
+    <gx:coord>-92.9271188759936 45.0355320490291 1493</gx:coord>
+    <gx:coord>-92.9342496165443 45.0361866089878 1463</gx:coord>
+    <gx:coord>-92.9413321497396 45.0366031935849 1402</gx:coord>
+    <gx:coord>-92.9482307097935 45.0364375819171 1371</gx:coord>
+    <gx:coord>-92.9549267830033 45.0357359075476 1341</gx:coord>
+    <gx:coord>-92.9616308114574 45.0349106615543 1310</gx:coord>
+    <gx:coord>-92.9680840982828 45.0340026299843 1280</gx:coord>
+    <gx:coord>-92.9744518648424 45.0330474137801 1280</gx:coord>
+    <gx:coord>-92.9808447078198 45.0322448064613 1249</gx:coord>
+    <gx:coord>-92.9869393112267 45.0312693675023 1219</gx:coord>
+    <gx:coord>-92.9930579883147 45.0303271096009 1219</gx:coord>
+    <gx:coord>-92.9991883691893 45.0295800716662 1219</gx:coord>
+    <gx:coord>-93.0050223477826 45.028724083281 1219</gx:coord>
+    <gx:coord>-93.010614076045 45.0278629900138 1219</gx:coord>
+    <gx:coord>-93.0160206405037 45.0268346460011 1219</gx:coord>
+    <gx:coord>-93.0211552000865 45.0253145800507 1219</gx:coord>
+    <gx:coord>-93.0258637412524 45.0233023458284 1219</gx:coord>
+    <gx:coord>-93.0300671724338 45.0208133465794 1219</gx:coord>
+    <gx:coord>-93.0339928023023 45.0180815293661 1219</gx:coord>
+    <gx:coord>-93.0378123650471 45.015386905955 1219</gx:coord>
+    <gx:coord>-93.0413573567597 45.0126147468646 1219</gx:coord>
+    <gx:coord>-93.0448863339261 45.0099395682965 1219</gx:coord>
+    <gx:coord>-93.0485234513263 45.0073532174657 1219</gx:coord>
+    <gx:coord>-93.0521310871894 45.0048422081768 1219</gx:coord>
+    <gx:coord>-93.0555350014272 45.0023982293894 1219</gx:coord>
+    <gx:coord>-93.0589786824276 45.0000288885742 1188</gx:coord>
+    <gx:coord>-93.0623077105646 44.9977133640953 1188</gx:coord>
+    <gx:coord>-93.065360230814 44.995356896404 1158</gx:coord>
+    <gx:coord>-93.0685763415021 44.9931569267686 1158</gx:coord>
+    <gx:coord>-93.0718407580212 44.9911674357548 1097</gx:coord>
+    <gx:coord>-93.0748577258473 44.9891037291536 1066</gx:coord>
+    <gx:coord>-93.0778092168993 44.9869633801591 1036</gx:coord>
+    <gx:coord>-93.0808539061589 44.9848563483924 1006</gx:coord>
+    <gx:coord>-93.0836846650629 44.9827278139486 975</gx:coord>
+    <gx:coord>-93.0863847135489 44.9806419407598 945</gx:coord>
+    <gx:coord>-93.0891432094711 44.978586338985 945</gx:coord>
+    <gx:coord>-93.0918882385755 44.9764807737863 945</gx:coord>
+    <gx:coord>-93.0946313764692 44.9743266948072 914</gx:coord>
+    <gx:coord>-93.0974123770403 44.9722534220515 914</gx:coord>
+    <gx:coord>-93.0987847859357 44.9712598545857 899</gx:coord>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>240 0 0</gx:angles>
+    <gx:angles>240 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <speed>280</speed>
+    <speed>293</speed>
+    <speed>284</speed>
+    <speed>288</speed>
+    <speed>274</speed>
+    <speed>272</speed>
+    <speed>279</speed>
+    <speed>263</speed>
+    <speed>263</speed>
+    <speed>262</speed>
+    <speed>262</speed>
+    <speed>275</speed>
+    <speed>266</speed>
+    <speed>267</speed>
+    <speed>279</speed>
+    <speed>272</speed>
+    <speed>271</speed>
+    <speed>268</speed>
+    <speed>269</speed>
+    <speed>280</speed>
+    <speed>269</speed>
+    <speed>267</speed>
+    <speed>278</speed>
+    <speed>270</speed>
+    <speed>271</speed>
+    <speed>272</speed>
+    <speed>272</speed>
+    <speed>281</speed>
+    <speed>270</speed>
+    <speed>268</speed>
+    <speed>273</speed>
+    <speed>259</speed>
+    <speed>255</speed>
+    <speed>250</speed>
+    <speed>247</speed>
+    <speed>244</speed>
+    <speed>239</speed>
+    <speed>235</speed>
+    <speed>238</speed>
+    <speed>224</speed>
+    <speed>220</speed>
+    <speed>224</speed>
+    <speed>212</speed>
+    <speed>210</speed>
+    <speed>208</speed>
+    <speed>206</speed>
+    <speed>204</speed>
+    <speed>200</speed>
+    <speed>197</speed>
+    <speed>200</speed>
+    <speed>189</speed>
+    <speed>185</speed>
+    <speed>188</speed>
+    <speed>176</speed>
+    <speed>172</speed>
+    <speed>168</speed>
+    <speed>165</speed>
+    <speed>163</speed>
+    <speed>159</speed>
+    <speed>158</speed>
+    <speed>157</speed>
+    <speed>156</speed>
+    <speed>155</speed>
+    <speed>159</speed>
+    <speed>156</speed>
+    <speed>160</speed>
+    <speed>165</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>CRJ2</name>
+  <adflag>A</adflag>
+  <flightid>MES3237</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:02:11-05</when>
+    <when>2010-05-01T13:02:16-05</when>
+    <when>2010-05-01T13:02:20-05</when>
+    <when>2010-05-01T13:02:25-05</when>
+    <when>2010-05-01T13:02:30-05</when>
+    <when>2010-05-01T13:02:34-05</when>
+    <when>2010-05-01T13:02:39-05</when>
+    <when>2010-05-01T13:02:44-05</when>
+    <when>2010-05-01T13:02:48-05</when>
+    <when>2010-05-01T13:02:53-05</when>
+    <when>2010-05-01T13:02:58-05</when>
+    <when>2010-05-01T13:03:02-05</when>
+    <when>2010-05-01T13:03:07-05</when>
+    <when>2010-05-01T13:03:11-05</when>
+    <when>2010-05-01T13:03:16-05</when>
+    <when>2010-05-01T13:03:21-05</when>
+    <when>2010-05-01T13:03:25-05</when>
+    <when>2010-05-01T13:03:30-05</when>
+    <when>2010-05-01T13:03:35-05</when>
+    <when>2010-05-01T13:03:39-05</when>
+    <when>2010-05-01T13:03:44-05</when>
+    <when>2010-05-01T13:03:49-05</when>
+    <when>2010-05-01T13:03:53-05</when>
+    <when>2010-05-01T13:03:58-05</when>
+    <when>2010-05-01T13:04:02-05</when>
+    <when>2010-05-01T13:04:07-05</when>
+    <when>2010-05-01T13:04:12-05</when>
+    <when>2010-05-01T13:04:16-05</when>
+    <when>2010-05-01T13:04:21-05</when>
+    <when>2010-05-01T13:04:26-05</when>
+    <when>2010-05-01T13:04:30-05</when>
+    <when>2010-05-01T13:04:35-05</when>
+    <when>2010-05-01T13:04:39-05</when>
+    <when>2010-05-01T13:04:44-05</when>
+    <when>2010-05-01T13:04:49-05</when>
+    <when>2010-05-01T13:04:53-05</when>
+    <when>2010-05-01T13:04:58-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-92.3654525809466 45.0395326832503 2865</gx:coord>
+    <gx:coord>-92.3722148453194 45.0383957360594 2804</gx:coord>
+    <gx:coord>-92.3789968405533 45.0372550297716 2743</gx:coord>
+    <gx:coord>-92.3857717937338 45.035790850493 2712</gx:coord>
+    <gx:coord>-92.3928268643983 45.0344988210948 2651</gx:coord>
+    <gx:coord>-92.4001469312933 45.033871851974 2560</gx:coord>
+    <gx:coord>-92.4074037761026 45.0334790794383 2530</gx:coord>
+    <gx:coord>-92.4143764863149 45.0325702739764 2469</gx:coord>
+    <gx:coord>-92.4212444848282 45.0311814951256 2438</gx:coord>
+    <gx:coord>-92.4279010170141 45.0296690432212 2438</gx:coord>
+    <gx:coord>-92.4345565361906 45.0284146419212 2438</gx:coord>
+    <gx:coord>-92.4413302267182 45.0272251811423 2438</gx:coord>
+    <gx:coord>-92.4480836488953 45.0260669070124 2438</gx:coord>
+    <gx:coord>-92.4551038107528 45.0251701649012 2438</gx:coord>
+    <gx:coord>-92.4620867595928 45.0240801934066 2469</gx:coord>
+    <gx:coord>-92.4688445943801 45.0226696219111 2438</gx:coord>
+    <gx:coord>-92.475770828578 45.0214068742927 2438</gx:coord>
+    <gx:coord>-92.4828770275976 45.0207461539528 2438</gx:coord>
+    <gx:coord>-92.4898573176066 45.0197355515252 2438</gx:coord>
+    <gx:coord>-92.4967644710332 45.0183323474054 2438</gx:coord>
+    <gx:coord>-92.5037089663701 45.0170733409348 2438</gx:coord>
+    <gx:coord>-92.5107248421742 45.0161283120616 2438</gx:coord>
+    <gx:coord>-92.5176434168212 45.0153021033734 2438</gx:coord>
+    <gx:coord>-92.5246160799064 45.014766408047 2438</gx:coord>
+    <gx:coord>-92.5318394590384 45.0148138551787 2438</gx:coord>
+    <gx:coord>-92.5390862704917 45.0145094336569 2438</gx:coord>
+    <gx:coord>-92.5463963852328 45.0143318745824 2438</gx:coord>
+    <gx:coord>-92.5536631015454 45.0147147936455 2438</gx:coord>
+    <gx:coord>-92.5607664550331 45.014765244052 2438</gx:coord>
+    <gx:coord>-92.5679894227165 45.0149152572076 2438</gx:coord>
+    <gx:coord>-92.5752195833593 45.0150827900687 2438</gx:coord>
+    <gx:coord>-92.582448917158 45.015235432103 2438</gx:coord>
+    <gx:coord>-92.5897932283758 45.0155897891663 2438</gx:coord>
+    <gx:coord>-92.5970842773637 45.0160017913126 2438</gx:coord>
+    <gx:coord>-92.6042355431238 45.0161855996339 2438</gx:coord>
+    <gx:coord>-92.6114545174405 45.0162505274554 2438</gx:coord>
+    <gx:coord>-92.6187520939916 45.0164837409472 2438</gx:coord>
+    <gx:coord>-92.6216565981247 45.0165937676212 2438</gx:coord>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <speed>267</speed>
+    <speed>265</speed>
+    <speed>277</speed>
+    <speed>273</speed>
+    <speed>274</speed>
+    <speed>275</speed>
+    <speed>275</speed>
+    <speed>272</speed>
+    <speed>270</speed>
+    <speed>268</speed>
+    <speed>278</speed>
+    <speed>268</speed>
+    <speed>268</speed>
+    <speed>280</speed>
+    <speed>271</speed>
+    <speed>272</speed>
+    <speed>273</speed>
+    <speed>273</speed>
+    <speed>273</speed>
+    <speed>272</speed>
+    <speed>271</speed>
+    <speed>283</speed>
+    <speed>273</speed>
+    <speed>273</speed>
+    <speed>285</speed>
+    <speed>275</speed>
+    <speed>276</speed>
+    <speed>276</speed>
+    <speed>276</speed>
+    <speed>287</speed>
+    <speed>277</speed>
+    <speed>277</speed>
+    <speed>288</speed>
+    <speed>278</speed>
+    <speed>278</speed>
+    <speed>268</speed>
+    <speed>271</speed>
+    <speed>277</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>A318</name>
+  <adflag>A</adflag>
+  <flightid>FFT106</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:05-05</when>
+    <when>2010-05-01T13:00:09-05</when>
+    <when>2010-05-01T13:00:14-05</when>
+    <when>2010-05-01T13:00:19-05</when>
+    <when>2010-05-01T13:00:23-05</when>
+    <when>2010-05-01T13:00:28-05</when>
+    <when>2010-05-01T13:00:33-05</when>
+    <when>2010-05-01T13:00:37-05</when>
+    <when>2010-05-01T13:00:42-05</when>
+    <when>2010-05-01T13:00:47-05</when>
+    <when>2010-05-01T13:00:51-05</when>
+    <when>2010-05-01T13:00:56-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <when>2010-05-01T13:01:05-05</when>
+    <when>2010-05-01T13:01:10-05</when>
+    <when>2010-05-01T13:01:14-05</when>
+    <when>2010-05-01T13:01:19-05</when>
+    <when>2010-05-01T13:01:24-05</when>
+    <when>2010-05-01T13:01:28-05</when>
+    <when>2010-05-01T13:01:33-05</when>
+    <when>2010-05-01T13:01:37-05</when>
+    <when>2010-05-01T13:01:42-05</when>
+    <when>2010-05-01T13:01:47-05</when>
+    <when>2010-05-01T13:01:51-05</when>
+    <when>2010-05-01T13:01:56-05</when>
+    <when>2010-05-01T13:02:01-05</when>
+    <when>2010-05-01T13:02:05-05</when>
+    <when>2010-05-01T13:02:10-05</when>
+    <when>2010-05-01T13:02:15-05</when>
+    <when>2010-05-01T13:02:19-05</when>
+    <when>2010-05-01T13:02:24-05</when>
+    <when>2010-05-01T13:02:28-05</when>
+    <when>2010-05-01T13:02:33-05</when>
+    <when>2010-05-01T13:02:38-05</when>
+    <when>2010-05-01T13:02:42-05</when>
+    <when>2010-05-01T13:02:47-05</when>
+    <when>2010-05-01T13:02:52-05</when>
+    <when>2010-05-01T13:02:56-05</when>
+    <when>2010-05-01T13:03:01-05</when>
+    <when>2010-05-01T13:03:06-05</when>
+    <when>2010-05-01T13:03:10-05</when>
+    <when>2010-05-01T13:03:15-05</when>
+    <when>2010-05-01T13:03:19-05</when>
+    <when>2010-05-01T13:03:24-05</when>
+    <when>2010-05-01T13:03:29-05</when>
+    <when>2010-05-01T13:03:33-05</when>
+    <when>2010-05-01T13:03:38-05</when>
+    <when>2010-05-01T13:03:43-05</when>
+    <when>2010-05-01T13:03:47-05</when>
+    <when>2010-05-01T13:03:52-05</when>
+    <when>2010-05-01T13:03:56-05</when>
+    <when>2010-05-01T13:04:01-05</when>
+    <when>2010-05-01T13:04:05-05</when>
+    <when>2010-05-01T13:04:10-05</when>
+    <when>2010-05-01T13:04:14-05</when>
+    <when>2010-05-01T13:04:18-05</when>
+    <when>2010-05-01T13:04:23-05</when>
+    <when>2010-05-01T13:04:27-05</when>
+    <when>2010-05-01T13:04:32-05</when>
+    <when>2010-05-01T13:04:37-05</when>
+    <when>2010-05-01T13:04:41-05</when>
+    <when>2010-05-01T13:04:46-05</when>
+    <when>2010-05-01T13:04:50-05</when>
+    <when>2010-05-01T13:04:55-05</when>
+    <when>2010-05-01T13:04:59-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-93.2974568508014 45.0687622602847 1432</gx:coord>
+    <gx:coord>-93.2934457905393 45.0660257042941 1371</gx:coord>
+    <gx:coord>-93.2902010482642 45.0627382200457 1341</gx:coord>
+    <gx:coord>-93.2880735868205 45.0592062737728 1280</gx:coord>
+    <gx:coord>-93.2866251180089 45.0556538417996 1280</gx:coord>
+    <gx:coord>-93.2855706436895 45.0521555770546 1249</gx:coord>
+    <gx:coord>-93.2848929213344 45.0486326683558 1249</gx:coord>
+    <gx:coord>-93.284149302237 45.0450445279501 1219</gx:coord>
+    <gx:coord>-93.2832681542582 45.0414770478452 1219</gx:coord>
+    <gx:coord>-93.2822163760078 45.0378266141909 1219</gx:coord>
+    <gx:coord>-93.2810695206555 45.0339762188888 1249</gx:coord>
+    <gx:coord>-93.2800852709943 45.0300242656845 1249</gx:coord>
+    <gx:coord>-93.2789451826991 45.026165428423 1249</gx:coord>
+    <gx:coord>-93.2776553627852 45.0222881273358 1219</gx:coord>
+    <gx:coord>-93.2762849051262 45.0183879412865 1219</gx:coord>
+    <gx:coord>-93.2750227859231 45.01452278975 1188</gx:coord>
+    <gx:coord>-93.2739788608525 45.0107480537055 1188</gx:coord>
+    <gx:coord>-93.27273416536 45.0071654180353 1158</gx:coord>
+    <gx:coord>-93.271440533456 45.0036211770402 1127</gx:coord>
+    <gx:coord>-93.2702510339155 45.0000676438878 1066</gx:coord>
+    <gx:coord>-93.2689856900965 44.9965088916327 1036</gx:coord>
+    <gx:coord>-93.2677450407515 44.9930289132183 1006</gx:coord>
+    <gx:coord>-93.2665628070763 44.9897678001495 975</gx:coord>
+    <gx:coord>-93.2654695900875 44.9865668331562 945</gx:coord>
+    <gx:coord>-93.2643275310433 44.9833330918205 914</gx:coord>
+    <gx:coord>-93.2631023843797 44.9801905024626 823</gx:coord>
+    <gx:coord>-93.2621060751847 44.9769860428905 823</gx:coord>
+    <gx:coord>-93.2613793333571 44.9737243608145 762</gx:coord>
+    <gx:coord>-93.2609358268711 44.970517162552 762</gx:coord>
+    <gx:coord>-93.260628015146 44.9674064044388 762</gx:coord>
+    <gx:coord>-93.2602996952247 44.9643597216492 731</gx:coord>
+    <gx:coord>-93.2599595576737 44.9613320303757 731</gx:coord>
+    <gx:coord>-93.2594994071955 44.9582185681901 701</gx:coord>
+    <gx:coord>-93.2589507888497 44.9549930481613 670</gx:coord>
+    <gx:coord>-93.2583578824759 44.9518211731838 670</gx:coord>
+    <gx:coord>-93.2577038531017 44.9485831657195 640</gx:coord>
+    <gx:coord>-93.2570809594468 44.9453063523228 609</gx:coord>
+    <gx:coord>-93.2563271653062 44.942138873467 609</gx:coord>
+    <gx:coord>-93.2554358149374 44.9390293085691 579</gx:coord>
+    <gx:coord>-93.2546255139468 44.9359025243045 579</gx:coord>
+    <gx:coord>-93.2538265267143 44.9327450699088 548</gx:coord>
+    <gx:coord>-93.2530252021259 44.9297128380021 548</gx:coord>
+    <gx:coord>-93.2522809727351 44.9267689034144 518</gx:coord>
+    <gx:coord>-93.2515035867768 44.9237188014152 487</gx:coord>
+    <gx:coord>-93.2506543465894 44.9207369723461 487</gx:coord>
+    <gx:coord>-93.2498548488919 44.9178124047958 457</gx:coord>
+    <gx:coord>-93.2489961276719 44.9148538675761 426</gx:coord>
+    <gx:coord>-93.2481063345252 44.9118432075909 426</gx:coord>
+    <gx:coord>-93.2475702164253 44.9090871778968 396</gx:coord>
+    <gx:coord>-93.2468054019883 44.9062896891392 365</gx:coord>
+    <gx:coord>-93.2459138821779 44.9031220636101 365</gx:coord>
+    <gx:coord>-93.2451839956313 44.9003646144392 335</gx:coord>
+    <gx:coord>-93.2442620734973 44.8974631820496 335</gx:coord>
+    <gx:coord>-93.2437934615496 44.8946084310426 335</gx:coord>
+    <gx:coord>-93.2430623256379 44.8915836945618 365</gx:coord>
+    <gx:coord>-93.2424772474959 44.8888394893853 426</gx:coord>
+    <gx:coord>-93.2417795129824 44.8858318116166 487</gx:coord>
+    <gx:coord>-93.2411065382114 44.882678391429 518</gx:coord>
+    <gx:coord>-93.2402313646157 44.879530182788 579</gx:coord>
+    <gx:coord>-93.2392009410817 44.8759747599643 609</gx:coord>
+    <gx:coord>-93.2377852820119 44.872769339825 670</gx:coord>
+    <gx:coord>-93.2363530715176 44.8696281486003 731</gx:coord>
+    <gx:coord>-93.23475664131 44.866270773938 762</gx:coord>
+    <gx:coord>-93.2331575993176 44.8629492601519 823</gx:coord>
+    <gx:coord>-93.2317272590921 44.8596791368118 853</gx:coord>
+    <gx:coord>-93.2301662617953 44.8564215369107 884</gx:coord>
+    <gx:coord>-93.2298549002314 44.8557795687872 884</gx:coord>
+    <gx:angles>140 0 0</gx:angles>
+    <gx:angles>150 0 0</gx:angles>
+    <gx:angles>150 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <speed>212</speed>
+    <speed>205</speed>
+    <speed>208</speed>
+    <speed>203</speed>
+    <speed>201</speed>
+    <speed>196</speed>
+    <speed>196</speed>
+    <speed>197</speed>
+    <speed>202</speed>
+    <speed>205</speed>
+    <speed>216</speed>
+    <speed>212</speed>
+    <speed>214</speed>
+    <speed>221</speed>
+    <speed>210</speed>
+    <speed>208</speed>
+    <speed>205</speed>
+    <speed>202</speed>
+    <speed>206</speed>
+    <speed>194</speed>
+    <speed>191</speed>
+    <speed>195</speed>
+    <speed>184</speed>
+    <speed>181</speed>
+    <speed>178</speed>
+    <speed>177</speed>
+    <speed>175</speed>
+    <speed>173</speed>
+    <speed>171</speed>
+    <speed>176</speed>
+    <speed>169</speed>
+    <speed>168</speed>
+    <speed>176</speed>
+    <speed>172</speed>
+    <speed>174</speed>
+    <speed>174</speed>
+    <speed>174</speed>
+    <speed>174</speed>
+    <speed>172</speed>
+    <speed>169</speed>
+    <speed>175</speed>
+    <speed>167</speed>
+    <speed>165</speed>
+    <speed>170</speed>
+    <speed>164</speed>
+    <speed>162</speed>
+    <speed>159</speed>
+    <speed>161</speed>
+    <speed>165</speed>
+    <speed>158</speed>
+    <speed>163</speed>
+    <speed>165</speed>
+    <speed>164</speed>
+    <speed>169</speed>
+    <speed>167</speed>
+    <speed>175</speed>
+    <speed>175</speed>
+    <speed>178</speed>
+    <speed>183</speed>
+    <speed>181</speed>
+    <speed>191</speed>
+    <speed>186</speed>
+    <speed>192</speed>
+    <speed>192</speed>
+    <speed>189</speed>
+    <speed>193</speed>
+    <speed>184</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>BE35</name>
+  <adflag>A</adflag>
+  <flightid>N46JJ</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:01:21-05</when>
+    <when>2010-05-01T13:01:26-05</when>
+    <when>2010-05-01T13:01:31-05</when>
+    <when>2010-05-01T13:01:35-05</when>
+    <when>2010-05-01T13:01:40-05</when>
+    <when>2010-05-01T13:01:44-05</when>
+    <when>2010-05-01T13:01:49-05</when>
+    <when>2010-05-01T13:01:54-05</when>
+    <when>2010-05-01T13:01:58-05</when>
+    <when>2010-05-01T13:02:03-05</when>
+    <when>2010-05-01T13:02:08-05</when>
+    <when>2010-05-01T13:02:12-05</when>
+    <when>2010-05-01T13:02:17-05</when>
+    <when>2010-05-01T13:02:22-05</when>
+    <when>2010-05-01T13:02:26-05</when>
+    <when>2010-05-01T13:02:31-05</when>
+    <when>2010-05-01T13:02:35-05</when>
+    <when>2010-05-01T13:02:40-05</when>
+    <when>2010-05-01T13:02:45-05</when>
+    <when>2010-05-01T13:02:49-05</when>
+    <when>2010-05-01T13:02:54-05</when>
+    <when>2010-05-01T13:02:59-05</when>
+    <when>2010-05-01T13:03:03-05</when>
+    <when>2010-05-01T13:03:08-05</when>
+    <when>2010-05-01T13:03:13-05</when>
+    <when>2010-05-01T13:03:17-05</when>
+    <when>2010-05-01T13:03:22-05</when>
+    <when>2010-05-01T13:03:26-05</when>
+    <when>2010-05-01T13:03:31-05</when>
+    <when>2010-05-01T13:03:36-05</when>
+    <when>2010-05-01T13:03:40-05</when>
+    <when>2010-05-01T13:03:45-05</when>
+    <when>2010-05-01T13:03:50-05</when>
+    <when>2010-05-01T13:03:54-05</when>
+    <when>2010-05-01T13:03:59-05</when>
+    <when>2010-05-01T13:04:04-05</when>
+    <when>2010-05-01T13:04:08-05</when>
+    <when>2010-05-01T13:04:13-05</when>
+    <when>2010-05-01T13:04:17-05</when>
+    <when>2010-05-01T13:04:22-05</when>
+    <when>2010-05-01T13:04:27-05</when>
+    <when>2010-05-01T13:04:31-05</when>
+    <when>2010-05-01T13:04:36-05</when>
+    <when>2010-05-01T13:04:41-05</when>
+    <when>2010-05-01T13:04:45-05</when>
+    <when>2010-05-01T13:04:50-05</when>
+    <when>2010-05-01T13:04:55-05</when>
+    <when>2010-05-01T13:04:59-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-92.9339221048924 44.2950315742565 1524</gx:coord>
+    <gx:coord>-92.9350064014678 44.2979570591066 1524</gx:coord>
+    <gx:coord>-92.937652997869 44.3004478107577 1524</gx:coord>
+    <gx:coord>-92.9407116824041 44.302846514598 1524</gx:coord>
+    <gx:coord>-92.9430921358657 44.3054902041603 1524</gx:coord>
+    <gx:coord>-92.9452136372834 44.308154578993 1524</gx:coord>
+    <gx:coord>-92.9479783757094 44.310667507076 1524</gx:coord>
+    <gx:coord>-92.9505645579644 44.3132980584321 1524</gx:coord>
+    <gx:coord>-92.953176931421 44.3159244553921 1524</gx:coord>
+    <gx:coord>-92.955790238918 44.3185524033008 1524</gx:coord>
+    <gx:coord>-92.9581111706922 44.3212990950149 1524</gx:coord>
+    <gx:coord>-92.9605941160522 44.3239309610271 1524</gx:coord>
+    <gx:coord>-92.9634150903891 44.3264339577567 1524</gx:coord>
+    <gx:coord>-92.9661669042714 44.3290084280208 1524</gx:coord>
+    <gx:coord>-92.9689057275993 44.3316511959644 1524</gx:coord>
+    <gx:coord>-92.9719191039836 44.3342289723207 1524</gx:coord>
+    <gx:coord>-92.9745609220571 44.3367593382531 1524</gx:coord>
+    <gx:coord>-92.9767073261514 44.3394303305052 1524</gx:coord>
+    <gx:coord>-92.9791044580601 44.34211951331 1524</gx:coord>
+    <gx:coord>-92.9818312662522 44.3446672608847 1524</gx:coord>
+    <gx:coord>-92.98437591379 44.3472600312903 1524</gx:coord>
+    <gx:coord>-92.9873161522272 44.3497184463263 1524</gx:coord>
+    <gx:coord>-92.9898453395122 44.3523721849065 1524</gx:coord>
+    <gx:coord>-92.992276996923 44.3551963485207 1524</gx:coord>
+    <gx:coord>-92.9947092219658 44.3579338326741 1524</gx:coord>
+    <gx:coord>-92.9972281517299 44.3606240814545 1524</gx:coord>
+    <gx:coord>-92.9993151368602 44.3634480822621 1524</gx:coord>
+    <gx:coord>-93.0016285033253 44.3662342282271 1524</gx:coord>
+    <gx:coord>-93.0048280633172 44.3687843972879 1524</gx:coord>
+    <gx:coord>-93.0078776508536 44.371448246948 1524</gx:coord>
+    <gx:coord>-93.0107556818704 44.3741327819505 1524</gx:coord>
+    <gx:coord>-93.0132474745541 44.3767834196569 1524</gx:coord>
+    <gx:coord>-93.015638082508 44.3795081186135 1524</gx:coord>
+    <gx:coord>-93.0183495942011 44.3821828750482 1524</gx:coord>
+    <gx:coord>-93.0215077436058 44.3847489346551 1524</gx:coord>
+    <gx:coord>-93.024007943771 44.3874959321693 1524</gx:coord>
+    <gx:coord>-93.0264526837138 44.3902468927735 1524</gx:coord>
+    <gx:coord>-93.0287728968074 44.3929994156644 1524</gx:coord>
+    <gx:coord>-93.0313252807714 44.3957423196104 1524</gx:coord>
+    <gx:coord>-93.0340309029643 44.3984682572521 1554</gx:coord>
+    <gx:coord>-93.0367834033903 44.4012140197658 1554</gx:coord>
+    <gx:coord>-93.039886374743 44.4039013532069 1524</gx:coord>
+    <gx:coord>-93.0431213002073 44.4066598090273 1524</gx:coord>
+    <gx:coord>-93.0456886621799 44.4095616223744 1524</gx:coord>
+    <gx:coord>-93.0477227123297 44.4124371862128 1524</gx:coord>
+    <gx:coord>-93.0506396295538 44.4152339455378 1524</gx:coord>
+    <gx:coord>-93.0533566431572 44.4181925397398 1524</gx:coord>
+    <gx:coord>-93.0556214357794 44.421167115874 1524</gx:coord>
+    <gx:coord>-93.0562077996189 44.4217279400145 1524</gx:coord>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>320 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <gx:angles>330 0 0</gx:angles>
+    <speed>169</speed>
+    <speed>166</speed>
+    <speed>171</speed>
+    <speed>169</speed>
+    <speed>171</speed>
+    <speed>178</speed>
+    <speed>171</speed>
+    <speed>172</speed>
+    <speed>173</speed>
+    <speed>173</speed>
+    <speed>173</speed>
+    <speed>174</speed>
+    <speed>175</speed>
+    <speed>181</speed>
+    <speed>174</speed>
+    <speed>174</speed>
+    <speed>180</speed>
+    <speed>172</speed>
+    <speed>171</speed>
+    <speed>172</speed>
+    <speed>174</speed>
+    <speed>174</speed>
+    <speed>174</speed>
+    <speed>175</speed>
+    <speed>181</speed>
+    <speed>176</speed>
+    <speed>177</speed>
+    <speed>186</speed>
+    <speed>179</speed>
+    <speed>179</speed>
+    <speed>179</speed>
+    <speed>179</speed>
+    <speed>178</speed>
+    <speed>177</speed>
+    <speed>177</speed>
+    <speed>184</speed>
+    <speed>178</speed>
+    <speed>177</speed>
+    <speed>186</speed>
+    <speed>182</speed>
+    <speed>184</speed>
+    <speed>184</speed>
+    <speed>185</speed>
+    <speed>186</speed>
+    <speed>185</speed>
+    <speed>184</speed>
+    <speed>187</speed>
+    <speed>184</speed>
+    <speed>187</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name></name>
+  <adflag>A</adflag>
+  <flightid></flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:05-05</when>
+    <when>2010-05-01T13:00:10-05</when>
+    <when>2010-05-01T13:00:14-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:33-05</when>
+    <when>2010-05-01T13:00:37-05</when>
+    <when>2010-05-01T13:00:42-05</when>
+    <when>2010-05-01T13:00:47-05</when>
+    <when>2010-05-01T13:00:51-05</when>
+    <when>2010-05-01T13:00:56-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <when>2010-05-01T13:01:05-05</when>
+    <when>2010-05-01T13:01:10-05</when>
+    <when>2010-05-01T13:01:14-05</when>
+    <when>2010-05-01T13:01:19-05</when>
+    <when>2010-05-01T13:01:24-05</when>
+    <when>2010-05-01T13:01:28-05</when>
+    <when>2010-05-01T13:01:33-05</when>
+    <when>2010-05-01T13:01:38-05</when>
+    <when>2010-05-01T13:01:43-05</when>
+    <when>2010-05-01T13:01:47-05</when>
+    <when>2010-05-01T13:01:51-05</when>
+    <when>2010-05-01T13:01:56-05</when>
+    <when>2010-05-01T13:02:01-05</when>
+    <when>2010-05-01T13:02:05-05</when>
+    <when>2010-05-01T13:02:10-05</when>
+    <when>2010-05-01T13:02:15-05</when>
+    <when>2010-05-01T13:02:19-05</when>
+    <when>2010-05-01T13:02:24-05</when>
+    <when>2010-05-01T13:02:28-05</when>
+    <when>2010-05-01T13:02:33-05</when>
+    <when>2010-05-01T13:02:38-05</when>
+    <when>2010-05-01T13:02:42-05</when>
+    <when>2010-05-01T13:02:47-05</when>
+    <when>2010-05-01T13:02:52-05</when>
+    <when>2010-05-01T13:02:56-05</when>
+    <when>2010-05-01T13:03:01-05</when>
+    <when>2010-05-01T13:03:06-05</when>
+    <when>2010-05-01T13:03:10-05</when>
+    <when>2010-05-01T13:03:15-05</when>
+    <when>2010-05-01T13:03:20-05</when>
+    <when>2010-05-01T13:03:24-05</when>
+    <when>2010-05-01T13:03:29-05</when>
+    <when>2010-05-01T13:03:33-05</when>
+    <when>2010-05-01T13:03:38-05</when>
+    <when>2010-05-01T13:03:43-05</when>
+    <when>2010-05-01T13:03:47-05</when>
+    <when>2010-05-01T13:03:52-05</when>
+    <when>2010-05-01T13:03:57-05</when>
+    <when>2010-05-01T13:04:01-05</when>
+    <when>2010-05-01T13:04:06-05</when>
+    <when>2010-05-01T13:04:11-05</when>
+    <when>2010-05-01T13:04:15-05</when>
+    <when>2010-05-01T13:04:20-05</when>
+    <when>2010-05-01T13:04:24-05</when>
+    <when>2010-05-01T13:04:29-05</when>
+    <when>2010-05-01T13:04:34-05</when>
+    <when>2010-05-01T13:04:38-05</when>
+    <when>2010-05-01T13:04:43-05</when>
+    <when>2010-05-01T13:04:48-05</when>
+    <when>2010-05-01T13:04:52-05</when>
+    <when>2010-05-01T13:04:57-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-93.5287325331323 45.3502794027397 731</gx:coord>
+    <gx:coord>-93.5305174337715 45.3463816209029 731</gx:coord>
+    <gx:coord>-93.532323089283 45.3433065196778 731</gx:coord>
+    <gx:coord>-93.5344374505075 45.3397938806867 731</gx:coord>
+    <gx:coord>-93.5365879669744 45.3355152994798 731</gx:coord>
+    <gx:coord>-93.538455345577 45.3317693717468 731</gx:coord>
+    <gx:coord>-93.5402440337749 45.3288175816964 731</gx:coord>
+    <gx:coord>-93.5420054353005 45.3261482119682 701</gx:coord>
+    <gx:coord>-93.5437972875724 45.3236486426325 701</gx:coord>
+    <gx:coord>-93.5449025453586 45.3213557809437 670</gx:coord>
+    <gx:coord>-93.5460939368394 45.3190373998605 670</gx:coord>
+    <gx:coord>-93.5479457332637 45.3165177805485 670</gx:coord>
+    <gx:coord>-93.5493974388824 45.3141793458801 670</gx:coord>
+    <gx:coord>-93.5513867211372 45.311763387862 640</gx:coord>
+    <gx:coord>-93.5535208279901 45.3092989037314 640</gx:coord>
+    <gx:coord>-93.5553972702218 45.3069522366272 609</gx:coord>
+    <gx:coord>-93.5571429777693 45.3046054644141 609</gx:coord>
+    <gx:coord>-93.5579199353617 45.3025960765579 640</gx:coord>
+    <gx:coord>-93.5593045947048 45.3003990165413 640</gx:coord>
+    <gx:coord>-93.5616831509882 45.2976828740205 640</gx:coord>
+    <gx:coord>-93.5637771433208 45.2950299257309 640</gx:coord>
+    <gx:coord>-93.5655282859852 45.2925928168771 640</gx:coord>
+    <gx:coord>-93.5670151031996 45.2901828629185 640</gx:coord>
+    <gx:coord>-93.5687097888584 45.2875722909995 609</gx:coord>
+    <gx:coord>-93.5700169391262 45.2851834796592 670</gx:coord>
+    <gx:coord>-93.5710302700083 45.2828077246619 640</gx:coord>
+    <gx:coord>-93.5718507391893 45.2803449539575 670</gx:coord>
+    <gx:coord>-93.5725921190677 45.2778546051997 670</gx:coord>
+    <gx:coord>-93.5735869984384 45.2752499819516 670</gx:coord>
+    <gx:coord>-93.5746474214783 45.2726078789038 670</gx:coord>
+    <gx:coord>-93.5759690717845 45.2698099999195 670</gx:coord>
+    <gx:coord>-93.5773880658931 45.2669964536541 701</gx:coord>
+    <gx:coord>-93.5786320195651 45.2643944197042 701</gx:coord>
+    <gx:coord>-93.5801045228797 45.2617721181735 731</gx:coord>
+    <gx:coord>-93.5812823080336 45.2592837181772 762</gx:coord>
+    <gx:coord>-93.5824999029929 45.2568982323771 792</gx:coord>
+    <gx:coord>-93.584184493492 45.2545288880291 792</gx:coord>
+    <gx:coord>-93.5856799945281 45.2523235684068 792</gx:coord>
+    <gx:coord>-93.5867865417154 45.2502484182149 792</gx:coord>
+    <gx:coord>-93.5877350378085 45.2481996073608 792</gx:coord>
+    <gx:coord>-93.5890621470214 45.2458286959404 762</gx:coord>
+    <gx:coord>-93.5904952245442 45.2433496248092 762</gx:coord>
+    <gx:coord>-93.5917459859832 45.2410175205115 762</gx:coord>
+    <gx:coord>-93.592940308901 45.2387518649986 792</gx:coord>
+    <gx:coord>-93.5943516581034 45.2363760400415 792</gx:coord>
+    <gx:coord>-93.595835737429 45.2339795097202 792</gx:coord>
+    <gx:coord>-93.5970428000944 45.2316738651172 792</gx:coord>
+    <gx:coord>-93.598068247895 45.2293303072495 792</gx:coord>
+    <gx:coord>-93.5992987604295 45.2268750160339 762</gx:coord>
+    <gx:coord>-93.6008769052334 45.2242985661919 762</gx:coord>
+    <gx:coord>-93.6025298777898 45.2216628823159 762</gx:coord>
+    <gx:coord>-93.6039679259902 45.2191586079975 762</gx:coord>
+    <gx:coord>-93.6055530853699 45.2165615203343 762</gx:coord>
+    <gx:coord>-93.6071850685486 45.213948758836 792</gx:coord>
+    <gx:coord>-93.6085800541819 45.2114666338841 792</gx:coord>
+    <gx:coord>-93.6099900017953 45.2087907684969 762</gx:coord>
+    <gx:coord>-93.6111813373289 45.2058856405005 762</gx:coord>
+    <gx:coord>-93.6116978316508 45.2030015871681 762</gx:coord>
+    <gx:coord>-93.6118935129054 45.2001474423799 762</gx:coord>
+    <gx:coord>-93.6120686576365 45.1971548169968 731</gx:coord>
+    <gx:coord>-93.6120488607103 45.1942250308012 731</gx:coord>
+    <gx:coord>-93.6121619193052 45.1911822627783 731</gx:coord>
+    <gx:coord>-93.6123153707665 45.188122812492 731</gx:coord>
+    <gx:coord>-93.6121210225109 45.1864342009565 731</gx:coord>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>210 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>190 0 0</gx:angles>
+    <gx:angles>190 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>190 0 0</gx:angles>
+    <gx:angles>190 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <speed>202</speed>
+    <speed>180</speed>
+    <speed>166</speed>
+    <speed>171</speed>
+    <speed>162</speed>
+    <speed>157</speed>
+    <speed>143</speed>
+    <speed>145</speed>
+    <speed>156</speed>
+    <speed>144</speed>
+    <speed>142</speed>
+    <speed>149</speed>
+    <speed>146</speed>
+    <speed>148</speed>
+    <speed>140</speed>
+    <speed>139</speed>
+    <speed>142</speed>
+    <speed>137</speed>
+    <speed>143</speed>
+    <speed>149</speed>
+    <speed>151</speed>
+    <speed>152</speed>
+    <speed>151</speed>
+    <speed>147</speed>
+    <speed>140</speed>
+    <speed>141</speed>
+    <speed>140</speed>
+    <speed>149</speed>
+    <speed>148</speed>
+    <speed>150</speed>
+    <speed>158</speed>
+    <speed>152</speed>
+    <speed>150</speed>
+    <speed>147</speed>
+    <speed>142</speed>
+    <speed>138</speed>
+    <speed>131</speed>
+    <speed>131</speed>
+    <speed>132</speed>
+    <speed>130</speed>
+    <speed>130</speed>
+    <speed>138</speed>
+    <speed>138</speed>
+    <speed>137</speed>
+    <speed>140</speed>
+    <speed>136</speed>
+    <speed>139</speed>
+    <speed>142</speed>
+    <speed>143</speed>
+    <speed>146</speed>
+    <speed>150</speed>
+    <speed>151</speed>
+    <speed>157</speed>
+    <speed>152</speed>
+    <speed>154</speed>
+    <speed>160</speed>
+    <speed>155</speed>
+    <speed>157</speed>
+    <speed>159</speed>
+    <speed>160</speed>
+    <speed>159</speed>
+    <speed>155</speed>
+    <speed>157</speed>
+    <speed>161</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>B752</name>
+  <adflag>A</adflag>
+  <flightid>DAL2731</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:04:40-05</when>
+    <when>2010-05-01T13:04:44-05</when>
+    <when>2010-05-01T13:04:49-05</when>
+    <when>2010-05-01T13:04:53-05</when>
+    <when>2010-05-01T13:04:58-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-92.3671504733075 45.0392472395977 2743</gx:coord>
+    <gx:coord>-92.3742258682339 45.0377289236059 2712</gx:coord>
+    <gx:coord>-92.3813215867021 45.0364293844267 2682</gx:coord>
+    <gx:coord>-92.3883643499875 45.0352118386382 2651</gx:coord>
+    <gx:coord>-92.3954606917206 45.0343296776778 2621</gx:coord>
+    <gx:coord>-92.3983011205325 45.0338926726637 2608.6</gx:coord>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <speed>301</speed>
+    <speed>289</speed>
+    <speed>283</speed>
+    <speed>283</speed>
+    <speed>272</speed>
+    <speed>276</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>CRJ2</name>
+  <adflag>A</adflag>
+  <flightid>SKW4805</flightid>
+  <styleUrl>#arrival</styleUrl>
+</Placemark>
+<Placemark>
+  <name>CRJ2</name>
+  <adflag>A</adflag>
+  <flightid>FLG4092</flightid>
+  <styleUrl>#arrival</styleUrl>
+</Placemark>
+<Placemark>
+  <name>E170</name>
+  <adflag>A</adflag>
+  <flightid>CPZ5667</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:01-05</when>
+    <when>2010-05-01T13:00:06-05</when>
+    <when>2010-05-01T13:00:10-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:47-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:01-05</when>
+    <when>2010-05-01T13:01:06-05</when>
+    <when>2010-05-01T13:01:11-05</when>
+    <when>2010-05-01T13:01:15-05</when>
+    <when>2010-05-01T13:01:20-05</when>
+    <when>2010-05-01T13:01:24-05</when>
+    <when>2010-05-01T13:01:29-05</when>
+    <when>2010-05-01T13:01:34-05</when>
+    <when>2010-05-01T13:01:38-05</when>
+    <when>2010-05-01T13:01:43-05</when>
+    <when>2010-05-01T13:01:48-05</when>
+    <when>2010-05-01T13:01:52-05</when>
+    <when>2010-05-01T13:01:57-05</when>
+    <when>2010-05-01T13:02:02-05</when>
+    <when>2010-05-01T13:02:06-05</when>
+    <when>2010-05-01T13:02:11-05</when>
+    <when>2010-05-01T13:02:15-05</when>
+    <when>2010-05-01T13:02:20-05</when>
+    <when>2010-05-01T13:02:25-05</when>
+    <when>2010-05-01T13:02:29-05</when>
+    <when>2010-05-01T13:02:34-05</when>
+    <when>2010-05-01T13:02:39-05</when>
+    <when>2010-05-01T13:02:43-05</when>
+    <when>2010-05-01T13:02:48-05</when>
+    <when>2010-05-01T13:02:53-05</when>
+    <when>2010-05-01T13:02:57-05</when>
+    <when>2010-05-01T13:03:02-05</when>
+    <when>2010-05-01T13:03:06-05</when>
+    <when>2010-05-01T13:03:11-05</when>
+    <when>2010-05-01T13:03:16-05</when>
+    <when>2010-05-01T13:03:20-05</when>
+    <when>2010-05-01T13:03:25-05</when>
+    <when>2010-05-01T13:03:30-05</when>
+    <when>2010-05-01T13:03:34-05</when>
+    <when>2010-05-01T13:03:39-05</when>
+    <when>2010-05-01T13:03:44-05</when>
+    <when>2010-05-01T13:03:48-05</when>
+    <when>2010-05-01T13:03:53-05</when>
+    <when>2010-05-01T13:03:57-05</when>
+    <when>2010-05-01T13:04:02-05</when>
+    <when>2010-05-01T13:04:07-05</when>
+    <when>2010-05-01T13:04:11-05</when>
+    <when>2010-05-01T13:04:16-05</when>
+    <when>2010-05-01T13:04:21-05</when>
+    <when>2010-05-01T13:04:25-05</when>
+    <when>2010-05-01T13:04:30-05</when>
+    <when>2010-05-01T13:04:35-05</when>
+    <when>2010-05-01T13:04:39-05</when>
+    <when>2010-05-01T13:04:44-05</when>
+    <when>2010-05-01T13:04:49-05</when>
+    <when>2010-05-01T13:04:53-05</when>
+    <when>2010-05-01T13:04:58-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-92.9496238812799 45.0117549407746 1438.2</gx:coord>
+    <gx:coord>-92.9507065768732 45.0116702587604 1432</gx:coord>
+    <gx:coord>-92.9563739191926 45.0116271226204 1432</gx:coord>
+    <gx:coord>-92.9620225732021 45.0115639668496 1432</gx:coord>
+    <gx:coord>-92.9673675587699 45.0113432900049 1402</gx:coord>
+    <gx:coord>-92.9725115032188 45.0111442254373 1402</gx:coord>
+    <gx:coord>-92.9778810091229 45.0112050922639 1371</gx:coord>
+    <gx:coord>-92.9832227114571 45.0112143826731 1371</gx:coord>
+    <gx:coord>-92.9884546803523 45.0110418166788 1341</gx:coord>
+    <gx:coord>-92.9938268606229 45.0109652220709 1341</gx:coord>
+    <gx:coord>-92.9991151069756 45.010802144845 1310</gx:coord>
+    <gx:coord>-93.0041467584036 45.0105516668541 1310</gx:coord>
+    <gx:coord>-93.0090742909164 45.0105233046799 1280</gx:coord>
+    <gx:coord>-93.0139435770527 45.0106265340001 1280</gx:coord>
+    <gx:coord>-93.0186698179379 45.010634924101 1249</gx:coord>
+    <gx:coord>-93.0233769482656 45.0105798571028 1219</gx:coord>
+    <gx:coord>-93.027863445495 45.0103319372353 1219</gx:coord>
+    <gx:coord>-93.0321355024912 45.009785470284 1188</gx:coord>
+    <gx:coord>-93.0364774006258 45.0090804055343 1188</gx:coord>
+    <gx:coord>-93.0406972054631 45.008159893417 1158</gx:coord>
+    <gx:coord>-93.044688438093 45.0070424610069 1158</gx:coord>
+    <gx:coord>-93.048236193366 45.0055626328365 1127</gx:coord>
+    <gx:coord>-93.0515060655523 45.0038918034748 1097</gx:coord>
+    <gx:coord>-93.0547412568513 45.002203639943 1097</gx:coord>
+    <gx:coord>-93.057960971331 45.0002785469345 1066</gx:coord>
+    <gx:coord>-93.061163597597 44.9982000732934 1036</gx:coord>
+    <gx:coord>-93.0642340616386 44.9961004469539 1036</gx:coord>
+    <gx:coord>-93.0673288162316 44.9939827866134 1036</gx:coord>
+    <gx:coord>-93.0705257535347 44.9919340234479 1006</gx:coord>
+    <gx:coord>-93.0737651809484 44.9898497469776 1006</gx:coord>
+    <gx:coord>-93.0766698334355 44.9874752633062 975</gx:coord>
+    <gx:coord>-93.0795448300029 44.9851003293423 945</gx:coord>
+    <gx:coord>-93.0826513591394 44.982853369523 914</gx:coord>
+    <gx:coord>-93.0857494236443 44.9806128435883 914</gx:coord>
+    <gx:coord>-93.0889594989987 44.9783354445401 884</gx:coord>
+    <gx:coord>-93.0921516080765 44.9761326356492 853</gx:coord>
+    <gx:coord>-93.0951593343498 44.9739412329465 823</gx:coord>
+    <gx:coord>-93.098173526634 44.9718087345519 792</gx:coord>
+    <gx:coord>-93.1011828507638 44.9697896030084 792</gx:coord>
+    <gx:coord>-93.1041138105741 44.9676784537011 762</gx:coord>
+    <gx:coord>-93.1070716804749 44.9654796588945 762</gx:coord>
+    <gx:coord>-93.1101959375488 44.9632479940121 731</gx:coord>
+    <gx:coord>-93.1134259541861 44.9611142324701 731</gx:coord>
+    <gx:coord>-93.1164777263599 44.9590021654861 701</gx:coord>
+    <gx:coord>-93.119453084479 44.9567137200248 701</gx:coord>
+    <gx:coord>-93.1225749783361 44.9543749518252 670</gx:coord>
+    <gx:coord>-93.1257330391052 44.9521434289046 640</gx:coord>
+    <gx:coord>-93.1288583838247 44.9499086265813 640</gx:coord>
+    <gx:coord>-93.1320823896043 44.947732382611 609</gx:coord>
+    <gx:coord>-93.1352777130563 44.9456935460161 609</gx:coord>
+    <gx:coord>-93.1382372228923 44.9435026223594 579</gx:coord>
+    <gx:coord>-93.1412308158626 44.9413228585563 548</gx:coord>
+    <gx:coord>-93.1440834422772 44.9393578781327 548</gx:coord>
+    <gx:coord>-93.1468380987104 44.937418270883 548</gx:coord>
+    <gx:coord>-93.1496706928566 44.9354098449433 548</gx:coord>
+    <gx:coord>-93.1524193130388 44.9334175710809 548</gx:coord>
+    <gx:coord>-93.1552204975698 44.931467153437 548</gx:coord>
+    <gx:coord>-93.1580221467789 44.9294054329873 548</gx:coord>
+    <gx:coord>-93.1608324983225 44.9273103160518 548</gx:coord>
+    <gx:coord>-93.163576735833 44.9252792086421 518</gx:coord>
+    <gx:coord>-93.1662777029414 44.923281165701 518</gx:coord>
+    <gx:coord>-93.1691629183162 44.9213004519466 518</gx:coord>
+    <gx:coord>-93.1721326207182 44.9193080290794 487</gx:coord>
+    <gx:coord>-93.1750564756636 44.9172689130085 487</gx:coord>
+    <gx:coord>-93.1778338144972 44.915261757476 457</gx:coord>
+    <gx:coord>-93.1805696776089 44.9132626732327 457</gx:coord>
+    <gx:coord>-93.1819903937475 44.9122233325116 441.5</gx:coord>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>240 0 0</gx:angles>
+    <gx:angles>240 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <speed>214</speed>
+    <speed>207</speed>
+    <speed>202</speed>
+    <speed>208</speed>
+    <speed>207</speed>
+    <speed>205</speed>
+    <speed>203</speed>
+    <speed>202</speed>
+    <speed>209</speed>
+    <speed>199</speed>
+    <speed>196</speed>
+    <speed>200</speed>
+    <speed>188</speed>
+    <speed>183</speed>
+    <speed>178</speed>
+    <speed>175</speed>
+    <speed>179</speed>
+    <speed>170</speed>
+    <speed>166</speed>
+    <speed>169</speed>
+    <speed>161</speed>
+    <speed>160</speed>
+    <speed>159</speed>
+    <speed>159</speed>
+    <speed>160</speed>
+    <speed>162</speed>
+    <speed>164</speed>
+    <speed>172</speed>
+    <speed>166</speed>
+    <speed>167</speed>
+    <speed>174</speed>
+    <speed>169</speed>
+    <speed>170</speed>
+    <speed>169</speed>
+    <speed>168</speed>
+    <speed>166</speed>
+    <speed>165</speed>
+    <speed>163</speed>
+    <speed>169</speed>
+    <speed>164</speed>
+    <speed>164</speed>
+    <speed>172</speed>
+    <speed>168</speed>
+    <speed>169</speed>
+    <speed>169</speed>
+    <speed>169</speed>
+    <speed>169</speed>
+    <speed>168</speed>
+    <speed>167</speed>
+    <speed>170</speed>
+    <speed>160</speed>
+    <speed>158</speed>
+    <speed>161</speed>
+    <speed>153</speed>
+    <speed>151</speed>
+    <speed>152</speed>
+    <speed>153</speed>
+    <speed>152</speed>
+    <speed>153</speed>
+    <speed>154</speed>
+    <speed>154</speed>
+    <speed>153</speed>
+    <speed>153</speed>
+    <speed>160</speed>
+    <speed>156</speed>
+    <speed>160</speed>
+    <speed>164</speed>
+</gx:Track></Placemark>
+</Folder>
+<Folder>
+  <name>Departures</name>
+<Placemark>
+  <name>TEX2</name>
+  <adflag>D</adflag>
+  <flightid>HOOK67</flightid>
+  <styleUrl>#departure</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:02:46-05</when>
+    <when>2010-05-01T13:02:50-05</when>
+    <when>2010-05-01T13:02:54-05</when>
+    <when>2010-05-01T13:02:59-05</when>
+    <when>2010-05-01T13:03:04-05</when>
+    <when>2010-05-01T13:03:08-05</when>
+    <when>2010-05-01T13:03:13-05</when>
+    <when>2010-05-01T13:03:18-05</when>
+    <when>2010-05-01T13:03:22-05</when>
+    <when>2010-05-01T13:03:27-05</when>
+    <when>2010-05-01T13:03:31-05</when>
+    <when>2010-05-01T13:03:36-05</when>
+    <when>2010-05-01T13:03:41-05</when>
+    <when>2010-05-01T13:03:45-05</when>
+    <when>2010-05-01T13:03:50-05</when>
+    <when>2010-05-01T13:03:55-05</when>
+    <when>2010-05-01T13:03:59-05</when>
+    <when>2010-05-01T13:04:04-05</when>
+    <when>2010-05-01T13:04:09-05</when>
+    <when>2010-05-01T13:04:13-05</when>
+    <when>2010-05-01T13:04:18-05</when>
+    <when>2010-05-01T13:04:23-05</when>
+    <when>2010-05-01T13:04:28-05</when>
+    <when>2010-05-01T13:04:32-05</when>
+    <when>2010-05-01T13:04:37-05</when>
+    <when>2010-05-01T13:04:42-05</when>
+    <when>2010-05-01T13:04:46-05</when>
+    <when>2010-05-01T13:04:51-05</when>
+    <when>2010-05-01T13:04:56-05</when>
+    <when>2010-05-01T13:05:00-05</when>
+    <gx:coord>-93.2379571205595 44.872806349747 365</gx:coord>
+    <gx:coord>-93.2370660925484 44.870006118743 396</gx:coord>
+    <gx:coord>-93.236355767523 44.8669752777211 426</gx:coord>
+    <gx:coord>-93.2354887209031 44.863712193489 487</gx:coord>
+    <gx:coord>-93.2347087148419 44.8604536579846 548</gx:coord>
+    <gx:coord>-93.2338531241111 44.8572464977323 609</gx:coord>
+    <gx:coord>-93.2329069833652 44.8540674818656 670</gx:coord>
+    <gx:coord>-93.2321075679892 44.8508271074111 731</gx:coord>
+    <gx:coord>-93.2318979317232 44.8475791496379 792</gx:coord>
+    <gx:coord>-93.2324245825346 44.8444239832126 884</gx:coord>
+    <gx:coord>-93.2337414411031 44.8414077607553 945</gx:coord>
+    <gx:coord>-93.2358704572033 44.8386783246771 1006</gx:coord>
+    <gx:coord>-93.2388663703645 44.836365445841 1066</gx:coord>
+    <gx:coord>-93.2426861295915 44.8345537010783 1127</gx:coord>
+    <gx:coord>-93.2472528925157 44.8333824186694 1158</gx:coord>
+    <gx:coord>-93.252467378877 44.8329692039001 1188</gx:coord>
+    <gx:coord>-93.25805239674 44.8333893976675 1219</gx:coord>
+    <gx:coord>-93.2638450577518 44.8346083411457 1219</gx:coord>
+    <gx:coord>-93.2696754993405 44.83650914188 1219</gx:coord>
+    <gx:coord>-93.2753673121587 44.8390951418887 1219</gx:coord>
+    <gx:coord>-93.2808543977574 44.8421681587795 1219</gx:coord>
+    <gx:coord>-93.2861853262416 44.8454128516506 1249</gx:coord>
+    <gx:coord>-93.29145969331 44.8487370983379 1219</gx:coord>
+    <gx:coord>-93.2967095159 44.8520389729185 1219</gx:coord>
+    <gx:coord>-93.3019214165294 44.8553364257712 1219</gx:coord>
+    <gx:coord>-93.3070477220233 44.8587223340278 1219</gx:coord>
+    <gx:coord>-93.3121286565238 44.8620050415952 1219</gx:coord>
+    <gx:coord>-93.3171626530446 44.8652559523285 1219</gx:coord>
+    <gx:coord>-93.3221179929219 44.868582313462 1219</gx:coord>
+    <gx:coord>-93.3270963865766 44.8718050975636 1219</gx:coord>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>180 0 0</gx:angles>
+    <gx:angles>190 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>240 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <gx:angles>310 0 0</gx:angles>
+    <speed>178</speed>
+    <speed>175</speed>
+    <speed>180</speed>
+    <speed>177</speed>
+    <speed>175</speed>
+    <speed>177</speed>
+    <speed>175</speed>
+    <speed>181</speed>
+    <speed>173</speed>
+    <speed>172</speed>
+    <speed>178</speed>
+    <speed>173</speed>
+    <speed>178</speed>
+    <speed>187</speed>
+    <speed>196</speed>
+    <speed>208</speed>
+    <speed>224</speed>
+    <speed>237</speed>
+    <speed>247</speed>
+    <speed>247</speed>
+    <speed>263</speed>
+    <speed>266</speed>
+    <speed>258</speed>
+    <speed>267</speed>
+    <speed>266</speed>
+    <speed>265</speed>
+    <speed>263</speed>
+    <speed>266</speed>
+    <speed>270</speed>
+    <speed>260</speed>
+</gx:Track></Placemark>
+</Folder>
+<Folder>
+  <name>Overflights</name>
+</Folder>
+</Document>
+</kml>
diff --git a/examples/kml/lines.kml b/examples/kml/lines.kml
new file mode 100644
index 0000000..5999aaa
--- /dev/null
+++ b/examples/kml/lines.kml
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/2.0">
+  <Document>
+    <name>KML Samples</name>
+    <open>1</open>
+    <description>Unleash your creativity with the help of these examples!</description>
+    <Style id="downArrowIcon">
+      <IconStyle>
+        <Icon>
+          <href>http://maps.google.com/mapfiles/kml/pal4/icon28.png</href>
+        </Icon>
+      </IconStyle>
+    </Style>
+    <Style id="globeIcon">
+      <IconStyle>
+        <Icon>
+          <href>http://maps.google.com/mapfiles/kml/pal3/icon19.png</href>
+        </Icon>
+      </IconStyle>
+      <LineStyle>
+        <width>2</width>
+      </LineStyle>
+    </Style>
+    <Style id="transPurpleLineGreenPoly">
+      <LineStyle>
+        <color>7fff00ff</color>
+        <width>4</width>
+      </LineStyle>
+      <PolyStyle>
+        <color>7f00ff00</color>
+      </PolyStyle>
+    </Style>
+    <Style id="yellowLineGreenPoly">
+      <LineStyle>
+        <color>7f00ffff</color>
+        <width>4</width>
+      </LineStyle>
+      <PolyStyle>
+        <color>7f00ff00</color>
+      </PolyStyle>
+    </Style>
+    <Style id="thickBlackLine">
+      <LineStyle>
+        <color>87000000</color>
+        <width>10</width>
+      </LineStyle>
+    </Style>
+    <Style id="redLineBluePoly">
+      <LineStyle>
+        <color>ff0000ff</color>
+      </LineStyle>
+      <PolyStyle>
+        <color>ffff0000</color>
+      </PolyStyle>
+    </Style>
+    <Style id="blueLineRedPoly">
+      <LineStyle>
+        <color>ffff0000</color>
+      </LineStyle>
+      <PolyStyle>
+        <color>ff0000ff</color>
+      </PolyStyle>
+    </Style>
+    <Style id="transRedPoly">
+      <LineStyle>
+        <width>1.5</width>
+      </LineStyle>
+      <PolyStyle>
+        <color>7d0000ff</color>
+      </PolyStyle>
+    </Style>
+    <Style id="transBluePoly">
+      <LineStyle>
+        <width>1.5</width>
+      </LineStyle>
+      <PolyStyle>
+        <color>7dff0000</color>
+      </PolyStyle>
+    </Style>
+    <Style id="transGreenPoly">
+      <LineStyle>
+        <width>1.5</width>
+      </LineStyle>
+      <PolyStyle>
+        <color>7d00ff00</color>
+      </PolyStyle>
+    </Style>
+    <Style id="transYellowPoly">
+      <LineStyle>
+        <width>1.5</width>
+      </LineStyle>
+      <PolyStyle>
+        <color>7d00ffff</color>
+      </PolyStyle>
+    </Style>
+    <Style id="noDrivingDirections">
+      <BalloonStyle>
+        <text><![CDATA[
+          <b>$[name]</b>
+          <br /><br />
+          $[description]
+        ]]></text>
+      </BalloonStyle>
+    </Style>
+    <Folder>
+      <name>Paths</name>
+      <visibility>0</visibility>
+      <description>Examples of paths. Note that the tessellate tag is by default
+        set to 0. If you want to create tessellated lines, they must be authored
+        (or edited) directly in KML.</description>
+      <Placemark>
+        <name>Tessellated</name>
+        <visibility>0</visibility>
+        <description><![CDATA[If the <tessellate> tag has a value of 1, the line will contour to the underlying terrain]]></description>
+        <LookAt>
+          <longitude>-112.0822680013139</longitude>
+          <latitude>36.09825589333556</latitude>
+          <altitude>0</altitude>
+          <range>2889.145007690472</range>
+          <tilt>62.04855796276328</tilt>
+          <heading>103.8120432044965</heading>
+        </LookAt>
+        <LineString>
+          <tessellate>1</tessellate>
+          <coordinates> -112.0814237830345,36.10677870477137,0
+            -112.0870267752693,36.0905099328766,0 </coordinates>
+        </LineString>
+      </Placemark>
+      <Placemark>
+        <name>Untessellated</name>
+        <visibility>0</visibility>
+        <description><![CDATA[If the <tessellate> tag has a value of 0, the line follow a simple straight-line path from point to point]]></description>
+        <LookAt>
+          <longitude>-112.0822680013139</longitude>
+          <latitude>36.09825589333556</latitude>
+          <altitude>0</altitude>
+          <range>2889.145007690472</range>
+          <tilt>62.04855796276328</tilt>
+          <heading>103.8120432044965</heading>
+        </LookAt>
+        <LineString>
+          <tessellate>0</tessellate>
+          <coordinates> -112.080622229595,36.10673460007995,0
+            -112.085242575315,36.09049598612422,0 </coordinates>
+        </LineString>
+      </Placemark>
+      <Placemark>
+        <name>Absolute</name>
+        <visibility>0</visibility>
+        <description>Transparent purple line</description>
+        <LookAt>
+          <longitude>-112.2719329043177</longitude>
+          <latitude>36.08890633450894</latitude>
+          <altitude>0</altitude>
+          <range>2569.386744398339</range>
+          <tilt>44.60763714063257</tilt>
+          <heading>-106.8161545998597</heading>
+        </LookAt>
+        <styleUrl>#transPurpleLineGreenPoly</styleUrl>
+        <LineString>
+          <tessellate>1</tessellate>
+          <altitudeMode>absolute</altitudeMode>
+          <coordinates> -112.265654928602,36.09447672602546,2357
+            -112.2660384528238,36.09342608838671,2357
+            -112.2668139013453,36.09251058776881,2357
+            -112.2677826834445,36.09189827357996,2357
+            -112.2688557510952,36.0913137941187,2357
+            -112.2694810717219,36.0903677207521,2357
+            -112.2695268555611,36.08932171487285,2357
+            -112.2690144567276,36.08850916060472,2357
+            -112.2681528815339,36.08753813597956,2357
+            -112.2670588176031,36.08682685262568,2357
+            -112.2657374587321,36.08646312301303,2357 </coordinates>
+        </LineString>
+      </Placemark>
+      <Placemark>
+        <name>Absolute Extruded</name>
+        <visibility>0</visibility>
+        <description>Transparent green wall with yellow outlines</description>
+        <LookAt>
+          <longitude>-112.2643334742529</longitude>
+          <latitude>36.08563154742419</latitude>
+          <altitude>0</altitude>
+          <range>4451.842204068102</range>
+          <tilt>44.61038665812578</tilt>
+          <heading>-125.7518698668815</heading>
+        </LookAt>
+        <styleUrl>#yellowLineGreenPoly</styleUrl>
+        <LineString>
+          <extrude>1</extrude>
+          <tessellate>1</tessellate>
+          <altitudeMode>absolute</altitudeMode>
+          <coordinates> -112.2550785337791,36.07954952145647,2357
+            -112.2549277039738,36.08117083492122,2357
+            -112.2552505069063,36.08260761307279,2357
+            -112.2564540158376,36.08395660588506,2357
+            -112.2580238976449,36.08511401044813,2357
+            -112.2595218489022,36.08584355239394,2357
+            -112.2608216347552,36.08612634548589,2357
+            -112.262073428656,36.08626019085147,2357
+            -112.2633204928495,36.08621519860091,2357
+            -112.2644963846444,36.08627897945274,2357
+            -112.2656969554589,36.08649599090644,2357 </coordinates>
+        </LineString>
+      </Placemark>
+      <Placemark>
+        <name>Relative</name>
+        <visibility>0</visibility>
+        <description>Black line (10 pixels wide), height tracks terrain</description>
+        <LookAt>
+          <longitude>-112.2580438551384</longitude>
+          <latitude>36.1072674824385</latitude>
+          <altitude>0</altitude>
+          <range>2927.61105910266</range>
+          <tilt>44.61324882043339</tilt>
+          <heading>4.947421249553717</heading>
+        </LookAt>
+        <styleUrl>#thickBlackLine</styleUrl>
+        <LineString>
+          <tessellate>1</tessellate>
+          <altitudeMode>relativeToGround</altitudeMode>
+          <coordinates> -112.2532845153347,36.09886943729116,645
+            -112.2540466121145,36.09919570465255,645
+            -112.254734666947,36.09984998366178,645
+            -112.255493345654,36.10051310621746,645
+            -112.2563157098468,36.10108441943419,645
+            -112.2568033076439,36.10159722088088,645
+            -112.257494011321,36.10204323542867,645
+            -112.2584106072308,36.10229131995655,645
+            -112.2596588987972,36.10240001286358,645
+            -112.2610581199487,36.10213176873407,645
+            -112.2626285262793,36.10157011437219,645 </coordinates>
+        </LineString>
+      </Placemark>
+      <Placemark>
+        <name>Relative Extruded</name>
+        <visibility>0</visibility>
+        <description>Opaque blue walls with red outline, height tracks terrain</description>
+        <LookAt>
+          <longitude>-112.2683594333433</longitude>
+          <latitude>36.09884362144909</latitude>
+          <altitude>0</altitude>
+          <range>2184.193522571467</range>
+          <tilt>44.60855445139561</tilt>
+          <heading>-72.24271551768405</heading>
+        </LookAt>
+        <styleUrl>#redLineBluePoly</styleUrl>
+        <LineString>
+          <extrude>1</extrude>
+          <tessellate>1</tessellate>
+          <altitudeMode>relativeToGround</altitudeMode>
+          <coordinates> -112.2656634181359,36.09445214722695,630
+            -112.2652238941097,36.09520916122063,630
+            -112.2645079986395,36.09580763864907,630
+            -112.2638827428817,36.09628572284063,630
+            -112.2635746835406,36.09679275951239,630
+            -112.2635711822407,36.09740038871899,630
+            -112.2640296531825,36.09804913435539,630
+            -112.264327720538,36.09880337400301,630
+            -112.2642436562271,36.09963644790288,630
+            -112.2639148687042,36.10055381117246,630
+            -112.2626894973474,36.10149062823369,630 </coordinates>
+        </LineString>
+      </Placemark>
+		<Placemark>
+			<name>Blue Icon</name>
+			<description>Just another blue icon.</description>
+			<styleUrl>kml/styles.kml#blueIcons</styleUrl>
+			<Point>
+				<coordinates>-112.292238941097,36.09520916122063,630</coordinates>
+			</Point>
+		</Placemark>
+    </Folder>
+  </Document>
+</kml>
diff --git a/examples/kml/styles.kml b/examples/kml/styles.kml
new file mode 100644
index 0000000..24350ad
--- /dev/null
+++ b/examples/kml/styles.kml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+This file contains styles referenced by other KML files in this project.
+http://kml-samples.googlecode.com/svn/trunk/kml/Style/styles.kml
+
+-->  
+<kml xmlns="http://earth.google.com/kml/2.1">
+<Document id="globalStyles">
+
+  <Style id="blueIcons">
+    <IconStyle>
+      <color>ffff0000</color>
+      <Icon>
+        <href>http://maps.google.com/mapfiles/kml/shapes/sunny.png</href>
+      </Icon>  
+    </IconStyle>
+  </Style>
+
+</Document>
+</kml>
diff --git a/examples/kml/sundials.kml b/examples/kml/sundials.kml
new file mode 100644
index 0000000..8a68305
--- /dev/null
+++ b/examples/kml/sundials.kml
@@ -0,0 +1,2273 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/2.2">
+<Document>
+	<name>Sundial Collection.kmz</name>
+	<StyleMap id="msn_sunny_copy70">
+		<Pair>
+			<key>normal</key>
+			<styleUrl>#sn_sunny_copy69</styleUrl>
+		</Pair>
+		<Pair>
+			<key>highlight</key>
+			<styleUrl>#sh_sunny_copy70</styleUrl>
+		</Pair>
+	</StyleMap>
+	<Style id="sh_sunny_copy69">
+		<IconStyle>
+			<scale>1.4</scale>
+			<Icon>
+				<href>http://maps.google.com/mapfiles/kml/shapes/sunny.png</href>
+			</Icon>
+			<hotSpot x="0.5" y="0.5" xunits="fraction" yunits="fraction"/>
+		</IconStyle>
+		<LabelStyle>
+			<color>ff00aaff</color>
+		</LabelStyle>
+	</Style>
+	<Style id="sn_sunny_copy68">
+		<IconStyle>
+			<scale>1.2</scale>
+			<Icon>
+				<href>http://maps.google.com/mapfiles/kml/shapes/sunny.png</href>
+			</Icon>
+			<hotSpot x="0.5" y="0.5" xunits="fraction" yunits="fraction"/>
+		</IconStyle>
+		<LabelStyle>
+			<color>ff00aaff</color>
+		</LabelStyle>
+	</Style>
+	<Style id="sn_sunny_copy69">
+		<IconStyle>
+			<scale>1.2</scale>
+			<Icon>
+				<href>http://maps.google.com/mapfiles/kml/shapes/sunny.png</href>
+			</Icon>
+			<hotSpot x="0.5" y="0.5" xunits="fraction" yunits="fraction"/>
+		</IconStyle>
+		<LabelStyle>
+			<color>ff00aaff</color>
+		</LabelStyle>
+	</Style>
+	<Style id="sh_sunny_copy70">
+		<IconStyle>
+			<scale>1.4</scale>
+			<Icon>
+				<href>http://maps.google.com/mapfiles/kml/shapes/sunny.png</href>
+			</Icon>
+			<hotSpot x="0.5" y="0.5" xunits="fraction" yunits="fraction"/>
+		</IconStyle>
+		<LabelStyle>
+			<color>ff00aaff</color>
+		</LabelStyle>
+	</Style>
+	<StyleMap id="msn_sunny_copy69">
+		<Pair>
+			<key>normal</key>
+			<styleUrl>#sn_sunny_copy68</styleUrl>
+		</Pair>
+		<Pair>
+			<key>highlight</key>
+			<styleUrl>#sh_sunny_copy69</styleUrl>
+		</Pair>
+	</StyleMap>
+	<Folder>
+		<name>Sundial Collection</name>
+		<open>1</open>
+		<LookAt>
+			<longitude>-56.6884384968692</longitude>
+			<latitude>47.91963617483238</latitude>
+			<altitude>0</altitude>
+			<range>9958750.824018393</range>
+			<tilt>1.303827428939919e-015</tilt>
+			<heading>-16.31426621668193</heading>
+		</LookAt>
+		<Style>
+			<ListStyle>
+				<listItemType>check</listItemType>
+				<bgColor>00ffffff</bgColor>
+			</ListStyle>
+		</Style>
+		<Folder>
+			<name>High Resolution</name>
+			<Placemark>
+				<name>Sundial, Madestein, Den Haag</name>
+				<description><![CDATA[Horizontal sundial on the campus of the ‘Parnassia’ psychomedic centre in The Hague. The numbers on the left, 6,7 and 8, are wrong spelled.
+<p><img src="http://www.de-zonnewijzerkring.nl/imgs-arch/zw-07-05-02.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>4.213227700645635</longitude>
+					<latitude>52.04260288332888</latitude>
+					<altitude>0</altitude>
+					<range>24.63686803544318</range>
+					<tilt>0</tilt>
+					<heading>1.387289180270979e-005</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>4.213209970684247,52.04268354765237,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Den Haag - Loosduinen</name>
+				<description><![CDATA[<p>Thanks to <b>A30</b></p>
+
+A sundial made of wooden blocks.
+The highest block in the middle is the style and casts its shadow each hour on one of the other blocks.
+
+<p><img src="http://www.dse.nl/~zonnewijzer/loosduin.jpg"></p>
+Image source:<a href="http://www.dse.nl/~zonnewijzer/loosduin.jpg">www.dse.nl</a>]]></description>
+				<LookAt>
+					<longitude>4.236038669148795</longitude>
+					<latitude>52.0499434967447</latitude>
+					<altitude>0</altitude>
+					<range>18.37312193280116</range>
+					<tilt>2.202011190893535e-011</tilt>
+					<heading>-0.3988978466888938</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>4.236026636181407,52.049986562365,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial with light conductors - Paris, Les Halles</name>
+				<description><![CDATA[<p><img src="http://www.home.uni-osnabrueck.de/ahaenel/sonnuhr/paris1.jpg"></p>
+
+The sunlight falls on one of the three windows in the column (east, south, west) and over light conductors on the wall is indicated.
+
+<p><img src="http://www.home.uni-osnabrueck.de/ahaenel/sonnuhr/paris4.jpg"></p>
+
+The clock shows  16,40 o'clock.
+
+<p><img src="http://www.home.uni-osnabrueck.de/ahaenel/sonnuhr/paris5.jpg"></p>
+
+<a>Quelle:http://www.home.uni-osnabrueck.de/ahaenel/sonnuhr/paris_halles.htm</a>
+
+http://perso.orange.fr/cadrans.solaires/cadrans/cadran-halles-paris.html]]></description>
+				<LookAt>
+					<longitude>2.344185113917775</longitude>
+					<latitude>48.86294270160059</latitude>
+					<altitude>0</altitude>
+					<range>39.52787486507292</range>
+					<tilt>0</tilt>
+					<heading>-0.003533584730563007</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>2.344143312335305,48.86302323987447,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Plymouth, Devon, UK</name>
+				<description><![CDATA[<p>The gnonom is 27 foot high, the pool has 21 feet diameter.  It was designed by architect Carole Vincent from Boscastle in Cornwall and was unvieled by Her Majesty the Queen on Friday July 22nd 1988 for a cost of  cost £70,000 . The sundial runs one hour and seventeen minutes behind local clocks.</p>
+<p><img src="http://www.photoready.co.uk/people-life/images/sundial-fountain.jpg"></p>
+<p>Image source:<a href="www.photoready.co.uk</a></p>]]></description>
+				<LookAt>
+					<longitude>-4.142398271107962</longitude>
+					<latitude>50.37145390235462</latitude>
+					<altitude>0</altitude>
+					<range>63.33410419881957</range>
+					<tilt>0</tilt>
+					<heading>-0.0001034131369701296</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-4.142446411782089,50.37160252809223,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial Millennium Timespace at Gosport, UK</name>
+				<description><![CDATA[<p><img src="http://www.sundials.co.uk/pix/gosport.jpg"></p>
+Image source:<a href="http://www.sundials.co.uk/pix/gosport.jpg">www.sundials.co.uk</a>]]></description>
+				<LookAt>
+					<longitude>-1.117890647596098</longitude>
+					<latitude>50.79319978711329</latitude>
+					<altitude>0</altitude>
+					<range>79.08348690288113</range>
+					<tilt>0</tilt>
+					<heading>0.02100880488328328</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-1.117887915142518,50.79336425684474,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Britzer Garten, Berlin</name>
+				<description>See photos on this page:
+http://home.arcor.de/ruth.kirsch/sonnenuhr/berlin_1xxxx/berlin_1xxxx.htm</description>
+				<LookAt>
+					<longitude>13.42078373972489</longitude>
+					<latitude>52.4366841172644</latitude>
+					<altitude>0</altitude>
+					<range>102.2086892967038</range>
+					<tilt>0</tilt>
+					<heading>-0.004885703167479627</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>13.4207448482471,52.43682055829985,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Falkenplatz, Berlin</name>
+				<description><![CDATA[<p>The original reasoning event for the construction of the sundial was the UNO climate conference 1995 in Berlin. The base stone of the wall spiral was layed at a festivity at the equinox of March 1995. Until June 1995 the main construction was completed, and at another festivity at the summer solstice the gnonom and the totem ("Lebensbaum") was installed by Berlin fire fighters.</p>
+<p><img src="http://www.surveyor.in-berlin.de/sundials/imgs/Mauerpark-SD01.5.jpg"></p>
+<p>The nearly spiral sundial was planned as a "living sundial" and initiated by the groups of the "Netzwerk Klimagipfel 95", mainly by the journalist T. Römer with the "Verein zur Rettung des Regenwaldes und Naturschutzgebietes La Macarena", and the "Netzwerk Spiel/Kultur" at the Prenzlauer Berg. 
+
+
+The covering clay stones were made out of three metric tons of white and brown clay, formed by children of about 50 institutions like school classes and kindergardens of the closer region. The stones were burned and installed in the summer of 1995. Partly they are constructed out of different materials, partly especially formed or ornamented. Six detail images are showing some examples: (White near Red - MC?, Smiley with Heart Eyes, Sun-Moon-Star, Red Broken and Patterned, Rain pits and  [...]
+
+In September 1995 the sundial was completed. It was called "living sundial" because it was planned to replace the clay stones regulary when they are destroyed and to add some green to the outside wall of the clock. In December 1995 the clock got a special price of the local environmental administration.</p>
+<p><img src="http://www.surveyor.in-berlin.de/sundials/imgs/Mauerpark-Detail02.jpg">.<img src="http://www.surveyor.in-berlin.de/sundials/imgs/Mauerpark-Detail06.jpg"></p>
+
+
+<p>In September 1995 the sundial was completed. It was called "living sundial" because it was planned to replace the clay stones regulary when they are destroyed and to add some green to the outside wall of the clock. In December 1995 the clock got a special price of the local environmental administration.</p>
+<p><img src="http://www.surveyor.in-berlin.de/sundials/imgs/Mauerpark-SD02.5.jpg"></p>
+
+<p>This sundial was deconstructed at the end of 2002 or at the beginning of 2003:</p>
+<p><img src="http://www.surveyor.in-berlin.de/sundials/imgs/Mauerpark-SD03.5.jpg"></p>
+
+<p>Image source and infos:<a href="http://www.surveyor.in-berlin.de/sundials/Falkplatz-e.html">www.surveyor.in-berlin.de</a></p>]]></description>
+				<LookAt>
+					<longitude>13.40239121468946</longitude>
+					<latitude>52.54640622802566</latitude>
+					<altitude>0</altitude>
+					<range>55.75497205265645</range>
+					<tilt>1.489511345854323e-009</tilt>
+					<heading>2.6367660621925e-005</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>13.40233774797299,52.54645010247089,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Halde Schwerin, Castrop-Rauxel, Germany</name>
+				<description><![CDATA[<p>Thanks to <b>htd42</b></p>
+<p><img src="http://www.ruhrgebiet.de/cgi-bin/imp?freizeit/sehenswuerdigkeiten/bindata/castrop-rauxel_halde_schwerin_RVR.jpg&articleID=5824&padding=no&thumbnailtype=jpg&width=250"></p>
+
+http://www.ruhrgebiet.de/freizeit/sehenswuerdigkeiten/cr_halde_schwerin.shtml?print]]></description>
+				<LookAt>
+					<longitude>7.337404407947669</longitude>
+					<latitude>51.54597716006042</latitude>
+					<altitude>0</altitude>
+					<range>51.28632275218226</range>
+					<tilt>2.512805793870883e-009</tilt>
+					<heading>-6.529566789930303e-005</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>7.337359256982781,51.54610609965799,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Lloydminster, Canada</name>
+				<description><![CDATA[This sundial has not the longest gnomon but I think it has the biggest clock face in the world.
+
+<p><img src="http://www.mts.net/~sabanski/sundial/images/sundials%20of%20the%20world/Canada/Lloydminster/BMASP.jpg"></p>
+<p>Image source and infos:<a href="http://www.mts.net/~sabanski/sundial/sotw_canada_lloydminster.htm">www.mts.net</a></p>]]></description>
+				<LookAt>
+					<longitude>-110.0353754682919</longitude>
+					<latitude>53.26386357821667</latitude>
+					<altitude>0</altitude>
+					<range>155.9861269181855</range>
+					<tilt>0</tilt>
+					<heading>-0.01432903343453666</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-110.0355256583979,53.26413794825379,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Giant Lady's Leg Sundial, Roselawn, Indiana, USA</name>
+				<description><![CDATA[<p>The Sun Aura Nudist Resort opened in 1933. Back then it was called Club Zoro and its founder was Alois Knapp, a Chicago lawyer, German Nacktkulturist, editor of Sunshine and Health magazine, and "the father of nudism in America." </p>
+
+<p><img src="http://www.roadsideamerica.com/attract/images/in/INLAKsundialleg4_0716.jpg"></p>
+
+<p>The club eventually passed into the hands of Dale and Mary Drost. Their son, Dick, had big ideas: he renamed the place Naked City, made it the home of the Ms. Nude Teeny Bopper Contest and the "Erin Go Bra-less" Dance on St. Patrick's Day, and had built the giant lady's leg sundial, 63 feet long and properly positioned to tell time -- a useful feature for wristwatchless nudists. </p>
+
+<p>Naked City closed in 1986 when Dick was run out of Indiana on child molestation charges, but the leg remains and so does the resort, now under new management. The circular main building with the mirror gold windows is a combination office-sauna-restaurant. </p>
+
+<p>The guy who paints the leg told us that Sun Aura is a "clothing optional" camp -- in other words, you don't have to get nude to take a picture of the big lady's leg. But for those who do choose to get into the spirit of things, a helpful sign on the exit road reads, "Stop. You Must Be Dressed Beyond This Point."</p>
+
+<p><a href="http://www.roadsideamerica.com/sights/sightstory.php?tip_AttrId=%3D11825">Roadside America</a></p>]]></description>
+				<LookAt>
+					<longitude>-87.32599841452155</longitude>
+					<latitude>41.14248697221019</latitude>
+					<altitude>0</altitude>
+					<range>40.06529731982877</range>
+					<tilt>0</tilt>
+					<heading>-108.7495178792767</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-87.32608203713804,41.14242622349031,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Ingleside, San Francisco, USA</name>
+				<description><![CDATA[<p>Thanks to <b>CostaPacific</b></p>
+
+Most people in San Francsco have no idea that their city is host to the world's second largest sundial. It was built in 1913 as a gimic to attract people to a new housing development that was built arround the configuration of the old Ingleside Race Track.
+
+<p><img src="http://p.vtourist.com/2174717-Architecture-San_Francisco.jpg"></p>
+<p>Image source:<a href="www.virtualtourist.com"></a>]]></description>
+				<LookAt>
+					<longitude>-122.4687521474299</longitude>
+					<latitude>37.72475779376939</latitude>
+					<altitude>0</altitude>
+					<range>104.1096478961583</range>
+					<tilt>0</tilt>
+					<heading>-6.694029629862418e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-122.4687727980979,37.72497790751523,59.97947112427937</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial Bridge</name>
+				<description>Located in Redding, CA.  Opened in 2004 this bridge actually acts as a sundial.  The time can be read in a garden on the North side of the bridge.
+
+http://www.turtlebay.org/sundial/sundial.shtml</description>
+				<LookAt>
+					<longitude>-122.3775376532067</longitude>
+					<latitude>40.59329504591046</latitude>
+					<altitude>0</altitude>
+					<range>160.1654912126178</range>
+					<tilt>7.884938307004504e-010</tilt>
+					<heading>0.008470312235033726</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-122.3777030796087,40.59376952663914,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Jaipur,India</name>
+				<description><![CDATA[Thanks to <b>Villaman</b>
+
+<p align="center"><table width=400><tr><td><b><br>Jaipur Observatory Sundial</b><br><br>
+</td>
+</tr>
+<tr>
+<td>
+<p align="justify"> Walk through these doors and up the stairs to begin your journey along a line from Jaipur, India toward the North Celestial Pole. Such cosmic alignments abound in marvelous Indian observatories where the architecture itself allows astronomical measurements. The structures were built in Jaipur and other cities in the eighteenth century by the Maharaja Jai Singh II (1686-1743). Rising about 90 feet high, this stairway actually forms a shadow caster or gnomon, part of wh [...]
+<p align="justify"><center><b>Jaipur Observatory Sundial<br><img src="http://apod.nasa.gov/apod/image/0312/02mantar_feresten.jpg" width=300></b></center></p>
+<p align="justify">More <a href="http://apod.nasa.gov/apod/ap031206.html">here.</a>
+
+</td>
+</tr>
+</table>
+<font color="white">]]></description>
+				<LookAt>
+					<longitude>75.82482649881683</longitude>
+					<latitude>26.924766672173</latitude>
+					<altitude>0</altitude>
+					<range>164.397137416247</range>
+					<tilt>0</tilt>
+					<heading>-0.02454798212483729</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>75.82474437483685,26.92504292845888,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Schothorstpark, Amersfoort, Netherlands</name>
+				<description><![CDATA[<p>A large sundial in the Schothorstpark in Amersfoort.
+Thanks to <b>Acadvice</b>]]></description>
+				<LookAt>
+					<longitude>5.385083481782106</longitude>
+					<latitude>52.17868238866643</latitude>
+					<altitude>0</altitude>
+					<range>49.70911801163624</range>
+					<tilt>5.249316070079438e-010</tilt>
+					<heading>6.699999294207586e-006</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>5.385063337537176,52.17873082332495,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Jardin de Reuilly, Paris</name>
+				<description><![CDATA[A huge horizontal sundial in Paris.
+<p><img src="http://perso.orange.fr/cadrans.solaires/cadrans/images/reuilly1-500.jpg" width="400"  hight="250"></p>
+
+<p><img src="http://perso.orange.fr/cadrans.solaires/cadrans/images/reuilly2-500.jpg" width="360"  hight="250"></p>
+Image source:<a href="http://perso.orange.fr/cadrans.solaires/cadrans/originaux-paris.html">http://perso.orange.fr</a></p>]]></description>
+				<LookAt>
+					<longitude>2.387204592843604</longitude>
+					<latitude>48.84242901629369</latitude>
+					<altitude>0</altitude>
+					<range>50.11592463998582</range>
+					<tilt>8.113900329668256e-010</tilt>
+					<heading>-0.001210217218456717</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>2.38716774037826,48.84252766103683,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Stockgrove, Soulbury, Buckinghamshire, UK</name>
+				<description><![CDATA[<p>thanks to <b>houdinia</b></p>
+Sundial with analemmatic clock face.
+<p><img src="http://www.greensandtrust.org/images/newImages/stockStrip1.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-0.666503881371199</longitude>
+					<latitude>51.95548351688392</latitude>
+					<altitude>0</altitude>
+					<range>55.27920580004575</range>
+					<tilt>6.264058771241075e-010</tilt>
+					<heading>0.06911766261471311</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-0.6665014664411046,51.95551857959676,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Halde Hoheward, Germany</name>
+				<description><![CDATA[<p>The Obelisk – The Sundial</p>
+
+<p>The seeming movement of the sun in the sky, resulting in the discrimination between day and night, was one of the earliest observations of nature performed by men. It enables us to experience the phenomenon “time” with our own senses. The first examples for telling the time with the help of the sun or its shadow date back to the Ancient World. The are numerous archetypes for sundials built inmany different styles, using different techniques.</p>
+
+<p>The archetype for the horizontal sundial on top of the slagheap Hoheward is the sundial of the Roman Emperor Augustus on the Campus Martius in Rome.</p>
+(It is unknown, whether this ancient obelisk was part of a complete sun dial with hour and declination lines on the morning and afternoon side or whether only a meridian line existed to measure the elevation of the sun in upper culmination. The today's scientific knowledge indicates the existence of a meridian.) The observation of the Obelisk's shadow on the sundial enables the observer to easily determine date and time. Apart from “time” one can also experience the laws of celestial mec [...]
+
+<p>Representing the first step in the realisation of the Astronomical Theme Park the Obelisk was opened on May 17th, 2005. It is located on the already completed south-eastern plateau of the slagheap at a height of 140 m above sea level. The shadowed area is 62 m in diameter.</p>
+
+
+
+<p><img src="http://www.horizontastronomie.de/bilder/ansicht-obelisk2.jpg"></p>
+This picture shows the Obelisk after the end of the assembly on the day of the opening. Shortly before it was put on top of the readily prepared pedestal by a helicopter and then bolted. 
+
+<p><img src="http://www.horizontastronomie.de/bilder/o2.jpg" width="300" hight="360"></p>
+
+<p><a href="http://www.horizontastronomie.de/eindex.htm">http://www.horizontastronomie.de</a></p>
+
+
+
+<p>http://de.wikipedia.org/wiki/Halde_Hoheward#Sonnenuhr_mit_Obelisk</p>
+
+<p>http://www.horizontastronomie.de/animationen.htm</p>]]></description>
+				<LookAt>
+					<longitude>7.170033145228383</longitude>
+					<latitude>51.56646738931531</latitude>
+					<altitude>0</altitude>
+					<range>96.7791497847863</range>
+					<tilt>4.155528307086707e-010</tilt>
+					<heading>0.006376147752644328</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>7.169892708740022,51.56683509795316,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Fachhochschule (FH) Bielefeld</name>
+				<description><![CDATA[A sundial with analemmatic layout. 
+<p><img src="http://www.fh-bielefeld.de/ezimagecatalogue/catalogue/variations/4651-400x500.jpg"></p>
+http://www.fh-bielefeld.de/article/fh/4412/1/505?NavItemID=0&NavCatID=162]]></description>
+				<LookAt>
+					<longitude>8.555263115842216</longitude>
+					<latitude>52.02672953436973</latitude>
+					<altitude>0</altitude>
+					<range>50.10364671714684</range>
+					<tilt>0</tilt>
+					<heading>0.001255164290936946</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>8.555215193531964,52.02681111856448,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Sun City, Arizona</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/008_az_suncity.jpg"></p>
+
+<p><img src="http://www.sundials.org/registry/regphotos/008_az_suncity_2.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-112.2739996808105</longitude>
+					<latitude>33.61902729376313</latitude>
+					<altitude>0</altitude>
+					<range>44.66059102278575</range>
+					<tilt>0</tilt>
+					<heading>0.0001994953180518285</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-112.2740228273864,33.61913038777643,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Georgina Blach Intermediate School, Los Altos, CA</name>
+				<description><![CDATA[A corner of a roof used as sundial.
+<p><img src="http://www.sundials.org/registry/regphotos/498_ca_losaltos_blach.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-122.083063541274</longitude>
+					<latitude>37.36394994353518</latitude>
+					<altitude>0</altitude>
+					<range>99.46493929648614</range>
+					<tilt>0</tilt>
+					<heading>-6.524992683547596e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-122.0831077334675,37.3641379192763,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Hilltop Park, San Francisco</name>
+				<description><![CDATA[A giant sundial 70 feet in diameter with a bright yellow painted steel gnomon 78 feet long. The dial has a cement base and was designed to be used as the stage for a surrounding amphitheater.
+<p><img src="http://www.sundials.org/registry/regphotos/419_ca_sanf_hunters_ridge.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-122.3837414260284</longitude>
+					<latitude>37.73308769461563</latitude>
+					<altitude>0</altitude>
+					<range>76.96447255875415</range>
+					<tilt>0</tilt>
+					<heading>-0.0001251047167258125</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-122.3837885185873,37.73313852750733,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Berlin-Weißensee</name>
+				<description><![CDATA[A nice sundial made of flowers.
+<p><img src="http://www.be.schule.de/schulen/wfs/pages/sundials/Blumenuhr,Weissensee.gif"></p>
+
+http://www.be.schule.de/schulen/wfs/pages/sundials/Weissensee.html]]></description>
+				<LookAt>
+					<longitude>13.46637059089964</longitude>
+					<latitude>52.55408525446345</latitude>
+					<altitude>0</altitude>
+					<range>35.24186259647233</range>
+					<tilt>0</tilt>
+					<heading>-0.002133411261797274</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>13.46637589519183,52.55412143657096,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Olbers-Planetarium, Bremen</name>
+				<description><![CDATA[This is an armillary sphere sundial. 
+
+<p><img src="http://planetarium.hs-bremen.de/bremen/pics/suhs.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>8.806980778676786</longitude>
+					<latitude>53.06988134466393</latitude>
+					<altitude>0</altitude>
+					<range>24.09705977000565</range>
+					<tilt>0</tilt>
+					<heading>-0.001876272046377585</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>8.806963468445417,53.0698959991562,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Westbroekpark, Denn Haag</name>
+				<description><![CDATA[This sundial is located at the Rosarium in the Westbroekpark, Denn Haag.
+<p><img src="http://www.denhaag.nl/Pics/dsb/Ststr/westbroekpark/rozenconcours45/rozenbedden-met-zonnewijzer.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>4.290891177932192</longitude>
+					<latitude>52.10450647693549</latitude>
+					<altitude>0</altitude>
+					<range>20.57779559985518</range>
+					<tilt>0</tilt>
+					<heading>-0.8669355345663358</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>4.290865552422943,52.10453275113748,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Amersfoort, Netherlands</name>
+				<description><![CDATA[In the arrow are 2 digital displays, one for civil time and one for local suntime.
+<p><img src="http://sundials.org/links/local/sunpointer/sunpointer.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>5.374167244217593</longitude>
+					<latitude>52.15310253836927</latitude>
+					<altitude>0</altitude>
+					<range>31.45592479376158</range>
+					<tilt>1.426589610824431e-009</tilt>
+					<heading>-0.01164696084898205</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>5.374145665653813,52.15310809583514,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Botanical Gardens, Sydney, Australia</name>
+				<description><![CDATA[This is an armillary sphere sundial.
+
+<p><img src="http://www.sundials.co.uk/PC090189.jpg"></p>
+
+<p><img src="http://www.sundials.co.uk/PC090193.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>151.2154952669206</longitude>
+					<latitude>-33.86399908828604</latitude>
+					<altitude>0</altitude>
+					<range>16.43666728184123</range>
+					<tilt>8.675342058213797e-007</tilt>
+					<heading>-0.002067228419448193</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>151.2154882763944,-33.86398565287625,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Team Disney Sundial, Walt Disney World, Florida</name>
+				<description><![CDATA[Thanks to <b>Oftencold</b>
+
+<p><img src="http://www.sunpath-designs.com/disdial2b.gif"></p>
+
+http://www.de-zonnewijzerkring.nl/zw-arch/eng-home-zw-07-02.htm]]></description>
+				<LookAt>
+					<longitude>-81.52113085122878</longitude>
+					<latitude>28.36541360352638</latitude>
+					<altitude>0</altitude>
+					<range>167.7307771712135</range>
+					<tilt>1.015026730473625e-011</tilt>
+					<heading>-0.006287852151169638</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-81.52134276012195,28.36559634883421,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Janskerkhof, Utrecht,  Netherlands</name>
+				<description><![CDATA[A sundial with analemmatic layout.
+<p><img src="http://www.de-zonnewijzerkring.nl/imgs-arch/zw-06-06-01.jpg"></p>
+
+<p><img src="http://www.de-zonnewijzerkring.nl/imgs-arch/zw-06-06-02.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>5.121095723583527</longitude>
+					<latitude>52.09338586502101</latitude>
+					<altitude>0</altitude>
+					<range>24.25734051739648</range>
+					<tilt>5.490226183683639e-010</tilt>
+					<heading>-0.0007122606404517594</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>5.121088800707085,52.09341776135472,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, San Jose Rep Theater, San Jose, CA</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/f96acd0f-6ad7-4b0a-a4a0-e52d14dd0015.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM247Q">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-121.8860266085782</longitude>
+					<latitude>37.33361545835343</latitude>
+					<altitude>0</altitude>
+					<range>32.31958319185324</range>
+					<tilt>0</tilt>
+					<heading>1.418565866412994e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-121.886064353331,37.33364018615777,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Millennium Sundial, Greenwich Park, London</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/7cdcd20c-806c-4cbd-8a9c-5de27ffb115d.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM273J">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-0.001522539653513039</longitude>
+					<latitude>51.48136176862654</latitude>
+					<altitude>0</altitude>
+					<range>61.96314954770909</range>
+					<tilt>2.850197260451716e-009</tilt>
+					<heading>-0.002911073287638733</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-0.00156808979284051,51.48142700407306,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Veterans Park, Waukesha, WI</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/0e6202ea-2b62-4491-9029-0983445e7cde.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM2DTR">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-88.2367572684424</longitude>
+					<latitude>43.00995357504599</latitude>
+					<altitude>0</altitude>
+					<range>49.0879478099675</range>
+					<tilt>0</tilt>
+					<heading>-2.769547716555237e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-88.23678272979073,43.01004377682637,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Underground Sundial, Munich, Germany</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/6f0381f1-4c18-4d9d-95e5-2f9a79842dbe.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM12X2">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>11.70480163926041</longitude>
+					<latitude>48.13338615699044</latitude>
+					<altitude>0</altitude>
+					<range>49.09160069235252</range>
+					<tilt>7.359413992305611e-011</tilt>
+					<heading>1.363313751616389e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>11.70474103166116,48.13350333174798,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Crown Hill cemetery, Indianapolis, Indiana, USA</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/d62d27fc-f175-4ac8-aab3-7ba9748d6b82.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM1310">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-86.17300915391851</longitude>
+					<latitude>39.82668935299838</latitude>
+					<altitude>0</altitude>
+					<range>35.63730089613371</range>
+					<tilt>0</tilt>
+					<heading>2.616180723282867e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-86.17304253331795,39.82668119645058,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Coppell, TX</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/2bb0da85-d5db-44ed-ae70-d89f290ad7fd.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM1WJG">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-97.02194975520763</longitude>
+					<latitude>32.95633568822581</latitude>
+					<altitude>0</altitude>
+					<range>61.19896168864369</range>
+					<tilt>0</tilt>
+					<heading>1.826645706530163e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-97.02199840401494,32.95643533824669,0</coordinates>
+				</Point>
+			</Placemark>
+		</Folder>
+		<Folder>
+			<name>Low Resolution</name>
+			<Placemark>
+				<name>Sundial, Kota Baru Parahyangan</name>
+				<description><![CDATA[Thanks to <b>voorburger</b>.
+<p><img src="http://www.thebiggestsundial.com/php/thebiggestsundial/images/Exhibits/13/03052007134130.gif"></p>]]></description>
+				<LookAt>
+					<longitude>107.4940550739811</longitude>
+					<latitude>-6.852038750176605</latitude>
+					<altitude>0</altitude>
+					<range>296.7282563680993</range>
+					<tilt>2.08633946131246e-011</tilt>
+					<heading>0.5509822616366601</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>107.4939718861608,-6.851748821808833,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Pajala, Sweden</name>
+				<description><![CDATA[<p>The world's biggest sundial today is in the Torne Valley, north of the Arctic Circle. The Guinness Book of Records has put Pajala, northern Sweden, on the map, and its sundial - formed as a "round square". </p>
+<p><img src="http://www.pajala.se/mun/pajala/www.nsf/($all)/A43859111165E6F2C1256EE40021DDF3/$file/soltorg23.JPG"></p>
+<p>The sundial in Pajala, 38.33 m. in diameter, holds the world record, according to the Guinness Book of Records. The previous record was held by Disney World in Orlando, Florida, with 37.18 m. </p>
+
+<p>The sundial was inaugurated by the Swedish Minister of Labour Margareta Winberg in July 1996. Pajala is situated at 23.28 ° East, 67.21 ° North, which is 70 km north of the Arctic Circle, making a circular sundial possible. This is due to the fact that the Midnight Sun describes a complete circle over the horizon. 
+
+<p>Its masts of dried fir form a unique spatiality around a circular "square". The site is especially used for local functions such as Pajala Fair, Romp Week and the Northern Lights Festival. </p>
+
+<p>The central square in Pajala, through its size and latitude, offered conditions for a sundial dedicated to the Midnight Sun. Architect Mats Winsa took his inspiration from the square in Siena, and for the sculptures in the park - astronomical instruments in India dating back to the 18th century. Naturally, it was a challenge to compete with the previous record from 1991 by the world-famous Japanese architect, Arata Isozaki. </p>
+
+<p>The sundial captures the sun's movement by allowing the shadow of the central gnomon to fall across the hour divisions of the surrounding posts. The gnomon, like the Earth's axis, points toward the Pole Star, which according to Finnish-Ugrian mythology (the region has Finnish roots) holds up the firmament. The "sun wheel" embedded in the ground here (forming a cross in the circle) is in fact a calendar. Water bubbles up from four sources corresponding to the four principal points of t [...]
+
+<p>For their survival, humans have followed the rhythm of the sun. The need to observe the changing seasons and days led to the early development of the sundial. Our lives today are characterised by obedience to mechanical and national time - inventions separate from true solar time. The sundial displays true solar time, which in Pajala is half-an-hour ahead of national time. </p>
+
+<p>The sundial in Pajala celebrates light, and acts as a reminder of its significance for all life by functioning as a biological clock in a world fettered by artificial time. The hormone rush in spring reminds us of our direct dependence on sunlight as living beings.</p>
+
+<p>Info and image source:<a href="http://www.pajala.se/mun/pajala/www.nsf/english/$first?open&mname=Menu%C2%A4menuID=2CAE%C2%A4start=1">www.pajala.se</a></p>
+
+<p><img src="http://holmers.com/Pajala/Pajala1_050709.jpg"></p>
+<p>Image source:<a href="http://holmers.com/Pajala/Pajala1_050709.jpg">http://holmers.com</a></p>]]></description>
+				<LookAt>
+					<longitude>23.36723004664742</longitude>
+					<latitude>67.21282676944374</latitude>
+					<altitude>0</altitude>
+					<range>124.9604027877409</range>
+					<tilt>3.010594647959025e-010</tilt>
+					<heading>-1.130925335798896</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>23.36716252896882,67.21299216873888,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Tenerife, Spain</name>
+				<description><![CDATA[Reloj del sol
+
+<p><img src="http://members.aon.at/mbrandn6/media/fotos/landart/watchteneriffa/tentotal1.jpg"></p>
+
+<p><img src="http://members.aon.at/mbrandn6/media/fotos/landart/watchteneriffa/tennah.jpg"></p>
+
+<p><img src="http://members.aon.at/mbrandn6/media/fotos/landart/watchteneriffa/tentotal3.jpg"></p>
+
+<p><img src="http://members.aon.at/mbrandn6/media/fotos/landart/watchteneriffa/draft.jpg"></p>
+<p>Image source:<a href="http://members.aon.at/mbrandn6/pagesgerman/framesetg/framelandart.html">http://members.aon.at</a></p>
+
+<p><a href="http://www.teneriffa.panoshot.de/de/panorama-interaktiv/gernot-huber-stiftung-reloj-del-sol-223.html
+">Interactice picture</a></p>]]></description>
+				<LookAt>
+					<longitude>-16.56926659562192</longitude>
+					<latitude>28.08256590461729</latitude>
+					<altitude>0</altitude>
+					<range>88.29371157400612</range>
+					<tilt>0</tilt>
+					<heading>8.633540737161729e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-16.5693071701084,28.08261960124695,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Perranporth, UK</name>
+				<description><![CDATA[The Millennium Sundial was designed by Stuart Thorn. It tells Cornish time which is 20 minutes ahead of GMT.
+<p><img src="http://www.cornwalls.co.uk/photos/data/media/2/perranporth_sundial.jpg" width="421" hight="280"></p>]]></description>
+				<LookAt>
+					<longitude>-5.157517535037663</longitude>
+					<latitude>50.34723421976403</latitude>
+					<altitude>0</altitude>
+					<range>65.69642310338585</range>
+					<tilt>0</tilt>
+					<heading>-0.01795551609583625</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-5.157537433789316,50.34733238709538,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Council Bluffs, Iowa, USA</name>
+				<description><![CDATA[Large sundial at Council Bluffs Public Library
+
+<p><img src="http://www.sunpath-designs.com/librarydial1b.jpg" width="400" hight="300"></p>
+<p><img src="http://www.sunpath-designs.com/librarydial2b.jpg" width="400" hight="300"></p>
+<p><img src="http://www.sunpath-designs.com/librarydial3b.jpg" width="400" hight="300"></p>]]></description>
+				<LookAt>
+					<longitude>-95.84953495410247</longitude>
+					<latitude>41.25887711431908</latitude>
+					<altitude>0</altitude>
+					<range>196.5752069699831</range>
+					<tilt>2.583166383376495e-010</tilt>
+					<heading>0.0002124063872384501</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-95.84981881431206,41.25888611306795,294.4878429401121</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial. Meckhofen, Leverkusen, Germany</name>
+				<description><![CDATA[<p><img src="http://www.leverkusen.de/stadtportrait/partnerstaedte/400pxPartnerstaedteSonnenuhr01.jpg"></p>
+<p>Image source:<a href="v">www.leverkusen.de</a></p>
+
+<p><img src="http://www.lev2000.de/guide/Archiv1.jpg/39/Sonnenuhr01.jpg"></p>
+
+<p><img src="http://www.lev2000.de/guide/Archiv1.jpg/39/Sonnenuhr02.jpg"></p>
+<p>Image source:<a href="http://www.lev2000.de/guide/Archiv1.jpg/39/Sonnenuhr02.jpg">www.lev2000.de</a></p>]]></description>
+				<LookAt>
+					<longitude>7.083354426150351</longitude>
+					<latitude>51.04845387008112</latitude>
+					<altitude>0</altitude>
+					<range>66.17616066250443</range>
+					<tilt>9.735256695418331e-010</tilt>
+					<heading>0.0006924896867520876</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>7.083321386023442,51.04852440832129,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial,  Adler Planetarium, Chicago, USA</name>
+				<description><![CDATA[<p><img src="http://www.wherry.com/photos/2001-04-29-chicago/DSCN1221-m.jpg" width="500" hight="375"></p>]]></description>
+				<LookAt>
+					<longitude>-87.60711153340705</longitude>
+					<latitude>41.86674796371171</latitude>
+					<altitude>0</altitude>
+					<range>27.37440941953917</range>
+					<tilt>0</tilt>
+					<heading>0.008419825260544345</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-87.60710764637246,41.86681374132155,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Rose Garden Sundial, Christchurch, New Zealand</name>
+				<description><![CDATA[<p>Thanks to <b>NormB</b></p>
+<a href="http://www.ccc.govt.nz/Parks/BotanicGardens/tour_gardens_central_rose_garden.asp">Rose Garden History</a>
+
+<p>
+<b>Photo - NormB 11th April 2006<br>
+<img src="http://img527.imageshack.us/img527/509/sundialig8.jpg" alt="Image Hosted by ImageShack.us" /><p>
+<b>Photo - NormB 11th April 2006<br>
+<img src="http://img527.imageshack.us/img527/786/sundialplaquefn9.jpg" alt="Image Hosted by ImageShack.us" />]]></description>
+				<LookAt>
+					<longitude>172.621331272394</longitude>
+					<latitude>-43.53038034442864</latitude>
+					<altitude>0</altitude>
+					<range>86.04933199573917</range>
+					<tilt>0</tilt>
+					<heading>1.801092527765711</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>172.6213650004974,-43.53035465311722,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Natchez Park</name>
+				<description><![CDATA[<p>Thanks to <b>caroling</b></p>
+
+In Seaside, NW FL, USA on the Emerald Coast. Panoramic images and movies of a sundial and visions of Xtals (energy crystals) on the March equinox, 2006. See http://www.wholeo.net/Trips/Art/Web/TripsArt/Travel/Florida/borders/flBorders.htm]]></description>
+				<LookAt>
+					<longitude>-86.14177717779702</longitude>
+					<latitude>30.32184243688109</latitude>
+					<altitude>0</altitude>
+					<range>46.50596341362312</range>
+					<tilt>9.523139707563741e-010</tilt>
+					<heading>0.0925379903960088</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<altitudeMode>relativeToGround</altitudeMode>
+					<coordinates>-86.14183223138707,30.32193188899003,3</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Charlotte, North Carolina, USA</name>
+				<description><![CDATA[<p>Thanks to <b>BrettHo</b></p>
+On the roof of the International Trade Center is this gigantic sundial.]]></description>
+				<LookAt>
+					<longitude>-80.84002590296151</longitude>
+					<latitude>35.22682691631484</latitude>
+					<altitude>0</altitude>
+					<range>73.21919569418378</range>
+					<tilt>0</tilt>
+					<heading>12.34188537748346</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-80.84002447413604,35.22696160522812,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>KTPalmerSundial, Carefree, Arizona, USA</name>
+				<description><![CDATA[Thanks to <b>seer</b>.
+<p><img src="http://www.sundials.org/registry/regphotos/001_az_carefree_2.jpg"></p>
+http://www.bigwaste.com/photos/az/sundial/]]></description>
+				<LookAt>
+					<longitude>-111.9217799027029</longitude>
+					<latitude>33.8245907883639</latitude>
+					<altitude>0</altitude>
+					<range>119.8165563905356</range>
+					<tilt>2.774426682549449e-010</tilt>
+					<heading>-1.574999619300427e-005</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-111.9218327194278,33.82468559440962,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, University of Science and Technology, Hong Kong</name>
+				<description><![CDATA[<p><img src="http://perso.orange.fr/cadrans.solaires/cadrans/images/Maes-hongkong.jpg" width="295" height="370"></p>
+
+<p>Image source:<a href="http://perso.orange.fr/cadrans.solaires/cadrans/originaux-monde.html">http://perso.orange.fr</a></p>]]></description>
+				<LookAt>
+					<longitude>114.2630116779084</longitude>
+					<latitude>22.33749401387006</latitude>
+					<altitude>0</altitude>
+					<range>111.6162130745504</range>
+					<tilt>0</tilt>
+					<heading>0.0003913059632004609</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>114.2629690669868,22.33764072332584,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial,  Pekin, Illinois</name>
+				<description><![CDATA[<p><img src="http://www.pekin.net/sundial/sundial.jpg"></p>
+<p>Image source:<a href="http://www.pekin.net/sundial/index.html">www.pekin.net</a></p>
+
+<p><img src="http://www.sundials.org/registry/regphotos/233_il_perkin_parkdial.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-89.63076522889526</longitude>
+					<latitude>40.56267466732153</latitude>
+					<altitude>0</altitude>
+					<range>161.1716772997438</range>
+					<tilt>0</tilt>
+					<heading>0.009112399365723663</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-89.63089561079578,40.56281064339486,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Edinburg, Hidalgo, USA</name>
+				<description><![CDATA[<p><img src="http://www.sunpath-designs.com/utdial2b.GIF" width="300" hight="400"></p>
+
+<p><img src="http://www.sunpath-designs.com/utdial1b.gif"width="400" hight="300"><7p>]]></description>
+				<LookAt>
+					<longitude>-98.17095602857175</longitude>
+					<latitude>26.30618568257091</latitude>
+					<altitude>0</altitude>
+					<range>122.1950947751469</range>
+					<tilt>0</tilt>
+					<heading>-0.005400653570135644</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-98.17104492887813,26.30639237212602,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Keppel Henge,</name>
+				<description><![CDATA[<p><img src="http://www.mts.net/~sabanski/sundial/images/sundials%20of%20the%20world/Canada/Keppel%20Henge/sundial1.jpg"></p>
+<p>http://www.steveirvine.com/sundial.html</p>
+
+
+http://www.mts.net/~sabanski/sundial/sotw_canada_keppel.htm]]></description>
+				<LookAt>
+					<longitude>-80.94374423682251</longitude>
+					<latitude>44.79038599160477</latitude>
+					<altitude>0</altitude>
+					<range>164.0454159373261</range>
+					<tilt>0</tilt>
+					<heading>-0.007334046679263517</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-80.94383190841853,44.79038705635566,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial at Science North, Sudbury, Ontario</name>
+				<description><![CDATA[<p><img src="http://www.mts.net/~sabanski/sundial/images/sundials%20of%20the%20world/Canada/Science%20North/celeste1.jpg"></p>
+
+<p><img src="http://www.mts.net/~sabanski/sundial/images/sundials%20of%20the%20world/Canada/Science%20North/celeste2.jpg"></p>
+
+<p><img src="http://www.mts.net/~sabanski/sundial/images/sundials%20of%20the%20world/Canada/Science%20North/celeste3.jpg"></p>
+
+http://www.mts.net/~sabanski/sundial/sotw_canada_sn.htm]]></description>
+				<LookAt>
+					<longitude>-80.99582033913947</longitude>
+					<latitude>46.46976830028441</latitude>
+					<altitude>0</altitude>
+					<range>85.82915438648354</range>
+					<tilt>0</tilt>
+					<heading>0.0003317215281456315</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-80.99588716181201,46.46988111501548,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Amble, UK</name>
+				<description><![CDATA[<p><img src="http://ourworld.compuserve.com/homepages/Patrick_Powers/Amble.jpg"></p>
+http://ourworld.compuserve.com/homepages/Patrick_Powers/amble.htm]]></description>
+				<LookAt>
+					<longitude>-1.581634687429885</longitude>
+					<latitude>55.33514811404725</latitude>
+					<altitude>0</altitude>
+					<range>62.55005662709024</range>
+					<tilt>8.224100904372228e-010</tilt>
+					<heading>-0.008198736253532122</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-1.581720999552488,55.3352025087941,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, University of Maryland, College Park</name>
+				<description><![CDATA[<p><img src="http://www.mts.net/~sabanski/sundial/images/sundials%20of%20the%20world/USA/Maryland/Univ%20of%20Maryland%20.jpg"></p>
+http://www.mts.net/~sabanski/sundial/sotw_usa_mland.htm]]></description>
+				<LookAt>
+					<longitude>-76.94256839624576</longitude>
+					<latitude>38.98603731470438</latitude>
+					<altitude>0</altitude>
+					<range>69.47353847793947</range>
+					<tilt>0</tilt>
+					<heading>-0.00947513273561203</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-76.94253686137193,38.98616316295006,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Fort San Felipe del Morro, Puerto Rico</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/564_cuba_habana_1.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-66.11899284422442</longitude>
+					<latitude>18.46786530709565</latitude>
+					<altitude>0</altitude>
+					<range>122.9114928009769</range>
+					<tilt>0</tilt>
+					<heading>0.001639161983653822</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-66.11900470518663,18.4679529172629,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Rose Garden, Phoenix</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/007_az_phoenix.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-112.0911976535298</longitude>
+					<latitude>33.47007786030556</latitude>
+					<altitude>0</altitude>
+					<range>26.72933602203598</range>
+					<tilt>4.053298886062559e-011</tilt>
+					<heading>0.0001093808645832187</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-112.0912131593616,33.4701136927338,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Tucson, Arizona</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/012_az_tucson_la_pilita.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-110.9748374101104</longitude>
+					<latitude>32.21591986778585</latitude>
+					<altitude>0</altitude>
+					<range>42.12321141209996</range>
+					<tilt>0</tilt>
+					<heading>-0.0002919115031976927</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-110.9748562940359,32.21593667064053,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Flandrau Planetarium, Tucson</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/013_az_tuscon_flandrau_planetarium.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-110.9477979774635</longitude>
+					<latitude>32.23224398378896</latitude>
+					<altitude>0</altitude>
+					<range>33.29181342845133</range>
+					<tilt>3.6608792363658e-017</tilt>
+					<heading>0.0001605580448802178</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-110.9478231994691,32.23228861367718,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Vietnam Veterans Memorial, Kentucky</name>
+				<description><![CDATA[<p><img src="http://www.vietvet.org/images/vn/billm/rags9.gif"></p>
+
+http://www.vietvet.org/kymem.htm]]></description>
+				<LookAt>
+					<longitude>-84.8640348419774</longitude>
+					<latitude>38.17725413584271</latitude>
+					<altitude>0</altitude>
+					<range>136.9757698325458</range>
+					<tilt>1.322889725758878e-010</tilt>
+					<heading>-0.0003615314930558497</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-84.86405079639164,38.17749508752453,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Claremont, California</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/505_ca_claremont_1.jpg"></p>
+
+<p><img src="http://www.sundials.org/registry/regphotos/505_ca_claremont_2.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-117.7288129576152</longitude>
+					<latitude>34.0992297660836</latitude>
+					<altitude>0</altitude>
+					<range>60.73786036422235</range>
+					<tilt>1.321942869740197e-009</tilt>
+					<heading>-0.002677989156069468</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-117.7288254316814,34.09928418001653,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Hoogezand, Netherlands</name>
+				<description><![CDATA[The sundial in the Gorechtpark  was built in 1994 by the artist  Chris Verbeek.
+<p><img src="http://www.hoogezand-sappemeer.nl/plaat.php?fileid=3054"></p>
+
+http://www.hoogezand-sappemeer.nl/index.php?simaction=content&mediumid=10&pagid=335&fontsize=10&stukid=2597]]></description>
+				<LookAt>
+					<longitude>6.73589462010654</longitude>
+					<latitude>53.15594584104552</latitude>
+					<altitude>0</altitude>
+					<range>139.6528910743265</range>
+					<tilt>1.45482979338997e-010</tilt>
+					<heading>0.002950231733866508</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>6.73578802230557,53.15607461082266,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Hoogeveen, Netherlands</name>
+				<description><![CDATA[Sundial at Unigarant, Hoogeveen.
+<p><img src="http://www.de-zonnewijzerkring.nl/imgs-arch/werk-07-05-01.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>6.469908327982116</longitude>
+					<latitude>52.72012840714818</latitude>
+					<altitude>0</altitude>
+					<range>73.67703044709106</range>
+					<tilt>4.200981642085038e-012</tilt>
+					<heading>-0.0001367978398152192</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>6.469803362243752,52.72017851542101,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Bicentennial Park, Homebush, Australia</name>
+				<description><![CDATA[This 'walkthrough' sundial with a gnomon 8m long is well worth a visit and is near to the Olympic Park site of the 2000 Olympics. Hour lines and declination lines are set as brass strips in a concrete base dialface.
+<p><img src="http://www.rnzih.org.nz/images/sun13.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>151.0785472180646</longitude>
+					<latitude>-33.84641177017981</latitude>
+					<altitude>0</altitude>
+					<range>163.2808310648841</range>
+					<tilt>1.201655085829064e-011</tilt>
+					<heading>4.265000695512084e-006</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>151.0784520824468,-33.84631674048389,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Heerenveen, Netherlands</name>
+				<description><![CDATA[A sundial in a roundabout.
+<p><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Zonnewijzer_Heerenveen_16.JPG/300px-Zonnewijzer_Heerenveen_16.JPG"></p>]]></description>
+				<LookAt>
+					<longitude>5.948360581453846</longitude>
+					<latitude>52.95021342348947</latitude>
+					<altitude>0</altitude>
+					<range>125.5263208537314</range>
+					<tilt>3.779142327674902e-010</tilt>
+					<heading>2.174750871196e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>5.94828156186523,52.95041125062435,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Zoetermeer, Netherlands</name>
+				<description><![CDATA[A triangle shaped sundial.
+<p><img src="http://www.chabot.demon.nl/images/Zoetermeer03.jpg"></p>
+
+http://www.chabot.demon.nl/sundials/index3.htm]]></description>
+				<LookAt>
+					<longitude>4.48801136665803</longitude>
+					<latitude>52.03630549285332</latitude>
+					<altitude>0</altitude>
+					<range>64.63218166015471</range>
+					<tilt>0</tilt>
+					<heading>-0.0001443420778625332</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>4.48796065586356,52.03633054351467,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Lancaster, Lancashire, UK</name>
+				<description><![CDATA[A very nice analemmanic sundial made of stone.
+<p><img src="http://static2.bareka.com/photos/medium/2472257/lancaster-sundial.jpg"></p>
+
+<p><img src="http://static4.bareka.com/photos/medium/2472163/becoming-gnomon.jpg"></p>
+
+<p><img src="http://static2.bareka.com/photos/medium/2472201/telling-time.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-2.781711751106886</longitude>
+					<latitude>54.04618182827939</latitude>
+					<altitude>0</altitude>
+					<range>59.27999100628823</range>
+					<tilt>0</tilt>
+					<heading>2.19677695423205e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-2.781728090880108,54.0462693701831,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial,  Nida, Lithuania</name>
+				<description><![CDATA[A large horizontal sundial.
+<p><img src="http://static1.bareka.com/photos/medium/47224/nida.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>20.99037235133227</longitude>
+					<latitude>55.29501544197078</latitude>
+					<altitude>0</altitude>
+					<range>177.9373429950499</range>
+					<tilt>4.620370977113893e-011</tilt>
+					<heading>0.0005344762650417512</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>20.99033020665709,55.29525661423606,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Tavel, France</name>
+				<description><![CDATA[A very large sundial, sadly in low res.
+<p><img src="http://www.de-zonnewijzerkring.nl/imgs-arch/zw-07-03-01.jpg" width="360" hight="270"></p>
+
+http://www.de-zonnewijzerkring.nl/zw-arch/eng-home-zw-07-03.htm]]></description>
+				<LookAt>
+					<longitude>4.700355808916944</longitude>
+					<latitude>44.00154771856498</latitude>
+					<altitude>0</altitude>
+					<range>254.0752666918187</range>
+					<tilt>2.46623000787332e-010</tilt>
+					<heading>-0.0002391009248289202</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>4.700351044280055,44.00172761202828,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, St. Michielsgestel, Netherlands</name>
+				<description><![CDATA[A large sundial in the gardens of the Institute for the Deaf in Sint Michielsgestel.
+
+<p><img src="http://www.de-zonnewijzerkring.nl/imgs-arch/zw-06-10-01.jpg"></p>
+
+<p><img src="http://www.de-zonnewijzerkring.nl/imgs-arch/zw-06-10-02.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>5.346086124850936</longitude>
+					<latitude>51.64327189620946</latitude>
+					<altitude>0</altitude>
+					<range>111.9437734662239</range>
+					<tilt>6.47253437341193e-010</tilt>
+					<heading>0.002375287388397793</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>5.346049636943462,51.64334209867396,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial,  Halle Saale, Germany</name>
+				<description><![CDATA[Analemmatic sundial at the Planetarium
+"Sigmund Jähn" planetarium, Halle.
+<p><img src="http://home.arcor.de/peter.lindner/sonnenuhr/h/halle_saale_061xx/5973_peissnitzinsel_planetarium_200707163002.jpg"></p>
+
+More photos:http://home.arcor.de/peter.lindner/sonnenuhr/h/halle_saale_061xx/halle_saale_061xx.htm]]></description>
+				<LookAt>
+					<longitude>11.94846541701928</longitude>
+					<latitude>51.49449346439673</latitude>
+					<altitude>0</altitude>
+					<range>51.14591828296211</range>
+					<tilt>0</tilt>
+					<heading>0.0003207363265956715</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>11.9484244247504,51.49452140024068,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Abano Terme, Italy</name>
+				<description><![CDATA[<p><img src="http://members.aon.at/sundials/images/italia/i_07207.jpg"></p>
+
+http://members.aon.at/sundials/bild43_d.htm]]></description>
+				<LookAt>
+					<longitude>11.7902588657866</longitude>
+					<latitude>45.36024293920432</latitude>
+					<altitude>0</altitude>
+					<range>88.27261765894279</range>
+					<tilt>5.645767845941023e-011</tilt>
+					<heading>0.0006214879519801648</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>11.79017178556217,45.36037512888652,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Gasworks Park, Seattle, USA</name>
+				<description><![CDATA[The sundial at Gas Works Park
+<p><img src="http://www.magnusonpark.org/images/sundial.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-122.3362979085422</longitude>
+					<latitude>47.64532276753428</latitude>
+					<altitude>0</altitude>
+					<range>144.9142629968483</range>
+					<tilt>1.398328526418574e-010</tilt>
+					<heading>-0.002257590778485548</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-122.3363617333393,47.64542146106401,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Biarritz, France</name>
+				<description><![CDATA[<p><img src="http://www.santiago-compostela.net/pix/biar2.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-1.554172472866423</longitude>
+					<latitude>43.49326953476108</latitude>
+					<altitude>0</altitude>
+					<range>25.2767811064234</range>
+					<tilt>1.050991544755056e-009</tilt>
+					<heading>0.004580769709390601</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-1.554180928484328,43.49329288628002,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Biarritz, France</name>
+				<description><![CDATA[This is a small analemmatic sundial painted on the ground.
+<p><img src="http://www.santiago-compostela.net/pix/biar1.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-1.566562523529829</longitude>
+					<latitude>43.48379630381277</latitude>
+					<altitude>0</altitude>
+					<range>21.65084680450158</range>
+					<tilt>3.134801309486055e-010</tilt>
+					<heading>-0.003938809314781338</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-1.566563732160418,43.48381046528652,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Gardens of Easton Lodge, UK</name>
+				<description><![CDATA[Easton Lodge, Little Easton, Dunmow, Essex, UK
+
+<p><img src="http://www.sundials.co.uk/pix/easton1.jpg"></p>
+
+<p><img src="http://www.sundials.co.uk/pix/easton2.jpg"></p>
+
+http://www.sundials.co.uk/newdials.htm]]></description>
+				<LookAt>
+					<longitude>0.3149818536825662</longitude>
+					<latitude>51.89078052542742</latitude>
+					<altitude>0</altitude>
+					<range>55.96449646091584</range>
+					<tilt>4.648925194094304e-010</tilt>
+					<heading>0.00100690081475908</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>0.3149732952370528,51.89085713320831,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Drake University, Des Moines, Iowa, USA</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/483_io_desmoines_drake_univ.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-93.65212284615454</longitude>
+					<latitude>41.60195541103381</latitude>
+					<altitude>0</altitude>
+					<range>78.72982107342352</range>
+					<tilt>1.765081595632672e-010</tilt>
+					<heading>0.001286572559733559</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-93.65218647671061,41.60204463077999,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, River State Park, Indianapolis, USA</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/276_in_indi_wrsp.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-86.17152524772823</longitude>
+					<latitude>39.76773209074677</latitude>
+					<altitude>0</altitude>
+					<range>54.39844455317644</range>
+					<tilt>0</tilt>
+					<heading>0.002275213067656348</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-86.17158357583082,39.76772499391254,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Lawrence Hall of Science, Berkeley, CA, USA</name>
+				<description><![CDATA[<p><img src="http://sundials.org/conference/2000/image176.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-122.2467934369336</longitude>
+					<latitude>37.87843955912407</latitude>
+					<altitude>0</altitude>
+					<range>75.73772829567238</range>
+					<tilt>0</tilt>
+					<heading>-0.0005027058674008065</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-122.2468395686324,37.87850249930867,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Riverwalk, Augusta, Georgia, USA</name>
+				<description><![CDATA[<p><img src="http://www.coe.uga.edu/sdpl/3hgh_res/sundial1.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-81.96495913544699</longitude>
+					<latitude>33.47855115889769</latitude>
+					<altitude>0</altitude>
+					<range>24.10683016246917</range>
+					<tilt>0</tilt>
+					<heading>-0.004039593559848222</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-81.96497422223469,33.47856125757188,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Reggio nell'Emilia, Italy</name>
+				<description><![CDATA[<p><img src="http://perso.orange.fr/cadrans.solaires/cadrans/images/cadran_righi_araign%E9e.jpg"></p>
+<p>Image source:<a href="http://perso.orange.fr/cadrans.solaires/cadrans/Cadran-brescia.html">http://perso.orange.fr</a></p>]]></description>
+				<LookAt>
+					<longitude>10.64303919389926</longitude>
+					<latitude>44.71779646338597</latitude>
+					<altitude>0</altitude>
+					<range>189.7095730357674</range>
+					<tilt>0</tilt>
+					<heading>0.0003188808607201916</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>10.64294491831197,44.71794161105381,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Rennes, France</name>
+				<description><![CDATA[<p><img src="http://perso.orange.fr/cadrans.solaires/cadrans/images/cadran_beauregard_300.jpg"></p>
+
+<p>Image source:<a href="http://perso.orange.fr/cadrans.solaires/cadrans/images/cadran_beauregard_300.jpg">http://perso.orange.fr</a></p>]]></description>
+				<LookAt>
+					<longitude>-1.701676278457902</longitude>
+					<latitude>48.13126501865703</latitude>
+					<altitude>0</altitude>
+					<range>61.61200771227915</range>
+					<tilt>0</tilt>
+					<heading>-7.297875936612596e-006</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-1.701699217745187,48.13129604209563,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Schneverdingen, Germany</name>
+				<description><![CDATA[<p><img src="http://www.schneverdingen-touristik.de/Rest/Sonnenuhr%20quer.jpg" width="320" hight ="240"></p>]]></description>
+				<LookAt>
+					<longitude>9.790867938787324</longitude>
+					<latitude>53.12943797238091</latitude>
+					<altitude>0</altitude>
+					<range>106.7617213575405</range>
+					<tilt>4.722006958129564e-010</tilt>
+					<heading>0.00116683463628678</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>9.790707601654233,53.12958381093443,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial Obelisk, Charleston, South Carolina</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/10a1f88a-71e0-4341-96f3-e8e687af05c9.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM9J1">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-79.93166502066842</longitude>
+					<latitude>32.76970334074068</latitude>
+					<altitude>0</altitude>
+					<range>75.62015855417492</range>
+					<tilt>4.052617221081382e-011</tilt>
+					<heading>1.8933011389851e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-79.93172500691688,32.76973746165206,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Morehead Planetarium, Chapel Hill, North Carolina</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/log/display/a71ce131-2875-4856-958f-2ca5e57a1df9.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WMCBZ">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-79.050938325099</longitude>
+					<latitude>35.91448691988588</latitude>
+					<altitude>0</altitude>
+					<range>64.77863580575449</range>
+					<tilt>0</tilt>
+					<heading>1.662447442472179e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-79.05097493816135,35.91457037097104,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Berkeley,
+California</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/log/display/9c455a92-2816-4071-950e-91f17b6fa4bd.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM988">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-122.3174670551103</longitude>
+					<latitude>37.86291969151575</latitude>
+					<altitude>0</altitude>
+					<range>46.45520126730318</range>
+					<tilt>1.288314315217904e-009</tilt>
+					<heading>2.022127862982459e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-122.317517078111,37.86295037394118,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Forest Lawn Cemetery Sundial, Buffalo, NY</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/c6aef5f9-367d-45f2-8f8c-d01bf5d233ae.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WMJQ8">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-78.85654999999994</longitude>
+					<latitude>42.92531666666667</latitude>
+					<altitude>0</altitude>
+					<range>76.25216432595194</range>
+					<tilt>0</tilt>
+					<heading>1.305178628551349e-014</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-78.85660856395873,42.92539096384056,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Ruston Way Sundial ,Tacoma, Washington</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/dd5439e7-0312-443d-9557-d4986582ef59.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WMXQB">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-122.4622812282256</longitude>
+					<latitude>47.27566486193976</latitude>
+					<altitude>0</altitude>
+					<range>62.22457114364932</range>
+					<tilt>0</tilt>
+					<heading>0.0001239840172672445</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-122.4623519976878,47.27567991760397,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial ,Science Central, Fort Wayne, Indiana</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/e78d7f23-8999-47be-b678-e7140aa82ca7.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WMYG1">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-85.1392719076301</longitude>
+					<latitude>41.09135262868964</latitude>
+					<altitude>0</altitude>
+					<range>39.45104173043256</range>
+					<tilt>0</tilt>
+					<heading>-1.439899387224993e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-85.13931366905783,41.09136114213859,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Berkswich Millennium Sundial, Broc Hill, Staffordshire, UK</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/3351745c-c573-4970-98ef-8ba7740c9bca.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WMR8X">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-2.038136129920761</longitude>
+					<latitude>52.77711389120437</latitude>
+					<altitude>0</altitude>
+					<range>29.50351061813827</range>
+					<tilt>0</tilt>
+					<heading>3.758749562499077e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-2.038162283146562,52.77714418176907,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Tazacorte Beach ,La Palma island</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/10cced19-2b34-482d-86c5-ee72fca9ab87.jpg" width="400" height="300"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM173Y">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-17.9461489138289</longitude>
+					<latitude>28.65121498294262</latitude>
+					<altitude>0</altitude>
+					<range>64.36805201552387</range>
+					<tilt>0</tilt>
+					<heading>4.047704004228316e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-17.94620263531645,28.65124065936443,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Rochester, NY</name>
+				<description><![CDATA[Residence Hall Quad Sundial
+<p><img src="http://img.groundspeak.com/waymarking/display/86272fd4-17ae-4b5d-a120-35ba49574a1d.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM13N7">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-77.66915367541856</longitude>
+					<latitude>43.0844306339545</latitude>
+					<altitude>0</altitude>
+					<range>61.69080872372956</range>
+					<tilt>0</tilt>
+					<heading>9.994948692290747e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-77.66917908415978,43.08440844604031,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Center of the World, Felicity, CA</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/log/691c99be-50f7-4916-88e7-9e103d994b22.jpg"></p>
+
+<p>
+The 15 foot Sundial at Felicity is a three-dimensional bronze of Michelangelo's Arm of God painted on the Sistine Chapel ceiling. The arm was sculpted and cast in bronze in New England. The rock is local but the installation required the assistance of a mining engineer and a special drill. The bronze Roman numerals give the time. A sundial is precisely accurate once a year and this was set at noon on Christmas Day. The arm points to the Hill of Prayer, site of the Church on the Hill at F [...]
+At the entrance to The Center of the World campus is a 25 ft. high section of the original stairway of the Eiffel Tower. In 1983, the Government of France removed approximately 500 ft. of the original stairway. Built with the technology of the 1860's, the weight of approximately 54,000 lbs. was causing sway at the top of the then 94 year old tower. The 6,600 lb. section serves no practical purpose, but is part of the spirit of Felicity.
+The idea of making Felicity the Center of the World came to Jacques-André when he'd been mayor only a few months. Somehow he convinced Imperial County, CA, to recognize his claim. Soon he had convinced the Institut Geographique National of France, General Dynamics Corporation, and The People's Republic of China to recognize it as well. "I knew I had to build something, but I didn't know what. My wife said, 'It's a desert; why not a pyramid?' So Jacques-André had built a 21-foot-tall pink [...]
+The Felicity Post Office was dedicated on 5 December 1987 at a time when thousands of small post offices were being eliminated as an economy measure. The town, whose population numbered two, saw over 2,300 letters mailed that day. The dedication ceremony was highlighted by a speech in Chinese by Consul Zhou of the People’s Republic of China who traveled 600 miles for the occasion. It is operated by the town at a cost to the Federal Government of one dollar per year. Twenty uncashed one d [...]
+
+<p>Image and info credit:<a href="http://www.waymarking.com/waymarks/WM19WB">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-114.7654750861393</longitude>
+					<latitude>32.74988921016088</latitude>
+					<altitude>0</altitude>
+					<range>72.95555856498569</range>
+					<tilt>0</tilt>
+					<heading>3.146266385893141e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-114.7655284077745,32.74992976207647,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>University of São Paulo Sundial, Sao Paulo, Brazi</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/a5362062-9509-4022-9693-fc2a064301d8.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM1DJT">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-46.7204986760494</longitude>
+					<latitude>-23.56120553413547</latitude>
+					<altitude>0</altitude>
+					<range>122.7188487961642</range>
+					<tilt>0</tilt>
+					<heading>2.610051397350573e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-46.7205459522717,-23.56115337159118,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Slate bowl Sundial, Holker, UK</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/c6aca7e1-9221-4d8f-a0f4-e062e06346f9.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM1DRW">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-2.987191130383048</longitude>
+					<latitude>54.188865359179</latitude>
+					<altitude>0</altitude>
+					<range>98.16442365143851</range>
+					<tilt>2.595660029656298e-010</tilt>
+					<heading>0.000142350860720713</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-2.987342530279506,54.18895843924356,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Jardin des Doms, Avignon</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/46383080-d099-4450-98a9-6d15c1c16441.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM1M8Z">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>4.807697613943427</longitude>
+					<latitude>43.95301885165002</latitude>
+					<altitude>0</altitude>
+					<range>32.75914708134153</range>
+					<tilt>1.205283678723288e-009</tilt>
+					<heading>2.147953504845766e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>4.807672022945837,43.95303620373285,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Rillito Riverpark Sundial, Tucson, AZ</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/6c0bf495-b4fe-4549-a1c1-af8fb4328eae.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM1TC7">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-111.0075277787534</longitude>
+					<latitude>32.30113621710221</latitude>
+					<altitude>0</altitude>
+					<range>94.15682746212195</range>
+					<tilt>0</tilt>
+					<heading>2.968664599173171e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-111.0075933392788,32.30113929573149,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Helium Monument Sundial, Amarillo, TX</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/a0b45c91-a572-4ca1-8a9d-b5ebb84c028b.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM1WJY">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-101.9132978901728</longitude>
+					<latitude>35.19956726276647</latitude>
+					<altitude>0</altitude>
+					<range>60.53404995378031</range>
+					<tilt>5.162016480480558e-011</tilt>
+					<heading>3.00374135059527e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-101.9133182362553,35.19966266329223,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Hershey, Pennsylvania</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/fbb33ffa-3867-4f28-b12c-77bf647e1d13.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM1XC1">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-76.62980321024054</longitude>
+					<latitude>40.27170452963257</latitude>
+					<altitude>0</altitude>
+					<range>72.41553799015709</range>
+					<tilt>2.798231534250927e-010</tilt>
+					<heading>6.256605840320539e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-76.6298565862236,40.2718754812139,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>King Neptune Sundial, Hilton Head Island, South Carolina</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/e48230f9-b1fd-4cf6-bc81-7f0719cc13a5.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM2EY7">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-80.72801698168738</longitude>
+					<latitude>32.18076491029077</latitude>
+					<altitude>0</altitude>
+					<range>86.36647046692004</range>
+					<tilt>2.346233297172379e-010</tilt>
+					<heading>8.72178085589082e-006</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-80.72806102317654,32.18084680335104,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Jane Larue Memorial Sundial - Ann Arbor, Michigan</name>
+				<description><![CDATA[<p><img src="http://img.groundspeak.com/waymarking/display/936cd562-a97c-44bd-8ed5-fcdf2495076d.jpg"></p>
+
+<p>Image credit:<a href="http://www.waymarking.com/waymarks/WM290J">www.groundspeak.com</a></p>]]></description>
+				<LookAt>
+					<longitude>-83.66222470201295</longitude>
+					<latitude>42.30114702626376</latitude>
+					<altitude>0</altitude>
+					<range>26.29476256996721</range>
+					<tilt>0</tilt>
+					<heading>0.0001291940559531826</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy70</styleUrl>
+				<Point>
+					<coordinates>-83.66224748552365,42.30117333470928,0</coordinates>
+				</Point>
+			</Placemark>
+		</Folder>
+		<Folder>
+			<name>Schoolyard Sundials</name>
+			<Placemark>
+				<name>Sundial, Julius-Brecht-Allee, Bremen</name>
+				<LookAt>
+					<longitude>8.8674012861685</longitude>
+					<latitude>53.07651505713779</latitude>
+					<altitude>0</altitude>
+					<range>20.6687721420542</range>
+					<tilt>9.001122528249614e-011</tilt>
+					<heading>-0.00437506724289509</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>8.867391721405184,53.07654483342672,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Drebberstraße, Bremen</name>
+				<description><![CDATA[<p><img src="http://planetarium.hs-bremen.de/planetarium/pics/drebber.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>8.898052233187912</longitude>
+					<latitude>53.0400952944841</latitude>
+					<altitude>0</altitude>
+					<range>14.44345748598086</range>
+					<tilt>0</tilt>
+					<heading>-0.001637659480767247</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>8.898047664850367,53.04011230005033,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Butjadingersrasse, Bremen</name>
+				<description><![CDATA[<p><img src="http://planetarium.hs-bremen.de/planetarium/astroinfo/sonnenuhren/sonstige/butjadinger.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>8.759747956980032</longitude>
+					<latitude>53.08143879125452</latitude>
+					<altitude>0</altitude>
+					<range>37.83897098076405</range>
+					<tilt>0</tilt>
+					<heading>-0.002629545926081431</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>8.759712018733111,53.08151322706201,0</coordinates>
+				</Point>
+			</Placemark>
+		</Folder>
+		<Folder>
+			<name>In Progress</name>
+			<Placemark>
+				<name>Sundial, Greenwich, USA</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/345_ct_greenwich.jpg"></p>]]></description>
+				<LookAt>
+					<longitude>-73.61498302559443</longitude>
+					<latitude>41.02226092221508</latitude>
+					<altitude>0</altitude>
+					<range>149.2259168633856</range>
+					<tilt>1.357926888487057e-010</tilt>
+					<heading>-0.001539166856947675</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-73.61504279924034,41.022311140554,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sonnenuhr?</name>
+				<LookAt>
+					<longitude>11.05508326700377</longitude>
+					<latitude>49.45922489288633</latitude>
+					<altitude>0</altitude>
+					<range>50.88443884213967</range>
+					<tilt>8.335955203191607e-009</tilt>
+					<heading>0.0196675278275586</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>11.0551380716084,49.45927364486676,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Edgewood Park, New Haven, USA</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/279_ct_newha_eng.jpg"><p>
+
+<p><img src="http://www.sundials.org/registry/regphotos/279_ct_newha_eng2.jpg"><p>]]></description>
+				<LookAt>
+					<longitude>-72.95215163561284</longitude>
+					<latitude>41.31399188322968</latitude>
+					<altitude>0</altitude>
+					<range>154.2904142456261</range>
+					<tilt>0</tilt>
+					<heading>0.002187256502984029</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-72.95224192688632,41.31401837758977,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial, Pearl City, Oahu, USA</name>
+				<description><![CDATA[<p><img src="http://www.sundials.org/registry/regphotos/535_hi_pearlcity_uofhi_1.jpg" height="300px" width="450px"></p>]]></description>
+				<LookAt>
+					<longitude>-157.975920511215</longitude>
+					<latitude>21.39370171784438</latitude>
+					<altitude>0</altitude>
+					<range>93.82906502148613</range>
+					<tilt>0</tilt>
+					<heading>-0.001426474135915891</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-157.9759385077734,21.39376422631041,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial</name>
+				<description>http://maget.maget.free.fr/SiteMont/index.html</description>
+				<LookAt>
+					<longitude>-1.511135684750573</longitude>
+					<latitude>48.63640399624012</latitude>
+					<altitude>0</altitude>
+					<range>623.6899626138724</range>
+					<tilt>0</tilt>
+					<heading>-1.851737885201182e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-1.511518347366319,48.63786003229999,0</coordinates>
+				</Point>
+			</Placemark>
+			<GroundOverlay>
+				<name>Mont-Saint-Michel</name>
+				<description>http://maget.maget.free.fr/SiteMont/MSpage4.htm</description>
+				<Icon>
+					<href>http://maget.maget.free.fr/SiteMont/images/le_Mont_Solaire-Land%20Art.jpg</href>
+					<viewBoundScale>0.75</viewBoundScale>
+				</Icon>
+				<LatLonBox>
+					<north>48.63770978435333</north>
+					<south>48.6344604605756</south>
+					<east>-1.5070705975067</east>
+					<west>-1.514375149320612</west>
+					<rotation>-11.46597601725745</rotation>
+				</LatLonBox>
+			</GroundOverlay>
+			<Placemark>
+				<name>Sundial Park, Ludiver park</name>
+				<description>http://perso.orange.fr/cadrans.solaires/cadrans/cadran-parc-ludiver.html</description>
+				<LookAt>
+					<longitude>-1.727863357864637</longitude>
+					<latitude>49.63119498354116</latitude>
+					<altitude>0</altitude>
+					<range>473.1060190443535</range>
+					<tilt>3.883358970183465e-011</tilt>
+					<heading>0.0005701632901766135</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-1.728331456927833,49.63191584214422,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sonnenuhr?</name>
+				<LookAt>
+					<longitude>7.68545763101957</longitude>
+					<latitude>51.53642499090419</latitude>
+					<altitude>0</altitude>
+					<range>23.70363190324798</range>
+					<tilt>4.475657800962137e-010</tilt>
+					<heading>-0.1674345977313924</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>7.685416995069303,51.53648149450991,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>Sundial at Tower of London</name>
+				<description><![CDATA[<img src="http://gallery.ontopof-theworld.com/albums/photohunt/IMG_1031_t.jpg">]]></description>
+				<LookAt>
+					<longitude>-0.07656780337525181</longitude>
+					<latitude>51.50981727675416</latitude>
+					<altitude>0</altitude>
+					<range>61.73369699893549</range>
+					<tilt>9.251491983355112e-010</tilt>
+					<heading>0.009688876514144714</heading>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-0.07656780337525181,51.50981727675417,0</coordinates>
+				</Point>
+			</Placemark>
+			<Placemark>
+				<name>War Veterans' Memorial Park Sundial, Florida, United States</name>
+				<LookAt>
+					<longitude>-82.77333790901622</longitude>
+					<latitude>27.8036881517592</latitude>
+					<altitude>0</altitude>
+					<range>96.43655563554265</range>
+					<tilt>4.405141995417006e-010</tilt>
+					<heading>9.892674215924156e-005</heading>
+					<altitudeMode>relativeToGround</altitudeMode>
+				</LookAt>
+				<styleUrl>#msn_sunny_copy69</styleUrl>
+				<Point>
+					<coordinates>-82.77341348054247,27.80374932310448,0</coordinates>
+				</Point>
+			</Placemark>
+		</Folder>
+	</Folder>
+</Document>
+</kml>
diff --git a/examples/late-render.html b/examples/late-render.html
new file mode 100644
index 0000000..5decaed
--- /dev/null
+++ b/examples/late-render.html
@@ -0,0 +1,42 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Late Rendering Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>    
+    <script type="text/javascript">
+    
+        var map, layer;
+        function init(){
+            map = new OpenLayers.Map();
+            layer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}
+            );
+            map.addLayer(layer);
+            map.render("container_id");
+            map.zoomTo(2);
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Late Rendering</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrates how a map can be rendered to an empty container after
+        construction by calling the render method.
+    </p>
+    <div id="container_id" class="smallmap"></div>    
+    <div id="docs">
+        In cases where you need to create a map first and render it to some
+        container later, call the map constructor without a "div" argument.
+        In this case, you can provide the options object as the first argument.
+        To render your map to some container after construction, call the map's
+        render method with the container id.
+    </div>
+  </body>
+</html>
diff --git a/examples/layer-opacity.html b/examples/layer-opacity.html
new file mode 100644
index 0000000..b1a6686
--- /dev/null
+++ b/examples/layer-opacity.html
@@ -0,0 +1,89 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+      <title>OpenLayers Layer Opacity Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        body {
+            font-family: sans-serif;
+        }
+        p {
+            width: 512px;
+        }
+        a {
+            text-decoration: none;
+            color: black;
+            font-weight: bold;
+            font-size: 1.1em;
+        }
+        #opacity {
+            padding: 0;
+            text-align: center;
+            width: 2em;
+            font-family: sans-serif;
+            background: transparent;
+            color: black;
+            border: 0;
+        }
+        p.note {
+            font-style: italic;
+            font-size: 0.8em;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map = null;
+        var shade = null;
+        var maxOpacity = 0.9;
+        var minOpacity = 0.1;
+        function changeOpacity(byOpacity) {
+            var newOpacity = (parseFloat(OpenLayers.Util.getElement('opacity').value) + byOpacity).toFixed(1);
+            newOpacity = Math.min(maxOpacity,
+                                  Math.max(minOpacity, newOpacity));
+            OpenLayers.Util.getElement('opacity').value = newOpacity;
+            shade.setOpacity(newOpacity);
+        }
+        function init(){
+            var options = {
+                maxExtent: new OpenLayers.Bounds(-110.994, 45.885, -110.950, 45.929),
+                maxResolution: "auto"
+            };
+            map = new OpenLayers.Map('map', options);
+            var drg = new OpenLayers.Layer.WMS("Topo Maps",
+                "http://terraservice.net/ogcmap.ashx",
+                {layers: "DRG"});
+            shade = new OpenLayers.Layer.WMS("Shaded Relief",
+                "http://gisdata.usgs.gov/wmsconnector/com.esri.wms.Esrimap?ServiceName=USGS_EDC_Elev_NED_3",
+                {layers: "HR-NED.IMAGE", reaspect: "false", transparent: 'true'},
+                {isBaseLayer: false, opacity: 0.3});
+            map.addLayers([drg, shade]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Layer Opacity Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate a change in the opacity for an overlay layer.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p>
+            Note that if you also have the setOpacity method defined on the Layer
+            class, you can tweak the layer opacity after it has been added to the map.
+        </p>
+        <p>Opacity:
+            <a title="decrease opacity" href="javascript: changeOpacity(-0.1);"><<</a>
+            <input id="opacity" type="text" value="0.3" size="3" disabled="true" />
+            <a title="increase opacity" href="javascript: changeOpacity(0.1);">>></a>
+        </p>
+        <p class="note">IE users: Wait until the shade layer has finished loading to try this.</p>
+    </div>
+  </body>
+</html>
diff --git a/examples/layerLoadMonitoring.html b/examples/layerLoadMonitoring.html
new file mode 100644
index 0000000..2de324a
--- /dev/null
+++ b/examples/layerLoadMonitoring.html
@@ -0,0 +1,129 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Layer Load Monitoring Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #controls {
+            float: left;
+            text-align: right;
+        }
+        #eventsLogID {
+            text-align: left;
+            width: 350px;
+            height: 475px;
+            overflow: auto;
+            border: 1px solid black;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+
+            eventsLog = OpenLayers.Util.getElement("eventsLogID");
+
+            map = new OpenLayers.Map( 'map' );
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+
+            buffer0 = new OpenLayers.Layer.WMS( "WMS Buffer 0",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} ,
+                    { singleTile: false, buffer:0}
+            );
+            registerEvents(buffer0);
+
+            buffer1 = new OpenLayers.Layer.WMS( "WMS Buffer 1",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} ,
+                    { singleTile: false, buffer:1}
+            );
+            registerEvents(buffer1);
+
+            buffer2 = new OpenLayers.Layer.WMS( "WMS Buffer 2",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} ,
+                    { singleTile: false, buffer:2 }
+            );
+            registerEvents(buffer2);
+
+            singleTileLayer = new OpenLayers.Layer.WMS( "Single Tile Layer",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} ,
+                    { singleTile: true}
+            );
+            registerEvents(singleTileLayer);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        }
+
+        function registerEvents(layer) {
+
+            layer.logEvent = function(event) {
+                eventsLog.innerHTML += "<br>(" + getTimeStamp() + ") " +
+                                       this.name + ": " + event;
+            }
+
+            layer.events.register("loadstart", layer, function() {
+                this.logEvent("Load Start");
+            });
+
+            layer.events.register("tileloaded", layer, function() {
+                this.logEvent("Tile loaded. " + this.numLoadingTiles + " left.");
+            });
+
+            layer.events.register("loadend", layer, function() {
+                this.logEvent("Load End. Grid:" + this.grid.length + "x" + this.grid[0].length);
+            });
+
+            map.addLayer(layer);
+        }
+
+
+        function getTimeStamp() {
+            var date = new Date();
+
+            var timeParts = [
+                date.getHours(),
+                date.getMinutes(),
+                date.getSeconds()
+            ];
+
+            var timeStamp = timeParts.join(":");
+
+            return timeStamp;
+        }
+
+        function clearLog() {
+            eventsLog.innerHTML = "<b>Events Log:</b>";
+        }
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">Layer Load Monitoring Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+          Demonstrate a method for monitoring tile loading performance.
+      </p>
+
+    <div id="map" style="float:left;"></div>
+
+    <div id="controls">
+        <div id="eventsLogID">
+            <b>Events Log:</b>
+        </div>
+
+        <input type="button" value="Clear" onclick="clearLog()"/>
+    </div>
+
+    <div id="docs">
+    </div>
+  </body>
+</html>
diff --git a/examples/layerswitcher.html b/examples/layerswitcher.html
new file mode 100644
index 0000000..aaeb7c9
--- /dev/null
+++ b/examples/layerswitcher.html
@@ -0,0 +1,55 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+      <title>OpenLayers Layer Switcher Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            map = new OpenLayers.Map('map', { controls: [] });
+            map.addControl(new OpenLayers.Control.Navigation());
+
+            map.addControl(new OpenLayers.Control.LayerSwitcher({'div':OpenLayers.Util.getElement('layerswitcher')}));
+
+            var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}, {'displayInLayerSwitcher':false} );
+
+            var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
+                "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                {layers: "landsat7"}, {'isBaseLayer': false});
+
+            var dm_wms = new OpenLayers.Layer.WMS( "DM Solutions Demo",
+                "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
+                {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
+                         "prov_bound,fedlimit,rail,road,popplace",
+                 transparent: "true", format: "image/png" });
+
+            jpl_wms.setVisibility(false);
+            dm_wms.setVisibility(false);
+
+            map.addLayers([ol_wms, jpl_wms, dm_wms]);
+            if (!map.getCenter()) map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Layer Switcher Example</h1>
+
+    <div id="tags">
+    </div>
+
+    <p id="shortdesc">
+        Demonstrates the use of the LayerSwitcher outside of the OpenLayers window.
+    </p>
+
+    <div id="layerswitcher" class="olControlLayerSwitcher"></div>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+      <p>This demonstrates use of the LayerSwitcher outside the map div. It also shows use
+         of the displayInLayerSwitcher option on the Layer to cause it to not display in the
+         LayerSwitcher.</p>
+   </div>
+  </body>
+</html>
diff --git a/examples/lite.html b/examples/lite.html
new file mode 100644
index 0000000..721811d
--- /dev/null
+++ b/examples/lite.html
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Basic Single WMS Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        function init(){
+            map = new OpenLayers.Map( 'map' );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} );
+            map.addLayer(layer);
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Basic Single WMS Example</h1>
+
+    <div id="tags"></div>
+
+    <div id="shortdesc">Show a Simple Map</div>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        This example shows a very simple layout with minimal controls.  This example uses a single WMS base layer.
+    </div>
+  </body>
+</html>
diff --git a/examples/mapguide.html b/examples/mapguide.html
new file mode 100644
index 0000000..e5a3e21
--- /dev/null
+++ b/examples/mapguide.html
@@ -0,0 +1,150 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers MapGuide Layer Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #map {
+            width: 400px;
+            height: 400px;
+            border: 1px solid black;
+            float:left;
+        }
+        #map2 {
+            width: 400px;
+            height: 400px;
+            border: 1px solid black;
+            float:left;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+        var map, layer;
+        var url = "http://data.mapguide.com/mapguide/mapagent/mapagent.fcgi?USERNAME=Anonymous&";
+        //you can use this URL when MapGuide OS is installed locally
+        //var url = "/mapguide/mapagent/mapagent.fcgi?USERNAME=Anonymous&";
+        
+        //Adjust the scale assumptions for MapGuide layers
+        //Tiled layers MUST use a DPI value of 96, untiled layers can use a 
+        //different DPI value which will be passed to the server as a parameter.
+        //Tiled and untiled layers must adjust the OL INCHES_PER_UNIT values
+        //for any degree-based projections.
+        var metersPerUnit = 111319.4908;  //value returned from mapguide
+        var inPerUnit = OpenLayers.INCHES_PER_UNIT.m * metersPerUnit;
+        OpenLayers.INCHES_PER_UNIT["dd"] = inPerUnit;
+        OpenLayers.INCHES_PER_UNIT["degrees"] = inPerUnit;
+        OpenLayers.DOTS_PER_INCH = 96;
+        
+        //tiled version
+        function initTiled(){
+        
+            var extent = new OpenLayers.Bounds(-87.764987,43.691398,-87.695522,43.797520);
+            var tempScales = [100000,51794.74679,26826.95795,13894.95494,7196.85673,3727.59372,1930.69773,1000];
+            var mapOptions = {
+                maxExtent: extent, 
+                scales: tempScales
+            };
+            map = new OpenLayers.Map( 'map', mapOptions );
+            
+            var params = {
+              mapdefinition: 'Library://Samples/Sheboygan/MapsTiled/Sheboygan.MapDefinition',
+              basemaplayergroupname: "Base Layer Group"
+            }
+            var options = {
+              singleTile: false 
+            }
+            var layer = new OpenLayers.Layer.MapGuide( "MapGuide OS tiled layer", url, params, options );
+            map.addLayer(layer);
+            
+            /**
+            The following example shows how to access an MG tile cache directly
+            through HTTP bypassing the MG mapagent.  This depends on having a
+            pre-populated tile cache
+            */
+            /*
+            options.useHttpTile = true;
+            var cacheUrl = "http://localhost:8008/sheboygan";
+            var httpLayer = new OpenLayers.Layer.MapGuide( "MapGuide HTTP cache tiled layer", cacheUrl, params, options );
+            map.addLayer(httpLayer);
+            */
+
+            map.zoomToMaxExtent();
+        }
+
+        //un-tiled version
+        function initUntiled() {
+        
+          var extent = new OpenLayers.Bounds(-87.865114442365922,43.665065564837931,-87.595394059497067,43.823852564430069);
+          var mapOptions = {
+                maxExtent: extent, 
+                maxResolution: 'auto'
+          };
+          map = new OpenLayers.Map( 'map2', mapOptions );
+            
+          var options = {
+              isBaseLayer: true,
+              transitionEffect: "resize",
+              buffer: 1,
+              useOverlay: false,
+              useAsyncOverlay: false,
+              singleTile: true
+          };
+      
+          var params = {
+              mapdefinition: 'Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition'
+          };
+          /*
+          The MapGuide layer can also be created using mapname and session as follows provided there
+          is some wrapper code to obtain a valid session id and mapname */
+          /*
+          var params = {
+              mapname: 'Sheboygan49ad9e20e7171',
+              session: '7405c17a-0000-1000-8000-0017a4e6ff5d_en_7F0000010AFC0AFB0AFA'
+          };
+          */
+          
+          var layer = new OpenLayers.Layer.MapGuide( "MapGuide OS untiled baselayer", url, params, options );
+          map.addLayer(layer);
+          
+          //this is how to set up the layer for transparent overlays.  Requires a valid session ID 
+          //and mapName stored in that session.
+          /*
+            var options = {
+              isBaseLayer: false,
+              useOverlay: true,
+              useAsyncOverlay: false,
+              buffer: 1,
+              singleTile: true
+            };
+            var params = {
+              mapName: 'Sheboygan49aeaa04487af',
+              session: '208fd92c-0000-1000-8000-0017a4e6ff5d_en_7F0000010AFC0AFB0AFA',
+              selectioncolor: '0xFF000000',
+              behavior: 7
+            };
+            layer = new OpenLayers.Layer.MapGuide( "MapGuide OS Overlay layer", url, params, options );
+            map.addLayer(layer);
+            */
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+    }
+    </script>
+  </head>
+  <body onload="initUntiled(); initTiled()">
+    <h1 id="title">MapGuide Layer Example</h1>
+
+    <div id="tags">
+    </div>
+
+    <p id="shortdesc">
+        Demonstrates how to create MapGuide tiled and untiled layers.
+    </p>
+
+    <p>If prompted for a password, username is Anonymous and an empty password</p>
+    
+    <div id="map" class="smallmap"></div>
+    <div id="map2">
+    </div>
+  </body>
+</html>
diff --git a/examples/mapserver.html b/examples/mapserver.html
new file mode 100644
index 0000000..6d5411e
--- /dev/null
+++ b/examples/mapserver.html
@@ -0,0 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>MapServer Layer</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map' );
+            layer = new OpenLayers.Layer.MapServer( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'},
+                    {gutter: 15});
+            map.addLayer(layer);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+        }
+        
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">MapServer Layer</h1>
+    <div id="tags"></div>
+    <div id="shortdesc">Shows MapServer Layer</div>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+        This is an example of using a MapServer Layer with a gutter parameter.  The gutter parameter is used to try to limit the edge effects between tiles.
+    </div>
+  </body>
+</html>
diff --git a/examples/mapserver_untiled.html b/examples/mapserver_untiled.html
new file mode 100644
index 0000000..27fc954
--- /dev/null
+++ b/examples/mapserver_untiled.html
@@ -0,0 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>MapServer Single Tile Mode</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #map {
+            width: 100%;
+            height: 100%;
+            border: 1px solid black;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        window.onload = function(){
+            map = new OpenLayers.Map( 'map', {maxResolution: 'auto'} );
+            var layer = new OpenLayers.Layer.MapServer( "MapServer Untiled", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'}, {singleTile: true} );
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+        }
+    </script>
+  </head>
+  <body>
+    <h1 id="title">MapServer Single Tile Mode</h1>
+    <div id="tags"></div>
+    <div id="shortdesc">Shows single tile MapServer Layer</div>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+        This shows an example of using a MapServer Layer in single tile mode.  Single tile mode can be useful when pulling data from dynamic sources.
+    </div>
+  </body>
+</html>
diff --git a/examples/marker-shadow.html b/examples/marker-shadow.html
new file mode 100644
index 0000000..a8b4018
--- /dev/null
+++ b/examples/marker-shadow.html
@@ -0,0 +1,142 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Vector Graphics with Shadows</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .smallmap {
+            width: 300px;
+        }
+        
+        .docs {
+            padding: 0px 5px;
+        }
+        
+        td {
+            vertical-align: top;
+        }
+        
+    </style>
+    <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+    <script type="text/javascript">
+        
+        var SHADOW_Z_INDEX = 10;
+        var MARKER_Z_INDEX = 11;
+        
+        var DIAMETER = 200;
+        var NUMBER_OF_FEATURES = 15;
+            
+        var map, layer;   
+            
+        function init() {
+            map = new OpenLayers.Map("map");
+            
+            layer = new OpenLayers.Layer.Vector(
+                "Marker Drop Shadows",
+                {
+                    styleMap: new OpenLayers.StyleMap({
+                        // Set the external graphic and background graphic images.
+                        externalGraphic: "../img/marker-gold.png",
+                        backgroundGraphic: "./marker_shadow.png",
+                        
+                        // Makes sure the background graphic is placed correctly relative
+                        // to the external graphic.
+                        backgroundXOffset: 0,
+                        backgroundYOffset: -7,
+                        
+                        // Set the z-indexes of both graphics to make sure the background
+                        // graphics stay in the background (shadows on top of markers looks
+                        // odd; let's not do that).
+                        graphicZIndex: MARKER_Z_INDEX,
+                        backgroundGraphicZIndex: SHADOW_Z_INDEX,
+                        
+                        pointRadius: 10
+                    }),
+                    isBaseLayer: true,
+                    rendererOptions: {yOrdering: true}
+                }
+            );
+            
+            map.addLayers([layer]);
+            
+            // Add a drag feature control to move features around.
+            var dragFeature = new OpenLayers.Control.DragFeature(layer);
+            
+            map.addControl(dragFeature);
+            
+            dragFeature.activate();
+                        
+            map.zoomToMaxExtent();
+            
+            drawFeatures();
+        }
+        
+        function drawFeatures() {
+            
+            layer.removeFeatures(layer.features);
+            
+            // Create features at random around the center.
+            var center = map.getViewPortPxFromLonLat(map.getCenter());
+            
+            // Add the ordering features. These are the gold ones that all have the same z-index
+            // and succomb to y-ordering.
+            var features = [];
+            
+            for (var index = 0; index < NUMBER_OF_FEATURES; index++) {
+                // Calculate a random x/y. Subtract half the diameter to make some
+                // features negative.
+                var x = (parseInt(Math.random() * DIAMETER)) - (DIAMETER / 2);
+                var y = (parseInt(Math.random() * DIAMETER)) - (DIAMETER / 2);
+                
+                var pixel = new OpenLayers.Pixel(center.x + x, center.y + y);
+                
+                var lonLat = map.getLonLatFromViewPortPx(pixel);
+                features.push(
+                    new OpenLayers.Feature.Vector(
+                        new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat)
+                    )
+                );
+            }
+            
+            layer.addFeatures(features);
+        }
+        
+    </script>
+  </head>
+  <body onload="init()">
+        <h1 id="title">Marker Shadows using Background Graphics/Z-Indexes</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+           This example shows off marker shadows using background graphics and z-indexes. Move the features around to show the shadows' interaction.
+        </p>
+        
+        <br>
+
+        <table>
+            <tr>
+                <td>
+                    <div id="map" class="smallmap"></div>
+                </td>
+                <td>
+                    <div class="docs">
+                        The features in this map were generated at random. Each of these features have a <i>backgroundGraphic</i> property set in the style map to add a shadow image. Note that the background graphics are not duplicated features with a different style.
+                        <br><br>
+                        The shadows were set to have a different z-index than the markers themselves, using the <i>backgroundGraphicZIndex</i> property. This makes sure all shadows stay behind the markers, keeping a clean look. The shadows were also placed nicely relative to the external graphic using the <i>backgroundXOffset</i> and <i>backgroundYOffset</i> property.
+                        <br><br>
+                        Y-ordering on the layer is enabled. See the <a href="./ordering.html">ordering example</a>.
+                    </div>
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <button onclick="drawFeatures()">Redraw Features</button>
+                </td>
+            </tr>
+        </table>
+        
+        
+    </body>
+</html>
diff --git a/examples/markerResize.html b/examples/markerResize.html
new file mode 100644
index 0000000..a6105c3
--- /dev/null
+++ b/examples/markerResize.html
@@ -0,0 +1,51 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Resize a Marker</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        var size, icon;
+        
+        function init(){
+            map = new OpenLayers.Map('map');
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+                
+            map.addLayer(layer);
+            var markers = new OpenLayers.Layer.Markers( "Markers" );
+            map.addLayer(markers);
+
+            size = new OpenLayers.Size(21, 25);
+            calculateOffset = function(size) {
+                        return new OpenLayers.Pixel(-(size.w/2), -size.h); };
+            icon = new OpenLayers.Icon(
+                'http://www.openlayers.org/dev/img/marker.png',
+                size, null, calculateOffset);
+            markers.addMarker(
+                new OpenLayers.Marker(new OpenLayers.LonLat(-71,40), icon));
+
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+        }
+
+        function resize() {
+         
+            size = new OpenLayers.Size(size.w + 10, size.h + 10);
+            icon.setSize(size);   
+            
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Resize a Marker</h1>
+    <div id="tags"></div>
+    <div id="shortdesc">Dynamically resize a marker</div>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+        This example shows how to create a OpenLayers.Layer.Markers layer, add an icon, put it into a marker, and add the marker to the layer.  Once the marker has been added it is possible to use setSize() on the icon in order to resize the marker.
+    </div>
+    <div style="background-color:purple" onclick="resize()"> click to resize marker</div>
+  </body>
+</html>
diff --git a/examples/marker_shadow.png b/examples/marker_shadow.png
new file mode 100644
index 0000000..a5afa6e
Binary files /dev/null and b/examples/marker_shadow.png differ
diff --git a/examples/markers.html b/examples/markers.html
new file mode 100644
index 0000000..cf988b6
--- /dev/null
+++ b/examples/markers.html
@@ -0,0 +1,53 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Markers Layer Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+
+        function init(){
+            OpenLayers.ProxyHost="/proxy/?url=";
+            map = new OpenLayers.Map('map');
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+                
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+
+            var newl = new OpenLayers.Layer.Text( "text", { location:"./textfile.txt"} );
+            map.addLayer(newl);
+
+            var markers = new OpenLayers.Layer.Markers( "Markers" );
+            map.addLayer(markers);
+
+            var size = new OpenLayers.Size(21,25);
+            var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
+            var icon = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png',size,offset);
+            markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon));
+
+            var halfIcon = icon.clone();
+            markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,45),halfIcon));
+
+            marker = new OpenLayers.Marker(new OpenLayers.LonLat(90,10),icon.clone());
+            marker.setOpacity(0.2);
+            marker.events.register('mousedown', marker, function(evt) { alert(this.icon.url); OpenLayers.Event.stop(evt); });
+            markers.addMarker(marker); 
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+
+            halfIcon.setOpacity(0.5);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Markers Layer Example</h1>
+    <div id="tags"></div>
+    <div id="shortdesc">Show markers layer with different markers</div>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+        This is an example of an OpenLayers.Layers.Markers layer that shows some examples of adding markers.  Also demonstrated is registering a mousedown effect on a marker.
+    </div>
+  </body>
+</html>
diff --git a/examples/markersTextLayer.html b/examples/markersTextLayer.html
new file mode 100644
index 0000000..2a63c37
--- /dev/null
+++ b/examples/markersTextLayer.html
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Using a Layer.Text to display markers</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+
+        function init(){
+            OpenLayers.ProxyHost="/proxy/?url=";
+            map = new OpenLayers.Map('map');
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+                
+            map.addLayer(layer);
+
+            var newl = new OpenLayers.Layer.Text( "text", {location: "./textfile.txt"} );
+            map.addLayer(newl);
+
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Using a Layer.Text to display markers</h1>
+    <p id="shortdesc">
+      The Layer.Text class reads a Tab seperated values file and displays it as markers on
+      the map.
+    </p>  
+    <div id="map" class="smallmap"></div>
+  </body>
+</html>
diff --git a/examples/measure.html b/examples/measure.html
new file mode 100644
index 0000000..23e963c
--- /dev/null
+++ b/examples/measure.html
@@ -0,0 +1,173 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #controlToggle li {
+            list-style: none;
+        }
+        p {
+            width: 512px;
+        }
+        #options {
+            position: relative;
+            width: 512px;
+        }
+        #output {
+            float: right;
+        }
+
+        /* avoid pink tiles */
+        .olImageLoadError {
+            background-color: transparent !important;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, measureControls;
+        function init(){
+            map = new OpenLayers.Map('map');
+            
+            var wmsLayer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'}); 
+
+            map.addLayers([wmsLayer]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.MousePosition());
+            
+            // style the sketch fancy
+            var sketchSymbolizers = {
+                "Point": {
+                    pointRadius: 4,
+                    graphicName: "square",
+                    fillColor: "white",
+                    fillOpacity: 1,
+                    strokeWidth: 1,
+                    strokeOpacity: 1,
+                    strokeColor: "#333333"
+                },
+                "Line": {
+                    strokeWidth: 3,
+                    strokeOpacity: 1,
+                    strokeColor: "#666666",
+                    strokeDashstyle: "dash"
+                },
+                "Polygon": {
+                    strokeWidth: 2,
+                    strokeOpacity: 1,
+                    strokeColor: "#666666",
+                    fillColor: "white",
+                    fillOpacity: 0.3
+                }
+            };
+            var style = new OpenLayers.Style();
+            style.addRules([
+                new OpenLayers.Rule({symbolizer: sketchSymbolizers})
+            ]);
+            var styleMap = new OpenLayers.StyleMap({"default": style});
+            
+            measureControls = {
+                line: new OpenLayers.Control.Measure(
+                    OpenLayers.Handler.Path, {
+                        persist: true,
+                        handlerOptions: {
+                            layerOptions: {styleMap: styleMap}
+                        }
+                    }
+                ),
+                polygon: new OpenLayers.Control.Measure(
+                    OpenLayers.Handler.Polygon, {
+                        persist: true,
+                        handlerOptions: {
+                            layerOptions: {styleMap: styleMap}
+                        }
+                    }
+                )
+            };
+            
+            var control;
+            for(var key in measureControls) {
+                control = measureControls[key];
+                control.events.on({
+                    "measure": handleMeasurements,
+                    "measurepartial": handleMeasurements
+                });
+                map.addControl(control);
+            }
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+            
+            document.getElementById('noneToggle').checked = true;
+        }
+        
+        function handleMeasurements(event) {
+            var geometry = event.geometry;
+            var units = event.units;
+            var order = event.order;
+            var measure = event.measure;
+            var element = document.getElementById('output');
+            var out = "";
+            if(order == 1) {
+                out += "measure: " + measure.toFixed(3) + " " + units;
+            } else {
+                out += "measure: " + measure.toFixed(3) + " " + units + "<sup>2</" + "sup>";
+            }
+            element.innerHTML = out;
+        }
+
+        function toggleControl(element) {
+            for(key in measureControls) {
+                var control = measureControls[key];
+                if(element.value == key && element.checked) {
+                    control.activate();
+                } else {
+                    control.deactivate();
+                }
+            }
+        }
+        
+        function toggleGeodesic(element) {
+            for(key in measureControls) {
+                var control = measureControls[key];
+                control.geodesic = element.checked;
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Measure Example</h1>
+    <p id="shortdesc">
+        Demonstrates the measure control to measure distances and areas.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <div id="options">
+        <div id="output">
+        </div>
+        <ul id="controlToggle">
+            <li>
+                <input type="radio" name="type" value="none" id="noneToggle"
+                       onclick="toggleControl(this);" checked="checked" />
+                <label for="noneToggle">navigate</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="line" id="lineToggle" onclick="toggleControl(this);" />
+                <label for="lineToggle">measure distance</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
+                <label for="polygonToggle">measure area</label>
+            </li>
+            <li>
+                <input type="checkbox" name="geodesic" id="geodesicToggle" onclick="toggleGeodesic(this);" />
+                <label for="geodesicToggle">use geodesic measures</label>
+            </li>
+        </ul>
+        <p>Note that the geometries drawn are planar geometries and the
+        metrics returned by the measure control are planar measures by
+        default.  If your map is in a geographic projection or you have the
+        appropriate projection definitions to transform your geometries into
+        geographic coordinates, you can set the "geodesic" property of the control
+        to true to calculate geodesic measures instead of planar measures.</p>
+    </div>
+  </body>
+</html>
diff --git a/examples/mm.html b/examples/mm.html
new file mode 100644
index 0000000..305d3c2
--- /dev/null
+++ b/examples/mm.html
@@ -0,0 +1,60 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>MultiMap</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #map {
+            width: 100%;
+            height: 512px;
+            border: 1px solid black;
+        }
+    </style>
+
+
+    <script type="text/javascript" src="http://clients.multimap.com/API/maps/1.1/metacarta_04"></script>
+
+
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, mmlayer, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map' , 
+            {controls:[new OpenLayers.Control.MouseDefaults()]});
+
+            mmlayer = new OpenLayers.Layer.MultiMap( "MultiMap");
+            map.addLayer(mmlayer);
+            
+            markers = new OpenLayers.Layer.Markers("markers");
+            map.addLayer(markers);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+            map.addControl( new OpenLayers.Control.PanZoomBar() );
+        }
+        
+        function add() {
+            
+            marker = new OpenLayers.Marker(new OpenLayers.LonLat(2, 41));
+            markers.addMarker(marker);
+        }
+
+        function remove() {
+            markers.removeMarker(marker);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">MultiMap Example</h1>
+    <p id="shortdesc">
+      An example of using the Layer.MultiMap class.
+    </p>  
+    <div id="map" class="smallmap"></div>
+    <div style="background-color:green" onclick="add()"> click to add the marker to the map</div>
+    <div style="background-color:red" onclick="remove()"> click to remove the marker from the map</div>
+  </body>
+</html>
diff --git a/examples/modify-feature.html b/examples/modify-feature.html
new file mode 100644
index 0000000..b09ad35
--- /dev/null
+++ b/examples/modify-feature.html
@@ -0,0 +1,172 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Modify Feature</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #controls {
+            width: 512px;
+        }
+        #controlToggle {
+            padding-left: 1em;
+        }
+        #controlToggle li {
+            list-style: none;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, vectors, controls;
+        function init(){
+            map = new OpenLayers.Map('map');
+            var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'}); 
+            OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
+            vectors = new OpenLayers.Layer.Vector("Vector Layer");
+
+            map.addLayers([wms, vectors]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.MousePosition());
+            
+            function report(event) {
+                OpenLayers.Console.log(event.type, event.feature ? event.feature.id : event.components);
+            }
+            vectors.events.on({
+                "beforefeaturemodified": report,
+                "featuremodified": report,
+                "afterfeaturemodified": report,
+                "vertexmodified": report,
+                "sketchmodified": report,
+                "sketchstarted": report,
+                "sketchcomplete": report
+            });
+            controls = {
+                point: new OpenLayers.Control.DrawFeature(vectors,
+                            OpenLayers.Handler.Point),
+                line: new OpenLayers.Control.DrawFeature(vectors,
+                            OpenLayers.Handler.Path),
+                polygon: new OpenLayers.Control.DrawFeature(vectors,
+                            OpenLayers.Handler.Polygon),
+                regular: new OpenLayers.Control.DrawFeature(vectors,
+                            OpenLayers.Handler.RegularPolygon,
+                            {handlerOptions: {sides: 5}}),
+                modify: new OpenLayers.Control.ModifyFeature(vectors)
+            };
+            
+            for(var key in controls) {
+                map.addControl(controls[key]);
+            }
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+            document.getElementById('noneToggle').checked = true;
+        }
+        
+        function update() {
+            // reset modification mode
+            controls.modify.mode = OpenLayers.Control.ModifyFeature.RESHAPE;
+            var rotate = document.getElementById("rotate").checked;
+            if(rotate) {
+                controls.modify.mode |= OpenLayers.Control.ModifyFeature.ROTATE;
+            }
+            var resize = document.getElementById("resize").checked;
+            if(resize) {
+                controls.modify.mode |= OpenLayers.Control.ModifyFeature.RESIZE;
+                var keepAspectRatio = document.getElementById("keepAspectRatio").checked;
+                if (keepAspectRatio) {
+                    controls.modify.mode &= ~OpenLayers.Control.ModifyFeature.RESHAPE;
+                }
+            }
+            var drag = document.getElementById("drag").checked;
+            if(drag) {
+                controls.modify.mode |= OpenLayers.Control.ModifyFeature.DRAG;
+            }
+            if (rotate || drag) {
+                controls.modify.mode &= ~OpenLayers.Control.ModifyFeature.RESHAPE;
+            }
+            var sides = parseInt(document.getElementById("sides").value);
+            sides = Math.max(3, isNaN(sides) ? 0 : sides);
+            controls.regular.handler.sides = sides;
+            var irregular =  document.getElementById("irregular").checked;
+            controls.regular.handler.irregular = irregular;
+        }
+
+        function toggleControl(element) {
+            for(key in controls) {
+                var control = controls[key];
+                if(element.value == key && element.checked) {
+                    control.activate();
+                } else {
+                    control.deactivate();
+                }
+            }
+        }
+        
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Modify Feature Example</h1>
+    <div id="shortdesc">A demonstration of the ModifyFeature control for editing vector features.</div>
+    <div id="map" class="smallmap"></div>
+    <div id="controls">
+        <ul id="controlToggle">
+            <li>
+                <input type="radio" name="type" value="none" id="noneToggle"
+                       onclick="toggleControl(this);" checked="checked" />
+                <label for="noneToggle">navigate</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="point" id="pointToggle" onclick="toggleControl(this);" />
+                <label for="pointToggle">draw point</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="line" id="lineToggle" onclick="toggleControl(this);" />
+                <label for="lineToggle">draw line</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
+                <label for="polygonToggle">draw polygon</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="regular" id="regularToggle" onclick="toggleControl(this);" />
+                <label for="regularToggle">draw regular polygon</label>
+                <label for="sides"> - sides</label>
+                <input id="sides" type="text" size="2" maxlength="2"
+                       name="sides" value="5" onchange="update()" />
+                <ul>
+                    <li>
+                        <input id="irregular" type="checkbox"
+                               name="irregular" onchange="update()" />
+                        <label for="irregular">irregular</label>
+                    </li>
+                </ul>
+            </li>
+            <li>
+                <input type="radio" name="type" value="modify" id="modifyToggle"
+                       onclick="toggleControl(this);" />
+                <label for="modifyToggle">modify feature</label>
+                <ul>
+                    <li>
+                        <input id="rotate" type="checkbox"
+                               name="rotate" onchange="update()" />
+                        <label for="rotate">allow rotation</label>
+                    </li>
+                    <li>
+                        <input id="resize" type="checkbox"
+                               name="resize" onchange="update()" />
+                        <label for="resize">allow resizing</label>
+                        (<input id="keepAspectRatio" type="checkbox"
+                               name="keepAspectRatio" onchange="update()" checked="checked" />
+                        <label for="keepAspectRatio">keep aspect ratio</label>)
+                    </li>
+                    <li>
+                        <input id="drag" type="checkbox"
+                               name="drag" onchange="update()" />
+                        <label for="drag">allow dragging</label>
+                    </li>
+                </ul>
+            </li>
+        </ul>
+    </div>
+  </body>
+</html>
diff --git a/examples/mouse-position.html b/examples/mouse-position.html
new file mode 100644
index 0000000..c9427a6
--- /dev/null
+++ b/examples/mouse-position.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" debug="true">
+  <head>
+    <title>MousePosition Control</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            var map = new OpenLayers.Map('map');
+
+            map.addControl(new OpenLayers.Control.MousePosition());
+
+            var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'} );
+
+            map.addLayers([ol_wms]);
+            if (!map.getCenter()) map.zoomToMaxExtent();
+            
+            map.events.register("mousemove", map, function(e) { 
+                var position = this.events.getMousePosition(e);
+                OpenLayers.Util.getElement("coords").innerHTML = position;
+            });
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">MousePosition Control</h1>
+    <p id="shortdesc">
+      Use the MousePosition Control to display the coordinates of the cursor
+      inside or outside the map div.
+    </p>  
+    <div id="map" class="smallmap"></div>
+    <div id="coords"></div>
+    <p>Moving your mouse to the upper left corner of this map should return 'x=0,y=0' -- in the past, it didn't in IE. If it returns 2,2, consider it a bug, and report it.</p> 
+  </body>
+</html>
diff --git a/examples/mousewheel-interval.html b/examples/mousewheel-interval.html
new file mode 100644
index 0000000..0d5172b
--- /dev/null
+++ b/examples/mousewheel-interval.html
@@ -0,0 +1,57 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Mousewheel Interval Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+
+        function setCumulative() {
+            var nav = map.getControlsByClass("OpenLayers.Control.Navigation")[0];
+            var cumulative = document.getElementById("cumulative");
+            nav.handlers.wheel.cumulative = cumulative.checked;
+        }
+
+        function init(){
+            map = new OpenLayers.Map( 'map', {controls: [
+                new OpenLayers.Control.Navigation(
+                    {mouseWheelOptions: {interval: 100}}
+                ),
+                new OpenLayers.Control.PanZoom(),
+                new OpenLayers.Control.ArgParser(),
+                new OpenLayers.Control.Attribution()
+            ]} );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} );
+            map.addLayer(layer);
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Mousewheel Interval Example</h1>
+
+    <div id="tags"></div>
+
+    <div id="shortdesc">Let OpenLayers send less tile requests to the server when wheel-zooming.</div>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p>This example shows how to configure the Navigation control to use 
+        the mousewheel in a less server resource consuming way: as long as you
+        spin the mousewheel, no request will be sent to the server. Instead,
+        the zoomlevel delta will be recorded. After a delay (in this example
+        100ms), a zoom action with the cumulated delta will be performed.</p>
+        <div>
+          <input id="cumulative" type="checkbox" checked="checked"
+                 onchange="setCumulative()"/>
+          <label for="cumulative">Cumulative mode. If this mode is deactivated, 
+            only one zoom event will be performed after the delay.</label>
+        </div>
+
+    </div>
+  </body>
+</html>
diff --git a/examples/multimap-mercator.html b/examples/multimap-mercator.html
new file mode 100644
index 0000000..1131004
--- /dev/null
+++ b/examples/multimap-mercator.html
@@ -0,0 +1,64 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>MultiMap SphericalMercator</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #map {
+            width: 100%;
+            height: 512px;
+            border: 1px solid gray;
+        }
+    </style>
+
+
+    <!-- multimap api key for http://(www.)openlayers.org -->
+    <script type="text/javascript" src="http://developer.multimap.com/API/maps/1.2/OA10072915821139765"></script>
+
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+ 
+        var map, ve, merc, vector;
+
+        function init(){
+            var options = {
+                projection: "EPSG:900913",
+                units: "m",
+                maxResolution: 156543.0339,
+                maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
+                                                 20037508, 20037508)
+            };
+            map = new OpenLayers.Map('map', options);
+
+            ve = new OpenLayers.Layer.MultiMap(
+                "multimap",
+                {'sphericalMercator': true}
+            ); 
+            merc = new OpenLayers.Layer.WMS("World Map",
+                                            "http://maps.opengeo.org/geowebcache/service/wms",
+                                            {'layers': 'bluemarble'},
+                                            {'opacity': 0.4,
+                                             'isBaseLayer': false,
+                                             'wrapDateLine': true});
+
+            // create a vector layer for drawing
+            vector = new OpenLayers.Layer.Vector("Editable Vectors");
+            
+            map.addLayers([ve, merc, vector]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.EditingToolbar(vector));
+            map.zoomToMaxExtent()
+        }
+        
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">MultiMap Mercator Example</h1>
+    <p id="shortdesc">
+      This sphericalMercator example using multimap demonstrates that the
+      multimap layer does not fully support the sphericalMercator projection at
+      this time.
+    </p>  
+    <div id="map" class="smallmap"></div>
+  </body>
+</html>
diff --git a/examples/multiserver.html b/examples/multiserver.html
new file mode 100644
index 0000000..4ec7072
--- /dev/null
+++ b/examples/multiserver.html
@@ -0,0 +1,41 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Tiles from Multiple Servers</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map' );
+            
+            var urlArray = ["http://tilecache.osgeo.org/wms-c/Basic.py",
+                            "http://tilecache.osgeo.org/wms-c/Basic.py"];
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                                              urlArray,
+                                              {layers: 'basic'} );
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Multiple Server URLS</h1>
+
+  <div id="tags">
+  </div>
+  <p id="shortdesc">
+      Load your tiles faster by pointing to the same server, but with different urls
+  </p>
+
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+    Browsers typically limit the number of concurrent requests to the same server, based on hostname. In order to ake tiles load more quickly, it often makes sense to distribute requests over multiple hostnames to achieve more concurrency. Typically, browsers perform best with 3 different hostnames -- your performance may vary. (For example, if your server can't handle more than 2 requests simultaneously, then additional hostnames will not help you.)    
+   </div>
+   
+  </body>
+</html>
diff --git a/examples/mvs.html b/examples/mvs.html
new file mode 100644
index 0000000..bacd5de
--- /dev/null
+++ b/examples/mvs.html
@@ -0,0 +1,125 @@
+<html>
+<!-- 
+     This probably needs to be renamed index.html for deployment.
+     Specifically, it needs to be the default page for whatever
+     directory it is in.
+-->
+<head>
+
+    <!-- this gmaps key generated for http://openlayers.org/dev/ -->
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghSPUCi5aRYVveCcVYxzezM4iaj_gxQ9t-UajFL70jfcpquH5l1IJ-Zyyw'></script>
+    <!-- Localhost key -->
+     <!--<script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTS6gjckBmeABOGXIUiOiZObZESPg'></script>-->
+<script src="http://openlayers.org/dev/lib/OpenLayers.js"></script>
+
+<script>
+
+function runMVS() {
+    OpenLayers.ProxyHost = '/proxy/?url='; 
+    if (document.location.protocol != "file:") {
+        theArgs = OpenLayers.Util.getParameters();
+    } else {
+        theArgs = {};
+        theArgs.center = "0,0";
+        theArgs.zoom = "0";            
+        theArgs.data = "textfile.txt";
+        theArgs.controls = 'panzoom,mouse';
+        theArgs.layers = 'openlayers';
+    }
+
+
+    // ----
+    // TODO: Handle all this parsing better.
+    var safeArgs = {}
+
+    var DEFAULT_LAT = 0;
+    var DEFAULT_LON = 0;
+    var DEFAULT_ZOOM_LEVEL = 0;
+    var DEFAULT_CONTROLS = ['panzoom','mouse'];
+    var DEFAULT_LAYERS = ['openlayers'];
+    
+    var IDX_LAT = 0;
+    var IDX_LON = 1;
+
+    safeArgs.centerLat = theArgs.center ? 
+        parseFloat(theArgs.center.split(",")[IDX_LAT]) : DEFAULT_LAT;
+    
+    safeArgs.centerLon = theArgs.center ? 
+        parseFloat(theArgs.center.split(",")[IDX_LON]) : DEFAULT_LON;
+
+    safeArgs.zoom = theArgs.zoom ? parseInt(theArgs.zoom) : DEFAULT_ZOOM_LEVEL;
+    
+    safeArgs.controls = theArgs.controls ? 
+        theArgs.controls.split(",") : DEFAULT_CONTROLS;
+    
+    safeArgs.layers = theArgs.layers ? 
+        theArgs.layers.split(",") : DEFAULT_LAYERS;
+    
+    safeArgs.data = theArgs.data; // TODO: Make this "safe".
+    safeArgs.marker = theArgs.marker; // TODO: Make this "safe".
+    
+    // -----
+    var theMVS = new OpenLayers.Map('map', {controls: [], maxResolution: 'auto'});
+    for(var i = 0; i < safeArgs.controls.length; i++) {
+        switch(safeArgs.controls[i]) {
+            case 'panzoombar':
+                theMVS.addControl(new OpenLayers.Control.PanZoomBar());
+                break;
+            case 'panzoom':
+                theMVS.addControl(new OpenLayers.Control.PanZoom());
+                break;
+            case 'layerswitcher':
+                theMVS.addControl(new OpenLayers.Control.LayerSwitcher());
+                break;
+            case 'mouse':
+                theMVS.addControl(new OpenLayers.Control.MouseDefaults());
+                break;
+        }
+    }
+    for(var i = 0; i < safeArgs.layers.length; i++) {
+        switch(safeArgs.layers[i]) {
+            case 'openlayers':
+                theMVS.addLayer(
+                  new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                        "http://vmap0.tiles.osgeo.org/wms/vmap0", 
+                        {layers: 'basic'} )
+                  );
+                break;
+            case 'nasa': 
+                theMVS.addLayer(
+                    new OpenLayers.Layer.WMS("NASA Mosaic", 
+                       "http://t1.hypercube.telascience.org/cgi-bin/landsat7",
+                       {"EXCEPTIONS" : "application/vnd.ogc.se_inimage",
+                        "format" : "image/jpeg",
+                        layers:"landsat7"}
+                       ));
+                break;
+            case 'gmaps':
+                theMVS.addLayer(
+                    new OpenLayers.Layer.Google( "Google" , {type: G_HYBRID_MAP })
+                );
+                break;
+        }
+    }
+    theMVS.setCenter(new OpenLayers.LonLat(safeArgs.centerLon, safeArgs.centerLat), safeArgs.zoom);
+
+    if (safeArgs.marker) {
+        var m = new OpenLayers.Layer.Markers("Marker");
+        m.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(safeArgs.centerLon, safeArgs.centerLat)));
+        theMVS.addLayer(m);
+    }
+    if (safeArgs.data) {
+        theMVS.addLayer(new OpenLayers.Layer.Text("Data", {location: safeArgs.data}));
+    }
+
+}
+</script>
+</head>
+<body style="margin:0px;"
+      onload="runMVS();">
+<div id="map"
+     style="width: 100%; height: 100%;
+            background: lightyellow;
+           "></div>
+</body>
+</html>
diff --git a/examples/navigation-control.html b/examples/navigation-control.html
new file mode 100644
index 0000000..d41b2df
--- /dev/null
+++ b/examples/navigation-control.html
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Navigation Control</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        function init(){
+            map = new OpenLayers.Map( 'map', { controls: [] });
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} );
+            map.addLayer(layer);
+            nav = new OpenLayers.Control.Navigation({'zoomWheelEnabled': false});
+            map.addControl(nav);
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Navigation Control</h1>
+
+    <div id="tags"></div>
+
+    <div id="shortdesc">Demonstrate Navigation Control features</div>
+
+    <div id="map" class="smallmap"></div>
+    <a href="#" onclick="nav.enableZoomWheel();return false">Turn on Wheel Zoom</a> | <a href="#" onclick="nav.disableZoomWheel(); return false;">Turn off Wheel Zoom</a>
+    <div id="docs">
+        This example demonstrates a couple features of the Navigation control. The Navigation control controls most map dragging, movement, zooming, etc. In this case, we have a demonstration of how to create a navigation control with no zoom wheel action, which can then be enabled or disabled by the user.
+    </div>
+  </body>
+</html>
diff --git a/examples/navigation-history.html b/examples/navigation-history.html
new file mode 100644
index 0000000..2698c3e
--- /dev/null
+++ b/examples/navigation-history.html
@@ -0,0 +1,57 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Navigation History Example</title>
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style>
+            #panel {
+                right: 0px;
+                height: 30px; 
+                width: 200px;
+            }
+            #panel div { 
+                float: left;
+                margin: 5px;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map, nav, panel;
+
+            function init() {
+                map = new OpenLayers.Map('map');
+
+                nav = new OpenLayers.Control.NavigationHistory();
+                // parent control must be added to the map
+                map.addControl(nav);
+
+                panel = new OpenLayers.Control.Panel(
+                    {div: document.getElementById("panel")}
+                );
+                panel.addControls([nav.next, nav.previous]);
+                map.addControl(panel);
+                
+                var layer = new OpenLayers.Layer.WMS(
+                    "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'}
+                );
+                map.addLayer(layer);
+                map.zoomToMaxExtent();
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Map Navigation History Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            A control for zooming to previous and next map extents.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+        Map navigation history controls<div id="panel"></div>
+        <div id="docs"></div>
+    </body>
+</html>
diff --git a/examples/navtoolbar-alwaysZoom.html b/examples/navtoolbar-alwaysZoom.html
new file mode 100644
index 0000000..a50be7e
--- /dev/null
+++ b/examples/navtoolbar-alwaysZoom.html
@@ -0,0 +1,78 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+	<head>
+		<title>A navToolbar with an alwaysZoom ZoomBox</title>
+		<link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+	    <link rel="stylesheet" href="style.css" type="text/css" />
+		<!-- Override the position of the toolbar to make it fit in a small map -->
+		<style type='text/css'>     
+			.olControlNavToolbar div { 
+			  top: 150px;
+			}
+    	</style>  
+		<script src="../lib/OpenLayers.js"></script>
+		<script type="text/javascript">
+			function init() {
+						
+				//Creation of a custom panel with a ZoomBox control with the alwaysZoom option sets to true				
+				OpenLayers.Control.CustomNavToolbar = OpenLayers.Class(OpenLayers.Control.Panel, {
+	
+				    /**
+				     * Constructor: OpenLayers.Control.NavToolbar 
+				     * Add our two mousedefaults controls.
+				     *
+				     * Parameters:
+				     * options - {Object} An optional object whose properties will be used
+				     *     to extend the control.
+				     */
+					
+					
+				    initialize: function(options) {
+				        OpenLayers.Control.Panel.prototype.initialize.apply(this, [options]);
+				        this.addControls([
+				          new OpenLayers.Control.Navigation(),
+						  //Here it come
+				          new OpenLayers.Control.ZoomBox({alwaysZoom:true})
+				        ]);
+						// To make the custom navtoolbar use the regular navtoolbar style
+						this.displayClass = 'olControlNavToolbar'
+				    },
+					
+					
+				
+				    /**
+				     * Method: draw 
+				     * calls the default draw, and then activates mouse defaults.
+				     */
+				    draw: function() {
+				        var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
+				        this.activateControl(this.controls[0]);
+				        return div;
+				    },
+				});
+				
+				var map;
+				
+				map = new OpenLayers.Map('map');
+
+	            var wms = new OpenLayers.Layer.WMS(
+	                "OpenLayers WMS",
+	                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+	                {layers: 'basic'}
+	            );					  
+								
+				map.addLayers([wms]);
+				map.zoomToMaxExtent();
+				
+				var panel = new OpenLayers.Control.CustomNavToolbar();
+	            map.addControl(panel);	
+				}	
+		</script>
+	</head>
+	<body onload="init()">
+		<h1 id="title">A navToolbar with an alwaysZoom ZoomBox</h1>
+		<p id="shortdesc">
+       		Demo of a custom NavToolbar which uses a zoomBox tool that always zoom in even when the zoom box is too big.
+    	</p> 
+		<div id="map" class="smallmap">  </div>
+	</body>
+</html>
diff --git a/examples/navtoolbar-outsidemap.html b/examples/navtoolbar-outsidemap.html
new file mode 100644
index 0000000..bea6415
--- /dev/null
+++ b/examples/navtoolbar-outsidemap.html
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Custom Navigation Toolbar</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #paneldiv {
+            height: 80px;
+        }
+        #paneldiv div { 
+            top: 10px; 
+        }
+        
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map', { controls: [new OpenLayers.Control.PanZoom()] } );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            var panel = new OpenLayers.Control.NavToolbar({'div':OpenLayers.Util.getElement('paneldiv')});
+            map.addControl(panel);
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Navigation Toolbar: Outside the Map</h1>
+    <div id="map" class="smallmap"></div>
+    <div id="paneldiv" class="olControlNavToolbar"></div>
+    <div id="docs">
+     <p> To place the Naviation Toolbar outside the map:</p>
+      <ul>
+        <li>Load the default stylesheet into the page.</li>
+        <li>Override the location of the Navigation toolbar in your CSS by setting <tt>#yourElementId div</tt> to have a top of 0px</li>
+        <li>Specify the HTML element as a 'div' option in your NavToolbar constructor</li>
+        <li>Add the olControlNavToolbar class to your div.</li>
+      </ul>
+   </div> 
+   
+  </body>
+</html>
diff --git a/examples/navtoolbar.html b/examples/navtoolbar.html
new file mode 100644
index 0000000..a38bdc3
--- /dev/null
+++ b/examples/navtoolbar.html
@@ -0,0 +1,39 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <title>NavToolbar Demo</title>
+    <style type='text/css'>    
+        #map {
+            height: 512px;
+        }
+    </style>    
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init() {
+            map = new OpenLayers.Map( 'map', { controls: [new OpenLayers.Control.PanZoom()] } );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+
+            var panel = new OpenLayers.Control.NavToolbar();
+            map.addControl(panel);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">NavToolbar Demo</h1>
+    <p id="shortdesc">
+       Demo the NavToolbar, a subclass of Control.Panel which shows icons for
+       navigation.
+    </p> 
+    <div id="map" class="smallmap"></div>
+  </body>
+</html>
diff --git a/examples/notile.html b/examples/notile.html
new file mode 100644
index 0000000..5cc9896
--- /dev/null
+++ b/examples/notile.html
@@ -0,0 +1,39 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Single Tile</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            map = new OpenLayers.Map('mapDiv', {maxResolution: 'auto'});
+
+            var old_ol_wms = new OpenLayers.Layer.WMS.Untiled( "WMS.Untiled", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'} );
+            old_ol_wms.addOptions({isBaseLayer: true});
+            
+            var new_ol_wms = new OpenLayers.Layer.WMS( "WMS w/singleTile", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'}, 
+                { singleTile: true, ratio: 1 } );
+            new_ol_wms.addOptions({isBaseLayer: true});
+
+            map.addLayers([old_ol_wms, new_ol_wms]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.setCenter(new OpenLayers.LonLat(6.5, 40.5), 4);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Untiled Example</h1>
+    <p id="shortdesc">
+      Create an untiled WMS layer using the singleTile: true, option or the deprecated
+      WMS.Untiled layer.
+    </p>  
+    <div id="mapDiv" class="smallmap"></div>
+    <p> The first layer is an old OpenLayers.Layer.WMS.Untiled layer, using 
+        a default ratio value of 1.5.
+    <p> The second layer is an OpenLayers.Layer.WMS layer with singleTile set
+        to true, and with a ratio of 1.    
+  </body>
+</html>
diff --git a/examples/ordering.html b/examples/ordering.html
new file mode 100644
index 0000000..2536bd0
--- /dev/null
+++ b/examples/ordering.html
@@ -0,0 +1,211 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Z-Ordering and Y-Ordering of Vector Features</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .smallmap {
+            width: 300px;
+        }
+        
+        .docs {
+            padding: 0px 5px;
+        }
+        
+        td {
+            vertical-align: top;
+        }
+        
+    </style>
+    <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+    <script type="text/javascript">
+        
+        var GOLD_Z_INDEX = 15;
+        var FIRST_RED_Z_INDEX = 10;
+        var SECOND_RED_Z_INDEX = 11;
+        
+        var RADIUS_FROM_CENTER = 40;
+        var POINT_DISTANCE = 10;
+            
+        function initYOrderMap() {
+            var map = new OpenLayers.Map("yorder");
+            
+            var layer = new OpenLayers.Layer.Vector(
+                "Y-Order",
+                {
+                    styleMap: new OpenLayers.StyleMap({
+                        externalGraphic: "../img/marker-gold.png",
+                        pointRadius: 10,
+                        graphicZIndex: GOLD_Z_INDEX
+                    }),
+                    isBaseLayer: true,
+                    rendererOptions: {yOrdering: true}
+                }
+            );
+            
+            map.addLayers([layer]);
+            map.zoomToMaxExtent();
+            
+            // Add features to the layers to show off z-index/y-ordering.
+            // We do this after adding the layer so we can work in pixels.
+            var center = map.getViewPortPxFromLonLat(map.getCenter());
+            
+            var top = new OpenLayers.Pixel(center.x, center.y - RADIUS_FROM_CENTER);
+            var bottom = new OpenLayers.Pixel(center.x, center.y + RADIUS_FROM_CENTER);
+            var left = new OpenLayers.Pixel(center.x - RADIUS_FROM_CENTER, center.y - POINT_DISTANCE / 2);
+            var right = new OpenLayers.Pixel(center.x + RADIUS_FROM_CENTER, center.y - POINT_DISTANCE / 2);
+            
+            // Add the ordering features. These are the gold ones that all have the same z-index
+            // and succomb to y-ordering.
+            var orderingFeatures = [];
+            // Note: We use > here on purpose (instead of >= ), as well as subtracting the
+            // the POINT_DISTANCE in the beginning of the loop (as opposed to the end).
+            // This is purely for symmetry. Also note that the gold features are drawn
+            // from bottom to top so as to quickly signal whether or not y-ordering is working.
+            while (bottom.y > top.y) {
+                bottom.y -= POINT_DISTANCE;
+                var lonLat = map.getLonLatFromViewPortPx(bottom);
+                orderingFeatures.push(
+                    new OpenLayers.Feature.Vector(
+                        new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat)
+                    )
+                );
+            }
+          
+            layer.addFeatures(orderingFeatures);
+            
+            // Add the z-index features. Technically, these features succomb to y-ordering
+            // as well; however, since they have different z-indexes, the z-indexes take 
+            // precedence.
+            var indexFeatures = [];
+            var useFirst = true;
+            while (left.x <= right.x) {
+                var lonLat = map.getLonLatFromViewPortPx(left);
+                var point = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(lonLat.lon, lonLat.lat)
+                );
+                
+                // This is where the magic happens. We override the style on the layer
+                // to give our own style with alternativing z-indexes.
+                point.style = {
+                    graphicZIndex: useFirst ? FIRST_RED_Z_INDEX : SECOND_RED_Z_INDEX,
+                    externalGraphic: "../img/marker.png",
+                    pointRadius: 10
+                }
+                
+                indexFeatures.push(
+                    point
+                );
+                
+                left.x += POINT_DISTANCE;
+                useFirst = !useFirst;
+            }
+            
+            layer.addFeatures(indexFeatures);
+        }
+        
+        function initDrawingOrderMap() {
+            var map = new OpenLayers.Map("drawingorder");
+            
+            var layer = new OpenLayers.Layer.Vector(
+                "Drawing Order",
+                {
+                    // The zIndex is taken from the zIndex attribute of the features
+                    styleMap: new OpenLayers.StyleMap({
+                        graphicZIndex: "${zIndex}",
+                        externalGraphic: "../img/marker-green.png",
+                        pointRadius: 10
+                    }),
+                    isBaseLayer: true,
+                    // enable the indexer by setting zIndexing to true
+                    rendererOptions: {zIndexing: true}
+                }
+            );
+            
+            map.addLayers([layer]);
+            map.zoomToMaxExtent();
+            
+            // Add features to the layers to show off z-index/y-ordering.
+            // We do this after adding the layer so we can work in pixels.
+            var center = map.getViewPortPxFromLonLat(map.getCenter());
+            
+            var top = new OpenLayers.Pixel(center.x, center.y - RADIUS_FROM_CENTER);
+            var bottom = new OpenLayers.Pixel(center.x, center.y + RADIUS_FROM_CENTER);
+            var left = new OpenLayers.Pixel(center.x - RADIUS_FROM_CENTER, center.y);
+            var right = new OpenLayers.Pixel(center.x + RADIUS_FROM_CENTER, center.y);
+            
+            // Add the ordering features. These are the gold ones that all have the same z-index
+            // and succomb to y-ordering.
+            var orderingFeatures = [];
+            while (bottom.y > top.y && left.x < right.x) {
+                var bottomLonLat = map.getLonLatFromViewPortPx(bottom);
+                var leftLonLat = map.getLonLatFromViewPortPx(left);
+                orderingFeatures.push(
+                    new OpenLayers.Feature.Vector(
+                        new OpenLayers.Geometry.Point(leftLonLat.lon, bottomLonLat.lat),
+                        // Set the zIndex attribute of all features to 0.
+                        // This attribute will be assigned to the graphicZIndex symbolizer property by the layer's styleMap
+                        {zIndex: 0}
+                    )
+                );
+                bottom.y -= POINT_DISTANCE / 2; // Divide by 2 for better visual.
+                left.x += POINT_DISTANCE / 2;
+            }
+            // only the first feature gets a zIndex attribute of 1
+            orderingFeatures[0].attributes.zIndex = 1;
+          
+            layer.addFeatures(orderingFeatures);
+        }
+
+        function init(){
+            initYOrderMap();
+            initDrawingOrderMap();
+        };
+        
+    </script>
+  </head>
+  <body onload="init()">
+        <h1 id="title">Z-Index/Y-Order Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+           This example shows the use of z-indexing and y-ordering of external graphics. Zoom in and out to see this behavior.
+        </p>
+
+        <h3>Z-Index (with Y-Ordering enabled)</h3>
+        <table>
+            <tr>
+                <td>
+                    <div id="yorder" class="smallmap"></div>
+                </td>
+                <td>
+                    <div class="docs">
+                        In this map, the gold features all have the same z-index, and the red features have alternating z-indeces. The gold features' z-index is greater than the red features' z-indeces, which is why gold features look to be drawn on top of the red features. Since each gold feature has the same z-index, gold features succomb to y-ordering: this is where features that seem closest to the viewer (lower lattitude) show up above those that seem farther away (higher lattitude).
+                        <br><br>
+                        You can enable y-ordering by passing the parameter <i>yOrdering: true</i> in the vector layer's options hash. For all configurations (with yOrdering or zIndexing set to true), if features have the same z-index -- and if y-ordering is enabled: the same latitude -- those features will succomb to drawing order, where the last feature to be drawn will appear above the rest.
+                    </div>
+                </td>
+            </tr>
+        </table>
+        <br>
+        <h3>Z-Index and Drawing Order (Z-Indexes set, and Y-Ordering disabled)</h3>
+        <table>
+            <tr>
+                <td>
+                    <div id="drawingorder" class="smallmap"></div>
+                </td>
+                <td>
+                    <div class="docs">
+                        In this map, <i>zIndexing</i> is set to true. All features are given the same z-index (0), except for the first feature which has a z-index of 1. The layer's <i>yOrdering</i> parameter is set to the default (false). This configuration makes features succomb to z-index and drawing order (for the features with the same z-index), instead of y-order.
+                        <br><br>
+                        The features in this map were drawn from left to right and bottom to top, diagonally, to show that y-ordering is not enabled. Only the lower-left corner feature is drawn on top of the others, because it has a higher z-index (1 instead of 0).
+                    </div>
+                </td>
+            </tr>
+        </table>
+        
+        
+    </body>
+</html>
diff --git a/examples/osm-google.html b/examples/osm-google.html
new file mode 100644
index 0000000..1973864
--- /dev/null
+++ b/examples/osm-google.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers OSM and Google Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+        <link rel="stylesheet" href="../theme/default/google.css" type="text/css">
+        <link rel="stylesheet" href="style.css" type="text/css">
+        <script src="http://maps.google.com/maps/api/js?sensor=false"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="osm-google.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">OSM and Google Together</h1>
+        <p id="shortdesc">
+            Demonstrate use of an OSM layer and a Google layer as base layers.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                The Google(v3) layer and the OSM are both in the same projection
+                - spherical mercator - and can be used on a map together.
+                See the <a href="osm-google.js" target="_blank">
+                osm-google.js source</a> to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/osm-google.js b/examples/osm-google.js
new file mode 100644
index 0000000..77d96d8
--- /dev/null
+++ b/examples/osm-google.js
@@ -0,0 +1,28 @@
+var map;
+
+function init() {
+    map = new OpenLayers.Map({
+        div: "map",
+        projection: new OpenLayers.Projection("EPSG:900913"),
+        units: "m",
+        maxResolution: 156543.0339,
+        maxExtent: new OpenLayers.Bounds(
+            -20037508, -20037508, 20037508, 20037508.34
+        )
+    });
+    
+    var osm = new OpenLayers.Layer.OSM();            
+    var gmap = new OpenLayers.Layer.Google("Google Streets");
+    
+    map.addLayers([osm, gmap]);
+
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+
+    map.setCenter(
+        new OpenLayers.LonLat(10.2, 48.9).transform(
+            new OpenLayers.Projection("EPSG:4326"),
+            map.getProjectionObject()
+        ), 
+        5
+    );
+}
diff --git a/examples/osm-layer.html b/examples/osm-layer.html
new file mode 100644
index 0000000..cd16e75
--- /dev/null
+++ b/examples/osm-layer.html
@@ -0,0 +1,119 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: OSM Layer</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style>
+        #map {
+            height: 350px;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer, gml;
+        function export_vectors() {
+            var x = new OpenLayers.Format.XML();
+            var content = x.write(gml.renderer.rendererRoot);
+            $("vectors").value = content;
+            $("vectors").style.display = "block";
+            $("vectorlink").href = "data:image/svg+xml," + escape(content);
+            $("vectorlink").style.display="block";
+        }
+        function on_feature_hover(feature) {
+            var text ="<ul>";
+            var type ="way";
+            if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+                type = "node";
+            }    
+            text += "<li>" + feature.osm_id + ": <a href='http://crschmidt.net/osm/attributes.html?type="+type+"&id="+feature.osm_id+"'>Edit</a>, <a href='http://www.openstreetmap.org/api/0.5/"+type + "/" + feature.osm_id + "'>API</a></li>";
+            for (var key in feature.attributes) {
+                text += "<li>" + key + ": " + feature.attributes[key] + "</li>";
+            }
+            text += "</ul>";
+            $("status").innerHTML = text;
+        }   
+        function clear_data() {
+            gml.destroyFeatures();
+        }
+        function new_data() {
+            if (!check_zoom()) { return; }
+            clear_data();
+            gml.loaded = false;
+            gml.url = "http://www.openstreetmap.org/api/0.5/map?bbox=" + map.getExtent().toBBOX();
+            $("status").innerHTML = "Loading more data...";
+            gml.loadGML();
+        }
+        function style_osm_feature(feature) {
+            feature.style = OpenLayers.Util.extend({'fill':'black'}, OpenLayers.Feature.Vector.style['default']);
+            if (feature.attributes.highway == "motorway") {
+                feature.style.strokeColor = "blue";
+                feature.style.strokeWidth = 5;
+            } else if (feature.attributes.highway == "primary") {
+                feature.style.strokeColor = "red";
+            } else if (feature.attributes.highway == "secondary") {
+                feature.style.strokeColor = "orange";
+            } else if (feature.attributes.highway) {
+                feature.style.strokeColor = "black";
+            }   
+        }
+        function check_zoom() { 
+            var zoom = map.getZoom();
+            if (zoom >= 11) { return true; }
+            if (zoom >= 9) { return confirm("Loading this amount of data may slow your browser. Are you sure you want to do this?"); }
+            $("status").innerHTML = "Area too large. Zoom in to load data. (Current zoom level: "+ zoom + ". Must be at zoom 9+.)";
+            return false;
+        }    
+        function init(){
+            OpenLayers.ProxyHost = "proxy.cgi?url=";
+            OpenLayers.Feature.Vector.style['default'].strokeWidth = 4;
+            OpenLayers.Feature.Vector.style['default'].cursor = 'pointer';
+            map = new OpenLayers.Map('map', {'maxResolution': 360/512/16, 'numZoomLevels':15, controls: [ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanZoomBar() ]});
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.Permalink());
+            layer = new OpenLayers.Layer.WMS( "OSM", 
+               [
+                 "http://t1.hypercube.telascience.org/tiles?",
+                 "http://t2.hypercube.telascience.org/tiles?",
+                 "http://t3.hypercube.telascience.org/tiles?",
+                 "http://t4.hypercube.telascience.org/tiles?"
+                 ], 
+                {layers: 'osm-4326', format: 'image/png' } );
+            map.addLayer(layer);
+            if (!map.getCenter()) { 
+                gml = new OpenLayers.Layer.GML("OSM", "osm/sutton_coldfield.osm", {format: OpenLayers.Format.OSM});
+                map.zoomToExtent(new OpenLayers.Bounds(-1.819072,52.549034,-1.814341,52.551582));
+            } else {
+                if (map.getZoom() >= 11) {
+                    gml = new OpenLayers.Layer.GML("OSM", "http://www.openstreetmap.org/api/0.5/map?bbox=" + map.getExtent().toBBOX(), {format: OpenLayers.Format.OSM});
+                } else {
+                    gml = new OpenLayers.Layer.GML("OSM", "xml/cambridgeport.osm", {format: OpenLayers.Format.OSM});
+                }    
+            }    
+            gml.events.register("loadstart", null, function() { $("status").innerHTML = "Loading..."; })
+            gml.events.register("loadend", null, function() { $("status").innerHTML = ""; })
+            map.addLayer(gml);
+            gml.preFeatureInsert = style_osm_feature; 
+            var sf = new OpenLayers.Control.SelectFeature(gml, {'onSelect': on_feature_hover});
+            map.addControl(sf);
+            sf.activate();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Advanced OSM Layer</h1>
+    <div id="map" class="smallmap"></div>
+    <div id="download">
+      <ul>
+       <li><a href="javascript:new_data();">Download current view</a></li>
+       <li><a href="javascript:clear_data();">Clear current data</a></li>
+       <li><a href="javascript:export_vectors();">Export Vector Data</a></li>
+      </ul>
+    <div id="status">Loading...</div>
+    </div>
+    <a id="vectorlink" href="" style="display:none">Display via data: URL (FF Only)</a>
+    <textarea id="vectors" style="display:none;width:100%" rows="10"></textarea>
+  </body>
+</html>
diff --git a/examples/osm.html b/examples/osm.html
new file mode 100644
index 0000000..d14a1bb
--- /dev/null
+++ b/examples/osm.html
@@ -0,0 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Basic Single WMS Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        function init(){
+            map = new OpenLayers.Map( 'map');
+            layer = new OpenLayers.Layer.OSM( "Simple OSM Map");
+            map.addLayer(layer);
+            map.setCenter(
+                new OpenLayers.LonLat(-71.147, 42.472).transform(
+                    new OpenLayers.Projection("EPSG:4326"),
+                    map.getProjectionObject()
+                ), 12
+            );    
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Basic OSM Example</h1>
+
+    <div id="tags"></div>
+
+    <div id="shortdesc">Show a Simple OSM Map</div>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        This example shows a very simple OSM layout with minimal controls. 
+    </div>
+  </body>
+</html>
diff --git a/examples/osm/sutton_coldfield.osm b/examples/osm/sutton_coldfield.osm
new file mode 100644
index 0000000..db77309
--- /dev/null
+++ b/examples/osm/sutton_coldfield.osm
@@ -0,0 +1,662 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<osm version="0.5" generator="OpenStreetMap server">
+  <node id="200545" lat="52.5503033" lon="-1.8166417" user="blackadder" visible="true" timestamp="2006-03-22T16:33:41+00:00"/>
+  <node id="200546" lat="52.5501965" lon="-1.8168261" user="blackadder" visible="true" timestamp="2006-03-22T16:33:43+00:00"/>
+  <node id="200547" lat="52.5501645" lon="-1.8169929" user="blackadder" visible="true" timestamp="2006-03-22T16:33:45+00:00"/>
+  <node id="200548" lat="52.5501805" lon="-1.8172475" user="blackadder" visible="true" timestamp="2006-03-22T16:33:47+00:00"/>
+  <node id="200549" lat="52.5502392" lon="-1.8175372" user="blackadder" visible="true" timestamp="2006-03-22T16:33:50+00:00"/>
+  <node id="200627" lat="52.5499115" lon="-1.8161012" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200628" lat="52.5497408" lon="-1.81586" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
+  <node id="200752" lat="52.5505598" lon="-1.8140051" user="blackadder" visible="true" timestamp="2006-03-22T16:36:20+00:00"/>
+  <node id="200758" lat="52.5501087" lon="-1.8142773" user="blackadder" visible="true" timestamp="2006-03-22T16:36:32+00:00"/>
+  <node id="645729" lat="52.5504008" lon="-1.8169154" user="blackadder" visible="true" timestamp="2006-07-24T23:21:42+01:00">
+    <tag k="place_name" v="Sutton Coldfield"/>
+    <tag k="ref" v="B72 1162"/>
+    <tag k="amenity" v="post_box"/>
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="653121" lat="52.5506073" lon="-1.8137881" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783468" lat="52.5506446" lon="-1.8141177" user="blackadder" visible="true" timestamp="2007-05-30T14:22:33+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783470" lat="52.5501275" lon="-1.8151451" user="blackadder" visible="true" timestamp="2007-05-30T14:22:33+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783471" lat="52.5505521" lon="-1.8157703" user="blackadder" visible="true" timestamp="2007-12-18T15:33:59+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783472" lat="52.5501836" lon="-1.8164007" user="blackadder" visible="true" timestamp="2007-12-18T15:33:59+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783473" lat="52.5506035" lon="-1.8170311" user="blackadder" visible="true" timestamp="2007-05-30T14:21:32+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783474" lat="52.5509559" lon="-1.8164092" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783571" lat="52.5506331" lon="-1.813672" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175922968" lat="52.5508635" lon="-1.8167837" user="blackadder" visible="true" timestamp="2007-12-18T16:12:50+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175922970" lat="52.5507591" lon="-1.8169628" user="blackadder" visible="true" timestamp="2007-12-17T23:10:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923086" lat="52.5506787" lon="-1.8175799" user="blackadder" visible="true" timestamp="2007-12-17T23:10:50+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923089" lat="52.5505886" lon="-1.8177227" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128255" lat="52.5504144" lon="-1.8171548" user="blackadder" visible="true" timestamp="2007-12-18T16:12:52+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128257" lat="52.5506497" lon="-1.8175392" user="blackadder" visible="true" timestamp="2007-12-18T16:12:52+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128259" lat="52.550557" lon="-1.8176871" user="blackadder" visible="true" timestamp="2007-12-18T16:12:52+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128262" lat="52.5503122" lon="-1.8173195" user="blackadder" visible="true" timestamp="2007-12-18T16:12:52+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128265" lat="52.5499209" lon="-1.8164147" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128266" lat="52.550178" lon="-1.8175708" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128268" lat="52.550066" lon="-1.8176374" user="blackadder" visible="true" timestamp="2007-12-19T17:06:34+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128270" lat="52.5498069" lon="-1.8164854" user="blackadder" visible="true" timestamp="2007-12-19T17:06:34+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128273" lat="52.5498629" lon="-1.8162923" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128275" lat="52.5497909" lon="-1.8164134" user="blackadder" visible="true" timestamp="2007-12-19T17:06:34+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128278" lat="52.5502519" lon="-1.8173348" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128280" lat="52.5504396" lon="-1.817036" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128281" lat="52.5503051" lon="-1.816799" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128283" lat="52.5502337" lon="-1.8169643" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128286" lat="52.5503168" lon="-1.8170397" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+    <tag k="amenity" v="parking"/>
+  </node>
+  <node id="177177218" lat="52.5501201" lon="-1.8175441" user="blackadder" visible="true" timestamp="2007-12-18T16:53:50+00:00">
+    <tag k="created_by" v="JOSM"/>
+    <tag k="ref" v="28"/>
+    <tag k="building" v="residential"/>
+  </node>
+  <node id="177177220" lat="52.5498859" lon="-1.8164918" user="blackadder" visible="true" timestamp="2007-12-18T16:53:50+00:00">
+    <tag k="created_by" v="JOSM"/>
+    <tag k="ref" v="2"/>
+    <tag k="building" v="residential"/>
+  </node>
+  <node id="177177222" lat="52.5498106" lon="-1.8162993" user="blackadder" visible="true" timestamp="2007-12-18T16:53:50+00:00">
+    <tag k="created_by" v="JOSM"/>
+    <tag k="ref" v="160"/>
+    <tag k="building" v="residential"/>
+  </node>
+  <node id="177230961" lat="52.550392" lon="-1.8172751" user="blackadder" visible="true" timestamp="2007-12-18T16:53:44+00:00">
+    <tag k="created_by" v="JOSM"/>
+    <tag k="ref" v="158"/>
+    <tag k="building" v="residential"/>
+  </node>
+  <node id="177230963" lat="52.5501893" lon="-1.8162725" user="blackadder" visible="true" timestamp="2007-12-18T16:53:44+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230965" lat="52.5502522" lon="-1.8161638" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230968" lat="52.5498311" lon="-1.8155709" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231022" lat="52.5497724" lon="-1.8156875" user="blackadder" visible="true" timestamp="2007-12-18T16:53:47+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231024" lat="52.5501922" lon="-1.8161729" user="blackadder" visible="true" timestamp="2007-12-18T16:53:47+00:00">
+    <tag k="created_by" v="JOSM"/>
+    <tag k="ref" v="145"/>
+    <tag k="building" v="residential"/>
+  </node>
+  <node id="200551" lat="52.5520062" lon="-1.8172738" user="blackadder" visible="true" timestamp="2006-03-22T16:33:54+00:00"/>
+  <node id="200552" lat="52.5520649" lon="-1.8171246" user="blackadder" visible="true" timestamp="2006-03-22T16:33:55+00:00"/>
+  <node id="200553" lat="52.5520008" lon="-1.8172124" user="blackadder" visible="true" timestamp="2006-03-22T16:33:59+00:00"/>
+  <node id="200554" lat="52.5517927" lon="-1.8169666" user="blackadder" visible="true" timestamp="2006-03-22T16:34:01+00:00"/>
+  <node id="200555" lat="52.5517499" lon="-1.8168788" user="blackadder" visible="true" timestamp="2006-03-22T16:34:03+00:00"/>
+  <node id="200556" lat="52.5517248" lon="-1.8167286" user="blackadder" visible="true" timestamp="2007-11-22T17:33:33+00:00"/>
+  <node id="200557" lat="52.5518792" lon="-1.8163956" user="blackadder" visible="true" timestamp="2007-11-22T17:33:33+00:00"/>
+  <node id="200558" lat="52.5519665" lon="-1.8163705" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200562" lat="52.5519848" lon="-1.815281" user="blackadder" visible="true" timestamp="2006-03-22T16:34:21+00:00"/>
+  <node id="200573" lat="52.5520736" lon="-1.8145054" user="blackadder" visible="true" timestamp="2006-03-22T16:34:49+00:00"/>
+  <node id="200751" lat="52.5511951" lon="-1.8142246" user="blackadder" visible="true" timestamp="2006-03-22T16:36:18+00:00"/>
+  <node id="29783476" lat="52.5513103" lon="-1.8169385" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783477" lat="52.5517893" lon="-1.8159626" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783478" lat="52.5518461" lon="-1.8145067" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783479" lat="52.5511883" lon="-1.8143197" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="200511" lat="52.5558034" lon="-1.8267378" user="blackadder" visible="true" timestamp="2006-03-22T16:32:25+00:00"/>
+  <node id="200512" lat="52.5550357" lon="-1.8249151" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200513" lat="52.5553343" lon="-1.8257585" user="blackadder" visible="true" timestamp="2006-03-22T16:32:28+00:00"/>
+  <node id="200514" lat="52.5546308" lon="-1.8238934" user="blackadder" visible="true" timestamp="2006-03-22T16:32:30+00:00"/>
+  <node id="200515" lat="52.5544693" lon="-1.823135" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200517" lat="52.5545308" lon="-1.8235208" user="blackadder" visible="true" timestamp="2006-03-22T16:32:37+00:00"/>
+  <node id="200526" lat="52.5543989" lon="-1.8225501" user="blackadder" visible="true" timestamp="2006-03-22T16:33:02+00:00"/>
+  <node id="200527" lat="52.5543241" lon="-1.8221902" user="blackadder" visible="true" timestamp="2006-03-22T16:33:05+00:00"/>
+  <node id="200528" lat="52.5542654" lon="-1.8219444" user="blackadder" visible="true" timestamp="2006-03-22T16:33:07+00:00"/>
+  <node id="200530" lat="52.5541587" lon="-1.8216547" user="blackadder" visible="true" timestamp="2006-03-22T16:33:11+00:00"/>
+  <node id="200532" lat="52.5538918" lon="-1.821163" user="blackadder" visible="true" timestamp="2006-03-22T16:33:15+00:00"/>
+  <node id="200533" lat="52.5536782" lon="-1.8208031" user="blackadder" visible="true" timestamp="2006-03-22T16:33:17+00:00"/>
+  <node id="200534" lat="52.5534108" lon="-1.8204187" user="blackadder" visible="true" timestamp="2006-03-22T16:33:19+00:00"/>
+  <node id="200535" lat="52.5530804" lon="-1.8200481" user="blackadder" visible="true" timestamp="2006-03-22T16:33:21+00:00"/>
+  <node id="200536" lat="52.5527228" lon="-1.8197232" user="blackadder" visible="true" timestamp="2006-03-22T16:33:23+00:00"/>
+  <node id="200537" lat="52.5525413" lon="-1.8195652" user="blackadder" visible="true" timestamp="2006-03-22T16:33:25+00:00"/>
+  <node id="200539" lat="52.5522844" lon="-1.8193896" user="blackadder" visible="true" timestamp="2006-03-22T16:33:29+00:00"/>
+  <node id="200540" lat="52.5519374" lon="-1.8190999" user="blackadder" visible="true" timestamp="2006-03-22T16:33:31+00:00"/>
+  <node id="200541" lat="52.5521848" lon="-1.8193018" user="blackadder" visible="true" timestamp="2007-12-17T23:11:03+00:00"/>
+  <node id="200542" lat="52.5516186" lon="-1.8186947" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200543" lat="52.5517933" lon="-1.8189419" user="blackadder" visible="true" timestamp="2006-03-22T16:33:37+00:00"/>
+  <node id="200544" lat="52.5513983" lon="-1.8183449" user="blackadder" visible="true" timestamp="2006-03-22T16:33:39+00:00"/>
+  <node id="200550" lat="52.5519976" lon="-1.8179888" user="blackadder" visible="true" timestamp="2007-11-22T17:33:33+00:00"/>
+  <node id="200559" lat="52.5523069" lon="-1.816393" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200560" lat="52.5523905" lon="-1.8163169" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200561" lat="52.552524" lon="-1.8159306" user="blackadder" visible="true" timestamp="2006-03-22T21:55:12+00:00"/>
+  <node id="200563" lat="52.5526121" lon="-1.8152809" user="blackadder" visible="true" timestamp="2006-03-22T16:34:24+00:00"/>
+  <node id="200564" lat="52.5526358" lon="-1.8149766" user="blackadder" visible="true" timestamp="2007-11-22T17:33:34+00:00"/>
+  <node id="200565" lat="52.5526654" lon="-1.8146664" user="blackadder" visible="true" timestamp="2006-03-22T16:34:29+00:00"/>
+  <node id="200566" lat="52.5525937" lon="-1.8156438" user="blackadder" visible="true" timestamp="2006-03-22T16:34:31+00:00"/>
+  <node id="200571" lat="52.5535575" lon="-1.8148566" user="blackadder" visible="true" timestamp="2007-11-15T12:54:40+00:00"/>
+  <node id="200572" lat="52.5523885" lon="-1.8145932" user="blackadder" visible="true" timestamp="2006-03-22T16:34:46+00:00"/>
+  <node id="200629" lat="52.5495701" lon="-1.8156789" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
+  <node id="200630" lat="52.5493694" lon="-1.815524" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
+  <node id="200631" lat="52.5490781" lon="-1.8153587" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
+  <node id="200632" lat="52.5488293" lon="-1.815287" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200633" lat="52.5485269" lon="-1.8153192" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
+  <node id="200650" lat="52.5482109" lon="-1.815399" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
+  <node id="200651" lat="52.5478984" lon="-1.8153867" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
+  <node id="200652" lat="52.5474767" lon="-1.8152603" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
+  <node id="200653" lat="52.5468312" lon="-1.8150679" user="blackadder" visible="true" timestamp="2007-11-22T17:33:29+00:00"/>
+  <node id="200753" lat="52.5496876" lon="-1.8136891" user="blackadder" visible="true" timestamp="2006-03-22T21:55:13+00:00"/>
+  <node id="200754" lat="52.549009" lon="-1.8133906" user="blackadder" visible="true" timestamp="2006-03-22T16:36:24+00:00"/>
+  <node id="200755" lat="52.5478879" lon="-1.8128287" user="blackadder" visible="true" timestamp="2006-03-22T16:36:26+00:00"/>
+  <node id="200756" lat="52.548993" lon="-1.8134871" user="blackadder" visible="true" timestamp="2006-03-22T16:36:28+00:00"/>
+  <node id="200757" lat="52.5490304" lon="-1.8135925" user="blackadder" visible="true" timestamp="2006-03-22T16:36:31+00:00"/>
+  <node id="200759" lat="52.5464722" lon="-1.8119684" user="blackadder" visible="true" timestamp="2006-03-22T16:36:34+00:00"/>
+  <node id="200771" lat="52.5466312" lon="-1.8121126" user="blackadder" visible="true" timestamp="2006-03-22T16:37:02+00:00"/>
+  <node id="653117" lat="52.5423754" lon="-1.8078749" user="blackadder" visible="true" timestamp="2007-11-26T18:40:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="653118" lat="52.5465842" lon="-1.81179" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="653119" lat="52.5444001" lon="-1.8100834" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="653120" lat="52.5490713" lon="-1.8131664" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="653122" lat="52.5526798" lon="-1.814402" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="653123" lat="52.5536564" lon="-1.814631" user="blackadder" visible="true" timestamp="2007-11-15T12:54:42+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783564" lat="52.5538289" lon="-1.8145536" user="blackadder" visible="true" timestamp="2007-11-15T12:53:07+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783565" lat="52.5539485" lon="-1.8128538" user="blackadder" visible="true" timestamp="2007-11-15T12:53:07+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783566" lat="52.5509299" lon="-1.8119156" user="blackadder" visible="true" timestamp="2007-05-30T14:25:10+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783567" lat="52.5470281" lon="-1.8097771" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783568" lat="52.5465979" lon="-1.811457" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783569" lat="52.5466086" lon="-1.8115118" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783570" lat="52.5491153" lon="-1.8130205" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="29783572" lat="52.5527014" lon="-1.8142812" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="135352210" lat="52.5549423" lon="-1.814954" user="blackadder" visible="true" timestamp="2007-11-26T18:37:58+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175922965" lat="52.551783" lon="-1.8181591" user="blackadder" visible="true" timestamp="2007-12-18T16:12:50+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175922972" lat="52.5516751" lon="-1.8183582" user="blackadder" visible="true" timestamp="2007-12-17T23:10:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923064" lat="52.5542375" lon="-1.8222046" user="blackadder" visible="true" timestamp="2007-12-18T15:34:00+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923066" lat="52.5540618" lon="-1.8217823" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923068" lat="52.5537913" lon="-1.8213338" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923070" lat="52.5529993" lon="-1.8203219" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923072" lat="52.5521418" lon="-1.8195539" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923077" lat="52.5517862" lon="-1.8192228" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923081" lat="52.55152" lon="-1.8188757" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923083" lat="52.5510247" lon="-1.8181078" user="blackadder" visible="true" timestamp="2007-12-17T23:10:50+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923092" lat="52.5514479" lon="-1.8190434" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923093" lat="52.5517434" lon="-1.8194353" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923094" lat="52.5529379" lon="-1.8205018" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923095" lat="52.5537161" lon="-1.8214889" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923096" lat="52.5539755" lon="-1.8218808" user="blackadder" visible="true" timestamp="2007-12-18T16:12:50+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="175923099" lat="52.5541405" lon="-1.8222767" user="blackadder" visible="true" timestamp="2007-12-18T15:34:00+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177081428" lat="52.5552884" lon="-1.8256253" user="blackadder" visible="true" timestamp="2007-12-18T15:01:16+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177081440" lat="52.5551147" lon="-1.825166" user="blackadder" visible="true" timestamp="2007-12-18T15:01:17+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128288" lat="52.5496708" lon="-1.816009" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128291" lat="52.5494958" lon="-1.8157939" user="blackadder" visible="true" timestamp="2007-12-18T15:33:56+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128294" lat="52.5492862" lon="-1.8156326" user="blackadder" visible="true" timestamp="2007-12-18T15:33:56+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128297" lat="52.5490612" lon="-1.8155156" user="blackadder" visible="true" timestamp="2007-12-18T15:33:56+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128299" lat="52.5488284" lon="-1.8154808" user="blackadder" visible="true" timestamp="2007-12-18T15:33:56+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128301" lat="52.5488246" lon="-1.8156477" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128303" lat="52.5490573" lon="-1.8156698" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128306" lat="52.5492802" lon="-1.8157959" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128308" lat="52.5494967" lon="-1.8159735" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177128310" lat="52.549613" lon="-1.8161509" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230972" lat="52.5496355" lon="-1.8153859" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230975" lat="52.5494398" lon="-1.8152371" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230979" lat="52.5492418" lon="-1.8151165" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230981" lat="52.5490437" lon="-1.8150441" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230983" lat="52.5488114" lon="-1.8149878" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230985" lat="52.5485375" lon="-1.815024" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230988" lat="52.5481977" lon="-1.8150843" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230989" lat="52.5480118" lon="-1.8150884" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177230996" lat="52.5480143" lon="-1.8152371" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231000" lat="52.5482099" lon="-1.8152331" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231003" lat="52.5485498" lon="-1.8151567" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231007" lat="52.5488212" lon="-1.8151246" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231010" lat="52.5490364" lon="-1.8151728" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231014" lat="52.5492393" lon="-1.8152452" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231016" lat="52.5494081" lon="-1.8153618" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231019" lat="52.5495915" lon="-1.8155106" user="blackadder" visible="true" timestamp="2007-12-18T16:53:47+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <node id="177231081" lat="52.5555213" lon="-1.8261466" user="blackadder" visible="true" timestamp="2007-12-18T16:53:49+00:00">
+    <tag k="created_by" v="JOSM"/>
+  </node>
+  <way id="35" visible="true" timestamp="2007-09-18T02:37:16+01:00" user="crschmidt">
+    <nd ref="200542"/>
+    <nd ref="200550"/>
+    <nd ref="200551"/>
+    <nd ref="200553"/>
+    <tag k="note" v="fire access route"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="highway" v="footway"/>
+    <tag k="place_name" v="Sutton Coldfield"/>
+    <tag k="surface" v="paved"/>
+  </way>
+  <way id="37" visible="true" timestamp="2007-12-18T16:53:51+00:00" user="blackadder">
+    <nd ref="200511"/>
+    <nd ref="177231081"/>
+    <nd ref="200513"/>
+    <nd ref="177081428"/>
+    <nd ref="177081440"/>
+    <nd ref="200512"/>
+    <nd ref="200514"/>
+    <nd ref="200517"/>
+    <nd ref="200515"/>
+    <nd ref="200526"/>
+    <nd ref="200527"/>
+    <nd ref="200528"/>
+    <nd ref="200530"/>
+    <nd ref="200532"/>
+    <nd ref="200533"/>
+    <nd ref="200534"/>
+    <nd ref="200535"/>
+    <nd ref="200536"/>
+    <nd ref="200537"/>
+    <nd ref="200539"/>
+    <nd ref="200541"/>
+    <nd ref="200540"/>
+    <nd ref="200543"/>
+    <nd ref="200542"/>
+    <nd ref="200544"/>
+    <nd ref="200545"/>
+    <nd ref="200627"/>
+    <nd ref="200628"/>
+    <nd ref="200629"/>
+    <nd ref="200630"/>
+    <nd ref="200631"/>
+    <nd ref="200632"/>
+    <nd ref="200633"/>
+    <nd ref="200650"/>
+    <nd ref="200651"/>
+    <nd ref="200652"/>
+    <nd ref="200653"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="place_name" v="Sutton Coldfield"/>
+    <tag k="postal_code" v="B72"/>
+    <tag k="name" v="Maney Hill Road"/>
+    <tag k="abutters" v="residential"/>
+    <tag k="highway" v="residential"/>
+  </way>
+  <way id="54" visible="true" timestamp="2006-03-29T09:51:45+01:00" user="blackadder">
+    <nd ref="200545"/>
+    <nd ref="200546"/>
+    <nd ref="200547"/>
+    <nd ref="200548"/>
+    <nd ref="200549"/>
+    <tag k="name" v="Mottrams Close"/>
+    <tag k="abutters" v="residential"/>
+    <tag k="postal_code" v="B72"/>
+    <tag k="highway" v="residential"/>
+    <tag k="place_name" v="Sutton Coldfield"/>
+    <tag k="created_by" v="JOSM"/>
+  </way>
+  <way id="55" visible="true" timestamp="2006-03-22T21:55:16+00:00" user="blackadder">
+    <nd ref="200758"/>
+    <nd ref="200757"/>
+    <nd ref="200756"/>
+    <nd ref="200754"/>
+    <tag k="place_name" v="Sutton Coldfield"/>
+    <tag k="highway" v="residential"/>
+    <tag k="postal_code" v="B72"/>
+    <tag k="name" v="East View Road"/>
+    <tag k="created_by" v="JOSM"/>
+  </way>
+  <way id="57" visible="true" timestamp="2007-09-26T14:35:13+01:00" user="blackadder">
+    <nd ref="200571"/>
+    <nd ref="200565"/>
+    <nd ref="200572"/>
+    <nd ref="200573"/>
+    <nd ref="200751"/>
+    <nd ref="200752"/>
+    <nd ref="200753"/>
+    <nd ref="200754"/>
+    <nd ref="200755"/>
+    <nd ref="200771"/>
+    <nd ref="200759"/>
+    <tag k="place_name" v="Sutton Coldfield"/>
+    <tag k="postal_code" v="B72"/>
+    <tag k="name" v="East View Road"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="highway" v="unclassified"/>
+  </way>
+  <way id="395" visible="true" timestamp="2007-12-19T17:50:08+00:00" user="blackadder">
+    <nd ref="200552"/>
+    <nd ref="200553"/>
+    <nd ref="200554"/>
+    <nd ref="200555"/>
+    <nd ref="200556"/>
+    <nd ref="200557"/>
+    <nd ref="200558"/>
+    <nd ref="200559"/>
+    <nd ref="200560"/>
+    <nd ref="200561"/>
+    <nd ref="200566"/>
+    <nd ref="200563"/>
+    <nd ref="200564"/>
+    <nd ref="200565"/>
+    <tag k="place_name" v="Sutton Coldfield"/>
+    <tag k="postal_code" v="B72"/>
+    <tag k="name" v="Shooters Hill"/>
+    <tag k="abutters" v="residential"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="highway" v="residential"/>
+  </way>
+  <way id="418" visible="true" timestamp="2006-03-25T11:39:32+00:00" user="blackadder">
+    <nd ref="200562"/>
+    <nd ref="200563"/>
+    <tag k="place_name" v="Sutton Coldfield"/>
+    <tag k="highway" v="residential"/>
+    <tag k="postal_code" v="B72"/>
+    <tag k="abutters" v="residential"/>
+    <tag k="name" v="Corncrake Close"/>
+    <tag k="created_by" v="JOSM"/>
+  </way>
+  <way id="4685537" visible="true" timestamp="2007-05-30T14:21:35+01:00" user="blackadder">
+    <nd ref="29783472"/>
+    <nd ref="29783473"/>
+    <nd ref="29783474"/>
+    <nd ref="29783476"/>
+    <nd ref="29783477"/>
+    <nd ref="29783478"/>
+    <nd ref="29783479"/>
+    <nd ref="29783468"/>
+    <nd ref="29783470"/>
+    <nd ref="29783471"/>
+    <nd ref="29783472"/>
+    <tag k="name" v="Maney Hill School"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="landuse" v="school"/>
+    <tag k="amenity" v="school"/>
+  </way>
+  <way id="4685542" visible="true" timestamp="2007-05-30T14:25:15+01:00" user="blackadder">
+    <nd ref="29783570"/>
+    <nd ref="29783571"/>
+    <nd ref="29783572"/>
+    <nd ref="29783564"/>
+    <nd ref="29783565"/>
+    <nd ref="29783566"/>
+    <nd ref="29783567"/>
+    <nd ref="29783568"/>
+    <nd ref="29783569"/>
+    <nd ref="29783570"/>
+    <tag k="landuse" v="school"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="amenity" v="school"/>
+  </way>
+  <way id="14166897" visible="true" timestamp="2007-11-26T18:40:45+00:00" user="blackadder">
+    <nd ref="135352210"/>
+    <nd ref="653123"/>
+    <nd ref="653122"/>
+    <nd ref="653121"/>
+    <nd ref="653120"/>
+    <nd ref="653118"/>
+    <nd ref="653119"/>
+    <nd ref="653117"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="name" v="Freight Line"/>
+    <tag k="railway" v="rail"/>
+  </way>
+  <way id="16966783" visible="true" timestamp="2007-12-17T23:11:00+00:00" user="blackadder">
+    <nd ref="175922965"/>
+    <nd ref="175922968"/>
+    <nd ref="175922970"/>
+    <nd ref="175922972"/>
+    <nd ref="175922965"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="building" v="residential"/>
+  </way>
+  <way id="16966792" visible="true" timestamp="2007-12-17T23:11:01+00:00" user="blackadder">
+    <nd ref="175923064"/>
+    <nd ref="175923066"/>
+    <nd ref="175923068"/>
+    <nd ref="175923070"/>
+    <nd ref="175923072"/>
+    <nd ref="175923077"/>
+    <nd ref="175923081"/>
+    <nd ref="175923083"/>
+    <nd ref="175923086"/>
+    <nd ref="175923089"/>
+    <nd ref="175923092"/>
+    <nd ref="175923093"/>
+    <nd ref="175923094"/>
+    <nd ref="175923095"/>
+    <nd ref="175923096"/>
+    <nd ref="175923099"/>
+    <nd ref="175923064"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="building" v="residential"/>
+  </way>
+  <way id="17060325" visible="true" timestamp="2007-12-18T15:37:01+00:00" user="blackadder">
+    <nd ref="177128255"/>
+    <nd ref="177128262"/>
+    <nd ref="177128259"/>
+    <nd ref="177128257"/>
+    <nd ref="177128255"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="building" v="residential"/>
+  </way>
+  <way id="17060326" visible="true" timestamp="2007-12-18T15:37:01+00:00" user="blackadder">
+    <nd ref="177128265"/>
+    <nd ref="177128270"/>
+    <nd ref="177128268"/>
+    <nd ref="177128266"/>
+    <nd ref="177128265"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="building" v="residential"/>
+  </way>
+  <way id="17060327" visible="true" timestamp="2007-12-18T15:37:01+00:00" user="blackadder">
+    <nd ref="177128275"/>
+    <nd ref="177128273"/>
+    <nd ref="177128288"/>
+    <nd ref="177128291"/>
+    <nd ref="177128294"/>
+    <nd ref="177128297"/>
+    <nd ref="177128299"/>
+    <nd ref="177128301"/>
+    <nd ref="177128303"/>
+    <nd ref="177128306"/>
+    <nd ref="177128308"/>
+    <nd ref="177128310"/>
+    <nd ref="177128275"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="building" v="residential"/>
+  </way>
+  <way id="17060329" visible="true" timestamp="2007-12-18T15:33:58+00:00" user="blackadder">
+    <nd ref="177128278"/>
+    <nd ref="177128280"/>
+    <nd ref="177128281"/>
+    <nd ref="177128283"/>
+    <nd ref="177128278"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="amenity" v="parking"/>
+  </way>
+  <way id="17067452" visible="true" timestamp="2007-12-18T16:53:49+00:00" user="blackadder">
+    <nd ref="177230963"/>
+    <nd ref="177230965"/>
+    <nd ref="177230968"/>
+    <nd ref="177230972"/>
+    <nd ref="177230975"/>
+    <nd ref="177230979"/>
+    <nd ref="177230981"/>
+    <nd ref="177230983"/>
+    <nd ref="177230985"/>
+    <nd ref="177230988"/>
+    <nd ref="177230989"/>
+    <nd ref="177230996"/>
+    <nd ref="177231000"/>
+    <nd ref="177231003"/>
+    <nd ref="177231007"/>
+    <nd ref="177231010"/>
+    <nd ref="177231014"/>
+    <nd ref="177231016"/>
+    <nd ref="177231019"/>
+    <nd ref="177231022"/>
+    <nd ref="177230963"/>
+    <tag k="created_by" v="JOSM"/>
+    <tag k="building" v="residential"/>
+  </way>
+</osm>
diff --git a/examples/outOfRangeMarkers.html b/examples/outOfRangeMarkers.html
new file mode 100644
index 0000000..4870410
--- /dev/null
+++ b/examples/outOfRangeMarkers.html
@@ -0,0 +1,61 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <title>Using maxResolution to control overlays</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style>
+        #map {
+            height: 350px;
+        }
+    </style>
+      <!-- this gmaps key generated for http://openlayers.org/dev/ -->
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <!-- Localhost key -->
+    <!-- <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTS6gjckBmeABOGXIUiOiZObZESPg'></script>-->
+  
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            
+            // Variables
+            map = new OpenLayers.Map('map', {
+                controls: [
+                    new OpenLayers.Control.PanZoomBar(),
+                    new OpenLayers.Control.LayerSwitcher({'ascending':false}),
+                    new OpenLayers.Control.MousePosition(),
+                    new OpenLayers.Control.Navigation()
+                ]
+            });
+            var lon = 35;
+            var lat = -6;
+            var zoom = 6;
+
+
+            // Map Layers
+            var GMapsSat = new OpenLayers.Layer.Google( "Google Satellite" , {type: G_SATELLITE_MAP, 'maxZoomLevel':18} );
+            var GMapsHybr = new OpenLayers.Layer.Google( "Google Hybrid" , {type: G_HYBRID_TYPE, 'maxZoomLevel':18} );
+            var GMapsStreets = new OpenLayers.Layer.Google( "Google Steets" , {type: G_NORMAL_MAP, 'maxZoomLevel':18} );
+            var MarkersLayer2 = new OpenLayers.Layer.Text( "Region info", {location: "outOfRangeMarkers.txt", maxResolution: 0.02});
+
+            // Add Layers
+            map.addLayers([GMapsHybr, GMapsStreets, GMapsSat, MarkersLayer2]);            
+
+            // Visual
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            if (!map.getCenter()) map.zoomToMaxExtent();
+        }
+    </script>
+ </head>
+
+
+ <body onload="init()">
+    <h1 id="title">Using maxResolution to control overlays</h1>
+    <p id="shortdesc">
+      See how to control the maximum resolution for a markers layer, 
+      causing it to not be displayed beyond a certain point.
+    </p>  
+    <div id="map" class="smallmap"></div>
+
+  </body>
+</html>
diff --git a/examples/outOfRangeMarkers.txt b/examples/outOfRangeMarkers.txt
new file mode 100644
index 0000000..6d88977
--- /dev/null
+++ b/examples/outOfRangeMarkers.txt
@@ -0,0 +1,3 @@
+point	title	description	icon
+-4.14,37.90	 	Kilimanjaro Beskrivning	http://www.villageografica.com/Africa-Webmap/img/marker-blue.png
+-3.24,34.35	 	Shinyanga Beskrivning	http://www.villageografica.com/Africa-Webmap/img/marker-blue.png
diff --git a/examples/overviewmap.html b/examples/overviewmap.html
new file mode 100644
index 0000000..aa0d781
--- /dev/null
+++ b/examples/overviewmap.html
@@ -0,0 +1,115 @@
+<html>
+    <head>
+        <title>Overview Map Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+        <style>
+        #map1 {
+            width: 500px; 
+            height: 300px;
+            border: 1px solid gray;
+        }
+        #map2 {
+            width: 500px; 
+            height: 300px;
+            border: 1px solid gray;
+        }
+        </style>
+    </head>
+    <body>
+        <h1 id="title">Overview Map</h1>
+
+        <div id="tags">
+        </div>
+        <p id="shortdesc">
+            Enable a small Overview Map that moves/interacts with your main map.
+        </p>
+        <div id="map1"></div>
+        <p>The above map has an overview map control that is created with
+        the default options.  Much like a regular map, the map contained by
+        the overview map control defaults to a geographic projection.</p>
+        <div id="map2"></div>
+        <p>The second map has an overview map control that is created with
+        non-default options.  In this case, the mapOptions property of the
+        control has been set to use non-default projection related properties,
+        and the layers property has been set to use a layer different from the main
+        map. In addition, any other properties of the overview map control can be
+        set in this way.</p>
+        <script defer="defer" type="text/javascript">
+        
+        // set up some layers
+        
+        var ol = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS", 
+            "http://vmap0.tiles.osgeo.org/wms/vmap0",
+            {layers: 'basic'}
+        );
+        
+        var jpl = new OpenLayers.Layer.WMS(
+            "NASA Global Mosaic", 
+            "http://t1.hypercube.telascience.org/cgi-bin/landsat7",
+            {layers: "landsat7"}
+        );
+        
+        // A clone of the above layer that we will use as overview for map2.
+        // We need to clone jpl before the it gets added to a map, so the
+        // clone can have its own maxExtent and maxResolution instead of
+        // getting these settings initialized from map1.
+        var jplOverview = jpl.clone();
+        
+        // A more detailled layer of Manhattan for map2
+        var ny = new OpenLayers.Layer.WMS(
+            "Manhattan", 
+            "http://demo.opengeo.org/geoserver/wms",
+            {
+                layers: 'tiger-ny', 
+                format: 'image/png'
+            }
+        );
+        
+        // create the top map (with default overview map control)
+        var map1 = new OpenLayers.Map('map1');
+        
+        map1.addLayers([ol, jpl]);
+        map1.addControl(new OpenLayers.Control.LayerSwitcher());
+        
+        // create an overview map control with the default options
+        var overview1 = new OpenLayers.Control.OverviewMap({
+            maximized: true
+        });
+        map1.addControl(overview1);
+        
+        map1.setCenter(new OpenLayers.LonLat(0, 0), 2);
+        
+        // create the bottom map (with advanced overview map control)
+        var mapOptions = {
+            maxExtent: new OpenLayers.Bounds(-8242894.927728, 4965204.031195,
+                    -8227290.161511, 4994963.723637), 
+            maxResolution: 116.24879860156216,
+            projection: "EPSG:900913",
+            units: "m"
+        };
+
+        var map2 = new OpenLayers.Map('map2', mapOptions);
+        
+        map2.addLayers([ny]);
+        
+        // create an overview map control with non-default options
+        var controlOptions = {
+            maximized: true,
+            mapOptions: OpenLayers.Util.extend(mapOptions, {
+                maxResolution: 156543.0339,
+                maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34,
+                                     20037508.34, 20037508.34)
+            }),
+            layers: [jplOverview]
+        }
+        var overview2 = new OpenLayers.Control.OverviewMap(controlOptions);
+        map2.addControl(overview2);
+        
+        map2.setCenter(new OpenLayers.LonLat(-8233165.3575055, 4980298.21113769), 3);
+        
+        </script>
+    </body>
+</html>
diff --git a/examples/pan-zoom-panels.html b/examples/pan-zoom-panels.html
new file mode 100644
index 0000000..3685df3
--- /dev/null
+++ b/examples/pan-zoom-panels.html
@@ -0,0 +1,91 @@
+<html>
+<head>
+    <title>Pan and Zoom Panels</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+
+    <!-- 
+      -- Special stylesheet inclusion for ie6, which doesn't handle the alpha 
+      -- channel of images correctly. The special ie6 stylesheet will only 
+      -- be included if the browser running is ie6. For now, the only thing it
+      -- does is load alternative, non-alpha pngs for the zoom/pan panels.
+      -->
+
+    <!--[if lte IE 6]>
+        <link rel="stylesheet" href="../theme/default/ie6-style.css" type="text/css" />
+    <![endif]-->
+
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script type="text/javascript" src="../lib/OpenLayers.js"></script>
+    <script>
+    var map;
+    var lon = 5;
+    var lat = 40;
+    var zoom = 5;
+    function init(){
+        map = new OpenLayers.Map("map", {
+            controls: [
+                new OpenLayers.Control.Navigation(),
+                new OpenLayers.Control.PanPanel(),
+                new OpenLayers.Control.ZoomPanel()
+            ]
+        });
+        
+        var wms = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://vmap0.tiles.osgeo.org/wms/vmap0",
+            {layers: 'basic'}
+        );
+        map.addLayers([wms]);
+        
+        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+    }
+    </script>
+    <style type="text/css">
+        .olControlPanPanel {
+             width: 100%;
+             height: 100%;
+             left: 0;
+             top: 0;
+        }
+        .olControlPanPanel .olControlPanNorthItemInactive {
+             left: 50%;
+             margin-left: -9px;
+             top: 0;
+        }
+        .olControlPanPanel .olControlPanSouthItemInactive {
+             left: 50%;
+             margin-left: -9px;
+             top: auto;
+             bottom: 0;
+        }
+        .olControlPanPanel .olControlPanWestItemInactive {
+             top: 50%;
+             margin-top: -9px;
+             left: 0;
+        }
+        .olControlPanPanel .olControlPanEastItemInactive {
+             top: 50%;
+             margin-top: -9px;
+             left: auto;
+             right: 0;
+        }
+       .olControlZoomPanel {
+             left: auto;
+             right: 23px;
+             top: 8px;
+       } 
+    </style>
+</head>
+<body onload='init();'>
+    <h1 id="title">Pan and Zoom Panels</h1>
+    <div id="tags"></div>
+    <p id="shortdesc">Customizable pan and zoom panels</p>
+    </p>
+    <div id="map" class="smallmap"></div>
+    <p id="docs">
+        The pan and zoom panels allow you to use CSS styling to change the
+        look and feel of the panels, including changing their position
+        and their icons without needing to change any code.
+    </p>   
+</body>
+</html>
diff --git a/examples/panel.html b/examples/panel.html
new file mode 100644
index 0000000..8155550
--- /dev/null
+++ b/examples/panel.html
@@ -0,0 +1,102 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Control Panel</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .olControlPanel div { 
+          display:block;
+          width:  24px;
+          height: 24px;
+          margin: 5px;
+          background-color:white;
+        }
+        
+        .olControlPanel .olControlMouseDefaultsItemActive { 
+          background-color: blue;
+          background-image: url("../theme/default/img/pan_on.png");
+        }
+        .olControlPanel .olControlMouseDefaultsItemInactive { 
+          background-color: orange;
+          background-image: url("../theme/default/img/pan_off.png");
+        }
+        .olControlPanel .olControlDrawFeatureItemActive { 
+          width:  22px;  
+          height: 22px;
+          background-image: url("../theme/default/img/draw_line_on.png");
+        }
+        .olControlPanel .olControlDrawFeatureItemInactive { 
+          width:  22px;  
+          height: 22px;
+          background-image: url("../theme/default/img/draw_line_off.png");
+        }
+        .olControlPanel .olControlZoomBoxItemInactive { 
+          width:  22px;  
+          height: 22px;
+          background-color: orange;
+          background-image: url("../img/drag-rectangle-off.png");
+        }
+        .olControlPanel .olControlZoomBoxItemActive { 
+          width:  22px;  
+          height: 22px;
+          background-color: blue;
+          background-image: url("../img/drag-rectangle-on.png");
+        }
+        .olControlPanel .olControlZoomToMaxExtentItemInactive { 
+          width:  18px;  
+          height: 18px;
+          background-image: url("../img/zoom-world-mini.png");
+        }
+        
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map', { controls: [] } );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+
+            vlayer = new OpenLayers.Layer.Vector( "Editable" );
+            map.addLayer(vlayer);
+            
+            
+            zb = new OpenLayers.Control.ZoomBox(
+                {title:"Zoom box: Selecting it you can zoom on an area by clicking and dragging."});
+            var panel = new OpenLayers.Control.Panel({defaultControl: zb});
+            panel.addControls([
+                new OpenLayers.Control.MouseDefaults(
+                    {title:'You can use the default mouse configuration'}), 
+                zb,
+                new OpenLayers.Control.DrawFeature(vlayer, OpenLayers.Handler.Path,
+                    {title:'Draw a feature'}),
+                new OpenLayers.Control.ZoomToMaxExtent({title:"Zoom to the max extent"}) 
+            ]);
+            
+            nav = new OpenLayers.Control.NavigationHistory();
+            // parent control must be added to the map
+            map.addControl(nav);
+            panel.addControls([nav.next, nav.previous]);
+            
+            map.addControl(panel);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Custom Control.Panel</h1>
+    <p id="shortdesc">
+      Create a custom control.panel, styled entirely with
+      CSS, and add your own controls to it.
+    </p>  
+    <div id="panel"></div>
+    <div id="map" class="smallmap"></div>
+  </body>
+</html>
diff --git a/examples/point-track-markers.html b/examples/point-track-markers.html
new file mode 100644
index 0000000..71ce675
--- /dev/null
+++ b/examples/point-track-markers.html
@@ -0,0 +1,64 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Point Track Markers</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer, rss, lineFeatures, popup;
+
+        OpenLayers.ProxyHost = "proxy.cgi?url=";
+        function init(){
+            map = new OpenLayers.Map('map', {maxResolution:'auto'});
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(20.22, 22.05), 9);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+        }
+
+        function addUrl() {
+            var urlObj = OpenLayers.Util.getElement('url'); 
+            var value = urlObj.value;
+            var parts = value.split("/");
+            rss = new OpenLayers.Layer.GeoRSS(parts[parts.length-1], value);
+            rss.events.register("loadend", window, populateMap);
+            map.addLayer(rss);
+        }
+
+        function populateMap() {
+            // create the point track layer
+            var lineLayer = new OpenLayers.Layer.PointTrack(rss.name + " Track",
+                    {dataFrom: OpenLayers.Layer.PointTrack.dataFrom.SOURCE_NODE});
+            // add the features from the rss layer to the track layer. This
+            // also works with OpenLayers.Feature.Vector features.
+            lineLayer.addNodes(rss.features);
+            map.addLayer(lineLayer);
+            
+            rss.setName(rss.name + " Comments");
+            
+            var feature, marker;
+            // only show markers for features that are not "Untitled"
+            for (var i = rss.features.length-1; i>0; i--) {
+                if (rss.features[i].data.popupContentHTML.indexOf(
+                        "Untitled") != -1) {
+                    rss.removeMarker(rss.markers[i]);
+                }
+            }
+            
+            // keep markers on top of tracks
+            map.raiseLayer(rss, 1);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">GeoRSS PointTrack in OpenLayers</h1>
+    <p style="font-size:.9em;">This demo uses OpenLayers.Layer.GeoRSS and OpenLayers.Layer.PointTrack. The track is created by connecting the points of the GeoRSS feed.</a></p>
+    <form onsubmit="return false;">
+   GeoRSS URL: <input type="text" id="url" size="50" /><input type="submit" onclick="addUrl(); return false;" value="Load Feed" onsubmit="addUrl(); return false;" />
+    </form>  
+    <p>The above input box allows the input of a URL to a GeoRSS feed. This feed can be local to the HTML page -- for example, entering 'xml/track1.xml' will work by default.</p>
+    <p>The example shows a track, displayed as a line connecting the points of the feed. It also shows markers at positions that have a title tag in the rss item. If clicked, a popup will show title and description.</p>   
+    <div id="map" class="smallmap"></div>
+  </body>
+</html>
diff --git a/examples/popupMatrix.html b/examples/popupMatrix.html
new file mode 100644
index 0000000..1395c04
--- /dev/null
+++ b/examples/popupMatrix.html
@@ -0,0 +1,904 @@
+<html xmlns="http://www.w3.org/1999/xhtml" debug="true">
+  <head>
+    <title>OpenLayers: Popup Mayhem</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #map {
+            width: 900px;
+            height: 500px;
+            border: 1px solid black;
+            background-color: blue;
+        }
+    </style>
+
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        var layer, markers;
+        
+        var currentPopup;
+        
+        var samplePopupContentsHTML = "Old man down, way down down, down by the docks of the city.<br>Blind and dirty, asked me for a dime, a dime for a cup of coffee.<br>I got no dime but I got some time to hear his story.<br>My name is August West, and I love my Pearly Baker best more than my wine.<br>More than my wine - more than my maker, though he's no friend of mine.<br><br>Everyone said, I'd come to no good, I knew I would Pearly, believe them.<br>Half of my life, I spent doin' ti [...]
+        var samplePopupContentsHTML_WideShort = "Old man down, way down down, down by the docks of the city.Blind and dirty, asked me for a dime, a dime for a cup of coffee.I got no dime but I got some time to hear his story.My name is August West, and I love my Pearly Baker best more than my wine.More than my wine - more than my maker, though he's no friend of mine.Everyone said, I'd come to no good, I knew I would Pearly, believe them.<br>Half of my life, I spent doin' time for some ot [...]
+        
+// different popup types
+
+    //anchored
+        AutoSizeAnchored = OpenLayers.Class(OpenLayers.Popup.Anchored, {
+            'autoSize': true
+        });
+
+        AutoSizeAnchoredMinSize = OpenLayers.Class(OpenLayers.Popup.Anchored, {
+            'autoSize': true, 
+            'minSize': new OpenLayers.Size(400,400)
+        });
+
+        AutoSizeAnchoredMaxSize = OpenLayers.Class(OpenLayers.Popup.Anchored, {
+            'autoSize': true, 
+            'maxSize': new OpenLayers.Size(100,100)
+        });
+
+        //anchoredbubble
+    
+        AutoSizeAnchoredBubble = OpenLayers.Class(OpenLayers.Popup.AnchoredBubble, {
+            'autoSize': true
+        });
+
+        AutoSizeAnchoredBubbleMinSize = OpenLayers.Class(OpenLayers.Popup.AnchoredBubble, {
+            'autoSize': true, 
+            'minSize': new OpenLayers.Size(400,400)
+        });
+
+        AutoSizeAnchoredBubbleMaxSize = OpenLayers.Class(OpenLayers.Popup.AnchoredBubble, {
+            'autoSize': true, 
+            'maxSize': new OpenLayers.Size(100,100)
+        });
+
+        //framed
+
+        //disable the autosize for the purpose of our matrix
+        OpenLayers.Popup.FramedCloud.prototype.autoSize = false;
+
+        AutoSizeFramedCloud = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
+            'autoSize': true
+        });
+
+        AutoSizeFramedCloudMinSize = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
+            'autoSize': true, 
+            'minSize': new OpenLayers.Size(400,400)
+        });
+
+        AutoSizeFramedCloudMaxSize = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
+            'autoSize': true, 
+            'maxSize': new OpenLayers.Size(100,100)
+        });
+
+        
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            layer = new OpenLayers.Layer.Image(
+                "popupMatrix", 
+                "popupMatrix.jpg", 
+                new OpenLayers.Bounds(-82.5,-71.5,97.5,67.5),
+                new OpenLayers.Size(1024,768)
+            );
+            map.addLayer(layer);
+
+            markers = new OpenLayers.Layer.Markers("zibo");
+            map.addLayer(markers);
+
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+
+            addMarkers();
+        }
+        
+        function addMarkers() {
+
+            var ll, popupClass, popupContentHTML;
+
+        //
+        //Anchored NO OVERFLOW
+        //
+
+            //anchored popup small contents no autosize
+            ll = new OpenLayers.LonLat(-55,20);
+            popupClass = OpenLayers.Popup.Anchored;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup small contents no autosize closebox
+            var ll = new OpenLayers.LonLat(-50,20);
+            popupClass = OpenLayers.Popup.Anchored;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored popup small contents autosize
+            ll = new OpenLayers.LonLat(-40,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup small contents autosize closebox
+            ll = new OpenLayers.LonLat(-35,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored popup small contents autosize minsize
+            ll = new OpenLayers.LonLat(-25,20);
+            popupClass = AutoSizeAnchoredMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup small contents autosize minsize closebox
+            ll = new OpenLayers.LonLat(-20,20);
+            popupClass = AutoSizeAnchoredMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored popup small contents autosize maxsize
+            ll = new OpenLayers.LonLat(-10,20);
+            popupClass = AutoSizeAnchoredMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup small contents autosize maxsize closebox
+            ll = new OpenLayers.LonLat(-5,20);
+            popupClass = AutoSizeAnchoredMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored popup bigger contents autosize
+            ll = new OpenLayers.LonLat(5,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<div style="background-color:red;">Popup.Anchored<br>autosize<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(10,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<div style="background-color:red;">Popup.Anchored<br>autosize<br>closebox<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+            //anchored popup wide short text contents autosize
+            ll = new OpenLayers.LonLat(20,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<div style="background-color:red;">Popup.Anchored<br>autosize - wide short text<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup wide short text contents autosize closebox
+            ll = new OpenLayers.LonLat(25,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<div style="background-color:red;">Popup.Anchored<br>autosize - wide short text<br>closebox<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored popup wide short fixed contents autosize
+            ll = new OpenLayers.LonLat(35,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="wideshort.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup wide short fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(40,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="wideshort.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored popup thin long fixed contents autosize
+            ll = new OpenLayers.LonLat(50,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="thinlong.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup thin long fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(55,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="thinlong.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored popup wide long fixed contents autosize
+            ll = new OpenLayers.LonLat(65,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img  src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored popup wide long fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(70,20);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img  src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+        //
+        //Anchored WITH OVERFLOW
+        //
+
+            //anchored popup small contents no autosize overflow
+            var ll = new OpenLayers.LonLat(-55,15);
+            popupClass = OpenLayers.Popup.Anchored;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup small contents no autosize closebox overflow
+            var ll = new OpenLayers.LonLat(-50,15);
+            popupClass = OpenLayers.Popup.Anchored;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored popup small contents autosize overflow
+            ll = new OpenLayers.LonLat(-40,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup small contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(-35,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored popup small contents autosize minsize overflow
+            ll = new OpenLayers.LonLat(-25,15);
+            popupClass = AutoSizeAnchoredMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup small contents autosize minsize closebox overflow
+            ll = new OpenLayers.LonLat(-20,15);
+            popupClass = AutoSizeAnchoredMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored popup small contents autosize maxsize overflow
+            ll = new OpenLayers.LonLat(-10,15);
+            popupClass = AutoSizeAnchoredMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup small contents autosize maxsize closebox overflow
+            ll = new OpenLayers.LonLat(-5,15);
+            popupClass = AutoSizeAnchoredMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored popup bigger contents autosize overflow
+            ll = new OpenLayers.LonLat(5,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<div style="background-color:red;">Popup.Anchored<br>autosize<br>overflow<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup bigger contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(10,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<div style="background-color:red;">Popup.Anchored<br>autosize<br>overflow<br>closebox<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored popup wide short text contents autosize overflow
+            ll = new OpenLayers.LonLat(20,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<div style="background-color:red;">Popup.Anchored<br>autosize<br>overflow<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup wide short text contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(25,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<div style="background-color:red;">Popup.Anchored<br>autosize<br>overflow<br>closebox<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+            //anchored popup wide short fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(35,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup wide short fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(40,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored popup thin long fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(50,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup thin long fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(55,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored popup wide long fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(65,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored popup wide long fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(70,15);
+            popupClass = AutoSizeAnchored;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+        //
+        //Bubble NO OVERFLOW
+        //
+
+            //anchored bubble popup small contents no autosize
+            var ll = new OpenLayers.LonLat(-55,5);
+            popupClass = OpenLayers.Popup.AnchoredBubble;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup small contents no autosize closebox
+            var ll = new OpenLayers.LonLat(-50,5);
+            popupClass = OpenLayers.Popup.AnchoredBubble;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup small contents autosize
+            ll = new OpenLayers.LonLat(-40,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup small contents autosize closebox
+            ll = new OpenLayers.LonLat(-35,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup small contents autosize minsize
+            ll = new OpenLayers.LonLat(-25,5);
+            popupClass = AutoSizeAnchoredBubbleMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup small contents autosize minsize closebox
+            ll = new OpenLayers.LonLat(-20,5);
+            popupClass = AutoSizeAnchoredBubbleMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup small contents autosize maxsize
+            ll = new OpenLayers.LonLat(-10,5);
+            popupClass = AutoSizeAnchoredBubbleMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup small contents autosize maxsize closebox
+            ll = new OpenLayers.LonLat(-5,5);
+            popupClass = AutoSizeAnchoredBubbleMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(5,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<div style="background-color:red;">Popup.AnchoredBubble<br>autosize<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(10,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<div style="background-color:red;">Popup.AnchoredBubble<br>autosize<br>closebox<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup wide short text contents autosize
+            ll = new OpenLayers.LonLat(20,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<div style="background-color:red;">Popup.AnchoredBubble<br>autosize - wide short text<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored bubble popup wide short text contents autosize closebox
+            ll = new OpenLayers.LonLat(25,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<div style="background-color:red;">Popup.AnchoredBubble<br>autosize - wide short text<br>closebox<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup wide short fixed contents autosize
+            ll = new OpenLayers.LonLat(35,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored bubble popup wide short fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(40,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup thin long fixed contents autosize
+            ll = new OpenLayers.LonLat(50,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored bubble popup thin long fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(55,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup wide long fixed contents autosize
+            ll = new OpenLayers.LonLat(65,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored bubble popup wide long fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(70,5);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+          //
+          //Bubble OVERFLOW
+          //
+
+              //anchored bubble popup small contents no autosize
+            var ll = new OpenLayers.LonLat(-55,0);
+            popupClass = OpenLayers.Popup.AnchoredBubble;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+              //anchored bubble popup small contents no autosize closebox
+            var ll = new OpenLayers.LonLat(-50,0);
+            popupClass = OpenLayers.Popup.AnchoredBubble;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup small contents autosize
+            ll = new OpenLayers.LonLat(-40,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup small contents autosize closebox
+            ll = new OpenLayers.LonLat(-35,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup small contents autosize minsize
+            ll = new OpenLayers.LonLat(-25,0);
+            popupClass = AutoSizeAnchoredBubbleMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup small contents autosize minsize closebox
+            ll = new OpenLayers.LonLat(-20,0);
+            popupClass = AutoSizeAnchoredBubbleMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup small contents autosize maxsize
+            ll = new OpenLayers.LonLat(-10,0);
+            popupClass = AutoSizeAnchoredBubbleMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup small contents autosize maxsize closebox
+            ll = new OpenLayers.LonLat(-5,0);
+            popupClass = AutoSizeAnchoredBubbleMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(5,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<div style="background-color:red;">Popup.AnchoredBubble<br>autosize<br>overflow<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(10,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<div style="background-color:red;">Popup.AnchoredBubble<br>autosize<br>closebox<br>overflow<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup wide short contents autosize overflow
+            ll = new OpenLayers.LonLat(20,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<div style="background-color:red;">Popup.AnchoredBubble<br>autosize<br>overflow<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup wide short contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(25,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<div style="background-color:red;">Popup.AnchoredBubble<br>autosize<br>overflow<br>closebox<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup wide short fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(35,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup wide short fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(40,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup thin long fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(50,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup thin long fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(55,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup wide long fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(65,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup wide long fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(70,0);
+            popupClass = AutoSizeAnchoredBubble;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+   //FRAMED
+ 
+          //
+          //FRAMED NO OVERFLOW
+          //
+
+              //anchored bubble popup small contents no autosize
+            var ll = new OpenLayers.LonLat(-55,-15);
+            popupClass = OpenLayers.Popup.FramedCloud;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+              //anchored bubble popup small contents no autosize closebox
+            var ll = new OpenLayers.LonLat(-50,-15);
+            popupClass = OpenLayers.Popup.FramedCloud;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup small contents autosize
+            ll = new OpenLayers.LonLat(-40,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup small contents autosize closebox
+            ll = new OpenLayers.LonLat(-35,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup small contents autosize minsize
+            ll = new OpenLayers.LonLat(-25,-15);
+            popupClass = AutoSizeFramedCloudMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup small contents autosize minsize closebox
+            ll = new OpenLayers.LonLat(-20,-15);
+            popupClass = AutoSizeFramedCloudMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup small contents autosize maxsize
+            ll = new OpenLayers.LonLat(-10,-15);
+            popupClass = AutoSizeFramedCloudMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup small contents autosize maxsize closebox
+            ll = new OpenLayers.LonLat(-5,-15);
+            popupClass = AutoSizeFramedCloudMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(5,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<div style="background-color:red;">Popup.FramedCloud<br>autosize<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, false);
+
+            //anchored bubble popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(10,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<div style="background-color:red;">Popup.FramedCloud<br>autosize<br>closebox<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup wide short text contents autosize
+            ll = new OpenLayers.LonLat(20,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<div style="background-color:red;">Popup.FramedCloud<br>autosize - wide short text<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored bubble popup wide short text contents autosize closebox
+            ll = new OpenLayers.LonLat(25,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<div style="background-color:red;">Popup.FramedCloud<br>autosize - wide short text<br>closebox<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup wide short fixed contents autosize
+            ll = new OpenLayers.LonLat(35,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored bubble popup wide short fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(40,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup thin long fixed contents autosize
+            ll = new OpenLayers.LonLat(50,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored bubble popup thin long fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(55,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+
+            //anchored bubble popup wide long fixed contents autosize
+            ll = new OpenLayers.LonLat(65,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML);
+
+            //anchored bubble popup wide long fixed contents autosize closebox
+            ll = new OpenLayers.LonLat(70,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true);
+
+          //
+          //FRAMED OVERFLOW
+          //
+
+              //anchored bubble popup small contents no autosize
+            var ll = new OpenLayers.LonLat(-55,-20);
+            popupClass = OpenLayers.Popup.FramedCloud;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+              //anchored bubble popup small contents no autosize closebox
+            var ll = new OpenLayers.LonLat(-50,-20);
+            popupClass = OpenLayers.Popup.FramedCloud;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup small contents autosize
+            ll = new OpenLayers.LonLat(-40,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup small contents autosize closebox
+            ll = new OpenLayers.LonLat(-35,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup small contents autosize minsize
+            ll = new OpenLayers.LonLat(-25,-20);
+            popupClass = AutoSizeFramedCloudMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup small contents autosize minsize closebox
+            ll = new OpenLayers.LonLat(-20,-20);
+            popupClass = AutoSizeFramedCloudMinSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup small contents autosize maxsize
+            ll = new OpenLayers.LonLat(-10,-20);
+            popupClass = AutoSizeFramedCloudMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup small contents autosize maxsize closebox
+            ll = new OpenLayers.LonLat(-5,-20);
+            popupClass = AutoSizeFramedCloudMaxSize;
+            popupContentHTML = '<img src="small.jpg"></img>';
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(5,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<div style="background-color:red;">Popup.FramedCloud<br>autosize<br>overflow<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup bigger contents autosize closebox
+            ll = new OpenLayers.LonLat(10,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<div style="background-color:red;">Popup.FramedCloud<br>autosize<br>closebox<br>overflow<br>' + samplePopupContentsHTML + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup wide short contents autosize overflow
+            ll = new OpenLayers.LonLat(20,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<div style="background-color:red;">Popup.FramedCloud<br>autosize<br>overflow<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup wide short contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(25,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<div style="background-color:red;">Popup.FramedCloud<br>autosize<br>overflow<br>closebox<br>' + samplePopupContentsHTML_WideShort + '</div>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup wide short fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(35,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup wide short fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(40,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="wideshort.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup thin long fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(50,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup thin long fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(55,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="thinlong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+
+
+            //anchored bubble popup wide long fixed contents autosize overflow
+            ll = new OpenLayers.LonLat(65,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, false, true);
+
+            //anchored bubble popup wide long fixed contents autosize closebox overflow
+            ll = new OpenLayers.LonLat(70,-20);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = '<img src="widelong.jpg"></img>' 
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+ 
+
+        }
+
+        /**
+         * Function: addMarker
+         * Add a new marker to the markers layer given the following lonlat, 
+         *     popupClass, and popup contents HTML. Also allow specifying 
+         *     whether or not to give the popup a close box.
+         * 
+         * Parameters:
+         * ll - {<OpenLayers.LonLat>} Where to place the marker
+         * popupClass - {<OpenLayers.Class>} Which class of popup to bring up 
+         *     when the marker is clicked.
+         * popupContentHTML - {String} What to put in the popup
+         * closeBox - {Boolean} Should popup have a close box?
+         * overflow - {Boolean} Let the popup overflow scrollbars?
+         */
+        function addMarker(ll, popupClass, popupContentHTML, closeBox, overflow) {
+
+            var feature = new OpenLayers.Feature(markers, ll); 
+            feature.closeBox = closeBox;
+            feature.popupClass = popupClass;
+            feature.data.popupContentHTML = popupContentHTML;
+            feature.data.overflow = (overflow) ? "auto" : "hidden";
+                    
+            var marker = feature.createMarker();
+
+            var markerClick = function (evt) {
+                if (this.popup == null) {
+                    this.popup = this.createPopup(this.closeBox);
+                    map.addPopup(this.popup);
+                    this.popup.show();
+                } else {
+                    this.popup.toggle();
+                }
+                currentPopup = this.popup;
+                OpenLayers.Event.stop(evt);
+            };
+            marker.events.register("mousedown", feature, markerClick);
+
+            markers.addMarker(marker);
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+  <h1 id="title">Popup Matrix</h1>
+
+  <div id="tags">
+  </div>
+      <p id="shortdesc">
+          All kinds of different popup configurations.
+      </p>
+
+      <div id="map" class="smallmap"></div>
+
+        <!-- preloading these images so the autosize will work correctly -->
+        <img src="wideshort.jpg" style="position:absolute; top:-5000px; left: -5000px"></img>
+        <img src="widelong.jpg" style="position:absolute; top:-5000px; left: -5000px"></img>
+        <img src="thinlong.jpg" style="position:absolute; top:-5000px; left: -5000px"></img>
+
+       <p> All of the images in this file a pre-cached, meaning they are 
+           loaded immediately when you load the page (they are just placed 
+           far offscreen, that's why you don't see them). 
+       </p>
+       <br>    
+       <p> The only image that is *not* preloaded is small.jpg, the brazilian
+           flag. We do this in order to test out to make sure that our auto-sizing
+             code does in fact activate itself as the images load. To verify 
+             this, clear your cache and reload this example page. Click on 
+             any of the markers in the 'AutoSize' row. If the popup autosizes
+             to correctly contain the entire flag: golden. If the popup is 
+             tiny and you can only see a corner of it, then this code is broken.
+        </p>
+
+      <br/>      
+
+      
+   </div>
+  </body>
+</html>
diff --git a/examples/popupMatrix.jpg b/examples/popupMatrix.jpg
new file mode 100644
index 0000000..fb09bc0
Binary files /dev/null and b/examples/popupMatrix.jpg differ
diff --git a/examples/popups.html b/examples/popups.html
new file mode 100644
index 0000000..93b3ed9
--- /dev/null
+++ b/examples/popups.html
@@ -0,0 +1,129 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer, popup;
+        var markers, feature, marker;
+        
+        function init(){
+            map = new OpenLayers.Map('map');
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            layer = new OpenLayers.Layer.Google( "Google" );
+            map.addLayer(layer);
+
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToMaxExtent();
+            
+        }
+
+        function changer() {
+            popup.setBackgroundColor("red");
+            popup.setSize(new OpenLayers.Size(100,600));
+//            popup.moveTo(new OpenLayers.Pixel(120,120));
+//            popup.setOpacity(.5);
+            popup.setBorder("2px solid");    
+            popup.setContentHTML("High Chickens");            
+        }
+
+        function add() {
+            popup = new OpenLayers.Popup("chicken", 
+                                         new OpenLayers.LonLat(5,40),
+                                         new OpenLayers.Size(200,200),
+                                         "example popup",
+                                         true);
+            popup.closeOnMove = true;
+        
+            map.addPopup(popup);
+        }        
+
+        function addAnchor() {
+            popup = new OpenLayers.Popup.Anchored("chicken", 
+                                         new OpenLayers.LonLat(5,40),
+                                         new OpenLayers.Size(200,200),
+                                         "example popup", true);
+        
+            map.addPopup(popup);
+        }        
+        
+        function addMarker() {
+    
+            markers = new OpenLayers.Layer.Markers("zibo");
+            map.addLayer(markers);
+
+            feature = new OpenLayers.Feature(layer, 
+                                                 new OpenLayers.LonLat(0,0));
+
+
+            marker = feature.createMarker();
+            
+            markers.addMarker(marker);
+            marker.events.register("mousedown", marker, mousedown);
+                                                             
+        }
+        
+        function mousedown(evt) {
+            if (popup == null) {
+                popup = feature.createPopup(true);
+                popup.setContentHTML("<div style='background-color:red; width:150;height:100'><a href='http://www.somethingconstructive.net' target='_blank'>click me</a></div>");
+                popup.setBackgroundColor("yellow");
+                popup.setOpacity(0.7);
+                markers.map.addPopup(popup);
+            } else {
+                popup.toggle();
+               }
+            OpenLayers.Event.stop(evt);
+        }        
+
+        /**
+         * @param {Event} evt
+         */
+        function onPopupMouseDown(evt) {
+            markers.map.removePopup(popup);
+            popup.destroy();
+            popup = null;
+            OpenLayers.Event.stop(evt);
+        }
+
+
+        function destroy() {
+            popup.destroy();
+        }
+
+        function remove() {
+            markers.removeMarker(marker);
+        }
+
+        function removelayer() {
+            layer.destroy();
+//            map.removeLayer(markers);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+  <h1 id="title">Popup Mayhem</h1>
+
+  <div id="tags">
+  </div>
+  <p id="shortdesc">
+      All kinds of ways to create and interact with Popups.
+  </p>
+
+  <div id="map" class="smallmap"></div>
+    <p>If you open an anchoredbubble and switch to google, it shouldn't crash. If it does, don't release OpenLayers.</p>  
+    <div style="background-color:purple" onclick="add()"> click to add Popup to map</div>
+    <div style="background-color:green" onclick="addMarker()"> click to add a Marker with an AnchoredBubble popup</div>
+    <div style="background-color:blue" onclick="changer()"> click to modify popup's attributes</div>
+    <div style="background-color:red" onclick="remove()"> click to remove the popup from map</div>
+    <div style="background-color:grey" onclick="removelayer()"> click to remove the markers layer</div>
+    <div style="background-color:orange" onclick="alert(marker.onScreen())"> marker.onscreen()?</div>
+    <div style="background-color:yellow" onclick="destroy()"> click to destroy the popup from map</div> 
+    <div id="docs">
+      Detailed description of this example needs to be written.
+   </div>
+  </body>
+</html>
diff --git a/examples/projected-map.html b/examples/projected-map.html
new file mode 100644
index 0000000..2c7e2a5
--- /dev/null
+++ b/examples/projected-map.html
@@ -0,0 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Non-Geographic Projection</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+    #map {
+    width: 100%;
+    height: 100%;
+    border: 0px;
+    padding: 0px;
+    }
+    </style>
+
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lat = 900863; 
+        var lon = 235829;
+        var zoom = 6;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map' );
+            var basemap = new OpenLayers.Layer.WMS( "Boston", 
+                "http://boston.freemap.in/cgi-bin/mapserv?",
+                {
+                 map: '/www/freemap.in/boston/map/gmaps.map', 
+                 layers: 'border,water,roads,rapid_transit,buildings', 
+                 format: 'png', 
+                 transparent: 'off'
+                },
+                // These are the important parts for creating a non-epsg:4326
+                // map: Maxextent is the boundary of the map/tile loading area,
+                // maxResolution is the units/pixel at the highest zoom, and 
+                // projection is the projection to be used in WMS/WFS Requests.
+                {
+                  maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), 
+                  maxResolution: 296985/1024, // Another alternative is 'auto', which 
+                                              // will automatically fit the map: you can 
+                                              // then check map.baseLayer.resolutions[0] for
+                                              // a reasonable value.
+                  projection:"EPSG:2805",     // Used in WMS/WFS requests.   
+                  units: "m"                  // Only neccesary for working with scales.
+                  } );
+                
+            map.addLayer(basemap);
+            
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.ScaleLine());
+        }
+    </script>
+  </head>
+
+<body onload="init()">
+  <h1 id="title">Layer Projections</h1>
+
+  <div id="tags">
+  </div>
+  <p id="shortdesc">
+      Use different (not default) projections with your map 
+  </p>
+    <div id="map" class="smallmap"></div>
+    <p>When using alternative projections, you still use OpenLayers.LonLat objects, even though
+       the properties are actually X/Y values at that point.</p>
+</body>
+</html>
diff --git a/examples/protocol-gears.html b/examples/protocol-gears.html
new file mode 100644
index 0000000..f98dcfa
--- /dev/null
+++ b/examples/protocol-gears.html
@@ -0,0 +1,257 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .float-left {
+            float: left;
+        }
+        .clear-left {
+            clear: left;
+        }
+    </style>
+    <script src="../lib/Gears/gears_init.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, vector, protocol, modify;
+
+        function init() {
+            // create Gears protocol
+            protocol = new OpenLayers.Protocol.SQL.Gears({
+                databaseName: "db_name",
+                tableName: "table_name",
+                saveFeatureState: false
+            });
+
+            if (!GearsIsSupported()) {
+                return;
+            }
+
+            map = new OpenLayers.Map("map");
+
+            // create base layer
+            var layer = new OpenLayers.Layer.WMS("OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {"layers": "basic"}
+            );
+            map.addLayer(layer);
+
+            // create vector layer
+            vector = new OpenLayers.Layer.Vector("Vector", {
+                protocol: protocol,
+                strategies : [new OpenLayers.Strategy.Fixed()],
+                eventListeners: {
+                    featuremodified: function(obj) {
+                        displayStatus();
+                    }
+                }
+            });
+            map.addLayer(vector);
+
+            // create modify feature control
+            modify = new OpenLayers.Control.ModifyFeature(vector);
+
+            // create editing panel
+            var panel = new OpenLayers.Control.Panel({
+                displayClass: "olControlEditingToolbar"
+            });
+
+            var navigation = new OpenLayers.Control.Navigation({
+                eventListeners: {
+                    activate: function(obj) {
+                        modify.activate();
+                    },
+                    deactivate: function(obj) {
+                        modify.deactivate();
+                    }
+                }
+            });
+
+            var editing = new OpenLayers.Control.DrawFeature(
+                vector, OpenLayers.Handler.Polygon, {
+                displayClass: "olControlDrawFeaturePolygon",
+                eventListeners: {
+                    featureadded: function(obj) {
+                        obj.feature.state = OpenLayers.State.INSERT;
+                        displayStatus();
+                    }
+                }
+            });
+            panel.addControls([navigation, editing]);
+            panel.defaultControl = navigation;
+
+            // add controls to the map
+            map.addControl(modify);
+            map.addControl(panel);
+
+            // center the map
+            map.setCenter(new OpenLayers.LonLat(5, 40), 5);
+        }
+
+        function displayResult(txt) {
+            if (window.resultDomElement === undefined) {
+                window.resultDomElement = OpenLayers.Util.getElement("last-result");
+            }
+            resultDomElement.innerHTML = txt;
+            displayStatus();
+        }
+
+        function displayStatus() {
+            if (window.statusDomElement === undefined) {
+                window.statusDomElement = OpenLayers.Util.getElement("status");
+            }
+
+            var createCnt = 0;
+            var updateCnt = 0;
+            var deleteCnt = 0;
+            var i, len, state;
+            for (i = 0, len = vector.features.length; i < len; i++) {
+                state = vector.features[i].state;
+                if (state == OpenLayers.State.INSERT) {
+                    createCnt++;
+                } else if (state == OpenLayers.State.UPDATE) {
+                    updateCnt++;
+                } else if (state == OpenLayers.State.DELETE) {
+                    deleteCnt++;
+                }
+            }
+            statusDomElement.innerHTML = createCnt + " features to create, " +
+                                         updateCnt + " features to update, " +
+                                         deleteCnt + " features to delete";
+        }
+
+        function GearsIsSupported() {
+            if (!protocol.supported()) {
+                OpenLayers.Console.userError("You must install Gears prior to using this example");
+                return false;
+            }
+            return true;
+        }
+
+        function featuresWithState(state) {
+            var list = [];
+            var i, len, feature;
+            for (i = 0, len = vector.features.length; i < len; i++) {
+                feature = vector.features[i];
+                if (feature.state == state) {
+                    list.push(feature);
+                }
+            }
+            return list;
+        }
+
+        function _sync() {
+            if (!GearsIsSupported()) {
+                return;
+            }
+            var resp = protocol.read();
+            if (!resp.success()) {
+                OpenLayers.Console.error("reading from Gears DB failed");
+                return;
+            }
+            vector.destroyFeatures();
+            if (!resp.features || resp.features.length <= 0) {
+                displayResult("No features to read");
+                return;
+            }
+            vector.addFeatures(resp.features);
+            displayResult("features successfully read");
+        }
+
+        function _commit() {
+            if (!GearsIsSupported()) {
+                return;
+            }
+            var error = false;
+            function callback(resp) {
+                if (error) {
+                    return;
+                }
+                if (!resp.success()) {
+                    OpenLayers.Console.error("Commiting to Gears DB failed");
+                    error = true;
+                    return;
+                }
+                modify.selectControl.unselectAll()
+
+                if (resp.reqFeatures) {
+                    vector.destroyFeatures(resp.reqFeatures);
+                }
+                if (resp.features) {
+                    vector.addFeatures(resp.features);
+                }
+            }
+            if (vector.features.length > 0) {
+                protocol.commit(vector.features, {
+                    "create": {
+                        callback: callback
+                    },
+                    "update": {
+                        callback: callback
+                    },
+                    "delete": {
+                        callback: callback
+                    }
+                });
+                if (!error) {
+                    displayResult("features successfully committed");
+                }
+            } else {
+                displayResult("no features to commit");
+            }
+        }
+
+        function _delete() {
+            if (!GearsIsSupported()) {
+                return;
+            }
+            var feature = vector.selectedFeatures[0];
+            if (feature) {
+                modify.selectControl.unselectAll()
+                feature.state = OpenLayers.State.DELETE;
+                displayStatus();
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Gears Protocol Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Shows the usage of the Gears protocol.
+    </p>
+
+    <div class="float-left">
+      <div id="map" class="smallmap"></div>
+    </div>
+
+    <div>
+      <a href="javascript:_sync()">Sync</a>
+      <p>The Sync link destroys the features currently in the layer, reads
+         features from the Gears database, and adds them to the layer.
+         Uncommitted features will be lost.</p>
+
+      <a href="javascript:_commit()">Commit</a>
+      <p>The Commit link commits to the Gears database the features that are
+         marked as INSERT, UPDATE or DELETE.</p>
+
+      <a href="javascript:_delete()">Delete</a>
+      <p>The Delete link marks the selected feature as DELETE. To select a feature
+         click choose the navigation control in the editing toolbar.</p>
+    </div>
+
+    <div style="margin-top: 30px">
+      <p>Status: <span id="status"></span></p>
+      <p>Result: <span id="last-result"></span></p>
+    </div>
+
+    <div class="clear-left" id="docs">
+      <p>This example demonstrates the usage of OpenLayers Gears protocol to
+         read/create/update/delete features from/to the Gears database.
+         <a href="http://gears.google.com/">Gears</a> must obviously be installed
+         in your browser for this example to work.</p>
+    </div>
+  </body>
+</html>
diff --git a/examples/proxy.cgi b/examples/proxy.cgi
new file mode 100755
index 0000000..8b494d7
--- /dev/null
+++ b/examples/proxy.cgi
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+
+
+"""This is a blind proxy that we use to get around browser
+restrictions that prevent the Javascript from loading pages not on the
+same server as the Javascript.  This has several problems: it's less
+efficient, it might break some sites, and it's a security risk because
+people can use this proxy to browse the web and possibly do bad stuff
+with it.  It only loads pages via http and https, but it can load any
+content type. It supports GET and POST requests."""
+
+import urllib2
+import cgi
+import sys, os
+
+# Designed to prevent Open Proxy type stuff.
+
+allowedHosts = ['www.openlayers.org', 'openlayers.org', 
+                'labs.metacarta.com', 'world.freemap.in', 
+                'prototype.openmnnd.org', 'geo.openplans.org',
+                'sigma.openplans.org', 'demo.opengeo.org',
+                'www.openstreetmap.org', 'sample.azavea.com',
+                'v-swe.uni-muenster.de:8080', 
+                'vmap0.tiles.osgeo.org']
+
+method = os.environ["REQUEST_METHOD"]
+
+if method == "POST":
+    qs = os.environ["QUERY_STRING"]
+    d = cgi.parse_qs(qs)
+    if d.has_key("url"):
+        url = d["url"][0]
+    else:
+        url = "http://www.openlayers.org"
+else:
+    fs = cgi.FieldStorage()
+    url = fs.getvalue('url', "http://www.openlayers.org")
+
+try:
+    host = url.split("/")[2]
+    if allowedHosts and not host in allowedHosts:
+        print "Status: 502 Bad Gateway"
+        print "Content-Type: text/plain"
+        print
+        print "This proxy does not allow you to access that location (%s)." % (host,)
+        print
+        print os.environ
+  
+    elif url.startswith("http://") or url.startswith("https://"):
+    
+        if method == "POST":
+            length = int(os.environ["CONTENT_LENGTH"])
+            headers = {"Content-Type": os.environ["CONTENT_TYPE"]}
+            body = sys.stdin.read(length)
+            r = urllib2.Request(url, body, headers)
+            y = urllib2.urlopen(r)
+        else:
+            y = urllib2.urlopen(url)
+        
+        # print content type header
+        i = y.info()
+        if i.has_key("Content-Type"):
+            print "Content-Type: %s" % (i["Content-Type"])
+        else:
+            print "Content-Type: text/plain"
+        print
+        
+        print y.read()
+        
+        y.close()
+    else:
+        print "Content-Type: text/plain"
+        print
+        print "Illegal request."
+
+except Exception, E:
+    print "Status: 500 Unexpected Error"
+    print "Content-Type: text/plain"
+    print 
+    print "Some unexpected error occurred. Error text was:", E
diff --git a/examples/regular-polygons.html b/examples/regular-polygons.html
new file mode 100644
index 0000000..bf80b22
--- /dev/null
+++ b/examples/regular-polygons.html
@@ -0,0 +1,170 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Regular Polygon Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        p {
+            width: 512px;
+        }
+        #config {
+            margin-top: 1em;
+            width: 512px;
+            position: relative;
+            height: 8em;
+        }
+        #controls {
+            padding-left: 2em;
+            margin-left: 0;
+            width: 12em;
+        }
+        #controls li {
+            padding-top: 0.5em;
+            list-style: none;
+        }
+        #options {
+            font-size: 1em;
+            top: 0;
+            margin-left: 15em;
+            position: absolute;
+        }
+
+        /* avoid pink tiles */
+        .olImageLoadError {
+            background-color: transparent !important;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, polygonControl;
+        function init(){
+            map = new OpenLayers.Map('map');
+            
+            var wmsLayer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'}); 
+
+            var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");
+
+            map.addLayers([wmsLayer, polygonLayer]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.MousePosition());
+
+            polyOptions = {sides: 4};
+            polygonControl = new OpenLayers.Control.DrawFeature(polygonLayer,
+                                            OpenLayers.Handler.RegularPolygon,
+                                            {handlerOptions: polyOptions});
+            
+            map.addControl(polygonControl);
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+            
+            document.getElementById('noneToggle').checked = true;
+             document.getElementById('irregularToggle').checked = false;
+        }
+        function setOptions(options) {
+            polygonControl.handler.setOptions(options);
+        }
+        function setSize(fraction) {
+            var radius = fraction * map.getExtent().getHeight();
+            polygonControl.handler.setOptions({radius: radius,
+                                               angle: 0});
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Regular Polygon Example</h1>
+    <p id="shortdesc">
+      Shows how to use the RegularPolygon handler to draw features with
+      different numbers of sides.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <div id="config">
+        
+        <ul id="controls"><b>Map Controls</b>
+            <li>
+                <input type="radio" name="type"
+                       value="none" id="noneToggle"
+                       onclick="polygonControl.deactivate()"
+                       checked="checked" />
+                <label for="noneToggle">navigate</label>
+            </li>
+            <li>
+                <input type="radio" name="type"
+                       value="polygon" id="polygonToggle"
+                       onclick="polygonControl.activate()" />
+                <label for="polygonToggle">draw polygon</label>
+            </li>
+        </ul>
+        <table id="options">
+            <tbody>
+                <tr>
+                    <th>Draw Option</th>
+                    <th>Value</th>
+                </tr>
+                <tr>
+                    <td>
+                        shape
+                    </td>
+                    <td>
+                        <select name="sides"
+                                onchange="setOptions({sides: parseInt(this.value)})">
+                            <option value="3">triangle</option>
+                            <option value="4" selected="selected">square</option>
+                            <option value="5">pentagon</option>
+                            <option value="6">hexagon</option>
+                            <option value="40">circle</option>
+                        </select>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        snap angle
+                    </td>
+                    <td>
+                        <select name="angle"
+                                onchange="setOptions({snapAngle: parseFloat(this.value)})">
+                            <option value="" selected="selected">no snap</option>
+                            <option value="15">15°</option>
+                            <option value="45">45°</option>
+                            <option value="90">90°</option>
+                        </select>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        size
+                    </td>
+                    <td>
+                        <select name="size"
+                                onchange="setSize(parseFloat(this.value))">
+                            <option value="" selected="selected">variable</option>
+                            <option value="0.1">small</option>
+                            <option value="0.2">medium</option>
+                            <option value="0.4">large</option>
+                        </select>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        irregular
+                    </td>
+                    <td>
+                        <input id="irregularToggle" name="irregular"
+                               type="checkbox"
+                               onchange="setOptions({irregular: this.checked})") />
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+    <p>
+        Regular polygons can be drawn by pointing a DrawFeature control to the
+        RegularPolygon handler class.  The options above demonstrate how the
+        handler can be configured.  Note if you are in angle snapping mode (if
+        the snap angle is non-null) and you hold down the <b>Shift</b> key, you
+        will toggle to non-snapping mode.
+    </p>
+    <p>
+         The <i>irregular</i> option allows drawing of irregular polygons.  With this option, the fixed radius option is ignored.
+  </body>
+</html>
diff --git a/examples/resize-features.html b/examples/resize-features.html
new file mode 100644
index 0000000..07e4c92
--- /dev/null
+++ b/examples/resize-features.html
@@ -0,0 +1,94 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Resize Features Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        p {
+            width: 500px;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, vectorLayer, pointFeature, lineFeature, polygonFeature;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            
+            var style_blue = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
+            style_blue.strokeColor = "blue"; 
+            style_blue.fillColor = "blue"; 
+            var style_green = {
+                strokeColor: "#339933",
+                strokeOpacity: 1,
+                strokeWidth: 3,
+                pointRadius: 6,
+                pointerEvents: "visiblePainted"
+            };
+            
+            vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry");
+            
+            // create a point feature
+            var point = new OpenLayers.Geometry.Point(-110, 45);
+            pointFeature = new OpenLayers.Feature.Vector(point, null, style_blue);
+            
+            // create a line feature from a list of points
+            var pointList = [];
+            var newPoint = point;
+            for(var p=0; p<5; ++p) {
+                newPoint = new OpenLayers.Geometry.Point(newPoint.x + Math.random(1),
+                                                         newPoint.y + Math.random(1));
+                pointList.push(newPoint);
+            }
+            lineFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.LineString(pointList),null,style_green);
+            
+            // create a polygon feature from a linear ring of points
+            var pointList = [];
+            for(var p=0; p<6; ++p) {
+                var a = p * (2 * Math.PI) / 7;
+                var r = Math.random(1) + 1;
+                var newPoint = new OpenLayers.Geometry.Point(point.x + (r * Math.cos(a)),
+                                                             point.y + (r * Math.sin(a)));
+                pointList.push(newPoint);
+            }
+            pointList.push(pointList[0]);
+            
+            var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
+            polygonFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon([linearRing]));
+                
+            
+            map.addLayer(vectorLayer);
+            map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5);
+            vectorLayer.addFeatures([pointFeature, lineFeature, polygonFeature]);
+            
+        }
+
+        var origin = new OpenLayers.Geometry.Point(-111.04, 45.68);
+        function resizeFeatures(scale) {
+            pointFeature.geometry.resize(scale, origin);
+            lineFeature.geometry.resize(scale, origin);
+            polygonFeature.geometry.resize(scale, origin);
+            vectorLayer.redraw();
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Resize Features Programatically</h1>
+    <p id="shortdesc">
+      Demonstration of how to use the geometry resize methods to
+      change feature sizes programatically.
+    </p>  
+    <div id="map" class="smallmap"></div>
+    <p>This example demonstrates how features can be resized.  There is not yet
+    a control built that provides a tool for resizing, but the geometry.resize
+    method can be accessed to resize programmatically.</p>
+    <p>Make the features <a href="javascript: resizeFeatures(1.5);">bigger</a>
+    or <a href="javascript: resizeFeatures(1 / 1.5);">smaller</a>.
+  </body>
+</html>
diff --git a/examples/restricted-extent.html b/examples/restricted-extent.html
new file mode 100644
index 0000000..427ddc9
--- /dev/null
+++ b/examples/restricted-extent.html
@@ -0,0 +1,70 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Restricted Extent Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map = null;
+        var extent = new OpenLayers.Bounds(-180, -90, 180, 90);
+
+        function init() {
+            var options = {
+                restrictedExtent: extent
+            }
+            map = new OpenLayers.Map('map', options);
+
+            var wms = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?",
+                {layers: 'basic'}
+            ); 
+
+            map.addLayers([wms]);
+            map.setCenter(extent, 1);
+            document.getElementById("toggle").checked = true;
+        }
+        
+        function toggleRestrictedExtent() {
+            if(map.restrictedExtent == null) {
+                map.setOptions({restrictedExtent: extent});
+            } else {
+                map.setOptions({restrictedExtent: null});
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Restricted Extent Example</h1>
+    <p id="shortdesc">
+      Don't let users drag outside the map extent: instead, limit dragging such
+      that the extent of the layer is the maximum viewable area.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <p>
+        Map navigation is limited by a combination of map and layer properties.
+        The base layer resolutions array controls the resolutions (or zoom
+        levels) available.  The resolutions can be limited by setting a
+        maxResolution property or by explicitly specifying a resolutions
+        array.
+    </p>
+    <p>
+        Navigation limited by the maxExtent property.  A map cannot be panned
+        so that the center of the viewport is outside of the bounds specified
+        in maxExtent.  If you wish to further restrict panning, use the
+        restrictedExtent property.  With restrictedExtent set, the map cannot
+        be panned beyond the given bounds.  If the maxResolution allows the
+        map to be zoomed to a resolution that displays an area bigger than
+        the restrictedExtent, the viewport will remain centered on the
+        restrictedExtent.
+    </p>
+    <p>
+        <input type="checkbox" id="toggle" checked="checked"
+               onclick="toggleRestrictedExtent();" />
+        <label for="toggle">
+            Toggle restricted extent (to [-180, -90, 180, 90]).
+        </label>
+    
+  </body>
+</html>
diff --git a/examples/rotate-features.html b/examples/rotate-features.html
new file mode 100644
index 0000000..1aa981e
--- /dev/null
+++ b/examples/rotate-features.html
@@ -0,0 +1,108 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Rotate Features Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        p {
+            width: 500px;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, pointFeature, lineFeature, polygonFeature;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            
+            var style_blue = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
+            style_blue.strokeColor = "blue"; 
+            style_blue.fillColor = "blue"; 
+            var style_green = {
+                strokeColor: "#339933",
+                strokeOpacity: 1,
+                strokeWidth: 3,
+                pointRadius: 6,
+                pointerEvents: "visiblePainted"
+            };
+            
+            var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry");
+            
+            // create a point feature
+            var point = new OpenLayers.Geometry.Point(-110, 45);
+            pointFeature = new OpenLayers.Feature.Vector(point, null, style_blue);
+            
+            // create a line feature from a list of points
+            var pointList = [];
+            var newPoint = point;
+            for(var p=0; p<5; ++p) {
+                newPoint = new OpenLayers.Geometry.Point(newPoint.x + Math.random(1),
+                                                         newPoint.y + Math.random(1));
+                pointList.push(newPoint);
+            }
+            lineFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.LineString(pointList),null,style_green);
+            
+            // create a polygon feature from a linear ring of points
+            var pointList = [];
+            for(var p=0; p<6; ++p) {
+                var a = p * (2 * Math.PI) / 7;
+                var r = Math.random(1) + 1;
+                var newPoint = new OpenLayers.Geometry.Point(point.x + (r * Math.cos(a)),
+                                                             point.y + (r * Math.sin(a)));
+                pointList.push(newPoint);
+            }
+            pointList.push(pointList[0]);
+            
+            var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
+            polygonFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon([linearRing]));
+                
+            
+            map.addLayer(vectorLayer);
+            map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5);
+            vectorLayer.addFeatures([pointFeature, lineFeature, polygonFeature]);
+            
+            // start rotating
+            var origin = new OpenLayers.Geometry.Point(-111.04, 45.68);
+            var style = {
+                strokeColor: "#666666",
+                strokeOpacity: 1,
+                strokeWidth: 1,
+                pointRadius: 2,
+                pointerEvents: "visiblePainted"
+            };
+            var center = new OpenLayers.Feature.Vector(origin, null, style);
+            vectorLayer.addFeatures([center]);
+            window.setInterval(function() {rotateFeature(
+                               pointFeature, 360 / 20, origin)}, 100);
+            window.setInterval(function() {rotateFeature(
+                               lineFeature, 360 / 40, origin)}, 100);
+            window.setInterval(function(){rotateFeature(
+                               polygonFeature, -360 / 20, origin)}, 100);
+        }
+
+        function rotateFeature(feature, angle, origin) {
+            feature.geometry.rotate(angle, origin);
+            feature.layer.drawFeature(feature);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Rotate vector features</h1>
+
+  <div id="tags">
+  </div>
+  <p id="shortdesc">
+      Details on how to create and rotate vector features programmatically
+  </p>
+
+    <div id="map" class="smallmap"></div>
+    <div id="docs">This example shows a few features rotating.  There is not yet a control
+    built that provides a tool for rotating, but the geometry.rotate method
+    can be accessed to rotate programmatically.</div>
+  </body>
+</html>
diff --git a/examples/select-feature-multilayer.html b/examples/select-feature-multilayer.html
new file mode 100644
index 0000000..23cc97e
--- /dev/null
+++ b/examples/select-feature-multilayer.html
@@ -0,0 +1,116 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>SelectFeature Control on multiple vector layers</title> 
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #controlToggle li {
+            list-style: none;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, selectControl;
+        OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
+        function init(){
+            map = new OpenLayers.Map('map');
+            var wmsLayer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}
+            ); 
+
+            var vectors1 = new OpenLayers.Layer.Vector("Vector Layer 1", {
+                styleMap: new OpenLayers.StyleMap({
+                    "default": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
+                        externalGraphic: "../img/marker-green.png",
+                        graphicOpacity: 1,
+                        rotation: -45,
+                        pointRadius: 10
+                    }, OpenLayers.Feature.Vector.style["default"])),
+                    "select": new OpenLayers.Style({
+                        externalGraphic: "../img/marker-blue.png"
+                    })
+                })
+            });
+            var vectors2 = new OpenLayers.Layer.Vector("Vector Layer 2", {
+                styleMap: new OpenLayers.StyleMap({
+                    "default": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
+                        fillColor: "red",
+                        strokeColor: "gray",
+                        graphicName: "square",
+                        rotation: 45,
+                        pointRadius: 15
+                    }, OpenLayers.Feature.Vector.style["default"])),
+                    "select": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
+                        graphicName: "square",
+                        rotation: 45,
+                        pointRadius: 15
+                    }, OpenLayers.Feature.Vector.style["select"]))
+                })
+            });
+            map.addLayers([wmsLayer, vectors1, vectors2]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            
+            selectControl = new OpenLayers.Control.SelectFeature(
+                [vectors1, vectors2],
+                {
+                    clickout: true, toggle: false,
+                    multiple: false, hover: false,
+                    toggleKey: "ctrlKey", // ctrl key removes from selection
+                    multipleKey: "shiftKey" // shift key adds to selection
+                }
+            );
+            
+            map.addControl(selectControl);
+            selectControl.activate();
+            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+            vectors1.addFeatures(createFeatures());
+            vectors2.addFeatures(createFeatures());
+            
+            vectors1.events.on({
+                "featureselected": function(e) {
+                    showStatus("selected feature "+e.feature.id+" on Vector Layer 1");
+                },
+                "featureunselected": function(e) {
+                    showStatus("unselected feature "+e.feature.id+" on Vector Layer 1");
+                }
+            });
+            vectors2.events.on({
+                "featureselected": function(e) {
+                    showStatus("selected feature "+e.feature.id+" on Vector Layer 2");
+                },
+                "featureunselected": function(e) {
+                    showStatus("unselected feature "+e.feature.id+" on Vector Layer 2");
+                }
+            });
+        }
+        
+        function createFeatures() {
+            var extent = map.getExtent();
+            var features = [];
+            for(var i=0; i<10; ++i) {
+                features.push(new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(extent.left + (extent.right - extent.left) * Math.random(),
+                    extent.bottom + (extent.top - extent.bottom) * Math.random()
+                )));
+            }
+            return features;
+        }
+        
+        function showStatus(text) {
+            document.getElementById("status").innerHTML = text;            
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Select Feature on Multiple Layers Example</h1>
+    <p id="shortdesc">
+      Select a feature on click with the Control.SelectFeature on multiple 
+      vector layers.
+    </p>  
+    <div id="map" class="smallmap"></div>
+    <div id="status"></div>
+  </body>
+</html>
diff --git a/examples/select-feature-openpopup.html b/examples/select-feature-openpopup.html
new file mode 100644
index 0000000..0f24e95
--- /dev/null
+++ b/examples/select-feature-openpopup.html
@@ -0,0 +1,99 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Open Popup on Layer.Vector</title> 
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #controlToggle li {
+            list-style: none;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, drawControls, selectControl, selectedFeature;
+        function onPopupClose(evt) {
+            selectControl.unselect(selectedFeature);
+        }
+        function onFeatureSelect(feature) {
+            selectedFeature = feature;
+            popup = new OpenLayers.Popup.FramedCloud("chicken", 
+                                     feature.geometry.getBounds().getCenterLonLat(),
+                                     null,
+                                     "<div style='font-size:.8em'>Feature: " + feature.id +"<br />Area: " + feature.geometry.getArea()+"</div>",
+                                     null, true, onPopupClose);
+            feature.popup = popup;
+            map.addPopup(popup);
+        }
+        function onFeatureUnselect(feature) {
+            map.removePopup(feature.popup);
+            feature.popup.destroy();
+            feature.popup = null;
+        }    
+        function init(){
+            map = new OpenLayers.Map('map');
+            var wmsLayer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'}); 
+
+            var polygonLayer = new OpenLayers.Layer.Vector("Polygon Layer");
+
+            map.addLayers([wmsLayer, polygonLayer]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.MousePosition());
+            
+            selectControl = new OpenLayers.Control.SelectFeature(polygonLayer,
+                {onSelect: onFeatureSelect, onUnselect: onFeatureUnselect});
+            drawControls = {
+                polygon: new OpenLayers.Control.DrawFeature(polygonLayer,
+                            OpenLayers.Handler.Polygon),
+                select: selectControl
+            };
+            
+            for(var key in drawControls) {
+                map.addControl(drawControls[key]);
+            }
+
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+
+        }
+
+        function toggleControl(element) {
+            for(key in drawControls) {
+                var control = drawControls[key];
+                if(element.value == key && element.checked) {
+                    control.activate();
+                } else {
+                    control.deactivate();
+                }
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Open Popup on Layer.Vector</h1> 
+    <p id="shortdesc">
+      Using a Control.SelectFeature, open a popup on click.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <ul id="controlToggle">
+        <li>
+            <input type="radio" name="type" value="none" id="noneToggle"
+                   onclick="toggleControl(this);" checked="checked" />
+            <label for="noneToggle">navigate</label>
+        </li>
+        <li>
+            <input type="radio" name="type" value="polygon" id="polygonToggle"
+                   onclick="toggleControl(this);" />
+            <label for="polygonToggle">draw polygon</label>
+        </li>
+        <li>
+            <input type="radio" name="type" value="select" id="selectToggle"
+                   onclick="toggleControl(this);" />
+            <label for="selectToggle">select polygon on click</label>
+        </li>
+    </ul>       
+    <p>It is possible to use the onSelect/onUnselect hooks on the SelectFeature
+       to do fun things -- like open a popup.
+    </p>   
+  </body>
+</html>
diff --git a/examples/select-feature.html b/examples/select-feature.html
new file mode 100644
index 0000000..e04c028
--- /dev/null
+++ b/examples/select-feature.html
@@ -0,0 +1,156 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>SelectFeature Control on Layer.Vector</title> 
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #controlToggle li {
+            list-style: none;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, drawControls;
+        OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
+        function init(){
+            map = new OpenLayers.Map('map');
+            var wmsLayer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}
+            ); 
+
+            var vectors = new OpenLayers.Layer.Vector("Vector Layer");
+            vectors.events.on({
+                'featureselected': function(feature) {
+                    $('counter').innerHTML = this.selectedFeatures.length;
+                },
+                'featureunselected': function(feature) {
+                    $('counter').innerHTML = this.selectedFeatures.length;
+                },
+            });
+
+            map.addLayers([wmsLayer, vectors]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            
+            drawControls = {
+                point: new OpenLayers.Control.DrawFeature(
+                    vectors, OpenLayers.Handler.Point
+                ),
+                line: new OpenLayers.Control.DrawFeature(
+                    vectors, OpenLayers.Handler.Path
+                ),
+                polygon: new OpenLayers.Control.DrawFeature(
+                    vectors, OpenLayers.Handler.Polygon
+                ),
+                select: new OpenLayers.Control.SelectFeature(
+                    vectors,
+                    {
+                        clickout: false, toggle: false,
+                        multiple: false, hover: false,
+                        toggleKey: "ctrlKey", // ctrl key removes from selection
+                        multipleKey: "shiftKey", // shift key adds to selection
+                        box: true
+                    }
+                ),
+                selecthover: new OpenLayers.Control.SelectFeature(
+                    vectors,
+                    {
+                        multiple: false, hover: true,
+                        toggleKey: "ctrlKey", // ctrl key removes from selection
+                        multipleKey: "shiftKey" // shift key adds to selection
+                    }
+                )
+            };
+            
+            for(var key in drawControls) {
+                map.addControl(drawControls[key]);
+            }
+            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+
+        }
+
+        function toggleControl(element) {
+            for(key in drawControls) {
+                var control = drawControls[key];
+                if(element.value == key && element.checked) {
+                    control.activate();
+                } else {
+                    control.deactivate();
+                }
+            }
+        }
+
+        function update() {
+            var clickout = document.getElementById("clickout").checked;
+            if(clickout != drawControls.select.clickout) {
+                drawControls.select.clickout = clickout;
+            }
+
+            var box = document.getElementById("box").checked;
+            if(box != drawControls.select.box) {
+                drawControls.select.box = box;
+                if(drawControls.select.active) {
+                    drawControls.select.deactivate();
+                    drawControls.select.activate();
+                }
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Select Feature Example</h1>
+    <p id="shortdesc">
+      Select a feature on hover or click with the Control.SelectFeature on a
+      vector layer.
+    </p>  
+    <div id="map" class="smallmap"></div>
+    <ul id="controlToggle">
+        <li>
+            <input type="radio" name="type" value="none" id="noneToggle"
+                   onclick="toggleControl(this);" checked="checked" />
+            <label for="noneToggle">navigate</label>
+        </li>
+        <li>
+            <input type="radio" name="type" value="point" id="pointToggle"
+                   onclick="toggleControl(this);" />
+            <label for="pointToggle">draw point</label>
+        </li>
+        <li>
+            <input type="radio" name="type" value="line" id="lineToggle"
+                   onclick="toggleControl(this);" />
+            <label for="lineToggle">draw line</label>
+        </li>
+        <li>
+            <input type="radio" name="type" value="polygon" id="polygonToggle"
+                   onclick="toggleControl(this);" />
+            <label for="polygonToggle">draw polygon</label>
+        </li>
+        <li>
+            <input type="radio" name="type" value="selecthover" id="selecthoverToggle"
+                   onclick="toggleControl(this);" />
+            <label for="selecthoverToggle">Select features on hover</label>
+        </li>
+        <li>
+            <input type="radio" name="type" value="select" id="selectToggle"
+                   onclick="toggleControl(this);" />
+            <label for="selectToggle">select feature (<span id="counter">0</span> features selected)</label>
+            <ul>
+                <li>
+                    <input id="box" type="checkbox" checked="checked"
+                           name="box" onchange="update()" />
+                    <label for="box">select features in a box</label>
+                </li>
+                <li>
+                    <input id="clickout" type="checkbox"
+                           name="clickout" onchange="update()" />
+                    <label for="clickout">click out to unselect features</label>
+                </li>
+            </ul>
+        </li>
+    </ul>
+    <p>Use the shift key to select multiple features.  Use the ctrl key to
+    toggle selection on features one at a time.  Note: the "clickout" option has no
+    effect when "hover" is selected.</p>
+  </body>
+</html>
diff --git a/examples/setextent.html b/examples/setextent.html
new file mode 100644
index 0000000..c0c18e1
--- /dev/null
+++ b/examples/setextent.html
@@ -0,0 +1,34 @@
+<html>
+<head>
+<title>Setting a visual Extent</title>
+<link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+<script src="../lib/OpenLayers.js"></script>
+</head>
+<body>
+<h1 id="title">Setting a Visual Extent</h1>
+<p id='shortdesc'>
+  Use a boxes layer to visually display the area of interest indicated by a user.
+</p>
+<p>
+  Because the ability to set the map to a given extent is limited by the 
+  current resolutions available, zoomToExtent will not always set the map to 
+  exactly the right extent. In order to visually annotate the actual extent, 
+  this example, will use the Boxes layer to visually describe the desired
+  extent as well as setting the map extent.
+</p>
+  <div style="width:100%; height:75%" id="map"></div>
+  <script defer="defer" type="text/javascript">
+    var map = new OpenLayers.Map('map');
+    var bounds = new OpenLayers.Bounds(-45,-45, 0, 45); 
+    var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+        "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+    map.addLayer(wms);
+    map.zoomToExtent(bounds);
+    var boxes = new OpenLayers.Layer.Boxes("boxes");
+    var box = new OpenLayers.Marker.Box(bounds);
+    boxes.addMarker(box);
+    map.addLayer(boxes);
+  </script>
+</body>
+</html>
diff --git a/examples/sld-parser.html b/examples/sld-parser.html
new file mode 100644
index 0000000..56a6c83
--- /dev/null
+++ b/examples/sld-parser.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers SLD Parser</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <style>
+            #input {
+                width: 90%;
+                height: 300px;
+            }
+            #output {
+                width: 90%;
+                height: 300px;
+            }
+        </style>
+    </head>
+    <body>
+        <h1 id="title">SLD Parser</h1>
+
+        <div id="shortdesc">Parsing Styled Layer Descriptor (SLD) documents with the SLD format.</div>
+
+        <textarea id="input">paste SLD here</textarea><br>
+        <input type="checkbox" id="symbolizers" checked="checked"><label for="symbolizers">Maintain multiple symbolizers and FeatureTypeStyle elements</label><br>
+        <input type="checkbox" id="array"><label for="array">Compile an array of named styles instead of an object.</label><br>
+        <input type="button" id="button" value="Parse SLD">
+
+        <div id="docs">
+            This example uses the SLD format to parse SLD documents pasted into the textarea above.  
+            A rough representation of the parsed style is shown in the textarea below.
+        </div>
+        
+        <textarea id="output"></textarea>
+        
+        <script>
+        
+            var button = document.getElementById("button");
+            var input = document.getElementById("input");
+            var output = document.getElementById("output");
+            var symbolizers = document.getElementById("symbolizers");
+            var array = document.getElementById("array");
+            
+            var json = new OpenLayers.Format.JSON();
+
+            var format, obj;
+            
+            button.onclick = function() {
+                var str = input.value;
+                format = new OpenLayers.Format.SLD({
+                    multipleSymbolizers: !!symbolizers.checked,
+                    namedLayersAsArray: !!array.checked
+                });
+                obj = format.read(str);
+                try {
+                    output.value = json.write(obj, true);
+                } catch (err) {
+                    output.value = "Trouble: " + err;
+                }
+            }
+        
+        </script>
+
+    </body>
+</html>
diff --git a/examples/sld.html b/examples/sld.html
new file mode 100644
index 0000000..e81fc03
--- /dev/null
+++ b/examples/sld.html
@@ -0,0 +1,116 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        
+        var map, sld, gmlLayers;
+        var format = new OpenLayers.Format.SLD();
+        function init() {
+
+            map = new OpenLayers.Map('map');
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+
+            OpenLayers.loadURL("tasmania/sld-tasmania.xml", null, null, complete);
+
+        }
+        
+        function getDefaultStyle(sld, layerName) {
+            var styles = sld.namedLayers[layerName].userStyles;
+            var style;
+            for(var i=0; i<styles.length; ++i) {
+                style = styles[i];
+                if(style.isDefault) {
+                    break;
+                }
+            }
+            return style;
+        }
+
+        function complete(req) {
+
+            sld = format.read(req.responseXML || req.responseText);
+            var hoverStyle = sld.namedLayers["WaterBodies"].userStyles[1];
+            hoverStyle.defaultStyle = OpenLayers.Util.extend(
+                {}, OpenLayers.Feature.Vector.style["select"]
+            );
+
+            gmlLayers = [
+                // use the sld UserStyle named "Default Styler"
+                new OpenLayers.Layer.GML(
+                    "StateBoundaries",
+                    "tasmania/TasmaniaStateBoundaries.xml",
+                    {
+                        styleMap: new OpenLayers.StyleMap(
+                            getDefaultStyle(sld, "Land")
+                        ),
+                        isBaseLayer: true
+                    }
+                ),
+                new OpenLayers.Layer.GML(
+                    "Roads",
+                    "tasmania/TasmaniaRoads.xml",
+                    {styleMap: new OpenLayers.StyleMap(getDefaultStyle(sld, "Roads"))}
+                ),
+                new OpenLayers.Layer.GML(
+                    "WaterBodies",
+                    "tasmania/TasmaniaWaterBodies.xml",
+                    {
+                        styleMap: new OpenLayers.StyleMap({
+                            "default": getDefaultStyle(sld, "WaterBodies"),
+                            "select": hoverStyle
+                        })
+                    }
+                ),
+                new OpenLayers.Layer.GML(
+                    "Cities",
+                    "tasmania/TasmaniaCities.xml",
+                    {styleMap: new OpenLayers.StyleMap(getDefaultStyle(sld, "Cities"))}
+                )
+            ];
+            
+            map.addLayers(gmlLayers);
+            map.zoomToExtent(new OpenLayers.Bounds(143,-39,150,-45));
+            
+            var hover = new OpenLayers.Control.SelectFeature(
+                gmlLayers[2], {hover: true}
+            );
+            map.addControl(hover);
+            hover.activate();
+        }
+        
+        // set a new style when the radio button changes
+        function setStyle(index) {
+            gmlLayers[2].styleMap.styles["default"] = sld.namedLayers["WaterBodies"].userStyles[index];
+            // change the style of the features of the WaterBodies layer
+            gmlLayers[2].redraw();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Styled Layer Descriptor (SLD) Example</h1>
+    <p id="shortdesc">
+        Parsing SLD and applying styles to a vector layer.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <p id="docs">This example uses a <a target="_blank" href="tasmania/sld-tasmania.xml">SLD
+    file</a> to style the vector features. To construct layers that use styles
+    from SLD, create a StyleMap for the layer that uses one of the userStyles in the
+    namedLayers object of the return from format.read().</p>
+    <p>Select a new style for the WaterBodies layer below:</p>
+    <form>
+      <input type="radio" name="style" onclick="setStyle(this.value)" checked="checked" value="0">Default Styler (zoom in to see more features)</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="3">Styler Test PropertyIsEqualTo</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="4">Styler Test WATER_TYPE</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="5">Styler Test PropertyIsGreaterThanOrEqualTo</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="6">Styler Test PropertyIsLessThanOrEqualTo</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="7">Styler Test PropertyIsGreaterThan</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="8">Styler Test PropertyIsLessThan</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="9">Styler Test PropertyIsLike</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="10">Styler Test PropertyIsBetween</input><br/>
+      <input type="radio" name="style" onclick="setStyle(this.value)" value="11">Styler Test FeatureId</input><br/>
+    </form>
+  </body>
+</html>
diff --git a/examples/small.jpg b/examples/small.jpg
new file mode 100644
index 0000000..1ba22e6
Binary files /dev/null and b/examples/small.jpg differ
diff --git a/examples/snap-split.html b/examples/snap-split.html
new file mode 100644
index 0000000..ca3e657
--- /dev/null
+++ b/examples/snap-split.html
@@ -0,0 +1,267 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Snapping & Splitting</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .olControlEditingToolbar .olControlModifyFeatureItemInactive { 
+            background-position: -1px 0px ;                                                                   
+        }
+        .olControlEditingToolbar .olControlModifyFeatureItemActive { 
+            background-position: -1px -23px ;                                                                   
+        }
+        label.head {
+            font-weight: bold;
+            padding: 1em 0 0.1em 0;
+            border-bottom: 1px solid grey;
+        }
+        td {
+            padding: 0.25em 1em;
+        }
+        tr.head td {
+            text-align: center;
+            font-weight: bold;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+        OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
+
+        function init() {
+            initMap();
+            initUI();
+        }
+
+
+        var map, draw, modify, snap, split, vectors;
+        function initMap() {
+
+            map = new OpenLayers.Map('map');
+            var styles = new OpenLayers.StyleMap({
+                "default": new OpenLayers.Style(null, {
+                    rules: [
+                        new OpenLayers.Rule({
+                            symbolizer: {
+                                "Point": {
+                                    pointRadius: 5,
+                                    graphicName: "square",
+                                    fillColor: "white",
+                                    fillOpacity: 0.25,
+                                    strokeWidth: 1,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#333333"
+                                },
+                                "Line": {
+                                    strokeWidth: 3,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#666666"
+                                }
+                            }
+                        })
+                    ]
+                }),
+                "select": new OpenLayers.Style({
+                    strokeColor: "#00ccff",
+                    strokeWidth: 4
+                }),
+                "temporary": new OpenLayers.Style(null, {
+                    rules: [
+                        new OpenLayers.Rule({
+                            symbolizer: {
+                                "Point": {
+                                    pointRadius: 5,
+                                    graphicName: "square",
+                                    fillColor: "white",
+                                    fillOpacity: 0.25,
+                                    strokeWidth: 1,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#333333"
+                                },
+                                "Line": {
+                                    strokeWidth: 3,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#00ccff"
+                                }
+                            }
+                        })
+                    ]
+                })
+            });
+
+            // create three vector layers
+            vectors = new OpenLayers.Layer.Vector("Lines", {
+                isBaseLayer: true,
+                strategies: [new OpenLayers.Strategy.Fixed()],                
+                protocol: new OpenLayers.Protocol.HTTP({
+                    url: "data/roads.json",
+                    format: new OpenLayers.Format.GeoJSON()
+                }),
+                styleMap: styles,
+                maxExtent: new OpenLayers.Bounds(
+                    1549471.9221, 6403610.94, 1550001.32545, 6404015.8
+                )
+            });
+            map.addLayer(vectors);
+            
+            // configure the snapping agent
+            snap = new OpenLayers.Control.Snapping({layer: vectors});
+            map.addControl(snap);
+            snap.activate();
+            
+            // configure split agent
+            split = new OpenLayers.Control.Split({
+                layer: vectors,
+                source: vectors,
+                tolerance: 0.0001,
+                eventListeners: {
+                    aftersplit: function(event) {
+                        flashFeatures(event.features);
+                    }
+                }
+            });
+            map.addControl(split);
+            split.activate();
+
+            // add some editing tools to a panel
+            var panel = new OpenLayers.Control.Panel({
+                displayClass: "olControlEditingToolbar"
+            });
+            draw = new OpenLayers.Control.DrawFeature(
+                vectors, OpenLayers.Handler.Path,
+                {displayClass: "olControlDrawFeaturePoint", title: "Draw Features"}
+            );
+            modify = new OpenLayers.Control.ModifyFeature(
+                vectors, {displayClass: "olControlModifyFeature", title: "Modify Features"}
+            );
+            panel.addControls([
+                new OpenLayers.Control.Navigation({title: "Navigate"}),
+                draw, modify
+            ]);
+            map.addControl(panel);
+            
+            map.addControl(new OpenLayers.Control.MousePosition());
+            
+            map.zoomToMaxExtent();
+        }
+
+        function flashFeatures(features, index) {
+            if(!index) {
+                index = 0;
+            }
+            var current = features[index];
+            if(current && current.layer === vectors) {
+                vectors.drawFeature(features[index], "select");
+            }
+            var prev = features[index-1];
+            if(prev && prev.layer === vectors) {
+                vectors.drawFeature(prev, "default");
+            }
+            ++index;
+            if(index <= features.length) {
+                window.setTimeout(function() {flashFeatures(features, index)}, 75);
+            }
+        }
+
+        /**
+         * Add behavior to page elements.  This basically lets us set snapping
+         * target properties with the checkboxes and text inputs.  The checkboxes
+         * toggle the target node, vertex, or edge (boolean) values.  The
+         * text inputs set the nodeTolerance, vertexTolerance, or edgeTolerance
+         * property values.
+         */
+        function initUI() {
+            // add behavior to snap elements
+            var snapCheck = $("snap_toggle");
+            snapCheck.checked = true;
+            snapCheck.onclick = function() {
+                if(snapCheck.checked) {
+                    snap.activate();
+                    $("snap_options").style.display = "block";
+                } else {
+                    snap.deactivate();
+                    $("snap_options").style.display = "none";
+                }
+            };
+            var target, type, tog, tol;
+            var types = ["node", "vertex", "edge"];
+            var target = snap.targets[0];
+            for(var j=0; j<types.length; ++j) {
+                type = types[j];
+                tog = $("target_" + type);
+                tog.checked = target[type];
+                tog.onclick = (function(tog, type, target) {
+                    return function() {target[type] = tog.checked;}
+                })(tog, type, target);
+                tol = $("target_" + type + "Tolerance");
+                tol.value = target[type + "Tolerance"];
+                tol.onchange = (function(tol, type, target) {
+                    return function() {
+                        target[type + "Tolerance"] = Number(tol.value) || 0;
+                    }
+                })(tol, type, target);
+            }
+
+            // add behavior to split elements
+            var splitCheck = $("split_toggle");
+            splitCheck.checked = true;
+            splitCheck.onclick = function() {
+                if(splitCheck.checked) {
+                    split.activate();
+                    $("split_options").style.display = "block";
+                } else {
+                    split.deactivate();
+                    $("split_options").style.display = "none";
+                }
+            };
+            var edgeCheck = $("edge_toggle");
+            edgeCheck.checked = split.edge;
+            edgeCheck.onclick = function() {
+                split.edge = edgeCheck.checked;
+            };
+            
+            $("clear").onclick = function() {
+                modify.deactivate();
+                vectors.destroyFeatures();
+            };
+            
+        }
+    
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Snapping & Splitting Example</h1>
+    <div id="shortdesc">A demonstration snapping and splitting while editing vector features.</div>
+    <div id="map" class="smallmap"></div>
+    <br/>
+    <input type="checkbox" id="snap_toggle" />
+    <label for="snap_toggle" class="head">Enable Snapping</label>
+    <table id="snap_options">
+        <tbody>
+            <tr class="head">
+                <td>target</td><td>node</td><td>vertex</td><td>edge</td>
+            </tr>
+            <tr>
+                <td>roads</td>
+                <td><input type="checkbox" id="target_node" /><input id="target_nodeTolerance" type="text" size="3" /></td>
+                <td><input type="checkbox" id="target_vertex" /><input id="target_vertexTolerance" type="text" size="3" /></td>
+                <td><input type="checkbox" id="target_edge" /><input id="target_edgeTolerance" type="text" size="3" /></td>
+            </tr>
+        </tbody>
+    </table>
+    <br />
+    <input type="checkbox" id="split_toggle" />
+    <label for="split_toggle" class="head">Enable Splitting</label>
+    <table id="split_options">
+        <tbody>
+            <tr>
+                <td><label for="edge_toggle">edges split</label></td>
+                <td><input type="checkbox" id="edge_toggle" /></td>
+            </tr>
+        </tbody>
+    </table>
+    <br />
+    <button id="clear">clear</button> Clear all features.
+  </body>
+</html>
diff --git a/examples/snapping.html b/examples/snapping.html
new file mode 100644
index 0000000..cd808c9
--- /dev/null
+++ b/examples/snapping.html
@@ -0,0 +1,314 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Snapping</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .olControlEditingToolbar .olControlModifyFeatureItemInactive { 
+            background-position: -1px 0px ;                                                                   
+        }
+        .olControlEditingToolbar .olControlModifyFeatureItemActive { 
+            background-position: -1px -23px ;                                                                   
+        }
+        table {
+            padding: 1em 0 1em;
+        }
+        td {
+            padding: 0.5em 1em;
+            border: 1px solid #ddd;
+        }
+        tr.head td {
+            text-align: center;
+            font-weight: bold;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
+
+        function init() {
+            initMap();
+            initUI();
+        }
+        
+        var map, draw, modify, snap, point, line, poly;
+        function initMap() {
+
+            map = new OpenLayers.Map('map');
+            var styles = new OpenLayers.StyleMap({
+                "default": new OpenLayers.Style(null, {
+                    rules: [
+                        new OpenLayers.Rule({
+                            symbolizer: {
+                                "Point": {
+                                    pointRadius: 5,
+                                    graphicName: "square",
+                                    fillColor: "white",
+                                    fillOpacity: 0.25,
+                                    strokeWidth: 1,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#3333aa"
+                                },
+                                "Line": {
+                                    strokeWidth: 3,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#6666aa"
+                                },
+                                "Polygon": {
+                                    strokeWidth: 1,
+                                    strokeOpacity: 1,
+                                    fillColor: "#9999aa",
+                                    strokeColor: "#6666aa"
+                                }
+                            }
+                        })
+                    ]
+                }),
+                "select": new OpenLayers.Style(null, {
+                    rules: [
+                        new OpenLayers.Rule({
+                            symbolizer: {
+                                "Point": {
+                                    pointRadius: 5,
+                                    graphicName: "square",
+                                    fillColor: "white",
+                                    fillOpacity: 0.25,
+                                    strokeWidth: 2,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#0000ff"
+                                },
+                                "Line": {
+                                    strokeWidth: 3,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#0000ff"
+                                },
+                                "Polygon": {
+                                    strokeWidth: 2,
+                                    strokeOpacity: 1,
+                                    fillColor: "#0000ff",
+                                    strokeColor: "#0000ff"
+                                }
+                            }
+                        })
+                    ]
+                }),
+                "temporary": new OpenLayers.Style(null, {
+                    rules: [
+                        new OpenLayers.Rule({
+                            symbolizer: {
+                                "Point": {
+                                    graphicName: "square",
+                                    pointRadius: 5,
+                                    fillColor: "white",
+                                    fillOpacity: 0.25,
+                                    strokeWidth: 2,
+                                    strokeColor: "#0000ff"
+                                },
+                                "Line": {
+                                    strokeWidth: 3,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#0000ff"
+                                },
+                                "Polygon": {
+                                    strokeWidth: 2,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#0000ff",
+                                    fillColor: "#0000ff"
+                                }
+                            }
+                        })
+                    ]
+                })
+            });
+
+            // create three vector layers
+            poly = new OpenLayers.Layer.Vector("polygons", {
+                strategies: [new OpenLayers.Strategy.Fixed()],                
+                protocol: new OpenLayers.Protocol.HTTP({
+                    url: "data/poly.json",
+                    format: new OpenLayers.Format.GeoJSON()
+                }),
+                styleMap: styles,
+                isBaseLayer: true
+            });
+            line = new OpenLayers.Layer.Vector("lines", {
+                strategies: [new OpenLayers.Strategy.Fixed()],                
+                protocol: new OpenLayers.Protocol.HTTP({
+                    url: "data/line.json",
+                    format: new OpenLayers.Format.GeoJSON()
+                }),
+                styleMap: styles
+            });
+            point = new OpenLayers.Layer.Vector("points", {
+                strategies: [new OpenLayers.Strategy.Fixed()],                
+                protocol: new OpenLayers.Protocol.HTTP({
+                    url: "data/point.json",
+                    format: new OpenLayers.Format.GeoJSON()
+                }),
+                styleMap: styles
+            });
+            map.addLayers([poly, line, point]);
+            
+            // configure the snapping agent
+            snap = new OpenLayers.Control.Snapping({
+                layer: poly,
+                targets: [point, line, poly],
+                greedy: false
+            });
+            snap.activate();
+
+            // add some editing tools to a panel
+            var panel = new OpenLayers.Control.Panel({
+                displayClass: "olControlEditingToolbar"
+            });
+            draw = new OpenLayers.Control.DrawFeature(
+                poly, OpenLayers.Handler.Polygon,
+                {displayClass: "olControlDrawFeaturePoint", title: "Draw Features"}
+            );
+            modify = new OpenLayers.Control.ModifyFeature(
+                poly, {displayClass: "olControlModifyFeature", title: "Modify Features"}
+            );            
+            panel.addControls([
+                new OpenLayers.Control.Navigation({title: "Navigate"}),
+                draw, modify
+            ]);
+            map.addControl(panel);
+            
+            // give the map a location
+            map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+        }
+        
+        /**
+         * Add behavior to page elements.  This basically lets us set snapping
+         * target properties with the checkboxes and text inputs.  The checkboxes
+         * toggle the target node, vertex, or edge (boolean) values.  The
+         * text inputs set the nodeTolerance, vertexTolerance, or edgeTolerance
+         * property values.
+         */
+        function initUI() {
+            var check = $("snapping");
+            check.checked = true;
+            check.onclick = function() {
+                if(check.checked) {
+                    snap.activate();
+                } else {
+                    snap.deactivate();
+                }
+            };
+            
+            var sel = $("editable");
+            sel.value = "poly";
+            sel.onchange = function() {
+                updateEditable(sel.value);
+            }
+            
+            var target, type, tog, tol;
+            var types = ["node", "vertex", "edge"];
+            for(var i=0; i<snap.targets.length; ++i) {
+                target = snap.targets[i];
+                for(var j=0; j<types.length; ++j) {
+                    type = types[j];
+                    tog = $(i + "_" + type);
+                    tog.checked = target[type];
+                    tog.onclick = (function(tog, type, target) {
+                        return function() {target[type] = tog.checked;}
+                    })(tog, type, target);
+                    tol = $(i + "_" + type + "Tolerance");
+                    tol.value = target[type + "Tolerance"];
+                    tol.onchange = (function(tol, type, target) {
+                        return function() {
+                            target[type + "Tolerance"] = Number(tol.value) || 0;
+                        }
+                    })(tol, type, target);
+                }
+            }
+            
+        }
+        
+        // this function allows the editable layer to be changed
+        // for the snapping control, this amounts to calling setLayer
+        function updateEditable(name) {
+
+            layer = window[name];
+            
+            // update the editable layer for the snapping control (nice)
+            snap.setLayer(layer);
+
+            // update the editable layer for the modify control (ugly)
+            var modActive = modify.active;
+            if(modActive) {
+                modify.deactivate();
+            }
+            modify.layer = layer;
+            modify.selectControl.layer = layer;
+            modify.selectControl.handlers.feature.layer = layer;
+            modify.dragControl.layer = layer;
+            modify.dragControl.handlers.drag.layer = layer;
+            modify.dragControl.handlers.feature.layer = layer;
+            if(modActive) {
+                modify.activate();
+            }
+            
+            // update the editable layer for the draw control (very ugly)
+            var drawActive = draw.active;
+            if(drawActive) {
+                draw.deactivate();
+            }
+            draw.layer = layer;
+            var handler = ({
+                point: OpenLayers.Handler.Point,
+                line: OpenLayers.Handler.Path,
+                poly: OpenLayers.Handler.Polygon
+            })[name];
+            draw.handler = new handler(draw, draw.callbacks, draw.handlerOptions);
+            if(drawActive) {
+                draw.activate();
+            }
+
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Snapping Example</h1>
+    <div id="shortdesc">A demonstration snapping while editing vector features.</div>
+    <div id="map" class="smallmap"></div>
+    <br/>
+    <label for="editable">Editable Layer:</label>
+    <select id="editable" name="editable">
+        <option value="poly">polygons</option>
+        <option value="line">lines</option>
+        <option value="point">points</option>
+    </select>
+    <label for="snapping">Enable Snapping</label>
+    <input type="checkbox" name="snapping" id="snapping" checked="checked" />
+    <table>
+        <tbody>
+            <tr class="head">
+                <td>targets</td><td>node</td><td>vertex</td><td>edge</td>
+            </tr>
+            <tr>
+                <td>points</td>
+                <td><input type="checkbox" id="0_node" /><input id="0_nodeTolerance" type="text" size="3" /></td>
+                <td><input type="checkbox" id="0_vertex" /><input id="0_vertexTolerance" type="text" size="3" /></td>
+                <td><input type="checkbox" id="0_edge" /><input id="0_edgeTolerance" type="text" size="3" /></td>
+            </tr>
+            <tr>
+                <td>lines</td>
+                <td><input type="checkbox" id="1_node" /><input id="1_nodeTolerance" type="text" size="3" /></td>
+                <td><input type="checkbox" id="1_vertex" /><input id="1_vertexTolerance" type="text" size="3" /></td>
+                <td><input type="checkbox" id="1_edge" /><input id="1_edgeTolerance" type="text" size="3" /></td>
+            </tr>
+            <tr>
+                <td>polygons</td>
+                <td><input type="checkbox" id="2_node" /><input id="2_nodeTolerance" type="text" size="3" /></td>
+                <td><input type="checkbox" id="2_vertex" /><input id="2_vertexTolerance" type="text" size="3" /></td>
+                <td><input type="checkbox" id="2_edge" /><input id="2_edgeTolerance" type="text" size="3" /></td>
+            </tr>
+        </tbody>
+    </table>
+    <p>Though all snapping types are shown here for all target layers, not all are sensible.
+    Points don't have edges, for example.</p>
+  </body>
+</html>
diff --git a/examples/sos.html b/examples/sos.html
new file mode 100644
index 0000000..d3b6266
--- /dev/null
+++ b/examples/sos.html
@@ -0,0 +1,179 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <style type="text/css">
+    .sosmap {
+        width: 768px;
+        height: 512px;
+    }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        OpenLayers.ProxyHost = "proxy.cgi?url=";
+        OpenLayers.Util.extend(OpenLayers.Lang.en,
+            {
+                'SOSClientType': "Type",
+                'SOSClientTime': "Date/time",
+                'SOSClientLastvalue': "Last value"
+            }
+        );
+
+        // Example class on how to put all the OpenLayers SOS pieces together
+        OpenLayers.SOSClient = OpenLayers.Class({
+            url: null,
+            map: null,
+            capsformat: new OpenLayers.Format.SOSCapabilities(),
+            obsformat: new OpenLayers.Format.SOSGetObservation(),
+            initialize: function (options) {
+                OpenLayers.Util.extend(this, options);
+                var params = {'service': 'SOS', 'request': 'GetCapabilities'};
+                var paramString = OpenLayers.Util.getParameterString(params);
+                url = OpenLayers.Util.urlAppend(this.url, paramString);
+                OpenLayers.Request.GET({url: url,
+                    success: this.parseSOSCaps, scope: this});
+            },
+            getFois: function() {
+                var result = [];
+                this.offeringCount = 0; 
+                for (var name in this.SOSCapabilities.contents.offeringList) {
+                    var offering = this.SOSCapabilities.contents.offeringList[name];
+                    this.offeringCount++;
+                    for (var i=0, len=offering.featureOfInterestIds.length; i<len; i++) {
+                        var foi = offering.featureOfInterestIds[i];
+                        if (OpenLayers.Util.indexOf(result, foi) === -1) {
+                            result.push(foi);
+                        }
+                    }
+                }
+                return result;
+            },
+            parseSOSCaps: function(response) {
+                // cache capabilities for future use
+                this.SOSCapabilities = this.capsformat.read(response.responseXML || response.responseText);
+                this.layer = new OpenLayers.Layer.Vector("Stations", {
+                    strategies: [new OpenLayers.Strategy.Fixed()],
+                    protocol: new OpenLayers.Protocol.SOS({
+                        formatOptions: {internalProjection: map.getProjectionObject()},
+                        url: this.url,
+                        fois: this.getFois()
+                    })
+                });
+                this.map.addLayer(this.layer);
+                this.ctrl = new OpenLayers.Control.SelectFeature(this.layer,
+                    {scope: this, onSelect: this.onFeatureSelect});
+                this.map.addControl(this.ctrl);
+                this.ctrl.activate();
+            },
+            getTitleForObservedProperty: function(property) {
+                for (var name in this.SOSCapabilities.contents.offeringList) {
+                    var offering = this.SOSCapabilities.contents.offeringList[name];
+                    if (offering.observedProperties[0] === property) {
+                        return offering.name;
+                    }
+                }
+            },
+            showPopup: function(response) {
+                this.count++;
+                var output = this.obsformat.read(response.responseXML || response.responseText);
+                this.html += '<tr>';
+                this.html += '<td width="100">'+this.getTitleForObservedProperty(output.measurements[0].observedProperty)+'</td>';
+                this.html += '<td>'+output.measurements[0].samplingTime.timeInstant.timePosition+'</td>';
+                this.html += '<td>'+output.measurements[0].result.value + ' ' + output.measurements[0].result.uom + '</td>';
+                this.html += '</tr>';
+                // check if we are done
+                if (this.count === this.numRequests) {
+                    var html = '<table cellspacing="10"><tbody>';
+                    html += '<tr>';
+                    html += '<th><b>'+OpenLayers.i18n('SOSClientType')+'</b></th>';
+                    html += '<th><b>'+OpenLayers.i18n('SOSClientTime')+'</b></th>';
+                    html += '<th><b>'+OpenLayers.i18n('SOSClientLastvalue')+'</b></th>';
+                    html += '</tr>';
+                    html += this.html;
+                    html += '</tbody></table>';
+                    var popup = new OpenLayers.Popup.FramedCloud("sensor",
+                    this.feature.geometry.getBounds().getCenterLonLat(),
+                        null,
+                        html,
+                        null,
+                        true,
+                        function(e) {
+                            this.hide();
+                            OpenLayers.Event.stop(e);
+                            // unselect so popup can be shown again
+                            this.map.getControlsByClass('OpenLayers.Control.SelectFeature')[0].unselectAll();
+                        } 
+                    );
+                    this.feature.popup = popup;
+                    this.map.addPopup(popup);
+                }
+            },
+            onFeatureSelect: function(feature) {
+                this.feature = feature;
+                this.count = 0;
+                this.html = '';
+                this.numRequests = this.offeringCount;
+                if (!this.responseFormat) {
+                    for (format in this.SOSCapabilities.operationsMetadata.GetObservation.parameters.responseFormat.allowedValues) {
+                        // look for a text/xml type of format
+                        if (format.indexOf('text/xml') >= 0) {
+                            this.responseFormat = format;
+                        }
+                    }
+                }
+                // do a GetObservation request to get the latest values
+                for (var name in this.SOSCapabilities.contents.offeringList) {
+                    var offering = this.SOSCapabilities.contents.offeringList[name];
+                    var xml = this.obsformat.write({
+                        eventTime: 'latest',
+                        resultModel: 'om:Measurement',
+                        responseMode: 'inline',
+                        procedure: feature.attributes.id,
+                        offering: name,
+                        observedProperty: offering.observedProperties[0],
+                        responseFormat: this.responseFormat
+                    });
+                    OpenLayers.Request.POST({
+                        url: this.url,
+                        scope: this,
+                        success: this.showPopup,
+                        data: xml
+                    });
+                }
+            },
+            destroy: function () {
+            },
+            CLASS_NAME: "OpenLayers.SOSClient"
+        });
+
+        function init(){
+            map = new OpenLayers.Map( 'map' );
+            var baseLayer = new OpenLayers.Layer.WMS("Test Layer", "http://vmap0.tiles.osgeo.org/wms/vmap0?", {
+                layers: "basic"}, {singleTile: true});
+
+            var sos = new OpenLayers.SOSClient({map: map, url: 'http://v-swe.uni-muenster.de:8080/WeatherSOS/sos?'});
+
+            map.addLayers([baseLayer]);
+            map.setCenter(new OpenLayers.LonLat(5, 45), 4);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+            map.addControl( new OpenLayers.Control.MousePosition() );
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">SOS client example</h1>
+
+    <div id="tags">
+    </div>
+        <p id="shortdesc">
+            Shows how to connect OpenLayers to a Sensor Observation Service (SOS)
+        </p>
+    <div id="map" class="sosmap"></div>
+        <div id="docs">
+        <p>This example uses a vector layer with a Protocol.SOS and a fixed Strategy.
+        </p><p>When clicking on a point feature (the weather stations offered by the SOS), the
+        latest values for all offerings are displayed in a popup.</p>
+        </div>
+  </body>
+</html>
diff --git a/examples/spherical-mercator.html b/examples/spherical-mercator.html
new file mode 100644
index 0000000..7327b05
--- /dev/null
+++ b/examples/spherical-mercator.html
@@ -0,0 +1,146 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Spherical Mercator</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        .olControlAttribution { bottom: 0px!important }
+        #map {
+            height: 512px;
+        }
+
+        /* avoid pink tiles */
+        .olImageLoadError {
+            background-color: transparent !important;
+        }
+    </style>
+
+    <script src='http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1'></script>
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script src="http://api.maps.yahoo.com/ajaxymap?v=3.0&appid=euzuro-openlayers"></script>
+
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+        // make map available for easy debugging
+        var map;
+
+        // increase reload attempts 
+        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
+
+        function init(){
+            var options = {
+                projection: new OpenLayers.Projection("EPSG:900913"),
+                displayProjection: new OpenLayers.Projection("EPSG:4326"),
+                units: "m",
+                numZoomLevels: 18,
+                maxResolution: 156543.0339,
+                maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
+                                                 20037508, 20037508.34)
+            };
+            map = new OpenLayers.Map('map', options);
+
+            // create Google Mercator layers
+            var gmap = new OpenLayers.Layer.Google(
+                "Google Streets",
+                {'sphericalMercator': true}
+            );
+            var gsat = new OpenLayers.Layer.Google(
+                "Google Satellite",
+                {type: G_SATELLITE_MAP, 'sphericalMercator': true, numZoomLevels: 22}
+            );
+            var ghyb = new OpenLayers.Layer.Google(
+                "Google Hybrid",
+                {type: G_HYBRID_MAP, 'sphericalMercator': true}
+            );
+
+            // create Virtual Earth layers
+            var veroad = new OpenLayers.Layer.VirtualEarth(
+                "Virtual Earth Roads",
+                {'type': VEMapStyle.Road, 'sphericalMercator': true}
+            );
+            var veaer = new OpenLayers.Layer.VirtualEarth(
+                "Virtual Earth Aerial",
+                {'type': VEMapStyle.Aerial, 'sphericalMercator': true}
+            );
+            var vehyb = new OpenLayers.Layer.VirtualEarth(
+                "Virtual Earth Hybrid",
+                {'type': VEMapStyle.Hybrid, 'sphericalMercator': true}
+            );
+
+            // create Yahoo layer
+            var yahoo = new OpenLayers.Layer.Yahoo(
+                "Yahoo Street",
+                {'sphericalMercator': true}
+            );
+            var yahoosat = new OpenLayers.Layer.Yahoo(
+                "Yahoo Satellite",
+                {'type': YAHOO_MAP_SAT, 'sphericalMercator': true}
+            );
+            var yahoohyb = new OpenLayers.Layer.Yahoo(
+                "Yahoo Hybrid",
+                {'type': YAHOO_MAP_HYB, 'sphericalMercator': true}
+            );
+
+            // create OSM layer
+            var mapnik = new OpenLayers.Layer.OSM();
+            // create OAM layer
+            var oam = new OpenLayers.Layer.XYZ(
+                "OpenAerialMap",
+                "http://tile.openaerialmap.org/tiles/1.0.0/openaerialmap-900913/${z}/${x}/${y}.png",
+                {
+                    sphericalMercator: true
+                }
+            );
+
+            // create OSM layer
+            var osmarender = new OpenLayers.Layer.OSM(
+                "OpenStreetMap (Tiles at Home)",
+                "http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png"
+            );
+
+
+            // create WMS layer
+            var wms = new OpenLayers.Layer.WMS(
+                "World Map",
+                "http://world.freemap.in/tiles/",
+                {'layers': 'factbook-overlay', 'format':'png'},
+                {
+                    'opacity': 0.4, visibility: false,
+                    'isBaseLayer': false,'wrapDateLine': true
+                }
+            );
+
+            // create a vector layer for drawing
+            var vector = new OpenLayers.Layer.Vector("Editable Vectors");
+
+            map.addLayers([gmap, gsat, ghyb, veroad, veaer, vehyb,
+                           yahoo, yahoosat, yahoohyb, oam, mapnik, osmarender,
+                           wms, vector]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.EditingToolbar(vector));
+            map.addControl(new OpenLayers.Control.Permalink());
+            map.addControl(new OpenLayers.Control.MousePosition());
+            if (!map.getCenter()) {map.zoomToMaxExtent()}
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Spherical Mercator Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Shows the use of the Spherical Mercator Layers, for overlaying 
+        Google, Yahoo, Microsoft, and other layers with WMS and TMS tiles.
+    </p>
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+    </div>
+  </body>
+</html>
+
+
+
diff --git a/examples/split-feature.html b/examples/split-feature.html
new file mode 100644
index 0000000..4effe06
--- /dev/null
+++ b/examples/split-feature.html
@@ -0,0 +1,108 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>Split Feature Example</title>
+        
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style>
+            /* avoid pink tiles */
+            .olImageLoadError {
+                background-color: transparent !important;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map, vectors, split;
+            function init(){
+                map = new OpenLayers.Map('map');
+
+                // give the features some style
+                var styles = new OpenLayers.StyleMap({
+                    "default": {
+                        strokeWidth: 2
+                    },
+                    "select": {
+                        strokeColor: "#0099cc",
+                        strokeWidth: 4
+                    }
+                });
+            
+                // add rules from the above lookup table
+                styles.addUniqueValueRules("default", "RP_TYPE", {
+                    10: {strokeColor: "#000000", strokeWidth: 2},
+                    12: {strokeColor: "#222222", strokeWidth: 2},
+                    14: {strokeColor: "#444444", strokeWidth: 2},
+                    16: {strokeColor: "#666666", strokeWidth: 2},
+                    18: {strokeColor: "#888888", strokeWidth: 2},
+                    19: {strokeColor: "#666666", strokeWidth: 1}
+                });
+
+                vectors = new OpenLayers.Layer.Vector("Lines", {
+                    isBaseLayer: true,
+                    strategies: [new OpenLayers.Strategy.Fixed()],                
+                    protocol: new OpenLayers.Protocol.HTTP({
+                        url: "data/roads.json",
+                        format: new OpenLayers.Format.GeoJSON()
+                    }),
+                    styleMap: styles,
+                    maxExtent: new OpenLayers.Bounds(
+                        1549471.9221, 6403610.94, 1550001.32545, 6404015.8
+                    )
+                });
+            
+
+
+
+                map.addLayer(vectors);
+
+                map.addControl(new OpenLayers.Control.MousePosition());
+
+                var split = new OpenLayers.Control.Split({
+                    layer: vectors,
+                    eventListeners: {
+                        aftersplit: function(event) {
+                            flashFeatures(event.features);
+                        }
+                    }
+                });
+                map.addControl(split);
+                split.activate();
+                map.zoomToMaxExtent();
+
+            }
+            
+            function flashFeatures(features, index) {
+                if(!index) {
+                    index = 0;
+                }
+                var current = features[index];
+                if(current && current.layer === vectors) {
+                    vectors.drawFeature(features[index], "select");
+                }
+                var prev = features[index-1];
+                if(prev && prev.layer === vectors) {
+                    vectors.drawFeature(prev, "default");
+                }
+                ++index;
+                if(index <= features.length) {
+                    window.setTimeout(function() {flashFeatures(features, index)}, 100);
+                }
+            }
+
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">OpenLayers Split Feature Example</h1>
+        <p id="shortdesc">
+            Demonstrates splitting of line features.
+        </p>
+        <div id="map" class="smallmap"></div>    
+        <div id="docs">
+            The split control can be configured to listen for edits on any vector layer
+            or it can allow for creation of temporary sketch features.  Modified or
+            newly drawn features will be used to split existing features on any target
+            layer.  This example shows the split control configured to use temporary
+            sketches for the split.
+        </div>
+    </body>
+</html>
diff --git a/examples/strategy-bbox.html b/examples/strategy-bbox.html
new file mode 100644
index 0000000..18fd0bf
--- /dev/null
+++ b/examples/strategy-bbox.html
@@ -0,0 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers BBOX Strategy Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map, photos;
+            OpenLayers.ProxyHost = (window.location.host == "localhost") ?
+                "/cgi-bin/proxy.cgi?url=" : "proxy.cgi?url=";
+        
+            function init() {
+                map = new OpenLayers.Map('map', {
+                    restrictedExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
+                });
+                var base = new OpenLayers.Layer.WMS("Imagery", 
+                    ["http://t1.hypercube.telascience.org/tiles?",
+		     "http://t2.hypercube.telascience.org/tiles?",
+		     "http://t3.hypercube.telascience.org/tiles?",
+		     "http://t4.hypercube.telascience.org/tiles?"], 
+                    {layers: 'landsat7'}
+                );
+
+                var style = new OpenLayers.Style({
+                    externalGraphic: "${img_url}",
+                    pointRadius: 30
+                });
+
+                photos = new OpenLayers.Layer.Vector("Photos", {
+                    strategies: [new OpenLayers.Strategy.BBOX()],
+                    protocol: new OpenLayers.Protocol.HTTP({
+                        url: "http://labs.metacarta.com/flickrbrowse/flickr.py/flickr",
+                        params: {
+                            format: "WFS",
+                            sort: "interestingness-desc",
+                            service: "WFS",
+                            request: "GetFeatures",
+                            srs: "EPSG:4326",
+                            maxfeatures: 10
+                        },
+                        format: new OpenLayers.Format.GML()
+                    }),
+                    styleMap: new OpenLayers.StyleMap(style)
+                });
+
+                map.addLayers([base, photos]);
+                map.setCenter(new OpenLayers.LonLat(-116.45, 35.42), 5);
+            }
+            
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">BBOX Strategy Example</h1>
+        <p id="shortdesc">
+            Uses a BBOX strategy to request features within a bounding box.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>The BBOX strategy requests data within a bounding box.  When the
+            previously requested data bounds are invalidated (by browsing to
+            some area not covered by those bounds), another request for data
+            is issued.</p>
+        </div>
+    </body>
+</html>
diff --git a/examples/strategy-cluster-threshold.html b/examples/strategy-cluster-threshold.html
new file mode 100644
index 0000000..4144459
--- /dev/null
+++ b/examples/strategy-cluster-threshold.html
@@ -0,0 +1,145 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Cluster Strategy Threshold</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            ul {
+                list-style: none;
+                padding-left: 2em;
+            }
+            #reset {
+                margin-left: 2em;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+
+            // create a semi-random grid of features to be clustered
+            var dx = 3;
+            var dy = 3;
+            var px, py;
+            var features = [];
+            for(var x=-45; x<=45; x+=dx) {
+                for(var y=-22.5; y<=22.5; y+=dy) {
+                    px = x + (2 * dx * (Math.random() - 0.5));
+                    py = y + (2 * dy * (Math.random() - 0.5));
+                    features.push(new OpenLayers.Feature.Vector(
+                        new OpenLayers.Geometry.Point(px, py), {x: px, y: py}
+                    ));
+                }
+            }
+
+            var map, strategy, clusters;
+            function init() {
+                map = new OpenLayers.Map('map');
+                var base = new OpenLayers.Layer.WMS("OpenLayers WMS", 
+                    ["http://t3.tilecache.osgeo.org/wms-c/Basic.py",
+                     "http://t2.tilecache.osgeo.org/wms-c/Basic.py",
+                     "http://t1.tilecache.osgeo.org/wms-c/Basic.py"], 
+                    {layers: 'satellite'}
+                );
+
+                var style = new OpenLayers.Style({
+                    pointRadius: "${radius}",
+                    fillColor: "#ffcc66",
+                    fillOpacity: 0.8,
+                    strokeColor: "#cc6633",
+                    strokeWidth: "${width}",
+                    strokeOpacity: 0.8
+                }, {
+                    context: {
+                        width: function(feature) {
+                            return (feature.cluster) ? 2 : 1;
+                        },
+                        radius: function(feature) {
+                            var pix = 2;
+                            if(feature.cluster) {
+                                pix = Math.min(feature.attributes.count, 7) + 2;
+                            }
+                            return pix;
+                        }
+                    }
+                });
+                
+                strategy = new OpenLayers.Strategy.Cluster();
+
+                clusters = new OpenLayers.Layer.Vector("Clusters", {
+                    strategies: [strategy],
+                    styleMap: new OpenLayers.StyleMap({
+                        "default": style,
+                        "select": {
+                            fillColor: "#8aeeef",
+                            strokeColor: "#32a8a9"
+                        }
+                    })
+                });
+                
+                var select = new OpenLayers.Control.SelectFeature(
+                    clusters, {hover: true}
+                );
+                map.addControl(select);
+                select.activate();
+                clusters.events.on({"featureselected": display});
+
+                map.addLayers([base, clusters]);
+                map.setCenter(new OpenLayers.LonLat(0, 0), 2);
+                
+                reset();
+                $("reset").onclick = reset;
+
+            }
+            
+            function reset() {
+                var distance = parseInt($("distance").value);
+                var threshold = parseInt($("threshold").value);
+                strategy.distance = distance || strategy.distance;
+                strategy.threshold = threshold || strategy.threshold;
+                $("distance").value = strategy.distance;
+                $("threshold").value = strategy.threshold || "null";
+                clusters.removeFeatures(clusters.features);
+                clusters.addFeatures(features);
+            }
+            
+            function display(event) {
+                var f = event.feature;
+                var el = $("output");
+                if(f.cluster) {
+                    el.innerHTML = "cluster of " + f.attributes.count;
+                } else {
+                    el.innerHTML = "unclustered " + f.geometry;
+                }
+            }
+            
+            
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Cluster Strategy Threshold</h1>
+        <p id="shortdesc">
+            Demonstrates the use of the cluster strategy threshold property.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>The Cluster strategy lets you display points representing clusters
+            of features within some pixel distance.  You can control the behavior
+            of the cluster strategy by setting its distance and threshold properties.
+            The distance determines the search radius (in pixels) for features to
+            cluster.  The threshold determines the minimum number of features to
+            be considered a cluster.</p>
+        </div>
+        <br />
+        <p>Cluster details: <span id="output">hover over a feature to see details.</span></p>
+        <ul>
+            <li>
+                <input id="distance" name="distance" type="text" value="" size="3" />
+                <label for="distance">distance</label>
+            </li>
+            <li>
+                <input id="threshold" name="threshold" type="text" value="" size="3" />
+                <label for="threshold">threshold</label>
+            </li>
+        </ul>
+        <button id="reset">recluster</button>
+    </body>
+</html>
diff --git a/examples/strategy-cluster.html b/examples/strategy-cluster.html
new file mode 100644
index 0000000..d275261
--- /dev/null
+++ b/examples/strategy-cluster.html
@@ -0,0 +1,202 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Cluster Strategy Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            #photos {
+                height: 100px;
+                width: 512px;
+                position: relative;
+                white-space: nowrap;
+            }
+            .shift {
+                height: 25px;
+                line-height: 25px;
+                background-color: #fefefe;
+                text-align: center;
+                position: absolute;
+                bottom: 10px;
+                font-size: 8px;
+                font-weight: bold;
+                color: #696969;
+                width: 25px;
+            }
+            #scroll-start {
+                left: 0px;
+            }
+            #scroll-end {
+                right: 0px;
+            }
+            #scroll {
+                left: 30px;
+                width: 452px;
+                height: 100px;
+                overflow: hidden;
+                position: absolute;
+                bottom: 0px;
+            }
+            #photos ul {
+                position: absolute;
+                bottom: 0px;
+                padding: 0;
+                margin: 0;
+            }
+            #photos ul.start {
+                left: 0px;
+            }
+            #photos ul.end {
+                right: 80px;
+            }
+            #photos ul li {
+                padding 10px;
+                margin: 0;
+                list-style: none;
+                display: inline;
+            }
+            img.thumb {
+                height: 30px;
+            }
+            img.big {
+                height: 90px;
+            }
+        </style>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="Jugl.js"></script>
+        <script src="animator.js"></script>
+        <script type="text/javascript">
+            var map, template;
+            var Jugl = window["http://jugl.tschaub.net/trunk/lib/Jugl.js"];
+            OpenLayers.ProxyHost = (window.location.host == "localhost") ?
+                "/cgi-bin/proxy.cgi?url=" : "proxy.cgi?url=";
+
+            function init() {
+                map = new OpenLayers.Map('map', {
+                    restrictedExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
+                });
+                var base = new OpenLayers.Layer.WMS("Imagery", 
+                    ["http://t1.hypercube.telascience.org/tiles?",
+		     "http://t2.hypercube.telascience.org/tiles?",
+		     "http://t3.hypercube.telascience.org/tiles?",
+		     "http://t4.hypercube.telascience.org/tiles?"], 
+                    {layers: 'landsat7'}
+                );
+
+                var style = new OpenLayers.Style({
+                    pointRadius: "${radius}",
+                    fillColor: "#ffcc66",
+                    fillOpacity: 0.8,
+                    strokeColor: "#cc6633",
+                    strokeWidth: 2,
+                    strokeOpacity: 0.8
+                }, {
+                    context: {
+                        radius: function(feature) {
+                            return Math.min(feature.attributes.count, 7) + 3;
+                        }
+                    }
+                });
+
+                var photos = new OpenLayers.Layer.Vector("Photos", {
+                    strategies: [
+                        new OpenLayers.Strategy.Fixed(),
+                        new OpenLayers.Strategy.Cluster()
+                    ],
+                    protocol: new OpenLayers.Protocol.HTTP({
+                        url: "http://labs.metacarta.com/flickrbrowse/flickr.py/flickr",
+                        params: {
+                            format: "WFS",
+                            sort: "interestingness-desc",
+                            service: "WFS",
+                            request: "GetFeatures",
+                            srs: "EPSG:4326",
+                            maxfeatures: 150,
+                            bbox: [-180, -90, 180, 90]
+                        },
+                        format: new OpenLayers.Format.GML()
+                    }),
+                    styleMap: new OpenLayers.StyleMap({
+                        "default": style,
+                        "select": {
+                            fillColor: "#8aeeef",
+                            strokeColor: "#32a8a9"
+                        }
+                    })
+                });
+                
+                var select = new OpenLayers.Control.SelectFeature(
+                    photos, {hover: true}
+                );
+                map.addControl(select);
+                select.activate();
+                photos.events.on({"featureselected": display});
+
+                map.addLayers([base, photos]);
+                map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+                
+                // template setup
+                template = new Jugl.Template("template");
+
+            }
+            
+            function display(event) {
+                // clear previous photo list and create new one
+                $("photos").innerHTML = "";
+                var node = template.process({
+                    context: {features: event.feature.cluster},
+                    clone: true,
+                    parent: $("photos")
+                });
+                // set up forward/rewind
+                var forward = Animator.apply($("list"), ["start", "end"], {duration: 1500});
+                $("scroll-end").onmouseover = function() {forward.seekTo(1)};
+                $("scroll-end").onmouseout = function() {forward.seekTo(forward.state)};
+                $("scroll-start").onmouseover = function() {forward.seekTo(0)};
+                $("scroll-start").onmouseout = function() {forward.seekTo(forward.state)};
+                // set up photo zoom
+                for(var i=0; i<event.feature.cluster.length; ++i) {
+                    listen($("link-" + i), Animator.apply($("photo-" + i), ["thumb", "big"]));
+                }
+            }
+            
+            function listen(el, anim) {
+                el.onmouseover = function() {anim.seekTo(1)};
+                el.onmouseout = function() {anim.seekTo(0)};
+            }
+            
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Cluster Strategy Example</h1>
+        <p id="shortdesc">
+            Uses a cluster strategy to render points representing clusters of features.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>The Cluster strategy lets you display points representing clusters
+            of features within some pixel distance.</p>
+        </div>
+        <div id="photos"></div>
+        <p>Hover over a cluster on the map to see the photos it includes.</p>
+        <div style="display: none;">
+            <div id="template">
+                <div class="shift" id="scroll-start"><<</div>
+                <div id="scroll">
+                    <ul id="list" class="start">
+                        <li jugl:repeat="feature features">
+                            <a jugl:attributes="href feature.attributes.img_url;
+                                                id 'link-' + repeat.feature.index"
+                               target="_blank">
+                                <img jugl:attributes="src feature.attributes.img_url;
+                                                      title feature.attributes.title;
+                                                      id 'photo-' + repeat.feature.index"
+                                     class="thumb" />
+                            </a>
+                        </li>
+                    </ul>
+                </div>
+                <div class="shift" id="scroll-end">>></div>
+            </div>
+        </div>
+    </body>
+</html>
diff --git a/examples/strategy-paging.html b/examples/strategy-paging.html
new file mode 100644
index 0000000..abefa51
--- /dev/null
+++ b/examples/strategy-paging.html
@@ -0,0 +1,79 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Paging Strategy Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map, photos, paging;
+            OpenLayers.ProxyHost = (window.location.host == "localhost") ?
+                "/cgi-bin/proxy.cgi?url=" : "proxy.cgi?url=";
+        
+            function init() {
+                map = new OpenLayers.Map('map', {
+                    restrictedExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
+                });
+                var base = new OpenLayers.Layer.WMS("Imagery", 
+                    ["http://t1.hypercube.telascience.org/tiles?",
+		     "http://t2.hypercube.telascience.org/tiles?",
+		     "http://t3.hypercube.telascience.org/tiles?",
+		     "http://t4.hypercube.telascience.org/tiles?"], 
+                    {layers: 'landsat7'}
+                );
+
+                var style = new OpenLayers.Style({
+                    externalGraphic: "${img_url}",
+                    pointRadius: 30
+                });
+
+                paging = new OpenLayers.Strategy.Paging();
+
+                photos = new OpenLayers.Layer.Vector("Photos", {
+                    strategies: [new OpenLayers.Strategy.Fixed(), paging],
+                    protocol: new OpenLayers.Protocol.HTTP({
+                        url: "http://labs.metacarta.com/flickrbrowse/flickr.py/flickr",
+                        params: {
+                            format: "WFS",
+                            sort: "interestingness-desc",
+                            service: "WFS",
+                            request: "GetFeatures",
+                            srs: "EPSG:4326",
+                            maxfeatures: 100,
+                            bbox: [-180, -90, 180, 90]
+                        },
+                        format: new OpenLayers.Format.GML()
+                    }),
+                    styleMap: new OpenLayers.StyleMap(style)
+                });
+
+                map.addLayers([base, photos]);
+                photos.events.on({"featuresadded": updateButtons});
+                map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+            }
+            
+            function updateButtons() {
+                document.getElementById("prev").disabled = (paging.pageNum() < 1);
+                document.getElementById("next").disabled = (paging.pageNum() >= paging.pageCount() - 1);
+                document.getElementById("num").innerHTML = paging.pageNum() + 1;
+                document.getElementById("count").innerHTML = paging.pageCount();
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Paging Strategy Example</h1>
+        <p id="shortdesc">
+            Uses a paging strategy to cache large batches of features and render a page at a time.
+        </p>
+        <div id="map" class="smallmap"></div>
+        Displaying page <span id="num">0</span> of <span id="count">...</span>
+        <button id="prev" disabled="disabled" onclick="paging.pagePrevious();">previous</button>
+        <button id="next" disabled="disabled" onclick="paging.pageNext();">next</button>
+        <br /><br />
+        <div id="docs">
+            <p>The Paging strategy lets you apply client side paging for protocols
+            that do not support paging on the server.  In this case, the protocol requests a
+            batch of 100 features, the strategy caches those and supplies a single
+            page at a time to the layer.</p>
+        </div>
+    </body>
+</html>
diff --git a/examples/style-rules.html b/examples/style-rules.html
new file mode 100644
index 0000000..f70cd3e
--- /dev/null
+++ b/examples/style-rules.html
@@ -0,0 +1,43 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Rule Based Style</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="style-rules.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Rule Based Style</h1>
+        
+        <p id="shortdesc">
+            Use rule based styling to use different symbolizers for different
+            feature groups.
+        </p>
+        
+        <div id="map" class="smallmap"></div>
+        
+        <div id="docs">
+            <p>
+                This example uses four rules to render features.  Rules are
+                based on a feature attribute and determine which symbolizer
+                is applied when rendering a feature.  The rules in this example
+                change which marker is used by providing an externalGraphic
+                property in the symbolizer.
+            </p>
+                The features are labeled with the same attribute that determines
+                the symbolizer used.  You should be able to confirm that the
+                graphic color corresponds to the range of numbers given below.
+            </p>
+            <ul>
+                <li>0 <= blue < 25
+                <li>25 <= green < 50
+                <li>50 <= gold <= 75
+                <li>75 < red <= 100
+            </ul>
+            <p>
+                See the <a href="style-rules.js" target="_blank">
+                style-rules.js source</a> to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/style-rules.js b/examples/style-rules.js
new file mode 100644
index 0000000..42d3f00
--- /dev/null
+++ b/examples/style-rules.js
@@ -0,0 +1,99 @@
+var map;
+
+function init() {
+    map = new OpenLayers.Map("map");
+
+    var wms = new OpenLayers.Layer.WMS(
+        "OpenLayers WMS",
+        "http://vmap0.tiles.osgeo.org/wms/vmap0",
+        {layers: "basic"}
+    );
+    
+    /**
+     * Create 50 vector features.  Your features would typically be fetched
+     * from the server.  These are created here to demonstrate a rule based
+     * style.  The features are given an attribute named "foo".  The value
+     * of this attribute is an integer that ranges from 0 to 100.
+     */   
+    var features = new Array(25);
+    for (var i=0; i<features.length; i++) {
+        features[i] = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(
+                (340 * Math.random()) - 170,
+                (160 * Math.random()) - 80
+            ), {
+                foo: 100 * Math.random() | 0
+            }
+        );
+    }
+    
+    /**
+     * Here we create a new style object with rules that determine
+     * which symbolizer will be used to render each feature.
+     */
+    var style = new OpenLayers.Style(
+        // the first argument is a base symbolizer
+        // all other symbolizers in rules will extend this one
+        {
+            graphicWidth: 21,
+            graphicHeight: 25,
+            graphicYOffset: -28, // shift graphic up 28 pixels
+            label: "${foo}" // label will be foo attribute value
+        },
+        // the second argument will include all rules
+        {
+            rules: [
+                new OpenLayers.Rule({
+                    // a rule contains an optional filter
+                    filter: new OpenLayers.Filter.Comparison({
+                        type: OpenLayers.Filter.Comparison.LESS_THAN,
+                        property: "foo", // the "foo" feature attribute
+                        value: 25
+                    }),
+                    // if a feature matches the above filter, use this symbolizer
+                    symbolizer: {
+                        externalGraphic: "../img/marker-blue.png"
+                    }
+                }),
+                new OpenLayers.Rule({
+                    filter: new OpenLayers.Filter.Comparison({
+                        type: OpenLayers.Filter.Comparison.BETWEEN,
+                        property: "foo",
+                        lowerBoundary: 25,
+                        upperBoundary: 50
+                    }),
+                    symbolizer: {
+                        externalGraphic: "../img/marker-green.png"
+                    }
+                }),
+                new OpenLayers.Rule({
+                    filter: new OpenLayers.Filter.Comparison({
+                        type: OpenLayers.Filter.Comparison.BETWEEN,
+                        property: "foo",
+                        lowerBoundary: 50,
+                        upperBoundary: 75
+                    }),
+                    symbolizer: {
+                        externalGraphic: "../img/marker-gold.png"
+                    }
+                }),
+                new OpenLayers.Rule({
+                    // apply this rule if no others apply
+                    elseFilter: true,
+                    symbolizer: {
+                        externalGraphic: "../img/marker.png"
+                    }
+                })
+            ]
+        }
+    );
+    
+    // create the layer styleMap that uses the above style for all render intents
+    var vector = new OpenLayers.Layer.Vector("Points", {
+        styleMap: new OpenLayers.StyleMap(style)
+    });
+    vector.addFeatures(features);
+
+    map.addLayers([wms, vector]);
+    map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+}
diff --git a/examples/style.css b/examples/style.css
new file mode 100644
index 0000000..d1da62e
--- /dev/null
+++ b/examples/style.css
@@ -0,0 +1,86 @@
+/**
+ * CSS Reset
+ * From Blueprint reset.css
+ * http://blueprintcss.googlecode.com
+ */
+html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
+body {line-height:1.5;}
+table {border-collapse:separate;border-spacing:0;}
+caption, th, td {text-align:left;font-weight:normal;}
+table, td, th {vertical-align:middle;}
+blockquote:before, blockquote:after, q:before, q:after {content:"";}
+blockquote, q {quotes:"" "";}
+a img {border:none;}
+
+/**
+ * Basic Typography
+ */
+body {
+    font-family: "Lucida Grande", Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+    font-size: 80%;
+    color: #222;
+    background: #fff;
+    margin: 1em 1.5em;
+}
+pre, code {
+    margin: 1.5em 0;
+    white-space: pre;
+}
+pre, code {
+    font: 1em 'andale mono', 'lucida console', monospace;
+    line-height:1.5;
+}
+a[href] {
+    color: #436976;
+    background-color: transparent;
+}
+h1, h2, h3, h4, h5, h6 {
+    color: #003a6b;
+    background-color: transparent;
+    font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif;
+    margin: 0;
+    padding-top: 0.5em;
+}
+h1 {
+    font-size: 130%;
+    margin-bottom: 0.5em;
+    border-bottom: 1px solid #fcb100;
+}
+h2 {
+    font-size: 120%;
+    margin-bottom: 0.5em;
+    border-bottom: 1px solid #aaa;
+}
+h3 {
+    font-size: 110%;
+    margin-bottom: 0.5em;
+    text-decoration: underline;
+}
+h4 {
+    font-size: 100%;
+    font-weight: bold;
+}
+h5 {
+    font-size: 100%;
+    font-weight: bold;
+}
+h6 {
+    font-size: 80%;
+    font-weight: bold;
+}
+
+/**
+ * Map Examples Specific
+ */
+.smallmap {
+    width: 512px;
+    height: 256px;
+    border: 1px solid #ccc;
+}
+#tags {
+    display: none;
+}
+
+#docs p {
+    margin-bottom: 0.5em;
+}
diff --git a/examples/stylemap.html b/examples/stylemap.html
new file mode 100644
index 0000000..3d70818
--- /dev/null
+++ b/examples/stylemap.html
@@ -0,0 +1,94 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers StyleMap</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init() {
+            map = new OpenLayers.Map('map');
+            var wms = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}
+            );
+            
+            // Create 50 random features, and give them a "type" attribute that
+            // will be used to style them by size.
+            var features = new Array(50);
+            for (var i=0; i<features.length; i++) {
+                features[i] = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(
+                        (360 * Math.random()) - 180, (180 * Math.random()) - 90
+                    ), {
+                        type: 5 + parseInt(5 * Math.random())
+                    }
+                );
+            }
+            
+            // Create a styleMap to style your features for two different
+            // render intents.  The style for the 'default' render intent will
+            // be applied when the feature is first drawn.  The style for the
+            // 'select' render intent will be applied when the feature is
+            // selected.
+            var myStyles = new OpenLayers.StyleMap({
+                "default": new OpenLayers.Style({
+                    pointRadius: "${type}", // sized according to type attribute
+                    fillColor: "#ffcc66",
+                    strokeColor: "#ff9933",
+                    strokeWidth: 2,
+                    graphicZIndex: 1
+                }),
+                "select": new OpenLayers.Style({
+                    fillColor: "#66ccff",
+                    strokeColor: "#3399ff",
+                    graphicZIndex: 2
+                })
+            });
+            
+            // Create a vector layer and give it your style map.
+            var points = new OpenLayers.Layer.Vector("Points", {
+                styleMap: myStyles,
+                rendererOptions: {zIndexing: true}
+            });
+            points.addFeatures(features);
+            map.addLayers([wms, points]);
+            
+            // Create a select feature control and add it to the map.
+            var select = new OpenLayers.Control.SelectFeature(points, {hover: true});
+            map.addControl(select);
+            select.activate();
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">StyleMap Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Shows how to use a StyleMap to style features with rule based styling.
+        A style map references on or more OpenLayers.Style objects.  These
+        OpenLayers.Style objects are collections of OpenLayers.Rule objects
+        that determine how features are styled.  An OpenLayers.Rule object
+        combines an OpenLayers.Filter object with a symbolizer.  A filter is used
+        to determine whether a rule applies for a given feature, and a symbolizer
+        is used to draw the feature if the rule applies.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p>A style map is used with vector layers to define styles for various
+        rendering intents.  The style map used here has styles defined for the
+        "default" and "select" rendering intents.  This map also has an active
+        select feature control.  When you hover over features, they are selected
+        and drawn with the style corresponding the the "select" render intent.
+        </p>
+    </div>
+  </body>
+</html>
diff --git a/examples/styles-context.html b/examples/styles-context.html
new file mode 100644
index 0000000..b59b821
--- /dev/null
+++ b/examples/styles-context.html
@@ -0,0 +1,105 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Vector Styles</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init(){
+            map = new OpenLayers.Map('map', {maxResolution:'auto'});
+            var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(wms);
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+            
+            // Strategy 1:  Style features based on some attribute.
+            
+            // create 50 random features in the northern hemisphere
+            // give them a "type" attribute that will be used to style
+            // them by size
+            var features = new Array(50);
+            for (var i=0; i<features.length; i++) {
+                features[i] = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(
+                        (360 * Math.random()) - 180, 90 * Math.random()
+                    ), {
+                        type: 5 + parseInt(5 * Math.random())
+                    }
+                );
+            }
+            
+            // create the layer styleMap with a simple symbolizer template
+            var layer1 = new OpenLayers.Layer.Vector('Points', {
+                styleMap: new OpenLayers.StyleMap({
+                    pointRadius: "${type}", // based on feature.attributes.type
+                    fillColor: "#666666"
+                })
+            });
+            layer1.addFeatures(features);
+
+            // Strategy 2:  Style features based on something besides attributes.
+
+            // create 50 random features in the southern hemisphere
+            var features = new Array(50);
+            for (var i=0; i<features.length; i++) {
+                features[i] = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(
+                        (360 * Math.random()) - 180, -90 * Math.random()
+                    ), {
+                        type: 5 + parseInt(5 * Math.random())
+                    }
+                );
+            }
+            // create the layer styleMap by giving the default style a context
+            var colors = ["red", "green", "blue"];
+            var context = {
+                getColor: function(feature) {
+                    var region = parseInt((feature.geometry.x + 180) / 120);
+                    return colors[region];
+                },
+                getType: function(feature) {
+                    return feature.attributes["type"];
+                }
+            };
+            var template = {
+                pointRadius: "${getType}", // using context.getType(feature)
+                fillColor: "${getColor}" // using context.getColor(feature)
+            };
+            var style = new OpenLayers.Style(template, {context: context});
+            var layer2 = new OpenLayers.Layer.Vector('Points', {
+                styleMap: new OpenLayers.StyleMap(style)
+            });
+            layer2.addFeatures(features);
+
+
+            map.addLayers([layer1, layer2]);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Feature Styles Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        To style features with a custom function that evaluates each feature, use
+        the context option of an OpenLayers.Style object.  If the context object
+        contains a function and this function is referenced in a symbolizer, the
+        function will be called with the feature as an argument..
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p>Features in the northern hemisphere are styled according to their
+        "type" attribute.  This is accomplished with a simple template that
+        is evaluated with the feature attributes as context.</p>
+        <p>Features in the sourthern hemisphere are styled according to a
+        combination of their attributes and non-attribute properties.  This
+        is accomplished using an advanced template that calls functions
+        on the context object passed to the Style constructor.</p>
+    </div>
+  </body>
+</html>
diff --git a/examples/styles-rotation.html b/examples/styles-rotation.html
new file mode 100644
index 0000000..e441125
--- /dev/null
+++ b/examples/styles-rotation.html
@@ -0,0 +1,86 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Styles Rotation Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+    <script type="text/javascript">
+        
+        var map;
+        var vectors;
+        
+        function init(){
+            map = new OpenLayers.Map('map');
+            var wms = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}
+            );
+
+            vectors = new OpenLayers.Layer.Vector(
+                "Simple Geometry",
+                {
+                    styleMap: new OpenLayers.StyleMap({
+                        "default": {
+                            externalGraphic: "../img/marker-gold.png",
+                            //graphicWidth: 17,
+                            graphicHeight: 20,
+                            graphicYOffset: -19,
+                            rotation: "${angle}",
+                            fillOpacity: "${opacity}"
+                        },
+                        "select": {
+                            cursor: "crosshair",
+                            externalGraphic: "../img/marker.png"
+                        }
+                    })
+                }
+            );
+            
+            map.addLayers([wms, vectors]);
+            
+            var features = [];
+            var x = -111.04;
+            var y = 45.68;
+            for(var i = 0; i < 10; i++){
+                x += i * .5;
+                y += i * .1;
+                features.push(
+                    new OpenLayers.Feature.Vector(
+                        new OpenLayers.Geometry.Point(x, y), {angle: (i*36)%360-180, opacity:i/10+.1}
+                    )
+                );
+                features.push(
+                    new OpenLayers.Feature.Vector(
+                        new OpenLayers.Geometry.Point(x, y), {angle: (i*36)%360, opacity:i/10+.1}
+                    )
+                );
+            }
+            
+            map.setCenter(new OpenLayers.LonLat(x-10, y), 5);
+            vectors.addFeatures(features);
+
+            var selectControl = new OpenLayers.Control.SelectFeature(
+                vectors, {hover: true});
+            map.addControl(selectControl);
+            selectControl.activate();
+
+        };
+        
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Rotation Style Example</h1>
+    <p id="shortdesc">
+        Use the rotation property of a point symbolizer to rotate
+        point symbolizers.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+        To style point features with rotation, use the rotation property of the
+        symbolizer. The center of the rotation is the point of the image
+        specified by graphicXOffset and graphicYOffset. The rotation is
+        specified in degrees clockwise.
+    </div>
+  </body>
+</html>
diff --git a/examples/styles-unique.html b/examples/styles-unique.html
new file mode 100644
index 0000000..e2b6fe8
--- /dev/null
+++ b/examples/styles-unique.html
@@ -0,0 +1,103 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Styles Unique Value Styles Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map('map', {maxResolution:'auto'});
+            var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(wms);
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+            
+            // create 20 random features with a random type attribute. The
+            // type attribute is a value between 0 and 2.
+            var features = new Array(20);
+            for (var i=0; i<20; i++) {
+                features[i] = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(Math.random()*360-180, Math.random()*180-90),
+                    {type: parseInt(Math.random()*3)}
+                );
+            }
+            
+            // create a styleMap with a custom default symbolizer
+            var styleMap = new OpenLayers.StyleMap({
+                fillOpacity: 1,
+                pointRadius: 10
+            });
+            
+            // create a lookup table with different symbolizers for 0, 1 and 2
+            var lookup = {
+                0: {externalGraphic: "../img/marker-blue.png"},
+                1: {externalGraphic: "../img/marker-green.png"},
+                2: {externalGraphic: "../img/marker-gold.png"}
+            }
+            
+            // add rules from the above lookup table, with the keyes mapped to
+            // the "type" property of the features, for the "default" intent
+            styleMap.addUniqueValueRules("default", "type", lookup);
+            
+            layer = new OpenLayers.Layer.Vector('Points', {
+                styleMap: styleMap
+            });
+            
+            layer.addFeatures(features);
+            map.addLayer(layer);
+            
+            // create 20 random features with a random state property.
+            var features = new Array(20);
+            var states = [
+                OpenLayers.State.UNKNOWN,
+                OpenLayers.State.UPDATE,
+                OpenLayers.State.DELETE,
+                OpenLayers.State.INSERT
+            ];
+            for (var i=0; i<20; i++) {
+                features[i] = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(Math.random()*360-180, Math.random()*180-90)
+                );
+                features[i].state = states[parseInt(Math.random()*4)];
+            }
+            
+            var context = function(feature) {
+                return feature;
+            }
+            var styleMap = new OpenLayers.StyleMap();
+            
+            // create a lookup table with different symbolizers for the different
+            // state values
+            var lookup = {};
+            lookup[OpenLayers.State.UNKNOWN] = {fillColor: "green"};
+            lookup[OpenLayers.State.UPDATE] = {fillColor: "green"};
+            lookup[OpenLayers.State.DELETE] = {fillColor: "red"};
+            lookup[OpenLayers.State.INSERT] = {fillColor: "orange"};
+
+            styleMap.addUniqueValueRules("default", "state", lookup, context);
+            layer = new OpenLayers.Layer.Vector('Points', {
+                styleMap: styleMap
+            });
+            
+            layer.addFeatures(features);
+            map.addLayer(layer);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Unique Value Styles Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Shows how to create a style based on unique feature attribute values (markers)
+        and feature state values (circles).
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/sundials-spherical-mercator.html b/examples/sundials-spherical-mercator.html
new file mode 100644
index 0000000..40929e4
--- /dev/null
+++ b/examples/sundials-spherical-mercator.html
@@ -0,0 +1,128 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Sundials on a Spherical Mercator Map</title>
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+
+    <style type="text/css">
+        #map {
+            width: 100%;
+            height: 80%;
+            border: 1px solid black;
+        }
+        .olPopup p { margin:0px; font-size: .9em;}
+        .olPopup h2 { font-size:1.2em; }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, select;
+
+        function init(){
+            var options = {
+                projection: new OpenLayers.Projection("EPSG:900913"),
+                displayProjection: new OpenLayers.Projection("EPSG:4326"),
+                units: "m",
+                maxResolution: 156543.0339,
+                maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34,
+                                                 20037508.34, 20037508.34)
+            };
+            map = new OpenLayers.Map('map', options);
+            var mapnik = new OpenLayers.Layer.TMS(
+                "OpenStreetMap (Mapnik)",
+                "http://tile.openstreetmap.org/",
+                {
+                    type: 'png', getURL: osm_getTileURL,
+                    displayOutsideMaxExtent: true,
+                    attribution: '<a href="http://www.openstreetmap.org/">OpenStreetMap</a>'
+                }
+            );
+            var gmap = new OpenLayers.Layer.Google("Google", {sphericalMercator:true});
+            var sundials = new OpenLayers.Layer.Vector("KML", {
+                projection: map.displayProjection,
+                strategies: [new OpenLayers.Strategy.Fixed()],
+                protocol: new OpenLayers.Protocol.HTTP({
+                    url: "kml/sundials.kml",
+                    format: new OpenLayers.Format.KML({
+                        extractStyles: true,
+                        extractAttributes: true
+                    })
+                })
+            });
+
+            map.addLayers([mapnik, gmap, sundials]);
+
+            select = new OpenLayers.Control.SelectFeature(sundials);
+            
+            sundials.events.on({
+                "featureselected": onFeatureSelect,
+                "featureunselected": onFeatureUnselect
+            });
+  
+            map.addControl(select);
+            select.activate();   
+
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+
+            map.zoomToExtent(
+                new OpenLayers.Bounds(
+                    68.774414, 11.381836, 123.662109, 34.628906
+                ).transform(map.displayProjection, map.projection)
+            );
+        }
+        function onPopupClose(evt) {
+            select.unselectAll();
+        }
+        function onFeatureSelect(event) {
+            var feature = event.feature;
+            var selectedFeature = feature;
+            var popup = new OpenLayers.Popup.FramedCloud("chicken", 
+                feature.geometry.getBounds().getCenterLonLat(),
+                new OpenLayers.Size(100,100),
+                "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description,
+                null, true, onPopupClose
+            );
+            feature.popup = popup;
+            map.addPopup(popup);
+        }
+        function onFeatureUnselect(event) {
+            var feature = event.feature;
+            if(feature.popup) {
+                map.removePopup(feature.popup);
+                feature.popup.destroy();
+                delete feature.popup;
+            }
+        }
+        function osm_getTileURL(bounds) {
+            var res = this.map.getResolution();
+            var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
+            var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
+            var z = this.map.getZoom();
+            var limit = Math.pow(2, z);
+
+            if (y < 0 || y >= limit) {
+                return OpenLayers.Util.getImagesLocation() + "404.png";
+            } else {
+                x = ((x % limit) + limit) % limit;
+                return this.url + z + "/" + x + "/" + y + "." + this.type;
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">OSM + Google Maps + KML Reprojection</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+          Demonstrates loading and displaying a KML file on top of OpenStreetMap (OSM) and Google Maps data. Loads data from a KML file of sundials.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/sundials.html b/examples/sundials.html
new file mode 100644
index 0000000..cc07ca9
--- /dev/null
+++ b/examples/sundials.html
@@ -0,0 +1,98 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+
+    <style type="text/css">
+        #map {
+            width: 100%;
+            height: 80%;
+            border: 1px solid black;
+        }
+        .olPopup p { margin:0px; font-size: .9em;}
+        .olPopup h2 { font-size:1.2em; }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, select;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            var wms = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'}
+            );
+
+            var sundials = new OpenLayers.Layer.Vector("KML", {
+                projection: map.displayProjection,
+                strategies: [new OpenLayers.Strategy.Fixed()],
+                protocol: new OpenLayers.Protocol.HTTP({
+                    url: "kml/sundials.kml",
+                    format: new OpenLayers.Format.KML({
+                        extractStyles: true,
+                        extractAttributes: true
+                    })
+                })
+            });
+            
+            map.addLayers([wms, sundials]);
+            
+            select = new OpenLayers.Control.SelectFeature(sundials);
+            
+            sundials.events.on({
+                "featureselected": onFeatureSelect,
+                "featureunselected": onFeatureUnselect
+            });
+
+            map.addControl(select);
+            select.activate();   
+            map.zoomToExtent(new OpenLayers.Bounds(68.774414,11.381836,123.662109,34.628906));
+        }
+        function onPopupClose(evt) {
+            select.unselectAll();
+        }
+        function onFeatureSelect(event) {
+            var feature = event.feature;
+            // Since KML is user-generated, do naive protection against
+            // Javascript.
+            var content = "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description;
+            if (content.search("<script") != -1) {
+                content = "Content contained Javascript! Escaped content below.<br />" + content.replace(/</g, "<");
+            }
+            popup = new OpenLayers.Popup.FramedCloud("chicken", 
+                                     feature.geometry.getBounds().getCenterLonLat(),
+                                     new OpenLayers.Size(100,100),
+                                     content,
+                                     null, true, onPopupClose);
+            feature.popup = popup;
+            map.addPopup(popup);
+        }
+        function onFeatureUnselect(event) {
+            var feature = event.feature;
+            if(feature.popup) {
+                map.removePopup(feature.popup);
+                feature.popup.destroy();
+                delete feature.popup;
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">KML Layer Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+          Demonstrates loading and displaying a KML file on top of a basemap.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs"></div>
+  </body>
+</html>
diff --git a/examples/symbolizers-fill-stroke-graphic.html b/examples/symbolizers-fill-stroke-graphic.html
new file mode 100644
index 0000000..8e8296a
--- /dev/null
+++ b/examples/symbolizers-fill-stroke-graphic.html
@@ -0,0 +1,134 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Fill, Stroke, and Graphic Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init() {
+            map = new OpenLayers.Map('map');
+            
+            var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            
+            // allow testing of specific renderers via "?renderer=Canvas", etc
+            var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
+            renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
+            
+            var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {
+                styleMap: new OpenLayers.StyleMap({
+                    'default': new OpenLayers.Style(null, {
+                        rules: [
+                            new OpenLayers.Rule({
+                                symbolizer: {
+                                    graphic: false,
+                                    label: "Label for invisible point",
+                                    labelSelect: true
+                                },
+                                filter: new OpenLayers.Filter.Comparison({
+                                    type: "==",
+                                    property: "topic",
+                                    value: "point_invisible"
+                                })
+                            }),
+                            new OpenLayers.Rule({
+                                symbolizer: {
+                                    stroke: true,
+                                    fill: true,
+                                    label: "Polygon with stroke and fill defaults"
+                                },
+                                filter: new OpenLayers.Filter.Comparison({
+                                    type: "==",
+                                    property: "topic",
+                                    value: "polygon_defaults"
+                                })
+                            }),
+                            new OpenLayers.Rule({
+                                symbolizer: {
+                                    stroke: true,
+                                    fill: false,
+                                    label: "Point without fill",
+                                    labelAlign: "rb",
+                                    fontColor: "#ff0000",
+                                    fontOpacity: 0.4
+                                },
+                                filter: new OpenLayers.Filter.Comparison({
+                                    type: "==",
+                                    property: "topic",
+                                    value: "point_nofill"
+                                })
+                            })
+                        ]
+                    })
+                }),
+                renderers: renderer
+            });
+            
+            // create a point feature
+            var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
+            var pointFeature = new OpenLayers.Feature.Vector(point);
+            pointFeature.attributes = {
+                topic: "point_invisible"
+            };
+            
+            // create a polygon feature from a linear ring of points
+            var pointList = [];
+            for(var p=0; p<6; ++p) {
+                var a = p * (2 * Math.PI) / 7;
+                var r = Math.random(1) + 1;
+                var newPoint = new OpenLayers.Geometry.Point(point.x + 5 + (r * Math.cos(a)),
+                                                             point.y + 5 + (r * Math.sin(a)));
+                pointList.push(newPoint);
+            }
+            pointList.push(pointList[0]);
+            
+            var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
+            var polygonFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon([linearRing]));
+            polygonFeature.attributes = {
+                topic: "polygon_defaults"
+            };
+            
+            multiFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Collection([
+                    new OpenLayers.Geometry.LineString([
+                        new OpenLayers.Geometry.Point(-105,40),
+                        new OpenLayers.Geometry.Point(-95,45)
+                    ]),
+                    new OpenLayers.Geometry.Point(-105, 40)
+                ]),
+                {
+                    topic: "point_nofill"
+                });
+            
+            map.addLayer(vectorLayer);
+            vectorLayer.drawFeature(multiFeature);
+            map.setCenter(new OpenLayers.LonLat(point.x, point.y), 4);
+            vectorLayer.addFeatures([pointFeature, polygonFeature, multiFeature]);
+            var select = new OpenLayers.Control.SelectFeature(vectorLayer, {
+                selectStyle: OpenLayers.Util.extend(
+                    {fill: true, stroke: true},
+                    OpenLayers.Feature.Vector.style["select"])
+            });
+            map.addControl(select);
+            select.activate();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Example</h1>
+    <div id="tags"></div>
+    <p id="shortdesc">
+        Demonstrate fill, stroke, and graphic property of symbolizers.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+    This example shows how to use symbolizers with defaults for stroke, fill, and graphic.
+    This also allows to create labels for a feature without the feature rendered. Click on
+    the label in the middle to see selection of features with labelSelect set to true.
+    </div>
+  </body>
+</html>
diff --git a/examples/tasmania/TasmaniaCities.xml b/examples/tasmania/TasmaniaCities.xml
new file mode 100644
index 0000000..11f5bd7
--- /dev/null
+++ b/examples/tasmania/TasmaniaCities.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openplans.org/topp http://192.168.0.100:8080/geoserver-1.4.0-RC3/wfs/DescribeFeatureType?typeName=topp:tasmania_cities http://www.opengis.net/wfs http://192.168.0.100:8080/geoserver-1.4.0-RC3/schemas/wfs/1.0.0/WFS-basic.xsd">
+  <gml:boundedBy>
+    <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+      <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.29100045,-42.85100182 147.29100045,-42.85100182</gml:coordinates>
+    </gml:Box>
+  </gml:boundedBy>
+  <gml:featureMember>
+    <topp:tasmania_cities fid="tasmania_cities.1">
+      <topp:the_geom>
+        <gml:MultiPoint srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:pointMember>
+            <gml:Point>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.29100045,-42.85100182</gml:coordinates>
+            </gml:Point>
+          </gml:pointMember>
+        </gml:MultiPoint>
+      </topp:the_geom>
+      <topp:CITY_NAME>Hobart</topp:CITY_NAME>
+      <topp:ADMIN_NAME>Tasmania</topp:ADMIN_NAME>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+      <topp:STATUS>Provincial capital</topp:STATUS>
+      <topp:POP_CLASS>100,000 to 250,000</topp:POP_CLASS>
+    </topp:tasmania_cities>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_cities fid="tasmania_cities.2">
+      <topp:the_geom>
+        <gml:MultiPoint srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:pointMember>
+            <gml:Point>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147,-41.1</gml:coordinates>
+            </gml:Point>
+          </gml:pointMember>
+        </gml:MultiPoint>
+      </topp:the_geom>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+    </topp:tasmania_cities>
+  </gml:featureMember>
+</wfs:FeatureCollection>
diff --git a/examples/tasmania/TasmaniaRoads.xml b/examples/tasmania/TasmaniaRoads.xml
new file mode 100644
index 0000000..f01b56d
--- /dev/null
+++ b/examples/tasmania/TasmaniaRoads.xml
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openplans.org/topp http://192.168.0.100:8080/geoserver-1.4.0-RC3/wfs/DescribeFeatureType?typeName=topp:tasmania_roads http://www.opengis.net/wfs http://192.168.0.100:8080/geoserver-1.4.0-RC3/schemas/wfs/1.0.0/WFS-basic.xsd">
+  <gml:boundedBy>
+    <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+      <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">145.19754,-43.423512 148.27298,-40.852802</gml:coordinates>
+    </gml:Box>
+  </gml:boundedBy>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.1">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.468582,-41.241478 146.574768,-41.251186 146.640411,-41.255154 146.766129,-41.332348 146.794189,-41.34417 146.822174,-41.362988 146.863434,-41.380234 146.899521,-41.379452 146.929504,-41.378227 147.008041,-41.356079 147.098343,-41.362919</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>alley</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.2">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.098343,-41.362919 147.17305,-41.452778 147.213867,-41.503773 147.234894,-41.546661 147.251129,-41.573826 147.264664,-41.602474 147.284485,-41.617554 147.300583,-41.637878</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>highway</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.3">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.300583,-41.637878 147.225815,-41.626938 147.183319,-41.619236 147.082367,-41.577755 147.031326,-41.565205 146.961487,-41.564186 146.924545,-41.568565 146.876328,-41.569614 146.783722,-41.56073 146.684937,-41.536232 146.614258,-41.478153 146.619995,-41.423958 146.582581,-41.365482 146.52478,-41.29541 146.477493,-41.277622 146.468582,-41.241478</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>lane</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.4">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.522247,-41.859921 147.551865,-41.927834 147.597321,-42.017418 147.578644,-42.113216 147.541656,-42.217743 147.468674,-42.22662</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>highway</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.5">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.103699,-41.171677 146.303619,-41.237202 146.362228,-41.236279 146.39418,-41.245384 146.443726,-41.244308 146.468582,-41.241478</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>gravel</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.6">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">145.856018,-41.08007 145.944839,-41.119896 146.037994,-41.150059 146.103699,-41.171677</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>road</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.7">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.468674,-42.22662 147.474945,-42.292259 147.467697,-42.301292 147.451828,-42.341656 147.424545,-42.378723 147.366013,-42.412552 147.345779,-42.432449 147.289322,-42.476475 147.264511,-42.503899 147.259918,-42.547539 147.249405,-42.614006 147.278351,-42.693249 147.284271,-42.757759 147.256744,-42.778393</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>highway</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.8">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">148.249252,-41.860851 148.234436,-41.901783 148.192123,-41.93721 148.155762,-41.953667 148.127731,-41.994537 148.053131,-42.100563</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>road</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.9">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">145.19754,-40.878323 145.246674,-40.86021 145.293289,-40.852802 145.465225,-40.897865 145.538498,-40.936264 145.554062,-40.939201 145.602112,-40.962936 145.646362,-40.98243 145.683838,-40.989883 145.710587,-40.996201 145.744293,-41.007545 145.801956,-41.041782 145.856018,-41.08007</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>logging</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.10">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.360001,-42.91993 147.348816,-42.93726 147.285049,-42.979027 147.220886,-42.995876 147.164429,-43.027004 147.068237,-43.06319 146.96463,-43.116447 146.949554,-43.17004 146.95369,-43.209591 146.964127,-43.224545 146.975723,-43.250484 146.980759,-43.2701 146.982605,-43.287716 146.970871,-43.31691 146.940521,-43.33812 146.943054,-43.362263 146.952194,-43.39278 146.955429,-43.423512</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>road</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.11">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.300583,-41.637878 147.372009,-41.695503 147.402588,-41.725574 147.444061,-41.749676 147.490433,-41.782482 147.506866,-41.795624 147.522919,-41.835609 147.522247,-41.859921</gml:coordinates>
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>highway</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.12">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">148.053131,-42.100563 148.028229,-42.188286 148.002258,-42.2295 147.969955,-42.254417 147.960297,-42.284897 147.942719,-42.398819 147.926407,-42.486034 147.875092,-42.538582 147.832001,-42.587299 147.744217,-42.631607 147.693298,-42.656067 147.618195,-42.691135 147.575317,-42.743092 147.578293,-42.769539 147.547852,-42.814312 147.506699,-42.842907 147.488312,-42.877041 147.449692,-42.901054 14 [...]
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>road</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.13">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.098343,-41.362919 147.065445,-41.311977 147.024078,-41.257534 146.981445,-41.211391 146.948227,-41.181595 146.926773,-41.172501 146.905029,-41.147144 146.940765,-41.085857 146.962662,-41.075096 147.021088,-41.080925 147.099228,-41.123959 147.187607,-41.150597 147.282028,-41.104244 147.295715,-41.075798 147.306595,-41.062832 147.325745,-41.053524 147.362991,-41.080441 147.419022,-41.081764  [...]
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>road</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_roads fid="tasmania_roads.14">
+      <topp:the_geom>
+        <gml:MultiLineString srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:lineStringMember>
+            <gml:LineString>
+              <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.256744,-42.778393 147.220184,-42.824776 147.179596,-42.82143 147.111328,-42.795731 147.057098,-42.741581 147.003479,-42.704803 146.919098,-42.622734 146.910538,-42.610928 146.889984,-42.585396 146.83844,-42.572792 146.78569,-42.539352 146.724335,-42.485966 146.695023,-42.469582 146.649872,-42.450371 146.604965,-42.432274 146.578781,-42.408531 146.539307,-42.364208 146.525055,-42.30883 146. [...]
+            </gml:LineString>
+          </gml:lineStringMember>
+        </gml:MultiLineString>
+      </topp:the_geom>
+      <topp:TYPE>road</topp:TYPE>
+    </topp:tasmania_roads>
+  </gml:featureMember>
+</wfs:FeatureCollection>
diff --git a/examples/tasmania/TasmaniaStateBoundaries.xml b/examples/tasmania/TasmaniaStateBoundaries.xml
new file mode 100644
index 0000000..5edb4d7
--- /dev/null
+++ b/examples/tasmania/TasmaniaStateBoundaries.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openplans.org/topp http://192.168.0.100:8080/geoserver-1.4.0-RC3/wfs/DescribeFeatureType?typeName=topp:tasmania_state_boundaries http://www.opengis.net/wfs http://192.168.0.100:8080/geoserver-1.4.0-RC3/schemas/wfs/1.0.0/WFS-basic.xsd">
+  <gml:boundedBy>
+    <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+      <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">143.834824,-43.648056 148.479141,-39.573891</gml:coordinates>
+    </gml:Box>
+  </gml:boundedBy>
+  <gml:featureMember>
+    <topp:tasmania_state_boundaries fid="tasmania_state_boundaries.1">
+      <topp:the_geom>
+        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">148.01416,-42.753059 148.009979,-42.73111 148.011108,-42.652222 148.012634,-42.628613 148.018738,-42.61972 148.076492,-42.586945 148.128006,-42.590275 148.172897,-42.655277 148.168167,-42.665554 148.154984,-42.668888 148.097748,-42.666107 148.041656,-42.732216 148.01416,-42.753059</gml:coordinates>
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.361633,-43.263062 147.29303,-43.157082 147.329132,-43.102638 147.357178,-43.075005 147.396515,-43.11972 147.431641,-43.213886 147.432739,-43.241943 147.429688,-43.253616 147.361633,-43.263062</gml:coordinates>
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">148.128845,-40.274445 148.115234,-40.271667 148.101074,-40.26722 148.064423,-40.253891 148.049133,-40.245552 148.038589,-40.236248 148.013184,-40.161388 148.018311,-40.140209 147.90387,-39.975555 147.809616,-39.913815 147.773865,-39.894722 147.760742,-39.877983 147.783875,-39.850281 147.881897,-39.754173 147.925812,-39.737503 147.967743,-39.725555 147.971069,-39.736389 147.978302,-39.74472 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">148.339142,-40.503334 148.339691,-40.466942 148.33609,-40.45472 148.329971,-40.442917 148.318298,-40.435272 148.292206,-40.434441 148.129944,-40.44722 148.114685,-40.448883 148.103851,-40.454445 148.086639,-40.458057 148.068573,-40.45472 147.99704,-40.428196 147.993561,-40.417084 147.995514,-40.40139 147.998566,-40.389725 148.008041,-40.379162 148.065247,-40.348194 148.083588,-40.344719 14 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.302765,-43.513336 147.239136,-43.491669 147.175537,-43.501671 147.123016,-43.421944 147.190247,-43.354446 147.289566,-43.26403 147.300262,-43.262779 147.307739,-43.270279 147.362457,-43.374168 147.36496,-43.385834 147.362732,-43.398056 147.320663,-43.502918 147.310516,-43.511948 147.302765,-43.513336</gml:coordinates>
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">144.888885,-40.729439 144.878571,-40.726246 144.870941,-40.71944 144.865936,-40.671116 144.926224,-40.617222 144.993286,-40.666664 145.016083,-40.695549 144.926361,-40.722496 144.888885,-40.729439</gml:coordinates>
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.916702,-43.617844 146.863281,-43.636391 146.833588,-43.648056 146.81517,-43.617912 146.770401,-43.610695 146.686371,-43.603333 146.599548,-43.55611 146.514435,-43.542778 146.296082,-43.534729 146.275177,-43.52375 146.260269,-43.49514 146.231476,-43.488888 146.110367,-43.515423 146.0383,-43.498055 145.932678,-43.376316 145.991913,-43.345833 146.1026,-43.357918 146.156647,-43.379723 146. [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">143.921631,-40.136391 143.913879,-40.134727 143.886307,-40.116734 143.873566,-40.065002 143.892349,-40.054302 143.891937,-39.984722 143.885544,-39.970139 143.870514,-39.956947 143.851624,-39.945274 143.840378,-39.936802 143.834824,-39.927502 143.837738,-39.873055 143.85524,-39.711945 143.871063,-39.700279 143.899719,-39.688606 143.916656,-39.680557 143.925812,-39.674171 143.933594,-39.6669 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+        </gml:MultiPolygon>
+      </topp:the_geom>
+      <topp:STATE>Tasmania</topp:STATE>
+      <topp:COUNTRY>Australia</topp:COUNTRY>
+      <topp:CURR_TYPE>Australia Dollar</topp:CURR_TYPE>
+      <topp:CURR_CODE>AUD</topp:CURR_CODE>
+    </topp:tasmania_state_boundaries>
+  </gml:featureMember>
+</wfs:FeatureCollection>
diff --git a/examples/tasmania/TasmaniaWaterBodies.xml b/examples/tasmania/TasmaniaWaterBodies.xml
new file mode 100644
index 0000000..ba96e13
--- /dev/null
+++ b/examples/tasmania/TasmaniaWaterBodies.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openplans.org/topp http://192.168.0.100:8080/geoserver-1.4.0-RC3/wfs/DescribeFeatureType?typeName=topp:tasmania_water_bodies http://www.opengis.net/wfs http://192.168.0.100:8080/geoserver-1.4.0-RC3/schemas/wfs/1.0.0/WFS-basic.xsd">
+  <gml:boundedBy>
+    <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+      <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">145.971619,-43.031944 147.219696,-41.775558</gml:coordinates>
+    </gml:Box>
+  </gml:boundedBy>
+  <gml:featureMember>
+    <topp:tasmania_water_bodies fid="tasmania_water_bodies.1">
+      <topp:the_geom>
+        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.232727,-42.157501 146.238007,-42.16111 146.24411,-42.169724 146.257202,-42.193329 146.272217,-42.209442 146.274689,-42.214165 146.27832,-42.21833 146.282471,-42.228882 146.282745,-42.241943 146.291351,-42.255836 146.290253,-42.261948 146.288025,-42.267502 146.282471,-42.269997 146.274994,-42.271111 146.266663,-42.270279 146.251373,-42.262505 146.246918,-42.258057 146.241333,-42.256111  [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+        </gml:MultiPolygon>
+      </topp:the_geom>
+      <topp:AREA>1064866676</topp:AREA>
+      <topp:PERIMETER>1071221047</topp:PERIMETER>
+      <topp:WATER_TYPE>Lake</topp:WATER_TYPE>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+      <topp:CONTINENT>Australia</topp:CONTINENT>
+    </topp:tasmania_water_bodies>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_water_bodies fid="tasmania_water_bodies.2">
+      <topp:the_geom>
+        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.284424,-43.031944 146.265808,-43.029442 146.257751,-43.021667 146.252197,-43.01889 146.243561,-43.017776 146.23053,-43.021667 146.21524,-43.02417 146.209686,-43.021942 146.209961,-43.015007 146.21579,-42.991112 146.21524,-42.985001 146.213593,-42.979439 146.21109,-42.974716 146.207458,-42.970276 146.193024,-42.959724 146.181915,-42.95472 146.166931,-42.951393 146.1586,-42.950554 146.12 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+        </gml:MultiPolygon>
+      </topp:the_geom>
+      <topp:AREA>1067509088</topp:AREA>
+      <topp:PERIMETER>1073140989</topp:PERIMETER>
+      <topp:WATER_TYPE>Lake</topp:WATER_TYPE>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+      <topp:CONTINENT>Australia</topp:CONTINENT>
+    </topp:tasmania_water_bodies>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_water_bodies fid="tasmania_water_bodies.3">
+      <topp:the_geom>
+        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.191925,-42.116112 146.184692,-42.114449 146.174988,-42.107506 146.171356,-42.103333 146.167755,-42.101944 146.167206,-42.095001 146.170532,-42.077225 146.169128,-42.071671 146.163879,-42.061943 146.159698,-42.057777 146.140808,-42.044167 146.09024,-42.014168 146.08609,-42.010559 146.083313,-42.005005 146.084686,-41.999443 146.089417,-41.996109 146.097748,-41.99778 146.109406,-42.002228 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+        </gml:MultiPolygon>
+      </topp:the_geom>
+      <topp:AREA>1064598241</topp:AREA>
+      <topp:PERIMETER>1071187492</topp:PERIMETER>
+      <topp:WATER_TYPE>Lake</topp:WATER_TYPE>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+      <topp:CONTINENT>Australia</topp:CONTINENT>
+    </topp:tasmania_water_bodies>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_water_bodies fid="tasmania_water_bodies.4">
+      <topp:the_geom>
+        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.697205,-41.988892 146.688873,-41.988052 146.682465,-41.985832 146.67746,-41.976105 146.673859,-41.973328 146.674133,-41.966393 146.673309,-41.960281 146.674408,-41.95417 146.680817,-41.937218 146.696625,-41.907219 146.69693,-41.900551 146.694122,-41.895554 146.693573,-41.889442 146.695526,-41.883888 146.702179,-41.875275 146.703583,-41.869164 146.700256,-41.858055 146.697754,-41.853058 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+        </gml:MultiPolygon>
+      </topp:the_geom>
+      <topp:AREA>1066494066</topp:AREA>
+      <topp:PERIMETER>1071999090</topp:PERIMETER>
+      <topp:WATER_TYPE>Lake</topp:WATER_TYPE>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+      <topp:CONTINENT>Australia</topp:CONTINENT>
+    </topp:tasmania_water_bodies>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_water_bodies fid="tasmania_water_bodies.5">
+      <topp:the_geom>
+        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.899719,-42.032776 146.892487,-42.030556 146.886932,-42.027779 146.882446,-42.02417 146.87912,-42.018608 146.878571,-42.006111 146.876892,-42 146.871338,-41.99778 146.864136,-41.996391 146.859406,-41.993614 146.855225,-41.983055 146.856354,-41.976944 146.866913,-41.963615 146.871613,-41.959999 146.883881,-41.955559 146.88858,-41.951668 146.891663,-41.947495 146.893585,-41.941383 146.888 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+        </gml:MultiPolygon>
+      </topp:the_geom>
+      <topp:AREA>1065512599</topp:AREA>
+      <topp:PERIMETER>1071304933</topp:PERIMETER>
+      <topp:WATER_TYPE>Lake</topp:WATER_TYPE>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+      <topp:CONTINENT>Australia</topp:CONTINENT>
+    </topp:tasmania_water_bodies>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_water_bodies fid="tasmania_water_bodies.6">
+      <topp:the_geom>
+        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">147.149719,-42.203056 147.142212,-42.201668 147.131348,-42.195831 147.127747,-42.191666 147.125244,-42.186111 147.12439,-42.180832 147.126343,-42.175278 147.132172,-42.165833 147.136108,-42.16111 147.137207,-42.155556 147.135529,-42.149994 147.12912,-42.14167 147.126617,-42.136948 147.128845,-42.124443 147.12912,-42.117775 147.122742,-42.115555 147.11441,-42.116112 147.101349,-42.120552 14 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+        </gml:MultiPolygon>
+      </topp:the_geom>
+      <topp:AREA>1065646817</topp:AREA>
+      <topp:PERIMETER>1071606923</topp:PERIMETER>
+      <topp:WATER_TYPE>Lake</topp:WATER_TYPE>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+      <topp:CONTINENT>Australia</topp:CONTINENT>
+    </topp:tasmania_water_bodies>
+  </gml:featureMember>
+  <gml:featureMember>
+    <topp:tasmania_water_bodies fid="tasmania_water_bodies.7">
+      <topp:the_geom>
+        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+          <gml:polygonMember>
+            <gml:Polygon>
+              <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">146.240784,-42.851112 146.231628,-42.850838 146.228027,-42.846664 146.218842,-42.83889 146.214691,-42.831116 146.206635,-42.823334 146.195801,-42.810829 146.173859,-42.77861 146.171356,-42.773888 146.169708,-42.768333 146.166382,-42.762779 146.160522,-42.748886 146.155243,-42.739166 146.151642,-42.735001 146.142761,-42.727776 146.127747,-42.725555 146.118561,-42.72583 146.111908,-42.726944 [...]
+                </gml:LinearRing>
+              </gml:outerBoundaryIs>
+            </gml:Polygon>
+          </gml:polygonMember>
+        </gml:MultiPolygon>
+      </topp:the_geom>
+      <topp:AREA>1067743969</topp:AREA>
+      <topp:PERIMETER>1073212293</topp:PERIMETER>
+      <topp:WATER_TYPE>Lake</topp:WATER_TYPE>
+      <topp:CNTRY_NAME>Australia</topp:CNTRY_NAME>
+      <topp:CONTINENT>Australia</topp:CONTINENT>
+    </topp:tasmania_water_bodies>
+  </gml:featureMember>
+</wfs:FeatureCollection>
diff --git a/examples/tasmania/sld-tasmania.xml b/examples/tasmania/sld-tasmania.xml
new file mode 100644
index 0000000..0b174f0
--- /dev/null
+++ b/examples/tasmania/sld-tasmania.xml
@@ -0,0 +1,594 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sld:StyledLayerDescriptor version="1.0.0"
+    xmlns:sld="http://www.opengis.net/sld"
+    xmlns:ogc="http://www.opengis.net/ogc"
+    xmlns:gml="http://www.opengis.net/gml"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">
+  <sld:NamedLayer>
+    <sld:Name>WaterBodies</sld:Name>
+    <sld:UserStyle>
+      <sld:Name>Default Styler</sld:Name>
+      <sld:Title>Default Styler</sld:Title>
+      <sld:Abstract></sld:Abstract>
+      <sld:IsDefault>1</sld:IsDefault>
+      <sld:FeatureTypeStyle>
+        <sld:Name>testStyleName</sld:Name>
+        <sld:Title>title</sld:Title>
+        <sld:Abstract>abstract</sld:Abstract>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <sld:Rule>
+          <sld:Name>testRuleName</sld:Name>
+          <sld:Title>title</sld:Title>
+          <sld:Abstract>Abstract</sld:Abstract>
+          <ogc:Filter>
+            <ogc:FeatureId fid="tasmania_water_bodies.2" />
+            <ogc:FeatureId fid="tasmania_water_bodies.3" />
+          </ogc:Filter>
+          <sld:MaxScaleDenominator>3000000</sld:MaxScaleDenominator>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">blue</sld:CssParameter>
+              <sld:CssParameter name="fill-opacity">
+                <ogc:Literal>1.0</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+            <sld:Stroke>
+              <sld:CssParameter name="stroke">
+                <ogc:Literal>#C0C0C0</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-linecap">
+                <ogc:Literal>butt</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-linejoin">
+                <ogc:Literal>miter</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-opacity">
+                <ogc:Literal>1</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-width">
+                <ogc:Literal>1</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-dashoffset">
+                <ogc:Literal>0</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Stroke>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+          <sld:Name>testRuleNameElse</sld:Name>
+          <sld:Title>title</sld:Title>
+          <sld:Abstract>Abstract</sld:Abstract>
+          <sld:ElseFilter/>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#aaaaff</sld:CssParameter>
+              <sld:CssParameter name="fill-opacity">
+                <ogc:Literal>0.5</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+            <sld:Stroke>
+              <sld:CssParameter name="stroke">
+                <ogc:Literal>#C0C0C0</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-opacity">
+                <ogc:Literal>1</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-width">
+                <ogc:Literal>1</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Stroke>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+    <sld:UserStyle>
+      <sld:Name>Hover Styler</sld:Name>
+      <sld:Title>Hover Styler</sld:Title>
+      <sld:Abstract></sld:Abstract>
+      <sld:FeatureTypeStyle>
+        <sld:Name>testStyleHover</sld:Name>
+        <sld:Title>title</sld:Title>
+        <sld:Abstract>abstract</sld:Abstract>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <sld:Rule>
+          <sld:Name>testRuleNameHover</sld:Name>
+          <sld:Title>title</sld:Title>
+          <sld:Abstract>Abstract</sld:Abstract>
+          <ogc:Filter>
+            <ogc:Not>
+              <ogc:Or>
+                <ogc:PropertyIsEqualTo>
+                  <ogc:PropertyName>PERIMETER</ogc:PropertyName>
+                  <ogc:Literal>1071304933</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+                <ogc:PropertyIsLessThan>
+                  <ogc:PropertyName>AREA</ogc:PropertyName>
+                  <ogc:Literal>1065512599</ogc:Literal>
+                </ogc:PropertyIsLessThan>
+              </ogc:Or>
+            </ogc:Not>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>black</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="fill-opacity">
+                <ogc:Literal>0.5</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+            <sld:Stroke>
+              <sld:CssParameter name="stroke">
+                <ogc:Literal>green</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-linecap">
+                <ogc:Literal>butt</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-linejoin">
+                <ogc:Literal>miter</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-opacity">
+                <ogc:Literal>0.5</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-width">
+                <ogc:Literal>5</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-dashoffset">
+                <ogc:Literal>0</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Stroke>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+          <sld:Name>testRuleNameHoverElse</sld:Name>
+          <sld:Title>title</sld:Title>
+          <sld:Abstract>Abstract</sld:Abstract>
+          <sld:ElseFilter/>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>black</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="fill-opacity">
+                <ogc:Literal>0.5</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+            <sld:Stroke>
+              <sld:CssParameter name="stroke">
+                <ogc:Literal>fuchsia</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-opacity">
+                <ogc:Literal>0.5</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-width">
+                <ogc:Literal>5</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-dashoffset">
+                <ogc:Literal>0</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Stroke>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+    <sld:UserStyle>
+      <sld:Name>Attribute Filter Styler</sld:Name>
+      <sld:Title>Attribute Filter Styler</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>rulePropertyIsEqualTo</sld:Name>
+          <sld:Title>rulePropertyIsEqualTo</sld:Title>
+          <sld:Abstract>rulePropertyIsEqualTo</sld:Abstract>
+          <ogc:Filter>
+            <ogc:PropertyIsEqualTo>
+              <ogc:PropertyName>name</ogc:PropertyName>
+              <ogc:Literal>My simple Polygon</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>#000033</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+    <sld:UserStyle>
+      <sld:Name>Styler Test PropertyIsEqualTo</sld:Name>
+      <sld:Title>Styler Test PropertyIsEqualTo</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>rulePropertyIsEqualTo</sld:Name>
+          <sld:Title>rulePropertyIsEqualTo</sld:Title>
+          <sld:Abstract>rulePropertyIsEqualTo</sld:Abstract>
+          <ogc:Filter>
+            <ogc:PropertyIsEqualTo>
+              <ogc:PropertyName>AREA</ogc:PropertyName>
+              <ogc:Literal>1067743969</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>red</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+    
+    <sld:UserStyle>
+      <sld:Name>Styler Test WATER_TYPE</sld:Name>
+      <sld:Title>Styler Test WATER_TYPE</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>rulePropertyIsEqualTo</sld:Name>
+          <sld:Title>rulePropertyIsEqualTo</sld:Title>
+          <sld:Abstract>rulePropertyIsEqualTo</sld:Abstract>
+          <ogc:Filter>
+            <ogc:PropertyIsEqualTo>
+              <ogc:PropertyName>WATER_TYPE</ogc:PropertyName>
+              <ogc:Literal>Lake</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>red</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+    <sld:UserStyle>
+      <sld:Name>Styler Test PropertyIsGreaterThanOrEqualTo</sld:Name>
+      <sld:Title>Styler Test PropertyIsGreaterThanOrEqualTo</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>PropertyIsGreaterThanOrEqualTo</sld:Name>
+          <sld:Title>PropertyIsGreaterThanOrEqualTo</sld:Title>
+          <sld:Abstract>PropertyIsGreaterThanOrEqualTo</sld:Abstract>
+          <ogc:Filter>
+            <ogc:And>
+              <ogc:PropertyIsEqualTo>
+                <ogc:PropertyName>WATER_TYPE</ogc:PropertyName>
+                <ogc:Literal>Lake</ogc:Literal>
+              </ogc:PropertyIsEqualTo>
+              <ogc:PropertyIsGreaterThanOrEqualTo>
+                <ogc:PropertyName>AREA</ogc:PropertyName>
+                <ogc:Literal>1067509088</ogc:Literal>
+              </ogc:PropertyIsGreaterThanOrEqualTo>
+            </ogc:And>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>yellow</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+
+    <sld:UserStyle>
+      <sld:Name>Styler Test PropertyIsLessThanOrEqualTo</sld:Name>
+      <sld:Title>Styler Test PropertyIsLessThanOrEqualTo</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>PropertyIsLessThanOrEqualTo</sld:Name>
+          <sld:Title>PropertyIsLessThanOrEqualTo</sld:Title>
+          <sld:Abstract>PropertyIsLessThanOrEqualTo</sld:Abstract>
+          <ogc:Filter>
+            <ogc:And>
+              <ogc:PropertyIsEqualTo>
+                <ogc:PropertyName>WATER_TYPE</ogc:PropertyName>
+                <ogc:Literal>Lake</ogc:Literal>
+              </ogc:PropertyIsEqualTo>
+              <ogc:PropertyIsLessThanOrEqualTo>
+                <ogc:PropertyName>AREA</ogc:PropertyName>
+                <ogc:Literal>1067509088</ogc:Literal>
+              </ogc:PropertyIsLessThanOrEqualTo>
+            </ogc:And>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>yellow</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+
+
+    <sld:UserStyle>
+      <sld:Name>Styler Test PropertyIsGreaterThan</sld:Name>
+      <sld:Title>Styler Test PropertyIsGreaterThan</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>PropertyIsGreaterThan</sld:Name>
+          <sld:Title>PropertyIsGreaterThan</sld:Title>
+          <sld:Abstract>PropertyIsGreaterThan</sld:Abstract>
+          <ogc:Filter>
+            <ogc:And>
+              <ogc:PropertyIsEqualTo>
+                <ogc:PropertyName>WATER_TYPE</ogc:PropertyName>
+                <ogc:Literal>Lake</ogc:Literal>
+              </ogc:PropertyIsEqualTo>
+              <ogc:PropertyIsGreaterThan>
+                <ogc:PropertyName>AREA</ogc:PropertyName>
+                <ogc:Literal>1067000000</ogc:Literal>
+              </ogc:PropertyIsGreaterThan>
+            </ogc:And>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>yellow</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+    <sld:UserStyle>
+      <sld:Name>Styler Test PropertyIsLessThan</sld:Name>
+      <sld:Title>Styler Test PropertyIsLessThan</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>PropertyIsLessThan</sld:Name>
+          <sld:Title>PropertyIsLessThan</sld:Title>
+          <sld:Abstract>PropertyIsLessThan</sld:Abstract>
+          <ogc:Filter>
+            <ogc:And>
+              <ogc:PropertyIsEqualTo>
+                <ogc:PropertyName>WATER_TYPE</ogc:PropertyName>
+                <ogc:Literal>Lake</ogc:Literal>
+              </ogc:PropertyIsEqualTo>
+              <ogc:PropertyIsLessThan>
+                <ogc:PropertyName>AREA</ogc:PropertyName>
+                <ogc:Literal>1067000000</ogc:Literal>
+              </ogc:PropertyIsLessThan>
+            </ogc:And>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>yellow</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+    
+    <sld:UserStyle>
+      <sld:Name>Styler Test PropertyIsLike</sld:Name>
+      <sld:Title>Styler Test PropertyIsLike</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>PropertyIsLike</sld:Name>
+          <sld:Title>PropertyIsLike</sld:Title>
+          <sld:Abstract>PropertyIsLike</sld:Abstract>
+          <ogc:Filter>
+            <ogc:PropertyIsLike wildCard='*' singleChar='.' escape='!'>
+              <ogc:PropertyName>AREA</ogc:PropertyName>
+              <ogc:Literal>106774*</ogc:Literal>
+            </ogc:PropertyIsLike>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>green</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+    <sld:UserStyle>
+      <sld:Name>Styler Test PropertyIsBetween</sld:Name>
+      <sld:Title>Styler Test PropertyIsBetween</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Name>attribute filter type</sld:Name>
+        <sld:Title>attribute filter type</sld:Title>
+        <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
+        <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
+        <!-- Attribute filters -->
+        <sld:Rule>
+          <sld:Name>PropertyIsBetween</sld:Name>
+          <sld:Title>PropertyIsBetween</sld:Title>
+          <sld:Abstract>PropertyIsBetween</sld:Abstract>
+          <ogc:Filter>
+            <ogc:PropertyIsBetween>
+              <ogc:PropertyName>AREA</ogc:PropertyName>
+              <ogc:LowerBoundary>
+                <ogc:Literal>1064866676</ogc:Literal>
+              </ogc:LowerBoundary>
+              <ogc:UpperBoundary>
+                <ogc:Literal>1065512599</ogc:Literal>
+              </ogc:UpperBoundary>
+            </ogc:PropertyIsBetween>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">
+                <ogc:Literal>blue</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+    <sld:UserStyle>
+      <sld:Name>FeatureId</sld:Name>
+      <sld:Title>Styler Test FeatureId</sld:Title>
+      <sld:FeatureTypeStyle>
+        <sld:Rule>
+          <ogc:Filter>
+            <ogc:FeatureId fid="tasmania_water_bodies.4"/>
+          </ogc:Filter>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">blue</sld:CssParameter>
+            </sld:Fill>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+
+  </sld:NamedLayer>
+
+  <sld:NamedLayer>
+    <sld:Name>Roads</sld:Name>
+    <sld:UserStyle>
+      <sld:Name>RoadsDefault</sld:Name>
+      <sld:IsDefault>1</sld:IsDefault>
+      <sld:FeatureTypeStyle>
+        <sld:Rule>
+          <sld:Name>justAStyler</sld:Name>
+          <sld:LineSymbolizer>
+            <sld:Stroke>
+              <sld:CssParameter name="stroke">
+                <ogc:Literal>red</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-width">
+                <ogc:Literal>2</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Stroke>
+          </sld:LineSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+  </sld:NamedLayer>
+
+  <sld:NamedLayer>
+    <sld:Name>Cities</sld:Name>
+    <sld:UserStyle>
+      <sld:Name>DefaultCities</sld:Name>
+      <sld:IsDefault>1</sld:IsDefault>
+      <sld:FeatureTypeStyle>
+        <sld:Rule>
+          <ogc:Filter>
+            <ogc:FeatureId fid="tasmania_cities.1"/>
+          </ogc:Filter>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:ExternalGraphic>
+                <sld:OnlineResource xlink:href="../img/marker.png" />
+                <sld:Format>image/png</sld:Format>
+              </sld:ExternalGraphic>
+              <sld:Opacity>0.7</sld:Opacity>
+              <sld:Size>14</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+          <sld:ElseFilter/>
+          <sld:PointSymbolizer>
+            <sld:Graphic>
+              <sld:Mark>
+                <sld:WellKnownName>cross</sld:WellKnownName>
+              </sld:Mark>
+              <sld:Size>10</sld:Size>
+            </sld:Graphic>
+          </sld:PointSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+  </sld:NamedLayer>
+
+  <sld:NamedLayer>
+    <sld:Name>Land</sld:Name>
+    <sld:UserStyle>
+      <sld:Name>Land Style</sld:Name>
+      <sld:IsDefault>1</sld:IsDefault>
+      <sld:FeatureTypeStyle>
+        <sld:Rule>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#ccffaa</sld:CssParameter>
+              <sld:CssParameter name="fill-opacity">
+                <ogc:Literal>0.5</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Fill>
+            <sld:Stroke>
+              <sld:CssParameter name="stroke">
+                <ogc:Literal>#C0C0C0</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-opacity">
+                <ogc:Literal>1</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-width">
+                <ogc:Literal>1</ogc:Literal>
+              </sld:CssParameter>
+              <sld:CssParameter name="stroke-dasharray">
+                <ogc:Literal>3 5 1 5</ogc:Literal>
+              </sld:CssParameter>
+            </sld:Stroke>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+  </sld:NamedLayer>
+  
+</sld:StyledLayerDescriptor>
diff --git a/examples/teleportation.html b/examples/teleportation.html
new file mode 100644
index 0000000..d1a4b86
--- /dev/null
+++ b/examples/teleportation.html
@@ -0,0 +1,70 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Teleporter Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    
+    <style type="text/css">
+        #wrapper {
+            position: relative;
+        }
+        .spot1 {
+            width: 250px;
+        }
+        .spot2 {
+            width: 300px;
+            position: absolute;
+            left: 300px;
+            top: 0;
+        }
+    </style>
+    
+    <script type="text/javascript">
+    
+        var map, layer, spot=1;
+        function init(){
+            map = new OpenLayers.Map({
+                div: "spot1"
+            });
+            map.addControl(new OpenLayers.Control.OverviewMap());
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'} );
+            map.addLayer(layer);
+            map.zoomTo(2);
+        }
+        
+        function teleport() {
+            if (spot == 1) {
+                spot = 2;
+            } else {
+                spot = 1;
+            }
+            map.render("spot" + spot);
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Map "Teleportation" and Rendering</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">Call the map's render method to change its container.</p>
+
+    <div id="wrapper">
+        <div id="spot1" class="smallmap spot1"></div>
+        <div id="spot2" class="smallmap spot2"></div>
+    </div>
+    
+    <input type="button" onclick="teleport()" value="Teleport!"></input>
+
+    <div id="docs">
+        This example demonstrates how a map can be rendered initially in one
+        container and then moved to a new container.  At any point after map
+        construction, the map's render method can be called with the id of
+        an empty container, moving the map to the new container.
+    </div>
+  </body>
+</html>
diff --git a/examples/textfile.txt b/examples/textfile.txt
new file mode 100644
index 0000000..f7678c4
--- /dev/null
+++ b/examples/textfile.txt
@@ -0,0 +1,4 @@
+point	title	description	icon
+10,20	my orange title	my orange description	
+2,4	my aqua title	my aqua description	
+42,-71	my purple title	my purple description<br/>is great.	http://www.openlayers.org/api/img/zoom-world-mini.png
diff --git a/examples/thinlong.jpg b/examples/thinlong.jpg
new file mode 100644
index 0000000..a063ab4
Binary files /dev/null and b/examples/thinlong.jpg differ
diff --git a/examples/tilecache.html b/examples/tilecache.html
new file mode 100644
index 0000000..0db39aa
--- /dev/null
+++ b/examples/tilecache.html
@@ -0,0 +1,63 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers TileCache Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        function init(){
+            map = new OpenLayers.Map( $('map'), {
+                resolutions: [0.087890625, 0.0439453125, 0.02197265625, 0.010986328125]
+            });
+            layer = new OpenLayers.Layer.TileCache("TileCache Layer",
+                ["http://c0.tilecache.osgeo.org/wms-c/cache/",
+                 "http://c1.tilecache.osgeo.org/wms-c/cache/",
+                 "http://c2.tilecache.osgeo.org/wms-c/cache/",
+                 "http://c3.tilecache.osgeo.org/wms-c/cache/",
+                 "http://c4.tilecache.osgeo.org/wms-c/cache/"],
+                "basic",
+                {
+                    serverResolutions: [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.00004291534423828125, 0.000021457672119140625]
+                }
+            );
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+        }
+
+        OpenLayers.Util.onImageLoadError = function() {
+            /**
+             * For images that don't exist in the cache, you can display
+             * a default image - one that looks like water for example.
+             * To show nothing at all, leave the following lines commented out.
+             */
+
+            //this.src = "../img/blank.gif";
+            //this.style.display = "";
+        };
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">TileCache Example</h1>
+
+      <div id="tags"></div>
+
+      <p id="shortdesc">
+        Demonstrates a TileCache layer that loads tiles from from a web
+        accessible disk-based cache only.
+      </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        This layer should be used for web accessible disk-based caches only.
+        It is not used to request new tiles from TileCache.  Note that you
+        should specify resolutions explicitly on this layer so that they match
+        your TileCache configuration.
+    </div>
+  </body>
+</html>
diff --git a/examples/tms.html b/examples/tms.html
new file mode 100644
index 0000000..d1e4678
--- /dev/null
+++ b/examples/tms.html
@@ -0,0 +1,56 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Tiled Map Service Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map', {maxResolution:1.40625/2} );
+            layer = new OpenLayers.Layer.TMS( "TMS",
+                    "http://tilecache.osgeo.org/wms-c/Basic.py/", {layername: 'basic', type:'png'} );
+            map.addLayer(layer);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        }
+        function addTMS() {
+            l = new OpenLayers.Layer.TMS(
+                OpenLayers.Util.getElement('layer').value,
+                OpenLayers.Util.getElement('url').value,
+                {
+                    'layername': OpenLayers.Util.getElement('layer').value,
+                    'type': OpenLayers.Util.getElement('type').value
+            });
+            map.addLayer(l);
+            map.setBaseLayer(l);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">Tiled Map Service Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate the initialization and modification of a Tiled Map Service layer.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        URL of TMS (Should end in /): <input type="text" id="url" size="60" value="http://tilecache.osgeo.org/wms-c/Basic.py/" /> layer_name <input type="text" id="layer" value="basic" /> <select id="type"><option>jpg</option><option>png</option></select> <input type="submit" onclick="addTMS()"/><br />
+        <p>
+        Example: http://tilecache.osgeo.org/wms-c/Basic.py/, basic, jpg<br />
+        The first input must be an HTTP URL pointing to a TMS instance. The second
+        input must be a layer name available from that instance, and the third must
+        be the output format used by that layer. (Any other behavior will result in
+        broken images being displayed.)
+        </p>
+    </div>
+  </body>
+</html>
diff --git a/examples/transform-feature.html b/examples/transform-feature.html
new file mode 100644
index 0000000..e058e71
--- /dev/null
+++ b/examples/transform-feature.html
@@ -0,0 +1,105 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Transformation Box</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+    <script type="text/javascript">
+        var map, control;
+
+        function init(){
+            map = new OpenLayers.Map('map', {allOverlays: true});
+
+            // context for appropriate scale/resize cursors
+            var cursors = ["sw-resize", "s-resize", "se-resize",
+                "e-resize", "ne-resize", "n-resize", "nw-resize", "w-resize"];
+            var context = {
+                getCursor: function(feature){
+                    var i = OpenLayers.Util.indexOf(control.handles, feature);
+                    var cursor = "inherit";
+                    if(i !== -1) {
+                        i = (i + 8 + Math.round(control.rotation / 90) * 2) % 8;
+                        cursor = cursors[i];
+                    }
+                    return cursor;
+                }
+            };
+            
+            // a nice style for the transformation box
+            var style = new OpenLayers.Style({
+                cursor: "${getCursor}",
+                pointRadius: 5,
+                fillColor: "white",
+                fillOpacity: 1,
+                strokeColor: "black"
+            }, {context: context});
+                                    
+            // the layer that we want to transform features on
+            var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {
+                styleMap: new OpenLayers.StyleMap({
+                    "transform": style
+                })
+            });
+
+            // create the TransformFeature control, using the renderIntent
+            // from above
+            control = new OpenLayers.Control.TransformFeature(vectorLayer, {
+                renderIntent: "transform"
+            });
+            map.addControl(control);
+
+            // create a polygon feature from a linear ring of points
+            var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
+            var pointList = [];
+            for(var p=0; p<6; ++p) {
+                var a = p * (2 * Math.PI) / 7;
+                var r = Math.random(1) + 2;
+                var newPoint = new OpenLayers.Geometry.Point(point.x + (r * Math.cos(a)),
+                                                             point.y + (r * Math.sin(a)));
+                pointList.push(newPoint);
+            }
+            pointList.push(pointList[0]);
+
+            var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
+            var polygonFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon([linearRing]));
+
+
+            map.addLayer(vectorLayer);
+            map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5);
+            var anotherFeature = polygonFeature.clone();
+            polygonFeature.geometry.move(-3, 0);
+            anotherFeature.geometry.move(3, 0);
+            vectorLayer.addFeatures([polygonFeature, anotherFeature]);
+            
+            // start with the transformation box on polygonFeature
+            control.setFeature(polygonFeature, {rotation: 45, scale: 0.5, ratio: 1.5});
+        }
+    </script>
+  </head>
+  <body onload="init()">
+<h1 id="title">Vector Feature Transformation Box Example</h1>
+
+<div id="tags">
+</div>
+<p id="shortdesc">
+    Shows the use of the TransformFeature control.
+</p>
+<div style="text-align: right">
+    <div dir="rtl" id="map" class="smallmap"></div>
+</div>
+<div id="docs">
+    <p>This example shows transformation of vector features with a
+       tranformation box. Grab one of the handles to resize the feature.
+       Holding the SHIFT key will preserve the aspect ratio. Position the
+       mouse right outside one of the corner handles to rotate the feature,
+       and hold the SHIFT key to only rotate in 45° increments.</p>
+       <p>In this example, the transformation box has been set on the left
+       feature, with a rotation preset of 45°. Clicking on the right feature
+       will set it for transformation, starting with an unrotated box.
+       Dragging a feature or the box edges will move it around.</p>
+</div>
+
+  </body>
+</html>
+
diff --git a/examples/transition.html b/examples/transition.html
new file mode 100644
index 0000000..e0b26ee
--- /dev/null
+++ b/examples/transition.html
@@ -0,0 +1,63 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Transitions Example</title>
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            map = new OpenLayers.Map('mapDiv', {maxResolution: 'auto'});
+
+            var single_default_effect = new OpenLayers.Layer.WMS(
+                "WMS untiled default", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?",
+                {layers: 'basic'}, 
+                {singleTile: true}
+            );
+            var single_resize_effect = new OpenLayers.Layer.WMS(
+                "WMS untiled resize", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?",
+                {layers: 'basic'}, 
+                {singleTile: true, transitionEffect: 'resize'}
+            );
+            var tiled_default_effect = new OpenLayers.Layer.WMS(
+                "WMS tiled default ", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?",
+                {layers: 'basic'}
+            );
+            var tiled_resize_effect = new OpenLayers.Layer.WMS(
+                "WMS tiled resize", 
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?",
+                {layers: 'basic'}, 
+                {transitionEffect: 'resize'}
+            );
+
+            map.addLayers([single_default_effect, single_resize_effect,
+                           tiled_default_effect, tiled_resize_effect]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.setCenter(new OpenLayers.LonLat(6.5, 40.5), 4);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Transition Example</h1>
+    <p id="shortdesc">
+        Demonstrates the use of transition effects in tiled and untiled layers.
+    </p>
+    <div id="mapDiv" class="smallmap"></div>
+    <div id="docs">
+        There are two transitions that are currently implemented: null (the
+        default) and 'resize'.  The default transition effect is used when no
+        transition is specified and is implemented as no transition effect except
+        for panning singleTile layers.  The 'resize' effect resamples the current
+        tile and displays it stretched or compressed until the new tile is available.
+    <ul>
+        <li>The first layer is an untiled WMS layer with no transition effect.</li>
+        <li>The second layer is an untiled WMS layer with a 'resize' effect. </li>
+        <li>The third layer is a tiled WMS layer with no transition effect. </li>
+        <li>The fourth layer is a tiled WMS layer with a 'resize' effect. </li>
+    </ul>
+    </div>
+  </body>
+  </body>
+</html>
diff --git a/examples/urban.html b/examples/urban.html
new file mode 100644
index 0000000..c626341
--- /dev/null
+++ b/examples/urban.html
@@ -0,0 +1,45 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+      <title>OpenLayers WorldWind Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            var mapOptions = { maxResolution: 1.6, numZoomLevels: 21};
+            map = new OpenLayers.Map('map', mapOptions);
+
+            var ww = new OpenLayers.Layer.WorldWind( "Urban",
+                "http://worldwind25.arc.nasa.gov/tile/tile.aspx?", .8, 9,
+                {T:"104"}, { tileSize: new OpenLayers.Size(512,512) });
+
+
+            map.addLayers([ww]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.setCenter(new OpenLayers.LonLat(-71.446875, 41.73515625), 15);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">WorldWind Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrate the use of a NASA WorldWind base layer.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p>
+        Add the Nasa WorldWind "Urban" layer to your map. The "Urban" layer contains aerial imagery for urban areas only.
+        </p>
+        <p>
+          You can do it with a ...
+        </p>
+
+    </div>
+  </body>
+</html>
diff --git a/examples/ve-novibrate.html b/examples/ve-novibrate.html
new file mode 100644
index 0000000..2775583
--- /dev/null
+++ b/examples/ve-novibrate.html
@@ -0,0 +1,62 @@
+<html xmlns="http://www.w3.org/1999/xhtml"> 
+  <head> 
+      <title>OpenLayers Virtual Earth Example</title> 
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" /> 
+    <link rel="stylesheet" href="style.css" type="text/css" /> 
+    <script src='http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1'></script> 
+ 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript"> 
+ 
+        var map, velayer, layer;
+ 
+        function init(){
+            map = new OpenLayers.Map('map', {
+                controls: [new OpenLayers.Control.Navigation()],
+                panMethod: OpenLayers.Easing.Linear.easeOut,
+                panDuration: 10
+            });
+ 
+            velayer = new OpenLayers.Layer.VirtualEarth("VE", {
+                minZoomLevel: 2, 
+                maxZoomLevel: 6, 
+                type: VEMapStyle.Road
+            });
+            map.addLayer(velayer);
+ 
+            map.setCenter(new OpenLayers.LonLat(25, 25), 0);
+            
+            map.addControl( new OpenLayers.Control.PanZoomBar() );
+
+            markers = new OpenLayers.Layer.Markers("markers");
+            map.addLayer(markers);
+            
+            for(var i=0;i<100;i++){
+                var lat= Math.floor(Math.random()*50);
+                var lon= Math.floor(Math.random()*50);
+                var lonLat=new OpenLayers.LonLat(lon,lat);
+				var marker=new OpenLayers.Marker(lonLat);
+				markers.addMarker(marker);
+            }
+            
+        }
+ 
+    </script> 
+  </head> 
+  <body onload="init()"> 
+    <h1 id="title">Virtual Earth Example</h1> 
+ 
+    <div id="tags"></div> 
+ 
+    <p id="shortdesc"> 
+        When using the PanZoom buttons with VirtualEarth, some 'drift' is 
+        possible in markers. This page demonstrates how to use the 
+        panMethod and panDuration properties to change the OpenLayers 
+        settings to match VirtualEarth. 
+    </p> 
+ 
+    <div id="map" class="smallmap"></div> 
+  </body> 
+</html> 
+ 
+ 
diff --git a/examples/ve.html b/examples/ve.html
new file mode 100644
index 0000000..0dad53a
--- /dev/null
+++ b/examples/ve.html
@@ -0,0 +1,68 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+      <title>OpenLayers Virtual Earth Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src='http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1'></script>
+
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+        var lon = 12;
+        var lat = 41;
+        var zoom = 15;
+        var map, velayer, layer, marker;
+
+        function init(){
+            map = new OpenLayers.Map( 'map' ,
+            {controls:[new OpenLayers.Control.MouseDefaults()]});
+
+            velayer = new OpenLayers.Layer.VirtualEarth( "VE", {
+                // turn off animated zooming
+                animationEnabled: false,
+                minZoomLevel: 4,
+                maxZoomLevel: 6,
+                'type': VEMapStyle.Aerial
+            });
+            map.addLayer(velayer);
+
+            markers = new OpenLayers.Layer.Markers("markers");
+            map.addLayer(markers);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+            map.addControl( new OpenLayers.Control.PanZoomBar() );
+        }
+
+        function add() {
+            if(!marker) {
+                marker = new OpenLayers.Marker(new OpenLayers.LonLat(15, 47));
+                markers.addMarker(marker);
+            }
+        }
+
+        function remove() {
+            if(marker) {
+                markers.removeMarker(marker);
+                marker = null;
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Virtual Earth Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demonstrates the use of a Virtual Earth base layer.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+    <input type="button" onClick="javascript:add()"value="Add the marker to the map">
+    <input type="button" onClick="javascript:remove()" value="Remove the marker from the map">
+    <div id="docs">This example demonstrates the ability to add VirtualEarth and the and remove markers.</div>
+  </body>
+</html>
+
+
diff --git a/examples/vector-features-with-text.html b/examples/vector-features-with-text.html
new file mode 100644
index 0000000..634478f
--- /dev/null
+++ b/examples/vector-features-with-text.html
@@ -0,0 +1,130 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Labeled Features Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+            
+            var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            
+            // allow testing of specific renderers via "?renderer=Canvas", etc
+            var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
+            renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
+            
+            var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {
+                styleMap: new OpenLayers.StyleMap({'default':{
+                    strokeColor: "#00FF00",
+                    strokeOpacity: 1,
+                    strokeWidth: 3,
+                    fillColor: "#FF5500",
+                    fillOpacity: 0.5,
+                    pointRadius: 6,
+                    pointerEvents: "visiblePainted",
+                    label : "name: ${name}, age: ${age}",
+                    
+                    fontColor: "${favColor}",
+                    fontSize: "12px",
+                    fontFamily: "Courier New, monospace",
+                    fontWeight: "bold",
+                    labelAlign: "${align}",
+                    labelXOffset: "${xOffset}",
+                    labelYOffset: "${yOffset}"
+                }}),
+                renderers: renderer
+            });
+            
+            // create a point feature
+            var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
+            var pointFeature = new OpenLayers.Feature.Vector(point);
+            pointFeature.attributes = {
+                name: "toto",
+                age: 20,
+                favColor: 'red',
+                align: "cm"
+            };
+            
+            // create a polygon feature from a linear ring of points
+            var pointList = [];
+            for(var p=0; p<6; ++p) {
+                var a = p * (2 * Math.PI) / 7;
+                var r = Math.random(1) + 1;
+                var newPoint = new OpenLayers.Geometry.Point(point.x + 5 + (r * Math.cos(a)),
+                                                             point.y + 5 + (r * Math.sin(a)));
+                pointList.push(newPoint);
+            }
+            pointList.push(pointList[0]);
+            
+            var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
+            var polygonFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon([linearRing]));
+            polygonFeature.attributes = {
+                name: "dude",
+                age: 21,
+                favColor: 'purple',
+                align: 'lb'
+            };
+            
+            multiFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Collection([
+                    new OpenLayers.Geometry.LineString([
+                        new OpenLayers.Geometry.Point(-105,40),
+                        new OpenLayers.Geometry.Point(-95,45)
+                    ]),
+                    new OpenLayers.Geometry.Point(-105, 40)
+                ]),
+                {
+                    name: "ball-and-chain",
+                    age: 30,
+                    favColor: 'black',
+                    align: 'rt'
+                });
+
+            // Create a point feature to show the label offset options
+            var labelOffsetPoint = new OpenLayers.Geometry.Point(-101.04, 35.68);
+            var labelOffsetFeature = new OpenLayers.Feature.Vector(labelOffsetPoint);
+            labelOffsetFeature.attributes = {
+                name: "offset",
+                age: 22,
+                favColor: 'blue',
+                align: "cm",
+                // positive value moves the label to the right
+                xOffset: 50,
+                // negative value moves the label down
+                yOffset: -15
+            };
+
+
+            var nullFeature = new OpenLayers.Feature.Vector(null);
+            nullFeature.attributes = {
+                name: "toto is some text about the world",
+                age: 20,
+                favColor: 'red',
+                align: "cm"
+            };
+            
+            map.addLayer(vectorLayer);
+            vectorLayer.drawFeature(multiFeature);
+            map.setCenter(new OpenLayers.LonLat(point.x, point.y), 3);
+            vectorLayer.addFeatures([pointFeature, polygonFeature, multiFeature, labelOffsetFeature, nullFeature ]);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Labeled features example</h1>
+    <div id="tags"></div>
+    <p id="shortdesc">
+        Label vector features with a text symbolizer.
+    </p>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+    This example shows drawing simple vector features with a label
+    </div>
+  </body>
+</html>
diff --git a/examples/vector-features.html b/examples/vector-features.html
new file mode 100644
index 0000000..0cfa608
--- /dev/null
+++ b/examples/vector-features.html
@@ -0,0 +1,136 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Vector Features</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+
+            /*
+             * Layer style
+             */
+            // we want opaque external graphics and non-opaque internal graphics
+            var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
+            layer_style.fillOpacity = 0.2;
+            layer_style.graphicOpacity = 1;
+
+            /*
+             * Blue style
+             */
+            var style_blue = OpenLayers.Util.extend({}, layer_style);
+            style_blue.strokeColor = "blue";
+            style_blue.fillColor = "blue";
+            style_blue.graphicName = "star";
+            style_blue.pointRadius = 10;
+            style_blue.strokeWidth = 3;
+            style_blue.rotation = 45;
+            style_blue.strokeLinecap = "butt";
+
+            /*
+             * Green style
+             */
+            var style_green = {
+                strokeColor: "#00FF00",
+                strokeWidth: 3,
+                strokeDashstyle: "dashdot",
+                pointRadius: 6,
+                pointerEvents: "visiblePainted"
+            };
+
+            /*
+             * Mark style
+             */
+            var style_mark = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
+            // each of the three lines below means the same, if only one of
+            // them is active: the image will have a size of 24px, and the
+            // aspect ratio will be kept
+            // style_mark.pointRadius = 12;
+            // style_mark.graphicHeight = 24; 
+            // style_mark.graphicWidth = 24;
+
+            // if graphicWidth and graphicHeight are both set, the aspect ratio
+            // of the image will be ignored
+            style_mark.graphicWidth = 24;
+            style_mark.graphicHeight = 20;
+            style_mark.graphicXOffset = 10; // default is -(style_mark.graphicWidth/2);
+            style_mark.graphicYOffset = -style_mark.graphicHeight;
+            style_mark.externalGraphic = "../img/marker.png";
+            // graphicTitle only works in Firefox and Internet Explorer
+			style_mark.graphicTitle = "this is a test tooltip";
+
+            var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {style: layer_style});
+
+            // create a point feature
+            var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
+            var pointFeature = new OpenLayers.Feature.Vector(point,null,style_blue);
+            var point2 = new OpenLayers.Geometry.Point(-105.04, 49.68);
+            var pointFeature2 = new OpenLayers.Feature.Vector(point2,null,style_green);
+            var point3 = new OpenLayers.Geometry.Point(-105.04, 49.68);
+            var pointFeature3 = new OpenLayers.Feature.Vector(point3,null,style_mark);
+
+            // create a line feature from a list of points
+            var pointList = [];
+            var newPoint = point;
+            for(var p=0; p<15; ++p) {
+                newPoint = new OpenLayers.Geometry.Point(newPoint.x + Math.random(1),
+                                                         newPoint.y + Math.random(1));
+                pointList.push(newPoint);
+            }
+            var lineFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.LineString(pointList),null,style_green);
+
+            // create a polygon feature from a linear ring of points
+            var pointList = [];
+            for(var p=0; p<6; ++p) {
+                var a = p * (2 * Math.PI) / 7;
+                var r = Math.random(1) + 1;
+                var newPoint = new OpenLayers.Geometry.Point(point.x + (r * Math.cos(a)),
+                                                             point.y + (r * Math.sin(a)));
+                pointList.push(newPoint);
+            }
+            pointList.push(pointList[0]);
+
+            var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
+            var polygonFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon([linearRing]));
+
+
+            map.addLayer(vectorLayer);
+            map.setCenter(new OpenLayers.LonLat(point.x, point.y), 5);
+            vectorLayer.addFeatures([pointFeature, pointFeature3, pointFeature2, lineFeature, polygonFeature]);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+<h1 id="title">Drawing Simple Vector Features Example</h1>
+
+<div id="tags">
+</div>
+<p id="shortdesc">
+    Shows the use of the shows drawing simple vector features, in different styles.
+</p>
+<div id="map" class="smallmap"></div>
+<div id="docs">
+    <p>This example shows drawing simple vector features -- point, line, polygon
+       in different styles, created 'manually', by constructing the entire style
+       object, via 'copy', extending the default style object, and by
+       inheriting the default style from the layer.</p>
+    <p>It also shows how to use external graphic files for point features
+       and how to set their size: If either graphicWidth or graphicHeight is set,
+       the aspect ratio of the image will be respected. If both graphicWidth and
+       graphicHeight are set, it will be ignored. Alternatively, if graphicWidth
+       and graphicHeight are omitted, pointRadius will be used to set the size
+       of the image, which will then be twice the value of pointRadius with the
+       original aspect ratio.</p>
+</div>
+
+  </body>
+</html>
+
diff --git a/examples/vector-formats.html b/examples/vector-formats.html
new file mode 100644
index 0000000..9ebeedc
--- /dev/null
+++ b/examples/vector-formats.html
@@ -0,0 +1,226 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Vector Formats</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        input, select, textarea {
+            font: 0.9em Verdana, Arial, sans-serif;
+        }
+        #leftcol {
+            position: absolute;
+            top: 0;
+            left: 1em;
+            padding: 0;
+            width: 517px;
+        }
+        #map {
+            width: 512px;
+            height: 225px;
+            border: 1px solid #ccc;
+        }
+        #input {
+            width: 512px;
+        }
+        #text {
+            font-size: 0.85em;
+            margin: 1em 0 1em 0;
+            width: 100%;
+            height: 10em;
+        }
+        #info {
+            position: relative;
+            padding: 2em 0;
+            margin-left: 540px;
+        }
+        #output {
+            font-size: 0.8em;
+            width: 100%;
+            height: 512px;
+            border: 0;
+        }
+        p {
+            margin: 0;
+            padding: 0.75em 0 0.75em 0;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, vectors, formats;
+        function updateFormats() {
+            var in_options = {
+                'internalProjection': map.baseLayer.projection,
+                'externalProjection': new OpenLayers.Projection(OpenLayers.Util.getElement("inproj").value)
+            };   
+            var out_options = {
+                'internalProjection': map.baseLayer.projection,
+                'externalProjection': new OpenLayers.Projection(OpenLayers.Util.getElement("outproj").value)
+            };
+            var gmlOptions = {
+                featureType: "feature",
+                featureNS: "http://example.com/feature"
+            };
+            var gmlOptionsIn = OpenLayers.Util.extend(
+                OpenLayers.Util.extend({}, gmlOptions),
+                in_options
+            );
+            var gmlOptionsOut = OpenLayers.Util.extend(
+                OpenLayers.Util.extend({}, gmlOptions),
+                out_options
+            );
+            var kmlOptionsIn = OpenLayers.Util.extend(
+                {extractStyles: true}, in_options);
+            formats = {
+              'in': {
+                wkt: new OpenLayers.Format.WKT(in_options),
+                geojson: new OpenLayers.Format.GeoJSON(in_options),
+                georss: new OpenLayers.Format.GeoRSS(in_options),
+                gml2: new OpenLayers.Format.GML.v2(gmlOptionsIn),
+                gml3: new OpenLayers.Format.GML.v3(gmlOptionsIn),
+                kml: new OpenLayers.Format.KML(kmlOptionsIn),
+                atom: new OpenLayers.Format.Atom(in_options)
+              }, 
+              'out': {
+                wkt: new OpenLayers.Format.WKT(out_options),
+                geojson: new OpenLayers.Format.GeoJSON(out_options),
+                georss: new OpenLayers.Format.GeoRSS(out_options),
+                gml2: new OpenLayers.Format.GML.v2(gmlOptionsOut),
+                gml3: new OpenLayers.Format.GML.v3(gmlOptionsOut),
+                kml: new OpenLayers.Format.KML(out_options),
+                atom: new OpenLayers.Format.Atom(out_options)
+              } 
+            };
+        }
+        function init(){
+            map = new OpenLayers.Map('map');
+            var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'});
+
+            vectors = new OpenLayers.Layer.Vector("Vector Layer");
+
+            map.addLayers([wms, vectors]);
+            map.addControl(new OpenLayers.Control.MousePosition());
+            map.addControl(new OpenLayers.Control.EditingToolbar(vectors));
+
+            var options = {
+                hover: true,
+                onSelect: serialize
+            };
+            var select = new OpenLayers.Control.SelectFeature(vectors, options);
+            map.addControl(select);
+            select.activate();
+            
+            updateFormats();
+
+            map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+        }
+
+        function serialize(feature) {
+            var type = document.getElementById("formatType").value;
+            // second argument for pretty printing (geojson only)
+            var pretty = document.getElementById("prettyPrint").checked;
+            var str = formats['out'][type].write(feature, pretty);
+            // not a good idea in general, just for this demo
+            str = str.replace(/,/g, ', ');
+            document.getElementById('output').value = str;
+        }
+
+        function deserialize() {
+            var element = document.getElementById('text');
+            var type = document.getElementById("formatType").value;
+            var features = formats['in'][type].read(element.value);
+            var bounds;
+            if(features) {
+                if(features.constructor != Array) {
+                    features = [features];
+                }
+                for(var i=0; i<features.length; ++i) {
+                    if (!bounds) {
+                        bounds = features[i].geometry.getBounds();
+                    } else {
+                        bounds.extend(features[i].geometry.getBounds());
+                    }
+
+                }
+                vectors.addFeatures(features);
+                map.zoomToExtent(bounds);
+                var plural = (features.length > 1) ? 's' : '';
+                element.value = features.length + ' feature' + plural + ' added';
+            } else {
+                element.value = 'Bad input ' + type;
+            }
+        }
+
+        // preload images
+        (function() {
+            var roots = ["draw_point", "draw_line", "draw_polygon", "pan"];
+            var onImages = [];
+            var offImages = [];
+            for(var i=0; i<roots.length; ++i) {
+                onImages[i] = new Image();
+                onImages[i].src = "../theme/default/img/" + roots[i] + "_on.png";
+                offImages[i] = new Image();
+                offImages[i].src = "../theme/default/img/" + roots[i] + "_on.png";
+            }
+        })();
+
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="leftcol">
+        <h1 id="title">Vector Formats Example</h1>
+
+        <div id="tags">
+        </div>
+        <p id="shortdesc">
+            Shows the wide variety of vector formats that open layers supports.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+        <div id="input">
+            <p>Use the drop-down below to select the input/output format
+            for vector features.  New features can be added by using the drawing
+            tools above or by pasting their text representation below.</p>
+            <label for="formatType">Format</label>
+            <select name="formatType" id="formatType">
+                <option value="geojson" selected="selected">GeoJSON</option>
+                <option value="atom">Atom</option>
+                <option value="kml">KML</option>
+                <option value="georss">GeoRSS</option>
+                <option value="gml2">GML (v2)</option>
+                <option value="gml3">GML (v3)</option>
+                <option value="wkt">Well-Known Text (WKT)</option>
+            </select>
+             
+            <label for="prettyPrint">Pretty print</label>
+            <input id="prettyPrint" type="checkbox"
+                   name="prettyPrint" value="1" />
+            <br />
+            Input Projection: <select id="inproj" onchange='updateFormats()'>
+              <option value="EPSG:4326" selected="selected">EPSG:4326</option>
+              <option value="EPSG:900913">Spherical Mercator</option>
+            </select> <br /> 
+            Output Projection: <select id="outproj" onchange='updateFormats()'>
+              <option value="EPSG:4326" selected="selected">EPSG:4326</option>
+              <option value="EPSG:900913">Spherical Mercator</option>
+            </select> 
+            <br /> 
+            <textarea id="text">paste text here...</textarea>
+            <br />
+            <input type="button" value="add feature" onclick="deserialize();" />
+        </div>
+
+        <div id="docs">
+        </div>
+
+    </div>
+    <div id="info">
+        <p>Use the tools to the left to draw new polygons, lines, and points.
+        After drawing some new features, hover over a feature to see the
+        serialized version below.</p>
+        <textarea id="output"></textarea>
+    </div>
+
+  </body>
+</html>
diff --git a/examples/web-mercator.html b/examples/web-mercator.html
new file mode 100644
index 0000000..f1e602e
--- /dev/null
+++ b/examples/web-mercator.html
@@ -0,0 +1,46 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <title>OpenLayers: Web Mercator</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="web-mercator.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">OpenLayers Spherical Mercator Example</h1>
+
+        <div id="tags">
+        </div>
+        <p id="shortdesc">
+            Shows the use of layers in spherical or web mercator using different
+            EPSG codes to indicate the same projection.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                A number of mapping services support the spherical or web
+                mercator but use different EPSG codes to identify it. ArcGIS
+                server version 9.3 uses EPSG:102113 to represent the same SRS
+                that OpenLayers typically refers to by EPSG:900913.
+            </p><p>
+                To configure a map with a WMS layer overlaid on a Google layer
+                where the WMS uses EPSG:102113 to refer to the web mercator 
+                projection, the Google layer must be constructed with this 
+                projection code in its options (it is not sufficient to 
+                construct the map with this projection).  
+            <p>
+                If your application needs to transform coordinates to and from
+                EPSG:102113, you must add custom transforms as well.
+            </p><p>
+                See the <a href="web-mercator.js" target="_blank">web-mercator.js</a>
+                source for details.
+            </p>
+        </div>
+    </body>
+</html>
+
+
+
diff --git a/examples/web-mercator.js b/examples/web-mercator.js
new file mode 100644
index 0000000..ed14d94
--- /dev/null
+++ b/examples/web-mercator.js
@@ -0,0 +1,45 @@
+// make map available for easy debugging
+var map;
+
+// if your application transforms coordinates to and from EPSG:102113 then
+// you must uncomment the lines below
+
+// OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:102113",
+//     OpenLayers.Layer.SphericalMercator.projectForward);
+// OpenLayers.Projection.addTransform("EPSG:102113", "EPSG:4326",
+//     OpenLayers.Layer.SphericalMercator.projectInverse);
+
+function init() {
+
+    var options = {
+        projection: new OpenLayers.Projection("EPSG:102113"),
+        units: "m",
+        numZoomLevels: 18,
+        maxResolution: 156543.0339,
+        maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
+                                         20037508, 20037508.34)
+    };
+    map = new OpenLayers.Map('map', options);
+
+    // create Google layer with EPSG:102113 code
+    var gsat = new OpenLayers.Layer.Google("Google Imagery", {
+        type: G_SATELLITE_MAP, 
+        sphericalMercator: true,
+        projection: "EPSG:102113"
+    });
+
+    // create WMS layer
+    var wms = new OpenLayers.Layer.WMS(
+        "Highways",
+        "http://sampleserver1.arcgisonline.com/arcgis/services/Specialty/ESRI_StateCityHighway_USA/MapServer/WMSServer",
+        {layers: "2", format: "image/gif", transparent: "true"},
+        {
+            isBaseLayer: false,
+            wrapDateLine: true
+        }
+    );
+
+    map.addLayers([gsat, wms]);
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    map.setCenter(new OpenLayers.LonLat(-10723197, 4500612), 3);
+}
diff --git a/examples/wfs-filter.html b/examples/wfs-filter.html
new file mode 100644
index 0000000..2c6466d
--- /dev/null
+++ b/examples/wfs-filter.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers WFS Protocol with Filter</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css">
+        <link rel="stylesheet" href="../theme/default/google.css" type="text/css">
+        <link rel="stylesheet" href="style.css" type="text/css">
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="wfs-filter.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">WFS Protocol and Filter</h1>
+        <p id="shortdesc">
+            Demonstrates the use of a filter in making GetFeature requests using the WFS protocol.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                If a vector layer has a filter and the protocol supports server-side filtering,
+                the filter will be serialized in requests for features.  The WFS protocol can be
+                used with a vector layer to serialize a filter using OGC Filter Encoding.  This
+                example requests all features that are <code>TYPE</code> "highway" or "road".
+            </p><p>
+                See the <a href="wfs-filter.js" target="_blank">wfs-filter source</a> 
+                for details on how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/wfs-filter.js b/examples/wfs-filter.js
new file mode 100644
index 0000000..18d517c
--- /dev/null
+++ b/examples/wfs-filter.js
@@ -0,0 +1,48 @@
+var map;
+
+// use proxy if requesting features cross-domain
+OpenLayers.ProxyHost= "proxy.cgi?url=";
+
+function init() {
+
+    map = new OpenLayers.Map({
+        div: "map",
+        layers: [
+            new OpenLayers.Layer.WMS(
+                "Natural Earth", 
+                "http://demo.opengeo.org/geoserver/wms",
+                {layers: "topp:naturalearth"}
+            ),
+            new OpenLayers.Layer.Vector("WFS", {
+                strategies: [new OpenLayers.Strategy.BBOX()],
+                protocol: new OpenLayers.Protocol.WFS({
+                    url:  "http://demo.opengeo.org/geoserver/wfs",
+                    featureType: "tasmania_roads",
+                    featureNS: "http://www.openplans.org/topp"
+                }),
+                styleMap: new OpenLayers.StyleMap({
+                    strokeWidth: 3,
+                    strokeColor: "#333333"
+                }),
+                filter: new OpenLayers.Filter.Logical({
+                    type: OpenLayers.Filter.Logical.OR,
+                    filters: [
+                        new OpenLayers.Filter.Comparison({
+                            type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                            property: "TYPE",
+                            value: "highway"
+                        }),
+                        new OpenLayers.Filter.Comparison({
+                            type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                            property: "TYPE",
+                            value: "road"
+                        })
+                    ]
+                })
+            })
+        ],
+        center: new OpenLayers.LonLat(146.7, -41.8),
+        zoom: 6
+    });
+
+}
diff --git a/examples/wfs-protocol-transactions.html b/examples/wfs-protocol-transactions.html
new file mode 100644
index 0000000..642a8f5
--- /dev/null
+++ b/examples/wfs-protocol-transactions.html
@@ -0,0 +1,89 @@
+<html>
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <style>
+        .customEditingToolbar {
+            float: right;
+            right: 0px;
+            height: 30px; 
+            width: 200px;
+        }
+        .customEditingToolbar div {
+            float: right;
+            margin: 5px;
+            width: 24px;
+            height: 24px;
+        }
+        .olControlNavigationItemActive { 
+            background-image: url("../theme/default/img/editing_tool_bar.png");
+            background-repeat: no-repeat;
+            background-position: -103px -23px; 
+        }
+        .olControlNavigationItemInactive { 
+            background-image: url("../theme/default/img/editing_tool_bar.png");
+            background-repeat: no-repeat;
+            background-position: -103px -0px; 
+        }
+        .olControlDrawFeaturePolygonItemInactive { 
+            background-image: url("../theme/default/img/editing_tool_bar.png");
+            background-repeat: no-repeat;
+            background-position: -26px 0px; 
+        }
+        .olControlDrawFeaturePolygonItemActive { 
+            background-image: url("../theme/default/img/editing_tool_bar.png");
+            background-repeat: no-repeat;
+            background-position: -26px -23px ;                                                                   
+        }
+        .olControlModifyFeatureItemActive { 
+            background-image: url(../theme/default/img/move_feature_on.png);
+            background-repeat: no-repeat;
+            background-position: 0px 1px;
+        }
+        .olControlModifyFeatureItemInactive { 
+            background-image: url(../theme/default/img/move_feature_off.png);
+            background-repeat: no-repeat;
+            background-position: 0px 1px;
+        }
+        .olControlDeleteFeatureItemActive { 
+            background-image: url(../theme/default/img/remove_point_on.png);
+            background-repeat: no-repeat;
+            background-position: 0px 1px;
+        }
+        .olControlDeleteFeatureItemInactive { 
+            background-image: url(../theme/default/img/remove_point_off.png);
+            background-repeat: no-repeat;
+            background-position: 0px 1px;
+        }
+    </style>
+    <script src="wfs-protocol-transactions.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">WFS Transaction Example</h1>
+        <div id="tags"></div>
+        <p id="shortdesc">
+            Shows the use of the WFS Transactions (WFS-T).
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                The WFS protocol allows for creation of new features and
+                reading, updating, or deleting of existing features.
+            </p>
+            <p>
+                Use the tools to create, modify, and delete (in order from left
+                to right) features. Use the save tool (picture of a disk) to
+                save your changes. Use the navigation tool (hand) to stop
+                editing and use the mouse for map navigation.
+            </p>
+            <p>
+                See the <a href="wfs-protocol-transactions.js" target="_blank">
+                wfs-protocol-transactions.js source</a> to see how this is done.
+            </p>        
+        </div>
+    </body>
+</html>
+
+
diff --git a/examples/wfs-protocol-transactions.js b/examples/wfs-protocol-transactions.js
new file mode 100644
index 0000000..a5a6a7c
--- /dev/null
+++ b/examples/wfs-protocol-transactions.js
@@ -0,0 +1,107 @@
+var map, wfs;
+OpenLayers.ProxyHost = "proxy.cgi?url=";
+
+var DeleteFeature = OpenLayers.Class(OpenLayers.Control, {
+    initialize: function(layer, options) {
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        this.layer = layer;
+        this.handler = new OpenLayers.Handler.Feature(
+            this, layer, {click: this.clickFeature}
+        );
+    },
+    clickFeature: function(feature) {
+        // if feature doesn't have a fid, destroy it
+        if(feature.fid == undefined) {
+            this.layer.destroyFeatures([feature]);
+        } else {
+            feature.state = OpenLayers.State.DELETE;
+            this.layer.events.triggerEvent("afterfeaturemodified", 
+                                           {feature: feature});
+            feature.renderIntent = "select";
+            this.layer.drawFeature(feature);
+        }
+    },
+    setMap: function(map) {
+        this.handler.setMap(map);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+    },
+    CLASS_NAME: "OpenLayers.Control.DeleteFeature"
+});
+
+function init() {
+    map = new OpenLayers.Map('map', {
+        projection: new OpenLayers.Projection("EPSG:900913"),
+        displayProjection: new OpenLayers.Projection("EPSG:4326"),
+        units: "m",
+        maxResolution: 156543.0339,
+        maxExtent: new OpenLayers.Bounds(
+            -11593508, 5509847, -11505759, 5557774
+        ),
+        controls: [
+            new OpenLayers.Control.PanZoom()
+        ]
+    });
+    var gphy = new OpenLayers.Layer.Google(
+        "Google Physical",
+        {type: G_PHYSICAL_MAP, sphericalMercator: true}
+    );
+
+    var saveStrategy = new OpenLayers.Strategy.Save();
+
+    wfs = new OpenLayers.Layer.Vector("Editable Features", {
+        strategies: [new OpenLayers.Strategy.BBOX(), saveStrategy],
+        projection: new OpenLayers.Projection("EPSG:4326"),
+        protocol: new OpenLayers.Protocol.WFS({
+            version: "1.1.0",
+            srsName: "EPSG:4326",
+            url: "http://demo.opengeo.org/geoserver/wfs",
+            featureNS :  "http://opengeo.org",
+            featureType: "restricted",
+            geometryName: "the_geom",
+            schema: "http://demo.opengeo.org/geoserver/wfs/DescribeFeatureType?version=1.1.0&typename=og:restricted"
+        })
+    }); 
+   
+    map.addLayers([gphy, wfs]);
+
+    var panel = new OpenLayers.Control.Panel(
+        {'displayClass': 'customEditingToolbar'}
+    );
+    
+    var navigate = new OpenLayers.Control.Navigation({
+        title: "Pan Map"
+    });
+    
+    var draw = new OpenLayers.Control.DrawFeature(
+        wfs, OpenLayers.Handler.Polygon,
+        {
+            title: "Draw Feature",
+            displayClass: "olControlDrawFeaturePolygon",
+            multi: true
+        }
+    );
+    
+    var edit = new OpenLayers.Control.ModifyFeature(wfs, {
+        title: "Modify Feature",
+        displayClass: "olControlModifyFeature"
+    });
+
+    var del = new DeleteFeature(wfs, {title: "Delete Feature"});
+   
+    var save = new OpenLayers.Control.Button({
+        title: "Save Changes",
+        trigger: function() {
+            if(edit.feature) {
+                edit.selectControl.unselectAll();
+            }
+            saveStrategy.save();
+        },
+        displayClass: "olControlSaveFeatures"
+    });
+
+    panel.addControls([navigate, save, del, edit, draw]);
+    panel.defaultControl = navigate;
+    map.addControl(panel);
+    map.zoomToMaxExtent();
+}
+
diff --git a/examples/wfs-protocol.html b/examples/wfs-protocol.html
new file mode 100644
index 0000000..eede085
--- /dev/null
+++ b/examples/wfs-protocol.html
@@ -0,0 +1,48 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>OpenLayers Vector Behavior Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/Firebug/firebug.js"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script type="text/javascript">
+            var map;
+        
+            function init() {
+                OpenLayers.ProxyHost= "proxy.cgi?url=";
+                map = new OpenLayers.Map('map');
+                var wms = new OpenLayers.Layer.WMS(
+                    "OpenLayers WMS", "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                    {layers: 'basic'}
+                );
+
+                var layer = new OpenLayers.Layer.Vector("WFS", {
+                    strategies: [new OpenLayers.Strategy.BBOX()],
+                    protocol: new OpenLayers.Protocol.WFS({
+                        url:  "http://demo.opengeo.org/geoserver/wfs",
+                        featureType: "tasmania_roads",
+                        featureNS: "http://www.openplans.org/topp"
+                    })
+                });
+
+                map.addLayers([wms, layer]);
+                map.setCenter(new OpenLayers.LonLat(146.7, -41.8), 6);
+            }
+        </script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">Vector Behavior Example</h1>
+        <p id="shortdesc">
+            Uses a BBOX strategy, WFS protocol, and GML format.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>The vector layer shown uses the BBOX strategy, the WFS protocol,
+            and the GML format.  The BBOX strategy fetches features within a
+            bounding box.  When the map bounds invalidate the data bounds,
+            another request is triggered.  The WFS protocol gets features
+            through a WFS request.  The GML format is used to serialize
+            features.</p>
+        </div>
+    </body>
+</html>
diff --git a/examples/wfs-reprojection.html b/examples/wfs-reprojection.html
new file mode 100644
index 0000000..da87c88
--- /dev/null
+++ b/examples/wfs-reprojection.html
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>WFS Reprojection Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ"></script>
+        <script src="wfs-reprojection.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">WFS Reprojection Example</h1>
+        <div id="tags">
+        </div>
+        <p id="shortdesc">
+            Shows the use of the client side reprojection support. 
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p> 
+                This example shows client side reprojection. In the case where
+                the projection of a vector layer differs from the projection of
+                the map, features are requested in the layer projection and
+                transformed during parsing. It is assumed that the layer
+                projection is "native" projection of the data (the coordinate
+                reference system of the data on the server).
+            </p>
+            <p>
+                Also shown is styleMap for the layer with unique value rules.
+                Colors are assigned based on the STATE_FIPS attribute.
+            </p>
+            <p>
+                See the <a href="wfs-reprojection.js" target="_blank">
+                wfs-reprojection.js source</a> to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/wfs-reprojection.js b/examples/wfs-reprojection.js
new file mode 100644
index 0000000..d789b92
--- /dev/null
+++ b/examples/wfs-reprojection.js
@@ -0,0 +1,65 @@
+var map, layer, styleMap;
+OpenLayers.ProxyHost = "proxy.cgi?url=";
+
+function init() {
+
+    var geographic = new OpenLayers.Projection("EPSG:4326");
+    var mercator = new OpenLayers.Projection("EPSG:900913");
+
+    map = new OpenLayers.Map('map', {
+        projection: mercator,
+        units: "m",
+        maxResolution: 156543.0339,
+        maxExtent: new OpenLayers.Bounds(
+            -20037508, -20037508, 20037508, 20037508
+        )
+    });
+
+    var g = new OpenLayers.Layer.Google("Google Layer", {
+        sphericalMercator: true
+    });
+    map.addLayers([g]);
+
+    // prepare to style the data
+    styleMap = new OpenLayers.StyleMap({
+        strokeColor: "black",
+        strokeWidth: 2,
+        strokeOpacity: 0.5,
+        fillOpacity: 0.2
+    });
+    // create a color table for state FIPS code
+    var colors = ["red", "orange", "yellow", "green", "blue", "purple"];
+    var code, fips = {};
+    for(var i=1; i<=66; ++i) {
+        code = "0" + i;
+        code = code.substring(code.length - 2);
+        fips[code] = {fillColor: colors[i % colors.length]};
+    }
+    // add unique value rules with your color lookup
+    styleMap.addUniqueValueRules("default", "STATE_FIPS", fips);
+
+    // This server supports server-side reprojection, but we're using WFS 1.0 
+    // here (which doesn't support reprojection) to illustrate client-side 
+    // reprojection.
+    var wfs = new OpenLayers.Layer.Vector("States", {
+        strategies: [new OpenLayers.Strategy.BBOX()],
+        protocol: new OpenLayers.Protocol.WFS({
+            version: "1.0.0",
+            srsName: "EPSG:4326", // this is the default
+            url:  "http://demo.opengeo.org/geoserver/wfs",
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp"
+        }),
+        projection: geographic, // specified because it is different than the map 
+        styleMap: styleMap
+    });
+    map.addLayer(wfs);
+    
+    // if you want to use Geographic coords, transform to ESPG:900913
+    var ddBounds = new OpenLayers.Bounds(
+        -73.839111,40.287907,-68.214111,44.441624
+    );
+    map.zoomToExtent(
+        ddBounds.transform(geographic, mercator)
+    );
+}
diff --git a/examples/wfs-snap-split.html b/examples/wfs-snap-split.html
new file mode 100644
index 0000000..b58c489
--- /dev/null
+++ b/examples/wfs-snap-split.html
@@ -0,0 +1,288 @@
+<html>
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <style>
+        .customEditingToolbar {
+            float: right;
+            right: 0px;
+            height: 30px; 
+            width: 200px;
+        }
+        .customEditingToolbar div {
+            float: right;
+            margin: 5px;
+            width: 24px;
+            height: 24px;
+        }
+        .olControlNavigationItemActive { 
+            background-image: url("../theme/default/img/editing_tool_bar.png");
+            background-repeat: no-repeat;
+            background-position: -103px -23px; 
+        }
+        .olControlNavigationItemInactive { 
+            background-image: url("../theme/default/img/editing_tool_bar.png");
+            background-repeat: no-repeat;
+            background-position: -103px -0px; 
+        }
+        .olControlDrawFeaturePointItemInactive { 
+            background-image: url("../theme/default/img/editing_tool_bar.png");
+            background-repeat: no-repeat;
+            background-position: -77px 0px; 
+        }
+        .olControlDrawFeaturePointItemActive { 
+            background-image: url("../theme/default/img/editing_tool_bar.png");
+            background-repeat: no-repeat;
+            background-position: -77px -23px ;                                                                   
+        }
+        .olControlModifyFeatureItemActive { 
+            background-image: url(../theme/default/img/move_feature_on.png);
+            background-repeat: no-repeat;
+            background-position: 0px 1px;
+        }
+        .olControlModifyFeatureItemInactive { 
+            background-image: url(../theme/default/img/move_feature_off.png);
+            background-repeat: no-repeat;
+            background-position: 0px 1px;
+        }
+        .olControlDeleteFeatureItemActive { 
+            background-image: url(../theme/default/img/remove_point_on.png);
+            background-repeat: no-repeat;
+            background-position: 0px 1px;
+        }
+        .olControlDeleteFeatureItemInactive { 
+            background-image: url(../theme/default/img/remove_point_off.png);
+            background-repeat: no-repeat;
+            background-position: 0px 1px;
+        }
+    </style>
+    <script type="text/javascript">
+        var map, wfs;
+        
+        var DeleteFeature = OpenLayers.Class(OpenLayers.Control, {
+            initialize: function(layer, options) {
+                OpenLayers.Control.prototype.initialize.apply(this, [options]);
+                this.layer = layer;
+                this.handler = new OpenLayers.Handler.Feature(
+                    this, layer, {click: this.clickFeature}
+                );
+            },
+            clickFeature: function(feature) {
+                // if feature doesn't have a fid, destroy it
+                if(feature.fid == undefined) {
+                    this.layer.destroyFeatures([feature]);
+                } else {
+                    feature.state = OpenLayers.State.DELETE;
+                    this.layer.events.triggerEvent("afterfeaturemodified", 
+                                                   {feature: feature});
+                    feature.renderIntent = "select";
+                    this.layer.drawFeature(feature);
+                }
+            },
+            setMap: function(map) {
+                this.handler.setMap(map);
+                OpenLayers.Control.prototype.setMap.apply(this, arguments);
+            },
+            CLASS_NAME: "OpenLayers.Control.DeleteFeature"
+        });
+
+        function init() {
+            OpenLayers.ProxyHost= "proxy.cgi?url=";
+            map = new OpenLayers.Map('map', {
+                maxResolution: 156543.03390625,
+                restrictedExtent: new OpenLayers.Bounds(
+                    -11560239, 5541115, -11560239, 5542338
+                ),
+                maxExtent: new OpenLayers.Bounds(
+                    -2.003750834E7,-2.003750834E7,
+                    2.003750834E7,2.003750834E7
+                ),
+                projection: new OpenLayers.Projection("EPSG:900913"),
+                controls: [
+                    new OpenLayers.Control.PanZoom()
+                ]
+            });
+
+            var wms = new OpenLayers.Layer.WMS(
+                "Base Layer", "http://demo.opengeo.org/geoserver_openstreetmap/gwc/service/wms",
+                {
+                    layers: 'openstreetmap',
+                    format: 'image/png'
+                }
+            );
+            var styles = new OpenLayers.StyleMap({
+                "default": new OpenLayers.Style(null, {
+                    rules: [
+                        new OpenLayers.Rule({
+                            symbolizer: {
+                                "Point": {
+                                    pointRadius: 5,
+                                    graphicName: "square",
+                                    fillColor: "white",
+                                    fillOpacity: 0.25,
+                                    strokeWidth: 1,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#333333"
+                                },
+                                "Line": {
+                                    strokeWidth: 3,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#666666"
+                                }
+                            }
+                        })
+                    ]
+                }),
+                "select": new OpenLayers.Style({
+                    strokeColor: "#00ccff",
+                    strokeWidth: 4
+                }),
+                "temporary": new OpenLayers.Style(null, {
+                    rules: [
+                        new OpenLayers.Rule({
+                            symbolizer: {
+                                "Point": {
+                                    pointRadius: 5,
+                                    graphicName: "square",
+                                    fillColor: "white",
+                                    fillOpacity: 0.25,
+                                    strokeWidth: 1,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#333333"
+                                },
+                                "Line": {
+                                    strokeWidth: 3,
+                                    strokeOpacity: 1,
+                                    strokeColor: "#00ccff"
+                                }
+                            }
+                        })
+                    ]
+                })
+            });
+
+            var saveStrategy = new OpenLayers.Strategy.Save();
+            wfs = new OpenLayers.Layer.Vector("Editable Features", {
+                strategies: [new OpenLayers.Strategy.BBOX(), saveStrategy],
+                projection: new OpenLayers.Projection("EPSG:4326"),
+                styleMap: styles,
+                protocol: new OpenLayers.Protocol.WFS({
+                    version: "1.1.0",
+                    srsName: "EPSG:4326",
+                    url: "http://demo.opengeo.org/geoserver/wfs",
+                    featureNS :  "http://opengeo.org",
+                    featureType: "roads",
+                    geometryName: "the_geom",
+                    schema: "http://demo.opengeo.org/geoserver/wfs/DescribeFeatureType?version=1.1.0&typename=og:roads"
+                })
+            }); 
+           
+            map.addLayers([wms, wfs]);
+
+            // configure the snapping agent
+            var snap = new OpenLayers.Control.Snapping({layer: wfs});
+            map.addControl(snap);
+            snap.activate();
+            
+            // configure split agent
+            var split = new OpenLayers.Control.Split({
+                layer: wfs,
+                source: wfs,
+                tolerance: 0.0001,
+                deferDelete: true,
+                eventListeners: {
+                    aftersplit: function(event) {
+                        var msg = "Split resulted in " + event.features.length + " features.";
+                        flashFeatures(event.features);
+                    }
+                }
+            });
+            map.addControl(split);
+            split.activate();
+
+            // add some editing tools to a panel
+            var panel = new OpenLayers.Control.Panel(
+                {displayClass: 'customEditingToolbar'}
+            );
+            var draw = new OpenLayers.Control.DrawFeature(
+                wfs, OpenLayers.Handler.Path,
+                {
+                    title: "Draw Feature",
+                    displayClass: "olControlDrawFeaturePoint",
+                    handlerOptions: {multi: true}
+                }
+            );
+            modify = new OpenLayers.Control.ModifyFeature(
+                wfs, {displayClass: "olControlModifyFeature"}
+            );
+            var del = new DeleteFeature(wfs, {title: "Delete Feature"});
+           
+            var save = new OpenLayers.Control.Button({
+                title: "Save Changes",
+                trigger: function() {
+                    if(modify.feature) {
+                        modify.selectControl.unselectAll();
+                    }
+                    saveStrategy.save();
+                },
+                displayClass: "olControlSaveFeatures"
+            });
+
+
+
+            panel.addControls([
+                new OpenLayers.Control.Navigation(),
+                save, del, modify, draw
+            ]);
+            
+            panel.defaultControl = panel.controls[0];
+            map.addControl(panel);
+            map.zoomTo(15);
+        }
+
+        function flashFeatures(features, index) {
+            if(!index) {
+                index = 0;
+            }
+            var current = features[index];
+            if(current && current.layer === wfs) {
+                wfs.drawFeature(features[index], "select");
+            }
+            var prev = features[index-1];
+            if(prev && prev.layer === wfs) {
+                wfs.drawFeature(prev, "default");
+            }
+            ++index;
+            if(index <= features.length) {
+                window.setTimeout(function() {flashFeatures(features, index)}, 100);
+            }
+        }
+        
+    </script>
+    </head>
+    <body onload="init()">
+    
+    <h1 id="title">Snap/Split and Persist via WFS</h1>
+    
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Shows snapping, splitting, and use of the WFS Transactions (WFS-T).
+    </p>
+    
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p>The WFS protocol allows for creation of new features and reading,
+        updating, or deleting of existing features.</p>
+        <p>Use the tools to create, modify, and delete (in order from left
+        to right) features.  Use the save tool (picture of a disk) to
+        save your changes.  Use the navigation tool (hand) to stop editing
+        and use the mouse for map navigation.</p>
+    </div>
+
+</body>
+</html>
+
+
diff --git a/examples/wfs-states.html b/examples/wfs-states.html
new file mode 100644
index 0000000..768e794
--- /dev/null
+++ b/examples/wfs-states.html
@@ -0,0 +1,27 @@
+<html>
+    <head>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <title>WFS: United States (GeoServer)</title>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="wfs-states.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">WFS United States (GeoServer) Example</h1>
+        <div id="tags"></div>
+        <p id="shortdesc">
+            Shows the use of the WFS United States (GeoServer). 
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="docs">
+            <p>
+                This example shows the basic use of a vector layer with the
+                WFS protocol.
+            </p>
+            <p>
+                See the <a href="wfs-states.js" target="_blank">wfs-states.js
+                source</a> to see how this is done.
+            </p> 
+        </div>
+    </body>
+</html>
diff --git a/examples/wfs-states.js b/examples/wfs-states.js
new file mode 100644
index 0000000..e8f183f
--- /dev/null
+++ b/examples/wfs-states.js
@@ -0,0 +1,24 @@
+var map;
+OpenLayers.ProxyHost = "proxy.cgi?url=";
+
+function init() {
+    map = new OpenLayers.Map("map");
+
+    var base = new OpenLayers.Layer.WMS("OpenLayers WMS",
+        "http://tilecache.osgeo.org/wms-c/Basic.py",
+        {layers: "basic"} 
+    );
+    map.addLayer(base);
+
+    var wfs = new OpenLayers.Layer.Vector("States", {
+        strategies: [new OpenLayers.Strategy.BBOX()],
+        protocol: new OpenLayers.Protocol.WFS({
+            url: "http://demo.opengeo.org/geoserver/wfs",
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp"
+        })
+    });
+    map.addLayer(wfs);
+
+    map.zoomToExtent(new OpenLayers.Bounds(-140.4, 25.1, -44.4, 50.5));
+}
diff --git a/examples/widelong.jpg b/examples/widelong.jpg
new file mode 100644
index 0000000..7ed1c5e
Binary files /dev/null and b/examples/widelong.jpg differ
diff --git a/examples/wideshort.jpg b/examples/wideshort.jpg
new file mode 100644
index 0000000..9839b82
Binary files /dev/null and b/examples/wideshort.jpg differ
diff --git a/examples/wmc.html b/examples/wmc.html
new file mode 100644
index 0000000..4ad971f
--- /dev/null
+++ b/examples/wmc.html
@@ -0,0 +1,154 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <style type="text/css">
+        #wmc {
+            width: 90%;
+            height: 300px;
+        }
+
+        /* avoid pink tiles */
+        .olImageLoadError {
+            background-color: transparent !important;
+        }
+    </style>
+    <script src="../lib/Firebug/firebug.js"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+        // increase reload attempts 
+        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 2;
+        
+        var format = new OpenLayers.Format.WMC({'layerOptions': {buffer: 0}});
+        var doc, context, map;
+        
+        function init() {
+            var options = {
+                maxExtent: new OpenLayers.Bounds(-130, 14, -60, 55)
+            };
+            map = new OpenLayers.Map("map", options);
+
+            var jpl = new OpenLayers.Layer.WMS(
+                "NASA Global Mosaic",
+                "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                {layers: "landsat7"},
+                {
+                    maxExtent: new OpenLayers.Bounds(-130, 14, -60, 55),
+                    maxResolution: 0.1,
+                    numZoomLevels: 4,
+                    minResolution: 0.02
+                }
+            );
+
+            var vmap = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'},
+                {
+                    maxExtent: new OpenLayers.Bounds(-130, 14, -60, 55),
+                    maxResolution: 0.1,
+                    numZoomLevels: 4,
+                    minResolution: 0.02
+                }
+            );
+
+            var roads = new OpenLayers.Layer.WMS(
+                "Transportation Network",
+                "http://lioapp.lrc.gov.on.ca/cubeserv/cubeserv.pl",
+                {layers: "na_road:CCRS", transparent: "TRUE"},
+                {
+                    isBaseLayer: false,
+                    maxExtent: new OpenLayers.Bounds(
+                        -166.532, 4.05046, -0.206818, 70.287
+                    ),
+                    displayInLayerSwitcher: false,
+                    opacity: 0.6,
+                    minScale: 32000000,
+                    numZoomLevels: 4,
+                    maxScale: 6200000
+                }
+            );
+
+            var nexrad = new OpenLayers.Layer.WMS(
+                "Radar 3:1",
+                "http://columbo.nrlssc.navy.mil/ogcwms/servlet/WMSServlet/AccuWeather_Maps.wms",
+                {layers: "3:1", transparent: "TRUE"},
+                {
+                    isBaseLayer: false,
+                    maxExtent: new OpenLayers.Bounds(
+                        -131.029495239, 14.5628967285,
+                        -61.0295028687, 54.562896728
+                    ),
+                    opacity: 0.8,
+                    singleTile: true,
+                    maxResolution: 0.1,
+                    numZoomLevels: 4,
+                    minResolution: 0.02
+                }
+            );
+
+            map.addLayers([jpl, vmap, roads, nexrad]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.setCenter(new OpenLayers.LonLat(-95, 34.5), 1);
+        };
+        
+        function readWMC(merge) {
+            var text = document.getElementById("wmc").value;
+            
+            if(merge) {
+                try {
+                    map = format.read(text, {map: map});
+                } catch(err) {
+                    document.getElementById("wmc").value = err;
+                }
+            } else {
+                map.destroy();
+                try {
+                    var jsonFormat = new OpenLayers.Format.JSON();
+                    var mapOptions = jsonFormat.read(OpenLayers.Util.getElement('mapOptions').value);
+                    map = format.read(text, {map: mapOptions});
+                    map.addControl(new OpenLayers.Control.LayerSwitcher());
+                } catch(err) {
+                    document.getElementById("wmc").value = err;
+                }
+            }
+        }
+        
+        function writeWMC(merge) {
+            try {
+                var text = format.write(map);
+                document.getElementById("wmc").value = text;
+            } catch(err) {
+                document.getElementById("wmc").value = err;
+            }
+        }
+            
+    </script>
+    </head>
+    <body onload="init()">
+    <h1 id="title">WMC Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+           Shows parsing of Web Map Context documents.
+    </p>
+    <div id="map" class="smallmap"></div>
+        <button onclick="writeWMC();">write</button><br />
+        <button onclick="readWMC();">read as new map</button> with the following extra map options : <input type="text" id="mapOptions" value='{"div": "map", "allOverlays": true}'/><br />
+        <button onclick="readWMC(true);">read and merge</button><br />
+        <button onclick="pasteWMC();">try with another WMC document</button><br />
+        <textarea id="wmc">paste WMC doc here</textarea>
+    <div id="docs">
+        This is an example of parsing WMC documents. <br />
+        The format class has a layerOptions property, which can be used
+        to control the default options of the layer when it is created
+        by the parser.
+    </div>
+  </body>
+</html>
+
+
+
+
diff --git a/examples/wms-untiled.html b/examples/wms-untiled.html
new file mode 100644
index 0000000..36540e8
--- /dev/null
+++ b/examples/wms-untiled.html
@@ -0,0 +1,45 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map' );
+            layer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'},
+                {singleTile: true}
+            );
+            map.addLayer(layer);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title"> WMS Untiled Example</h1>
+
+    <div id="tags">
+    </div>
+        <p id="shortdesc">
+            Shows an example of an "untiled" WMS layer, which requests a single
+            image for the entire map view.
+        </p>
+    <div id="map" class="smallmap"></div>
+        <div id="docs">
+            An untiled layer will only request a single image at a time.
+            This is equivalent to using the deprecated
+            OpenLayers.Layer.WMS.Untiled class, which will be removed at 3.0.
+        </div>
+  </body>
+</html>
+
+
diff --git a/examples/wms-v13.html b/examples/wms-v13.html
new file mode 100644
index 0000000..11909a5
--- /dev/null
+++ b/examples/wms-v13.html
@@ -0,0 +1,52 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, map2;
+
+        function init(){
+            // clear array to simulate a wrong axis order request
+            map = new OpenLayers.Map( 'map' );
+            var layer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?",
+                {layers: 'Foundation.GTOPO30', version: '1.3.0'},
+                {singleTile: true, yx: []}
+            );
+            map.addLayer(layer);
+
+            map.zoomToMaxExtent();
+
+            map2 = new OpenLayers.Map( 'map2' );
+            var layer2 = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS",
+                "http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?",
+                {layers: 'Foundation.GTOPO30', version: '1.3.0'},
+                {singleTile: true}
+            );
+            map2.addLayer(layer2);
+
+            map2.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title"> WMS version 1.3 (axis order) Example</h1>
+
+    <div id="tags">
+    </div>
+        <p id="shortdesc">
+            Shows an example of the influence of axis order on WMS 1.3 GetMap requests.
+        </p>
+        <div id="map" class="smallmap"></div>
+        <div id="map2" class="smallmap"></div>
+        <div id="docs">
+        WMS version 1.3 introduced the axis order sequence, so that for e.g. EPSG:4326 the bbox coordinate
+        values need to be flipped (LatLon instead of LonLat). The first map uses the incorrect (WMS 1.1) axis
+        order against a WMS 1.3 service, resulting in corrupted maps. The second map shows how to correctly
+        request a map in EPSG:4326 against a WMS 1.3 service.
+        </div>
+  </body>
+</html>
diff --git a/examples/wms.html b/examples/wms.html
new file mode 100644
index 0000000..1be54eb
--- /dev/null
+++ b/examples/wms.html
@@ -0,0 +1,43 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map( 'map' );
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">WMS Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Shows the basic use of openlayers using a WMS layer
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        This is an example of how to add an WMS layer to the OpenLayers window. The images are tiled in this instance if you wanted to not use a tiled WMS
+        please use this example and pass the option �singleTile� as true.
+    </div>
+  </body>
+</html>
+
+
+
+
diff --git a/examples/wmst.html b/examples/wmst.html
new file mode 100644
index 0000000..cfd71f8
--- /dev/null
+++ b/examples/wmst.html
@@ -0,0 +1,55 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: WMS + Time</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, ia_wms;
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            var ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'} );
+
+            var jpl_wms = new OpenLayers.Layer.WMS( "NASA Global Mosaic",
+                "http://t1.hypercube.telascience.org/cgi-bin/landsat7", 
+                {layers: "landsat7"});
+
+            ia_wms = new OpenLayers.Layer.WMS("Nexrad","http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi?",{layers:"nexrad-n0r-wmst",transparent:true,format:'image/png',time:"2005-08-29T13:00:00Z"});
+
+            jpl_wms.setVisibility(false);
+
+            map.addLayers([ol_wms, jpl_wms, ia_wms]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.zoomToExtent(new OpenLayers.Bounds(-100.898437,22.148438,-78.398437,39.726563));
+        }
+        function update_date() {
+            var string = OpenLayers.Util.getElement('year').value + "-" +
+                         OpenLayers.Util.getElement('month').value + "-" +
+                         OpenLayers.Util.getElement('day').value + "T" +
+                         OpenLayers.Util.getElement('hour').value + ":" +
+                         OpenLayers.Util.getElement('minute').value + ":00";
+            ia_wms.mergeNewParams({'time':string});
+
+        }
+    </script>
+  </head>
+  <body onload="init()">
+     <h1 id="title"> WMS Time Example</h1>
+        <div id="tags">
+        </div>
+        <p id="shortdesc">
+            Shows the use of the layer WMS-T (time) layer</a>
+        </p>
+    <input size="4" type='text' id='year' value="2005" onchange="update_date()"/>-<input size="2" type="text" id="month" value="08" onchange="update_date()"/>-<input size="2" type="text" id="day" value="29" onchange="update_date()" />T<input type="text" size="2" id="hour" value="13" onchange="update_date()" />:<input type="text" size="2" id="minute" value="00" onchange="update_date()" />:00
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+            WMS-T example: update the times, and the radar image will change. Uses Layer.mergeNewParams to update the date element with the strings from the input fields every time one of them is changed.
+            The inputs below describe a timestamp: The minute increments can only be updated in units of 5.
+    </div>
+  </body>
+</html>
+
+
+
diff --git a/examples/wmts-capabilities.html b/examples/wmts-capabilities.html
new file mode 100644
index 0000000..b3a210b
--- /dev/null
+++ b/examples/wmts-capabilities.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers WMTS Capabilities Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css"/>
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/Firebug/firebug.js"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="wmts-capabilities.js"></script>
+        <style>
+            .olControlAttribution {
+                bottom: 5px;
+            }
+        </style>
+    </head>
+    <body onload="init();">
+        <h1 id="title">Web Map Tile Service (WMTS) Capabilities Parsing</h1>
+        
+        <p id="shortdesc">
+            The WMTS Capabilities format allows for parsing of capabilities
+            documents from OGC Web Map Tile Service (WMTS) version 1.0.0 
+            implementations.
+        </p>
+        
+        <div id="map" class="smallmap"></div>
+        
+        <div id="docs">
+            <p>
+                This example creates an OpenLayers.Layer.WMTS layer to based
+                on the results of parsing a capabilities doc with the
+                OpenLayers.Format.WMTSCapabilities parser.
+            </p><p>
+                See the <a href="wmts-capabilities.js" target="_blank">
+                wmts-capabilities.js source</a> to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/wmts-capabilities.js b/examples/wmts-capabilities.js
new file mode 100644
index 0000000..7f138b4
--- /dev/null
+++ b/examples/wmts-capabilities.js
@@ -0,0 +1,64 @@
+OpenLayers.ProxyHost = "/proxy/?url=";
+
+var map, format;
+
+function init() {
+    
+    format = new OpenLayers.Format.WMTSCapabilities({
+        /**
+         * This particular service is not in compliance with the WMTS spec and
+         * is providing coordinates in y, x order regardless of the CRS.  To
+         * work around this, we can provide the format a table of CRS URN that 
+         * should be considered y, x order.  These will extend the defaults on 
+         * the format.
+         */
+        yx: {
+            "urn:ogc:def:crs:EPSG::900913": true
+        }
+    });
+
+    OpenLayers.Request.GET({
+        url: "http://v2.suite.opengeo.org/geoserver/gwc/service/wmts",
+        params: {
+            SERVICE: "WMTS",
+            VERSION: "1.0.0",
+            REQUEST: "GetCapabilities"
+        },
+        success: function(request) {
+            var doc = request.responseXML;
+            if (!doc || !doc.documentElement) {
+                doc = request.responseText;
+            }
+            var capabilities = format.read(doc);
+            var layer = format.createLayer(capabilities, {
+                layer: "medford:buildings",
+                matrixSet: "EPSG:900913",
+                format: "image/png",
+                opacity: 0.7,
+                isBaseLayer: false
+            });
+            map.addLayer(layer);
+        }, 
+        failure: function() {
+            alert("Trouble getting capabilities doc");
+            OpenLayers.Console.error.apply(OpenLayers.Console, arguments);
+        }
+    })
+    
+    map = new OpenLayers.Map({
+        div: "map",
+        projection: "EPSG:900913",
+        units: "m",
+        maxExtent: new OpenLayers.Bounds(
+            -20037508.34, -20037508.34, 20037508.34, 20037508.34
+        ),
+        maxResolution: 156543.0339
+    });    
+    
+    var osm = new OpenLayers.Layer.OSM();
+
+    map.addLayer(osm);
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    map.setCenter(new OpenLayers.LonLat(-13677832, 5213272), 13);
+    
+}
diff --git a/examples/wmts-getfeatureinfo.html b/examples/wmts-getfeatureinfo.html
new file mode 100644
index 0000000..2e50322
--- /dev/null
+++ b/examples/wmts-getfeatureinfo.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers WMTS GetFeatureInfo Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css"/>
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/Firebug/firebug.js"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="wmts-getfeatureinfo.js"></script>
+        <style>
+            .olControlAttribution {
+                bottom: 5px;
+            }
+
+            table.featureInfo, table.featureInfo td, table.featureInfo th {
+                border: 1px solid #ddd;
+                border-collapse: collapse;
+                margin: 0;
+                padding: 0;
+                font-size: 80%;
+                padding: .1em .1em;
+            }
+            table.featureInfo th {
+                padding: .2em .2em;
+                font-weight: bold;
+                background: #eee;
+            }
+            table.featureInfo td {
+                background: #fff;
+            }
+            table.featureInfo tr.odd td {
+                background: #eee;
+            }
+            table.featureInfo caption {
+                text-align: left;
+                font-size: 100%;
+                font-weight: bold;
+                text-transform: uppercase;
+                padding: .1em .2em;
+            }
+
+        </style>
+    </head>
+    <body onload="init();">
+        <h1 id="title">WMTS GetFeatureInfo Control</h1>
+        
+        <p id="shortdesc">
+            The WMTSGetFeatureInfo control allows retrieval of information about
+            features displayed in a WMTS layer.
+        </p>
+        
+        <div id="map" class="smallmap"></div>
+        <input id="drill" type="checkbox" checked="checked">
+        <label for="drill">drill down</label>
+        <div id="docs">
+            <p>
+                This example uses an OpenLayers.Control.WMTSGetFeatureInfo
+                control layer to access information from WMTS layers.  The
+                control is activated and configured to request feature 
+                information when you click on the map.  If the control's 
+                drillDown property is set to true, multiple layers can be 
+                queried.
+            </p><p>
+                See the <a href="wmts-getfeatureinfo.js" target="_blank">
+                wmts-getfeatureinfo.js source</a> to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/wmts-getfeatureinfo.js b/examples/wmts-getfeatureinfo.js
new file mode 100644
index 0000000..6882c44
--- /dev/null
+++ b/examples/wmts-getfeatureinfo.js
@@ -0,0 +1,99 @@
+OpenLayers.ProxyHost = "/proxy/?url=";
+var map, control, popups = {};
+
+function init() {
+    
+    map = new OpenLayers.Map({
+        div: "map",
+        projection: "EPSG:900913",
+        units: "m",
+        maxExtent: new OpenLayers.Bounds(
+            -20037508.34, -20037508.34, 20037508.34, 20037508.34
+        ),
+        maxResolution: 156543.0339
+    });    
+    
+    var osm = new OpenLayers.Layer.OSM();
+
+    // If tile matrix identifiers differ from zoom levels (0, 1, 2, ...)
+    // then they must be explicitly provided.
+    var matrixIds = new Array(26);
+    for (var i=0; i<26; ++i) {
+        matrixIds[i] = "EPSG:900913:" + i;
+    }
+
+    var zoning = new OpenLayers.Layer.WMTS({
+        name: "zoning",
+        url: "http://v2.suite.opengeo.org/geoserver/gwc/service/wmts/",
+        layer: "medford:zoning",
+        matrixSet: "EPSG:900913",
+        matrixIds: matrixIds,
+        format: "image/png",
+        style: "_null",
+        opacity: 0.7,
+        isBaseLayer: false
+    });
+    var buildings = new OpenLayers.Layer.WMTS({
+        name: "building",
+        url: "http://v2.suite.opengeo.org/geoserver/gwc/service/wmts/",
+        layer: "medford:buildings",
+        matrixSet: "EPSG:900913",
+        matrixIds: matrixIds,
+        format: "image/png",
+        style: "_null",
+        isBaseLayer: false
+    });
+
+    map.addLayers([osm, zoning, buildings]);
+    
+    // create WMTS GetFeatureInfo control
+    control = new OpenLayers.Control.WMTSGetFeatureInfo({
+        drillDown: true,
+        queryVisible: true,
+        eventListeners: {
+            getfeatureinfo: function(evt) {
+                var text;
+                var match = evt.text.match(/<body[^>]*>([\s\S]*)<\/body>/);
+                if (match && !match[1].match(/^\s*$/)) {
+                    text = match[1];
+                } else {
+                    text = "No " + evt.layer.name + " features in that area.<br>";
+                }
+                var popupId = evt.xy.x + "," + evt.xy.y;
+                var popup = popups[popupId];
+                if (!popup || !popup.map) {
+                    popup = new OpenLayers.Popup.FramedCloud(
+                        popupId, 
+                        map.getLonLatFromPixel(evt.xy),
+                        null,
+                        " ",
+                        null,
+                        true,
+                        function(evt) {
+                            delete popups[this.id];
+                            this.hide();
+                            OpenLayers.Event.stop(evt);
+                        }
+                    );
+                    popups[popupId] = popup;
+                    map.addPopup(popup, true);
+                }
+                popup.setContentHTML(popup.contentHTML + text);
+                popup.show();
+            }
+        }
+    });
+    map.addControl(control);
+    control.activate();
+    
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    map.setCenter(new OpenLayers.LonLat(-13678519, 5212803), 15);
+    
+    var drill = document.getElementById("drill");
+    drill.checked = true;
+    drill.onchange = function() {
+        control.drillDown = drill.checked;
+    };
+}
+
+OpenLayers.Popup.FramedCloud.prototype.maxSize = new OpenLayers.Size(350, 200);
diff --git a/examples/wmts.html b/examples/wmts.html
new file mode 100644
index 0000000..fbdddc8
--- /dev/null
+++ b/examples/wmts.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>OpenLayers WMTS Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css"/>
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/Firebug/firebug.js"></script>
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="wmts.js"></script>
+        <style>
+            .olControlAttribution {
+                bottom: 5px;
+            }
+        </style>
+    </head>
+    <body onload="init();">
+        <h1 id="title">Web Map Tile Service (WMTS) Layer</h1>
+        
+        <p id="shortdesc">
+            The WMTS layer allows viewing of tiles from a server implementing
+            the OGC Web Map Tile Service (WMTS) standard version 1.0.0.
+        </p>
+        
+        <div id="map" class="smallmap"></div>
+        
+        <div id="docs">
+            <p>
+                This example uses an OpenLayers.Layer.WMTS layer to display
+                cached tiles over an OSM layer in spherical mercator coordinates.
+            </p><p>
+                See the <a href="wmts.js" target="_blank">
+                wmts.js source</a> to see how this is done.
+            </p>
+        </div>
+    </body>
+</html>
diff --git a/examples/wmts.js b/examples/wmts.js
new file mode 100644
index 0000000..784e596
--- /dev/null
+++ b/examples/wmts.js
@@ -0,0 +1,40 @@
+var map;
+
+function init() {
+    
+    map = new OpenLayers.Map({
+        div: "map",
+        projection: "EPSG:900913",
+        units: "m",
+        maxExtent: new OpenLayers.Bounds(
+            -20037508.34, -20037508.34, 20037508.34, 20037508.34
+        ),
+        maxResolution: 156543.0339
+    });    
+    
+    var osm = new OpenLayers.Layer.OSM();
+
+    // If tile matrix identifiers differ from zoom levels (0, 1, 2, ...)
+    // then they must be explicitly provided.
+    var matrixIds = new Array(26);
+    for (var i=0; i<26; ++i) {
+        matrixIds[i] = "EPSG:900913:" + i;
+    }
+
+    var wmts = new OpenLayers.Layer.WMTS({
+        name: "Medford Buildings",
+        url: "http://v2.suite.opengeo.org/geoserver/gwc/service/wmts/",
+        layer: "medford:buildings",
+        matrixSet: "EPSG:900913",
+        matrixIds: matrixIds,
+        format: "image/png",
+        style: "_null",
+        opacity: 0.7,
+        isBaseLayer: false
+    });                
+
+    map.addLayers([osm, wmts]);
+    map.addControl(new OpenLayers.Control.LayerSwitcher());
+    map.setCenter(new OpenLayers.LonLat(-13677832, 5213272), 13);
+    
+}
diff --git a/examples/worldwind.html b/examples/worldwind.html
new file mode 100644
index 0000000..3f4bcea
--- /dev/null
+++ b/examples/worldwind.html
@@ -0,0 +1,47 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, ol_wms, ww, ww2;
+        function init(){
+            map = new OpenLayers.Map('map', {'maxResolution': .28125, tileSize: new OpenLayers.Size(512, 512)});
+
+            ol_wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+            "http://vmap0.tiles.osgeo.org/wms/vmap0?", {layers: 'basic'} );
+
+            ww = new OpenLayers.Layer.WorldWind( "Bathy",
+            "http://worldwind25.arc.nasa.gov/tile/tile.aspx?", 36, 4,
+            {T:"bmng.topo.bathy.200406"});
+            ww2 = new OpenLayers.Layer.WorldWind( "LANDSAT",
+                "http://worldwind25.arc.nasa.gov/tile/tile.aspx", 2.25, 4,
+                {T:"105"});
+
+
+
+            map.addLayers([ol_wms, ww, ww2]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.setCenter(new OpenLayers.LonLat(-71.4, 42.3), 6);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+        <h1 id="title">WorldWind layers Example</h1>
+
+        <div id="tags">
+        </div>
+        <p id="shortdesc">
+            Shows the use of the Tiled WorldWind layers.
+        </p>
+
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs">
+            This is a demonstration of using Tiled WorldWind layers. WorldWind requires you to define a "LZTD" -- the 3rd param of the constructor -- and the number of zoom levels it supports. When a worldwind layer is not visible at a given tile level, and empty tile is placed there instead. Note that the maxResolution of the map times 512px, must be a multiple of a power of two different from the LZTD -- in this case, .28125 * 512 is 144, which is 36*4, and 2.25*64.
+            This example has a 'Bathy' layer, visible as you zoom out, and a 'landsat' layer, visible as you zoom in, both visible at zoom level 6.
+        </div>
+      </body>
+</html>
+
+
diff --git a/examples/wrapDateLine.html b/examples/wrapDateLine.html
new file mode 100644
index 0000000..f93e080
--- /dev/null
+++ b/examples/wrapDateLine.html
@@ -0,0 +1,70 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Wrap Date Line</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        function init(){
+            map = new OpenLayers.Map( 'map', {maxResolution: 1.40625} );
+            var mapserv = new OpenLayers.Layer.MapServer( "OpenLayers Basic",
+                        "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                        {layers: 'basic'},
+                        {wrapDateLine: true} );
+
+            var kamap = new OpenLayers.Layer.KaMap( "Blue Marble NG",
+                        "http://www.openlayers.org/world/index.php",
+                        {g: "satellite", map: "world"},
+                        {wrapDateLine: true} );
+
+            var wms = new OpenLayers.Layer.WMS( "DM Solutions Demo",
+                "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
+                {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
+                         "prov_bound,fedlimit,rail,road,popplace",
+                 transparent: "true", format: "image/png"},
+                {wrapDateLine: true, reproject: false});
+
+            /* WW doesn't quite work yet */
+            ww = new OpenLayers.Layer.WorldWind( "LANDSAT",
+                    "http://worldwind25.arc.nasa.gov/tile/tile.aspx", 2.25, 4,
+                    {T:"105"},
+                    {'maxResolution': .28125,
+                     tileSize: new OpenLayers.Size(512, 512),
+                     wrapDateLine: true});
+
+            map.addLayers([mapserv, kamap, wms]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.MousePosition());
+            map.zoomToMaxExtent();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Wrapping the Date Line</h1>
+    <div id="tags">
+      Related to:
+        <a href="http://dev.openlayers.org/docs/OpenLayers/Layer/WMS.html">Layer.WMS</a>,
+        <a href="http://dev.openlayers.org/docs2/OpenLayers/Layer/MapServer.html">Layer.MapServer</a>,
+        <a href="http://dev.openlayers.org/docs2/OpenLayers/Layer.html#wrapDateLine">wrapDateLine</a>
+    </div>
+
+    <p id="shortdesc">Shows how to work around dateline issues, by wrapping the dateline on a number of layer types.</p>
+    <div id="map" class="smallmap"></div>
+    <div id="docs">
+        <p>
+        This is an example that shows wrapping the date line. Wrapping the
+        date line is an option on the layer.
+        </p>
+        <p>
+          You can do it with a 'Layer.WMS' or a 'Layer.MapServer' layer.
+        </p>
+    <pre id="code">
+    var mapserv = new OpenLayers.Layer.MapServer( "OpenLayers Basic",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0",
+                {layers: 'basic'},
+                <b>{wrapDateLine: true}</b> );
+    </pre>
+    </div>
+  </body>
+</html>
diff --git a/examples/xhtml.html b/examples/xhtml.html
new file mode 100644
index 0000000..4ced3bf
--- /dev/null
+++ b/examples/xhtml.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>XHTML Example</title>
+<link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+<script src="../lib/OpenLayers.js" type="text/javascript"></script>
+</head>
+<body style="width:100%">
+    <h1 id="title">XHTML Example</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Shows openlayers running in a XHTML 1.0 Strict Doctype
+    </p>
+
+  <div id="map" class="smallmap"></div>
+  <script defer="defer" type="text/javascript">
+    var map = new OpenLayers.Map('map');
+    var wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+        "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+    map.addLayer(wms);
+    map.zoomToMaxExtent();
+  </script>
+      <div id="docs">This example shows openlayers using a XHTML 1.0 Strict Doctype click on the below image to validate.
+          <p>
+                <a href="http://validator.w3.org/check/referer"><img
+                    src="http://www.w3.org/Icons/valid-xhtml10"
+                    alt="Valid XHTML 1.0!" height="31" width="88" /></a>
+      </p>
+    </div>
+
+</body>
+</html>
+
+
diff --git a/examples/xml.html b/examples/xml.html
new file mode 100644
index 0000000..fd1b441
--- /dev/null
+++ b/examples/xml.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+        "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <title>XML Parsing Example</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <style type="text/css">
+            #output {
+                font-family: monospace;
+                background-color: #efefef;
+                font-size: 0.9em;
+                padding: 1em;
+            }
+            span.code {
+                font-family: monospace;
+                background-color: #efefef;
+                font-size: 0.9em;
+                padding: 0.25em;
+                line-height: 1.5em;
+            }
+            ul {
+                margin: 0;
+                padding: 0 0 1em 1.5em;
+            }
+            ul li {
+                padding-left: 0;
+            }
+
+        </style>
+        <script src="../lib/Firebug/firebug.js" type="text/javascript"></script>
+        <script src="../lib/OpenLayers.js" type="text/javascript"></script>
+        <script type="text/javascript">
+        //<![CDATA[
+
+        var format = new OpenLayers.Format.XML();
+        var doc = null;
+
+        function init() {
+            var url = "xml/features.xml";
+            OpenLayers.loadURL(url, null, null, loadSuccess, loadFailure);
+        }
+
+        function loadSuccess(request) {
+            updateStatus("loaded");
+            if(!request.responseXML.documentElement) {
+                doc = format.read(request.responseText);
+            } else {
+                doc = request.responseXML;
+            }
+        }
+
+        function loadFailure(request) {
+            updateStatus("failed to load");
+        }
+
+        function updateStatus(msg) {
+            document.getElementById("loadStatus").firstChild.nodeValue = msg;
+        }
+
+        function updateOutput(text) {
+            document.getElementById("output").firstChild.nodeValue = text;
+        }
+
+        function write() {
+            var text = format.write(doc);
+            updateOutput(text);
+        }
+
+        function getElementsByTagNameNS(node, uri, name) {
+            var nodes = format.getElementsByTagNameNS(node, uri, name);
+            var pieces = [];
+            for(var i=0; i<nodes.length; ++i) {
+                pieces.push(format.write(nodes[i]));
+            }
+            updateOutput(pieces.join(' '));
+        }
+
+        function hasAttributeNS(node, uri, name) {
+            updateOutput(format.hasAttributeNS(node, uri, name))
+        }
+
+        function getAttributeNodeNS(node, uri, name) {
+            var attributeNode = format.getAttributeNodeNS(node, uri, name);
+            updateOutput(attributeNode.nodeName + ' = "' +
+                         attributeNode.nodeValue + '"');
+        }
+
+        function getAttributeNS(node, uri, name) {
+            var attributeValue = format.getAttributeNS(node, uri, name);
+            updateOutput('"' + attributeValue + '"')
+        }
+
+        function createElementNS(uri, name) {
+            var node = format.createElementNS(uri, name);
+            doc.documentElement.appendChild(node);
+            write();
+        }
+
+        function createTextNode(text) {
+            var node = format.createTextNode(text);
+            doc.documentElement.appendChild(node);
+            write();
+        }
+
+        window.onload = init;
+
+        //]]>
+        </script>
+    </head>
+    <body>
+            <h1 id="title">XML Format Example</h1>
+
+            <div id="tags">
+            </div>
+
+            <p id="shortdesc">
+                Shows the use of the OpenLayers XML format class
+            </p>
+
+            <div id="docs">
+                <p>OpenLayers has a very simple XML format class (OpenLayers.Format.XML)
+                        that can be used to read/write XML docs.  The methods available on the
+                        XML format (or parser if you like) allow for reading and writing of the
+                        various XML flavors used by the library - in particular the vector data
+                        formats.  It is by no means intended to be a full-fledged XML toolset.
+                        Additional methods will be added only as needed elsewhere in the
+                        library.</p>
+                        <p>This page loads an XML document and demonstrates a few of the methods
+                        available in the parser.</p>
+                        <p>Status: <b>XML document <span id="loadStatus">loading..</span>.</b></p>
+                        <p>After the XML document loads, see the result of a few of the methods
+                        below.  Assume that you start with the following code:
+                        <br />
+                        <span class="code">
+                            var format = new OpenLayers.Format.XML();
+                        </span>
+                        </p>
+                        Sample methods
+                        <ul>
+                            <li><a href="javascript:void write();">format.write()</a> - write the XML doc as text</li>
+                            <li><a href="javascript:void getElementsByTagNameNS(doc, 'http://www.opengis.net/gml', 'MultiPolygon');">format.getElementsByTagNameNS()</a> - get all gml:MultiPolygon</li>
+                            <li><a href="javascript:void hasAttributeNS(doc.documentElement, 'http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation');">format.hasAttributeNS()</a> - test to see schemaLocation attribute exists in the http://www.w3.org/2001/XMLSchema-instance namespace</li>
+                            <li><a href="javascript:void getAttributeNodeNS(doc.documentElement, 'http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation');">format.getAttributeNodeNS()</a> - get schemaLocation attribute in the http://www.w3.org/2001/XMLSchema-instance namespace</li>
+                            <li><a href="javascript:void getAttributeNS(doc.documentElement, 'http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation');">format.getAttributeNS()</a> - get schemaLocation attribute value in the http://www.w3.org/2001/XMLSchema-instance namespace</li>
+                            <li><a href="javascript:void createElementNS('http://bar.com/foo', 'foo:TestNode');">format.createElementNS()</a> - create a foo:TestNode element (and append it to the doc)</li>
+                            <li><a href="javascript:void createTextNode('test text ');">format.createTextNode()</a> - create a text node (and append it to the doc)</li>
+                        </ul>
+                        Output:
+                <div id="output"> </div>
+            </div>
+    </body>
+</html>
+
+
diff --git a/examples/xml/features.xml b/examples/xml/features.xml
new file mode 100644
index 0000000..b213ce5
--- /dev/null
+++ b/examples/xml/features.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="2" timeStamp="2007-08-03T13:10:00.071-06:00" xsi:schemaLocation="http://www.openplans.org/topp http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:leases http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:topp="htt [...]
\ No newline at end of file
diff --git a/examples/xml/georss-flickr.xml b/examples/xml/georss-flickr.xml
new file mode 100644
index 0000000..23ec199
--- /dev/null
+++ b/examples/xml/georss-flickr.xml
@@ -0,0 +1,730 @@
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:georss="http://www.georss.org/georss">
+  <channel>
+    <title>Photos from everyone tagged snowboard and powder, with geodata</title>
+    <link>http://www.flickr.com/photos/</link>
+    <description><![CDATA[]]></description>
+    <pubDate>Sat, 24 Nov 2007 16:25:03 -0800</pubDate>
+    <lastBuildDate>Sat, 24 Nov 2007 16:25:03 -0800</lastBuildDate>
+
+    <generator>http://www.flickr.com/</generator>
+    <image>
+      <url>http://www.flickr.com/images/buddyicon.jpg</url>
+      <title>Photos from everyone tagged snowboard and powder, with geodata</title>
+      <link>http://www.flickr.com/photos/</link>
+    </image>
+
+    <item>
+      <title>hofü07_5259</title>
+      <link>http://www.flickr.com/photos/-mo-/2061136492/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/-mo-/">I - mo - I</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/-mo-/2061136492/" title="hofü07_5259"><img src="http://farm3.static.flickr.com/2303/2061136492_b529e65785_m.jpg" width="240" height="184"
+        alt="hofü07_5259" /></a></p>
+
+      ]]></description>
+      <pubDate>Sat, 24 Nov 2007 16:25:03 -0800</pubDate>
+      <dc:date.Taken>2007-11-17T12:01:18-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (I - mo - I)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/2061136492</guid>
+      <georss:point>47.25162 11.754426</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.25162</geo:lat>
+        <geo:long>11.754426</geo:long>
+      </geo:Point>
+      <media:content url="http://farm3.static.flickr.com/2303/2061136492_7da2c08df7_o.jpg" type="image/jpeg" height="613" width="800" />
+      <media:title>hofü07_5259</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/-mo-/">I - mo - I</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/-mo-/2061136492/" title="hofü07_5259"><img src="http://farm3.static.flickr.com/2303/2061136492_b529e65785_m.jpg" width="240" height="184"
+        alt="hofü07_5259" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm3.static.flickr.com/2303/2061136492_b529e65785_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">I - mo - I</media:credit>
+      <media:category scheme="urn:flickr:tags">sun snow fall fun austria yeah powder snowboard tyrol 2007 hochfügen powderahyeahturn</media:category>
+
+    </item>
+    <item>
+      <title>First tracks</title>
+
+      <link>http://www.flickr.com/photos/ruthanddave/2046899659/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/ruthanddave/">Ruth and Dave</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/ruthanddave/2046899659/" title="First tracks"><img src="http://farm3.static.flickr.com/2207/2046899659_95fa37ae23_m.jpg" width="180"
+        height="240" alt="First tracks" /></a></p>
+
+        <p>Not mine, alas.</p>
+      ]]></description>
+      <pubDate>Mon, 19 Nov 2007 08:20:11 -0800</pubDate>
+      <dc:date.Taken>2007-11-18T11:19:50-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (Ruth and Dave)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/2046899659</guid>
+
+      <georss:point>50.107423 -122.899847</georss:point>
+      <geo:Point>
+        <geo:lat>50.107423</geo:lat>
+        <geo:long>-122.899847</geo:long>
+      </geo:Point>
+      <media:content url="http://farm3.static.flickr.com/2207/2046899659_b4f5485d50_o.jpg" type="image/jpeg" height="3648" width="2736" />
+      <media:title>First tracks</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/ruthanddave/">Ruth and Dave</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/ruthanddave/2046899659/" title="First tracks"><img src="http://farm3.static.flickr.com/2207/2046899659_95fa37ae23_m.jpg" width="180"
+        height="240" alt="First tracks" /></a></p>
+
+        <p>Not mine, alas.</p>
+      ]]></media:text>
+      <media:thumbnail url="http://farm3.static.flickr.com/2207/2046899659_95fa37ae23_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">Ruth and Dave</media:credit>
+      <media:category scheme="urn:flickr:tags">november lines whistler snowboarding tracks peak powder snowboard turns freshies</media:category>
+
+    </item>
+    <item>
+
+      <title>Powder turns</title>
+      <link>http://www.flickr.com/photos/ruthanddave/2047707124/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/ruthanddave/">Ruth and Dave</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/ruthanddave/2047707124/" title="Powder turns"><img src="http://farm3.static.flickr.com/2126/2047707124_2c0e32e014_m.jpg" width="180"
+        height="240" alt="Powder turns" /></a></p>
+
+      ]]></description>
+      <pubDate>Mon, 19 Nov 2007 08:26:04 -0800</pubDate>
+      <dc:date.Taken>2007-11-18T11:19:57-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (Ruth and Dave)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/2047707124</guid>
+      <georss:point>50.107423 -122.899847</georss:point>
+
+      <geo:Point>
+        <geo:lat>50.107423</geo:lat>
+        <geo:long>-122.899847</geo:long>
+      </geo:Point>
+      <media:content url="http://farm3.static.flickr.com/2126/2047707124_0d458f4c19_o.jpg" type="image/jpeg" height="3648" width="2736" />
+      <media:title>Powder turns</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/ruthanddave/">Ruth and Dave</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/ruthanddave/2047707124/" title="Powder turns"><img src="http://farm3.static.flickr.com/2126/2047707124_2c0e32e014_m.jpg" width="180"
+        height="240" alt="Powder turns" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm3.static.flickr.com/2126/2047707124_2c0e32e014_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">Ruth and Dave</media:credit>
+      <media:category scheme="urn:flickr:tags">november face lines whistler snowboarding tracks first peak powder fresh snowboard turns</media:category>
+
+    </item>
+    <item>
+      <title>Splitboard</title>
+
+      <link>http://www.flickr.com/photos/hamsgod/1330385819/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/hamsgod/">@nt!x</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/hamsgod/1330385819/" title="Splitboard"><img src="http://farm2.static.flickr.com/1111/1330385819_8bf66f33be_m.jpg" width="162" height="240"
+        alt="Splitboard" /></a></p>
+
+      ]]></description>
+      <pubDate>Wed, 5 Sep 2007 09:00:56 -0800</pubDate>
+      <dc:date.Taken>2007-03-04T04:40:12-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (@nt!x)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/1330385819</guid>
+      <georss:point>41.931831 -111.646049</georss:point>
+
+      <geo:Point>
+        <geo:lat>41.931831</geo:lat>
+        <geo:long>-111.646049</geo:long>
+      </geo:Point>
+      <media:content url="http://farm2.static.flickr.com/1111/1330385819_8bf66f33be_m.jpg" type="image/jpeg" height="240" width="162" />
+      <media:title>Splitboard</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/hamsgod/">@nt!x</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/hamsgod/1330385819/" title="Splitboard"><img src="http://farm2.static.flickr.com/1111/1330385819_8bf66f33be_m.jpg" width="162" height="240"
+        alt="Splitboard" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm2.static.flickr.com/1111/1330385819_8bf66f33be_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">@nt!x</media:credit>
+      <media:category scheme="urn:flickr:tags">snow mountains snowboarding utah powder yurt snowboard splitboard supershot</media:category>
+
+    </item>
+    <item>
+      <title>Fresh powder</title>
+
+      <link>http://www.flickr.com/photos/oliver80/1266854486/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/oliver80/">Oliver Astrologo</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/oliver80/1266854486/" title="Fresh powder"><img src="http://farm2.static.flickr.com/1310/1266854486_990ef8d68a_m.jpg" width="240" height="160"
+        alt="Fresh powder" /></a></p>
+
+      ]]></description>
+      <pubDate>Wed, 29 Aug 2007 05:19:36 -0800</pubDate>
+      <dc:date.Taken>2007-08-24T10:05:48-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (Oliver Astrologo)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/1266854486</guid>
+      <georss:point>46.528236 10.449789</georss:point>
+
+      <geo:Point>
+        <geo:lat>46.528236</geo:lat>
+        <geo:long>10.449789</geo:long>
+      </geo:Point>
+      <media:content url="http://farm2.static.flickr.com/1310/1266854486_990ef8d68a_m.jpg" type="image/jpeg" height="160" width="240" />
+      <media:title>Fresh powder</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/oliver80/">Oliver Astrologo</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/oliver80/1266854486/" title="Fresh powder"><img src="http://farm2.static.flickr.com/1310/1266854486_990ef8d68a_m.jpg" width="240" height="160"
+        alt="Fresh powder" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm2.static.flickr.com/1310/1266854486_990ef8d68a_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">Oliver Astrologo</media:credit>
+      <media:category scheme="urn:flickr:tags">sky people italy panorama mountain snow alps landscape powder snowboard rider snowboarder passo ghiacciaio stelvio</media:category>
+
+    </item>
+    <item>
+      <title>Sawatch Range From Vail Pano</title>
+
+      <link>http://www.flickr.com/photos/dman861/498747983/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/dman861/">dman861</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/dman861/498747983/" title="Sawatch Range From Vail Pano"><img src="http://farm1.static.flickr.com/202/498747983_0831eb06b6_m.jpg" width="240"
+        height="64" alt="Sawatch Range From Vail Pano" /></a></p>
+
+        <p>View near the Eagle's Nest at the top of Eagle Bahn Gondola. Mount of the Holy Cross mountain is visible in this picture but you can't make out the cross shape. I have no idea who the lady is. Handheld panorama, stitch of 5
+        photos.</p>
+      ]]></description>
+      <pubDate>Mon, 14 May 2007 17:05:11 -0800</pubDate>
+      <dc:date.Taken>2007-05-14T15:00:27-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (dman861)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/498747983</guid>
+
+      <georss:point>39.617598 -106.386773</georss:point>
+      <geo:Point>
+        <geo:lat>39.617598</geo:lat>
+        <geo:long>-106.386773</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/202/498747983_2e2ad022e0_o.jpg" type="image/jpeg" height="768" width="2889" />
+      <media:title>Sawatch Range From Vail Pano</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/dman861/">dman861</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/dman861/498747983/" title="Sawatch Range From Vail Pano"><img src="http://farm1.static.flickr.com/202/498747983_0831eb06b6_m.jpg" width="240"
+        height="64" alt="Sawatch Range From Vail Pano" /></a></p>
+
+        <p>View near the Eagle's Nest at the top of Eagle Bahn Gondola. Mount of the Holy Cross mountain is visible in this picture but you can't make out the cross shape. I have no idea who the lady is. Handheld panorama, stitch of 5
+        photos.</p>
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/202/498747983_0831eb06b6_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">dman861</media:credit>
+      <media:category scheme="urn:flickr:tags">
+        trees sky panorama mountain snow ski mountains sport pinetree person photo colorado peak wideangle panoramic powder resort panasonic trail vail snowboard gondola beavercreek range avon mountainrange mountoftheholycross sawatch dmctz3 tz3
+      </media:category>
+
+    </item>
+    <item>
+
+      <title>Flash Powder</title>
+      <link>http://www.flickr.com/photos/eckan/488776800/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/eckan/">Erik Eckerström</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/eckan/488776800/" title="Flash Powder"><img src="http://farm1.static.flickr.com/228/488776800_a2b7484210_m.jpg" width="240" height="160"
+        alt="Flash Powder" /></a></p>
+
+        <p>Some late night powder in Åre</p>
+      ]]></description>
+      <pubDate>Mon, 7 May 2007 13:17:48 -0800</pubDate>
+      <dc:date.Taken>2007-01-18T15:37:17-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (Erik Eckerström)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/488776800</guid>
+
+      <georss:point>63.409238 13.079953</georss:point>
+      <geo:Point>
+        <geo:lat>63.409238</geo:lat>
+        <geo:long>13.079953</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/228/488776800_38966d0741_o.jpg" type="image/jpeg" height="2336" width="3504" />
+      <media:title>Flash Powder</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/eckan/">Erik Eckerström</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/eckan/488776800/" title="Flash Powder"><img src="http://farm1.static.flickr.com/228/488776800_a2b7484210_m.jpg" width="240" height="160"
+        alt="Flash Powder" /></a></p>
+
+        <p>Some late night powder in Åre</p>
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/228/488776800_a2b7484210_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">Erik Eckerström</media:credit>
+      <media:category scheme="urn:flickr:tags">snow forest canon eos board flash powder snowboard portfolio Åre 30d canon30d canoneos30d are</media:category>
+
+    </item>
+    <item>
+
+      <title>Hannes and Reini</title>
+      <link>http://www.flickr.com/photos/moschitz/483974969/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483974969/" title="Hannes and Reini"><img src="http://farm1.static.flickr.com/230/483974969_6645a1267c_m.jpg" width="240"
+        height="180" alt="Hannes and Reini" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:56:02 -0800</pubDate>
+      <dc:date.Taken>2007-03-26T12:17:53-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483974969</guid>
+      <georss:point>47.252086 14.365139</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.252086</geo:lat>
+        <geo:long>14.365139</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/230/483974969_ceb3fbf711_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>Hannes and Reini</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483974969/" title="Hannes and Reini"><img src="http://farm1.static.flickr.com/230/483974969_6645a1267c_m.jpg" width="240"
+        height="180" alt="Hannes and Reini" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/230/483974969_6645a1267c_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>Zehnerkar, Obertauern</title>
+
+      <link>http://www.flickr.com/photos/moschitz/483975805/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483975805/" title="Zehnerkar, Obertauern"><img src="http://farm1.static.flickr.com/202/483975805_aae74c0e2d_m.jpg" width="240"
+        height="180" alt="Zehnerkar, Obertauern" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:56:46 -0800</pubDate>
+      <dc:date.Taken>2007-03-21T15:56:56-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483975805</guid>
+      <georss:point>47.249698 13.557643</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.249698</geo:lat>
+        <geo:long>13.557643</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/202/483975805_b8749393b9_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>Zehnerkar, Obertauern</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483975805/" title="Zehnerkar, Obertauern"><img src="http://farm1.static.flickr.com/202/483975805_aae74c0e2d_m.jpg" width="240"
+        height="180" alt="Zehnerkar, Obertauern" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/202/483975805_aae74c0e2d_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>Uhh, thats high</title>
+
+      <link>http://www.flickr.com/photos/moschitz/483941044/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483941044/" title="Uhh, thats high"><img src="http://farm1.static.flickr.com/179/483941044_11806b381b_m.jpg" width="240" height="180"
+        alt="Uhh, thats high" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:55:25 -0800</pubDate>
+      <dc:date.Taken>2007-03-23T11:38:54-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483941044</guid>
+      <georss:point>47.258669 14.359989</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.258669</geo:lat>
+        <geo:long>14.359989</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/179/483941044_7b13748500_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>Uhh, thats high</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483941044/" title="Uhh, thats high"><img src="http://farm1.static.flickr.com/179/483941044_11806b381b_m.jpg" width="240" height="180"
+        alt="Uhh, thats high" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/179/483941044_11806b381b_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>Powder days</title>
+
+      <link>http://www.flickr.com/photos/moschitz/483973863/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483973863/" title="Powder days"><img src="http://farm1.static.flickr.com/185/483973863_fdef927258_m.jpg" width="240" height="180"
+        alt="Powder days" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:55:02 -0800</pubDate>
+      <dc:date.Taken>2007-03-26T11:25:01-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483973863</guid>
+      <georss:point>47.258669 14.359989</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.258669</geo:lat>
+        <geo:long>14.359989</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/185/483973863_3d460e16ac_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>Powder days</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483973863/" title="Powder days"><img src="http://farm1.static.flickr.com/185/483973863_fdef927258_m.jpg" width="240" height="180"
+        alt="Powder days" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/185/483973863_fdef927258_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>Getting ready</title>
+
+      <link>http://www.flickr.com/photos/moschitz/483940792/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483940792/" title="Getting ready"><img src="http://farm1.static.flickr.com/186/483940792_03aa2476e5_m.jpg" width="240" height="180"
+        alt="Getting ready" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:55:14 -0800</pubDate>
+      <dc:date.Taken>2007-03-23T11:38:53-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483940792</guid>
+      <georss:point>47.258669 14.359989</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.258669</geo:lat>
+        <geo:long>14.359989</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/186/483940792_c6d43a3f38_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>Getting ready</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483940792/" title="Getting ready"><img src="http://farm1.static.flickr.com/186/483940792_03aa2476e5_m.jpg" width="240" height="180"
+        alt="Getting ready" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/186/483940792_03aa2476e5_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>Going up and getting ready for the descent</title>
+
+      <link>http://www.flickr.com/photos/moschitz/483941528/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483941528/" title="Going up and getting ready for the descent"><img src="http://farm1.static.flickr.com/224/483941528_9fba721265_m.jpg"
+        width="240" height="180" alt="Going up and getting ready for the descent" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:55:50 -0800</pubDate>
+      <dc:date.Taken>2007-03-26T12:17:17-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483941528</guid>
+      <georss:point>47.258669 14.359989</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.258669</geo:lat>
+        <geo:long>14.359989</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/224/483941528_c92ea73dea_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>Going up and getting ready for the descent</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483941528/" title="Going up and getting ready for the descent"><img src="http://farm1.static.flickr.com/224/483941528_9fba721265_m.jpg"
+        width="240" height="180" alt="Going up and getting ready for the descent" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/224/483941528_9fba721265_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>I made it!</title>
+
+      <link>http://www.flickr.com/photos/moschitz/483941314/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483941314/" title="I made it!"><img src="http://farm1.static.flickr.com/196/483941314_84884b47de_m.jpg" width="240" height="180"
+        alt="I made it!" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:55:39 -0800</pubDate>
+      <dc:date.Taken>2007-03-23T11:38:54-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483941314</guid>
+      <georss:point>47.258669 14.359989</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.258669</geo:lat>
+        <geo:long>14.359989</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/196/483941314_6d08f6e97b_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>I made it!</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483941314/" title="I made it!"><img src="http://farm1.static.flickr.com/196/483941314_84884b47de_m.jpg" width="240" height="180"
+        alt="I made it!" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/196/483941314_84884b47de_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>Reini and me</title>
+
+      <link>http://www.flickr.com/photos/moschitz/483942166/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483942166/" title="Reini and me"><img src="http://farm1.static.flickr.com/167/483942166_ab3470e411_m.jpg" width="240" height="180"
+        alt="Reini and me" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:56:24 -0800</pubDate>
+      <dc:date.Taken>2007-03-21T15:45:38-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483942166</guid>
+      <georss:point>47.249698 13.557643</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.249698</geo:lat>
+        <geo:long>13.557643</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/167/483942166_ea09729354_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>Reini and me</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483942166/" title="Reini and me"><img src="http://farm1.static.flickr.com/167/483942166_ab3470e411_m.jpg" width="240" height="180"
+        alt="Reini and me" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/167/483942166_ab3470e411_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>Obertauern</title>
+
+      <link>http://www.flickr.com/photos/moschitz/483976145/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483976145/" title="Obertauern"><img src="http://farm1.static.flickr.com/174/483976145_3817dac9dc_m.jpg" width="240" height="180"
+        alt="Obertauern" /></a></p>
+
+      ]]></description>
+      <pubDate>Fri, 4 May 2007 08:57:04 -0800</pubDate>
+      <dc:date.Taken>2007-03-21T15:48:01-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (martinom)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/483976145</guid>
+      <georss:point>47.249698 13.557643</georss:point>
+
+      <geo:Point>
+        <geo:lat>47.249698</geo:lat>
+        <geo:long>13.557643</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/174/483976145_a40e67f8e4_o.jpg" type="image/jpeg" height="1200" width="1600" />
+      <media:title>Obertauern</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/moschitz/">martinom</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/moschitz/483976145/" title="Obertauern"><img src="http://farm1.static.flickr.com/174/483976145_3817dac9dc_m.jpg" width="240" height="180"
+        alt="Obertauern" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/174/483976145_3817dac9dc_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">martinom</media:credit>
+      <media:category scheme="urn:flickr:tags">powder snowboard autoupload obertauern lachtal</media:category>
+
+    </item>
+    <item>
+      <title>Ross Fall Line 2</title>
+
+      <link>http://www.flickr.com/photos/pwadsworth/480290173/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/pwadsworth/">phwadsworth</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/pwadsworth/480290173/" title="Ross Fall Line 2"><img src="http://farm1.static.flickr.com/230/480290173_92696d207c_m.jpg" width="182"
+        height="240" alt="Ross Fall Line 2" /></a></p>
+
+      ]]></description>
+      <pubDate>Tue, 1 May 2007 12:02:23 -0800</pubDate>
+      <dc:date.Taken>2007-05-01T15:02:23-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (phwadsworth)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/480290173</guid>
+      <georss:point>44.196728 -72.926688</georss:point>
+
+      <geo:Point>
+        <geo:lat>44.196728</geo:lat>
+        <geo:long>-72.926688</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/230/480290173_5b8ebaf718_o.jpg" type="image/jpeg" height="793" width="600" />
+      <media:title>Ross Fall Line 2</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/pwadsworth/">phwadsworth</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/pwadsworth/480290173/" title="Ross Fall Line 2"><img src="http://farm1.static.flickr.com/230/480290173_92696d207c_m.jpg" width="182"
+        height="240" alt="Ross Fall Line 2" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/230/480290173_92696d207c_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">phwadsworth</media:credit>
+      <media:category scheme="urn:flickr:tags">ski river geotagged powder glen snowboard mad vt mrg vemont</media:category>
+
+    </item>
+    <item>
+      <title>Ross Fall Line 1</title>
+
+      <link>http://www.flickr.com/photos/pwadsworth/480290169/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/pwadsworth/">phwadsworth</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/pwadsworth/480290169/" title="Ross Fall Line 1"><img src="http://farm1.static.flickr.com/218/480290169_35b0301cb4_m.jpg" width="150"
+        height="240" alt="Ross Fall Line 1" /></a></p>
+
+      ]]></description>
+      <pubDate>Tue, 1 May 2007 12:02:23 -0800</pubDate>
+      <dc:date.Taken>2007-05-01T15:02:23-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (phwadsworth)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/480290169</guid>
+      <georss:point>44.196728 -72.926688</georss:point>
+
+      <geo:Point>
+        <geo:lat>44.196728</geo:lat>
+        <geo:long>-72.926688</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/218/480290169_bd54859899_o.jpg" type="image/jpeg" height="959" width="600" />
+      <media:title>Ross Fall Line 1</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/pwadsworth/">phwadsworth</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/pwadsworth/480290169/" title="Ross Fall Line 1"><img src="http://farm1.static.flickr.com/218/480290169_35b0301cb4_m.jpg" width="150"
+        height="240" alt="Ross Fall Line 1" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/218/480290169_35b0301cb4_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">phwadsworth</media:credit>
+      <media:category scheme="urn:flickr:tags">ski river geotagged powder glen snowboard mad vt mrg vemont</media:category>
+
+    </item>
+    <item>
+      <title>IMGP0575</title>
+
+      <link>http://www.flickr.com/photos/beppoegeppa/471446918/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/beppoegeppa/">beppovox</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/beppoegeppa/471446918/" title="IMGP0575"><img src="http://farm1.static.flickr.com/169/471446918_fa54874333_m.jpg" width="240" height="180"
+        alt="IMGP0575" /></a></p>
+
+      ]]></description>
+      <pubDate>Tue, 24 Apr 2007 10:32:41 -0800</pubDate>
+      <dc:date.Taken>2003-12-29T11:07:29-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (beppovox)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/471446918</guid>
+      <georss:point>45.082308 6.761913</georss:point>
+
+      <geo:Point>
+        <geo:lat>45.082308</geo:lat>
+        <geo:long>6.761913</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/169/471446918_f199685d82_o.jpg" type="image/jpeg" height="1944" width="2592" />
+      <media:title>IMGP0575</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/beppoegeppa/">beppovox</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/beppoegeppa/471446918/" title="IMGP0575"><img src="http://farm1.static.flickr.com/169/471446918_fa54874333_m.jpg" width="240" height="180"
+        alt="IMGP0575" /></a></p>
+
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/169/471446918_fa54874333_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">beppovox</media:credit>
+      <media:category scheme="urn:flickr:tags">geotagged free powder snowboard freeride jafferau</media:category>
+
+    </item>
+    <item>
+      <title>Slopes</title>
+
+      <link>http://www.flickr.com/photos/blupic/469735045/</link>
+      <description><![CDATA[
+        <p><a href="http://www.flickr.com/people/blupic/">blupic.com</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/blupic/469735045/" title="Slopes"><img src="http://farm1.static.flickr.com/203/469735045_e035c04ab2_m.jpg" width="240" height="160"
+        alt="Slopes" /></a></p>
+
+        <p>One day...</p>
+      ]]></description>
+      <pubDate>Mon, 23 Apr 2007 02:48:17 -0800</pubDate>
+      <dc:date.Taken>2007-03-31T17:31:13-08:00</dc:date.Taken>
+      <author>nobody at flickr.com (blupic.com)</author>
+      <guid isPermaLink="false">tag:flickr.com,2004:/photo/469735045</guid>
+
+      <georss:point>50.111882 -122.939436</georss:point>
+      <geo:Point>
+        <geo:lat>50.111882</geo:lat>
+        <geo:long>-122.939436</geo:long>
+      </geo:Point>
+      <media:content url="http://farm1.static.flickr.com/203/469735045_e035c04ab2_m.jpg" type="image/jpeg" height="160" width="240" />
+      <media:title>Slopes</media:title>
+      <media:text type="html"><![CDATA[
+        <p><a href="http://www.flickr.com/people/blupic/">blupic.com</a> posted a photo:</p>
+
+        <p><a href="http://www.flickr.com/photos/blupic/469735045/" title="Slopes"><img src="http://farm1.static.flickr.com/203/469735045_e035c04ab2_m.jpg" width="240" height="160"
+        alt="Slopes" /></a></p>
+
+        <p>One day...</p>
+      ]]></media:text>
+      <media:thumbnail url="http://farm1.static.flickr.com/203/469735045_e035c04ab2_s.jpg" height="75" width="75" />
+      <media:credit role="photographer">blupic.com</media:credit>
+      <media:category scheme="urn:flickr:tags">blue winter sky mountain snow canada ski nature vancouver whistler nikon skiing d70 peak columbia powder 1870mmf3545g snowboard british blackcomb mogul</media:category>
+
+    </item>
+
+  </channel>
+</rss>
\ No newline at end of file
diff --git a/examples/xml/track1.xml b/examples/xml/track1.xml
new file mode 100644
index 0000000..69036a4
--- /dev/null
+++ b/examples/xml/track1.xml
@@ -0,0 +1,98 @@
+<rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
+<channel>
+
+<title>Title for First trial track</title>
+<description>Description for first track</description>
+<category>Nelson</category>
+<item><pubDate>1995-12-12T05:00:00Z</pubDate><geo:lat>22.18628611</geo:lat><geo:long>20.30211944</geo:long><title>Phase Change</title><description>Start Phase A</description></item>
+<item><pubDate>1995-12-12T05:05:00Z</pubDate><geo:lat>22.18621944</geo:lat><geo:long>20.28514722</geo:long></item>
+<item><pubDate>1995-12-12T05:10:00Z</pubDate><geo:lat>22.18609722</geo:lat><geo:long>20.266425</geo:long></item>
+<item><pubDate>1995-12-12T05:15:00Z</pubDate><geo:lat>22.18279722</geo:lat><geo:long>20.24935</geo:long></item>
+<item><pubDate>1995-12-12T05:16:00Z</pubDate><geo:lat>22.18153889</geo:lat><geo:long>20.24605556</geo:long><title>Course Change</title><description>220 degs 4kts</description></item>
+<item><pubDate>1995-12-12T05:20:00Z</pubDate><geo:lat>22.1764</geo:lat><geo:long>20.23299444</geo:long></item>
+<item><pubDate>1995-12-12T05:25:00Z</pubDate><geo:lat>22.16996111</geo:lat><geo:long>20.21654167</geo:long></item>
+<item><pubDate>1995-12-12T05:30:00Z</pubDate><geo:lat>22.16351944</geo:lat><geo:long>20.20017222</geo:long></item>
+<item><pubDate>1995-12-12T05:35:00Z</pubDate><geo:lat>22.15710556</geo:lat><geo:long>20.18375278</geo:long></item>
+<item><pubDate>1995-12-12T05:40:00Z</pubDate><geo:lat>22.15062778</geo:lat><geo:long>20.16738889</geo:long></item>
+<item><pubDate>1995-12-12T05:42:00Z</pubDate><geo:lat>22.14803333</geo:lat><geo:long>20.16077222</geo:long><title>Comment</title><description>XO has bridge</description></item>
+<item><pubDate>1995-12-12T05:45:00Z</pubDate><geo:lat>22.14416389</geo:lat><geo:long>20.15091944</geo:long></item>
+<item><pubDate>1995-12-12T05:50:00Z</pubDate><geo:lat>22.13757778</geo:lat><geo:long>20.13483333</geo:long></item>
+<item><pubDate>1995-12-12T05:55:00Z</pubDate><geo:lat>22.12541667</geo:lat><geo:long>20.134125</geo:long></item>
+<item><pubDate>1995-12-12T06:00:00Z</pubDate><geo:lat>22.11250556</geo:lat><geo:long>20.13402778</geo:long></item>
+<item><pubDate>1995-12-12T06:05:00Z</pubDate><geo:lat>22.09960278</geo:lat><geo:long>20.13395</geo:long></item>
+<item><pubDate>1995-12-12T06:10:00Z</pubDate><geo:lat>22.08812222</geo:lat><geo:long>20.14054722</geo:long><title>Comment</title><description></description></item>
+<item><pubDate>1995-12-12T06:13:00Z</pubDate><geo:lat>22.08141389</geo:lat><geo:long>20.14618333</geo:long><title>Course Change</title><description>220 degs 4kts</description></item>
+<item><pubDate>1995-12-12T06:15:00Z</pubDate><geo:lat>22.07695278</geo:lat><geo:long>20.14992778</geo:long></item>
+<item><pubDate>1995-12-12T06:20:00Z</pubDate><geo:lat>22.06584167</geo:lat><geo:long>20.15931111</geo:long></item>
+<item><pubDate>1995-12-12T06:25:00Z</pubDate><geo:lat>22.05460278</geo:lat><geo:long>20.16871944</geo:long></item>
+<item><pubDate>1995-12-12T06:30:00Z</pubDate><geo:lat>22.04315833</geo:lat><geo:long>20.16791667</geo:long></item>
+<item><pubDate>1995-12-12T06:35:00Z</pubDate><geo:lat>22.03118611</geo:lat><geo:long>20.16143056</geo:long></item>
+<item><pubDate>1995-12-12T06:40:00Z</pubDate><geo:lat>22.01912222</geo:lat><geo:long>20.15486389</geo:long></item>
+<item><pubDate>1995-12-12T06:45:00Z</pubDate><geo:lat>22.00708333</geo:lat><geo:long>20.14833056</geo:long></item>
+<item><pubDate>1995-12-12T06:50:00Z</pubDate><geo:lat>21.99504444</geo:lat><geo:long>20.14181111</geo:long></item>
+<item><pubDate>1995-12-12T06:55:00Z</pubDate><geo:lat>21.98423889</geo:lat><geo:long>20.14733611</geo:long></item>
+<item><pubDate>1995-12-12T07:00:00Z</pubDate><geo:lat>21.97367222</geo:lat><geo:long>20.15803333</geo:long></item>
+<item><pubDate>1995-12-12T07:05:00Z</pubDate><geo:lat>21.96306111</geo:lat><geo:long>20.16874444</geo:long></item>
+<item><pubDate>1995-12-12T07:10:00Z</pubDate><geo:lat>21.95407222</geo:lat><geo:long>20.17233611</geo:long></item>
+<item><pubDate>1995-12-12T07:15:00Z</pubDate><geo:lat>21.95885556</geo:lat><geo:long>20.15766944</geo:long></item>
+<item><pubDate>1995-12-12T07:20:00Z</pubDate><geo:lat>21.96630833</geo:lat><geo:long>20.16956944</geo:long></item>
+<item><pubDate>1995-12-12T07:25:00Z</pubDate><geo:lat>21.97450556</geo:lat><geo:long>20.18388056</geo:long></item>
+<item><pubDate>1995-12-12T07:30:00Z</pubDate><geo:lat>21.98276389</geo:lat><geo:long>20.19838333</geo:long></item>
+<item><pubDate>1995-12-12T07:32:00Z</pubDate><geo:lat>21.98605278</geo:lat><geo:long>20.20413056</geo:long><title>Comment</title><description>Suspect opponent to North, slowing down</description></item>
+<item><pubDate>1995-12-12T07:33:00Z</pubDate><geo:lat>21.98691667</geo:lat><geo:long>20.20727778</geo:long><title>Comment</title><description>VIP visitors due. Helo retrieved.</description></item>
+<item><pubDate>1995-12-12T07:34:00Z</pubDate><geo:lat>21.98566944</geo:lat><geo:long>20.20985556</geo:long><title>Comment</title><description>Wind picked up. Switching off sensor Delta</description></item>
+<item><pubDate>1995-12-12T07:35:00Z</pubDate><geo:lat>21.9842</geo:lat><geo:long>20.21243611</geo:long><title>Comment</title><description>Heavenly dusk</description></item>
+<item><pubDate>1995-12-12T07:40:00Z</pubDate><geo:lat>21.97609444</geo:lat><geo:long>20.226425</geo:long></item>
+<item><pubDate>1995-12-12T07:45:00Z</pubDate><geo:lat>21.96786111</geo:lat><geo:long>20.240725</geo:long></item>
+<item><pubDate>1995-12-12T07:50:00Z</pubDate><geo:lat>21.9595</geo:lat><geo:long>20.25507778</geo:long></item>
+<item><pubDate>1995-12-12T07:55:00Z</pubDate><geo:lat>21.95118056</geo:lat><geo:long>20.26941389</geo:long></item>
+<item><pubDate>1995-12-12T08:00:00Z</pubDate><geo:lat>21.94862778</geo:lat><geo:long>20.28483056</geo:long></item>
+<item><pubDate>1995-12-12T08:05:00Z</pubDate><geo:lat>21.95295</geo:lat><geo:long>20.30239444</geo:long></item>
+<item><pubDate>1995-12-12T08:10:00Z</pubDate><geo:lat>21.957325</geo:lat><geo:long>20.32020278</geo:long></item>
+<item><pubDate>1995-12-12T08:15:00Z</pubDate><geo:lat>21.96172222</geo:lat><geo:long>20.33795278</geo:long></item>
+<item><pubDate>1995-12-12T08:20:00Z</pubDate><geo:lat>21.96616111</geo:lat><geo:long>20.35568611</geo:long></item>
+<item><pubDate>1995-12-12T08:25:00Z</pubDate><geo:lat>21.96355556</geo:lat><geo:long>20.371925</geo:long></item>
+<item><pubDate>1995-12-12T08:30:00Z</pubDate><geo:lat>21.95877778</geo:lat><geo:long>20.38858333</geo:long></item>
+<item><pubDate>1995-12-12T08:35:00Z</pubDate><geo:lat>21.95988889</geo:lat><geo:long>20.40708333</geo:long></item>
+<item><pubDate>1995-12-12T08:40:00Z</pubDate><geo:lat>21.96361944</geo:lat><geo:long>20.41884722</geo:long></item>
+<item><pubDate>1995-12-12T08:45:00Z</pubDate><geo:lat>21.96945556</geo:lat><geo:long>20.40425278</geo:long><title>Course Change</title><description>220 degs 4kts</description></item>
+<item><pubDate>1995-12-12T08:50:00Z</pubDate><geo:lat>21.9759</geo:lat><geo:long>20.38807778</geo:long></item>
+<item><pubDate>1995-12-12T08:55:00Z</pubDate><geo:lat>21.98237222</geo:lat><geo:long>20.37183889</geo:long></item>
+<item><pubDate>1995-12-12T09:00:00Z</pubDate><geo:lat>21.98880278</geo:lat><geo:long>20.35546667</geo:long></item>
+<item><pubDate>1995-12-12T09:05:00Z</pubDate><geo:lat>21.99968611</geo:lat><geo:long>20.34794722</geo:long></item>
+<item><pubDate>1995-12-12T09:10:00Z</pubDate><geo:lat>22.01179167</geo:lat><geo:long>20.34156389</geo:long></item>
+<item><pubDate>1995-12-12T09:15:00Z</pubDate><geo:lat>22.02168611</geo:lat><geo:long>20.34614444</geo:long></item>
+<item><pubDate>1995-12-12T09:20:00Z</pubDate><geo:lat>22.02811111</geo:lat><geo:long>20.36220833</geo:long></item>
+<item><pubDate>1995-12-12T09:25:00Z</pubDate><geo:lat>22.03456111</geo:lat><geo:long>20.37856389</geo:long><title>Phase Change</title><description>End Phase A</description></item>
+<item><pubDate>1995-12-12T09:30:00Z</pubDate><geo:lat>22.04145</geo:lat><geo:long>20.36952222</geo:long></item>
+<item><pubDate>1995-12-12T09:35:00Z</pubDate><geo:lat>22.04782222</geo:lat><geo:long>20.35348611</geo:long></item>
+<item><pubDate>1995-12-12T09:40:00Z</pubDate><geo:lat>22.05426389</geo:lat><geo:long>20.33713056</geo:long></item>
+<item><pubDate>1995-12-12T09:45:00Z</pubDate><geo:lat>22.06069444</geo:lat><geo:long>20.32085</geo:long></item>
+<item><pubDate>1995-12-12T09:46:00Z</pubDate><geo:lat>22.06198611</geo:lat><geo:long>20.31761111</geo:long><title>Phase Change</title><description>Start Phase B</description></item>
+<item><pubDate>1995-12-12T09:50:00Z</pubDate><geo:lat>22.06471944</geo:lat><geo:long>20.30389444</geo:long></item>
+<item><pubDate>1995-12-12T09:55:00Z</pubDate><geo:lat>22.07586667</geo:lat><geo:long>20.29758333</geo:long></item>
+<item><pubDate>1995-12-12T10:00:00Z</pubDate><geo:lat>22.08793889</geo:lat><geo:long>20.29113889</geo:long></item>
+<item><pubDate>1995-12-12T10:05:00Z</pubDate><geo:lat>22.10003333</geo:lat><geo:long>20.2848</geo:long></item>
+<item><pubDate>1995-12-12T10:10:00Z</pubDate><geo:lat>22.11219722</geo:lat><geo:long>20.27842222</geo:long></item>
+<item><pubDate>1995-12-12T10:15:00Z</pubDate><geo:lat>22.11530556</geo:lat><geo:long>20.26194167</geo:long></item>
+<item><pubDate>1995-12-12T10:20:00Z</pubDate><geo:lat>22.11756944</geo:lat><geo:long>20.24336667</geo:long></item>
+<item><pubDate>1995-12-12T10:25:00Z</pubDate><geo:lat>22.11986111</geo:lat><geo:long>20.22466944</geo:long></item>
+<item><pubDate>1995-12-12T10:30:00Z</pubDate><geo:lat>22.12238333</geo:lat><geo:long>20.20620833</geo:long></item>
+<item><pubDate>1995-12-12T10:35:00Z</pubDate><geo:lat>22.12890278</geo:lat><geo:long>20.216475</geo:long></item>
+<item><pubDate>1995-12-12T10:40:00Z</pubDate><geo:lat>22.12351944</geo:lat><geo:long>20.22643333</geo:long></item>
+<item><pubDate>1995-12-12T10:45:00Z</pubDate><geo:lat>22.12099722</geo:lat><geo:long>20.23426667</geo:long></item>
+<item><pubDate>1995-12-12T10:50:00Z</pubDate><geo:lat>22.12194167</geo:lat><geo:long>20.23018333</geo:long></item>
+<item><pubDate>1995-12-12T10:55:00Z</pubDate><geo:lat>22.11872778</geo:lat><geo:long>20.23548056</geo:long></item>
+<item><pubDate>1995-12-12T11:00:00Z</pubDate><geo:lat>22.11994167</geo:lat><geo:long>20.23541111</geo:long></item>
+<item><pubDate>1995-12-12T11:05:00Z</pubDate><geo:lat>22.11992778</geo:lat><geo:long>20.23948056</geo:long></item>
+<item><pubDate>1995-12-12T11:10:00Z</pubDate><geo:lat>22.11802222</geo:lat><geo:long>20.24473889</geo:long></item>
+<item><pubDate>1995-12-12T11:15:00Z</pubDate><geo:lat>22.11764444</geo:lat><geo:long>20.24835278</geo:long></item>
+<item><pubDate>1995-12-12T11:20:00Z</pubDate><geo:lat>22.12215556</geo:lat><geo:long>20.24788889</geo:long></item>
+<item><pubDate>1995-12-12T11:25:00Z</pubDate><geo:lat>22.11725278</geo:lat><geo:long>20.25047778</geo:long></item>
+<item><pubDate>1995-12-12T11:30:00Z</pubDate><geo:lat>22.12259722</geo:lat><geo:long>20.24290278</geo:long></item>
+<item><pubDate>1995-12-12T11:35:00Z</pubDate><geo:lat>22.12921944</geo:lat><geo:long>20.24653889</geo:long></item>
+<item><pubDate>1995-12-12T11:40:00Z</pubDate><geo:lat>22.13970833</geo:lat><geo:long>20.25221389</geo:long></item>
+<item><pubDate>1995-12-12T11:41:00Z</pubDate><geo:lat>22.14173889</geo:lat><geo:long>20.25330556</geo:long><title>Phase Change</title><description>End Phase B</description></item>
+</channel>
+</rss>
+
diff --git a/examples/xml/wmsdescribelayer.xml b/examples/xml/wmsdescribelayer.xml
new file mode 100644
index 0000000..d9bb811
--- /dev/null
+++ b/examples/xml/wmsdescribelayer.xml
@@ -0,0 +1,5 @@
+<WMS_DescribeLayerResponse version="1.1.1">
+  <LayerDescription name="topp:states" wfs="http://demo.opengeo.org:80/geoserver/wfs/WfsDispatcher?">
+    <Query typeName="topp:states"/>
+  </LayerDescription>
+</WMS_DescribeLayerResponse>
diff --git a/examples/xyz-esri.html b/examples/xyz-esri.html
new file mode 100644
index 0000000..cee2014
--- /dev/null
+++ b/examples/xyz-esri.html
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Basic ESRI Map Cache Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        function init(){
+            OpenLayers.Util.onImageLoadError = function() { this.style.display="none";}
+            var layerExtent = new OpenLayers.Bounds( -13758743.4295939,  5591455.28887228, -13531302.3472101 , 5757360.4178881)
+            map = new OpenLayers.Map( 'map', {'restrictedExtent': layerExtent} );
+            layer = new OpenLayers.Layer.XYZ( "ESRI",
+                    "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Portland/ESRI_LandBase_WebMercator/MapServer/tile/${z}/${y}/${x}",
+                    {sphericalMercator: true} );
+            map.addLayer(layer);
+            map.zoomToExtent(map.restrictedExtent);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Basic ESRI Map Cache Example</h1>
+
+    <div id="tags"></div>
+
+    <div id="shortdesc">Show a Simple ESRI map using the layer from <a href="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Portland/ESRI_LandBase_WebMercator/MapServer">ESRI's server</a>. </div>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+       Show the use of the XYZ layer to access a map cache provided in spherical mercator by ESRI.  
+    </div>
+  </body>
+</html>
diff --git a/examples/xyz-offset.html b/examples/xyz-offset.html
new file mode 100644
index 0000000..8ba464e
--- /dev/null
+++ b/examples/xyz-offset.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <title>OpenLayers XYZ with Offset</title>
+        <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="style.css" type="text/css" />
+        <script src="../lib/OpenLayers.js"></script>
+        <script src="xyz-offset.js"></script>
+    </head>
+    <body onload="init()">
+        <h1 id="title">XYZ Layer with Offset</h1>
+        
+        <div id="shortdesc">Using a limited set of levels from an XYZ layer with zoomOffset.</div>
+        
+        <div id="map" class="smallmap"></div>
+        
+        <div id="docs">
+            <p>
+                The XYZ layer allows a zoomOffset to be set if you want to have
+                a maximum resolution for the map that differs from the maxiumum
+                resolution of the cached tiles.  This example uses only 6 of the
+                levels in the cache, starting with the ninth level (index of 8)
+                in the cache.  To do this, the layer is constructed with a
+                zoomOffset of 8.  When the map zoom level is zero, the level
+                with index 8 will be requested from the cache.
+            </p>
+            <p>
+                See the <a href="xyz-offset.js" target="_blank">
+                xyz-offset.js source</a> to see how this is done.
+            </p>        
+        </div>
+    </body>
+</html>
diff --git a/examples/xyz-offset.js b/examples/xyz-offset.js
new file mode 100644
index 0000000..6e7fa94
--- /dev/null
+++ b/examples/xyz-offset.js
@@ -0,0 +1,37 @@
+var map, layer;
+
+// if tiles are not available, hide images
+//OpenLayers.Util.onImageLoadError = function() {
+//    this.style.display = "none";
+//}
+
+// called on body load
+function init() {
+
+    var extent = new OpenLayers.Bounds(
+        -13758743.4295939,  5591455.28887228, -13531302.3472101 , 5757360.4178881
+    );
+
+    map = new OpenLayers.Map({
+        div: "map",
+        maxExtent: new OpenLayers.Bounds(
+            -128 * 156543.0339, -128 * 156543.0339,
+            128 * 156543.0339, 128 * 156543.0339
+        ),
+        restrictedExtent: extent,
+        maxResolution: 611.496226171875, // corresponds to level 8 in the cache
+        numZoomLevels: 6,
+        projection: new OpenLayers.Projection("EPSG:900913"),
+        units: "m",
+        layers: [
+            new OpenLayers.Layer.XYZ(
+                "ESRI",
+                "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Portland/ESRI_LandBase_WebMercator/MapServer/tile/${z}/${y}/${x}",
+                {zoomOffset: 8} // since our map maxResolution differs from cache max resolution
+            )
+        ]
+    });
+
+    map.zoomToExtent(extent);
+
+}
diff --git a/examples/yahoo.html b/examples/yahoo.html
new file mode 100644
index 0000000..3c52ba3
--- /dev/null
+++ b/examples/yahoo.html
@@ -0,0 +1,46 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers: Yahoo Layer</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="http://api.maps.yahoo.com/ajaxymap?v=3.0&appid=euzuro-openlayers"></script>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer, velayer;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            yahooLayer = new OpenLayers.Layer.Yahoo( "Yahoo");
+
+            map.addLayer(yahooLayer);
+
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+
+            map.setCenter(new OpenLayers.LonLat(-5, 40), 4);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Yahoo Base Layer Example</h1>
+
+        <div id="tags">
+        </div>
+
+        <p id="shortdesc">
+            Shows how you would add a yahoo layer and add the LayerSwitcher control
+        </p>
+
+        <div id="map" class="smallmap"></div>
+
+        <div id="docs">
+            This is an example of how to add a yahoo layer to the OpenLayers window.  In order to enable a
+            yahoo layer. Also shown in this example is the LayerSwitcher() control for toggling between both the yahoo layer and
+            the open layer WMS.
+        </div>
+
+  </body>
+</html>
diff --git a/examples/yelp-georss.xml b/examples/yelp-georss.xml
new file mode 100644
index 0000000..3981069
--- /dev/null
+++ b/examples/yelp-georss.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet href="http://yelp.com/css/atom.css" type="text/css" media="screen"?>
+<feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"> 
+	<rights>Copyright 2007 Yelp, Inc. All rights reserved.</rights> 
+	<title>Yelp - Recent Reviews Near Ann Arbor, MI</title>
+	<link href="http://www.yelp.com/?location=Ann+Arbor%2C+MI"/>
+	<updated>2007-05-29T22:58:24-08:00</updated>
+	<author>
+		<name>Recent Reviews Near Ann Arbor, MI</name>
+	</author>
+
+	<entry>
+		<title>Sam S.'s Review Of State Theatre - Ann Arbor (4/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/r-dZCCNtld2ik0QRoTwuUQ?hrid=pve0e49KrVsvgX_wXpZHYA" />
+		<id>http://www.yelp.com/biz/r-dZCCNtld2ik0QRoTwuUQ?hrid=pve0e49KrVsvgX_wXpZHYA</id>
+		<updated>2007-05-29T22:58:24-08:00</updated>
+		<summary type="html">I gotta give this place props for hosting independent movies. Man, I really tire of that Hollywood bullshit; I actually feel retarded afterwards.<br /><br />My main gripe is that the seats are not ergonomic at&#8230;</summary>
+		<geo:long>-83.7406005859</geo:long>	
+		<geo:lat>42.2790985107</geo:lat>
+	</entry>
+	<entry>
+		<title>Sean M.'s Review Of Maize N Blue Deli - Ann Arbor (5/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/GqqBWV8ysYB48_jLPMl2bA?hrid=ZZIVErEJIo-FMsxOBVX1GQ" />
+		<id>http://www.yelp.com/biz/GqqBWV8ysYB48_jLPMl2bA?hrid=ZZIVErEJIo-FMsxOBVX1GQ</id>
+		<updated>2007-05-29T16:04:19-08:00</updated>
+		<summary type="html">Maize N Blue is synonymous with huge sandwiches (lunch+dinner sized) and good but not showy ingredients. It's a much better value than certain other Ann Arbor delis, and eschews the boutique feel that&#8230;</summary>
+		<geo:long>-83.7255020142</geo:long>	
+		<geo:lat>42.266998291</geo:lat>
+	</entry>
+	<entry>
+		<title>Coco C.'s Review Of Tom Thompson Flowers - Ann Arbor (5/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/B_lu4c0HgyHlxOjdKxTW7w?hrid=KNa-bOGA0xltz6bHEu3-AQ" />
+		<id>http://www.yelp.com/biz/B_lu4c0HgyHlxOjdKxTW7w?hrid=KNa-bOGA0xltz6bHEu3-AQ</id>
+		<updated>2007-05-29T10:49:06-08:00</updated>
+		<summary type="html">This place isn't much to look at - you go in and there are buckets upon buckets of loose flowers laying around, and there isn't much room to walk around. However, they make kick-ass arrangements! And&#8230;</summary>
+		<geo:long>-83.7490005493</geo:long>	
+		<geo:lat>42.2747993469</geo:lat>
+	</entry>
+	<entry>
+		<title>Sam S.'s Review Of Mitch's Place - Ann Arbor (3/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/zlJ37GVxuy-9wfvWqpPm1Q?hrid=qK6d7BOgLoK3gLf2u2OXAQ" />
+		<id>http://www.yelp.com/biz/zlJ37GVxuy-9wfvWqpPm1Q?hrid=qK6d7BOgLoK3gLf2u2OXAQ</id>
+		<updated>2007-05-28T21:28:33-08:00</updated>
+		<summary type="html">Another generic sports bar with the generic stripe-o crowd. Cheap pitchers, but constant covers.<br /><br />This is where I met Dave, a.k.a. Future Guy. He's skinny, has tall, straggly hair, and wears these&#8230;</summary>
+		<geo:long>-83.7329025269</geo:long>	
+		<geo:lat>42.275100708</geo:lat>
+	</entry>
+	<entry>
+		<title>Jane S.'s Review Of Special Moments Photography - Plymouth (1/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/IEsTnmfhN7vFfzt724qojw?hrid=ZvALNYOlSodoOciFsmeLZA" />
+		<id>http://www.yelp.com/biz/IEsTnmfhN7vFfzt724qojw?hrid=ZvALNYOlSodoOciFsmeLZA</id>
+		<updated>2007-05-28T10:18:35-08:00</updated>
+		<summary type="html">I was very unsatisfied for several reasons. First, the photographer did not have the lighting for family portraits right at all! Two faces are almost completely obscured by shadows. Also, the backdrop&#8230;</summary>
+		<geo:long>-83.4609985352</geo:long>	
+		<geo:lat>42.3588981628</geo:lat>
+	</entry>
+	<entry>
+		<title>Jacqueline D.'s Review Of Embassy Hotel - Ann Arbor (4/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/Vz0hW6UhF6w4JuvgsqDmMQ?hrid=eMKcIyREDk-pFGdH0EC6jg" />
+		<id>http://www.yelp.com/biz/Vz0hW6UhF6w4JuvgsqDmMQ?hrid=eMKcIyREDk-pFGdH0EC6jg</id>
+		<updated>2007-05-27T09:23:06-08:00</updated>
+		<summary type="html">The Embassy Hotel does what it does well: It is VERY cheap ($40-50/night) and located in the heart of downtown.  It is relatively clean.  What to expect: Your bed won't be made, your sheets won't be&#8230;</summary>
+		<geo:long>-83.7469024658</geo:long>	
+		<geo:lat>42.2812004089</geo:lat>
+	</entry>
+	<entry>
+		<title>Tony C.'s Review Of Cafe Zola - Ann Arbor (5/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/BlUEgCOGzDwpOWnkQn3odw?hrid=X3rR29JnKIqAjEzo9nC2VQ" />
+		<id>http://www.yelp.com/biz/BlUEgCOGzDwpOWnkQn3odw?hrid=X3rR29JnKIqAjEzo9nC2VQ</id>
+		<updated>2007-05-26T07:48:01-08:00</updated>
+		<summary type="html">Zola...this is easily one of the best experiences to be had in Ann Arbor.  I'll get the negatives for this place right out in the open.  It's popular, really popular.  It's expensive, but not break&#8230;</summary>
+		<geo:long>-83.7489013672</geo:long>	
+		<geo:lat>42.2806015015</geo:lat>
+	</entry>
+	<entry>
+		<title>Tony C.'s Review Of Melange - Ann Arbor (4/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/aPdz29vOWj4fBlLlCBM7UQ?hrid=ETs0aMnHTjSLy1VTsGxCBg" />
+		<id>http://www.yelp.com/biz/aPdz29vOWj4fBlLlCBM7UQ?hrid=ETs0aMnHTjSLy1VTsGxCBg</id>
+		<updated>2007-05-26T07:30:59-08:00</updated>
+		<summary type="html">Melange has an excellent menu.  I've tried the scallops, the perch, and the seabass.  All were excellent.  The two dishes I'd steer clear of are the rock beef thing and the squid appetizers.<br /><br />The rock&#8230;</summary>
+		<geo:long>-83.7481918335</geo:long>	
+		<geo:lat>42.283493042</geo:lat>
+	</entry>
+	<entry>
+		<title>Tony C.'s Review Of Bennett Optometry - Ann Arbor (4/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/Oa5c1Zzr6RlkGjx-0KYr1A?hrid=vUiuwPLri6D5LTPrC76UlA" />
+		<id>http://www.yelp.com/biz/Oa5c1Zzr6RlkGjx-0KYr1A?hrid=vUiuwPLri6D5LTPrC76UlA</id>
+		<updated>2007-05-26T07:09:43-08:00</updated>
+		<summary type="html">I just got my eyes checked out here about two months ago and overall, I was satisfied with my experience.  The optometrist I got was young, but very knowledgeable and didn't seem to be in a hurry to&#8230;</summary>
+		<geo:long>-83.6924972534</geo:long>	
+		<geo:lat>42.3031005859</geo:lat>
+	</entry>
+	<entry>
+		<title>Nedra B.'s Review Of Star's Cafe - Ann Arbor (4/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/aNeaXyQWZ0LGH3FoNnYzmA?hrid=XUd-5ehybDuujOTinekhWA" />
+		<id>http://www.yelp.com/biz/aNeaXyQWZ0LGH3FoNnYzmA?hrid=XUd-5ehybDuujOTinekhWA</id>
+		<updated>2007-05-26T02:53:51-08:00</updated>
+		<summary type="html">As you walk in, you hear arabic music playing the background, and about 4 or 5 tables in front of the main window.  You walk up to the menu, choose from many middle eastern foods, give your order, and&#8230;</summary>
+		<geo:long>-83.782539</geo:long>	
+		<geo:lat>42.281079</geo:lat>
+	</entry>
+	<entry>
+		<title>Nedra B.'s Review Of Vinology - Ann Arbor (3/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/qkw4xWWgTufvBs1NcxsFnw?hrid=lFMHzQ0GwJ93Ns0kCoPWPQ" />
+		<id>http://www.yelp.com/biz/qkw4xWWgTufvBs1NcxsFnw?hrid=lFMHzQ0GwJ93Ns0kCoPWPQ</id>
+		<updated>2007-05-26T02:45:15-08:00</updated>
+		<summary type="html">I knew to expect a pricey "high class" restaurant... but in my opinion they went over the top. I went with my sister and some friends, and she ordered the little "mini burgers" and I ordered the only&#8230;</summary>
+		<geo:long>-83.7487030029</geo:long>	
+		<geo:lat>42.2812004089</geo:lat>
+	</entry>
+	<entry>
+		<title>Coco C.'s Review Of Eastern Accents - Ann Arbor (4/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/AztY39QdGAkoKrLy9Di2yw?hrid=HL2_XnWdZP1FO95e1q-Xjw" />
+		<id>http://www.yelp.com/biz/AztY39QdGAkoKrLy9Di2yw?hrid=HL2_XnWdZP1FO95e1q-Xjw</id>
+		<updated>2007-05-25T15:43:30-08:00</updated>
+		<summary type="html">Oooh baby, this is my dream food come to life - sweet buns with tasty meat inside of them. I'm already a big fan of WowBao in Chicago, so to find this place in Ann Arbor makes me living here a&#8230;</summary>
+		<geo:long>-83.7472991943</geo:long>	
+		<geo:lat>42.2803001404</geo:lat>
+	</entry>
+	<entry>
+		<title>Liam C.'s Review Of The Dartmoor - Plymouth (1/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/Q32V2uxVKKv8_fp-hGxyZQ?hrid=7zFDEW0THJGYTUPPHLZucQ" />
+		<id>http://www.yelp.com/biz/Q32V2uxVKKv8_fp-hGxyZQ?hrid=7zFDEW0THJGYTUPPHLZucQ</id>
+		<updated>2007-05-24T14:36:00-08:00</updated>
+		<summary type="html">Okay, so here is how fawked up it is in Plymouth.<br /><br />This place was a hotel, back in the day.  Dude converts it to offices and retail, and leases the bar and restaurant out to someone else.<br /><br />the tenant gets&#8230;</summary>
+		<geo:long>-83.4705963135</geo:long>	
+		<geo:lat>42.3686981201</geo:lat>
+	</entry>
+	<entry>
+		<title>Liam C.'s Review Of Omelette & Waffle Cafe - Plymouth (2/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/a09i0TiPG4_yhl-fnzPzDA?hrid=I4ENTNhbAK8pLP_qJmivTQ" />
+		<id>http://www.yelp.com/biz/a09i0TiPG4_yhl-fnzPzDA?hrid=I4ENTNhbAK8pLP_qJmivTQ</id>
+		<updated>2007-05-24T14:32:05-08:00</updated>
+		<summary type="html">Who does this guy pay off?  Every year, he wins the Chii cook off but when you order the chili here in the restaurant, it's Hormel right out of a can!<br /><br />tired and uninspired boring diner egg dishes,&#8230;</summary>
+		<geo:long>-83.4709014893</geo:long>	
+		<geo:lat>42.3681983948</geo:lat>
+	</entry>
+	<entry>
+		<title>Liam C.'s Review Of Zack's of Plymouth - Plymouth (2/5)</title>
+		<link rel="alternate" type="text/html" href="http://www.yelp.com/biz/F0iuCrXUd_fEJ-LZh8wMFw?hrid=2VLIUcC_oI8b_aLTMjYx8w" />
+		<id>http://www.yelp.com/biz/F0iuCrXUd_fEJ-LZh8wMFw?hrid=2VLIUcC_oI8b_aLTMjYx8w</id>
+		<updated>2007-05-24T14:30:12-08:00</updated>
+		<summary type="html">If you like greasy diners with vaguely ethnic workers yelling in orgy-borgy talk back int he kitchen... you're gonna love this place.<br /><br />It's cleaner than it's competitors....gotta give them props on&#8230;</summary>
+		<geo:long>-83.4692993164</geo:long>	
+		<geo:lat>42.3581008911</geo:lat>
+	</entry>
+</feed>
diff --git a/examples/zoomLevels.html b/examples/zoomLevels.html
new file mode 100644
index 0000000..39ca3dc
--- /dev/null
+++ b/examples/zoomLevels.html
@@ -0,0 +1,76 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 50;
+        var lat = 0;
+        var zoom = 0;
+        var map, layer;
+
+        function init(){
+            OpenLayers.DOTS_PER_INCH = 72;
+            var options = {
+
+// various ways of specifying similar things
+//                          resolutions: [1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,0.010986328125,0.0054931640625,0.00274658203125,0.00137329101],
+//                          scales: [50000000, 10000000],
+//                          maxResolution: 0.17578125,
+//                          minResolution: 0.0439453125,
+//                          maxScale: 10000000,
+//                          minScale: 50000000,
+//                          numZoomLevels: 5,
+//                          units: "dd",
+                            minResolution: "auto",
+                            minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
+                            maxResolution: "auto",
+                            maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
+                          };
+
+            map = new OpenLayers.Map( 'map' , options);
+
+
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://vmap0.tiles.osgeo.org/wms/vmap0", {layers: 'basic'});
+            map.addLayer(layer);
+
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Zoom Level</h1>
+
+    <div id="tags">
+    </div>
+
+    <p id="shortdesc">
+        This example shows the use of the resolutions layer option on a number of layer types.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        <p>
+            Set the extent of the viewable map using preset levels of scale available
+            to the user via the zoom slider bar. You can set the minimum, maximum
+            scales or resolutions, the number of levels in between and the minimum
+            and maximum geographic extents in your map's units.
+        </p>
+        <p>
+        Default units for Scale are in inches. Resolution is specified in map units
+        per pixel where the default map units are decimal degrees(dd).<br/>
+        scale = resolution * OpenLayers.INCHES_PER_UNIT[units] *
+                    OpenLayers.DOTS_PER_INCH <br/>
+        You can either set the scale or the resolution, there is no need to set both.
+        </p>
+        <p>
+          You can do it with a ...
+        </p>
+    </div>
+
+  </body>
+</html>
diff --git a/examples/zoomify.html b/examples/zoomify.html
new file mode 100644
index 0000000..d3fb305
--- /dev/null
+++ b/examples/zoomify.html
@@ -0,0 +1,70 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Zoomify Example</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="style.css" type="text/css" />
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+        var zoomify_width = 8001;
+		var zoomify_height = 6943;
+		var zoomify_url = "http://almor.mzk.cz/moll/AA22/0103/";
+
+        var map, zoomify;
+
+        function init(){
+	       /* First we initialize the zoomify pyramid (to get number of tiers) */
+	        var zoomify = new OpenLayers.Layer.Zoomify( "Zoomify", zoomify_url, 
+		  		new OpenLayers.Size( zoomify_width, zoomify_height ) );
+
+	       /* Map with raster coordinates (pixels) from Zoomify image */
+	        var options = {
+	            controls: [],
+	            maxExtent: new OpenLayers.Bounds(0, 0, zoomify_width, zoomify_height),
+	            maxResolution: Math.pow(2, zoomify.numberOfTiers-1 ),
+	            numZoomLevels: zoomify.numberOfTiers,
+	            units: 'pixels'
+	        };
+
+	        map = new OpenLayers.Map("map", options);
+	        map.addLayer(zoomify);
+
+	        map.addControl(new OpenLayers.Control.MousePosition());
+	        map.addControl(new OpenLayers.Control.PanZoomBar());
+	        map.addControl(new OpenLayers.Control.MouseDefaults());
+	        map.addControl(new OpenLayers.Control.KeyboardDefaults());
+
+            map.setBaseLayer(zoomify);
+	        map.zoomToMaxExtent();
+        };
+    </script>
+  </head>
+  <body onload="init()">
+      <h1 id="title">Zoomify Layer Example</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        Demo of a layer with Zoomify tiles.
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+	    <p>
+	    Demonstration of the Zoomify layer in OpenLayers.<br />
+	 	You can have a look at <a href="http://almor.mzk.cz/moll/AA22/103.html">Zoomify viewer for this picture</a>, which is using the same <a href="http://almor.mzk.cz/moll/AA22/0103/">tiles</a>.
+	    </p>
+		<p>
+		For change to our own image you have to specify 'url' (zoomifyImagePath in Zoomify terminology) and 'size' ('width' and 'height' from ImageProperty.xml file).<br />
+		Custom tiles can be easily generated with original <a href="http://www.zoomify.com/">Zoomify software</a> like with freely available <a href="http://www.zoomify.com/express.htm">ZoomifyerEZ</a> or with Adobe PhotoShop CS3 (it has built in support for export into Zoomify tiles).<br />
+		There is also a <a href="http://sourceforge.net/projects/zoomifyimage/">ZoomifyImage SourceForge Project</a>, a tile cutter available under GPL license.<br />
+		Zoomify tiles can be also served dynamically on the server side from JPEG2000 masters using <a href="http://dltj.org/article/introducing-j2ktilerenderer/">J2KTileRender</a> with available integration for DSpace and soon for Fedora Digital Repository.<br/>
+		<a href="http://iipimage.sourceforge.net/">IIPImage server</a> can serve Zoomify tiles dynamically from TIFF files.
+		</p>
+		<p>
+		Development of the Zoomify support for OpenLayers was supported from the grant <a href="http://www.oldmapsonline.org/">Old Maps Online</a>.
+        </p>
+    </div>
+  </body>
+</html>
diff --git a/img/blank.gif b/img/blank.gif
new file mode 100644
index 0000000..4bcc753
Binary files /dev/null and b/img/blank.gif differ
diff --git a/img/cloud-popup-relative.png b/img/cloud-popup-relative.png
new file mode 100755
index 0000000..1215a36
Binary files /dev/null and b/img/cloud-popup-relative.png differ
diff --git a/img/drag-rectangle-off.png b/img/drag-rectangle-off.png
new file mode 100644
index 0000000..fc6daf4
Binary files /dev/null and b/img/drag-rectangle-off.png differ
diff --git a/img/drag-rectangle-on.png b/img/drag-rectangle-on.png
new file mode 100644
index 0000000..7f783ce
Binary files /dev/null and b/img/drag-rectangle-on.png differ
diff --git a/img/east-mini.png b/img/east-mini.png
new file mode 100644
index 0000000..0707567
Binary files /dev/null and b/img/east-mini.png differ
diff --git a/img/layer-switcher-maximize.png b/img/layer-switcher-maximize.png
new file mode 100644
index 0000000..8d7bb16
Binary files /dev/null and b/img/layer-switcher-maximize.png differ
diff --git a/img/layer-switcher-minimize.png b/img/layer-switcher-minimize.png
new file mode 100644
index 0000000..e80bf21
Binary files /dev/null and b/img/layer-switcher-minimize.png differ
diff --git a/img/marker-blue.png b/img/marker-blue.png
new file mode 100644
index 0000000..83a90b4
Binary files /dev/null and b/img/marker-blue.png differ
diff --git a/img/marker-gold.png b/img/marker-gold.png
new file mode 100644
index 0000000..2ff9ec5
Binary files /dev/null and b/img/marker-gold.png differ
diff --git a/img/marker-green.png b/img/marker-green.png
new file mode 100644
index 0000000..17168f1
Binary files /dev/null and b/img/marker-green.png differ
diff --git a/img/marker.png b/img/marker.png
new file mode 100644
index 0000000..ccd1913
Binary files /dev/null and b/img/marker.png differ
diff --git a/img/measuring-stick-off.png b/img/measuring-stick-off.png
new file mode 100644
index 0000000..70c2dff
Binary files /dev/null and b/img/measuring-stick-off.png differ
diff --git a/img/measuring-stick-on.png b/img/measuring-stick-on.png
new file mode 100644
index 0000000..cdb8f34
Binary files /dev/null and b/img/measuring-stick-on.png differ
diff --git a/img/north-mini.png b/img/north-mini.png
new file mode 100644
index 0000000..a8a0b40
Binary files /dev/null and b/img/north-mini.png differ
diff --git a/img/panning-hand-off.png b/img/panning-hand-off.png
new file mode 100644
index 0000000..4c912ac
Binary files /dev/null and b/img/panning-hand-off.png differ
diff --git a/img/panning-hand-on.png b/img/panning-hand-on.png
new file mode 100644
index 0000000..6094c64
Binary files /dev/null and b/img/panning-hand-on.png differ
diff --git a/img/slider.png b/img/slider.png
new file mode 100644
index 0000000..23afd57
Binary files /dev/null and b/img/slider.png differ
diff --git a/img/south-mini.png b/img/south-mini.png
new file mode 100644
index 0000000..6c4ac8a
Binary files /dev/null and b/img/south-mini.png differ
diff --git a/img/west-mini.png b/img/west-mini.png
new file mode 100644
index 0000000..db5f420
Binary files /dev/null and b/img/west-mini.png differ
diff --git a/img/zoom-minus-mini.png b/img/zoom-minus-mini.png
new file mode 100644
index 0000000..f9b63ab
Binary files /dev/null and b/img/zoom-minus-mini.png differ
diff --git a/img/zoom-plus-mini.png b/img/zoom-plus-mini.png
new file mode 100644
index 0000000..eecf2eb
Binary files /dev/null and b/img/zoom-plus-mini.png differ
diff --git a/img/zoom-world-mini.png b/img/zoom-world-mini.png
new file mode 100644
index 0000000..2159dde
Binary files /dev/null and b/img/zoom-world-mini.png differ
diff --git a/img/zoombar.png b/img/zoombar.png
new file mode 100644
index 0000000..959f01a
Binary files /dev/null and b/img/zoombar.png differ
diff --git a/lib/Firebug/errorIcon.png b/lib/Firebug/errorIcon.png
new file mode 100644
index 0000000..2d75261
Binary files /dev/null and b/lib/Firebug/errorIcon.png differ
diff --git a/lib/Firebug/firebug.css b/lib/Firebug/firebug.css
new file mode 100644
index 0000000..1f041c4
--- /dev/null
+++ b/lib/Firebug/firebug.css
@@ -0,0 +1,209 @@
+
+html, body {
+    margin: 0;
+    background: #FFFFFF;
+    font-family: Lucida Grande, Tahoma, sans-serif;
+    font-size: 11px;
+    overflow: hidden;
+}
+
+a {
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+.toolbar {
+    height: 14px;
+    border-top: 1px solid ThreeDHighlight;
+    border-bottom: 1px solid ThreeDShadow;
+    padding: 2px 6px;
+    background: ThreeDFace;
+}
+
+.toolbarRight {
+    position: absolute;
+    top: 4px;
+    right: 6px;
+}
+
+#log {
+    overflow: auto;
+    position: absolute;
+    left: 0;
+    width: 100%;
+}
+
+#commandLine {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 18px;
+    border: none;
+    border-top: 1px solid ThreeDShadow;
+}
+
+/************************************************************************************************/
+
+.logRow {
+    position: relative;
+    border-bottom: 1px solid #D7D7D7;
+    padding: 2px 4px 1px 6px;
+    background-color: #FFFFFF;
+}
+
+.logRow-command {
+    font-family: Monaco, monospace;
+    color: blue;
+}
+
+.objectBox-null {
+    padding: 0 2px;
+    border: 1px solid #666666;
+    background-color: #888888;
+    color: #FFFFFF;
+}
+
+.objectBox-string {
+    font-family: Monaco, monospace;
+    color: red;
+    white-space: pre;
+}
+
+.objectBox-number {
+    color: #000088;
+}
+
+.objectBox-function {
+    font-family: Monaco, monospace;
+    color: DarkGreen;
+}
+
+.objectBox-object {
+    color: DarkGreen;
+    font-weight: bold;
+}
+
+/************************************************************************************************/
+
+.logRow-info,
+.logRow-error,
+.logRow-warning {
+    background: #FFFFFF no-repeat 2px 2px;
+    padding-left: 20px;
+    padding-bottom: 3px;
+}
+
+.logRow-info {
+    background-image: url(infoIcon.png);
+}
+
+.logRow-warning {
+    background-color: cyan;
+    background-image: url(warningIcon.png);
+}
+
+.logRow-error {
+    background-color: LightYellow;
+    background-image: url(errorIcon.png);
+}
+
+.errorMessage {
+    vertical-align: top;
+    color: #FF0000;
+}
+
+.objectBox-sourceLink {
+    position: absolute;
+    right: 4px;
+    top: 2px;
+    padding-left: 8px;
+    font-family: Lucida Grande, sans-serif;
+    font-weight: bold;
+    color: #0000FF;
+}
+
+/************************************************************************************************/
+
+.logRow-group {
+    background: #EEEEEE;
+    border-bottom: none;
+}
+
+.logGroup {
+    background: #EEEEEE;
+}
+
+.logGroupBox {
+    margin-left: 24px;
+    border-top: 1px solid #D7D7D7;
+    border-left: 1px solid #D7D7D7;
+}
+
+/************************************************************************************************/
+
+.selectorTag,
+.selectorId,
+.selectorClass {
+    font-family: Monaco, monospace;
+    font-weight: normal;
+}
+
+.selectorTag {
+    color: #0000FF;
+}
+
+.selectorId {
+    color: DarkBlue;
+}
+
+.selectorClass {
+    color: red;
+}
+
+/************************************************************************************************/
+
+.objectBox-element {
+    font-family: Monaco, monospace;
+    color: #000088;
+}
+
+.nodeChildren {
+    margin-left: 16px;
+}
+
+.nodeTag {
+    color: blue;
+}
+
+.nodeValue {
+    color: #FF0000;
+    font-weight: normal;
+}
+
+.nodeText,
+.nodeComment {
+    margin: 0 2px;
+    vertical-align: top;
+}
+
+.nodeText {
+    color: #333333;
+}
+
+.nodeComment {
+    color: DarkGreen;
+}
+
+/************************************************************************************************/
+
+.propertyNameCell {
+    vertical-align: top;
+}
+
+.propertyName {
+    font-weight: bold;
+}
diff --git a/lib/Firebug/firebug.html b/lib/Firebug/firebug.html
new file mode 100644
index 0000000..861e639
--- /dev/null
+++ b/lib/Firebug/firebug.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+    <title>Firebug</title>
+    <link rel="stylesheet" type="text/css" href="firebug.css">
+</head>
+
+<body>
+    <div id="toolbar" class="toolbar">
+        <a href="#" onclick="parent.console.clear()">Clear</a>
+        <span class="toolbarRight">
+            <a href="#" onclick="parent.console.close()">Close</a>
+        </span>
+    </div>
+    <div id="log"></div>
+    <input type="text" id="commandLine">
+    
+    <script>parent.onFirebugReady(document);</script>
+</body>
+</html>
diff --git a/lib/Firebug/firebug.js b/lib/Firebug/firebug.js
new file mode 100644
index 0000000..a6242c3
--- /dev/null
+++ b/lib/Firebug/firebug.js
@@ -0,0 +1,674 @@
+
+if (!window.console || !console.firebug) { (function()
+{
+    window.console = 
+    {
+        log: function()
+        {
+            logFormatted(arguments, "");
+        },
+        
+        debug: function()
+        {
+            logFormatted(arguments, "debug");
+        },
+        
+        info: function()
+        {
+            logFormatted(arguments, "info");
+        },
+        
+        warn: function()
+        {
+            logFormatted(arguments, "warning");
+        },
+        
+        error: function()
+        {
+            logFormatted(arguments, "error");
+        },
+        
+        assert: function(truth, message)
+        {
+            if (!truth)
+            {
+                var args = [];
+                for (var i = 1; i < arguments.length; ++i)
+                    args.push(arguments[i]);
+                
+                logFormatted(args.length ? args : ["Assertion Failure"], "error");
+                throw message ? message : "Assertion Failure";
+            }
+        },
+        
+        dir: function(object)
+        {
+            var html = [];
+                        
+            var pairs = [];
+            for (var name in object)
+            {
+                try
+                {
+                    pairs.push([name, object[name]]);
+                }
+                catch (exc)
+                {
+                }
+            }
+            
+            pairs.sort(function(a, b) { return a[0] < b[0] ? -1 : 1; });
+            
+            html.push('<table>');
+            for (var i = 0; i < pairs.length; ++i)
+            {
+                var name = pairs[i][0], value = pairs[i][1];
+                
+                html.push('<tr>', 
+                '<td class="propertyNameCell"><span class="propertyName">',
+                    escapeHTML(name), '</span></td>', '<td><span class="propertyValue">');
+                appendObject(value, html);
+                html.push('</span></td></tr>');
+            }
+            html.push('</table>');
+            
+            logRow(html, "dir");
+        },
+        
+        dirxml: function(node)
+        {
+            var html = [];
+            
+            appendNode(node, html);
+            logRow(html, "dirxml");
+        },
+        
+        group: function()
+        {
+            logRow(arguments, "group", pushGroup);
+        },
+        
+        groupEnd: function()
+        {
+            logRow(arguments, "", popGroup);
+        },
+        
+        time: function(name)
+        {
+            timeMap[name] = (new Date()).getTime();
+        },
+        
+        timeEnd: function(name)
+        {
+            if (name in timeMap)
+            {
+                var delta = (new Date()).getTime() - timeMap[name];
+                logFormatted([name+ ":", delta+"ms"]);
+                delete timeMap[name];
+            }
+        },
+        
+        count: function()
+        {
+            this.warn(["count() not supported."]);
+        },
+        
+        trace: function()
+        {
+            this.warn(["trace() not supported."]);
+        },
+        
+        profile: function()
+        {
+            this.warn(["profile() not supported."]);
+        },
+        
+        profileEnd: function()
+        {
+        },
+        
+        clear: function()
+        {
+            consoleBody.innerHTML = "";
+        },
+
+        open: function()
+        {
+            toggleConsole(true);
+        },
+        
+        close: function()
+        {
+            if (frameVisible)
+                toggleConsole();
+        }
+    };
+ 
+    // ********************************************************************************************
+       
+    var consoleFrame = null;
+    var consoleBody = null;
+    var commandLine = null;
+    
+    var frameVisible = false;
+    var messageQueue = [];
+    var groupStack = [];
+    var timeMap = {};
+    
+    var clPrefix = ">>> ";
+    
+    var isFirefox = navigator.userAgent.indexOf("Firefox") != -1;
+    var isIE = navigator.userAgent.indexOf("MSIE") != -1;
+    var isOpera = navigator.userAgent.indexOf("Opera") != -1;
+    var isSafari = navigator.userAgent.indexOf("AppleWebKit") != -1;
+
+    // ********************************************************************************************
+
+    function toggleConsole(forceOpen)
+    {
+        frameVisible = forceOpen || !frameVisible;
+        if (consoleFrame)
+            consoleFrame.style.visibility = frameVisible ? "visible" : "hidden";
+        else
+            waitForBody();
+    }
+
+    function focusCommandLine()
+    {
+        toggleConsole(true);
+        if (commandLine)
+            commandLine.focus();
+    }
+
+    function waitForBody()
+    {
+        if (document.body)
+            createFrame();
+        else
+            setTimeout(waitForBody, 200);
+    }    
+
+    function createFrame()
+    {
+        if (consoleFrame)
+            return;
+        
+        window.onFirebugReady = function(doc)
+        {
+            window.onFirebugReady = null;
+
+            var toolbar = doc.getElementById("toolbar");
+            toolbar.onmousedown = onSplitterMouseDown;
+
+            commandLine = doc.getElementById("commandLine");
+            addEvent(commandLine, "keydown", onCommandLineKeyDown);
+
+            addEvent(doc, isIE || isSafari ? "keydown" : "keypress", onKeyDown);
+            
+            consoleBody = doc.getElementById("log");
+            layout();
+            flush();
+        }
+
+        var baseURL = getFirebugURL();
+
+        consoleFrame = document.createElement("iframe");
+        consoleFrame.setAttribute("src", baseURL+"/firebug.html");
+        consoleFrame.setAttribute("frameBorder", "0");
+        consoleFrame.style.visibility = (frameVisible ? "visible" : "hidden");    
+        consoleFrame.style.zIndex = "2147483583";
+        consoleFrame.style.position = document.all ? "absolute" : "fixed";
+        consoleFrame.style.width = "100%";
+        consoleFrame.style.left = "0";
+        consoleFrame.style.bottom = "0";
+        consoleFrame.style.height = "200px";
+        document.body.appendChild(consoleFrame);
+    }
+    
+    function getFirebugURL()
+    {
+        var scripts = document.getElementsByTagName("script");
+        for (var i = 0; i < scripts.length; ++i)
+        {
+            if (scripts[i].src.indexOf("firebug.js") != -1)
+            {
+                var lastSlash = scripts[i].src.lastIndexOf("/");
+                return scripts[i].src.substr(0, lastSlash);
+            }
+        }
+    }
+    
+    function evalCommandLine()
+    {
+        var text = commandLine.value;
+        commandLine.value = "";
+
+        logRow([clPrefix, text], "command");
+        
+        var value;
+        try
+        {
+            value = eval(text);
+        }
+        catch (exc)
+        {
+        }
+
+        console.log(value);
+    }
+    
+    function layout()
+    {
+        var toolbar = consoleBody.ownerDocument.getElementById("toolbar");
+        var height = consoleFrame.offsetHeight - (toolbar.offsetHeight + commandLine.offsetHeight);
+        height = Math.max(height, 0);
+        consoleBody.style.top = toolbar.offsetHeight + "px";
+        consoleBody.style.height = height + "px";
+        
+        commandLine.style.top = (consoleFrame.offsetHeight - commandLine.offsetHeight) + "px";
+    }
+    
+    function logRow(message, className, handler)
+    {
+        if (consoleBody)
+            writeMessage(message, className, handler);
+        else
+        {
+            messageQueue.push([message, className, handler]);
+            waitForBody();
+        }
+    }
+    
+    function flush()
+    {
+        var queue = messageQueue;
+        messageQueue = [];
+        
+        for (var i = 0; i < queue.length; ++i)
+            writeMessage(queue[i][0], queue[i][1], queue[i][2]);
+    }
+
+    function writeMessage(message, className, handler)
+    {
+        var isScrolledToBottom =
+            consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight;
+
+        if (!handler)
+            handler = writeRow;
+        
+        handler(message, className);
+        
+        if (isScrolledToBottom)
+            consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight;
+    }
+    
+    function appendRow(row)
+    {
+        var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody;
+        container.appendChild(row);
+    }
+
+    function writeRow(message, className)
+    {
+        var row = consoleBody.ownerDocument.createElement("div");
+        row.className = "logRow" + (className ? " logRow-"+className : "");
+        row.innerHTML = message.join("");
+        appendRow(row);
+    }
+
+    function pushGroup(message, className)
+    {
+        logFormatted(message, className);
+
+        var groupRow = consoleBody.ownerDocument.createElement("div");
+        groupRow.className = "logGroup";
+        var groupRowBox = consoleBody.ownerDocument.createElement("div");
+        groupRowBox.className = "logGroupBox";
+        groupRow.appendChild(groupRowBox);
+        appendRow(groupRowBox);
+        groupStack.push(groupRowBox);
+    }
+
+    function popGroup()
+    {
+        groupStack.pop();
+    }
+    
+    // ********************************************************************************************
+
+    function logFormatted(objects, className)
+    {
+        var html = [];
+
+        var format = objects[0];
+        var objIndex = 0;
+
+        if (typeof(format) != "string")
+        {
+            format = "";
+            objIndex = -1;
+        }
+
+        var parts = parseFormat(format);
+        for (var i = 0; i < parts.length; ++i)
+        {
+            var part = parts[i];
+            if (part && typeof(part) == "object")
+            {
+                var object = objects[++objIndex];
+                part.appender(object, html);
+            }
+            else
+                appendText(part, html);
+        }
+
+        for (var i = objIndex+1; i < objects.length; ++i)
+        {
+            appendText(" ", html);
+            
+            var object = objects[i];
+            if (typeof(object) == "string")
+                appendText(object, html);
+            else
+                appendObject(object, html);
+        }
+        
+        logRow(html, className);
+    }
+
+    function parseFormat(format)
+    {
+        var parts = [];
+
+        var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;    
+        var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat};
+
+        for (var m = reg.exec(format); m; m = reg.exec(format))
+        {
+            var type = m[8] ? m[8] : m[5];
+            var appender = type in appenderMap ? appenderMap[type] : appendObject;
+            var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0);
+
+            parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1));
+            parts.push({appender: appender, precision: precision});
+
+            format = format.substr(m.index+m[0].length);
+        }
+
+        parts.push(format);
+
+        return parts;
+    }
+
+    function escapeHTML(value)
+    {
+        function replaceChars(ch)
+        {
+            switch (ch)
+            {
+                case "<":
+                    return "<";
+                case ">":
+                    return ">";
+                case "&":
+                    return "&";
+                case "'":
+                    return "'";
+                case '"':
+                    return """;
+            }
+            return "?";
+        };
+        return String(value).replace(/[<>&"']/g, replaceChars);
+    }
+
+    function objectToString(object)
+    {
+        try
+        {
+            return object+"";
+        }
+        catch (exc)
+        {
+            return null;
+        }
+    }
+
+    // ********************************************************************************************
+
+    function appendText(object, html)
+    {
+        html.push(escapeHTML(objectToString(object)));
+    }
+
+    function appendNull(object, html)
+    {
+        html.push('<span class="objectBox-null">', escapeHTML(objectToString(object)), '</span>');
+    }
+
+    function appendString(object, html)
+    {
+        html.push('<span class="objectBox-string">"', escapeHTML(objectToString(object)),
+            '"</span>');
+    }
+
+    function appendInteger(object, html)
+    {
+        html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+    }
+
+    function appendFloat(object, html)
+    {
+        html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+    }
+
+    function appendFunction(object, html)
+    {
+        var reName = /function ?(.*?)\(/;
+        var m = reName.exec(objectToString(object));
+        var name = m ? m[1] : "function";
+        html.push('<span class="objectBox-function">', escapeHTML(name), '()</span>');
+    }
+    
+    function appendObject(object, html)
+    {
+        try
+        {
+            if (object == undefined)
+                appendNull("undefined", html);
+            else if (object == null)
+                appendNull("null", html);
+            else if (typeof object == "string")
+                appendString(object, html);
+            else if (typeof object == "number")
+                appendInteger(object, html);
+            else if (typeof object == "function")
+                appendFunction(object, html);
+            else if (object.nodeType == 1)
+                appendSelector(object, html);
+            else if (typeof object == "object")
+                appendObjectFormatted(object, html);
+            else
+                appendText(object, html);
+        }
+        catch (exc)
+        {
+        }
+    }
+        
+    function appendObjectFormatted(object, html)
+    {
+        var text = objectToString(object);
+        var reObject = /\[object (.*?)\]/;
+
+        var m = reObject.exec(text);
+        html.push('<span class="objectBox-object">', m ? m[1] : text, '</span>')
+    }
+    
+    function appendSelector(object, html)
+    {
+        html.push('<span class="objectBox-selector">');
+
+        html.push('<span class="selectorTag">', escapeHTML(object.nodeName.toLowerCase()), '</span>');
+        if (object.id)
+            html.push('<span class="selectorId">#', escapeHTML(object.id), '</span>');
+        if (object.className)
+            html.push('<span class="selectorClass">.', escapeHTML(object.className), '</span>');
+
+        html.push('</span>');
+    }
+
+    function appendNode(node, html)
+    {
+        if (node.nodeType == 1)
+        {
+            html.push(
+                '<div class="objectBox-element">',
+                    '<<span class="nodeTag">', node.nodeName.toLowerCase(), '</span>');
+
+            for (var i = 0; i < node.attributes.length; ++i)
+            {
+                var attr = node.attributes[i];
+                if (!attr.specified)
+                    continue;
+                
+                html.push(' <span class="nodeName">', attr.nodeName.toLowerCase(),
+                    '</span>="<span class="nodeValue">', escapeHTML(attr.nodeValue),
+                    '</span>"')
+            }
+
+            if (node.firstChild)
+            {
+                html.push('></div><div class="nodeChildren">');
+
+                for (var child = node.firstChild; child; child = child.nextSibling)
+                    appendNode(child, html);
+                    
+                html.push('</div><div class="objectBox-element"></<span class="nodeTag">', 
+                    node.nodeName.toLowerCase(), '></span></div>');
+            }
+            else
+                html.push('/></div>');
+        }
+        else if (node.nodeType == 3)
+        {
+            html.push('<div class="nodeText">', escapeHTML(node.nodeValue),
+                '</div>');
+        }
+    }
+
+    // ********************************************************************************************
+    
+    function addEvent(object, name, handler)
+    {
+        if (document.all)
+            object.attachEvent("on"+name, handler);
+        else
+            object.addEventListener(name, handler, false);
+    }
+    
+    function removeEvent(object, name, handler)
+    {
+        if (document.all)
+            object.detachEvent("on"+name, handler);
+        else
+            object.removeEventListener(name, handler, false);
+    }
+    
+    function cancelEvent(event)
+    {
+        if (document.all)
+            event.cancelBubble = true;
+        else
+            event.stopPropagation();        
+    }
+
+    function onError(msg, href, lineNo)
+    {
+        var html = [];
+        
+        var lastSlash = href.lastIndexOf("/");
+        var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1);
+        
+        html.push(
+            '<span class="errorMessage">', msg, '</span>', 
+            '<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>'
+        );
+        
+        logRow(html, "error");
+    };
+
+    function onKeyDown(event)
+    {
+        if (event.keyCode == 123)
+            toggleConsole();
+        else if ((event.keyCode == 108 || event.keyCode == 76) && event.shiftKey
+                 && (event.metaKey || event.ctrlKey))
+            focusCommandLine();
+        else
+            return;
+        
+        cancelEvent(event);
+    }
+
+    function onSplitterMouseDown(event)
+    {
+        if (isSafari || isOpera)
+            return;
+        
+        addEvent(document, "mousemove", onSplitterMouseMove);
+        addEvent(document, "mouseup", onSplitterMouseUp);
+
+        for (var i = 0; i < frames.length; ++i)
+        {
+            addEvent(frames[i].document, "mousemove", onSplitterMouseMove);
+            addEvent(frames[i].document, "mouseup", onSplitterMouseUp);
+        }
+    }
+    
+    function onSplitterMouseMove(event)
+    {
+        var win = document.all
+            ? event.srcElement.ownerDocument.parentWindow
+            : event.target.ownerDocument.defaultView;
+
+        var clientY = event.clientY;
+        if (win != win.parent)
+            clientY += win.frameElement ? win.frameElement.offsetTop : 0;
+        
+        var height = consoleFrame.offsetTop + consoleFrame.clientHeight;
+        var toolbar = consoleBody.ownerDocument.getElementById("toolbar");
+        var y = Math.max(height - clientY,
+                         toolbar.offsetHeight + commandLine.offsetHeight);
+        
+        consoleFrame.style.height = y + "px";
+        layout();
+    }
+    
+    function onSplitterMouseUp(event)
+    {
+        removeEvent(document, "mousemove", onSplitterMouseMove);
+        removeEvent(document, "mouseup", onSplitterMouseUp);
+
+        for (var i = 0; i < frames.length; ++i)
+        {
+            removeEvent(frames[i].document, "mousemove", onSplitterMouseMove);
+            removeEvent(frames[i].document, "mouseup", onSplitterMouseUp);
+        }
+    }
+    
+    function onCommandLineKeyDown(event)
+    {
+        if (event.keyCode == 13)
+            evalCommandLine();
+        else if (event.keyCode == 27)
+            commandLine.value = "";
+    }
+    
+    window.onerror = onError;
+    addEvent(document, isIE || isSafari ? "keydown" : "keypress", onKeyDown);
+    
+    if (document.documentElement.getAttribute("debug") == "true")
+        toggleConsole(true);
+})();
+}
diff --git a/lib/Firebug/firebugx.js b/lib/Firebug/firebugx.js
new file mode 100644
index 0000000..4c8b30f
--- /dev/null
+++ b/lib/Firebug/firebugx.js
@@ -0,0 +1,9 @@
+
+if (!window.console || !console.firebug) {
+    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+
+    window.console = {};
+    for (var i = 0; i < names.length; ++i)
+        window.console[names[i]] = function() {}
+}
diff --git a/lib/Firebug/infoIcon.png b/lib/Firebug/infoIcon.png
new file mode 100644
index 0000000..da1e533
Binary files /dev/null and b/lib/Firebug/infoIcon.png differ
diff --git a/lib/Firebug/license.txt b/lib/Firebug/license.txt
new file mode 100644
index 0000000..ba43b75
--- /dev/null
+++ b/lib/Firebug/license.txt
@@ -0,0 +1,30 @@
+Software License Agreement (BSD License)
+
+Copyright (c) 2007, Parakey Inc.
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the
+  following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+* Neither the name of Parakey Inc. nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Parakey Inc.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/lib/Firebug/readme.txt b/lib/Firebug/readme.txt
new file mode 100644
index 0000000..1edebf5
--- /dev/null
+++ b/lib/Firebug/readme.txt
@@ -0,0 +1,13 @@
+This directory contains the source for Firebug Lite
+(http://www.getfirebug.com/lite.html).  This code is distributed with a
+BSD License, Copyright (c) 2007, Parakey Inc.  See the included license.txt
+for the full text of the license.
+
+This is a patched version of the trunk from
+http://fbug.googlecode.com/svn/trunk.
+
+Revision 36 was patched to resolve the issue described here
+http://code.google.com/p/fbug/issues/detail?id=85
+
+When this issue is resolved, Firebug Lite can be used directly - no further
+modifications are needed for OpenLayers.
\ No newline at end of file
diff --git a/lib/Firebug/warningIcon.png b/lib/Firebug/warningIcon.png
new file mode 100644
index 0000000..de51084
Binary files /dev/null and b/lib/Firebug/warningIcon.png differ
diff --git a/lib/Gears/gears_init.js b/lib/Gears/gears_init.js
new file mode 100644
index 0000000..d531a3f
--- /dev/null
+++ b/lib/Gears/gears_init.js
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2007, Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ *  3. Neither the name of Google Inc. nor the names of its contributors may be
+ *     used to endorse or promote products derived from this software without
+ *     specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Sets up google.gears.*, which is *the only* supported way to access Gears.
+ *
+ * Circumvent this file at your own risk!
+ *
+ * In the future, Gears may automatically define google.gears.* without this
+ * file. Gears may use these objects to transparently fix bugs and compatibility
+ * issues. Applications that use the code below will continue to work seamlessly
+ * when that happens.
+ */
+
+(function() {
+  // We are already defined. Hooray!
+  if (window.google && google.gears) {
+    return;
+  }
+
+  var factory = null;
+
+  // Firefox
+  if (typeof GearsFactory != 'undefined') {
+    factory = new GearsFactory();
+  } else {
+    // IE
+    try {
+      factory = new ActiveXObject('Gears.Factory');
+      // privateSetGlobalObject is only required and supported on WinCE.
+      if (factory.getBuildInfo().indexOf('ie_mobile') != -1) {
+        factory.privateSetGlobalObject(this);
+      }
+    } catch (e) {
+      // Safari
+      if ((typeof navigator.mimeTypes != 'undefined')
+           && navigator.mimeTypes["application/x-googlegears"]) {
+        factory = document.createElement("object");
+        factory.style.display = "none";
+        factory.width = 0;
+        factory.height = 0;
+        factory.type = "application/x-googlegears";
+        document.documentElement.appendChild(factory);
+      }
+    }
+  }
+
+  // *Do not* define any objects if Gears is not installed. This mimics the
+  // behavior of Gears defining the objects in the future.
+  if (!factory) {
+    return;
+  }
+
+  // Now set up the objects, being careful not to overwrite anything.
+  //
+  // Note: In Internet Explorer for Windows Mobile, you can't add properties to
+  // the window object. However, global objects are automatically added as
+  // properties of the window object in all browsers.
+  if (!window.google) {
+    google = {};
+  }
+
+  if (!google.gears) {
+    google.gears = {factory: factory};
+  }
+})();
diff --git a/lib/OpenLayers.js b/lib/OpenLayers.js
new file mode 100644
index 0000000..8b710a7
--- /dev/null
+++ b/lib/OpenLayers.js
@@ -0,0 +1,348 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD 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() {
+    /**
+     * Before creating the OpenLayers namespace, check to see if
+     * OpenLayers.singleFile is true.  This occurs if the
+     * OpenLayers/SingleFile.js script is included before this one - as is the
+     * case with single file builds.
+     */
+    var singleFile = (typeof OpenLayers == "object" && OpenLayers.singleFile);
+    
+    /**
+     * Cache for the script location returned from
+     * OpenLayers._getScriptLocation
+     */
+    var scriptLocation;
+    
+    /**
+     * Namespace: OpenLayers
+     * The OpenLayers object provides a namespace for all things OpenLayers
+     */
+    window.OpenLayers = {
+        
+        /**
+         * Property: _scriptName
+         * {String} Relative path of this script.
+         */
+        _scriptName: (!singleFile) ? "lib/OpenLayers.js" : "OpenLayers.js",
+
+        /**
+         * Function: _getScriptLocation
+         * Return the path to this script.
+         *
+         * Returns:
+         * {String} Path to this script
+         */
+        _getScriptLocation: function () {
+            if (scriptLocation != undefined) {
+                return scriptLocation;
+            }
+            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');
+                if (src) {
+                    var match = src.match(isOL);
+                    if(match) {
+                        scriptLocation = match[1];
+                        break;
+                    }
+                }
+            }
+            return scriptLocation;
+        }
+    };
+    /**
+     * 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 
+     * OpenLayers library code as it will be appended at the end of this file.
+      */
+    if(!singleFile) {
+        var jsfiles = new Array(
+            "OpenLayers/Util.js",
+            "OpenLayers/BaseTypes.js",
+            "OpenLayers/BaseTypes/Class.js",
+            "OpenLayers/BaseTypes/Bounds.js",
+            "OpenLayers/BaseTypes/Element.js",
+            "OpenLayers/BaseTypes/LonLat.js",
+            "OpenLayers/BaseTypes/Pixel.js",
+            "OpenLayers/BaseTypes/Size.js",
+            "OpenLayers/Console.js",
+            "OpenLayers/Tween.js",
+            "Rico/Corner.js",
+            "Rico/Color.js",
+            "OpenLayers/Ajax.js",
+            "OpenLayers/Events.js",
+            "OpenLayers/Request.js",
+            "OpenLayers/Request/XMLHttpRequest.js",
+            "OpenLayers/Projection.js",
+            "OpenLayers/Map.js",
+            "OpenLayers/Layer.js",
+            "OpenLayers/Icon.js",
+            "OpenLayers/Marker.js",
+            "OpenLayers/Marker/Box.js",
+            "OpenLayers/Popup.js",
+            "OpenLayers/Tile.js",
+            "OpenLayers/Tile/Image.js",
+            "OpenLayers/Tile/Image/IFrame.js",
+            "OpenLayers/Tile/WFS.js",
+            "OpenLayers/Layer/Image.js",
+            "OpenLayers/Layer/SphericalMercator.js",
+            "OpenLayers/Layer/EventPane.js",
+            "OpenLayers/Layer/FixedZoomLevels.js",
+            "OpenLayers/Layer/Google.js",
+            "OpenLayers/Layer/Google/v3.js",
+            "OpenLayers/Layer/VirtualEarth.js",
+            "OpenLayers/Layer/Yahoo.js",
+            "OpenLayers/Layer/HTTPRequest.js",
+            "OpenLayers/Layer/Grid.js",
+            "OpenLayers/Layer/MapGuide.js",
+            "OpenLayers/Layer/MapServer.js",
+            "OpenLayers/Layer/MapServer/Untiled.js",
+            "OpenLayers/Layer/KaMap.js",
+            "OpenLayers/Layer/KaMapCache.js",
+            "OpenLayers/Layer/MultiMap.js",
+            "OpenLayers/Layer/Markers.js",
+            "OpenLayers/Layer/Text.js",
+            "OpenLayers/Layer/WorldWind.js",
+            "OpenLayers/Layer/ArcGIS93Rest.js",
+            "OpenLayers/Layer/WMS.js",
+            "OpenLayers/Layer/WMS/Untiled.js",
+            "OpenLayers/Layer/WMS/Post.js",
+            "OpenLayers/Layer/WMTS.js",
+            "OpenLayers/Layer/ArcIMS.js",
+            "OpenLayers/Layer/GeoRSS.js",
+            "OpenLayers/Layer/Boxes.js",
+            "OpenLayers/Layer/XYZ.js",
+            "OpenLayers/Layer/TMS.js",
+            "OpenLayers/Layer/TileCache.js",
+            "OpenLayers/Layer/Zoomify.js",
+            "OpenLayers/Popup/Anchored.js",
+            "OpenLayers/Popup/AnchoredBubble.js",
+            "OpenLayers/Popup/Framed.js",
+            "OpenLayers/Popup/FramedCloud.js",
+            "OpenLayers/Feature.js",
+            "OpenLayers/Feature/Vector.js",
+            "OpenLayers/Feature/WFS.js",
+            "OpenLayers/Handler.js",
+            "OpenLayers/Handler/Click.js",
+            "OpenLayers/Handler/Hover.js",
+            "OpenLayers/Handler/Point.js",
+            "OpenLayers/Handler/Path.js",
+            "OpenLayers/Handler/Polygon.js",
+            "OpenLayers/Handler/Feature.js",
+            "OpenLayers/Handler/Drag.js",
+            "OpenLayers/Handler/RegularPolygon.js",
+            "OpenLayers/Handler/Box.js",
+            "OpenLayers/Handler/MouseWheel.js",
+            "OpenLayers/Handler/Keyboard.js",
+            "OpenLayers/Control.js",
+            "OpenLayers/Control/Attribution.js",
+            "OpenLayers/Control/Button.js",
+            "OpenLayers/Control/ZoomBox.js",
+            "OpenLayers/Control/ZoomToMaxExtent.js",
+            "OpenLayers/Control/DragPan.js",
+            "OpenLayers/Control/Navigation.js",
+            "OpenLayers/Control/MouseDefaults.js",
+            "OpenLayers/Control/MousePosition.js",
+            "OpenLayers/Control/OverviewMap.js",
+            "OpenLayers/Control/KeyboardDefaults.js",
+            "OpenLayers/Control/PanZoom.js",
+            "OpenLayers/Control/PanZoomBar.js",
+            "OpenLayers/Control/ArgParser.js",
+            "OpenLayers/Control/Permalink.js",
+            "OpenLayers/Control/Scale.js",
+            "OpenLayers/Control/ScaleLine.js",
+            "OpenLayers/Control/Snapping.js",
+            "OpenLayers/Control/Split.js",
+            "OpenLayers/Control/LayerSwitcher.js",
+            "OpenLayers/Control/DrawFeature.js",
+            "OpenLayers/Control/DragFeature.js",
+            "OpenLayers/Control/ModifyFeature.js",
+            "OpenLayers/Control/Panel.js",
+            "OpenLayers/Control/SelectFeature.js",
+            "OpenLayers/Control/NavigationHistory.js",
+            "OpenLayers/Control/Measure.js",
+            "OpenLayers/Control/WMSGetFeatureInfo.js",
+            "OpenLayers/Control/WMTSGetFeatureInfo.js",
+            "OpenLayers/Control/Graticule.js",
+            "OpenLayers/Control/TransformFeature.js",
+            "OpenLayers/Control/SLDSelect.js",
+            "OpenLayers/Geometry.js",
+            "OpenLayers/Geometry/Rectangle.js",
+            "OpenLayers/Geometry/Collection.js",
+            "OpenLayers/Geometry/Point.js",
+            "OpenLayers/Geometry/MultiPoint.js",
+            "OpenLayers/Geometry/Curve.js",
+            "OpenLayers/Geometry/LineString.js",
+            "OpenLayers/Geometry/LinearRing.js",        
+            "OpenLayers/Geometry/Polygon.js",
+            "OpenLayers/Geometry/MultiLineString.js",
+            "OpenLayers/Geometry/MultiPolygon.js",
+            "OpenLayers/Geometry/Surface.js",
+            "OpenLayers/Renderer.js",
+            "OpenLayers/Renderer/Elements.js",
+            "OpenLayers/Renderer/SVG.js",
+            "OpenLayers/Renderer/Canvas.js",
+            "OpenLayers/Renderer/VML.js",
+            "OpenLayers/Layer/Vector.js",
+            "OpenLayers/Layer/Vector/RootContainer.js",
+            "OpenLayers/Strategy.js",
+            "OpenLayers/Strategy/Filter.js",
+            "OpenLayers/Strategy/Fixed.js",
+            "OpenLayers/Strategy/Cluster.js",
+            "OpenLayers/Strategy/Paging.js",
+            "OpenLayers/Strategy/BBOX.js",
+            "OpenLayers/Strategy/Save.js",
+            "OpenLayers/Strategy/Refresh.js",
+            "OpenLayers/Filter.js",
+            "OpenLayers/Filter/FeatureId.js",
+            "OpenLayers/Filter/Logical.js",
+            "OpenLayers/Filter/Comparison.js",
+            "OpenLayers/Filter/Spatial.js",
+            "OpenLayers/Protocol.js",
+            "OpenLayers/Protocol/HTTP.js",
+            "OpenLayers/Protocol/SQL.js",
+            "OpenLayers/Protocol/SQL/Gears.js",
+            "OpenLayers/Protocol/WFS.js",
+            "OpenLayers/Protocol/WFS/v1.js",
+            "OpenLayers/Protocol/WFS/v1_0_0.js",
+            "OpenLayers/Protocol/WFS/v1_1_0.js",
+            "OpenLayers/Protocol/SOS.js",
+            "OpenLayers/Protocol/SOS/v1_0_0.js",
+            "OpenLayers/Layer/PointTrack.js",
+            "OpenLayers/Layer/GML.js",
+            "OpenLayers/Style.js",
+            "OpenLayers/Style2.js",
+            "OpenLayers/StyleMap.js",
+            "OpenLayers/Rule.js",
+            "OpenLayers/Format.js",
+            "OpenLayers/Format/XML.js",
+            "OpenLayers/Format/Context.js",
+            "OpenLayers/Format/ArcXML.js",
+            "OpenLayers/Format/ArcXML/Features.js",
+            "OpenLayers/Format/GML.js",
+            "OpenLayers/Format/GML/Base.js",
+            "OpenLayers/Format/GML/v2.js",
+            "OpenLayers/Format/GML/v3.js",
+            "OpenLayers/Format/Atom.js",
+            "OpenLayers/Format/KML.js",
+            "OpenLayers/Format/GeoRSS.js",
+            "OpenLayers/Format/WFS.js",
+            "OpenLayers/Format/WFSCapabilities.js",
+            "OpenLayers/Format/WFSCapabilities/v1.js",
+            "OpenLayers/Format/WFSCapabilities/v1_0_0.js",
+            "OpenLayers/Format/WFSCapabilities/v1_1_0.js",
+            "OpenLayers/Format/WFSDescribeFeatureType.js",
+            "OpenLayers/Format/WMSDescribeLayer.js",
+            "OpenLayers/Format/WMSDescribeLayer/v1_1.js",
+            "OpenLayers/Format/WKT.js",
+            "OpenLayers/Format/OSM.js",
+            "OpenLayers/Format/GPX.js",
+            "OpenLayers/Format/Filter.js",
+            "OpenLayers/Format/Filter/v1.js",
+            "OpenLayers/Format/Filter/v1_0_0.js",
+            "OpenLayers/Format/Filter/v1_1_0.js",
+            "OpenLayers/Format/SLD.js",
+            "OpenLayers/Format/SLD/v1.js",
+            "OpenLayers/Format/SLD/v1_0_0.js",
+            "OpenLayers/Format/OWSCommon/v1.js",
+            "OpenLayers/Format/OWSCommon/v1_0_0.js",
+            "OpenLayers/Format/OWSCommon/v1_1_0.js",
+            "OpenLayers/Format/CSWGetDomain.js",
+            "OpenLayers/Format/CSWGetDomain/v2_0_2.js",
+            "OpenLayers/Format/CSWGetRecords.js",
+            "OpenLayers/Format/CSWGetRecords/v2_0_2.js",
+            "OpenLayers/Format/WFST.js",
+            "OpenLayers/Format/WFST/v1.js",
+            "OpenLayers/Format/WFST/v1_0_0.js",
+            "OpenLayers/Format/WFST/v1_1_0.js",
+            "OpenLayers/Format/Text.js",
+            "OpenLayers/Format/JSON.js",
+            "OpenLayers/Format/GeoJSON.js",
+            "OpenLayers/Format/WMC.js",
+            "OpenLayers/Format/WMC/v1.js",
+            "OpenLayers/Format/WMC/v1_0_0.js",
+            "OpenLayers/Format/WMC/v1_1_0.js",
+            "OpenLayers/Format/WMSCapabilities.js",
+            "OpenLayers/Format/WMSCapabilities/v1.js",
+            "OpenLayers/Format/WMSCapabilities/v1_1.js",
+            "OpenLayers/Format/WMSCapabilities/v1_1_0.js",
+            "OpenLayers/Format/WMSCapabilities/v1_1_1.js",
+            "OpenLayers/Format/WMSCapabilities/v1_3.js",
+            "OpenLayers/Format/WMSCapabilities/v1_3_0.js",
+            "OpenLayers/Format/WMSGetFeatureInfo.js",
+            "OpenLayers/Format/SOSCapabilities.js",
+            "OpenLayers/Format/SOSCapabilities/v1_0_0.js",
+            "OpenLayers/Format/SOSGetObservation.js",
+            "OpenLayers/Format/SOSGetFeatureOfInterest.js",
+            "OpenLayers/Format/OWSContext.js",
+            "OpenLayers/Format/OWSContext/v0_3_1.js",
+            "OpenLayers/Format/WMTSCapabilities.js",
+            "OpenLayers/Format/WMTSCapabilities/v1_0_0.js",
+            "OpenLayers/Layer/WFS.js",
+            "OpenLayers/Control/GetFeature.js",
+            "OpenLayers/Control/MouseToolbar.js",
+            "OpenLayers/Control/NavToolbar.js",
+            "OpenLayers/Control/PanPanel.js",
+            "OpenLayers/Control/Pan.js",
+            "OpenLayers/Control/ZoomIn.js",
+            "OpenLayers/Control/ZoomOut.js",
+            "OpenLayers/Control/ZoomPanel.js",
+            "OpenLayers/Control/EditingToolbar.js",
+            "OpenLayers/Symbolizer.js",
+            "OpenLayers/Symbolizer/Point.js",
+            "OpenLayers/Symbolizer/Line.js",
+            "OpenLayers/Symbolizer/Polygon.js",
+            "OpenLayers/Symbolizer/Text.js",
+            "OpenLayers/Symbolizer/Raster.js",
+            "OpenLayers/Lang.js",
+            "OpenLayers/Lang/en.js"
+        ); // etc.
+
+        var agent = navigator.userAgent;
+        var docWrite = (agent.match("MSIE") || agent.match("Safari"));
+        if(docWrite) {
+            var allScriptTags = new Array(jsfiles.length);
+        }
+        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>"; 
+            } else {
+                var s = document.createElement("script");
+                s.src = host + jsfiles[i];
+                var h = document.getElementsByTagName("head").length ? 
+                           document.getElementsByTagName("head")[0] : 
+                           document.body;
+                h.appendChild(s);
+            }
+        }
+        if (docWrite) {
+            document.write(allScriptTags.join(""));
+        }
+    }
+})();
+
+/**
+ * Constant: VERSION_NUMBER
+ */
+OpenLayers.VERSION_NUMBER="OpenLayers 2.10 -- $Revision: 10721 $";
diff --git a/lib/OpenLayers/Ajax.js b/lib/OpenLayers/Ajax.js
new file mode 100644
index 0000000..479dfd2
--- /dev/null
+++ b/lib/OpenLayers/Ajax.js
@@ -0,0 +1,678 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Request/XMLHttpRequest.js
+ * @requires OpenLayers/Console.js
+ */
+
+OpenLayers.ProxyHost = "";
+//OpenLayers.ProxyHost = "examples/proxy.cgi?url=";
+
+/**
+ * Ajax reader for OpenLayers
+ *
+ *  @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 
+ *  @failure  the function to be called on failure
+ *  
+ *   example usage from a caller:
+ *  
+ *     caps: function(request) {
+ *      -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 
+ * supplied
+ *
+ */
+
+
+/**
+ * Function: OpenLayers.nullHandler
+ * @param {} request
+ */
+OpenLayers.nullHandler = function(request) {
+    OpenLayers.Console.userError(OpenLayers.i18n("unhandledRequest", {'statusText':request.statusText}));
+};
+
+/** 
+ * APIFunction: OpenLayers.loadURL
+ * Background load a document.  For more flexibility in using XMLHttpRequest,
+ *     see the <OpenLayers.Request> methods.
+ *
+ * Parameters:
+ * uri - {String} URI of source doc
+ * params - {String} or {Object} GET params. Either a string in the form
+ *     "?hello=world&foo=bar" (do not forget the leading question mark)
+ *     or an object in the form {'hello': 'world', 'foo': 'bar}
+ * caller - {Object} object which gets callbacks
+ * 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 
+ *     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
+ *     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 user friendly error message dialog).
+ *
+ * Returns:
+ * {<OpenLayers.Request.XMLHttpRequest>}  The request object. To abort loading,
+ *     call request.abort().
+ */
+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: OpenLayers.parseXMLString
+ * Parse XML into a doc structure
+ * 
+ * Parameters:
+ * text - {String} 
+ * 
+ * Returns:
+ * {?} Parsed AJAX Responsev
+ */
+OpenLayers.parseXMLString = function(text) {
+
+    //MS sucks, if the server is bad it dies
+    var index = text.indexOf('<');
+    if (index > 0) {
+        text = text.substring(index);
+    }
+
+    var ajaxResponse = OpenLayers.Util.Try(
+        function() {
+            var xmldom = new ActiveXObject('Microsoft.XMLDOM');
+            xmldom.loadXML(text);
+            return xmldom;
+        },
+        function() {
+            return new DOMParser().parseFromString(text, 'text/xml');
+        },
+        function() {
+            var req = new XMLHttpRequest();
+            req.open("GET", "data:" + "text/xml" +
+                     ";charset=utf-8," + encodeURIComponent(text), false);
+            if (req.overrideMimeType) {
+                req.overrideMimeType("text/xml");
+            }
+            req.send(null);
+            return req.responseXML;
+        }
+    );
+
+    return ajaxResponse;
+};
+
+
+/**
+ * Namespace: OpenLayers.Ajax
+ */
+OpenLayers.Ajax = {
+
+    /**
+     * Method: emptyFunction
+     */
+    emptyFunction: function () {},
+
+    /**
+     * Method: getTransport
+     * 
+     * Returns: 
+     * {Object} Transport mechanism for whichever browser we're in, or false if
+     *          none available.
+     */
+    getTransport: function() {
+        return OpenLayers.Util.Try(
+            function() {return new XMLHttpRequest();},
+            function() {return new ActiveXObject('Msxml2.XMLHTTP');},
+            function() {return new ActiveXObject('Microsoft.XMLHTTP');}
+        ) || false;
+    },
+
+    /**
+     * Property: activeRequestCount
+     * {Integer}
+     */
+    activeRequestCount: 0
+};
+
+/**
+ * Namespace: OpenLayers.Ajax.Responders
+ * {Object}
+ */
+OpenLayers.Ajax.Responders = {
+  
+    /**
+     * Property: responders
+     * {Array}
+     */
+    responders: [],
+
+    /**
+     * Method: register
+     *  
+     * Parameters:
+     * responderToAdd - {?}
+     */
+    register: function(responderToAdd) {
+        for (var i = 0; i < this.responders.length; i++){
+            if (responderToAdd == this.responders[i]){
+                return;
+            }
+        }
+        this.responders.push(responderToAdd);
+    },
+
+    /**
+     * Method: unregister
+     *  
+     * Parameters:
+     * responderToRemove - {?}
+     */
+    unregister: function(responderToRemove) {
+        OpenLayers.Util.removeItem(this.reponders, responderToRemove);
+    },
+
+    /**
+     * Method: dispatch
+     * 
+     * Parameters:
+     * callback - {?}
+     * request - {?}
+     * transport - {?}
+     */
+    dispatch: function(callback, request, transport) {
+        var responder;
+        for (var i = 0; i < this.responders.length; i++) {
+            responder = this.responders[i];
+     
+            if (responder[callback] && 
+                typeof responder[callback] == 'function') {
+                try {
+                    responder[callback].apply(responder, 
+                                              [request, transport]);
+                } catch (e) {}
+            }
+        }
+    }
+};
+
+OpenLayers.Ajax.Responders.register({
+    /** 
+     * Function: onCreate
+     */
+    onCreate: function() {
+        OpenLayers.Ajax.activeRequestCount++;
+    },
+
+    /**
+     * Function: onComplete
+     */
+     onComplete: function() {
+         OpenLayers.Ajax.activeRequestCount--;
+     }
+});
+
+/**
+ * Class: OpenLayers.Ajax.Base
+ */
+OpenLayers.Ajax.Base = OpenLayers.Class({
+      
+    /**
+     * Constructor: OpenLayers.Ajax.Base
+     * 
+     * Parameters: 
+     * options - {Object}
+     */
+    initialize: function(options) {
+        this.options = {
+            method:       'post',
+            asynchronous: true,
+            contentType:  'application/xml',
+            parameters:   ''
+        };
+        OpenLayers.Util.extend(this.options, options || {});
+        
+        this.options.method = this.options.method.toLowerCase();
+        
+        if (typeof this.options.parameters == 'string') {
+            this.options.parameters = 
+                OpenLayers.Util.getParameters(this.options.parameters);
+        }
+    }
+});
+
+/**
+ * Class: OpenLayers.Ajax.Request
+ * *Deprecated*.  Use <OpenLayers.Request> method instead.
+ *
+ * Inherit:
+ *  - <OpenLayers.Ajax.Base>
+ */
+OpenLayers.Ajax.Request = OpenLayers.Class(OpenLayers.Ajax.Base, {
+
+    /**
+     * Property: _complete
+     *
+     * {Boolean}
+     */
+    _complete: false,
+      
+    /**
+     * Constructor: OpenLayers.Ajax.Request
+     * 
+     * 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}
+     */
+    request: function(url) {
+        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;        
+        
+        if (params = OpenLayers.Util.getParameterString(params)) {
+            // when GET, append parameters to URL
+            if (this.method == 'get') {
+                this.url += ((this.url.indexOf('?') > -1) ? '&' : '?') + params;
+            } else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+                params += '&_=';
+            }
+        }
+        try {
+            var response = new OpenLayers.Ajax.Response(this);
+            if (this.options.onCreate) {
+                this.options.onCreate(response);
+            }
+            
+            OpenLayers.Ajax.Responders.dispatch('onCreate', 
+                                                this, 
+                                                response);
+    
+            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.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 && 
+                this.transport.overrideMimeType) {
+                this.onStateChange();
+            }
+        } catch (e) {
+            this.dispatchException(e);
+        }
+    },
+
+    /**
+     * Method: onStateChange
+     */
+    onStateChange: function() {
+        var readyState = this.transport.readyState;
+        if (readyState > 1 && !((readyState == 4) && this._complete)) {
+            this.respondToReadyState(this.transport.readyState);
+        }
+    },
+     
+    /**
+     * Method: setRequestHeaders
+     */
+    setRequestHeaders: function() {
+        var headers = {
+            'X-Requested-With': 'XMLHttpRequest',
+            'Accept': 'text/javascript, text/html, application/xml, text/xml, */*',
+            'OpenLayers': true
+        };
+
+        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.
+             */
+            if (this.transport.overrideMimeType &&
+                (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) {
+                headers['Connection'] = 'close';
+            }
+        }
+        // user-defined headers
+        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];
+                }
+            } else {
+                for (var i in extras) {
+                    headers[i] = extras[i];
+                }
+            }
+        }
+        
+        for (var name in headers) {
+            this.transport.setRequestHeader(name, headers[name]);
+        }
+    },
+    
+    /**
+     * Method: success
+     *
+     * Returns:
+     * {Boolean} - 
+     */
+    success: function() {
+        var status = this.getStatus();
+        return !status || (status >=200 && status < 300);
+    },
+    
+    /**
+     * Method: getStatus
+     *
+     * Returns:
+     * {Integer} - Status
+     */
+    getStatus: function() {
+        try {
+            return this.transport.status || 0;
+        } catch (e) {
+            return 0;
+        }
+    },
+
+    /**
+     * Method: respondToReadyState
+     *
+     * Parameters:
+     * readyState - {?}
+     */
+    respondToReadyState: function(readyState) {
+        var state = OpenLayers.Ajax.Request.Events[readyState];
+        var response = new OpenLayers.Ajax.Response(this);
+    
+        if (state == 'Complete') {
+            try {
+                this._complete = true;
+                (this.options['on' + response.status] ||
+                    this.options['on' + (this.success() ? 'Success' : 'Failure')] ||
+                    OpenLayers.Ajax.emptyFunction)(response);
+            } catch (e) {
+                this.dispatchException(e);
+            }
+    
+            var contentType = response.getHeader('Content-type');
+        }
+    
+        try {
+            (this.options['on' + state] || 
+             OpenLayers.Ajax.emptyFunction)(response);
+             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
+     *
+     * Returns:
+     * {?} - response header for the given name
+     */
+    getHeader: function(name) {
+        try {
+            return this.transport.getResponseHeader(name);
+        } catch (e) {
+            return null;
+        }
+    },
+
+    /**
+     * Method: dispatchException
+     * 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
+     * for the onException call.  To make sure that something
+     * gets done with this exception, only dispatch the call if there
+     * are listeners.
+     *
+     * If you explicitly want to swallow exceptions, set
+     * request.options.onException to an empty function (function(){})
+     * or register an empty function with <OpenLayers.Ajax.Responders>
+     * for onException.
+     * 
+     * Parameters:
+     * exception - {?}
+     */
+    dispatchException: function(exception) {
+        var handler = this.options.onException;
+        if(handler) {
+            // call options.onException and alert any other listeners
+            handler(this, exception);
+            OpenLayers.Ajax.Responders.dispatch('onException', this, exception);
+        } else {
+            // check if there are any other listeners
+            var listener = false;
+            var responders = OpenLayers.Ajax.Responders.responders;
+            for (var i = 0; i < responders.length; i++) {
+                if(responders[i].onException) {
+                    listener = true;
+                    break;
+                }
+            }
+            if(listener) {
+                // call all listeners
+                OpenLayers.Ajax.Responders.dispatch('onException', this, exception);
+            } else {
+                // let the exception through
+                throw exception;
+            }
+        }
+    }
+});
+
+/** 
+ * Property: Events
+ * {Array(String)}
+ */
+OpenLayers.Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+/**
+ * Class: OpenLayers.Ajax.Response
+ */
+OpenLayers.Ajax.Response = OpenLayers.Class({
+
+    /**
+     * Property: status
+     *
+     * {Integer}
+     */
+    status: 0,
+    
+
+    /**
+     * Property: statusText
+     *
+     * {String}
+     */
+    statusText: '',
+      
+    /**
+     * Constructor: OpenLayers.Ajax.Response
+     * 
+     * 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) {
+            this.status       = this.getStatus();
+            this.statusText   = this.getStatusText();
+            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
+     *
+     * Returns:
+     * {String} - statusText
+     */
+    getStatusText: function() {
+        try {
+            return this.transport.statusText || '';
+        } catch (e) {
+            return '';
+        }
+    },
+    
+    /**
+     * Method: getHeader
+     */
+    getHeader: OpenLayers.Ajax.Request.prototype.getHeader,
+    
+    /** 
+     * Method: getResponseHeader
+     *
+     * Returns:
+     * {?} - response header for given name
+     */
+    getResponseHeader: function(name) {
+        return this.transport.getResponseHeader(name);
+    }
+});
+
+
+/**
+ * Function: getElementsByTagNameNS
+ * 
+ * Parameters:
+ * parentnode - {?}
+ * nsuri - {?}
+ * nsprefix - {?}
+ * tagname - {?}
+ * 
+ * Returns:
+ * {?}
+ */
+OpenLayers.Ajax.getElementsByTagNameNS  = function(parentnode, nsuri, 
+                                                   nsprefix, tagname) {
+    var elem = null;
+    if (parentnode.getElementsByTagNameNS) {
+        elem = parentnode.getElementsByTagNameNS(nsuri, tagname);
+    } else {
+        elem = parentnode.getElementsByTagName(nsprefix + ':' + tagname);
+    }
+    return elem;
+};
+
+
+/**
+ * Function: serializeXMLToString
+ * Wrapper function around XMLSerializer, which doesn't exist/work in
+ *     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: 
+ * xmldom {XMLNode} xml dom to serialize
+ * 
+ * Returns:
+ * {?}
+ */
+OpenLayers.Ajax.serializeXMLToString = function(xmldom) {
+    var serializer = new XMLSerializer();
+    var data = serializer.serializeToString(xmldom);
+    return data;
+};
diff --git a/lib/OpenLayers/BaseTypes.js b/lib/OpenLayers/BaseTypes.js
new file mode 100644
index 0000000..e73d8bd
--- /dev/null
+++ b/lib/OpenLayers/BaseTypes.js
@@ -0,0 +1,682 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/BaseTypes/Class.js
+ * @requires OpenLayers/BaseTypes/LonLat.js
+ * @requires OpenLayers/BaseTypes/Size.js
+ * @requires OpenLayers/BaseTypes/Pixel.js
+ * @requires OpenLayers/BaseTypes/Bounds.js
+ * @requires OpenLayers/BaseTypes/Element.js
+ * @requires OpenLayers/Lang/en.js
+ * @requires OpenLayers/Console.js
+ */
+ 
+/** 
+ * Header: OpenLayers Base Types
+ * OpenLayers custom string, number and function functions are described here.
+ */
+
+/**
+ * Namespace: OpenLayers.String
+ * Contains convenience functions for string manipulation.
+ */
+OpenLayers.String = {
+
+    /**
+     * APIFunction: startsWith
+     * 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.
+     */
+    startsWith: function(str, sub) {
+        return (str.indexOf(sub) == 0);
+    },
+
+    /**
+     * 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 
+     *     trailing spaces removed.
+     */
+    trim: function(str) {
+        return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
+    },
+    
+    /**
+     * APIFunction: camelize
+     * 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
+     */
+    camelize: function(str) {
+        var oStringList = str.split('-');
+        var camelizedString = oStringList[0];
+        for (var i=1, len=oStringList.length; i<len; i++) {
+            var s = oStringList[i];
+            camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
+        }
+        return camelizedString;
+    },
+    
+    /**
+     * APIFunction: format
+     * Given a string with tokens in the form ${token}, return a string
+     *     with tokens replaced with properties from the given context
+     *     object.  Represent a literal "${" by doubling it, e.g. "${${".
+     *
+     * Parameters:
+     * template - {String} A string with tokens to be replaced.  A template
+     *     has the form "literal ${token}" where the token will be replaced
+     *     by the value of context["token"].
+     * context - {Object} An optional object with properties corresponding
+     *     to the tokens in the format string.  If no context is sent, the
+     *     window object will be used.
+     * args - {Array} Optional arguments to pass to any functions found in
+     *     the context.  If a context property is a function, the token
+     *     will be replaced by the return from the function called with
+     *     these arguments.
+     *
+     * Returns:
+     * {String} A string with tokens replaced from the context object.
+     */
+    format: function(template, context, args) {
+        if(!context) {
+            context = window;
+        }
+
+        // Example matching: 
+        // str   = ${foo.bar}
+        // match = foo.bar
+        var replacer = function(str, match) {
+            var replacement;
+
+            // Loop through all subs. Example: ${a.b.c}
+            // 0 -> replacement = context[a];
+            // 1 -> replacement = context[a][b];
+            // 2 -> replacement = context[a][b][c];
+            var subs = match.split(/\.+/);
+            for (var i=0; i< subs.length; i++) {
+                if (i == 0) {
+                    replacement = context;
+                }
+
+                replacement = replacement[subs[i]];
+            }
+
+            if(typeof replacement == "function") {
+                replacement = args ?
+                    replacement.apply(null, args) :
+                    replacement();
+            }
+
+            // If replacement is undefined, return the string 'undefined'.
+            // 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 template.replace(OpenLayers.String.tokenRegEx, replacer);
+    },
+
+    /**
+     * Property: OpenLayers.String.tokenRegEx
+     * Used to find tokens in a string.
+     * 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.
+     *
+     * Examples:
+     * (code)
+     * OpenLayers.String.isNumeric("6.02e23") // true
+     * OpenLayers.String.isNumeric("12 dozen") // false
+     * OpenLayers.String.isNumeric("4") // true
+     * OpenLayers.String.isNumeric(" 4 ") // false
+     * (end)
+     *
+     * Returns:
+     * {Boolean} String contains only a number.
+     */
+    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. 
+     */
+    numericIf: function(value) {
+        return OpenLayers.String.isNumeric(value) ? parseFloat(value) : value;
+    }
+
+};
+
+if (!String.prototype.startsWith) {
+    /**
+     * APIMethod: String.startsWith
+     * *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.
+     */
+    String.prototype.startsWith = function(sStart) {
+        OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
+                                {'newMethod':'OpenLayers.String.startsWith'}));
+        return OpenLayers.String.startsWith(this, sStart);
+    };
+}
+
+if (!String.prototype.contains) {
+    /**
+     * 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.
+     */
+    String.prototype.contains = function(str) {
+        OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
+                                  {'newMethod':'OpenLayers.String.contains'}));
+        return OpenLayers.String.contains(this, str);
+    };
+}
+
+if (!String.prototype.trim) {
+    /**
+     * APIMethod: String.trim
+     * *Deprecated*. Removes leading and trailing whitespace characters from a string.
+     * 
+     * Returns:
+     * {String} A trimmed version of the string - all leading and 
+     *          trailing spaces removed
+     */
+    String.prototype.trim = function() {
+        OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
+                                      {'newMethod':'OpenLayers.String.trim'}));
+        return OpenLayers.String.trim(this);
+    };
+}
+
+if (!String.prototype.camelize) {
+    /**
+     * APIMethod: String.camelize
+     * *Deprecated*. Camel-case a hyphenated string. 
+     *     Ex. "chicken-head" becomes "chickenHead", and
+     *     "-chicken-head" becomes "ChickenHead".
+     * 
+     * Returns:
+     * {String} The string, camelized
+     */
+    String.prototype.camelize = function() {
+        OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
+                                  {'newMethod':'OpenLayers.String.camelize'}));
+        return OpenLayers.String.camelize(this);
+    };
+}
+
+/**
+ * Namespace: OpenLayers.Number
+ * Contains convenience functions for manipulating numbers.
+ */
+OpenLayers.Number = {
+
+    /**
+     * Property: decimalSeparator
+     * 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.
+     */
+    limitSigDigs: function(num, sig) {
+        var fig = 0;
+        if (sig > 0) {
+            fig = parseFloat(num.toPrecision(sig));
+        }
+        return fig;
+    },
+    
+    /**
+     * APIFunction: format
+     * Formats a number for output.
+     * 
+     * Parameters:
+     * num  - {Float}
+     * dec  - {Integer} Number of decimal places to round to.
+     *        Defaults to 0. Set to null to leave decimal places unchanged.
+     * tsep - {String} Thousands separator.
+     *        Default is ",".
+     * dsep - {String} Decimal separator.
+     *        Default is ".".
+     *
+     * Returns:
+     * {String} A string representing the formatted number.
+     */
+    format: function(num, dec, tsep, dsep) {
+        dec = (typeof dec != "undefined") ? dec : 0; 
+        tsep = (typeof tsep != "undefined") ? tsep :
+            OpenLayers.Number.thousandsSeparator; 
+        dsep = (typeof dsep != "undefined") ? dsep :
+            OpenLayers.Number.decimalSeparator;
+
+        if (dec != null) {
+            num = parseFloat(num.toFixed(dec));
+        }
+
+        var parts = num.toString().split(".");
+        if (parts.length == 1 && dec == null) {
+            // 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 str;
+        if (dec == 0) {
+            str = integer;
+        } else {
+            var rem = parts.length > 1 ? parts[1] : "0";
+            if (dec != null) {
+                rem = rem + new Array(dec - rem.length + 1).join("0");
+            }
+            str = integer + dsep + rem;
+        }
+        return str;
+    }
+};
+
+if (!Number.prototype.limitSigDigs) {
+    /**
+     * 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
+     */
+    Number.prototype.limitSigDigs = function(sig) {
+        OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
+                              {'newMethod':'OpenLayers.Number.limitSigDigs'}));
+        return OpenLayers.Number.limitSigDigs(this, sig);
+    };
+}
+
+/**
+ * Namespace: OpenLayers.Function
+ * Contains convenience functions for function manipulation.
+ */
+OpenLayers.Function = {
+    /**
+     * 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.
+     */
+    bind: function(func, object) {
+        // create a reference to all arguments past the second one
+        var args = Array.prototype.slice.apply(arguments, [2]);
+        return function() {
+            // Push on any additional arguments from the actual function call.
+            // These will come after those sent to the bind call.
+            var newArgs = args.concat(
+                Array.prototype.slice.apply(arguments, [0])
+            );
+            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. 
+     * 
+     * Parameters:
+     * func - {Function} Input function to serve as an event listener.
+     * object - {Object} A reference to this.
+     * 
+     * Returns:
+     * {Function}
+     */
+    bindAsEventListener: function(func, object) {
+        return function(event) {
+            return func.call(object, event || window.event);
+        };
+    },
+    
+    /**
+     * APIFunction: False
+     * A simple function to that just does "return false". We use this to 
+     * avoid attaching anonymous functions to DOM event handlers, which 
+     * causes "issues" on IE<8.
+     * 
+     * Usage:
+     * document.onclick = OpenLayers.Function.False;
+     * 
+     * Returns:
+     * {Boolean}
+     */
+    False : function() {
+        return false;
+    },
+
+    /**
+     * APIFunction: True
+     * A simple function to that just does "return true". We use this to 
+     * avoid attaching anonymous functions to DOM event handlers, which 
+     * causes "issues" on IE<8.
+     * 
+     * Usage:
+     * document.onclick = OpenLayers.Function.True;
+     * 
+     * Returns:
+     * {Boolean}
+     */
+    True : function() {
+        return true;
+    }
+};
+
+if (!Function.prototype.bind) {
+    /**
+     * APIMethod: Function.bind
+     * *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.
+     */
+    Function.prototype.bind = function() {
+        OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
+                                {'newMethod':'OpenLayers.Function.bind'}));
+        // new function takes the same arguments with this function up front
+        Array.prototype.unshift.apply(arguments, [this]);
+        return OpenLayers.Function.bind.apply(null, arguments);
+    };
+}
+
+if (!Function.prototype.bindAsEventListener) {
+    /**
+     * APIMethod: Function.bindAsEventListener
+     * *Deprecated*. Bind a function to an object, and configure it to receive the
+     *     event object as first parameter when called. 
+     * 
+     * Parameters:
+     * object - {Object} A reference to this.
+     * 
+     * Returns:
+     * {Function}
+     */
+    Function.prototype.bindAsEventListener = function(object) {
+        OpenLayers.Console.warn(OpenLayers.i18n("methodDeprecated",
+                        {'newMethod':'OpenLayers.Function.bindAsEventListener'}));
+        return OpenLayers.Function.bindAsEventListener(this, object);
+    };
+}
+
+/**
+ * Namespace: OpenLayers.Array
+ * Contains convenience functions for array manipulation.
+ */
+OpenLayers.Array = {
+
+    /**
+     * APIMethod: filter
+     * Filter an array.  Provides the functionality of the
+     *     Array.prototype.filter extension to the ECMA-262 standard.  Where
+     *     available, Array.prototype.filter will be used.
+     *
+     * Based on well known example from http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/filter
+     *
+     * Parameters:
+     * array - {Array} The array to be filtered.  This array is not mutated.
+     *     Elements added to this array by the callback will not be visited.
+     * callback - {Function} A function that is called for each element in
+     *     the array.  If this function returns true, the element will be
+     *     included in the return.  The function will be called with three
+     *     arguments: the element in the array, the index of that element, and
+     *     the array itself.  If the optional caller parameter is specified
+     *     the callback will be called with this set to caller.
+     * caller - {Object} Optional object to be set as this when the callback
+     *     is called.
+     *
+     * Returns:
+     * {Array} An array of elements from the passed in array for which the
+     *     callback returns true.
+     */
+    filter: function(array, callback, caller) {
+        var selected = [];
+        if (Array.prototype.filter) {
+            selected = array.filter(callback, caller);
+        } else {
+            var len = array.length;
+            if (typeof callback != "function") {
+                throw new TypeError();
+            }
+            for(var i=0; i<len; i++) {
+                if (i in array) {
+                    var val = array[i];
+                    if (callback.call(caller, val, i, array)) {
+                        selected.push(val);
+                    }
+                }
+            }        
+        }
+        return selected;
+    }
+    
+};
+
+/**
+ * Namespace: OpenLayers.Date
+ * Contains implementations of Date.parse and date.toISOString that match the 
+ *     ECMAScript 5 specification for parsing RFC 3339 dates.
+ *     http://tools.ietf.org/html/rfc3339
+ */
+OpenLayers.Date = {
+    
+    /**
+     * APIMethod: toISOString
+     * Generates a string representing a date.  The format of the string follows 
+     *     the profile of ISO 8601 for date and time on the Internet (see 
+     *     http://tools.ietf.org/html/rfc3339).  If the toISOString method is 
+     *     available on the Date prototype, that is used.  The toISOString
+     *     method for Date instances is defined in ECMA-262.
+     *
+     * Parameters:
+     * date - {Date} A date object.
+     *
+     * Returns:
+     * {String} A string representing the date (e.g. 
+     *     "2010-08-07T16:58:23.123Z").  If the date does not have a valid time
+     *     (i.e. isNaN(date.getTime())) this method returns the string "Invalid
+     *     Date".  The ECMA standard says the toISOString method should throw
+     *     RangeError in this case, but Firefox returns a string instead.  For
+     *     best results, use isNaN(date.getTime()) to determine date validity
+     *     before generating date strings.  
+     */
+    toISOString: (function() {
+        if ("toISOString" in Date.prototype) {
+            return function(date) {
+                return date.toISOString();
+            }
+        } else {
+            function pad(num, len) {
+                var str = num + "";
+                while (str.length < len) {
+                    str = "0" + str;
+                }
+                return str;
+            }
+            return function(date) {
+                var str;
+                if (isNaN(date.getTime())) {
+                    // ECMA-262 says throw RangeError, Firefox returns 
+                    // "Invalid Date"
+                    str = "Invalid Date";
+                } else {
+                    str = 
+                        date.getUTCFullYear() + "-" +
+                        pad(date.getUTCMonth() + 1, 2) + "-" +
+                        pad(date.getUTCDate(), 2) + "T" +
+                        pad(date.getUTCHours(), 2) + ":" +
+                        pad(date.getUTCMinutes(), 2) + ":" +
+                        pad(date.getUTCSeconds(), 2) + "." +
+                        pad(date.getUTCMilliseconds(), 3) + "Z";
+                }
+                return str;
+            }
+        }
+
+    })(),
+    
+    /**
+     * APIMethod: parse
+     * Generate a date object from a string.  The format for the string follows
+     *     the profile of ISO 8601 for date and time on the Internet (see 
+     *     http://tools.ietf.org/html/rfc3339).  If the parse method on 
+     *     the Date constructor returns a valid date for the given string,
+     *     that method is used.
+     *
+     * Parameters:
+     * str - {String} A string representing the date (e.g. 
+     *     "2010", "2010-08", "2010-08-07", "2010-08-07T16:58:23.123Z",
+     *     "2010-08-07T11:58:23.123-06").
+     * 
+     * Returns:
+     * {Date} A date object.  If the string could not be parsed, an invalid
+     *     date is returned (i.e. isNaN(date.getTime())).
+     */
+    parse: function(str) {
+        var date;
+        // first check if the native parse method can parse it
+        var elapsed = Date.parse(str);
+        if (!isNaN(elapsed)) {
+            date = new Date(elapsed);
+        } else {
+            var match = str.match(/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{1,2}):(\d{2}):(\d{2}(?:\.\d+)?)(Z|(?:[+-]\d{1,2}(?::(\d{2}))?)))?$/);
+            var date;
+            if (match && (match[1] || match[7])) { // must have at least year or time
+                var year = parseInt(match[1], 10) || 0;
+                var month = (parseInt(match[2], 10) - 1) || 0;
+                var day = parseInt(match[3], 10) || 1;
+                date = new Date(Date.UTC(year, month, day));
+                // optional time
+                var type = match[7];
+                if (type) {
+                    var hours = parseInt(match[4], 10);
+                    var minutes = parseInt(match[5], 10);
+                    var secFrac = parseFloat(match[6]);
+                    var seconds = secFrac | 0;
+                    var milliseconds = Math.round(1000 * (secFrac - seconds));
+                    date.setUTCHours(hours, minutes, seconds, milliseconds);
+                    // check offset
+                    if (type !== "Z") {
+                        var hoursOffset = parseInt(type, 10);
+                        var minutesOffset = parseInt(match[8]) || 0;
+                        var offset = -1000 * (60 * (hoursOffset * 60) + minutesOffset * 60);
+                        date = new Date(date.getTime() + offset);
+                    }
+                }
+            } else {
+                date = new Date("invalid");
+            }
+        }
+        return date;
+    }
+
+};
\ No newline at end of file
diff --git a/lib/OpenLayers/BaseTypes/Bounds.js b/lib/OpenLayers/BaseTypes/Bounds.js
new file mode 100644
index 0000000..9412807
--- /dev/null
+++ b/lib/OpenLayers/BaseTypes/Bounds.js
@@ -0,0 +1,681 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Bounds
+ * 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));
+ * > bounds.extend(new OpenLayers.LonLat(5,6));
+ * > bounds.toBBOX(); // returns 4,5,5,6
+ */
+OpenLayers.Bounds = OpenLayers.Class({
+
+    /**
+     * Property: left
+     * {Number} Minimum horizontal coordinate.
+     */
+    left: null,
+
+    /**
+     * Property: bottom
+     * {Number} Minimum vertical coordinate.
+     */
+    bottom: null,
+
+    /**
+     * Property: right
+     * {Number} Maximum horizontal coordinate.
+     */
+    right: null,
+
+    /**
+     * Property: top
+     * {Number} Maximum vertical coordinate.
+     */
+    top: null,
+    
+    /**
+     * Property: centerLonLat
+     * {<OpenLayers.LonLat>} A cached center location.  This should not be
+     *     accessed directly.  Use <getCenterLonLat> instead.
+     */
+    centerLonLat: null,
+
+    /**
+     * Constructor: OpenLayers.Bounds
+     * Construct a new bounds object.
+     *
+     * Parameters:
+     * left - {Number} The left bounds of the box.  Note that for width
+     *        calculations, this is assumed to be less than the right value.
+     * bottom - {Number} The bottom bounds of the box.  Note that for height
+     *          calculations, this is assumed to be more than the top value.
+     * right - {Number} The right bounds.
+     * top - {Number} The top bounds.
+     */
+    initialize: function(left, bottom, right, top) {
+        if (left != null) {
+            this.left = OpenLayers.Util.toFloat(left);
+        }
+        if (bottom != null) {
+            this.bottom = OpenLayers.Util.toFloat(bottom);
+        }
+        if (right != null) {
+            this.right = OpenLayers.Util.toFloat(right);
+        }
+        if (top != null) {
+            this.top = OpenLayers.Util.toFloat(top);
+        }
+    },
+
+    /**
+     * Method: clone
+     * Create a cloned instance of this bounds.
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>} A fresh copy of the bounds
+     */
+    clone:function() {
+        return new OpenLayers.Bounds(this.left, this.bottom, 
+                                     this.right, this.top);
+    },
+
+    /**
+     * Method: equals
+     * Test a two bounds for equivalence.
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     *
+     * Returns:
+     * {Boolean} The passed-in bounds object has the same left,
+     *           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) && 
+                      (this.right == bounds.right) &&
+                      (this.top == bounds.top) && 
+                      (this.bottom == bounds.bottom));
+        }
+        return equals;
+    },
+
+    /** 
+     * APIMethod: toString
+     * 
+     * Returns:
+     * {String} String representation of bounds object. 
+     *          (ex.<i>"left-bottom=(5,42) right-top=(10,45)"</i>)
+     */
+    toString:function() {
+        return ( "left-bottom=(" + this.left + "," + this.bottom + ")"
+                 + " right-top=(" + this.right + "," + this.top + ")" );
+    },
+
+    /**
+     * APIMethod: toArray
+     *
+     * Parameters:
+     * reverseAxisOrder - {Boolean} Should we reverse the axis order?
+     *
+     * Returns:
+     * {Array} array of left, bottom, right, top
+     */
+    toArray: function(reverseAxisOrder) {
+        if (reverseAxisOrder === true) {
+            return [this.bottom, this.left, this.top, this.right];
+        } else {
+            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
+     * reverseAxisOrder - {Boolean} Should we reverse the axis order?
+     * 
+     * Returns:
+     * {String} Simple String representation of bounds object.
+     *          (ex. <i>"5,42,10,45"</i>)
+     */
+    toBBOX:function(decimal, reverseAxisOrder) {
+        if (decimal== null) {
+            decimal = 6; 
+        }
+        var mult = Math.pow(10, decimal);
+        var xmin = Math.round(this.left * mult) / mult;
+        var ymin = Math.round(this.bottom * mult) / mult;
+        var xmax = Math.round(this.right * mult) / mult;
+        var ymax = Math.round(this.top * mult) / mult;
+        if (reverseAxisOrder === true) {
+            return ymin + "," + xmin + "," + ymax + "," + xmax;
+        } else {
+            return xmin + "," + ymin + "," + xmax + "," + ymax;
+        }
+    },
+ 
+    /**
+     * APIMethod: toGeometry
+     * Create a new polygon geometry based on this bounds.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Polygon>} A new polygon with the coordinates
+     *     of this bounds.
+     */
+    toGeometry: function() {
+        return new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(this.left, this.bottom),
+                new OpenLayers.Geometry.Point(this.right, this.bottom),
+                new OpenLayers.Geometry.Point(this.right, this.top),
+                new OpenLayers.Geometry.Point(this.left, this.top)
+            ])
+        ]);
+    },
+    
+    /**
+     * APIMethod: getWidth
+     * 
+     * Returns:
+     * {Float} The width of the bounds
+     */
+    getWidth:function() {
+        return (this.right - this.left);
+    },
+
+    /**
+     * APIMethod: getHeight
+     * 
+     * Returns:
+     * {Float} The height of the bounds (top minus bottom).
+     */
+    getHeight:function() {
+        return (this.top - this.bottom);
+    },
+
+    /**
+     * APIMethod: getSize
+     * 
+     * Returns:
+     * {<OpenLayers.Size>} The size of the box.
+     */
+    getSize:function() {
+        return new OpenLayers.Size(this.getWidth(), this.getHeight());
+    },
+
+    /**
+     * APIMethod: getCenterPixel
+     * 
+     * Returns:
+     * {<OpenLayers.Pixel>} The center of the bounds in pixel space.
+     */
+    getCenterPixel:function() {
+        return new OpenLayers.Pixel( (this.left + this.right) / 2,
+                                     (this.bottom + this.top) / 2);
+    },
+
+    /**
+     * APIMethod: getCenterLonLat
+     * 
+     * Returns:
+     * {<OpenLayers.LonLat>} The center of the bounds in map space.
+     */
+    getCenterLonLat:function() {
+        if(!this.centerLonLat) {
+            this.centerLonLat = new OpenLayers.LonLat(
+                (this.left + this.right) / 2, (this.bottom + this.top) / 2
+            );
+        }
+        return this.centerLonLat;
+    },
+
+    /**
+     * Method: scale
+     * Scales the bounds around a pixel or lonlat. Note that the new 
+     *     bounds may return non-integer properties, even if a pixel
+     *     is passed. 
+     * 
+     * Parameters:
+     * ratio - {Float} 
+     * origin - {<OpenLayers.Pixel> or <OpenLayers.LonLat>}
+     *          Default is center.
+     *
+     * Returns:
+     * {<OpenLayers.Bound>} A new bounds that is scaled by ratio
+     *                      from origin.
+     */
+
+    scale: function(ratio, origin){
+        if(origin == null){
+            origin = this.getCenterLonLat();
+        }
+        
+        var origx,origy;
+
+        // get origin coordinates
+        if(origin.CLASS_NAME == "OpenLayers.LonLat"){
+            origx = origin.lon;
+            origy = origin.lat;
+        } else {
+            origx = origin.x;
+            origy = origin.y;
+        }
+
+        var left = (this.left - origx) * ratio + origx;
+        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.
+     */
+    add:function(x, y) {
+        if ( (x == null) || (y == null) ) {
+            var msg = OpenLayers.i18n("boundsAddError");
+            OpenLayers.Console.error(msg);
+            return null;
+        }
+        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: 
+     * object - {Object} Can be LonLat, Point, or Bounds
+     */
+    extend:function(object) {
+        var bounds = null;
+        if (object) {
+            // clear cached center location
+            switch(object.CLASS_NAME) {
+                case "OpenLayers.LonLat":    
+                    bounds = new OpenLayers.Bounds(object.lon, object.lat,
+                                                    object.lon, object.lat);
+                    break;
+                case "OpenLayers.Geometry.Point":
+                    bounds = new OpenLayers.Bounds(object.x, object.y,
+                                                    object.x, object.y);
+                    break;
+                    
+                case "OpenLayers.Bounds":    
+                    bounds = object;
+                    break;
+            }
+    
+            if (bounds) {
+                this.centerLonLat = null;
+                if ( (this.left == null) || (bounds.left < this.left)) {
+                    this.left = bounds.left;
+                }
+                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) ) { 
+                    this.top = bounds.top;
+                }
+            }
+        }
+    },
+
+    /**
+     * APIMethod: containsLonLat
+     * 
+     * Parameters:
+     * ll - {<OpenLayers.LonLat>}
+     * inclusive - {Boolean} Whether or not to include the border.
+     *     Default is true.
+     *
+     * Returns:
+     * {Boolean} The passed-in lonlat is within this bounds.
+     */
+    containsLonLat:function(ll, inclusive) {
+        return this.contains(ll.lon, ll.lat, inclusive);
+    },
+
+    /**
+     * APIMethod: containsPixel
+     * 
+     * Parameters:
+     * px - {<OpenLayers.Pixel>}
+     * inclusive - {Boolean} Whether or not to include the border. Default is
+     *     true.
+     *
+     * Returns:
+     * {Boolean} The passed-in pixel is within this bounds.
+     */
+    containsPixel:function(px, inclusive) {
+        return this.contains(px.x, px.y, inclusive);
+    },
+    
+    /**
+     * APIMethod: contains
+     * 
+     * Parameters:
+     * x - {Float}
+     * y - {Float}
+     * inclusive - {Boolean} Whether or not to include the border. Default is
+     *     true.
+     *
+     * Returns:
+     * {Boolean} Whether or not the passed-in coordinates are within this
+     *     bounds.
+     */
+    contains:function(x, y, inclusive) {
+        //set default
+        if (inclusive == null) {
+            inclusive = true;
+        }
+
+        if (x == null || y == null) {
+            return false;
+        }
+
+        x = OpenLayers.Util.toFloat(x);
+        y = OpenLayers.Util.toFloat(y);
+
+        var contains = false;
+        if (inclusive) {
+            contains = ((x >= this.left) && (x <= this.right) && 
+                        (y >= this.bottom) && (y <= this.top));
+        } else {
+            contains = ((x > this.left) && (x < this.right) && 
+                        (y > this.bottom) && (y < this.top));
+        }              
+        return contains;
+    },
+
+    /**
+     * APIMethod: intersectsBounds
+     * 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
+     *     is true.  If false, bounds that do not overlap but only touch at the
+     *     border will not be considered as intersecting.
+     *
+     * Returns:
+     * {Boolean} The passed-in bounds object intersects this bounds.
+     */
+    intersectsBounds:function(bounds, inclusive) {
+        if (inclusive == null) {
+            inclusive = true;
+        }
+        var intersects = false;
+        var mightTouch = (
+            this.left == bounds.right ||
+            this.right == bounds.left ||
+            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) {
+            // otherwise, if one of the boundaries even partially contains another,
+            // inclusive of the edges, then they do intersect.
+            var inBottom = (
+                ((bounds.bottom >= this.bottom) && (bounds.bottom <= this.top)) ||
+                ((this.bottom >= bounds.bottom) && (this.bottom <= bounds.top))
+            );
+            var inTop = (
+                ((bounds.top >= this.bottom) && (bounds.top <= this.top)) ||
+                ((this.top > bounds.bottom) && (this.top < bounds.top))
+            );
+            var inLeft = (
+                ((bounds.left >= this.left) && (bounds.left <= this.right)) ||
+                ((this.left >= bounds.left) && (this.left <= bounds.right))
+            );
+            var inRight = (
+                ((bounds.right >= this.left) && (bounds.right <= this.right)) ||
+                ((this.right >= bounds.left) && (this.right <= bounds.right))
+            );
+            intersects = ((inBottom || inTop) && (inLeft || inRight));
+        }
+        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 false, the
+     *     entire target bounds must be contained within this bounds.
+     * inclusive - {Boolean} Treat shared edges as contained.  Default is
+     *     true.
+     *
+     * Returns:
+     * {Boolean} The passed-in bounds object is contained within this bounds. 
+     */
+    containsBounds:function(bounds, partial, inclusive) {
+        if (partial == null) {
+            partial = false;
+        }
+        if (inclusive == null) {
+            inclusive = true;
+        }
+        var bottomLeft  = this.contains(bounds.left, bounds.bottom, inclusive);
+        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; 
+    },
+    
+    /**
+     * APIMethod: transform
+     * Transform the Bounds object from source to dest. 
+     *
+     * Parameters: 
+     * source - {<OpenLayers.Projection>} Source projection. 
+     * dest   - {<OpenLayers.Projection>} Destination projection. 
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>} Itself, for use in chaining operations.
+     */
+    transform: function(source, dest) {
+        // clear cached center location
+        this.centerLonLat = null;
+        var ll = OpenLayers.Projection.transform(
+            {'x': this.left, 'y': this.bottom}, source, dest);
+        var lr = OpenLayers.Projection.transform(
+            {'x': this.right, 'y': this.bottom}, source, dest);
+        var ul = OpenLayers.Projection.transform(
+            {'x': this.left, 'y': this.top}, source, dest);
+        var ur = OpenLayers.Projection.transform(
+            {'x': this.right, 'y': this.top}, source, dest);
+        this.left   = Math.min(ll.x, ul.x);
+        this.bottom = Math.min(ll.y, lr.y);
+        this.right  = Math.max(lr.x, ur.x);
+        this.top    = Math.max(ul.y, ur.y);
+        return this;
+    },
+
+    /**
+     * 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 
+     *                                            bound.
+     *                                            Default is 0.
+     *                    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 
+     *                       merely a copy of this one.
+     */
+    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 ) { 
+                newBounds = newBounds.add(maxExtent.getWidth(), 0);
+           }
+
+           //shift left?
+           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 
+ *     parameter string
+ * 
+ * Parameters: 
+ * str - {String}Comma-separated bounds string. (ex. <i>"5,42,10,45"</i>)
+ * 
+ * Returns:
+ * {<OpenLayers.Bounds>} New bounds object built from the 
+ *                       passed-in String.
+ */
+OpenLayers.Bounds.fromString = function(str) {
+    var bounds = str.split(",");
+    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>)
+ *
+ * Returns:
+ * {<OpenLayers.Bounds>} New bounds object built from the passed-in Array.
+ */
+OpenLayers.Bounds.fromArray = function(bbox) {
+    return new OpenLayers.Bounds(parseFloat(bbox[0]),
+                                 parseFloat(bbox[1]),
+                                 parseFloat(bbox[2]),
+                                 parseFloat(bbox[3]));
+};
+
+/** 
+ * APIFunction: fromSize
+ * Alternative constructor that builds a new OpenLayers.Bounds
+ *     from a size
+ * 
+ * Parameters:
+ * size - {<OpenLayers.Size>} 
+ *
+ * Returns:
+ * {<OpenLayers.Bounds>} New bounds object built from the passed-in size.
+ */
+OpenLayers.Bounds.fromSize = function(size) {
+    return new OpenLayers.Bounds(0,
+                                 size.h,
+                                 size.w,
+                                 0);
+};
+
+/**
+ * Function: oppositeQuadrant
+ * Get the opposite quadrant for a given quadrant string.
+ *
+ * Parameters:
+ * 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 
+ *          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;
+};
diff --git a/lib/OpenLayers/BaseTypes/Class.js b/lib/OpenLayers/BaseTypes/Class.js
new file mode 100644
index 0000000..5145fef
--- /dev/null
+++ b/lib/OpenLayers/BaseTypes/Class.js
@@ -0,0 +1,116 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * 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 
+ *     will be removed.
+ * 
+ * To create a new OpenLayers-style class, use the following syntax:
+ * > var MyClass = OpenLayers.Class(prototype);
+ *
+ * To create a new OpenLayers-style class with multiple inheritance, use the
+ *     following syntax:
+ * > var MyClass = OpenLayers.Class(Class1, Class2, prototype);
+ * Note that instanceof reflection will only reveil Class1 as superclass.
+ * Class2 ff are mixins.
+ *
+ */
+OpenLayers.Class = function() {
+    var Class = function() {
+        /**
+         * This following condition can be removed at 3.0 - this is only for
+         * backwards compatibility while the Class.inherit method is still
+         * in use.  So at 3.0, the following three lines would be replaced with
+         * simply:
+         * this.initialize.apply(this, arguments);
+         */
+        if (arguments && arguments[0] != OpenLayers.Class.isPrototype) {
+            this.initialize.apply(this, arguments);
+        }
+    };
+    var extended = {};
+    var parent, initialize, Type;
+    for(var i=0, len=arguments.length; i<len; ++i) {
+        Type = arguments[i];
+        if(typeof Type == "function") {
+            // make the class passed as the first argument the superclass
+            if(i == 0 && len > 1) {
+                initialize = Type.prototype.initialize;
+                // replace the initialize method with an empty function,
+                // because we do not want to create a real instance here
+                Type.prototype.initialize = function() {};
+                // the line below makes sure that the new class has a
+                // superclass
+                extended = new Type();
+                // restore the original initialize method
+                if(initialize === undefined) {
+                    delete Type.prototype.initialize;
+                } else {
+                    Type.prototype.initialize = initialize;
+                }
+            }
+            // get the prototype of the superclass
+            parent = Type.prototype;
+        } else {
+            // in this case we're extending with the prototype
+            parent = Type;
+        }
+        OpenLayers.Util.extend(extended, parent);
+    }
+    Class.prototype = extended;
+    return Class;
+};
+
+/**
+ * Property: isPrototype
+ * *Deprecated*.  This is no longer needed and will be removed at 3.0.
+ */
+OpenLayers.Class.isPrototype = function () {};
+
+/**
+ * APIFunction: OpenLayers.create
+ * *Deprecated*.  Old method to create an OpenLayers style class.  Use the
+ *     <OpenLayers.Class> constructor instead.
+ *
+ * Returns:
+ * An OpenLayers class
+ */
+OpenLayers.Class.create = function() {
+    return function() {
+        if (arguments && arguments[0] != OpenLayers.Class.isPrototype) {
+            this.initialize.apply(this, arguments);
+        }
+    };
+};
+
+
+/**
+ * APIFunction: inherit
+ * *Deprecated*.  Old method to inherit from one or more OpenLayers style
+ *     classes.  Use the <OpenLayers.Class> constructor instead.
+ *
+ * Parameters:
+ * class - One or more classes can be provided as arguments
+ *
+ * Returns:
+ * An object prototype
+ */
+OpenLayers.Class.inherit = function () {
+    var superClass = arguments[0];
+    var proto = new superClass(OpenLayers.Class.isPrototype);
+    for (var i=1, len=arguments.length; i<len; i++) {
+        if (typeof arguments[i] == "function") {
+            var mixin = arguments[i];
+            arguments[i] = new mixin(OpenLayers.Class.isPrototype);
+        }
+        OpenLayers.Util.extend(proto, arguments[i]);
+    }
+    return proto;
+};
diff --git a/lib/OpenLayers/BaseTypes/Element.js b/lib/OpenLayers/BaseTypes/Element.js
new file mode 100644
index 0000000..58a46d4
--- /dev/null
+++ b/lib/OpenLayers/BaseTypes/Element.js
@@ -0,0 +1,251 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * Namespace: OpenLayers.Element
+ */
+OpenLayers.Element = {
+
+    /**
+     * APIFunction: visible
+     * 
+     * Parameters: 
+     * element - {DOMElement}
+     * 
+     * Returns:
+     * {Boolean} Is the element visible?
+     */
+    visible: function(element) {
+        return OpenLayers.Util.getElement(element).style.display != 'none';
+    },
+
+    /**
+     * 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' 
+                                                              : 'show';
+            OpenLayers.Element[display](element);
+        }
+    },
+
+
+    /**
+     * APIFunction: hide
+     * Hide element(s) passed in
+     * 
+     * Parameters:
+     * element - {DOMElement} Actually user can pass any number of elements
+     */
+    hide: function() {
+        for (var i=0, len=arguments.length; i<len; i++) {
+            var element = OpenLayers.Util.getElement(arguments[i]);
+            if (element) {
+                element.style.display = 'none';
+            }
+        }
+    },
+
+    /**
+     * APIFunction: show
+     * Show element(s) passed in
+     * 
+     * Parameters:
+     * element - {DOMElement} Actually user can pass any number of elements
+     */
+    show: function() {
+        for (var i=0, len=arguments.length; i<len; i++) {
+            var element = OpenLayers.Util.getElement(arguments[i]);
+            if (element) {
+                element.style.display = '';
+            }
+        }
+    },
+
+    /**
+     * APIFunction: remove
+     * Remove the specified element from the DOM.
+     * 
+     * Parameters:
+     * element - {DOMElement}
+     */
+    remove: function(element) {
+        element = OpenLayers.Util.getElement(element);
+        element.parentNode.removeChild(element);
+    },
+
+    /**
+     * APIFunction: getHeight
+     *  
+     * Parameters:
+     * element - {DOMElement}
+     * 
+     * Returns:
+     * {Integer} The offset height of the element passed in
+     */
+    getHeight: function(element) {
+        element = OpenLayers.Util.getElement(element);
+        return element.offsetHeight;
+    },
+
+    /**
+     * APIFunction: getDimensions
+     * *Deprecated*. Returns dimensions of the element passed in.
+     *  
+     * Parameters:
+     * element - {DOMElement}
+     * 
+     * Returns:
+     * {Object} Object with 'width' and 'height' properties which are the 
+     *          dimensions of the element passed in.
+     */
+    getDimensions: function(element) {
+        element = OpenLayers.Util.getElement(element);
+        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;
+        var originalVisibility = els.visibility;
+        var originalPosition = els.position;
+        var originalDisplay = els.display;
+        els.visibility = 'hidden';
+        els.position = 'absolute';
+        els.display = '';
+        var originalWidth = element.clientWidth;
+        var originalHeight = element.clientHeight;
+        els.display = originalDisplay;
+        els.position = originalPosition;
+        els.visibility = originalVisibility;
+        return {width: originalWidth, height: originalHeight};
+    },
+
+    /**
+     * Function: hasClass
+     * Tests if an element has the given CSS class name.
+     *
+     * Parameters:
+     * element - {DOMElement} A DOM element node.
+     * name - {String} The CSS class name to search for.
+     *
+     * Returns:
+     * {Boolean} The element has the given class name.
+     */
+    hasClass: function(element, name) {
+        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
+     *     the class name.
+     *
+     * Parameters:
+     * element - {DOMElement} A DOM element node.
+     * name - {String} The CSS class name to add.
+     *
+     * Returns:
+     * {DOMElement} The element.
+     */
+    addClass: function(element, name) {
+        if(!OpenLayers.Element.hasClass(element, name)) {
+            element.className += (element.className ? " " : "") + name;
+        }
+        return element;
+    },
+
+    /**
+     * Function: removeClass
+     * Remove a CSS class name from an element.  Safe where element does not
+     *     have the class name.
+     *
+     * Parameters:
+     * element - {DOMElement} A DOM element node.
+     * name - {String} The CSS class name to remove.
+     *
+     * Returns:
+     * {DOMElement} The element.
+     */
+    removeClass: function(element, name) {
+        var names = element.className;
+        if(names) {
+            element.className = OpenLayers.String.trim(
+                names.replace(
+                    new RegExp("(^|\\s+)" + name + "(\\s+|$)"), " "
+                )
+            );
+        }
+        return element;
+    },
+
+    /**
+     * Function: toggleClass
+     * Remove a CSS class name from an element if it exists.  Add the class name
+     *     if it doesn't exist.
+     *
+     * Parameters:
+     * element - {DOMElement} A DOM element node.
+     * name - {String} The CSS class name to toggle.
+     *
+     * Returns:
+     * {DOMElement} The element.
+     */
+    toggleClass: function(element, name) {
+        if(OpenLayers.Element.hasClass(element, name)) {
+            OpenLayers.Element.removeClass(element, name);
+        } else {
+            OpenLayers.Element.addClass(element, name);
+        }
+        return element;
+    },
+
+    /**
+     * APIFunction: getStyle
+     * 
+     * Parameters:
+     * element - {DOMElement}
+     * style - {?}
+     * 
+     * Returns:
+     * {?}
+     */
+    getStyle: function(element, style) {
+        element = OpenLayers.Util.getElement(element);
+
+        var value = null;
+        if (element && element.style) {
+            value = element.style[OpenLayers.String.camelize(style)];
+            if (!value) {
+                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')) { 
+                value = 'auto';
+            }
+        }
+    
+        return value == 'auto' ? null : value;
+    }
+
+};
diff --git a/lib/OpenLayers/BaseTypes/LonLat.js b/lib/OpenLayers/BaseTypes/LonLat.js
new file mode 100644
index 0000000..622f636
--- /dev/null
+++ b/lib/OpenLayers/BaseTypes/LonLat.js
@@ -0,0 +1,190 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.LonLat
+ * This class represents a longitude and latitude pair
+ */
+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
+     */
+    lat: 0.0,
+
+    /**
+     * Constructor: OpenLayers.LonLat
+     * Create a new map location.
+     *
+     * Parameters:
+     * lon - {Number} The x-axis coordinate in map units.  If your map is in
+     *     a geographic projection, this will be the Longitude.  Otherwise,
+     *     it will be the x coordinate of the map location in your map units.
+     * lat - {Number} The y-axis coordinate in map units.  If your map is in
+     *     a geographic projection, this will be the Latitude.  Otherwise,
+     *     it will be the y coordinate of the map location in your map units.
+     */
+    initialize: function(lon, lat) {
+        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. 
+     *           (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. 
+     *         (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 
+     *                       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. 
+     */
+    add:function(lon, lat) {
+        if ( (lon == null) || (lat == null) ) {
+            var msg = OpenLayers.i18n("lonlatAddError");
+            OpenLayers.Console.error(msg);
+            return null;
+        }
+        return new OpenLayers.LonLat(this.lon + OpenLayers.Util.toFloat(lon), 
+                                     this.lat + OpenLayers.Util.toFloat(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 
+     *           components as this.
+     *           Note: if ll passed in is null, returns false
+     */
+    equals:function(ll) {
+        var equals = false;
+        if (ll != null) {
+            equals = ((this.lon == ll.lon && this.lat == ll.lat) ||
+                      (isNaN(this.lon) && isNaN(this.lat) && isNaN(ll.lon) && isNaN(ll.lat)));
+        }
+        return equals;
+    },
+
+    /**
+     * APIMethod: transform
+     * 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. 
+     *
+     * Returns:
+     * {<OpenLayers.LonLat>} Itself, for use in chaining operations.
+     */
+    transform: function(source, dest) {
+        var point = OpenLayers.Projection.transform(
+            {'x': this.lon, 'y': this.lat}, source, dest);
+        this.lon = point.x;
+        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 
+     *                       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 
+ *     parameter string
+ * 
+ * Parameters:
+ * str - {String} Comma-separated Lon,Lat coordinate string. 
+ *                 (ex. <i>"5,40"</i>)
+ * 
+ * Returns:
+ * {<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(pair[0], pair[1]);
+};
diff --git a/lib/OpenLayers/BaseTypes/Pixel.js b/lib/OpenLayers/BaseTypes/Pixel.js
new file mode 100644
index 0000000..f3bf538
--- /dev/null
+++ b/lib/OpenLayers/BaseTypes/Pixel.js
@@ -0,0 +1,125 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Pixel
+ * This class represents a screen coordinate, in x and y coordinates
+ */
+OpenLayers.Pixel = OpenLayers.Class({
+    
+    /**
+     * APIProperty: x
+     * {Number} The x coordinate
+     */
+    x: 0.0,
+
+    /**
+     * APIProperty: y
+     * {Number} The y coordinate
+     */
+    y: 0.0,
+    
+    /**
+     * Constructor: OpenLayers.Pixel
+     * Create a new OpenLayers.Pixel instance
+     *
+     * Parameters:
+     * x - {Number} The x coordinate
+     * y - {Number} The y coordinate
+     *
+     * Returns:
+     * An instance of OpenLayers.Pixel
+     */
+    initialize: function(x, y) {
+        this.x = parseFloat(x);
+        this.y = parseFloat(y);
+    },
+    
+    /**
+     * Method: toString
+     * Cast this object into a string
+     *
+     * Returns:
+     * {String} The string representation of Pixel. ex: "x=200.4,y=242.2"
+     */
+    toString:function() {
+        return ("x=" + this.x + ",y=" + this.y);
+    },
+
+    /**
+     * APIMethod: clone
+     * Return a clone of this pixel object
+     *
+     * Returns:
+     * {<OpenLayers.Pixel>} A clone pixel
+     */
+    clone:function() {
+        return new OpenLayers.Pixel(this.x, this.y); 
+    },
+    
+    /**
+     * APIMethod: equals
+     * Determine whether one pixel is equivalent to another
+     *
+     * Parameters:
+     * px - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {Boolean} The point passed in as parameter is equal to this. Note that
+     * if px passed in is null, returns false.
+     */
+    equals:function(px) {
+        var equals = false;
+        if (px != null) {
+            equals = ((this.x == px.x && this.y == px.y) ||
+                      (isNaN(this.x) && isNaN(this.y) && isNaN(px.x) && isNaN(px.y)));
+        }
+        return equals;
+    },
+
+    /**
+     * APIMethod: add
+     *
+     * Parameters:
+     * x - {Integer}
+     * y - {Integer}
+     *
+     * Returns:
+     * {<OpenLayers.Pixel>} A new Pixel with this pixel's x&y augmented by the 
+     * values passed in.
+     */
+    add:function(x, y) {
+        if ( (x == null) || (y == null) ) {
+            var msg = OpenLayers.i18n("pixelAddError");
+            OpenLayers.Console.error(msg);
+            return null;
+        }
+        return new OpenLayers.Pixel(this.x + x, this.y + y);
+    },
+
+    /**
+    * APIMethod: offset
+    * 
+    * Parameters
+    * px - {<OpenLayers.Pixel>}
+    * 
+    * Returns:
+    * {<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) {
+        var newPx = this.clone();
+        if (px) {
+            newPx = this.add(px.x, px.y);
+        }
+        return newPx;
+    },
+
+    CLASS_NAME: "OpenLayers.Pixel"
+});
diff --git a/lib/OpenLayers/BaseTypes/Size.js b/lib/OpenLayers/BaseTypes/Size.js
new file mode 100644
index 0000000..43856c8
--- /dev/null
+++ b/lib/OpenLayers/BaseTypes/Size.js
@@ -0,0 +1,85 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * Class: OpenLayers.Size
+ * Instances of this class represent a width/height pair
+ */
+OpenLayers.Size = OpenLayers.Class({
+
+    /**
+     * APIProperty: w
+     * {Number} width
+     */
+    w: 0.0,
+    
+    /**
+     * APIProperty: h
+     * {Number} height
+     */
+    h: 0.0,
+
+
+    /**
+     * Constructor: OpenLayers.Size
+     * Create an instance of OpenLayers.Size
+     *
+     * Parameters:
+     * w - {Number} width
+     * h - {Number} height
+     */
+    initialize: function(w, h) {
+        this.w = parseFloat(w);
+        this.h = parseFloat(h);
+    },
+
+    /**
+     * Method: toString
+     * Return the string representation of a size object
+     *
+     * Returns:
+     * {String} The string representation of OpenLayers.Size object. 
+     * (ex. <i>"w=55,h=66"</i>)
+     */
+    toString:function() {
+        return ("w=" + this.w + ",h=" + this.h);
+    },
+
+    /**
+     * APIMethod: clone
+     * Create a clone of this size object
+     *
+     * Returns:
+     * {<OpenLayers.Size>} A new OpenLayers.Size object with the same w and h
+     * values
+     */
+    clone:function() {
+        return new OpenLayers.Size(this.w, this.h);
+    },
+
+    /**
+     *
+     * APIMethod: equals
+     * Determine where this size is equal to another
+     *
+     * Parameters:
+     * sz - {<OpenLayers.Size>}
+     *
+     * 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.
+     *
+     */
+    equals:function(sz) {
+        var equals = false;
+        if (sz != null) {
+            equals = ((this.w == sz.w && this.h == sz.h) ||
+                      (isNaN(this.w) && isNaN(this.h) && isNaN(sz.w) && isNaN(sz.h)));
+        }
+        return equals;
+    },
+
+    CLASS_NAME: "OpenLayers.Size"
+});
diff --git a/lib/OpenLayers/Console.js b/lib/OpenLayers/Console.js
new file mode 100644
index 0000000..65ba7a6
--- /dev/null
+++ b/lib/OpenLayers/Console.js
@@ -0,0 +1,246 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * Namespace: OpenLayers.Console
+ * The OpenLayers.Console namespace is used for debugging and error logging.
+ * If the Firebug Lite (../Firebug/firebug.js) is included before this script,
+ * calls to OpenLayers.Console methods will get redirected to window.console.
+ * This makes use of the Firebug extension where available and allows for
+ * cross-browser debugging Firebug style.
+ *
+ * Note:
+ * 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 = {
+    /**
+     * Create empty functions for all console methods.  The real value of these
+     * properties will be set if Firebug Lite (../Firebug/firebug.js script) is
+     * 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
+     * representation of objects.  Given multiple arguments, they will
+     * be cast to strings and logged with a space delimiter.  If the first
+     * argument is a string with printf-like formatting, subsequent arguments
+     * 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}
+     */
+    log: function() {},
+
+    /**
+     * APIFunction: debug
+     * Writes a message to the console, including a hyperlink to the line
+     * where it was called.
+     *
+     * May be called with multiple arguments as with OpenLayers.Console.log().
+     * 
+     * Parameters:
+     * object - {Object}
+     */
+    debug: function() {},
+
+    /**
+     * APIFunction: info
+     * Writes a message to the console with the visual "info" icon and 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}
+     */
+    info: function() {},
+
+    /**
+     * APIFunction: warn
+     * Writes a message to the console with the visual "warning" icon and
+     * 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}
+     */
+    warn: function() {},
+
+    /**
+     * APIFunction: error
+     * Writes a message to the console with the visual "error" icon and 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}
+     */
+    error: function() {},
+    
+    /**
+     * APIFunction: userError
+     * A single interface for showing error messages to the user. The default
+     * behavior is a Javascript alert, though this can be overridden by
+     * reassigning OpenLayers.Console.userError to a different function.
+     *
+     * Expects a single error message
+     * 
+     * Parameters:
+     * object - {Object}
+     */
+    userError: function(error) {
+        alert(error);
+    },
+
+    /**
+     * APIFunction: assert
+     * Tests that an expression is true. If not, it will write a message to
+     * the console and throw an exception.
+     *
+     * May be called with multiple arguments as with OpenLayers.Console.log().
+     * 
+     * Parameters:
+     * object - {Object}
+     */
+    assert: function() {},
+
+    /**
+     * 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}
+     */
+    dir: function() {},
+
+    /**
+     * APIFunction: dirxml
+     * 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}
+     */
+    dirxml: function() {},
+
+    /**
+     * APIFunction: trace
+     * Prints an interactive stack trace of JavaScript execution at the point
+     * where it is called.  The stack trace details the functions on the stack,
+     * 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() {},
+
+    /**
+     * APIFunction: group
+     * Writes a message to the console and opens a nested block to indent all
+     * future messages sent to the console. Call OpenLayers.Console.groupEnd()
+     * to close the block.
+     *
+     * May be called with multiple arguments as with OpenLayers.Console.log().
+     * 
+     * Parameters:
+     * object - {Object}
+     */
+    group: function() {},
+
+    /**
+     * APIFunction: groupEnd
+     * Closes the most recently opened block created by a call to
+     * OpenLayers.Console.group
+     */
+    groupEnd: function() {},
+    
+    /**
+     * APIFunction: time
+     * Creates a new timer under the given name. Call
+     * OpenLayers.Console.timeEnd(name)
+     * with the same name to stop the timer and print the time elapsed.
+     *
+     * Parameters:
+     * name - {String}
+     */
+    time: function() {},
+
+    /**
+     * APIFunction: timeEnd
+     * Stops a timer created by a call to OpenLayers.Console.time(name) and
+     * writes the time elapsed.
+     *
+     * Parameters:
+     * name - {String}
+     */
+    timeEnd: function() {},
+
+    /**
+     * APIFunction: profile
+     * Turns on the JavaScript profiler. The optional argument title would
+     * 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
+     */
+    profile: function() {},
+
+    /**
+     * APIFunction: profileEnd
+     * Turns off the JavaScript profiler and prints its report.
+     * 
+     * This function is not currently implemented in Firebug Lite.
+     */
+    profileEnd: function() {},
+
+    /**
+     * APIFunction: count
+     * Writes the number of times that the line of code where count was called
+     * was executed. The optional argument title will print a message in
+     * addition to the number of the count.
+     *
+     * This function is not currently implemented in Firebug Lite.
+     *
+     * Parameters:
+     * title - {String} Optional title to be printed with count
+     */
+    count: function() {},
+
+    CLASS_NAME: "OpenLayers.Console"
+};
+
+/**
+ * Execute an anonymous function to extend the OpenLayers.Console namespace
+ * if the firebug.js script is included.  This closure is used so that the
+ * "scripts" and "i" variables don't pollute the global namespace.
+ */
+(function() {
+    /**
+     * If Firebug Lite is included (before this script), re-route all
+     * OpenLayers.Console calls to the console object.
+     */
+    var scripts = document.getElementsByTagName("script");
+    for(var i=0, len=scripts.length; i<len; ++i) {
+        if(scripts[i].src.indexOf("firebug.js") != -1) {
+            if(console) {
+                OpenLayers.Util.extend(OpenLayers.Console, console);
+                break;
+            }
+        }
+    }
+})();
diff --git a/lib/OpenLayers/Control.js b/lib/OpenLayers/Control.js
new file mode 100644
index 0000000..916e9da
--- /dev/null
+++ b/lib/OpenLayers/Control.js
@@ -0,0 +1,368 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * 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 
+ * 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());
+ * > map.addControl(new OpenLayers.Control.MouseToolbar());
+ * > map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));
+ * > map.addControl(new OpenLayers.Control.Permalink());
+ * > map.addControl(new OpenLayers.Control.Permalink('permalink'));
+ * > map.addControl(new OpenLayers.Control.MousePosition());
+ * > map.addControl(new OpenLayers.Control.OverviewMap());
+ * > map.addControl(new OpenLayers.Control.KeyboardDefaults());
+ *
+ * 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 
+ * example:
+ *
+ * > var control = new OpenLayers.Control();
+ * > OpenLayers.Util.extend(control, {
+ * >     draw: function () {
+ * >         // this Handler.Box will intercept the shift-mousedown
+ * >         // before Control.MouseDefault gets to see it
+ * >         this.box = new OpenLayers.Handler.Box( control, 
+ * >             {"done": this.notice},
+ * >             {keyMask: OpenLayers.Handler.MOD_SHIFT});
+ * >         this.box.activate();
+ * >     },
+ * >
+ * >     notice: function (bounds) {
+ * >         OpenLayers.Console.userError(bounds);
+ * >     }
+ * > }); 
+ * > map.addControl(control);
+ * 
+ */
+OpenLayers.Control = OpenLayers.Class({
+
+    /** 
+     * Property: id 
+     * {String} 
+     */
+    id: null,
+    
+    /** 
+     * Property: map 
+     * {<OpenLayers.Map>} this gets set in the addControl() function in
+     * OpenLayers.Map 
+     */
+    map: null,
+
+    /** 
+     * Property: div 
+     * {DOMElement} 
+     */
+    div: null,
+
+    /** 
+     * Property: type 
+     * {Number} Controls can have a 'type'. The type determines the type of
+     * interactions which are possible with them when they are placed in an
+     * <OpenLayers.Control.Panel>. 
+     */
+    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,  
+
+    /** 
+     * Property: displayClass 
+     * {string}  This property is used for CSS related to the drawing of the
+     * Control. 
+     */
+    displayClass: "",
+    
+    /**
+    * Property: title  
+    * {string}  This property is used for showing a tooltip over the  
+    * Control.  
+    */ 
+    title: "",
+
+    /**
+     * APIProperty: autoActivate
+     * {Boolean} Activate the control when it is added to a map.  Default is
+     *     false.
+     */
+    autoActivate: false,
+
+    /** 
+     * Property: active 
+     * {Boolean} The control is active.
+     */
+    active: null,
+
+    /** 
+     * Property: handler 
+     * {<OpenLayers.Handler>} null
+     */
+    handler: null,
+
+    /**
+     * APIProperty: eventListeners
+     * {Object} If set as an option at construction, the eventListeners
+     *     object will be registered with <OpenLayers.Events.on>.  Object
+     *     structure must be a listeners object as shown in the example for
+     *     the events.on method.
+     */
+    eventListeners: null,
+
+    /** 
+     * Property: events
+     * {<OpenLayers.Events>} Events instance for triggering control specific
+     *     events.
+     */
+    events: null,
+
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * control.events.register(type, obj, listener);
+     * (end)
+     *
+     * Listeners will be called with a reference to an event object.  The
+     *     properties of this event depends on exactly what happened.
+     *
+     * All event objects have at least the following properties:
+     * object - {Object} A reference to control.events.object (a reference
+     *      to the control).
+     * element - {DOMElement} A reference to control.events.element (which
+     *      will be null unless documented otherwise).
+     *
+     * Supported map event types:
+     * activate - Triggered when activated.
+     * deactivate - Triggered when deactivated.
+     */
+    EVENT_TYPES: ["activate", "deactivate"],
+
+    /**
+     * 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} 
+     */
+    initialize: function (options) {
+        // We do this before the extend so that instances can override
+        // className in options.
+        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);
+        }
+        if (this.id == null) {
+            this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
+        }
+    },
+
+    /**
+     * Method: destroy
+     * The destroy method is used to perform any clean up before the control
+     * is dereferenced.  Typically this is where event listeners are removed
+     * to prevent memory leaks.
+     */
+    destroy: function () {
+        if(this.events) {
+            if(this.eventListeners) {
+                this.events.un(this.eventListeners);
+            }
+            this.events.destroy();
+            this.events = null;
+        }
+        this.eventListeners = null;
+
+        // eliminate circular references
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+        if(this.handlers) {
+            for(var key in this.handlers) {
+                if(this.handlers.hasOwnProperty(key) &&
+                   typeof this.handlers[key].destroy == "function") {
+                    this.handlers[key].destroy();
+                }
+            }
+            this.handlers = null;
+        }
+        if (this.map) {
+            this.map.removeControl(this);
+            this.map = null;
+        }
+    },
+
+    /** 
+     * 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. 
+     *
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        this.map = map;
+        if (this.handler) {
+            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. 
+     *
+     * Parameters:
+     * px - {<OpenLayers.Pixel>} The top-left pixel position of the control
+     *      or null.
+     *
+     * Returns:
+     * {DOMElement} A reference to the DIV DOMElement containing the control
+     */
+    draw: function (px) {
+        if (this.div == null) {
+            this.div = OpenLayers.Util.createDiv(this.id);
+            this.div.className = this.displayClass;
+            if (!this.allowSelection) {
+                this.div.className += " olControlNoSelect";
+                this.div.setAttribute("unselectable", "on", 0);
+                this.div.onselectstart = OpenLayers.Function.False; 
+            }    
+            if (this.title != "") {
+                this.div.title = this.title;
+            }
+        }
+        if (px != null) {
+            this.position = px.clone();
+        }
+        this.moveTo(this.position);
+        return this.div;
+    },
+
+    /**
+     * Method: moveTo
+     * Sets the left and top style attributes to the passed in pixel 
+     * coordinates.
+     *
+     * Parameters:
+     * px - {<OpenLayers.Pixel>}
+     */
+    moveTo: function (px) {
+        if ((px != null) && (this.div != null)) {
+            this.div.style.left = px.x + "px";
+            this.div.style.top = px.y + "px";
+        }
+    },
+
+    /**
+     * Method: activate
+     * 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.
+     */
+    activate: function () {
+        if (this.active) {
+            return false;
+        }
+        if (this.handler) {
+            this.handler.activate();
+        }
+        this.active = true;
+        if(this.map) {
+            OpenLayers.Element.addClass(
+                this.map.viewPortDiv,
+                this.displayClass.replace(/ /g, "") + "Active"
+            );
+        }
+        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.
+     */
+    deactivate: function () {
+        if (this.active) {
+            if (this.handler) {
+                this.handler.deactivate();
+            }
+            this.active = false;
+            if(this.map) {
+                OpenLayers.Element.removeClass(
+                    this.map.viewPortDiv,
+                    this.displayClass.replace(/ /g, "") + "Active"
+                );
+            }
+            this.events.triggerEvent("deactivate");
+            return true;
+        }
+        return false;
+    },
+
+    CLASS_NAME: "OpenLayers.Control"
+});
+
+/**
+ * Constant: OpenLayers.Control.TYPE_BUTTON
+ */
+OpenLayers.Control.TYPE_BUTTON = 1;
+
+/**
+ * Constant: OpenLayers.Control.TYPE_TOGGLE
+ */
+OpenLayers.Control.TYPE_TOGGLE = 2;
+
+/**
+ * Constant: OpenLayers.Control.TYPE_TOOL
+ */
+OpenLayers.Control.TYPE_TOOL   = 3;
diff --git a/lib/OpenLayers/Control/ArgParser.js b/lib/OpenLayers/Control/ArgParser.js
new file mode 100644
index 0000000..8fbb0dd
--- /dev/null
+++ b/lib/OpenLayers/Control/ArgParser.js
@@ -0,0 +1,166 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.ArgParser
+ * 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. 
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.ArgParser = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Parameter: center
+     * {<OpenLayers.LonLat>}
+     */
+    center: null,
+    
+    /**
+     * Parameter: zoom
+     * {int}
+     */
+    zoom: null,
+
+    /**
+     * Parameter: layers 
+     * {Array(<OpenLayers.Layer>)}
+     */
+    layers: null,
+    
+    /** 
+     * APIProperty: displayProjection
+     * {<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
+     *     projection.
+     *
+     *     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. 
+     */
+    displayProjection: null, 
+
+    /**
+     * Constructor: OpenLayers.Control.ArgParser
+     *
+     * Parameters:
+     * options - {Object}
+     */
+    initialize: function(options) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+    },
+
+    /**
+     * Method: setMap
+     * Set the map property for the control. 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+
+        //make sure we dont already have an arg parser attached
+        for(var i=0, len=this.map.controls.length; i<len; i++) {
+            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 
+                // override the displayProjection to be the one added to the
+                // map. 
+                if (control.displayProjection != this.displayProjection) {
+                    this.displayProjection = control.displayProjection;
+                }    
+                
+                break;
+            }
+        }
+        if (i == this.map.controls.length) {
+
+            var args = OpenLayers.Util.getParameters();
+            // 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, 
+                                         this.configureLayers);
+                this.configureLayers();
+            }
+            if (args.lat && args.lon) {
+                this.center = new OpenLayers.LonLat(parseFloat(args.lon),
+                                                    parseFloat(args.lat));
+                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.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.setCenter);
+            
+            if (this.displayProjection) {
+                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. 
+     */
+    configureLayers: function() {
+
+        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") ) {
+                    layer.setVisibility(c == "T");
+                }
+            }
+        }
+    },     
+
+    CLASS_NAME: "OpenLayers.Control.ArgParser"
+});
diff --git a/lib/OpenLayers/Control/Attribution.js b/lib/OpenLayers/Control/Attribution.js
new file mode 100644
index 0000000..f2f1b7c
--- /dev/null
+++ b/lib/OpenLayers/Control/Attribution.js
@@ -0,0 +1,97 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Attribution
+ * The attribution control adds attribution from layers to the map display. 
+ * It uses 'attribution' property of each layer.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Attribution = 
+  OpenLayers.Class(OpenLayers.Control, {
+    
+    /**
+     * APIProperty: seperator
+     * {String} String used to seperate layers.
+     */
+    separator: ", ",
+    
+    /**
+     * Constructor: OpenLayers.Control.Attribution 
+     * 
+     * Parameters:
+     * options - {Object} Options for control.
+     */
+    initialize: function(options) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+    },
+
+    /** 
+     * Method: destroy
+     * Destroy control.
+     */
+    destroy: function() {
+        this.map.events.un({
+            "removelayer": this.updateAttribution,
+            "addlayer": this.updateAttribution,
+            "changelayer": this.updateAttribution,
+            "changebaselayer": this.updateAttribution,
+            scope: this
+        });
+        
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+    },    
+    
+    /**
+     * Method: draw
+     * Initialize control.
+     * 
+     * Returns: 
+     * {DOMElement} A reference to the DIV DOMElement containing the control
+     */    
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        
+        this.map.events.on({
+            'changebaselayer': this.updateAttribution,
+            'changelayer': this.updateAttribution,
+            'addlayer': this.updateAttribution,
+            'removelayer': this.updateAttribution,
+            scope: this
+        });
+        this.updateAttribution();
+        
+        return this.div;    
+    },
+
+    /**
+     * Method: updateAttribution
+     * Update attribution string.
+     */
+    updateAttribution: function() {
+        var attributions = [];
+        if (this.map && this.map.layers) {
+            for(var i=0, len=this.map.layers.length; i<len; i++) {
+                var layer = this.map.layers[i];
+                if (layer.attribution && layer.getVisibility()) {
+                    // add attribution only if attribution text is unique
+                    if (OpenLayers.Util.indexOf(
+                                    attributions, layer.attribution) === -1) {
+                        attributions.push( layer.attribution );
+                    }
+                }
+            } 
+            this.div.innerHTML = attributions.join(this.separator);
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.Attribution"
+});
diff --git a/lib/OpenLayers/Control/Button.js b/lib/OpenLayers/Control/Button.js
new file mode 100644
index 0000000..6abbc11
--- /dev/null
+++ b/lib/OpenLayers/Control/Button.js
@@ -0,0 +1,44 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Button 
+ * The Button control is a very simple push-button, for use with 
+ * <OpenLayers.Control.Panel>.
+ * When clicked, the function trigger() is executed.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ *
+ * Use:
+ * (code)
+ * var button = new OpenLayers.Control.Button({
+ *     displayClass: "MyButton", trigger: myFunction
+ * });
+ * panel.addControls([button]);
+ * (end)
+ * 
+ * Will create a button with CSS class MyButtonItemInactive, that
+ *     will call the function MyFunction() when clicked.
+ */
+OpenLayers.Control.Button = OpenLayers.Class(OpenLayers.Control, {
+    /**
+     * Property: type
+     * {Integer} OpenLayers.Control.TYPE_BUTTON.
+     */
+    type: OpenLayers.Control.TYPE_BUTTON,
+    
+    /**
+     * Method: trigger
+     * Called by a control panel when the button is clicked.
+     */
+    trigger: function() {},
+
+    CLASS_NAME: "OpenLayers.Control.Button"
+});
diff --git a/lib/OpenLayers/Control/DragFeature.js b/lib/OpenLayers/Control/DragFeature.js
new file mode 100644
index 0000000..4570b63
--- /dev/null
+++ b/lib/OpenLayers/Control/DragFeature.js
@@ -0,0 +1,303 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Handler/Drag.js
+ * @requires OpenLayers/Handler/Feature.js
+ */
+
+/**
+ * Class: OpenLayers.Control.DragFeature
+ * The DragFeature control moves a feature with a drag of the mouse. Create a
+ * new control with the <OpenLayers.Control.DragFeature> constructor.
+ *
+ * Inherits From:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.DragFeature = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * APIProperty: geometryTypes
+     * {Array(String)} To restrict dragging to a limited set of geometry types,
+     *     send a list of strings corresponding to the geometry class names.
+     */
+    geometryTypes: null,
+    
+    /**
+     * APIProperty: onStart
+     * {Function} Define this function if you want to know when a drag starts.
+     *     The function should expect to receive two arguments: the feature
+     *     that is about to be dragged and the pixel location of the mouse.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The feature that is about to be
+     *     dragged.
+     * pixel - {<OpenLayers.Pixel>} The pixel location of the mouse.
+     */
+    onStart: function(feature, pixel) {},
+
+    /**
+     * APIProperty: onDrag
+     * {Function} Define this function if you want to know about each move of a
+     *     feature. The function should expect to receive two arguments: the
+     *     feature that is being dragged and the pixel location of the mouse.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The feature that was dragged.
+     * pixel - {<OpenLayers.Pixel>} The pixel location of the mouse.
+     */
+    onDrag: function(feature, pixel) {},
+
+    /**
+     * APIProperty: onComplete
+     * {Function} Define this function if you want to know when a feature is
+     *     done dragging. The function should expect to receive two arguments:
+     *     the feature that is being dragged and the pixel location of the
+     *     mouse.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The feature that was dragged.
+     * pixel - {<OpenLayers.Pixel>} The pixel location of the mouse.
+     */
+    onComplete: function(feature, pixel) {},
+
+    /**
+     * APIProperty: documentDrag
+     * {Boolean} If set to true, mouse dragging will continue even if the
+     *     mouse cursor leaves the map viewport. Default is false.
+     */
+    documentDrag: false,
+    
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer.Vector>}
+     */
+    layer: null,
+    
+    /**
+     * Property: feature
+     * {<OpenLayers.Feature.Vector>}
+     */
+    feature: null,
+
+    /**
+     * Property: dragCallbacks
+     * {Object} The functions that are sent to the drag handler for callback.
+     */
+    dragCallbacks: {},
+
+    /**
+     * Property: featureCallbacks
+     * {Object} The functions that are sent to the feature handler for callback.
+     */
+    featureCallbacks: {},
+    
+    /**
+     * Property: lastPixel
+     * {<OpenLayers.Pixel>}
+     */
+    lastPixel: null,
+
+    /**
+     * Constructor: OpenLayers.Control.DragFeature
+     * Create a new control to drag features.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer.Vector>} The layer containing features to be
+     *     dragged.
+     * options - {Object} Optional object whose properties will be set on the
+     *     control.
+     */
+    initialize: function(layer, options) {
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        this.layer = layer;
+        this.handlers = {
+            drag: new OpenLayers.Handler.Drag(
+                this, OpenLayers.Util.extend({
+                    down: this.downFeature,
+                    move: this.moveFeature,
+                    up: this.upFeature,
+                    out: this.cancel,
+                    done: this.doneDragging
+                }, this.dragCallbacks), {
+                    documentDrag: this.documentDrag
+                }
+            ),
+            feature: new OpenLayers.Handler.Feature(
+                this, this.layer, OpenLayers.Util.extend({
+                    over: this.overFeature,
+                    out: this.outFeature
+                }, this.featureCallbacks),
+                {geometryTypes: this.geometryTypes}
+            )
+        };
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Take care of things that are not handled in superclass
+     */
+    destroy: function() {
+        this.layer = null;
+        OpenLayers.Control.prototype.destroy.apply(this, []);
+    },
+
+    /**
+     * APIMethod: activate
+     * Activate the control and the feature handler.
+     * 
+     * Returns:
+     * {Boolean} Successfully activated the control and feature handler.
+     */
+    activate: function() {
+        return (this.handlers.feature.activate() &&
+                OpenLayers.Control.prototype.activate.apply(this, arguments));
+    },
+
+    /**
+     * APIMethod: deactivate
+     * Deactivate the control and all handlers.
+     * 
+     * Returns:
+     * {Boolean} Successfully deactivated the control.
+     */
+    deactivate: function() {
+        // the return from the handlers is unimportant in this case
+        this.handlers.drag.deactivate();
+        this.handlers.feature.deactivate();
+        this.feature = null;
+        this.dragging = false;
+        this.lastPixel = null;
+        OpenLayers.Element.removeClass(
+            this.map.viewPortDiv, this.displayClass + "Over"
+        );
+        return OpenLayers.Control.prototype.deactivate.apply(this, arguments);
+    },
+
+    /**
+     * Method: overFeature
+     * Called when the feature handler detects a mouse-over on a feature.
+     *     This activates the drag handler.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The selected feature.
+     */
+    overFeature: function(feature) {
+        if(!this.handlers.drag.dragging) {
+            this.feature = feature;
+            this.handlers.drag.activate();
+            this.over = true;
+            OpenLayers.Element.addClass(this.map.viewPortDiv, this.displayClass + "Over");
+        } else {
+            if(this.feature.id == feature.id) {
+                this.over = true;
+            } else {
+                this.over = false;
+            }
+        }
+    },
+
+    /**
+     * Method: downFeature
+     * Called when the drag handler detects a mouse-down.
+     *
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} Location of the mouse event.
+     */
+    downFeature: function(pixel) {
+        this.lastPixel = pixel;
+        this.onStart(this.feature, pixel);
+    },
+
+    /**
+     * Method: moveFeature
+     * Called when the drag handler detects a mouse-move.  Also calls the
+     *     optional onDrag method.
+     * 
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} Location of the mouse event.
+     */
+    moveFeature: function(pixel) {
+        var res = this.map.getResolution();
+        this.feature.geometry.move(res * (pixel.x - this.lastPixel.x),
+                                   res * (this.lastPixel.y - pixel.y));
+        this.layer.drawFeature(this.feature);
+        this.lastPixel = pixel;
+        this.onDrag(this.feature, pixel);
+    },
+
+    /**
+     * Method: upFeature
+     * Called when the drag handler detects a mouse-up.
+     * 
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} Location of the mouse event.
+     */
+    upFeature: function(pixel) {
+        if(!this.over) {
+            this.handlers.drag.deactivate();
+        }
+    },
+
+    /**
+     * Method: doneDragging
+     * Called when the drag handler is done dragging.
+     *
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} The last event pixel location.  If this event
+     *     came from a mouseout, this may not be in the map viewport.
+     */
+    doneDragging: function(pixel) {
+        this.onComplete(this.feature, pixel);
+    },
+
+    /**
+     * Method: outFeature
+     * Called when the feature handler detects a mouse-out on a feature.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The feature that the mouse left.
+     */
+    outFeature: function(feature) {
+        if(!this.handlers.drag.dragging) {
+            this.over = false;
+            this.handlers.drag.deactivate();
+            OpenLayers.Element.removeClass(
+                this.map.viewPortDiv, this.displayClass + "Over"
+            );
+            this.feature = null;
+        } else {
+            if(this.feature.id == feature.id) {
+                this.over = false;
+            }
+        }
+    },
+        
+    /**
+     * Method: cancel
+     * Called when the drag handler detects a mouse-out (from the map viewport).
+     */
+    cancel: function() {
+        this.handlers.drag.deactivate();
+        this.over = false;
+    },
+
+    /**
+     * Method: setMap
+     * Set the map property for the control and all handlers.
+     *
+     * Parameters: 
+     * map - {<OpenLayers.Map>} The control's map.
+     */
+    setMap: function(map) {
+        this.handlers.drag.setMap(map);
+        this.handlers.feature.setMap(map);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.DragFeature"
+});
diff --git a/lib/OpenLayers/Control/DragPan.js b/lib/OpenLayers/Control/DragPan.js
new file mode 100644
index 0000000..a2b42f1
--- /dev/null
+++ b/lib/OpenLayers/Control/DragPan.js
@@ -0,0 +1,94 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Handler/Drag.js
+ */
+
+/**
+ * Class: OpenLayers.Control.DragPan
+ * The DragPan control pans the map with a drag of the mouse.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+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,
+    
+    /**
+     * APIProperty: documentDrag
+     * {Boolean} If set to true, mouse dragging will continue even if the
+     *     mouse cursor leaves the map viewport. Default is false.
+     */
+    documentDrag: false,
+    
+    /**
+     * Method: draw
+     * Creates a Drag handler, using <panMap> and
+     * <panMapDone> as callbacks.
+     */    
+    draw: function() {
+        this.handler = new OpenLayers.Handler.Drag(this, {
+                "move": this.panMap,
+                "done": this.panMapDone
+            }, {
+                interval: this.interval,
+                documentDrag: this.documentDrag
+            }
+        );
+    },
+
+    /**
+    * Method: panMap
+    *
+    * Parameters:
+    * xy - {<OpenLayers.Pixel>} Pixel of the mouse position
+    */
+    panMap: function(xy) {
+        this.panned = true;
+        this.map.pan(
+            this.handler.last.x - xy.x,
+            this.handler.last.y - xy.y,
+            {dragging: this.handler.dragging, animate: false}
+        );
+    },
+    
+    /**
+     * Method: panMapDone
+     * Finish the panning operation.  Only call setCenter (through <panMap>)
+     *     if the map has actually been moved.
+     *
+     * Parameters:
+     * xy - {<OpenLayers.Pixel>} Pixel of the mouse position
+     */
+    panMapDone: function(xy) {
+        if(this.panned) {
+            this.panMap(xy);
+            this.panned = false;
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.DragPan"
+});
diff --git a/lib/OpenLayers/Control/DrawFeature.js b/lib/OpenLayers/Control/DrawFeature.js
new file mode 100644
index 0000000..0829625
--- /dev/null
+++ b/lib/OpenLayers/Control/DrawFeature.js
@@ -0,0 +1,126 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Feature/Vector.js
+ */
+
+/**
+ * Class: OpenLayers.Control.DrawFeature
+ * The DrawFeature control draws point, line or polygon features on a vector
+ * layer when active.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.DrawFeature = OpenLayers.Class(OpenLayers.Control, {
+    
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer.Vector>}
+     */
+    layer: null,
+
+    /**
+     * Property: callbacks
+     * {Object} The functions that are sent to the handler for callback
+     */
+    callbacks: null,
+    
+    /**
+     * Constant: EVENT_TYPES
+     *
+     * Supported event types:
+     * featureadded - Triggered when a feature is added
+     */
+    EVENT_TYPES: ["featureadded"],
+    
+    /**
+     * APIProperty: multi
+     * {Boolean} Cast features to multi-part geometries before passing to the
+     *     layer.  Default is false.
+     */
+    multi: false,
+
+    /**
+     * APIProperty: featureAdded
+     * {Function} Called after each feature is added
+     */
+    featureAdded: function() {},
+
+    /**
+     * APIProperty: handlerOptions
+     * {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} 
+     */
+    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(
+            {
+                done: this.drawFeature,
+                modify: function(vertex, feature) {
+                    this.layer.events.triggerEvent(
+                        "sketchmodified", {vertex: vertex, feature: feature}
+                    );
+                },
+                create: function(vertex, feature) {
+                    this.layer.events.triggerEvent(
+                        "sketchstarted", {vertex: vertex, feature: feature}
+                    );
+                }
+            },
+            this.callbacks
+        );
+        this.layer = layer;
+        this.handlerOptions = this.handlerOptions || {};
+        if (!("multi" in this.handlerOptions)) {
+            this.handlerOptions.multi = this.multi;
+        }
+        var sketchStyle = this.layer.styleMap && this.layer.styleMap.styles.temporary;
+        if(sketchStyle) {
+            this.handlerOptions.layerOptions = OpenLayers.Util.applyDefaults(
+                this.handlerOptions.layerOptions,
+                {styleMap: new OpenLayers.StyleMap({"default": sketchStyle})}
+            );
+        }
+        this.handler = new handler(this, this.callbacks, this.handlerOptions);
+    },
+
+    /**
+     * Method: drawFeature
+     */
+    drawFeature: function(geometry) {
+        var feature = new OpenLayers.Feature.Vector(geometry);
+        var proceed = this.layer.events.triggerEvent(
+            "sketchcomplete", {feature: feature}
+        );
+        if(proceed !== false) {
+            feature.state = OpenLayers.State.INSERT;
+            this.layer.addFeatures([feature]);
+            this.featureAdded(feature);
+            this.events.triggerEvent("featureadded",{feature : feature});
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.DrawFeature"
+});
diff --git a/lib/OpenLayers/Control/EditingToolbar.js b/lib/OpenLayers/Control/EditingToolbar.js
new file mode 100644
index 0000000..63af2b2
--- /dev/null
+++ b/lib/OpenLayers/Control/EditingToolbar.js
@@ -0,0 +1,63 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control/Panel.js
+ * @requires OpenLayers/Control/Navigation.js
+ * @requires OpenLayers/Control/DrawFeature.js
+ * @requires OpenLayers/Handler/Point.js
+ * @requires OpenLayers/Handler/Path.js
+ * @requires OpenLayers/Handler/Polygon.js
+ */
+
+/**
+ * Class: OpenLayers.Control.EditingToolbar 
+ * The EditingToolbar is a panel of 4 controls to draw polygons, lines, 
+ * points, or to navigate the map by panning. By default it appears in the 
+ * upper right corner of the map.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Control.Panel>
+ */
+OpenLayers.Control.EditingToolbar = OpenLayers.Class(
+  OpenLayers.Control.Panel, {
+
+    /**
+     * Constructor: OpenLayers.Control.EditingToolbar
+     * Create an editing toolbar for a given layer. 
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer.Vector>} 
+     * options - {Object} 
+     */
+    initialize: function(layer, options) {
+        OpenLayers.Control.Panel.prototype.initialize.apply(this, [options]);
+        
+        this.addControls(
+          [ new OpenLayers.Control.Navigation() ]
+        );  
+        var controls = [
+          new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Point, {'displayClass': 'olControlDrawFeaturePoint'}),
+          new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Path, {'displayClass': 'olControlDrawFeaturePath'}),
+          new OpenLayers.Control.DrawFeature(layer, OpenLayers.Handler.Polygon, {'displayClass': 'olControlDrawFeaturePolygon'})
+        ];
+        this.addControls(controls);
+    },
+
+    /**
+     * Method: draw
+     * calls the default draw, and then activates mouse defaults.
+     *
+     * Returns:
+     * {DOMElement}
+     */
+    draw: function() {
+        var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
+        this.activateControl(this.controls[0]);
+        return div;
+    },
+
+    CLASS_NAME: "OpenLayers.Control.EditingToolbar"
+});    
diff --git a/lib/OpenLayers/Control/GetFeature.js b/lib/OpenLayers/Control/GetFeature.js
new file mode 100644
index 0000000..d608a42
--- /dev/null
+++ b/lib/OpenLayers/Control/GetFeature.js
@@ -0,0 +1,595 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Handler/Click.js
+ * @requires OpenLayers/Handler/Box.js
+ * @requires OpenLayers/Handler/Hover.js
+ * @requires OpenLayers/Filter/Spatial.js
+ */
+
+/**
+ * Class: OpenLayers.Control.GetFeature
+ * Gets vector features for locations underneath the mouse cursor. Can be
+ *     configured to act on click, hover or dragged boxes. Uses an
+ *     <OpenLayers.Protocol> that supports spatial filters to retrieve
+ *     features from a server and fires events that notify applications of the
+ *     selected features. 
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.GetFeature = OpenLayers.Class(OpenLayers.Control, {
+    
+    /**
+     * APIProperty: protocol
+     * {<OpenLayers.Protocol>} Required. The protocol used for fetching
+     *     features.
+     */
+    protocol: null,
+    
+    /**
+     * APIProperty: multipleKey
+     * {String} An event modifier ('altKey' or 'shiftKey') that temporarily sets
+     *     the <multiple> property to true.  Default is null.
+     */
+    multipleKey: null,
+    
+    /**
+     * APIProperty: toggleKey
+     * {String} An event modifier ('altKey' or 'shiftKey') that temporarily sets
+     *     the <toggle> property to true.  Default is null.
+     */
+    toggleKey: null,
+    
+    /**
+     * Property: modifiers
+     * {Object} The event modifiers to use, according to the current event
+     *     being handled by this control's handlers
+     */
+    modifiers: null,
+    
+    /**
+     * APIProperty: multiple
+     * {Boolean} Allow selection of multiple geometries.  Default is false.
+     */
+    multiple: false, 
+
+    /**
+     * APIProperty: click
+     * {Boolean} Use a click handler for selecting/unselecting features. If
+     *     both <click> and <box> are set to true, the click handler takes
+     *     precedence over the box handler if a box with zero extent was
+     *     selected.  Default is true.
+     */
+    click: true,
+
+    /**
+     * APIProperty: single
+     * {Boolean} Tells whether select by click should select a single
+     *     feature. If set to false, all matching features are selected.
+     *     If set to true, only the best matching feature is selected.
+     *     This option has an effect only of the <click> option is set
+     *     to true. Default is true.
+     */
+    single: true,
+    
+    /**
+     * APIProperty: clickout
+     * {Boolean} Unselect features when clicking outside any feature.
+     *     Applies only if <click> is true.  Default is true.
+     */
+    clickout: true,
+    
+    /**
+     * APIProperty: toggle
+     * {Boolean} Unselect a selected feature on click.  Applies only if
+     *     <click> is true.  Default is false.
+     */
+    toggle: false,
+
+    /**
+     * APIProperty: clickTolerance
+     * {Integer} Tolerance for the filter query in pixels. This has the
+     *     same effect as the tolerance parameter on WMS GetFeatureInfo
+     *     requests.  Will be ignored for box selections.  Applies only if
+     *     <click> or <hover> is true.  Default is 5.  Note that this not
+     *     only affects requests on click, but also on hover.
+     */
+    clickTolerance: 5,
+    
+    /**
+     * APIProperty: hover
+     * {Boolean} Send feature requests on mouse moves.  Default is false.
+     */
+    hover: false,
+
+    /**
+     * APIProperty: box
+     * {Boolean} Allow feature selection by drawing a box. If set to
+     *     true set <click> to false to disable the click handler and
+     *     rely on the box handler only, even for "zero extent" boxes.
+     *     See the description of the <click> option for additional
+     *     information.  Default is false.
+     */
+    box: false,
+    
+    /**
+     * APIProperty: maxFeatures
+     * {Integer} Maximum number of features to return from a query in single mode
+     *     if supported by the <protocol>. This set of features is then used to
+     *     determine the best match client-side. Default is 10.
+     */
+    maxFeatures: 10,
+    
+    /**
+     * Property: features
+     * {Object} Hash of {<OpenLayers.Feature.Vector>}, keyed by fid, holding
+     *     the currently selected features
+     */
+    features: null,
+    
+    /**
+     * Proeprty: hoverFeature
+     * {<OpenLayers.Feature.Vector>} The feature currently selected by the
+     *     hover handler
+     */
+    hoverFeature: null,
+    
+    /**
+     * APIProperty: handlerOptions
+     * {Object} Additional options for the handlers used by this control. This
+     *     is a hash with the keys "click", "box" and "hover".
+     */
+    handlerOptions: null,
+    
+    /**
+     * Property: handlers
+     * {Object} Object with references to multiple <OpenLayers.Handler>
+     *     instances.
+     */
+    handlers: null,
+
+    /**
+     * Property: hoverResponse
+     * {<OpenLayers.Protocol.Response>} The response object associated with
+     *     the currently running hover request (if any).
+     */
+    hoverResponse: null,
+    
+    /**
+     * Property: filterType
+     * {<String>} The type of filter to use when sending off a request. 
+     *     Possible values: 
+     *     OpenLayers.Filter.Spatial.<BBOX|INTERSECTS|WITHIN|CONTAINS>
+     *     Defaults to: OpenLayers.Filter.Spatial.BBOX
+     */
+    filterType: OpenLayers.Filter.Spatial.BBOX,
+
+    /**
+     * Constant: EVENT_TYPES
+     *
+     * Supported event types:
+     * beforefeatureselected - Triggered when <click> is true before a
+     *      feature is selected. The event object has a feature property with
+     *      the feature about to select
+     * featureselected - Triggered when <click> is true and a feature is
+     *      selected. The event object has a feature property with the
+     *      selected feature
+     * beforefeaturesselected - Triggered when <click> is true before a
+     *      set of features is selected. The event object is an array of
+     *      feature properties with the features about to be selected.  
+     *      Return false after receiving this event to discontinue processing
+     *      of all featureselected events and the featuresselected event.
+     * featuresselected - Triggered when <click> is true and a set of
+     *      features is selected.  The event object is an array of feature
+     *      properties of the selected features
+     * featureunselected - Triggered when <click> is true and a feature is
+     *      unselected. The event object has a feature property with the
+     *      unselected feature
+     * clickout - Triggered when when <click> is true and no feature was
+     *      selected.
+     * hoverfeature - Triggered when <hover> is true and the mouse has
+     *      stopped over a feature
+     * outfeature - Triggered when <hover> is true and the mouse moves
+     *      moved away from a hover-selected feature
+     */
+    EVENT_TYPES: ["featureselected", "featuresselected", "featureunselected", 
+        "clickout", "beforefeatureselected", "beforefeaturesselected", 
+        "hoverfeature", "outfeature"],
+
+    /**
+     * Constructor: OpenLayers.Control.GetFeature
+     * Create a new control for fetching remote features.
+     *
+     * Parameters:
+     * options - {Object} A configuration object which at least has to contain
+     *     a <protocol> property
+     */
+    initialize: function(options) {
+        // concatenate events specific to vector with those from the base
+        this.EVENT_TYPES =
+            OpenLayers.Control.GetFeature.prototype.EVENT_TYPES.concat(
+            OpenLayers.Control.prototype.EVENT_TYPES
+        );
+
+        options.handlerOptions = options.handlerOptions || {};
+
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        
+        this.features = {};
+
+        this.handlers = {};
+        
+        if(this.click) {
+            this.handlers.click = new OpenLayers.Handler.Click(this,
+                {click: this.selectClick}, this.handlerOptions.click || {});
+        }
+
+        if(this.box) {
+            this.handlers.box = new OpenLayers.Handler.Box(
+                this, {done: this.selectBox},
+                OpenLayers.Util.extend(this.handlerOptions.box, {
+                    boxDivClassName: "olHandlerBoxSelectFeature"
+                })
+            ); 
+        }
+        
+        if(this.hover) {
+            this.handlers.hover = new OpenLayers.Handler.Hover(
+                this, {'move': this.cancelHover, 'pause': this.selectHover},
+                OpenLayers.Util.extend(this.handlerOptions.hover, {
+                    'delay': 250
+                })
+            );
+        }
+    },
+    
+    /**
+     * Method: activate
+     * Activates the control.
+     * 
+     * Returns:
+     * {Boolean} The control was effectively activated.
+     */
+    activate: function () {
+        if (!this.active) {
+            for(var i in this.handlers) {
+                this.handlers[i].activate();
+            }
+        }
+        return OpenLayers.Control.prototype.activate.apply(
+            this, arguments
+        );
+    },
+
+    /**
+     * Method: deactivate
+     * Deactivates the control.
+     * 
+     * Returns:
+     * {Boolean} The control was effectively deactivated.
+     */
+    deactivate: function () {
+        if (this.active) {
+            for(var i in this.handlers) {
+                this.handlers[i].deactivate();
+            }
+        }
+        return OpenLayers.Control.prototype.deactivate.apply(
+            this, arguments
+        );
+    },
+    
+    /**
+     * Method: selectClick
+     * Called on click
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     */
+    selectClick: function(evt) {
+        var bounds = this.pixelToBounds(evt.xy);
+        
+        this.setModifiers(evt);
+        this.request(bounds, {single: this.single});
+    },
+
+    /**
+     * Method: selectBox
+     * Callback from the handlers.box set up when <box> selection is on
+     *
+     * Parameters:
+     * position - {<OpenLayers.Bounds>}  
+     */
+    selectBox: function(position) {
+        var bounds;
+        if (position instanceof OpenLayers.Bounds) {
+            var minXY = this.map.getLonLatFromPixel(
+                new OpenLayers.Pixel(position.left, position.bottom)
+            );
+            var maxXY = this.map.getLonLatFromPixel(
+                new OpenLayers.Pixel(position.right, position.top)
+            );
+            bounds = new OpenLayers.Bounds(
+                minXY.lon, minXY.lat, maxXY.lon, maxXY.lat
+            );
+            
+        } else {
+            if(this.click) {
+                // box without extent - let the click handler take care of it
+                return;
+            }
+            bounds = this.pixelToBounds(position);
+        }
+        this.setModifiers(this.handlers.box.dragHandler.evt);
+        this.request(bounds);
+    },
+    
+    /**
+     * Method selectHover
+     * Callback from the handlers.hover set up when <hover> selection is on
+     *
+     * Parameters:
+     * evt {Object} - event object with an xy property
+     */
+    selectHover: function(evt) {
+        var bounds = this.pixelToBounds(evt.xy);
+        this.request(bounds, {single: true, hover: true});
+    },
+
+    /**
+     * Method: cancelHover
+     * Callback from the handlers.hover set up when <hover> selection is on
+     */
+    cancelHover: function() {
+        if (this.hoverResponse) {
+            this.protocol.abort(this.hoverResponse);
+            this.hoverResponse = null;
+
+            OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
+        }
+    },
+
+    /**
+     * Method: request
+     * Sends a GetFeature request to the WFS
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} bounds for the request's BBOX filter
+     * options - {Object} additional options for this method.
+     * 
+     * Supported options include:
+     * single - {Boolean} A single feature should be returned.
+     *     Note that this will be ignored if the protocol does not
+     *     return the geometries of the features.
+     * hover - {Boolean} Do the request for the hover handler.
+     */
+    request: function(bounds, options) {
+        options = options || {};
+        var filter = new OpenLayers.Filter.Spatial({
+            type: this.filterType, 
+            value: bounds
+        });
+        
+        // Set the cursor to "wait" to tell the user we're working.
+        OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait");
+
+        var response = this.protocol.read({
+            maxFeatures: options.single == true ? this.maxFeatures : undefined,
+            filter: filter,
+            callback: function(result) {
+                if(result.success()) {
+                    if(result.features.length) {
+                        if(options.single == true) {
+                            this.selectBestFeature(result.features,
+                                bounds.getCenterLonLat(), options);
+                        } else {
+                            this.select(result.features);
+                        }
+                    } else if(options.hover) {
+                        this.hoverSelect();
+                    } else {
+                        this.events.triggerEvent("clickout");
+                        if(this.clickout) {
+                            this.unselectAll();
+                        }
+                    }
+                }
+                // Reset the cursor.
+                OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
+            },
+            scope: this
+        });
+        if(options.hover == true) {
+            this.hoverResponse = response;
+        }
+    },
+
+    /**
+     * Method: selectBestFeature
+     * Selects the feature from an array of features that is the best match
+     *     for the click position.
+     * 
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>)}
+     * clickPosition - {<OpenLayers.LonLat>}
+     * options - {Object} additional options for this method
+     * 
+     * Supported options include:
+     * hover - {Boolean} Do the selection for the hover handler.
+     */
+    selectBestFeature: function(features, clickPosition, options) {
+        options = options || {};
+        if(features.length) {
+            var point = new OpenLayers.Geometry.Point(clickPosition.lon,
+                clickPosition.lat);
+            var feature, resultFeature, dist;
+            var minDist = Number.MAX_VALUE;
+            for(var i=0; i<features.length; ++i) {
+                feature = features[i];
+                if(feature.geometry) {
+                    dist = point.distanceTo(feature.geometry, {edge: false});
+                    if(dist < minDist) {
+                        minDist = dist;
+                        resultFeature = feature;
+                        if(minDist == 0) {
+                            break;
+                        }
+                    }
+                }
+            }
+            
+            if(options.hover == true) {
+                this.hoverSelect(resultFeature);
+            } else {
+                this.select(resultFeature || features);
+            } 
+        }
+    },
+    
+    /**
+     * Method: setModifiers
+     * Sets the multiple and toggle modifiers according to the current event
+     * 
+     * Parameters:
+     * evt {<OpenLayers.Event>}
+     */
+    setModifiers: function(evt) {
+        this.modifiers = {
+            multiple: this.multiple || (this.multipleKey && evt[this.multipleKey]),
+            toggle: this.toggle || (this.toggleKey && evt[this.toggleKey])
+        };        
+    },
+
+    /**
+     * Method: select
+     * Add feature to the hash of selected features and trigger the
+     * featureselected and featuresselected events.
+     * 
+     * Parameters:
+     * features - {<OpenLayers.Feature.Vector>} or an array of features
+     */
+    select: function(features) {
+        if(!this.modifiers.multiple && !this.modifiers.toggle) {
+            this.unselectAll();
+        }
+        if(!(features instanceof Array)) {
+            features = [features];
+        }
+        
+        var cont = this.events.triggerEvent("beforefeaturesselected", {
+            features: features
+        });
+        if(cont !== false) {
+            var selectedFeatures = [];
+            var feature;
+            for(var i=0, len=features.length; i<len; ++i) {
+                feature = features[i];
+                if(this.features[feature.fid || feature.id]) {
+                    if(this.modifiers.toggle) {
+                        this.unselect(this.features[feature.fid || feature.id]);
+                    }
+                } else {
+                    cont = this.events.triggerEvent("beforefeatureselected", {
+                        feature: feature
+                    });
+                    if(cont !== false) {
+                        this.features[feature.fid || feature.id] = feature;
+                        selectedFeatures.push(feature);
+                
+                        this.events.triggerEvent("featureselected",
+                            {feature: feature});
+                    }
+                }
+            }
+            this.events.triggerEvent("featuresselected", {
+                features: selectedFeatures
+            });
+        }
+    },
+    
+    /**
+     * Method: hoverSelect
+     * Sets/unsets the <hoverFeature>
+     * 
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} the feature to hover-select.
+     *     If none is provided, the current <hoverFeature> will be nulled and
+     *     the outfeature event will be triggered.
+     */
+    hoverSelect: function(feature) {
+        var fid = feature ? feature.fid || feature.id : null;
+        var hfid = this.hoverFeature ?
+            this.hoverFeature.fid || this.hoverFeature.id : null;
+            
+        if(hfid && hfid != fid) {
+            this.events.triggerEvent("outfeature",
+                {feature: this.hoverFeature});
+            this.hoverFeature = null;
+        }
+        if(fid && fid != hfid) {
+            this.events.triggerEvent("hoverfeature", {feature: feature});
+            this.hoverFeature = feature;
+        }
+    },
+
+    /**
+     * Method: unselect
+     * Remove feature from the hash of selected features and trigger the
+     * featureunselected event.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     */
+    unselect: function(feature) {
+        delete this.features[feature.fid || feature.id];
+        this.events.triggerEvent("featureunselected", {feature: feature});
+    },
+    
+    /**
+     * Method: unselectAll
+     * Unselect all selected features.
+     */
+    unselectAll: function() {
+        // we'll want an option to supress notification here
+        for(var fid in this.features) {
+            this.unselect(this.features[fid]);
+        }
+    },
+    
+    /** 
+     * Method: setMap
+     * Set the map property for the control. 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        for(var i in this.handlers) {
+            this.handlers[i].setMap(map);
+        }
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+    },
+    
+    /**
+     * Method: pixelToBounds
+     * Takes a pixel as argument and creates bounds after adding the
+     * <clickTolerance>.
+     * 
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>}
+     */
+    pixelToBounds: function(pixel) {
+        var llPx = pixel.add(-this.clickTolerance/2, this.clickTolerance/2);
+        var urPx = pixel.add(this.clickTolerance/2, -this.clickTolerance/2);
+        var ll = this.map.getLonLatFromPixel(llPx);
+        var ur = this.map.getLonLatFromPixel(urPx);
+        return new OpenLayers.Bounds(ll.lon, ll.lat, ur.lon, ur.lat);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.GetFeature"
+});
diff --git a/lib/OpenLayers/Control/Graticule.js b/lib/OpenLayers/Control/Graticule.js
new file mode 100644
index 0000000..3e6537a
--- /dev/null
+++ b/lib/OpenLayers/Control/Graticule.js
@@ -0,0 +1,373 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Graticule
+ * The Graticule displays a grid of latitude/longitude lines reprojected on
+ * the map.  
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ *  
+ */
+OpenLayers.Control.Graticule = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * APIProperty: autoActivate
+     * {Boolean} Activate the control when it is added to a map. Default is
+     *     true. 
+     */
+    autoActivate: true,
+    
+    /**
+    * APIProperty: intervals
+    * {Array(Float)} A list of possible graticule widths in degrees.
+    */
+    intervals: [ 45, 30, 20, 10, 5, 2, 1,
+                 0.5, 0.2, 0.1, 0.05, 0.01, 
+                 0.005, 0.002, 0.001 ],
+
+    /**
+     * APIProperty: displayInLayerSwitcher
+     * {Boolean} Allows the Graticule control to be switched on and off by 
+     *     LayerSwitcher control. Defaults is true.
+     */
+    displayInLayerSwitcher: true,
+
+    /**
+     * APIProperty: visible
+     * {Boolean} should the graticule be initially visible (default=true)
+     */
+    visible: true,
+
+    /**
+     * APIProperty: numPoints
+     * {Integer} The number of points to use in each graticule line.  Higher
+     * numbers result in a smoother curve for projected maps 
+     */
+    numPoints: 50,
+
+    /**
+     * APIProperty: targetSize
+     * {Integer} The maximum size of the grid in pixels on the map
+     */
+    targetSize: 200,
+
+    /**
+     * APIProperty: layerName
+     * {String} The name to be displayed in the layer switcher, default is set 
+     *     by {<OpenLayers.Lang>}.
+     */
+    layerName: null,
+
+    /**
+     * APIProperty: labelled
+     * {Boolean} Should the graticule lines be labelled?. default=true
+     */
+    labelled: true,
+
+    /**
+     * APIProperty: labelFormat
+     * {String} the format of the labels, default = 'dm'. See
+     * <OpenLayers.Util.getFormattedLonLat> for other options.
+     */
+    labelFormat: 'dm',
+
+    /**
+     * APIProperty: lineSymbolizer
+     * {symbolizer} the symbolizer used to render lines
+     */
+    lineSymbolizer: {
+                strokeColor: "#333",
+                strokeWidth: 1,
+                strokeOpacity: 0.5
+            },
+
+    /**
+     * APIProperty: labelSymbolizer
+     * {symbolizer} the symbolizer used to render labels
+     */
+     labelSymbolizer: {},
+
+    /**
+     * Property: gratLayer
+     * {OpenLayers.Layer.Vector} vector layer used to draw the graticule on
+     */
+    gratLayer: null,
+
+    /**
+     * Constructor: OpenLayers.Control.Graticule
+     * Create a new graticule control to display a grid of latitude longitude
+     * lines.
+     * 
+     * Parameters:
+     * options - {Object} An optional object whose properties will be used
+     *     to extend the control.
+     */
+    initialize: function(options) {
+        options = options || {};
+        options.layerName = options.layerName || OpenLayers.i18n("graticule");
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        
+        this.labelSymbolizer.stroke = false;
+        this.labelSymbolizer.fill = false;
+        this.labelSymbolizer.label = "${label}";
+        this.labelSymbolizer.labelAlign = "${labelAlign}";
+        this.labelSymbolizer.labelXOffset = "${xOffset}";
+        this.labelSymbolizer.labelYOffset = "${yOffset}";
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        this.deactivate();        
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);        
+        if (this.gratLayer) {
+            this.gratLayer.destroy();
+            this.gratLayer = null;
+        }
+    },
+    
+    /**
+     * Method: draw
+     *
+     * initializes the graticule layer and does the initial update
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        if (!this.gratLayer) {
+            var gratStyle = new OpenLayers.Style({},{
+                rules: [new OpenLayers.Rule({'symbolizer':
+                    {"Point":this.labelSymbolizer,
+                     "Line":this.lineSymbolizer}
+                })]
+            });
+            this.gratLayer = new OpenLayers.Layer.Vector(this.layerName, {
+                styleMap: new OpenLayers.StyleMap({'default':gratStyle}),
+                visibility: this.visible,
+                displayInLayerSwitcher: this.displayInLayerSwitcher
+            });
+        }
+        return this.div;
+    },
+
+     /**
+     * APIMethod: activate
+     */
+    activate: function() {
+        if (OpenLayers.Control.prototype.activate.apply(this, arguments)) {
+            this.map.addLayer(this.gratLayer);
+            this.map.events.register('moveend', this, this.update);     
+            this.update();
+            return true;            
+        } else {
+            return false;
+        }
+    },
+    
+    /**
+     * APIMethod: deactivate
+     */
+    deactivate: function() {
+        if (OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
+            this.map.events.unregister('moveend', this, this.update);
+            this.map.removeLayer(this.gratLayer);
+            return true;
+        } else {
+            return false;
+        }
+    },
+    /**
+     * Method: update
+     *
+     * calculates the grid to be displayed and actually draws it
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    update: function() {
+        //wait for the map to be initialized before proceeding
+        var mapBounds = this.map.getExtent();
+        if (!mapBounds) {
+            return;
+        }
+        
+        //clear out the old grid
+        this.gratLayer.destroyFeatures();
+        
+        //get the projection objects required
+        var llProj = new OpenLayers.Projection("EPSG:4326");
+        var mapProj = this.map.getProjectionObject();
+        var mapRes = this.map.getResolution();
+        
+        //if the map is in lon/lat, then the lines are straight and only one
+        //point is required
+        if (mapProj.proj && mapProj.proj.projName == "longlat") {
+            this.numPoints = 1;
+        }
+        
+        //get the map center in EPSG:4326
+        var mapCenter = this.map.getCenter(); //lon and lat here are really map x and y
+        var mapCenterLL = new OpenLayers.Pixel(mapCenter.lon, mapCenter.lat);
+        OpenLayers.Projection.transform(mapCenterLL, mapProj, llProj);
+        
+        /* This block of code determines the lon/lat interval to use for the
+         * grid by calculating the diagonal size of one grid cell at the map
+         * center.  Iterates through the intervals array until the diagonal
+         * length is less than the targetSize option.
+         */
+        //find lat/lon interval that results in a grid of less than the target size
+        var testSq = this.targetSize*mapRes;
+        testSq *= testSq;   //compare squares rather than doing a square root to save time
+        var llInterval;
+        for (var i=0; i<this.intervals.length; ++i) {
+            llInterval = this.intervals[i];   //could do this for both x and y??
+            var delta = llInterval/2;  
+            var p1 = mapCenterLL.offset(new OpenLayers.Pixel(-delta, -delta));  //test coords in EPSG:4326 space
+            var p2 = mapCenterLL.offset(new OpenLayers.Pixel( delta,  delta));
+            OpenLayers.Projection.transform(p1, llProj, mapProj); // convert them back to map projection
+            OpenLayers.Projection.transform(p2, llProj, mapProj);
+            var distSq = (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y);
+            if (distSq <= testSq) {
+                break;
+            }
+        }
+        //alert(llInterval);
+        
+        //round the LL center to an even number based on the interval
+        mapCenterLL.x = Math.floor(mapCenterLL.x/llInterval)*llInterval;
+        mapCenterLL.y = Math.floor(mapCenterLL.y/llInterval)*llInterval;
+        //TODO adjust for minutses/seconds?
+        
+        /* The following 2 blocks calculate the nodes of the grid along a 
+         * line of constant longitude (then latitiude) running through the
+         * center of the map until it reaches the map edge.  The calculation
+         * goes from the center in both directions to the edge.
+         */
+        //get the central longitude line, increment the latitude
+        var iter = 0;
+        var centerLonPoints = [mapCenterLL.clone()];
+        var newPoint = mapCenterLL.clone();
+        var mapXY;
+        do {
+            newPoint = newPoint.offset(new OpenLayers.Pixel(0,llInterval));
+            mapXY = OpenLayers.Projection.transform(newPoint.clone(), llProj, mapProj);
+            centerLonPoints.unshift(newPoint);
+        } while (mapBounds.containsPixel(mapXY) && ++iter<1000);
+        newPoint = mapCenterLL.clone();
+        do {          
+            newPoint = newPoint.offset(new OpenLayers.Pixel(0,-llInterval));
+            mapXY = OpenLayers.Projection.transform(newPoint.clone(), llProj, mapProj);
+            centerLonPoints.push(newPoint);
+        } while (mapBounds.containsPixel(mapXY) && ++iter<1000);
+        
+        //get the central latitude line, increment the longitude
+        iter = 0;
+        var centerLatPoints = [mapCenterLL.clone()];
+        newPoint = mapCenterLL.clone();
+        do {
+            newPoint = newPoint.offset(new OpenLayers.Pixel(-llInterval, 0));
+            mapXY = OpenLayers.Projection.transform(newPoint.clone(), llProj, mapProj);
+            centerLatPoints.unshift(newPoint);
+        } while (mapBounds.containsPixel(mapXY) && ++iter<1000);
+        newPoint = mapCenterLL.clone();
+        do {          
+            newPoint = newPoint.offset(new OpenLayers.Pixel(llInterval, 0));
+            mapXY = OpenLayers.Projection.transform(newPoint.clone(), llProj, mapProj);
+            centerLatPoints.push(newPoint);
+        } while (mapBounds.containsPixel(mapXY) && ++iter<1000);
+        
+        //now generate a line for each node in the central lat and lon lines
+        //first loop over constant longitude
+        var lines = [];
+        for(var i=0; i < centerLatPoints.length; ++i) {
+            var lon = centerLatPoints[i].x;
+            var pointList = [];
+            var labelPoint = null;
+            var latEnd = Math.min(centerLonPoints[0].y, 90);
+            var latStart = Math.max(centerLonPoints[centerLonPoints.length - 1].y, -90);
+            var latDelta = (latEnd - latStart)/this.numPoints;
+            var lat = latStart;
+            for(var j=0; j<= this.numPoints; ++j) {
+                var gridPoint = new OpenLayers.Geometry.Point(lon,lat);
+                gridPoint.transform(llProj, mapProj);
+                pointList.push(gridPoint);
+                lat += latDelta;
+                if (gridPoint.y >= mapBounds.bottom && !labelPoint) {
+                    labelPoint = gridPoint;
+                }
+            }
+            if (this.labelled) {
+                //keep track of when this grid line crosses the map bounds to set
+                //the label position
+                //labels along the bottom, add 10 pixel offset up into the map
+                //TODO add option for labels on top
+                var labelPos = new OpenLayers.Geometry.Point(labelPoint.x,mapBounds.bottom);
+                var labelAttrs = {
+                    value: lon,
+                    label: this.labelled?OpenLayers.Util.getFormattedLonLat(lon, "lon", this.labelFormat):"",
+                    labelAlign: "cb",
+                    xOffset: 0,
+                    yOffset: 2
+                }; 
+                this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(labelPos,labelAttrs));
+            }
+            var geom = new OpenLayers.Geometry.LineString(pointList);
+            lines.push(new OpenLayers.Feature.Vector(geom));
+        }
+        
+        //now draw the lines of constant latitude
+        for (var j=0; j < centerLonPoints.length; ++j) {
+            lat = centerLonPoints[j].y;
+            if (lat<-90 || lat>90) {  //latitudes only valid between -90 and 90
+                continue;
+            }
+            var pointList = [];
+            var lonStart = centerLatPoints[0].x;
+            var lonEnd = centerLatPoints[centerLatPoints.length - 1].x;
+            var lonDelta = (lonEnd - lonStart)/this.numPoints;
+            var lon = lonStart;
+            var labelPoint = null;
+            for(var i=0; i <= this.numPoints ; ++i) {
+                var gridPoint = new OpenLayers.Geometry.Point(lon,lat);
+                gridPoint.transform(llProj, mapProj);
+                pointList.push(gridPoint);
+                lon += lonDelta;
+                if (gridPoint.x < mapBounds.right) {
+                    labelPoint = gridPoint;
+                }
+            }
+            if (this.labelled) {
+                //keep track of when this grid line crosses the map bounds to set
+                //the label position
+                //labels along the right, 30 pixel offset left into the map
+                //TODO add option for labels on left
+                var labelPos = new OpenLayers.Geometry.Point(mapBounds.right, labelPoint.y); 
+                var labelAttrs = {
+                    value: lat,
+                    label: this.labelled?OpenLayers.Util.getFormattedLonLat(lat, "lat", this.labelFormat):"",
+                    labelAlign: "rb",
+                    xOffset: -2,
+                    yOffset: 2
+                }; 
+                this.gratLayer.addFeatures(new OpenLayers.Feature.Vector(labelPos,labelAttrs));
+            }
+            var geom = new OpenLayers.Geometry.LineString(pointList);
+            lines.push(new OpenLayers.Feature.Vector(geom));
+          }
+          this.gratLayer.addFeatures(lines);
+    },
+    
+    CLASS_NAME: "OpenLayers.Control.Graticule"
+});
+
diff --git a/lib/OpenLayers/Control/KeyboardDefaults.js b/lib/OpenLayers/Control/KeyboardDefaults.js
new file mode 100644
index 0000000..acd46bf
--- /dev/null
+++ b/lib/OpenLayers/Control/KeyboardDefaults.js
@@ -0,0 +1,127 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Handler/Keyboard.js
+ */
+
+/**
+ * Class: OpenLayers.Control.KeyboardDefaults
+ * The KeyboardDefaults control adds panning and zooming functions, controlled
+ * with the keyboard. By default arrow keys pan, +/- keys zoom & Page Up/Page
+ * Down/Home/End scroll by three quarters of a page.
+ * 
+ * This control has no visible appearance.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.KeyboardDefaults = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * APIProperty: autoActivate
+     * {Boolean} Activate the control when it is added to a map.  Default is
+     *     true.
+     */
+    autoActivate: true,
+
+    /**
+     * APIProperty: slideFactor
+     * Pixels to slide by.
+     */
+    slideFactor: 75,
+
+    /**
+     * Constructor: OpenLayers.Control.KeyboardDefaults
+     */
+    initialize: function() {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+    },
+    
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        if (this.handler) {
+            this.handler.destroy();
+        }        
+        this.handler = null;
+        
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+    },
+    
+    /**
+     * Method: draw
+     * Create handler.
+     */
+    draw: function() {
+        this.handler = new OpenLayers.Handler.Keyboard( this, { 
+                                "keydown": this.defaultKeyPress });
+    },
+    
+    /**
+     * Method: defaultKeyPress
+     * When handling the key event, we only use evt.keyCode. This holds 
+     * some drawbacks, though we get around them below. When interpretting
+     * the keycodes below (including the comments associated with them),
+     * consult the URL below. For instance, the Safari browser returns
+     * "IE keycodes", and so is supported by any keycode labeled "IE".
+     * 
+     * Very informative URL:
+     *    http://unixpapa.com/js/key.html
+     *
+     * Parameters:
+     * code - {Integer} 
+     */
+    defaultKeyPress: function (evt) {
+        switch(evt.keyCode) {
+            case OpenLayers.Event.KEY_LEFT:
+                this.map.pan(-this.slideFactor, 0);
+                break;
+            case OpenLayers.Event.KEY_RIGHT: 
+                this.map.pan(this.slideFactor, 0);
+                break;
+            case OpenLayers.Event.KEY_UP:
+                this.map.pan(0, -this.slideFactor);
+                break;
+            case OpenLayers.Event.KEY_DOWN:
+                this.map.pan(0, this.slideFactor);
+                break;
+            
+            case 33: // Page Up. Same in all browsers.
+                var size = this.map.getSize();
+                this.map.pan(0, -0.75*size.h);
+                break;
+            case 34: // Page Down. Same in all browsers.
+                var size = this.map.getSize();
+                this.map.pan(0, 0.75*size.h);
+                break; 
+            case 35: // End. Same in all browsers.
+                var size = this.map.getSize();
+                this.map.pan(0.75*size.w, 0);
+                break; 
+            case 36: // Home. Same in all browsers.
+                var size = this.map.getSize();
+                this.map.pan(-0.75*size.w, 0);
+                break; 
+
+            case 43:  // +/= (ASCII), keypad + (ASCII, Opera)
+            case 61:  // +/= (Mozilla, Opera, some ASCII)
+            case 187: // +/= (IE)
+            case 107: // keypad + (IE, Mozilla)
+                this.map.zoomIn();
+                break; 
+            case 45:  // -/_ (ASCII, Opera), keypad - (ASCII, Opera)
+            case 109: // -/_ (Mozilla), keypad - (Mozilla, IE)
+            case 189: // -/_ (IE)
+            case 95:  // -/_ (some ASCII)
+                this.map.zoomOut();
+                break; 
+        } 
+    },
+
+    CLASS_NAME: "OpenLayers.Control.KeyboardDefaults"
+});
diff --git a/lib/OpenLayers/Control/LayerSwitcher.js b/lib/OpenLayers/Control/LayerSwitcher.js
new file mode 100644
index 0000000..3f1b84e
--- /dev/null
+++ b/lib/OpenLayers/Control/LayerSwitcher.js
@@ -0,0 +1,620 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/** 
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.LayerSwitcher
+ * The LayerSwitcher control displays a table of contents for the map. This 
+ * allows the user interface to switch between BaseLasyers and to show or hide
+ * Overlays. By default the switcher is shown minimized on the right edge of 
+ * the map, the user may expand it by clicking on the handle.
+ *
+ * To create the LayerSwitcher outside of the map, pass the Id of a html div 
+ * as the first argument to the constructor.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.LayerSwitcher = 
+  OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * APIProperty: roundedCorner
+     * {Boolean} If true the Rico library is used for rounding the corners
+     *     of the layer switcher div, defaults to true.
+     */
+    roundedCorner: true,
+
+    /**  
+     * APIProperty: roundedCornerColor
+     * {String} The color of the rounded corners, only applies if roundedCorner
+     *     is true, defaults to "darkblue".
+     */
+    roundedCornerColor: "darkblue",
+    
+    /**  
+     * Property: layerStates 
+     * {Array(Object)} Basically a copy of the "state" of the map's layers 
+     *     the last time the control was drawn. We have this in order to avoid
+     *     unnecessarily redrawing the control.
+     */
+    layerStates: null,
+    
+
+  // DOM Elements
+  
+    /**
+     * Property: layersDiv
+     * {DOMElement} 
+     */
+    layersDiv: null,
+    
+    /** 
+     * Property: baseLayersDiv
+     * {DOMElement}
+     */
+    baseLayersDiv: null,
+
+    /** 
+     * Property: baseLayers
+     * {Array(<OpenLayers.Layer>)}
+     */
+    baseLayers: null,
+    
+    
+    /** 
+     * Property: dataLbl
+     * {DOMElement} 
+     */
+    dataLbl: null,
+    
+    /** 
+     * Property: dataLayersDiv
+     * {DOMElement} 
+     */
+    dataLayersDiv: null,
+
+    /** 
+     * Property: dataLayers
+     * {Array(<OpenLayers.Layer>)} 
+     */
+    dataLayers: null,
+
+
+    /** 
+     * Property: minimizeDiv
+     * {DOMElement} 
+     */
+    minimizeDiv: null,
+
+    /** 
+     * Property: maximizeDiv
+     * {DOMElement} 
+     */
+    maximizeDiv: null,
+    
+    /**
+     * APIProperty: ascending
+     * {Boolean} 
+     */
+    ascending: true,
+ 
+    /**
+     * Constructor: OpenLayers.Control.LayerSwitcher
+     * 
+     * Parameters:
+     * options - {Object}
+     */
+    initialize: function(options) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+        this.layerStates = [];
+    },
+
+    /**
+     * APIMethod: destroy 
+     */    
+    destroy: function() {
+        
+        OpenLayers.Event.stopObservingElement(this.div);
+
+        OpenLayers.Event.stopObservingElement(this.minimizeDiv);
+        OpenLayers.Event.stopObservingElement(this.maximizeDiv);
+
+        //clear out layers info and unregister their events 
+        this.clearLayersArray("base");
+        this.clearLayersArray("data");
+        
+        this.map.events.un({
+            "addlayer": this.redraw,
+            "changelayer": this.redraw,
+            "removelayer": this.redraw,
+            "changebaselayer": this.redraw,
+            scope: this
+        });
+        
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+    },
+
+    /** 
+     * Method: setMap
+     *
+     * Properties:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+
+        this.map.events.on({
+            "addlayer": this.redraw,
+            "changelayer": this.redraw,
+            "removelayer": this.redraw,
+            "changebaselayer": this.redraw,
+            scope: this
+        });
+    },
+
+    /**
+     * Method: draw
+     *
+     * Returns:
+     * {DOMElement} A reference to the DIV DOMElement containing the 
+     *     switcher tabs.
+     */  
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this);
+
+        // create layout divs
+        this.loadContents();
+
+        // set mode to minimize
+        if(!this.outsideViewport) {
+            this.minimizeControl();
+        }
+
+        // populate div with current info
+        this.redraw();    
+
+        return this.div;
+    },
+
+    /** 
+     * Method: clearLayersArray
+     * User specifies either "base" or "data". we then clear all the
+     *     corresponding listeners, the div, and reinitialize a new array.
+     * 
+     * Parameters:
+     * layersType - {String}  
+     */
+    clearLayersArray: function(layersType) {
+        var layers = this[layersType + "Layers"];
+        if (layers) {
+            for(var i=0, len=layers.length; i<len ; i++) {
+                var layer = layers[i];
+                OpenLayers.Event.stopObservingElement(layer.inputElem);
+                OpenLayers.Event.stopObservingElement(layer.labelSpan);
+            }
+        }
+        this[layersType + "LayersDiv"].innerHTML = "";
+        this[layersType + "Layers"] = [];
+    },
+
+
+    /**
+     * Method: checkRedraw
+     * Checks if the layer state has changed since the last redraw() call.
+     * 
+     * Returns:
+     * {Boolean} The layer state changed since the last redraw() call. 
+     */
+    checkRedraw: function() {
+        var redraw = false;
+        if ( !this.layerStates.length ||
+             (this.map.layers.length != this.layerStates.length) ) {
+            redraw = true;
+        } else {
+            for (var i=0, len=this.layerStates.length; i<len; i++) {
+                var layerState = this.layerStates[i];
+                var layer = this.map.layers[i];
+                if ( (layerState.name != layer.name) || 
+                     (layerState.inRange != layer.inRange) || 
+                     (layerState.id != layer.id) || 
+                     (layerState.visibility != layer.visibility) ) {
+                    redraw = true;
+                    break;
+                }    
+            }
+        }    
+        return redraw;
+    },
+    
+    /** 
+     * Method: redraw
+     * Goes through and takes the current state of the Map and rebuilds the
+     *     control to display that state. Groups base layers into a 
+     *     radio-button group and lists each data layer with a checkbox.
+     *
+     * Returns: 
+     * {DOMElement} A reference to the DIV DOMElement containing the control
+     */  
+    redraw: function() {
+        //if the state hasn't changed since last redraw, no need 
+        // to do anything. Just return the existing div.
+        if (!this.checkRedraw()) { 
+            return this.div; 
+        } 
+
+        //clear out previous layers 
+        this.clearLayersArray("base");
+        this.clearLayersArray("data");
+        
+        var containsOverlays = false;
+        var containsBaseLayers = false;
+        
+        // Save state -- for checking layer if the map state changed.
+        // We save this before redrawing, because in the process of redrawing
+        // we will trigger more visibility changes, and we want to not redraw
+        // and enter an infinite loop.
+        var len = this.map.layers.length;
+        this.layerStates = new Array(len);
+        for (var i=0; i <len; i++) {
+            var layer = this.map.layers[i];
+            this.layerStates[i] = {
+                'name': layer.name, 
+                'visibility': layer.visibility,
+                'inRange': layer.inRange,
+                'id': layer.id
+            };
+        }    
+
+        var layers = this.map.layers.slice();
+        if (!this.ascending) { layers.reverse(); }
+        for(var i=0, len=layers.length; i<len; i++) {
+            var layer = layers[i];
+            var baseLayer = layer.isBaseLayer;
+
+            if (layer.displayInLayerSwitcher) {
+
+                if (baseLayer) {
+                    containsBaseLayers = true;
+                } else {
+                    containsOverlays = true;
+                }    
+
+                // only check a baselayer if it is *the* baselayer, check data
+                //  layers if they are visible
+                var checked = (baseLayer) ? (layer == this.map.baseLayer)
+                                          : layer.getVisibility();
+    
+                // create input element
+                var inputElem = document.createElement("input");
+                inputElem.id = this.id + "_input_" + layer.name;
+                inputElem.name = (baseLayer) ? this.id + "_baseLayers" : layer.name;
+                inputElem.type = (baseLayer) ? "radio" : "checkbox";
+                inputElem.value = layer.name;
+                inputElem.checked = checked;
+                inputElem.defaultChecked = checked;
+
+                if (!baseLayer && !layer.inRange) {
+                    inputElem.disabled = true;
+                }
+                var context = {
+                    'inputElem': inputElem,
+                    'layer': layer,
+                    'layerSwitcher': this
+                };
+                OpenLayers.Event.observe(inputElem, "mouseup", 
+                    OpenLayers.Function.bindAsEventListener(this.onInputClick,
+                                                            context)
+                );
+                
+                // create span
+                var labelSpan = document.createElement("span");
+                OpenLayers.Element.addClass(labelSpan, "labelSpan")
+                if (!baseLayer && !layer.inRange) {
+                    labelSpan.style.color = "gray";
+                }
+                labelSpan.innerHTML = layer.name;
+                labelSpan.style.verticalAlign = (baseLayer) ? "bottom" 
+                                                            : "baseline";
+                OpenLayers.Event.observe(labelSpan, "click", 
+                    OpenLayers.Function.bindAsEventListener(this.onInputClick,
+                                                            context)
+                );
+                // create line break
+                var br = document.createElement("br");
+    
+                
+                var groupArray = (baseLayer) ? this.baseLayers
+                                             : this.dataLayers;
+                groupArray.push({
+                    'layer': layer,
+                    'inputElem': inputElem,
+                    'labelSpan': labelSpan
+                });
+                                                     
+    
+                var groupDiv = (baseLayer) ? this.baseLayersDiv
+                                           : this.dataLayersDiv;
+                groupDiv.appendChild(inputElem);
+                groupDiv.appendChild(labelSpan);
+                groupDiv.appendChild(br);
+            }
+        }
+
+        // if no overlays, dont display the overlay label
+        this.dataLbl.style.display = (containsOverlays) ? "" : "none";        
+        
+        // if no baselayers, dont display the baselayer label
+        this.baseLbl.style.display = (containsBaseLayers) ? "" : "none";        
+
+        return this.div;
+    },
+
+    /** 
+     * Method:
+     * A label has been clicked, check or uncheck its corresponding input
+     * 
+     * Parameters:
+     * e - {Event} 
+     *
+     * Context:  
+     *  - {DOMElement} inputElem
+     *  - {<OpenLayers.Control.LayerSwitcher>} layerSwitcher
+     *  - {<OpenLayers.Layer>} layer
+     */
+
+    onInputClick: function(e) {
+
+        if (!this.inputElem.disabled) {
+            if (this.inputElem.type == "radio") {
+                this.inputElem.checked = true;
+                this.layer.map.setBaseLayer(this.layer);
+            } else {
+                this.inputElem.checked = !this.inputElem.checked;
+                this.layerSwitcher.updateMap();
+            }
+        }
+        OpenLayers.Event.stop(e);
+    },
+    
+    /**
+     * Method: onLayerClick
+     * Need to update the map accordingly whenever user clicks in either of
+     *     the layers.
+     * 
+     * Parameters: 
+     * e - {Event} 
+     */
+    onLayerClick: function(e) {
+        this.updateMap();
+    },
+
+
+    /** 
+     * Method: updateMap
+     * Cycles through the loaded data and base layer input arrays and makes
+     *     the necessary calls to the Map object such that that the map's 
+     *     visual state corresponds to what the user has selected in 
+     *     the control.
+     */
+    updateMap: function() {
+
+        // set the newly selected base layer        
+        for(var i=0, len=this.baseLayers.length; i<len; i++) {
+            var layerEntry = this.baseLayers[i];
+            if (layerEntry.inputElem.checked) {
+                this.map.setBaseLayer(layerEntry.layer, false);
+            }
+        }
+
+        // set the correct visibilities for the overlays
+        for(var i=0, len=this.dataLayers.length; i<len; i++) {
+            var layerEntry = this.dataLayers[i];   
+            layerEntry.layer.setVisibility(layerEntry.inputElem.checked);
+        }
+
+    },
+
+    /** 
+     * Method: maximizeControl
+     * Set up the labels and divs for the control
+     * 
+     * Parameters:
+     * e - {Event} 
+     */
+    maximizeControl: function(e) {
+
+        // set the div's width and height to empty values, so
+        // the div dimensions can be controlled by CSS
+        this.div.style.width = "";
+        this.div.style.height = "";
+
+        this.showControls(false);
+
+        if (e != null) {
+            OpenLayers.Event.stop(e);                                            
+        }
+    },
+    
+    /** 
+     * Method: minimizeControl
+     * Hide all the contents of the control, shrink the size, 
+     *     add the maximize icon
+     *
+     * Parameters:
+     * e - {Event} 
+     */
+    minimizeControl: function(e) {
+
+        // to minimize the control we set its div's width
+        // and height to 0px, we cannot just set "display"
+        // to "none" because it would hide the maximize
+        // div
+        this.div.style.width = "0px";
+        this.div.style.height = "0px";
+
+        this.showControls(true);
+
+        if (e != null) {
+            OpenLayers.Event.stop(e);                                            
+        }
+    },
+
+    /**
+     * Method: showControls
+     * Hide/Show all LayerSwitcher controls depending on whether we are
+     *     minimized or not
+     * 
+     * Parameters:
+     * minimize - {Boolean}
+     */
+    showControls: function(minimize) {
+
+        this.maximizeDiv.style.display = minimize ? "" : "none";
+        this.minimizeDiv.style.display = minimize ? "none" : "";
+
+        this.layersDiv.style.display = minimize ? "none" : "";
+    },
+    
+    /** 
+     * Method: loadContents
+     * Set up the labels and divs for the control
+     */
+    loadContents: function() {
+
+        //configure main div
+
+        OpenLayers.Event.observe(this.div, "mouseup", 
+            OpenLayers.Function.bindAsEventListener(this.mouseUp, this));
+        OpenLayers.Event.observe(this.div, "click",
+                      this.ignoreEvent);
+        OpenLayers.Event.observe(this.div, "mousedown",
+            OpenLayers.Function.bindAsEventListener(this.mouseDown, this));
+        OpenLayers.Event.observe(this.div, "dblclick", this.ignoreEvent);
+
+        // layers list div        
+        this.layersDiv = document.createElement("div");
+        this.layersDiv.id = this.id + "_layersDiv";
+        OpenLayers.Element.addClass(this.layersDiv, "layersDiv");
+
+        this.baseLbl = document.createElement("div");
+        this.baseLbl.innerHTML = OpenLayers.i18n("baseLayer");
+        OpenLayers.Element.addClass(this.baseLbl, "baseLbl");
+        
+        this.baseLayersDiv = document.createElement("div");
+        OpenLayers.Element.addClass(this.baseLayersDiv, "baseLayersDiv");
+
+        this.dataLbl = document.createElement("div");
+        this.dataLbl.innerHTML = OpenLayers.i18n("overlays");
+        OpenLayers.Element.addClass(this.dataLbl, "dataLbl");
+        
+        this.dataLayersDiv = document.createElement("div");
+        OpenLayers.Element.addClass(this.dataLayersDiv, "dataLayersDiv");
+
+        if (this.ascending) {
+            this.layersDiv.appendChild(this.baseLbl);
+            this.layersDiv.appendChild(this.baseLayersDiv);
+            this.layersDiv.appendChild(this.dataLbl);
+            this.layersDiv.appendChild(this.dataLayersDiv);
+        } else {
+            this.layersDiv.appendChild(this.dataLbl);
+            this.layersDiv.appendChild(this.dataLayersDiv);
+            this.layersDiv.appendChild(this.baseLbl);
+            this.layersDiv.appendChild(this.baseLayersDiv);
+        }    
+ 
+        this.div.appendChild(this.layersDiv);
+
+        if(this.roundedCorner) {
+            OpenLayers.Rico.Corner.round(this.div, {
+                corners: "tl bl",
+                bgColor: "transparent",
+                color: this.roundedCornerColor,
+                blend: false
+            });
+            OpenLayers.Rico.Corner.changeOpacity(this.layersDiv, 0.75);
+        }
+
+        var imgLocation = OpenLayers.Util.getImagesLocation();
+        var sz = new OpenLayers.Size(18,18);        
+
+        // maximize button div
+        var img = imgLocation + 'layer-switcher-maximize.png';
+        this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv(
+                                    "OpenLayers_Control_MaximizeDiv", 
+                                    null, 
+                                    sz, 
+                                    img, 
+                                    "absolute");
+        OpenLayers.Element.addClass(this.maximizeDiv, "maximizeDiv");
+        this.maximizeDiv.style.display = "none";
+        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';
+        var sz = new OpenLayers.Size(18,18);        
+        this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv(
+                                    "OpenLayers_Control_MinimizeDiv", 
+                                    null, 
+                                    sz, 
+                                    img, 
+                                    "absolute");
+        OpenLayers.Element.addClass(this.minimizeDiv, "minimizeDiv");
+        this.minimizeDiv.style.display = "none";
+        OpenLayers.Event.observe(this.minimizeDiv, "click", 
+            OpenLayers.Function.bindAsEventListener(this.minimizeControl, this)
+        );
+
+        this.div.appendChild(this.minimizeDiv);
+    },
+    
+    /** 
+     * Method: ignoreEvent
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    ignoreEvent: function(evt) {
+        OpenLayers.Event.stop(evt);
+    },
+
+    /** 
+     * Method: mouseDown
+     * Register a local 'mouseDown' flag so that we'll know whether or not
+     *     to ignore a mouseUp event
+     * 
+     * Parameters:
+     * evt - {Event}
+     */
+    mouseDown: function(evt) {
+        this.isMouseDown = true;
+        this.ignoreEvent(evt);
+    },
+
+    /** 
+     * Method: mouseUp
+     * If the 'isMouseDown' flag has been set, that means that the drag was 
+     *     started from within the LayerSwitcher control, and thus we can 
+     *     ignore the mouseup. Otherwise, let the Event continue.
+     *  
+     * Parameters:
+     * evt - {Event} 
+     */
+    mouseUp: function(evt) {
+        if (this.isMouseDown) {
+            this.isMouseDown = false;
+            this.ignoreEvent(evt);
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.LayerSwitcher"
+});
diff --git a/lib/OpenLayers/Control/Measure.js b/lib/OpenLayers/Control/Measure.js
new file mode 100644
index 0000000..3e9bd4d
--- /dev/null
+++ b/lib/OpenLayers/Control/Measure.js
@@ -0,0 +1,321 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Feature/Vector.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Measure
+ * Allows for drawing of features for measurements.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Measure = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * control.events.register(type, obj, listener);
+     * (end)
+     *
+     * Listeners will be called with a reference to an event object.  The
+     *     properties of this event depends on exactly what happened.
+     *
+     * Supported control event types (in addition to those from <OpenLayers.Control>):
+     * measure - Triggered when a measurement sketch is complete.  Listeners
+     *      will receive an event with measure, units, order, and geometry
+     *      properties.
+     * measurepartial - Triggered when a new point is added to the
+     *      measurement sketch.  Listeners receive an event with measure,
+     *      units, order, and geometry.
+     */
+    EVENT_TYPES: ['measure', 'measurepartial'],
+
+    /**
+     * APIProperty: handlerOptions
+     * {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
+     *     requires that geometries can be transformed into Geographic/WGS84
+     *     (if that is not already the map projection).  Default is false.
+     */
+    geodesic: false,
+    
+    /**
+     * Property: displaySystemUnits
+     * {Object} Units for various measurement systems.  Values are arrays
+     *     of unit abbreviations (from OpenLayers.INCHES_PER_UNIT) in decreasing
+     *     order of length.
+     */
+    displaySystemUnits: {
+        geographic: ['dd'],
+        english: ['mi', 'ft', 'in'],
+        metric: ['km', 'm']
+    },
+
+    /**
+     * Property: delay
+     * {Number} Number of milliseconds between clicks before the event is
+     *     considered a double-click.  The "measurepartial" event will not
+     *     be triggered if the sketch is completed within this time.  This
+     *     is required for IE where creating a browser reflow (if a listener
+     *     is modifying the DOM by displaying the measurement values) messes
+     *     with the dblclick listener in the sketch handler.
+     */
+    partialDelay: 300,
+
+    /**
+     * Property: delayedTrigger
+     * {Number} Timeout id of trigger for measurepartial.
+     */
+    delayedTrigger: null,
+    
+    /**
+     * APIProperty: persist
+     * {Boolean} Keep the temporary measurement sketch drawn after the
+     *     measurement is complete.  The geometry will persist until a new
+     *     measurement is started, the control is deactivated, or <cancel> is
+     *     called.
+     */
+    persist: false,
+
+    /**
+     * Constructor: OpenLayers.Control.Measure
+     * 
+     * Parameters:
+     * handler - {<OpenLayers.Handler>} 
+     * options - {Object} 
+     */
+    initialize: function(handler, options) {
+        // concatenate events specific to measure with those from the base
+        this.EVENT_TYPES =
+            OpenLayers.Control.Measure.prototype.EVENT_TYPES.concat(
+            OpenLayers.Control.prototype.EVENT_TYPES
+        );
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        this.callbacks = OpenLayers.Util.extend(
+            {done: this.measureComplete, point: this.measurePartial},
+            this.callbacks
+        );
+
+        // 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
+     *     sketch will be erased.
+     */
+    cancel: function() {
+        this.handler.cancel();
+    },
+    
+    /**
+     * Method: updateHandler
+     *
+     * Parameters:
+     * handler - {Function} One of the sketch handler constructors.
+     * options - {Object} Options for the handler.
+     */
+    updateHandler: function(handler, options) {
+        var active = this.active;
+        if(active) {
+            this.deactivate();
+        }
+        this.handler = new handler(this, this.callbacks, options);
+        if(active) {
+            this.activate();
+        }
+    },
+
+    /**
+     * Method: measureComplete
+     * Called when the measurement sketch is done.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     */
+    measureComplete: function(geometry) {
+        if(this.delayedTrigger) {
+            window.clearTimeout(this.delayedTrigger);
+        }
+        this.measure(geometry, "measure");
+    },
+    
+    /**
+     * Method: measurePartial
+     * Called each time a new point is added to the measurement sketch.
+     *
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point>} The last point added.
+     * geometry - {<OpenLayers.Geometry>} The sketch geometry.
+     */
+    measurePartial: function(point, geometry) {
+        if (geometry.getLength() > 0) {
+            geometry = geometry.clone();
+            this.delayedTrigger = window.setTimeout(
+                OpenLayers.Function.bind(function() {
+                    this.measure(geometry, "measurepartial");
+                }, this),
+                this.partialDelay
+            );
+        }
+    },
+
+    /**
+     * Method: measure
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * eventType - {String}
+     */
+    measure: function(geometry, eventType) {
+        var stat, order;
+        if(geometry.CLASS_NAME.indexOf('LineString') > -1) {
+            stat = this.getBestLength(geometry);
+            order = 1;
+        } else {
+            stat = this.getBestArea(geometry);
+            order = 2;
+        }
+        this.events.triggerEvent(eventType, {
+            measure: stat[0],
+            units: stat[1],
+            order: order,
+            geometry: geometry
+        });
+    },
+    
+    /**
+     * Method: getBestArea
+     * Based on the <displaySystem> returns the area of a geometry.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     *
+     * Returns:
+     * {Array([Float, String])}  Returns a two item array containing the
+     *     area and the units abbreviation.
+     */
+    getBestArea: function(geometry) {
+        var units = this.displaySystemUnits[this.displaySystem];
+        var unit, area;
+        for(var i=0, len=units.length; i<len; ++i) {
+            unit = units[i];
+            area = this.getArea(geometry, unit);
+            if(area > 1) {
+                break;
+            }
+        }
+        return [area, unit];
+    },
+    
+    /**
+     * Method: getArea
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * units - {String} Unit abbreviation
+     *
+     * Returns:
+     * {Float} The geometry area in the given units.
+     */
+    getArea: function(geometry, units) {
+        var area, geomUnits;
+        if(this.geodesic) {
+            area = geometry.getGeodesicArea(this.map.getProjectionObject());
+            geomUnits = "m";
+        } else {
+            area = geometry.getArea();
+            geomUnits = this.map.getUnits();
+        }
+        var inPerDisplayUnit = OpenLayers.INCHES_PER_UNIT[units];
+        if(inPerDisplayUnit) {
+            var inPerMapUnit = OpenLayers.INCHES_PER_UNIT[geomUnits];
+            area *= Math.pow((inPerMapUnit / inPerDisplayUnit), 2);
+        }
+        return area;
+    },
+    
+    /**
+     * Method: getBestLength
+     * Based on the <displaySystem> returns the length of a geometry.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     *
+     * Returns:
+     * {Array([Float, String])}  Returns a two item array containing the
+     *     length and the units abbreviation.
+     */
+    getBestLength: function(geometry) {
+        var units = this.displaySystemUnits[this.displaySystem];
+        var unit, length;
+        for(var i=0, len=units.length; i<len; ++i) {
+            unit = units[i];
+            length = this.getLength(geometry, unit);
+            if(length > 1) {
+                break;
+            }
+        }
+        return [length, unit];
+    },
+
+    /**
+     * Method: getLength
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * units - {String} Unit abbreviation
+     *
+     * Returns:
+     * {Float} The geometry length in the given units.
+     */
+    getLength: function(geometry, units) {
+        var length, geomUnits;
+        if(this.geodesic) {
+            length = geometry.getGeodesicLength(this.map.getProjectionObject());
+            geomUnits = "m";
+        } else {
+            length = geometry.getLength();
+            geomUnits = this.map.getUnits();
+        }
+        var inPerDisplayUnit = OpenLayers.INCHES_PER_UNIT[units];
+        if(inPerDisplayUnit) {
+            var inPerMapUnit = OpenLayers.INCHES_PER_UNIT[geomUnits];
+            length *= (inPerMapUnit / inPerDisplayUnit);
+        }
+        return length;
+    },
+
+    CLASS_NAME: "OpenLayers.Control.Measure"
+});
diff --git a/lib/OpenLayers/Control/ModifyFeature.js b/lib/OpenLayers/Control/ModifyFeature.js
new file mode 100644
index 0000000..72ee219
--- /dev/null
+++ b/lib/OpenLayers/Control/ModifyFeature.js
@@ -0,0 +1,777 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control/DragFeature.js
+ * @requires OpenLayers/Control/SelectFeature.js
+ * @requires OpenLayers/Handler/Keyboard.js
+ */
+
+/**
+ * Class: OpenLayers.Control.ModifyFeature
+ * Control to modify features.  When activated, a click renders the vertices
+ *     of a feature - these vertices can then be dragged.  By default, the
+ *     delete key will delete the vertex under the mouse.  New features are
+ *     added by dragging "virtual vertices" between vertices.  Create a new
+ *     control with the <OpenLayers.Control.ModifyFeature> constructor.
+ *
+ * Inherits From:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * APIProperty: geometryTypes
+     * {Array(String)} To restrict modification to a limited set of geometry
+     *     types, send a list of strings corresponding to the geometry class
+     *     names.
+     */
+    geometryTypes: null,
+
+    /**
+     * APIProperty: clickout
+     * {Boolean} Unselect features when clicking outside any feature.
+     *     Default is true.
+     */
+    clickout: true,
+
+    /**
+     * APIProperty: toggle
+     * {Boolean} Unselect a selected feature on click.
+     *      Default is true.
+     */
+    toggle: true,
+    
+    /**
+     * APIProperty: standalone
+     * {Boolean} Set to true to create a control without SelectFeature
+     *     capabilities. Default is false.  If standalone is true, to modify
+     *     a feature, call the <selectFeature> method with the target feature.
+     *     Note that you must call the <unselectFeature> method to finish
+     *     feature modification in standalone mode (before starting to modify
+     *     another feature).
+     */
+    standalone: false,
+
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer.Vector>}
+     */
+    layer: null,
+    
+    /**
+     * Property: feature
+     * {<OpenLayers.Feature.Vector>} Feature currently available for modification.
+     */
+    feature: null,
+    
+    /**
+     * Property: vertices
+     * {Array(<OpenLayers.Feature.Vector>)} Verticies currently available
+     *     for dragging.
+     */
+    vertices: null,
+    
+    /**
+     * Property: virtualVertices
+     * {Array(<OpenLayers.Feature.Vector>)} Virtual vertices in the middle
+     *     of each edge.
+     */
+    virtualVertices: null,
+
+    /**
+     * Property: selectControl
+     * {<OpenLayers.Control.SelectFeature>}
+     */
+    selectControl: null,
+    
+    /**
+     * Property: dragControl
+     * {<OpenLayers.Control.DragFeature>}
+     */
+    dragControl: null,
+    
+    /**
+     * Property: handlers
+     * {Object}
+     */
+    handlers: null,
+    
+    /**
+     * APIProperty: deleteCodes
+     * {Array(Integer)} Keycodes for deleting verticies.  Set to null to disable
+     *     vertex deltion by keypress.  If non-null, keypresses with codes
+     *     in this array will delete vertices under the mouse. Default
+     *     is 46 and 68, the 'delete' and lowercase 'd' keys.
+     */
+    deleteCodes: null,
+
+    /**
+     * APIProperty: virtualStyle
+     * {Object} A symbolizer to be used for virtual vertices.
+     */
+    virtualStyle: null,
+
+    /**
+     * APIProperty: mode
+     * {Integer} Bitfields specifying the modification mode. Defaults to
+     *      OpenLayers.Control.ModifyFeature.RESHAPE. To set the mode to a
+     *      combination of options, use the | operator. For example, to allow
+     *      the control to both resize and rotate features, use the following
+     *      syntax
+     * (code)
+     * control.mode = OpenLayers.Control.ModifyFeature.RESIZE |
+     *                OpenLayers.Control.ModifyFeature.ROTATE;
+     *  (end)
+     */
+    mode: null,
+
+    /**
+     * Property: modified
+     * {Boolean} The currently selected feature has been modified.
+     */
+    modified: false,
+
+    /**
+     * Property: radiusHandle
+     * {<OpenLayers.Feature.Vector>} A handle for rotating/resizing a feature.
+     */
+    radiusHandle: null,
+
+    /**
+     * Property: dragHandle
+     * {<OpenLayers.Feature.Vector>} A handle for dragging a feature.
+     */
+    dragHandle: null,
+
+    /**
+     * APIProperty: onModificationStart 
+     * {Function} *Deprecated*.  Register for "beforefeaturemodified" instead.
+     *     The "beforefeaturemodified" event is triggered on the layer before
+     *     any modification begins.
+     *
+     * Optional function to be called when a feature is selected
+     *     to be modified. The function should expect to be called with a
+     *     feature.  This could be used for example to allow to lock the
+     *     feature on server-side.
+     */
+    onModificationStart: function() {},
+
+    /**
+     * APIProperty: onModification
+     * {Function} *Deprecated*.  Register for "featuremodified" instead.
+     *     The "featuremodified" event is triggered on the layer with each
+     *     feature modification.
+     *
+     * Optional function to be called when a feature has been
+     *     modified.  The function should expect to be called with a feature.
+     */
+    onModification: function() {},
+
+    /**
+     * APIProperty: onModificationEnd
+     * {Function} *Deprecated*.  Register for "afterfeaturemodified" instead.
+     *     The "afterfeaturemodified" event is triggered on the layer after
+     *     a feature has been modified.
+     *
+     * Optional function to be called when a feature is finished 
+     *     being modified.  The function should expect to be called with a
+     *     feature.
+     */
+    onModificationEnd: function() {},
+
+    /**
+     * Constructor: OpenLayers.Control.ModifyFeature
+     * Create a new modify feature control.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer.Vector>} Layer that contains features that
+     *     will be modified.
+     * options - {Object} Optional object whose properties will be set on the
+     *     control.
+     */
+    initialize: function(layer, options) {
+        this.layer = layer;
+        this.vertices = [];
+        this.virtualVertices = [];
+        this.virtualStyle = OpenLayers.Util.extend({},
+            this.layer.style || this.layer.styleMap.createSymbolizer());
+        this.virtualStyle.fillOpacity = 0.3;
+        this.virtualStyle.strokeOpacity = 0.3;
+        this.deleteCodes = [46, 68];
+        this.mode = OpenLayers.Control.ModifyFeature.RESHAPE;
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        if(!(this.deleteCodes instanceof Array)) {
+            this.deleteCodes = [this.deleteCodes];
+        }
+        var control = this;
+
+        // configure the select control
+        var selectOptions = {
+            geometryTypes: this.geometryTypes,
+            clickout: this.clickout,
+            toggle: this.toggle,
+            onBeforeSelect: this.beforeSelectFeature,
+            onSelect: this.selectFeature,
+            onUnselect: this.unselectFeature,
+            scope: this
+        };
+        if(this.standalone === false) {
+            this.selectControl = new OpenLayers.Control.SelectFeature(
+                layer, selectOptions
+            );
+        }
+
+        // configure the drag control
+        var dragOptions = {
+            geometryTypes: ["OpenLayers.Geometry.Point"],
+            snappingOptions: this.snappingOptions,
+            onStart: function(feature, pixel) {
+                control.dragStart.apply(control, [feature, pixel]);
+            },
+            onDrag: function(feature, pixel) {
+                control.dragVertex.apply(control, [feature, pixel]);
+            },
+            onComplete: function(feature) {
+                control.dragComplete.apply(control, [feature]);
+            },
+            featureCallbacks: {
+                over: function(feature) {
+                    /**
+                     * In normal mode, the feature handler is set up to allow
+                     * dragging of all points.  In standalone mode, we only
+                     * want to allow dragging of sketch vertices and virtual
+                     * vertices - or, in the case of a modifiable point, the
+                     * point itself.
+                     */
+                    if(control.standalone !== true || feature._sketch ||
+                       control.feature === feature) {
+                        control.dragControl.overFeature.apply(
+                            control.dragControl, [feature]);
+                    }
+                }
+            }
+        };
+        this.dragControl = new OpenLayers.Control.DragFeature(
+            layer, dragOptions
+        );
+
+        // configure the keyboard handler
+        var keyboardOptions = {
+            keydown: this.handleKeypress
+        };
+        this.handlers = {
+            keyboard: new OpenLayers.Handler.Keyboard(this, keyboardOptions)
+        };
+    },
+
+    /**
+     * APIMethod: destroy
+     * Take care of things that are not handled in superclass.
+     */
+    destroy: function() {
+        this.layer = null;
+        this.standalone || this.selectControl.destroy();
+        this.dragControl.destroy();
+        OpenLayers.Control.prototype.destroy.apply(this, []);
+    },
+
+    /**
+     * APIMethod: activate
+     * Activate the control.
+     * 
+     * Returns:
+     * {Boolean} Successfully activated the control.
+     */
+    activate: function() {
+        return ((this.standalone || this.selectControl.activate()) &&
+                this.handlers.keyboard.activate() &&
+                OpenLayers.Control.prototype.activate.apply(this, arguments));
+    },
+
+    /**
+     * APIMethod: deactivate
+     * Deactivate the control.
+     *
+     * Returns: 
+     * {Boolean} Successfully deactivated the control.
+     */
+    deactivate: function() {
+        var deactivated = false;
+        // the return from the controls is unimportant in this case
+        if(OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
+            this.layer.removeFeatures(this.vertices, {silent: true});
+            this.layer.removeFeatures(this.virtualVertices, {silent: true});
+            this.vertices = [];
+            this.dragControl.deactivate();
+            var feature = this.feature;
+            var valid = feature && feature.geometry && feature.layer;
+            if(this.standalone === false) {
+                if(valid) {
+                    this.selectControl.unselect.apply(this.selectControl,
+                                                      [feature]);
+                }
+                this.selectControl.deactivate();
+            } else {
+                if(valid) {
+                    this.unselectFeature(feature);
+                }
+            }
+            this.handlers.keyboard.deactivate();
+            deactivated = true;
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: beforeSelectFeature
+     * Called before a feature is selected.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The feature about to be selected.
+     */
+    beforeSelectFeature: function(feature) {
+        return this.layer.events.triggerEvent(
+            "beforefeaturemodified", {feature: feature}
+        );
+    },
+
+    /**
+     * Method: selectFeature
+     * Called when the select feature control selects a feature.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} the selected feature.
+     */
+    selectFeature: function(feature) {
+        this.feature = feature;
+        this.modified = false;
+        this.resetVertices();
+        this.dragControl.activate();
+        this.onModificationStart(this.feature);
+    },
+
+    /**
+     * Method: unselectFeature
+     * Called when the select feature control unselects a feature.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The unselected feature.
+     */
+    unselectFeature: function(feature) {
+        this.layer.removeFeatures(this.vertices, {silent: true});
+        this.vertices = [];
+        this.layer.destroyFeatures(this.virtualVertices, {silent: true});
+        this.virtualVertices = [];
+        if(this.dragHandle) {
+            this.layer.destroyFeatures([this.dragHandle], {silent: true});
+            delete this.dragHandle;
+        }
+        if(this.radiusHandle) {
+            this.layer.destroyFeatures([this.radiusHandle], {silent: true});
+            delete this.radiusHandle;
+        }
+        this.feature = null;
+        this.dragControl.deactivate();
+        this.onModificationEnd(feature);
+        this.layer.events.triggerEvent("afterfeaturemodified", {
+            feature: feature,
+            modified: this.modified
+        });
+        this.modified = false;
+    },
+
+    /**
+     * Method: dragStart
+     * Called by the drag feature control with before a feature is dragged.
+     *     This method is used to differentiate between points and vertices
+     *     of higher order geometries.  This respects the <geometryTypes>
+     *     property and forces a select of points when the drag control is
+     *     already active (and stops events from propagating to the select
+     *     control).
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The point or vertex about to be
+     *     dragged.
+     * pixel - {<OpenLayers.Pixel>} Pixel location of the mouse event.
+     */
+    dragStart: function(feature, pixel) {
+        // only change behavior if the feature is not in the vertices array
+        if(feature != this.feature && !feature.geometry.parent &&
+           feature != this.dragHandle && feature != this.radiusHandle) {
+            if(this.standalone === false && this.feature) {
+                // unselect the currently selected feature
+                this.selectControl.clickFeature.apply(this.selectControl,
+                                                      [this.feature]);
+            }
+            // check any constraints on the geometry type
+            if(this.geometryTypes == null ||
+               OpenLayers.Util.indexOf(this.geometryTypes,
+                                       feature.geometry.CLASS_NAME) != -1) {
+                // select the point
+                this.standalone || this.selectControl.clickFeature.apply(
+                                            this.selectControl, [feature]);
+                /**
+                 * TBD: These lines improve workflow by letting the user
+                 *     immediately start dragging after the mouse down.
+                 *     However, it is very ugly to be messing with controls
+                 *     and their handlers in this way.  I'd like a better
+                 *     solution if the workflow change is necessary.
+                 */
+                // prepare the point for dragging
+                this.dragControl.overFeature.apply(this.dragControl,
+                                                   [feature]);
+                this.dragControl.lastPixel = pixel;
+                this.dragControl.handlers.drag.started = true;
+                this.dragControl.handlers.drag.start = pixel;
+                this.dragControl.handlers.drag.last = pixel;
+            }
+        }
+    },
+    
+    /**
+     * Method: dragVertex
+     * Called by the drag feature control with each drag move of a vertex.
+     *
+     * Parameters:
+     * vertex - {<OpenLayers.Feature.Vector>} The vertex being dragged.
+     * pixel - {<OpenLayers.Pixel>} Pixel location of the mouse event.
+     */
+    dragVertex: function(vertex, pixel) {
+        this.modified = true;
+        /**
+         * Five cases:
+         * 1) dragging a simple point
+         * 2) dragging a virtual vertex
+         * 3) dragging a drag handle
+         * 4) dragging a real vertex
+         * 5) dragging a radius handle
+         */
+        if(this.feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+            // dragging a simple point
+            if(this.feature != vertex) {
+                this.feature = vertex;
+            }
+            this.layer.events.triggerEvent("vertexmodified", {
+                vertex: vertex.geometry,
+                feature: this.feature,
+                pixel: pixel
+            });
+        } else {
+            if(vertex._index) {
+                // dragging a virtual vertex
+                vertex.geometry.parent.addComponent(vertex.geometry,
+                                                    vertex._index);
+                // move from virtual to real vertex
+                delete vertex._index;
+                OpenLayers.Util.removeItem(this.virtualVertices, vertex);
+                this.vertices.push(vertex);
+            } else if(vertex == this.dragHandle) {
+                // dragging a drag handle
+                this.layer.removeFeatures(this.vertices, {silent: true});
+                this.vertices = [];
+                if(this.radiusHandle) {
+                    this.layer.destroyFeatures([this.radiusHandle], {silent: true});
+                    this.radiusHandle = null;
+                }
+            } else if(vertex !== this.radiusHandle) {
+                // dragging a real vertex
+                this.layer.events.triggerEvent("vertexmodified", {
+                    vertex: vertex.geometry,
+                    feature: this.feature,
+                    pixel: pixel
+                });
+            }
+            // dragging a radius handle - no special treatment
+            if(this.virtualVertices.length > 0) {
+                this.layer.destroyFeatures(this.virtualVertices, {silent: true});
+                this.virtualVertices = [];
+            }
+            this.layer.drawFeature(this.feature, this.standalone ? undefined :
+                                            this.selectControl.renderIntent);
+        }
+        // keep the vertex on top so it gets the mouseout after dragging
+        // this should be removed in favor of an option to draw under or
+        // maintain node z-index
+        this.layer.drawFeature(vertex);
+    },
+    
+    /**
+     * Method: dragComplete
+     * Called by the drag feature control when the feature dragging is complete.
+     *
+     * Parameters:
+     * vertex - {<OpenLayers.Feature.Vector>} The vertex being dragged.
+     */
+    dragComplete: function(vertex) {
+        this.resetVertices();
+        this.setFeatureState();
+        this.onModification(this.feature);
+        this.layer.events.triggerEvent("featuremodified", 
+                                       {feature: this.feature});
+    },
+    
+    /**
+     * Method: setFeatureState
+     * Called when the feature is modified.  If the current state is not
+     *     INSERT or DELETE, the state is set to UPDATE.
+     */
+    setFeatureState: function() {
+        if(this.feature.state != OpenLayers.State.INSERT &&
+           this.feature.state != OpenLayers.State.DELETE) {
+            this.feature.state = OpenLayers.State.UPDATE;
+        }
+    },
+    
+    /**
+     * Method: resetVertices
+     */
+    resetVertices: function() {
+        // if coming from a drag complete we're about to destroy the vertex
+        // that was just dragged. For that reason, the drag feature control
+        // will never detect a mouse-out on that vertex, meaning that the drag
+        // handler won't be deactivated. This can cause errors because the drag
+        // feature control still has a feature to drag but that feature is
+        // destroyed. To prevent this, we call outFeature on the drag feature
+        // control if the control actually has a feature to drag.
+        if(this.dragControl.feature) {
+            this.dragControl.outFeature(this.dragControl.feature);
+        }
+        if(this.vertices.length > 0) {
+            this.layer.removeFeatures(this.vertices, {silent: true});
+            this.vertices = [];
+        }
+        if(this.virtualVertices.length > 0) {
+            this.layer.removeFeatures(this.virtualVertices, {silent: true});
+            this.virtualVertices = [];
+        }
+        if(this.dragHandle) {
+            this.layer.destroyFeatures([this.dragHandle], {silent: true});
+            this.dragHandle = null;
+        }
+        if(this.radiusHandle) {
+            this.layer.destroyFeatures([this.radiusHandle], {silent: true});
+            this.radiusHandle = null;
+        }
+        if(this.feature &&
+           this.feature.geometry.CLASS_NAME != "OpenLayers.Geometry.Point") {
+            if((this.mode & OpenLayers.Control.ModifyFeature.DRAG)) {
+                this.collectDragHandle();
+            }
+            if((this.mode & (OpenLayers.Control.ModifyFeature.ROTATE |
+                             OpenLayers.Control.ModifyFeature.RESIZE))) {
+                this.collectRadiusHandle();
+            }
+            if(this.mode & OpenLayers.Control.ModifyFeature.RESHAPE){
+                // Don't collect vertices when we're resizing
+                if (!(this.mode & OpenLayers.Control.ModifyFeature.RESIZE)){
+                    this.collectVertices();
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: handleKeypress
+     * Called by the feature handler on keypress.  This is used to delete
+     *     vertices. If the <deleteCode> property is set, vertices will
+     *     be deleted when a feature is selected for modification and
+     *     the mouse is over a vertex.
+     *
+     * Parameters:
+     * {Integer} Key code corresponding to the keypress event.
+     */
+    handleKeypress: function(evt) {
+        var code = evt.keyCode;
+        
+        // check for delete key
+        if(this.feature &&
+           OpenLayers.Util.indexOf(this.deleteCodes, code) != -1) {
+            var vertex = this.dragControl.feature;
+            if(vertex &&
+               OpenLayers.Util.indexOf(this.vertices, vertex) != -1 &&
+               !this.dragControl.handlers.drag.dragging &&
+               vertex.geometry.parent) {
+                // remove the vertex
+                vertex.geometry.parent.removeComponent(vertex.geometry);
+                this.layer.drawFeature(this.feature, this.standalone ?
+                                       undefined :
+                                       this.selectControl.renderIntent);
+                this.resetVertices();
+                this.setFeatureState();
+                this.onModification(this.feature);
+                this.layer.events.triggerEvent("featuremodified", 
+                                               {feature: this.feature});
+            }
+        }
+    },
+
+    /**
+     * Method: collectVertices
+     * Collect the vertices from the modifiable feature's geometry and push
+     *     them on to the control's vertices array.
+     */
+    collectVertices: function() {
+        this.vertices = [];
+        this.virtualVertices = [];        
+        var control = this;
+        function collectComponentVertices(geometry) {
+            var i, vertex, component, len;
+            if(geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+                vertex = new OpenLayers.Feature.Vector(geometry);
+                vertex._sketch = true;
+                control.vertices.push(vertex);
+            } else {
+                var numVert = geometry.components.length;
+                if(geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing") {
+                    numVert -= 1;
+                }
+                for(i=0; i<numVert; ++i) {
+                    component = geometry.components[i];
+                    if(component.CLASS_NAME == "OpenLayers.Geometry.Point") {
+                        vertex = new OpenLayers.Feature.Vector(component);
+                        vertex._sketch = true;
+                        control.vertices.push(vertex);
+                    } else {
+                        collectComponentVertices(component);
+                    }
+                }
+                
+                // add virtual vertices in the middle of each edge
+                if(geometry.CLASS_NAME != "OpenLayers.Geometry.MultiPoint") {
+                    for(i=0, len=geometry.components.length; i<len-1; ++i) {
+                        var prevVertex = geometry.components[i];
+                        var nextVertex = geometry.components[i + 1];
+                        if(prevVertex.CLASS_NAME == "OpenLayers.Geometry.Point" &&
+                           nextVertex.CLASS_NAME == "OpenLayers.Geometry.Point") {
+                            var x = (prevVertex.x + nextVertex.x) / 2;
+                            var y = (prevVertex.y + nextVertex.y) / 2;
+                            var point = new OpenLayers.Feature.Vector(
+                                new OpenLayers.Geometry.Point(x, y),
+                                null, control.virtualStyle
+                            );
+                            // set the virtual parent and intended index
+                            point.geometry.parent = geometry;
+                            point._index = i + 1;
+                            point._sketch = true;
+                            control.virtualVertices.push(point);
+                        }
+                    }
+                }
+            }
+        }
+        collectComponentVertices.call(this, this.feature.geometry);
+        this.layer.addFeatures(this.virtualVertices, {silent: true});
+        this.layer.addFeatures(this.vertices, {silent: true});
+    },
+
+    /**
+     * Method: collectDragHandle
+     * Collect the drag handle for the selected geometry.
+     */
+    collectDragHandle: function() {
+        var geometry = this.feature.geometry;
+        var center = geometry.getBounds().getCenterLonLat();
+        var originGeometry = new OpenLayers.Geometry.Point(
+            center.lon, center.lat
+        );
+        var origin = new OpenLayers.Feature.Vector(originGeometry);
+        originGeometry.move = function(x, y) {
+            OpenLayers.Geometry.Point.prototype.move.call(this, x, y);
+            geometry.move(x, y);
+        };
+        origin._sketch = true;
+        this.dragHandle = origin;
+        this.layer.addFeatures([this.dragHandle], {silent: true});
+    },
+
+    /**
+     * Method: collectRadiusHandle
+     * Collect the radius handle for the selected geometry.
+     */
+    collectRadiusHandle: function() {
+        var geometry = this.feature.geometry;
+        var bounds = geometry.getBounds();
+        var center = bounds.getCenterLonLat();
+        var originGeometry = new OpenLayers.Geometry.Point(
+            center.lon, center.lat
+        );
+        var radiusGeometry = new OpenLayers.Geometry.Point(
+            bounds.right, bounds.bottom
+        );
+        var radius = new OpenLayers.Feature.Vector(radiusGeometry);
+        var resize = (this.mode & OpenLayers.Control.ModifyFeature.RESIZE);
+        var reshape = (this.mode & OpenLayers.Control.ModifyFeature.RESHAPE);
+        var rotate = (this.mode & OpenLayers.Control.ModifyFeature.ROTATE);
+
+        radiusGeometry.move = function(x, y) {
+            OpenLayers.Geometry.Point.prototype.move.call(this, x, y);
+            var dx1 = this.x - originGeometry.x;
+            var dy1 = this.y - originGeometry.y;
+            var dx0 = dx1 - x;
+            var dy0 = dy1 - y;
+            if(rotate) {
+                var a0 = Math.atan2(dy0, dx0);
+                var a1 = Math.atan2(dy1, dx1);
+                var angle = a1 - a0;
+                angle *= 180 / Math.PI;
+                geometry.rotate(angle, originGeometry);
+            }
+            if(resize) {
+                var scale, ratio;
+                // 'resize' together with 'reshape' implies that the aspect 
+                // ratio of the geometry will not be preserved whilst resizing 
+                if (reshape) {
+                    scale = dy1 / dy0;
+                    ratio = (dx1 / dx0) / scale;
+                } else {
+                    var l0 = Math.sqrt((dx0 * dx0) + (dy0 * dy0));
+                    var l1 = Math.sqrt((dx1 * dx1) + (dy1 * dy1));
+                    scale = l1 / l0;
+                }
+                geometry.resize(scale, originGeometry, ratio);
+            }
+        };
+        radius._sketch = true;
+        this.radiusHandle = radius;
+        this.layer.addFeatures([this.radiusHandle], {silent: true});
+    },
+
+    /**
+     * Method: setMap
+     * Set the map property for the control and all handlers.
+     *
+     * Parameters:
+     * map - {<OpenLayers.Map>} The control's map.
+     */
+    setMap: function(map) {
+        this.standalone || this.selectControl.setMap(map);
+        this.dragControl.setMap(map);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.ModifyFeature"
+});
+
+/**
+ * Constant: RESHAPE
+ * {Integer} Constant used to make the control work in reshape mode
+ */
+OpenLayers.Control.ModifyFeature.RESHAPE = 1;
+/**
+ * Constant: RESIZE
+ * {Integer} Constant used to make the control work in resize mode
+ */
+OpenLayers.Control.ModifyFeature.RESIZE = 2;
+/**
+ * Constant: ROTATE
+ * {Integer} Constant used to make the control work in rotate mode
+ */
+OpenLayers.Control.ModifyFeature.ROTATE = 4;
+/**
+ * Constant: DRAG
+ * {Integer} Constant used to make the control work in drag mode
+ */
+OpenLayers.Control.ModifyFeature.DRAG = 8;
diff --git a/lib/OpenLayers/Control/MouseDefaults.js b/lib/OpenLayers/Control/MouseDefaults.js
new file mode 100644
index 0000000..11fdb13
--- /dev/null
+++ b/lib/OpenLayers/Control/MouseDefaults.js
@@ -0,0 +1,368 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.MouseDefaults
+ * This class is DEPRECATED in 2.4 and will be removed by 3.0.
+ * If you need this functionality, use <OpenLayers.Control.Navigation> 
+ * instead!!!
+ *
+ * This class is DEPRECATED in 2.4 and will be removed by 3.0.
+ *     If you need this functionality, use Control.Navigation instead!!!
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.MouseDefaults = OpenLayers.Class(OpenLayers.Control, {
+
+    /** WARNING WARNING WARNING!!!
+        This class is DEPRECATED in 2.4 and will be removed by 3.0.
+        If you need this functionality, use Control.Navigation instead!!! */
+
+    /** 
+     * Property: performedDrag
+     * {Boolean}
+     */
+    performedDrag: false,
+
+    /** 
+     * Property: wheelObserver 
+     * {Function}
+     */
+    wheelObserver: null,
+
+    /** 
+     * Constructor: OpenLayers.Control.MouseDefaults
+     */
+    initialize: function() {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: destroy
+     */    
+    destroy: function() {
+        
+        if (this.handler) {
+            this.handler.destroy();
+        }
+        this.handler = null;
+
+        this.map.events.un({
+            "click": this.defaultClick,
+            "dblclick": this.defaultDblClick,
+            "mousedown": this.defaultMouseDown,
+            "mouseup": this.defaultMouseUp,
+            "mousemove": this.defaultMouseMove,
+            "mouseout": this.defaultMouseOut,
+            scope: this
+        });
+
+        //unregister mousewheel events specifically on the window and document
+        OpenLayers.Event.stopObserving(window, "DOMMouseScroll", 
+                                        this.wheelObserver);
+        OpenLayers.Event.stopObserving(window, "mousewheel", 
+                                        this.wheelObserver);
+        OpenLayers.Event.stopObserving(document, "mousewheel", 
+                                        this.wheelObserver);
+        this.wheelObserver = null;
+                      
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);        
+    },
+
+    /**
+     * Method: draw
+     */
+    draw: function() {
+        this.map.events.on({
+            "click": this.defaultClick,
+            "dblclick": this.defaultDblClick,
+            "mousedown": this.defaultMouseDown,
+            "mouseup": this.defaultMouseUp,
+            "mousemove": this.defaultMouseMove,
+            "mouseout": this.defaultMouseOut,
+            scope: this
+        });
+
+        this.registerWheelEvents();
+
+    },
+
+    /**
+     * Method: registerWheelEvents
+     */
+    registerWheelEvents: function() {
+
+        this.wheelObserver = OpenLayers.Function.bindAsEventListener(
+            this.onWheelEvent, this
+        );
+        
+        //register mousewheel events specifically on the window and document
+        OpenLayers.Event.observe(window, "DOMMouseScroll", this.wheelObserver);
+        OpenLayers.Event.observe(window, "mousewheel", this.wheelObserver);
+        OpenLayers.Event.observe(document, "mousewheel", this.wheelObserver);
+    },
+
+    /**
+     * Method: defaultClick
+     * 
+     * Parameters:
+     * evt - {Event} 
+     *
+     * Returns:
+     * {Boolean}
+     */
+    defaultClick: function (evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        var notAfterDrag = !this.performedDrag;
+        this.performedDrag = false;
+        return notAfterDrag;
+    },
+
+    /**
+     * Method: defaultDblClick
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultDblClick: function (evt) {
+        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
+        this.map.setCenter(newCenter, this.map.zoom + 1);
+        OpenLayers.Event.stop(evt);
+        return false;
+    },
+
+    /**
+     * Method: defaultMouseDown
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultMouseDown: function (evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        this.mouseDragStart = evt.xy.clone();
+        this.performedDrag  = false;
+        if (evt.shiftKey) {
+            this.map.div.style.cursor = "crosshair";
+            this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
+                                                     this.mouseDragStart,
+                                                     null,
+                                                     null,
+                                                     "absolute",
+                                                     "2px solid red");
+            this.zoomBox.style.backgroundColor = "white";
+            this.zoomBox.style.filter = "alpha(opacity=50)"; // IE
+            this.zoomBox.style.opacity = "0.50";
+            this.zoomBox.style.fontSize = "1px";
+            this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
+            this.map.viewPortDiv.appendChild(this.zoomBox);
+        }
+        document.onselectstart = OpenLayers.Function.False;
+        OpenLayers.Event.stop(evt);
+    },
+
+    /**
+     * Method: defaultMouseMove
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultMouseMove: function (evt) {
+        // record the mouse position, used in onWheelEvent
+        this.mousePosition = evt.xy.clone();
+
+        if (this.mouseDragStart != null) {
+            if (this.zoomBox) {
+                var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x);
+                var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y);
+                this.zoomBox.style.width = Math.max(1, deltaX) + "px";
+                this.zoomBox.style.height = Math.max(1, deltaY) + "px";
+                if (evt.xy.x < this.mouseDragStart.x) {
+                    this.zoomBox.style.left = evt.xy.x+"px";
+                }
+                if (evt.xy.y < this.mouseDragStart.y) {
+                    this.zoomBox.style.top = evt.xy.y+"px";
+                }
+            } else {
+                var deltaX = this.mouseDragStart.x - evt.xy.x;
+                var deltaY = this.mouseDragStart.y - evt.xy.y;
+                var size = this.map.getSize();
+                var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX,
+                                                 size.h / 2 + deltaY);
+                var newCenter = this.map.getLonLatFromViewPortPx( newXY ); 
+                this.map.setCenter(newCenter, null, true);
+                this.mouseDragStart = evt.xy.clone();
+                this.map.div.style.cursor = "move";
+            }
+            this.performedDrag = true;
+        }
+    },
+
+    /**
+     * Method: defaultMouseUp
+     * 
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     */
+    defaultMouseUp: function (evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        if (this.zoomBox) {
+            this.zoomBoxEnd(evt);    
+        } else {
+            if (this.performedDrag) {
+                this.map.setCenter(this.map.center);
+            }
+        }
+        document.onselectstart=null;
+        this.mouseDragStart = null;
+        this.map.div.style.cursor = "";
+    },
+
+    /**
+     * Method: defaultMouseOut
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultMouseOut: function (evt) {
+        if (this.mouseDragStart != null && 
+            OpenLayers.Util.mouseLeft(evt, this.map.div)) {
+            if (this.zoomBox) {
+                this.removeZoomBox();
+            }
+            this.mouseDragStart = null;
+        }
+    },
+
+
+    /** 
+     * Method: defaultWheelUp
+     * User spun scroll wheel up
+     * 
+     */
+    defaultWheelUp: function(evt) {
+        if (this.map.getZoom() <= this.map.getNumZoomLevels()) {
+            this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),
+                               this.map.getZoom() + 1);
+        }
+    },
+
+    /**
+     * Method: defaultWheelDown
+     * User spun scroll wheel down
+     */
+    defaultWheelDown: function(evt) {
+        if (this.map.getZoom() > 0) {
+            this.map.setCenter(this.map.getLonLatFromPixel(evt.xy),
+                               this.map.getZoom() - 1);
+        }
+    },
+
+    /**
+     * Method: zoomBoxEnd
+     * Zoombox function. 
+     */
+    zoomBoxEnd: function(evt) {
+        if (this.mouseDragStart != null) {
+            if (Math.abs(this.mouseDragStart.x - evt.xy.x) > 5 ||    
+                Math.abs(this.mouseDragStart.y - evt.xy.y) > 5) {   
+                var start = this.map.getLonLatFromViewPortPx( this.mouseDragStart ); 
+                var end = this.map.getLonLatFromViewPortPx( evt.xy );
+                var top = Math.max(start.lat, end.lat);
+                var bottom = Math.min(start.lat, end.lat);
+                var left = Math.min(start.lon, end.lon);
+                var right = Math.max(start.lon, end.lon);
+                var bounds = new OpenLayers.Bounds(left, bottom, right, top);
+                this.map.zoomToExtent(bounds);
+            } else {
+                var end = this.map.getLonLatFromViewPortPx( evt.xy );
+                this.map.setCenter(new OpenLayers.LonLat(
+                  (end.lon),
+                  (end.lat)
+                 ), this.map.getZoom() + 1);
+            }    
+            this.removeZoomBox();
+       }
+    },
+
+    /**
+     * Method: removeZoomBox
+     * Remove the zoombox from the screen and nullify our reference to it.
+     */
+    removeZoomBox: function() {
+        this.map.viewPortDiv.removeChild(this.zoomBox);
+        this.zoomBox = null;
+    },
+
+
+/**
+ *  Mouse ScrollWheel code thanks to http://adomas.org/javascript-mouse-wheel/
+ */
+
+
+    /**
+     * Method: onWheelEvent
+     * Catch the wheel event and handle it xbrowserly
+     *
+     * Parameters: 
+     * e - {Event} 
+     */
+    onWheelEvent: function(e){
+    
+        // first determine whether or not the wheeling was inside the map
+        var inMap = false;
+        var elem = OpenLayers.Event.element(e);
+        while(elem != null) {
+            if (this.map && elem == this.map.div) {
+                inMap = true;
+                break;
+            }
+            elem = elem.parentNode;
+        }
+        
+        if (inMap) {
+            
+            var delta = 0;
+            if (!e) {
+                e = window.event;
+            }
+            if (e.wheelDelta) {
+                delta = e.wheelDelta/120; 
+                if (window.opera && window.opera.version() < 9.2) {
+                    delta = -delta;
+                }
+            } else if (e.detail) {
+                delta = -e.detail / 3;
+            }
+            if (delta) {
+                // 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
+                e.xy = this.mousePosition;
+
+                if (delta < 0) {
+                   this.defaultWheelDown(e);
+                } else {
+                   this.defaultWheelUp(e);
+                }
+            }
+            
+            //only wheel the map, not the window
+            OpenLayers.Event.stop(e);
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.MouseDefaults"
+});
diff --git a/lib/OpenLayers/Control/MousePosition.js b/lib/OpenLayers/Control/MousePosition.js
new file mode 100644
index 0000000..8bb63f9
--- /dev/null
+++ b/lib/OpenLayers/Control/MousePosition.js
@@ -0,0 +1,213 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.MousePosition
+ * The MousePosition control displays geographic coordinates of the mouse
+ * pointer, as it is moved about the map.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.MousePosition = OpenLayers.Class(OpenLayers.Control, {
+    
+    /**
+     * APIProperty: autoActivate
+     * {Boolean} Activate the control when it is added to a map.  Default is
+     *     true.
+     */
+    autoActivate: true,
+
+    /** 
+     * Property: element
+     * {DOMElement} 
+     */
+    element: null,
+    
+    /** 
+     * APIProperty: prefix
+     * {String}
+     */
+    prefix: '',
+    
+    /** 
+     * APIProperty: separator
+     * {String}
+     */
+    separator: ', ',
+    
+    /** 
+     * APIProperty: suffix
+     * {String}
+     */
+    suffix: '',
+    
+    /** 
+     * APIProperty: numDigits
+     * {Integer}
+     */
+    numDigits: 5,
+    
+    /** 
+     * APIProperty: granularity
+     * {Integer} 
+     */
+    granularity: 10,
+
+    /**
+     * APIProperty: emptyString 
+     * {String} Set this to some value to set when the mouse is outside the
+     *     map.
+     */
+    emptyString: null,
+    
+    /** 
+     * Property: lastXy
+     * {<OpenLayers.Pixel>}
+     */
+    lastXy: null,
+
+    /**
+     * APIProperty: displayProjection
+     * {<OpenLayers.Projection>} The projection in which the 
+     * mouse position is displayed
+     */
+    displayProjection: null, 
+    
+    /**
+     * Constructor: OpenLayers.Control.MousePosition
+     * 
+     * Parameters:
+     * options - {Object} Options for control.
+     */
+    initialize: function(options) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+    },
+
+    /**
+     * Method: destroy
+     */
+     destroy: function() {
+         this.deactivate();
+         OpenLayers.Control.prototype.destroy.apply(this, arguments);
+     },
+
+    /**
+     * APIMethod: activate
+     */
+    activate: function() {
+        if (OpenLayers.Control.prototype.activate.apply(this, arguments)) {
+            this.map.events.register('mousemove', this, this.redraw);
+            this.map.events.register('mouseout', this, this.reset);
+            this.redraw();
+            return true;
+        } else {
+            return false;
+        }
+    },
+    
+    /**
+     * APIMethod: deactivate
+     */
+    deactivate: function() {
+        if (OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
+            this.map.events.unregister('mousemove', this, this.redraw);
+            this.map.events.unregister('mouseout', this, this.reset);
+            this.element.innerHTML = "";
+            return true;
+        } else {
+            return false;
+        }
+    },
+
+    /**
+     * Method: draw
+     * {DOMElement}
+     */    
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+
+        if (!this.element) {
+            this.div.left = "";
+            this.div.top = "";
+            this.element = this.div;
+        }
+        
+        return this.div;
+    },
+   
+    /**
+     * Method: redraw  
+     */
+    redraw: function(evt) {
+
+        var lonLat;
+
+        if (evt == null) {
+            this.reset();
+            return;
+        } else {
+            if (this.lastXy == null ||
+                Math.abs(evt.xy.x - this.lastXy.x) > this.granularity ||
+                Math.abs(evt.xy.y - this.lastXy.y) > this.granularity)
+            {
+                this.lastXy = evt.xy;
+                return;
+            }
+
+            lonLat = this.map.getLonLatFromPixel(evt.xy);
+            if (!lonLat) { 
+                // map has not yet been properly initialized
+                return;
+            }    
+            if (this.displayProjection) {
+                lonLat.transform(this.map.getProjectionObject(), 
+                                 this.displayProjection );
+            }      
+            this.lastXy = evt.xy;
+            
+        }
+        
+        var newHtml = this.formatOutput(lonLat);
+
+        if (newHtml != this.element.innerHTML) {
+            this.element.innerHTML = newHtml;
+        }
+    },
+
+    /**
+     * Method: reset
+     */
+    reset: function(evt) {
+        if (this.emptyString != null) {
+            this.element.innerHTML = this.emptyString;
+        }
+    },
+
+    /**
+     * Method: formatOutput
+     * Override to provide custom display output
+     *
+     * Parameters:
+     * lonLat - {<OpenLayers.LonLat>} Location to display
+     */
+    formatOutput: function(lonLat) {
+        var digits = parseInt(this.numDigits);
+        var newHtml =
+            this.prefix +
+            lonLat.lon.toFixed(digits) +
+            this.separator + 
+            lonLat.lat.toFixed(digits) +
+            this.suffix;
+        return newHtml;
+    },
+
+    CLASS_NAME: "OpenLayers.Control.MousePosition"
+});
diff --git a/lib/OpenLayers/Control/MouseToolbar.js b/lib/OpenLayers/Control/MouseToolbar.js
new file mode 100644
index 0000000..e0302cb
--- /dev/null
+++ b/lib/OpenLayers/Control/MouseToolbar.js
@@ -0,0 +1,406 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Control/MouseDefaults.js
+ */
+
+/**
+ * Class: OpenLayers.Control.MouseToolbar
+ * This class is DEPRECATED in 2.4 and will be removed by 3.0.
+ * If you need this functionality, use <OpenLayers.Control.NavToolbar>
+ * instead!!! 
+ */
+OpenLayers.Control.MouseToolbar = OpenLayers.Class(
+                                            OpenLayers.Control.MouseDefaults, {
+    
+    /**
+     * Property: mode
+     */ 
+    mode: null,
+    /**
+     * Property: buttons
+     */
+    buttons: null,
+    
+    /**
+     * APIProperty: direction
+     * {String} 'vertical' or 'horizontal'
+     */
+    direction: "vertical",
+    
+    /**
+     * Property: buttonClicked
+     * {String}
+     */
+    buttonClicked: null,
+    
+    /**
+     * Constructor: OpenLayers.Control.MouseToolbar
+     *
+     * Parameters:
+     * position - {<OpenLayers.Pixel>}
+     * direction - {String}
+     */
+    initialize: function(position, direction) {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+        this.position = new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,
+                                             OpenLayers.Control.MouseToolbar.Y);
+        if (position) {
+            this.position = position;
+        }
+        if (direction) {
+            this.direction = direction; 
+        }
+        this.measureDivs = [];
+    },
+    
+    /**
+     * APIMethod: destroy 
+     */
+    destroy: function() {
+        for( var btnId in this.buttons) {
+            var btn = this.buttons[btnId];
+            btn.map = null;
+            btn.events.destroy();
+        }
+        OpenLayers.Control.MouseDefaults.prototype.destroy.apply(this, 
+                                                                 arguments);
+    },
+    
+    /**
+     * Method: draw
+     */
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments); 
+        OpenLayers.Control.MouseDefaults.prototype.draw.apply(this, arguments);
+        this.buttons = {};
+        var sz = new OpenLayers.Size(28,28);
+        var centered = new OpenLayers.Pixel(OpenLayers.Control.MouseToolbar.X,0);
+        this._addButton("zoombox", "drag-rectangle-off.png", "drag-rectangle-on.png", centered, sz, "Shift->Drag to zoom to area");
+        centered = centered.add((this.direction == "vertical" ? 0 : sz.w), (this.direction == "vertical" ? sz.h : 0));
+        this._addButton("pan", "panning-hand-off.png", "panning-hand-on.png", centered, sz, "Drag the map to pan.");
+        centered = centered.add((this.direction == "vertical" ? 0 : sz.w), (this.direction == "vertical" ? sz.h : 0));
+        this.switchModeTo("pan");
+
+        return this.div;
+    },
+    
+    /**
+     * Method: _addButton
+     */
+    _addButton:function(id, img, activeImg, xy, sz, title) {
+        var imgLocation = OpenLayers.Util.getImagesLocation() + img;
+        var activeImgLocation = OpenLayers.Util.getImagesLocation() + activeImg;
+        // var btn = new ol.AlphaImage("_"+id, imgLocation, xy, sz);
+        var btn = OpenLayers.Util.createAlphaImageDiv(
+                                    "OpenLayers_Control_MouseToolbar_" + id, 
+                                    xy, sz, imgLocation, "absolute");
+
+        //we want to add the outer div
+        this.div.appendChild(btn);
+        btn.imgLocation = imgLocation;
+        btn.activeImgLocation = activeImgLocation;
+        
+        btn.events = new OpenLayers.Events(this, btn, null, true);
+        btn.events.on({
+            "mousedown": this.buttonDown,
+            "mouseup": this.buttonUp,
+            "dblclick": OpenLayers.Event.stop,
+            scope: this
+        });
+        btn.action = id;
+        btn.title = title;
+        btn.alt = title;
+        btn.map = this.map;
+
+        //we want to remember/reference the outer div
+        this.buttons[id] = btn;
+        return btn;
+    },
+
+    /**
+     * Method: buttonDown
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    buttonDown: function(evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        this.buttonClicked = evt.element.action;
+        OpenLayers.Event.stop(evt);
+    },
+
+    /**
+     * Method: buttonUp
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    buttonUp: function(evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        if (this.buttonClicked != null) {
+            if (this.buttonClicked == evt.element.action) {
+                this.switchModeTo(evt.element.action);
+            }
+            OpenLayers.Event.stop(evt);
+            this.buttonClicked = null;
+        }
+    },
+    
+    /**
+     * Method: defaultDblClick 
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultDblClick: function (evt) {
+        this.switchModeTo("pan");
+        this.performedDrag = false;
+        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
+        this.map.setCenter(newCenter, this.map.zoom + 1);
+        OpenLayers.Event.stop(evt);
+        return false;
+    },
+
+    /**
+     * Method: defaultMouseDown
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultMouseDown: function (evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        this.mouseDragStart = evt.xy.clone();
+        this.performedDrag = false;
+        this.startViaKeyboard = false;
+        if (evt.shiftKey && this.mode !="zoombox") {
+            this.switchModeTo("zoombox");
+            this.startViaKeyboard = true;
+        } else if (evt.altKey && this.mode !="measure") {
+            this.switchModeTo("measure");
+        } else if (!this.mode) {
+            this.switchModeTo("pan");
+        }
+        
+        switch (this.mode) {
+            case "zoombox":
+                this.map.div.style.cursor = "crosshair";
+                this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
+                                                         this.mouseDragStart,
+                                                         null,
+                                                         null,
+                                                         "absolute",
+                                                         "2px solid red");
+                this.zoomBox.style.backgroundColor = "white";
+                this.zoomBox.style.filter = "alpha(opacity=50)"; // IE
+                this.zoomBox.style.opacity = "0.50";
+                this.zoomBox.style.fontSize = "1px";
+                this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
+                this.map.viewPortDiv.appendChild(this.zoomBox);
+                this.performedDrag = true;
+                break;
+            case "measure":
+                var distance = "";
+                if (this.measureStart) {
+                    var measureEnd = this.map.getLonLatFromViewPortPx(this.mouseDragStart);
+                    distance = OpenLayers.Util.distVincenty(this.measureStart, measureEnd);
+                    distance = Math.round(distance * 100) / 100;
+                    distance = distance + "km";
+                    this.measureStartBox = this.measureBox;
+                }    
+                this.measureStart = this.map.getLonLatFromViewPortPx(this.mouseDragStart);;
+                this.measureBox = OpenLayers.Util.createDiv(null,
+                                                         this.mouseDragStart.add(
+                                                           -2-parseInt(this.map.layerContainerDiv.style.left),
+                                                           -2-parseInt(this.map.layerContainerDiv.style.top)),
+                                                         null,
+                                                         null,
+                                                         "absolute");
+                this.measureBox.style.width="4px";
+                this.measureBox.style.height="4px";
+                this.measureBox.style.fontSize = "1px";
+                this.measureBox.style.backgroundColor="red";
+                this.measureBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
+                this.map.layerContainerDiv.appendChild(this.measureBox);
+                if (distance) {
+                    this.measureBoxDistance = OpenLayers.Util.createDiv(null,
+                                                         this.mouseDragStart.add(
+                                                           -2-parseInt(this.map.layerContainerDiv.style.left),
+                                                           2-parseInt(this.map.layerContainerDiv.style.top)),
+                                                         null,
+                                                         null,
+                                                         "absolute");
+                    
+                    this.measureBoxDistance.innerHTML = distance;
+                    this.measureBoxDistance.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
+                    this.map.layerContainerDiv.appendChild(this.measureBoxDistance);
+                    this.measureDivs.push(this.measureBoxDistance);
+                }
+                this.measureBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
+                this.map.layerContainerDiv.appendChild(this.measureBox);
+                this.measureDivs.push(this.measureBox);
+                break;
+            default:
+                this.map.div.style.cursor = "move";
+                break;
+        }
+        document.onselectstart = OpenLayers.Function.False;
+        OpenLayers.Event.stop(evt);
+    },
+
+    /**
+     * Method: switchModeTo 
+     *
+     * Parameters:
+     * mode - {String} 
+     */
+    switchModeTo: function(mode) {
+        if (mode != this.mode) {
+            
+
+            if (this.mode && this.buttons[this.mode]) {
+                OpenLayers.Util.modifyAlphaImageDiv(this.buttons[this.mode], null, null, null, this.buttons[this.mode].imgLocation);
+            }
+            if (this.mode == "measure" && mode != "measure") {
+                for(var i=0, len=this.measureDivs.length; i<len; i++) {
+                    if (this.measureDivs[i]) { 
+                        this.map.layerContainerDiv.removeChild(this.measureDivs[i]);
+                    }
+                }
+                this.measureDivs = [];
+                this.measureStart = null;
+            }
+            this.mode = mode;
+            if (this.buttons[mode]) {
+                OpenLayers.Util.modifyAlphaImageDiv(this.buttons[mode], null, null, null, this.buttons[mode].activeImgLocation);
+            }
+            switch (this.mode) {
+                case "zoombox":
+                    this.map.div.style.cursor = "crosshair";
+                    break;
+                default:
+                    this.map.div.style.cursor = "";
+                    break;
+            }
+
+        } 
+    }, 
+
+    /**
+     * Method: leaveMode
+     */
+    leaveMode: function() {
+        this.switchModeTo("pan");
+    },
+    
+    /**
+     * Method: defaultMouseMove
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultMouseMove: function (evt) {
+        if (this.mouseDragStart != null) {
+            switch (this.mode) {
+                case "zoombox": 
+                    var deltaX = Math.abs(this.mouseDragStart.x - evt.xy.x);
+                    var deltaY = Math.abs(this.mouseDragStart.y - evt.xy.y);
+                    this.zoomBox.style.width = Math.max(1, deltaX) + "px";
+                    this.zoomBox.style.height = Math.max(1, deltaY) + "px";
+                    if (evt.xy.x < this.mouseDragStart.x) {
+                        this.zoomBox.style.left = evt.xy.x+"px";
+                    }
+                    if (evt.xy.y < this.mouseDragStart.y) {
+                        this.zoomBox.style.top = evt.xy.y+"px";
+                    }
+                    break;
+                default:
+                    var deltaX = this.mouseDragStart.x - evt.xy.x;
+                    var deltaY = this.mouseDragStart.y - evt.xy.y;
+                    var size = this.map.getSize();
+                    var newXY = new OpenLayers.Pixel(size.w / 2 + deltaX,
+                                                     size.h / 2 + deltaY);
+                    var newCenter = this.map.getLonLatFromViewPortPx( newXY ); 
+                    this.map.setCenter(newCenter, null, true);
+                    this.mouseDragStart = evt.xy.clone();
+            }
+            this.performedDrag = true;
+        }
+    },
+
+    /**
+     * Method: defaultMouseUp
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultMouseUp: function (evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        switch (this.mode) {
+            case "zoombox":
+                this.zoomBoxEnd(evt);
+                if (this.startViaKeyboard) {
+                    this.leaveMode();
+                }
+                break;
+            case "pan":
+                if (this.performedDrag) {
+                    this.map.setCenter(this.map.center);
+                }        
+        }
+        document.onselectstart = null;
+        this.mouseDragStart = null;
+        this.map.div.style.cursor = "default";
+    },
+
+    /**
+     * Method: defaultMouseOut
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultMouseOut: function (evt) {
+        if (this.mouseDragStart != null
+            && OpenLayers.Util.mouseLeft(evt, this.map.div)) {
+            if (this.zoomBox) {
+                this.removeZoomBox();
+                if (this.startViaKeyboard) {
+                    this.leaveMode();
+                }
+            }
+            this.mouseDragStart = null;
+            this.map.div.style.cursor = "default";
+        }
+    },
+
+    /**
+     * Method: defaultClick
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultClick: function (evt) {
+        if (this.performedDrag)  {
+            this.performedDrag = false;
+            return false;
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Control.MouseToolbar"
+});
+
+OpenLayers.Control.MouseToolbar.X = 6;
+OpenLayers.Control.MouseToolbar.Y = 300;
diff --git a/lib/OpenLayers/Control/NavToolbar.js b/lib/OpenLayers/Control/NavToolbar.js
new file mode 100644
index 0000000..8fd53c0
--- /dev/null
+++ b/lib/OpenLayers/Control/NavToolbar.js
@@ -0,0 +1,55 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control/Panel.js
+ * @requires OpenLayers/Control/Navigation.js
+ * @requires OpenLayers/Control/ZoomBox.js
+ */
+
+/**
+ * Class: OpenLayers.Control.NavToolbar
+ * This Toolbar is an alternative to the Navigation control that displays
+ *     the state of the control, and provides a UI for changing state to
+ *     use the zoomBox via a Panel control.
+ *
+ * If you wish to change the properties of the Navigation control used
+ *     in the NavToolbar, see: 
+ *     http://trac.openlayers.org/wiki/Toolbars#SubclassingNavToolbar 
+ * 
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Control.Panel>
+ */
+OpenLayers.Control.NavToolbar = OpenLayers.Class(OpenLayers.Control.Panel, {
+
+    /**
+     * Constructor: OpenLayers.Control.NavToolbar 
+     * Add our two mousedefaults controls.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be used
+     *     to extend the control.
+     */
+    initialize: function(options) {
+        OpenLayers.Control.Panel.prototype.initialize.apply(this, [options]);
+        this.addControls([
+          new OpenLayers.Control.Navigation(),
+          new OpenLayers.Control.ZoomBox()
+        ]);
+    },
+
+    /**
+     * Method: draw 
+     * calls the default draw, and then activates mouse defaults.
+     */
+    draw: function() {
+        var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
+        this.activateControl(this.controls[0]);
+        return div;
+    },
+
+    CLASS_NAME: "OpenLayers.Control.NavToolbar"
+});
diff --git a/lib/OpenLayers/Control/Navigation.js b/lib/OpenLayers/Control/Navigation.js
new file mode 100644
index 0000000..35aaa50
--- /dev/null
+++ b/lib/OpenLayers/Control/Navigation.js
@@ -0,0 +1,303 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control/ZoomBox.js
+ * @requires OpenLayers/Control/DragPan.js
+ * @requires OpenLayers/Handler/MouseWheel.js
+ * @requires OpenLayers/Handler/Click.js
+ */
+
+/**
+ * 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> 
+ *     constructor).
+ * 
+ * Inherits:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Navigation = OpenLayers.Class(OpenLayers.Control, {
+
+    /** 
+     * Property: dragPan
+     * {<OpenLayers.Control.DragPan>} 
+     */
+    dragPan: null,
+
+    /**
+     * APIProprety: dragPanOptions
+     * {Object} Options passed to the DragPan control.
+     */
+    dragPanOptions: null,
+
+    /**
+     * APIProperty: documentDrag
+     * {Boolean} Allow panning of the map by dragging outside map viewport.
+     *     Default is false.
+     */
+    documentDrag: false,
+
+    /** 
+     * Property: zoomBox
+     * {<OpenLayers.Control.ZoomBox>}
+     */
+    zoomBox: null,
+
+    /**
+     * APIProperty: zoomBoxEnabled
+     * {Boolean} Whether the user can draw a box to zoom
+     */
+    zoomBoxEnabled: true, 
+
+    /**
+     * APIProperty: zoomWheelEnabled
+     * {Boolean} Whether the mousewheel should zoom the map
+     */
+    zoomWheelEnabled: true,
+    
+    /**
+     * Property: mouseWheelOptions
+     * {Object} Options passed to the MouseWheel control (only useful if
+     *     <zoomWheelEnabled> is set to true)
+     */
+    mouseWheelOptions: null,
+
+    /**
+     * APIProperty: handleRightClicks
+     * {Boolean} Whether or not to handle right clicks. Default is false.
+     */
+    handleRightClicks: false,
+
+    /**
+     * 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. 
+     *    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,
+    
+    /**
+     * APIProperty: autoActivate
+     * {Boolean} Activate the control when it is added to a map.  Default is
+     *     true.
+     */
+    autoActivate: true,
+
+    /**
+     * Constructor: OpenLayers.Control.Navigation
+     * Create a new navigation control
+     * 
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *                    the control
+     */
+    initialize: function(options) {
+        this.handlers = {};
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+    },
+
+    /**
+     * Method: destroy
+     * The destroy method is used to perform any clean up before the control
+     * is dereferenced.  Typically this is where event listeners are removed
+     * to prevent memory leaks.
+     */
+    destroy: function() {
+        this.deactivate();
+
+        if (this.dragPan) {
+            this.dragPan.destroy();
+        }
+        this.dragPan = null;
+
+        if (this.zoomBox) {
+            this.zoomBox.destroy();
+        }
+        this.zoomBox = null;
+        OpenLayers.Control.prototype.destroy.apply(this,arguments);
+    },
+    
+    /**
+     * Method: activate
+     */
+    activate: function() {
+        this.dragPan.activate();
+        if (this.zoomWheelEnabled) {
+            this.handlers.wheel.activate();
+        }    
+        this.handlers.click.activate();
+        if (this.zoomBoxEnabled) {
+            this.zoomBox.activate();
+        }
+        return OpenLayers.Control.prototype.activate.apply(this,arguments);
+    },
+
+    /**
+     * Method: deactivate
+     */
+    deactivate: function() {
+        this.zoomBox.deactivate();
+        this.dragPan.deactivate();
+        this.handlers.click.deactivate();
+        this.handlers.wheel.deactivate();
+        return OpenLayers.Control.prototype.deactivate.apply(this,arguments);
+    },
+    
+    /**
+     * Method: draw
+     */
+    draw: function() {
+        // disable right mouse context menu for support of right click events
+        if (this.handleRightClicks) {
+            this.map.viewPortDiv.oncontextmenu = OpenLayers.Function.False;
+        }
+
+        var clickCallbacks = { 
+            'dblclick': this.defaultDblClick, 
+            'dblrightclick': this.defaultDblRightClick 
+        };
+        var clickOptions = {
+            'double': true, 
+            'stopDouble': true
+        };
+        this.handlers.click = new OpenLayers.Handler.Click(
+            this, clickCallbacks, clickOptions
+        );
+        this.dragPan = new OpenLayers.Control.DragPan(
+            OpenLayers.Util.extend({
+                map: this.map,
+                documentDrag: this.documentDrag
+            }, this.dragPanOptions)
+        );
+        this.zoomBox = new OpenLayers.Control.ZoomBox(
+                    {map: this.map, keyMask: this.zoomBoxKeyMask});
+        this.dragPan.draw();
+        this.zoomBox.draw();
+        this.handlers.wheel = new OpenLayers.Handler.MouseWheel(
+                                    this, {"up"  : this.wheelUp,
+                                           "down": this.wheelDown},
+                                    this.mouseWheelOptions );
+    },
+
+    /**
+     * Method: defaultDblClick 
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultDblClick: function (evt) {
+        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
+        this.map.setCenter(newCenter, this.map.zoom + 1);
+    },
+
+    /**
+     * Method: defaultDblRightClick 
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    defaultDblRightClick: function (evt) {
+        var newCenter = this.map.getLonLatFromViewPortPx( evt.xy ); 
+        this.map.setCenter(newCenter, this.map.zoom - 1);
+    },
+    
+    /**
+     * Method: wheelChange  
+     *
+     * Parameters:
+     * evt - {Event}
+     * deltaZ - {Integer}
+     */
+    wheelChange: function(evt, deltaZ) {
+        var currentZoom = this.map.getZoom();
+        var newZoom = this.map.getZoom() + Math.round(deltaZ);
+        newZoom = Math.max(newZoom, 0);
+        newZoom = Math.min(newZoom, this.map.getNumZoomLevels());
+        if (newZoom === currentZoom) {
+            return;
+        }
+        var size    = this.map.getSize();
+        var deltaX  = size.w/2 - evt.xy.x;
+        var deltaY  = evt.xy.y - size.h/2;
+        var newRes  = this.map.baseLayer.getResolutionForZoom(newZoom);
+        var zoomPoint = this.map.getLonLatFromPixel(evt.xy);
+        var newCenter = new OpenLayers.LonLat(
+                            zoomPoint.lon + deltaX * newRes,
+                            zoomPoint.lat + deltaY * newRes );
+        this.map.setCenter( newCenter, newZoom );
+    },
+
+    /** 
+     * Method: wheelUp
+     * User spun scroll wheel up
+     * 
+     * Parameters:
+     * evt - {Event}
+     * delta - {Integer}
+     */
+    wheelUp: function(evt, delta) {
+        this.wheelChange(evt, delta || 1);
+    },
+
+    /** 
+     * Method: wheelDown
+     * User spun scroll wheel down
+     * 
+     * Parameters:
+     * evt - {Event}
+     * delta - {Integer}
+     */
+    wheelDown: function(evt, delta) {
+        this.wheelChange(evt, delta || -1);
+    },
+    
+    /**
+     * Method: disableZoomBox
+     */
+    disableZoomBox : function() {
+        this.zoomBoxEnabled = false;
+        this.zoomBox.deactivate();       
+    },
+    
+    /**
+     * Method: enableZoomBox
+     */
+    enableZoomBox : function() {
+        this.zoomBoxEnabled = true;
+        if (this.active) {
+            this.zoomBox.activate();
+        }    
+    },
+    
+    /**
+     * Method: disableZoomWheel
+     */
+    
+    disableZoomWheel : function() {
+        this.zoomWheelEnabled = false;
+        this.handlers.wheel.deactivate();       
+    },
+    
+    /**
+     * Method: enableZoomWheel
+     */
+    
+    enableZoomWheel : function() {
+        this.zoomWheelEnabled = true;
+        if (this.active) {
+            this.handlers.wheel.activate();
+        }    
+    },
+
+    CLASS_NAME: "OpenLayers.Control.Navigation"
+});
diff --git a/lib/OpenLayers/Control/NavigationHistory.js b/lib/OpenLayers/Control/NavigationHistory.js
new file mode 100644
index 0000000..f07e4aa
--- /dev/null
+++ b/lib/OpenLayers/Control/NavigationHistory.js
@@ -0,0 +1,423 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Control/Button.js
+ */
+
+/**
+ * Class: OpenLayers.Control.NavigationHistory
+ * A navigation history control.  This is a meta-control, that creates two
+ *     dependent controls: <previous> and <next>.  Call the trigger method
+ *     on the <previous> and <next> controls to restore previous and next
+ *     history states.  The previous and next controls will become active
+ *     when there are available states to restore and will become deactive
+ *     when there are no states to restore.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.NavigationHistory = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Property: type
+     * {String} Note that this control is not intended to be added directly
+     *     to a control panel.  Instead, add the sub-controls previous and
+     *     next.  These sub-controls are button type controls that activate
+     *     and deactivate themselves.  If this parent control is added to
+     *     a panel, it will act as a toggle.
+     */
+    type: OpenLayers.Control.TYPE_TOGGLE,
+
+    /**
+     * APIProperty: previous
+     * {<OpenLayers.Control>} A button type control whose trigger method restores
+     *     the previous state managed by this control.
+     */
+    previous: null,
+    
+    /**
+     * APIProperty: previousOptions
+     * {Object} Set this property on the options argument of the constructor
+     *     to set optional properties on the <previous> control.
+     */
+    previousOptions: null,
+    
+    /**
+     * APIProperty: next
+     * {<OpenLayers.Control>} A button type control whose trigger method restores
+     *     the next state managed by this control.
+     */
+    next: null,
+
+    /**
+     * APIProperty: nextOptions
+     * {Object} Set this property on the options argument of the constructor
+     *     to set optional properties on the <next> control.
+     */
+    nextOptions: null,
+
+    /**
+     * APIProperty: limit
+     * {Integer} Optional limit on the number of history items to retain.  If
+     *     null, there is no limit.  Default is 50.
+     */
+    limit: 50,
+
+    /**
+     * APIProperty: autoActivate
+     * {Boolean} Activate the control when it is added to a map.  Default is
+     *     true.
+     */
+    autoActivate: true,
+
+    /**
+     * Property: clearOnDeactivate
+     * {Boolean} Clear the history when the control is deactivated.  Default
+     *     is false.
+     */
+    clearOnDeactivate: false,
+
+    /**
+     * Property: registry
+     * {Object} An object with keys corresponding to event types.  Values
+     *     are functions that return an object representing the current state.
+     */
+    registry: null,
+
+    /**
+     * Property: nextStack
+     * {Array} Array of items in the history.
+     */
+    nextStack: null,
+
+    /**
+     * Property: previousStack
+     * {Array} List of items in the history.  First item represents the current
+     *     state.
+     */
+    previousStack: null,
+    
+    /**
+     * Property: listeners
+     * {Object} An object containing properties corresponding to event types.
+     *     This object is used to configure the control and is modified on
+     *     construction.
+     */
+    listeners: null,
+    
+    /**
+     * Property: restoring
+     * {Boolean} Currently restoring a history state.  This is set to true
+     *     before calling restore and set to false after restore returns.
+     */
+    restoring: false,
+    
+    /**
+     * Constructor: OpenLayers.Control.NavigationHistory 
+     * 
+     * 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]);
+        
+        this.registry = OpenLayers.Util.extend({
+            "moveend": this.getState
+        }, this.registry);
+        
+        var previousOptions = {
+            trigger: OpenLayers.Function.bind(this.previousTrigger, this),
+            displayClass: this.displayClass + " " + this.displayClass + "Previous"
+        };
+        OpenLayers.Util.extend(previousOptions, this.previousOptions);
+        this.previous = new OpenLayers.Control.Button(previousOptions);
+        
+        var nextOptions = {
+            trigger: OpenLayers.Function.bind(this.nextTrigger, this),
+            displayClass: this.displayClass + " " + this.displayClass + "Next"
+        };
+        OpenLayers.Util.extend(nextOptions, this.nextOptions);
+        this.next = new OpenLayers.Control.Button(nextOptions);
+
+        this.clear();
+    },
+    
+    /**
+     * Method: onPreviousChange
+     * Called when the previous history stack changes.
+     *
+     * Parameters:
+     * state - {Object} An object representing the state to be restored
+     *     if previous is triggered again or null if no previous states remain.
+     * length - {Integer} The number of remaining previous states that can
+     *     be restored.
+     */
+    onPreviousChange: function(state, length) {
+        if(state && !this.previous.active) {
+            this.previous.activate();
+        } else if(!state && this.previous.active) {
+            this.previous.deactivate();
+        }
+    },
+    
+    /**
+     * Method: onNextChange
+     * Called when the next history stack changes.
+     *
+     * Parameters:
+     * state - {Object} An object representing the state to be restored
+     *     if next is triggered again or null if no next states remain.
+     * length - {Integer} The number of remaining next states that can
+     *     be restored.
+     */
+    onNextChange: function(state, length) {
+        if(state && !this.next.active) {
+            this.next.activate();
+        } else if(!state && this.next.active) {
+            this.next.deactivate();
+        }
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Destroy the control.
+     */
+    destroy: function() {
+        OpenLayers.Control.prototype.destroy.apply(this);
+        this.previous.destroy();
+        this.next.destroy();
+        this.deactivate();
+        for(var prop in this) {
+            this[prop] = null;
+        }
+    },
+    
+    /** 
+     * Method: setMap
+     * Set the map property for the control and <previous> and <next> child
+     *     controls.
+     *
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        this.map = map;
+        this.next.setMap(map);
+        this.previous.setMap(map);
+    },
+
+    /**
+     * Method: draw
+     * Called when the control is added to the map.
+     */
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        this.next.draw();
+        this.previous.draw();
+    },
+    
+    /**
+     * Method: previousTrigger
+     * Restore the previous state.  If no items are in the previous history
+     *     stack, this has no effect.
+     *
+     * Returns:
+     * {Object} Item representing state that was restored.  Undefined if no
+     *     items are in the previous history stack.
+     */
+    previousTrigger: function() {
+        var current = this.previousStack.shift();
+        var state = this.previousStack.shift();
+        if(state != undefined) {
+            this.nextStack.unshift(current);
+            this.previousStack.unshift(state);
+            this.restoring = true;
+            this.restore(state);
+            this.restoring = false;
+            this.onNextChange(this.nextStack[0], this.nextStack.length);
+            this.onPreviousChange(
+                this.previousStack[1], this.previousStack.length - 1
+            );
+        } else {
+            this.previousStack.unshift(current);
+        }
+        return state;
+    },
+    
+    /**
+     * APIMethod: nextTrigger
+     * Restore the next state.  If no items are in the next history
+     *     stack, this has no effect.  The next history stack is populated
+     *     as states are restored from the previous history stack.
+     *
+     * Returns:
+     * {Object} Item representing state that was restored.  Undefined if no
+     *     items are in the next history stack.
+     */
+    nextTrigger: function() {
+        var state = this.nextStack.shift();
+        if(state != undefined) {
+            this.previousStack.unshift(state);
+            this.restoring = true;
+            this.restore(state);
+            this.restoring = false;
+            this.onNextChange(this.nextStack[0], this.nextStack.length);
+            this.onPreviousChange(
+                this.previousStack[1], this.previousStack.length - 1
+            );
+        }
+        return state;
+    },
+    
+    /**
+     * APIMethod: clear
+     * Clear history.
+     */
+    clear: function() {
+        this.previousStack = [];
+        this.previous.deactivate();
+        this.nextStack = [];
+        this.next.deactivate();
+    },
+
+    /**
+     * Method: getState
+     * Get the current state and return it.
+     *
+     * Returns:
+     * {Object} An object representing the current state.
+     */
+    getState: function() {
+        return {
+            center: this.map.getCenter(),
+            resolution: this.map.getResolution(),
+            projection: this.map.getProjectionObject(),
+            units: this.map.getProjectionObject().getUnits() || 
+                this.map.units || this.map.baseLayer.units
+        };
+    },
+
+    /**
+     * Method: restore
+     * Update the state with the given object.
+     *
+     * Parameters:
+     * state - {Object} An object representing the state to restore.
+     */
+    restore: function(state) {
+        var center, zoom;
+        if (this.map.getProjectionObject() == state.projection) { 
+            zoom = this.map.getZoomForResolution(state.resolution);
+            center = state.center;
+        } else {
+            center = state.center.clone();
+            center.transform(state.projection, this.map.getProjectionObject());
+            var sourceUnits = state.units;
+            var targetUnits = this.map.getProjectionObject().getUnits() || 
+                this.map.units || this.map.baseLayer.units;
+            var resolutionFactor = sourceUnits && targetUnits ? 
+                OpenLayers.INCHES_PER_UNIT[sourceUnits] / OpenLayers.INCHES_PER_UNIT[targetUnits] : 1;
+            zoom = this.map.getZoomForResolution(resolutionFactor*state.resolution); 
+        }
+        this.map.setCenter(center, zoom);
+    },
+    
+    /**
+     * Method: setListeners
+     * Sets functions to be registered in the listeners object.
+     */
+    setListeners: function() {
+        this.listeners = {};
+        for(var type in this.registry) {
+            this.listeners[type] = OpenLayers.Function.bind(function() {
+                if(!this.restoring) {
+                    var state = this.registry[type].apply(this, arguments);
+                    this.previousStack.unshift(state);
+                    if(this.previousStack.length > 1) {
+                        this.onPreviousChange(
+                            this.previousStack[1], this.previousStack.length - 1
+                        );
+                    }
+                    if(this.previousStack.length > (this.limit + 1)) {
+                        this.previousStack.pop();
+                    }
+                    if(this.nextStack.length > 0) {
+                        this.nextStack = [];
+                        this.onNextChange(null, 0);
+                    }
+                }
+                return true;
+            }, this);
+        }
+    },
+
+    /**
+     * APIMethod: activate
+     * Activate the control.  This registers any listeners.
+     *
+     * Returns:
+     * {Boolean} Control successfully activated.
+     */
+    activate: function() {
+        var activated = false;
+        if(this.map) {
+            if(OpenLayers.Control.prototype.activate.apply(this)) {
+                if(this.listeners == null) {
+                    this.setListeners();
+                }
+                for(var type in this.listeners) {
+                    this.map.events.register(type, this, this.listeners[type]);
+                }
+                activated = true;
+                if(this.previousStack.length == 0) {
+                    this.initStack();
+                }
+            }
+        }
+        return activated;
+    },
+    
+    /**
+     * Method: initStack
+     * Called after the control is activated if the previous history stack is
+     *     empty.
+     */
+    initStack: function() {
+        if(this.map.getCenter()) {
+            this.listeners.moveend();
+        }
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivate the control.  This unregisters any listeners.
+     *
+     * Returns:
+     * {Boolean} Control successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = false;
+        if(this.map) {
+            if(OpenLayers.Control.prototype.deactivate.apply(this)) {
+                for(var type in this.listeners) {
+                    this.map.events.unregister(
+                        type, this, this.listeners[type]
+                    );
+                }
+                if(this.clearOnDeactivate) {
+                    this.clear();
+                }
+                deactivated = true;
+            }
+        }
+        return deactivated;
+    },
+    
+    CLASS_NAME: "OpenLayers.Control.NavigationHistory"
+});
+
diff --git a/lib/OpenLayers/Control/OverviewMap.js b/lib/OpenLayers/Control/OverviewMap.js
new file mode 100644
index 0000000..11ac354
--- /dev/null
+++ b/lib/OpenLayers/Control/OverviewMap.js
@@ -0,0 +1,720 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD 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
+ */
+
+/**
+ * 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 
+ * 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.
+ *
+ * Inerits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Property: element
+     * {DOMElement} The DOM element that contains the overview map
+     */
+    element: null,
+    
+    /**
+     * APIProperty: ovmap
+     * {<OpenLayers.Map>} A reference to the overview map itself.
+     */
+    ovmap: null,
+
+    /**
+     * APIProperty: size
+     * {<OpenLayers.Size>} The overvew map size in pixels.  Note that this is
+     * the size of the map itself - the element that contains the map (default
+     * class name olControlOverviewMapElement) may have padding or other style
+     * attributes added via CSS.
+     */
+    size: new OpenLayers.Size(180, 90),
+
+    /**
+     * APIProperty: layers
+     * {Array(<OpenLayers.Layer>)} Ordered list of layers in the overview map.
+     * 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
+     *     rectangle on the overview map.  When the extent rectangle reaches
+     *     this size, it will be replaced depending on the value of the
+     *     <minRectDisplayClass> property.  Default is 15 pixels.
+     */
+    minRectSize: 15,
+    
+    /**
+     * APIProperty: minRectDisplayClass
+     * {String} Replacement style class name for the extent rectangle when
+     *     <minRectSize> is reached.  This string will be suffixed on to the
+     *     displayClass.  Default is "RectReplacement".
+     *
+     * Example CSS declaration:
+     * (code)
+     * .olControlOverviewMapRectReplacement {
+     *     overflow: hidden;
+     *     cursor: move;
+     *     background-image: url("img/overview_replacement.gif");
+     *     background-repeat: no-repeat;
+     *     background-position: center;
+     * }
+     * (end)
+     */
+    minRectDisplayClass: "RectReplacement",
+
+    /**
+     * APIProperty: minRatio
+     * {Float} The ratio of the overview map resolution to the main map
+     *     resolution at which to zoom farther out on the overview map.
+     */
+    minRatio: 8,
+
+    /**
+     * APIProperty: maxRatio
+     * {Float} The ratio of the overview map resolution to the main map
+     *     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
+     *     the overview map's map constructor.  These should include any
+     *     non-default options that the main map was constructed with.
+     */
+    mapOptions: null,
+
+    /**
+     * APIProperty: autoPan
+     * {Boolean} Always pan the overview map, so the extent marker remains in
+     *     the center.  Default is false.  If true, when you drag the extent
+     *     marker, the overview map will update itself so the marker returns
+     *     to the center.
+     */
+    autoPan: false,
+    
+    /**
+     * Property: handlers
+     * {Object}
+     */
+    handlers: null,
+
+    /**
+     * Property: resolutionFactor
+     * {Object}
+     */
+    resolutionFactor: 1,
+
+    /**
+     * APIProperty: maximized
+     * {Boolean} Start as maximized (visible). Defaults to false.
+     */
+    maximized: false,
+
+    /**
+     * Constructor: OpenLayers.Control.OverviewMap
+     * Create a new overview map
+     *
+     * Parameters:
+     * object - {Object} Properties of this object will be set on the overview
+     * map object.  Note, to set options on the map object contained in this
+     * control, set <mapOptions> as one of the options properties.
+     */
+    initialize: function(options) {
+        this.layers = [];
+        this.handlers = {};
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Deconstruct the control
+     */
+    destroy: function() {
+        if (!this.mapDiv) { // we've already been destroyed
+            return;
+        }
+        if (this.handlers.click) {
+            this.handlers.click.destroy();
+        }
+        if (this.handlers.drag) {
+            this.handlers.drag.destroy();
+        }
+
+        this.mapDiv.removeChild(this.extentRectangle);
+        this.extentRectangle = null;
+
+        if (this.rectEvents) {
+            this.rectEvents.destroy();
+            this.rectEvents = null;
+        }
+
+        if (this.ovmap) {
+            this.ovmap.destroy();
+            this.ovmap = null;
+        }
+        
+        this.element.removeChild(this.mapDiv);
+        this.mapDiv = null;
+
+        this.div.removeChild(this.element);
+        this.element = null;
+
+        if (this.maximizeDiv) {
+            OpenLayers.Event.stopObservingElement(this.maximizeDiv);
+            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);    
+    },
+
+    /**
+     * Method: draw
+     * Render the control in the browser.
+     */    
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        if(!(this.layers.length > 0)) {
+            if (this.map.baseLayer) {
+                var layer = this.map.baseLayer.clone();
+                this.layers = [layer];
+            } else {
+                this.map.events.register("changebaselayer", this, this.baseLayerDraw);
+                return this.div;
+            }
+        }
+
+        // create overview map DOM elements
+        this.element = document.createElement('div');
+        this.element.className = this.displayClass + 'Element';
+        this.element.style.display = 'none';
+
+        this.mapDiv = document.createElement('div');
+        this.mapDiv.style.width = this.size.w + 'px';
+        this.mapDiv.style.height = this.size.h + 'px';
+        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.div.appendChild(this.element);
+
+        // Optionally add min/max buttons if the control will go in the
+        // map viewport.
+        if(!this.outsideViewport) {
+            this.div.className += " " + this.displayClass + 'Container';
+            var imgLocation = OpenLayers.Util.getImagesLocation();
+            // 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, 
+                                        'absolute');
+            this.maximizeDiv.style.display = 'none';
+            this.maximizeDiv.className = this.displayClass + 'MaximizeButton';
+            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, 
+                                        'absolute');
+            this.minimizeDiv.style.display = 'none';
+            this.minimizeDiv.className = this.displayClass + 'MinimizeButton';
+            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.stop);
+
+                OpenLayers.Event.observe(this.minimizeDiv,
+                                         eventsToStop[i], 
+                                         OpenLayers.Event.stop);
+            }
+            
+            this.minimizeControl();
+        } else {
+            // show the overview map
+            this.element.style.display = '';
+        }
+        if(this.map.getExtent()) {
+            this.update();
+        }
+        
+        this.map.events.register('moveend', this, this.update);
+        
+        if (this.maximized) {
+            this.maximizeControl();
+        }
+        return this.div;
+    },
+    
+    /**
+     * Method: baseLayerDraw
+     * Draw the base layer - called if unable to complete in the initial draw
+     */
+    baseLayerDraw: function() {
+        this.draw();
+        this.map.events.unregister("changebaselayer", this, this.baseLayerDraw);
+    },
+
+    /**
+     * Method: rectDrag
+     * Handle extent rectangle drag
+     *
+     * Parameters:
+     * px - {<OpenLayers.Pixel>} The pixel location of the drag.
+     */
+    rectDrag: function(px) {
+        var deltaX = this.handlers.drag.last.x - px.x;
+        var deltaY = this.handlers.drag.last.y - px.y;
+        if(deltaX != 0 || deltaY != 0) {
+            var rectTop = this.rectPxBounds.top;
+            var rectLeft = this.rectPxBounds.left;
+            var rectHeight = Math.abs(this.rectPxBounds.getHeight());
+            var rectWidth = this.rectPxBounds.getWidth();
+            // don't allow dragging off of parent element
+            var newTop = Math.max(0, (rectTop - deltaY));
+            newTop = Math.min(newTop,
+                              this.ovmap.size.h - this.hComp - rectHeight);
+            var newLeft = Math.max(0, (rectLeft - deltaX));
+            newLeft = Math.min(newLeft,
+                               this.ovmap.size.w - this.wComp - rectWidth);
+            this.setRectPxBounds(new OpenLayers.Bounds(newLeft,
+                                                       newTop + rectHeight,
+                                                       newLeft + rectWidth,
+                                                       newTop));
+        }
+    },
+    
+    /**
+     * Method: mapDivClick
+     * Handle browser events
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>} evt
+     */
+    mapDivClick: function(evt) {
+        var pxCenter = this.rectPxBounds.getCenterPixel();
+        var deltaX = evt.xy.x - pxCenter.x;
+        var deltaY = evt.xy.y - pxCenter.y;
+        var top = this.rectPxBounds.top;
+        var left = this.rectPxBounds.left;
+        var height = Math.abs(this.rectPxBounds.getHeight());
+        var width = this.rectPxBounds.getWidth();
+        var newTop = Math.max(0, (top + deltaY));
+        newTop = Math.min(newTop, this.ovmap.size.h - height);
+        var newLeft = Math.max(0, (left + deltaX));
+        newLeft = Math.min(newLeft, this.ovmap.size.w - width);
+        this.setRectPxBounds(new OpenLayers.Bounds(newLeft,
+                                                   newTop + height,
+                                                   newLeft + width,
+                                                   newTop));
+        this.updateMapToRect();
+    },
+
+    /**
+     * Method: maximizeControl
+     * Unhide the control.  Called when the control is in the map viewport.
+     *
+     * Parameters:
+     * e - {<OpenLayers.Event>}
+     */
+    maximizeControl: function(e) {
+        this.element.style.display = '';
+        this.showToggle(false);
+        if (e != null) {
+            OpenLayers.Event.stop(e);                                            
+        }
+    },
+
+    /**
+     * Method: minimizeControl
+     * Hide all the contents of the control, shrink the size, 
+     * add the maximize icon
+     * 
+     * Parameters:
+     * e - {<OpenLayers.Event>}
+     */
+    minimizeControl: function(e) {
+        this.element.style.display = 'none';
+        this.showToggle(true);
+        if (e != null) {
+            OpenLayers.Event.stop(e);                                            
+        }
+    },
+
+    /**
+     * Method: showToggle
+     * Hide/Show the toggle depending on whether the control is minimized
+     *
+     * Parameters:
+     * minimize - {Boolean} 
+     */
+    showToggle: function(minimize) {
+        this.maximizeDiv.style.display = minimize ? '' : 'none';
+        this.minimizeDiv.style.display = minimize ? 'none' : '';
+    },
+
+    /**
+     * Method: update
+     * Update the overview map after layers move.
+     */
+    update: function() {
+        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
+     * resolution of the main map.
+     */
+    isSuitableOverview: function() {
+        var mapExtent = this.map.getExtent();
+        var maxExtent = this.map.maxExtent;
+        var testExtent = new OpenLayers.Bounds(
+                                Math.max(mapExtent.left, maxExtent.left),
+                                Math.max(mapExtent.bottom, maxExtent.bottom),
+                                Math.min(mapExtent.right, maxExtent.right),
+                                Math.min(mapExtent.top, maxExtent.top));        
+
+        if (this.ovmap.getProjection() != this.map.getProjection()) {
+            testExtent = testExtent.transform(
+                this.map.getProjectionObject(),
+                this.ovmap.getProjectionObject() );
+        }
+
+        var resRatio = this.ovmap.getResolution() / this.map.getResolution();
+        return ((resRatio > this.minRatio) &&
+                (resRatio <= this.maxRatio) &&
+                (this.ovmap.getExtent().containsBounds(testExtent)));
+    },
+    
+    /**
+     * Method updateOverview
+     * Called by <update> if <isSuitableOverview> returns true
+     */
+    updateOverview: function() {
+        var mapRes = this.map.getResolution();
+        var targetRes = this.ovmap.getResolution();
+        var resRatio = targetRes / mapRes;
+        if(resRatio > this.maxRatio) {
+            // zoom in overview map
+            targetRes = this.minRatio * mapRes;            
+        } else if(resRatio <= this.minRatio) {
+            // zoom out overview map
+            targetRes = this.maxRatio * mapRes;
+        }
+        var center;
+        if (this.ovmap.getProjection() != this.map.getProjection()) {
+            center = this.map.center.clone();
+            center.transform(this.map.getProjectionObject(),
+                this.ovmap.getProjectionObject() );
+        } else {
+            center = this.map.center;
+        }
+        this.ovmap.setCenter(center, this.ovmap.getZoomForResolution(
+            targetRes * this.resolutionFactor));
+        this.updateRectToMap();
+    },
+    
+    /**
+     * Method: createMap
+     * Construct the map that this control contains
+     */
+    createMap: function() {
+        // create the overview map
+        var options = OpenLayers.Util.extend(
+                        {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
+        this.wComp = parseInt(OpenLayers.Element.getStyle(this.extentRectangle,
+                                               'border-left-width')) +
+                     parseInt(OpenLayers.Element.getStyle(this.extentRectangle,
+                                               'border-right-width'));
+        this.wComp = (this.wComp) ? this.wComp : 2;
+        this.hComp = parseInt(OpenLayers.Element.getStyle(this.extentRectangle,
+                                               'border-top-width')) +
+                     parseInt(OpenLayers.Element.getStyle(this.extentRectangle,
+                                               'border-bottom-width'));
+        this.hComp = (this.hComp) ? this.hComp : 2;
+
+        this.handlers.drag = new OpenLayers.Handler.Drag(
+            this, {move: this.rectDrag, done: this.updateMapToRect},
+            {map: this.ovmap}
+        );
+        this.handlers.click = new OpenLayers.Handler.Click(
+            this, {
+                "click": this.mapDivClick
+            },{
+                "single": true, "double": false,
+                "stopSingle": true, "stopDouble": true,
+                "pixelTolerance": 1,
+                map: this.ovmap
+            }
+        );
+        this.handlers.click.activate();
+        
+        this.rectEvents = new OpenLayers.Events(this, this.extentRectangle,
+                                                null, true);
+        this.rectEvents.register("mouseover", this, function(e) {
+            if(!this.handlers.drag.active && !this.map.dragging) {
+                this.handlers.drag.activate();
+            }
+        });
+        this.rectEvents.register("mouseout", this, function(e) {
+            if(!this.handlers.drag.dragging) {
+                this.handlers.drag.deactivate();
+            }
+        });
+
+        if (this.ovmap.getProjection() != this.map.getProjection()) {
+            var sourceUnits = this.map.getProjectionObject().getUnits() ||
+                this.map.units || this.map.baseLayer.units;
+            var targetUnits = this.ovmap.getProjectionObject().getUnits() ||
+                this.ovmap.units || this.ovmap.baseLayer.units;
+            this.resolutionFactor = sourceUnits && targetUnits ?
+                OpenLayers.INCHES_PER_UNIT[sourceUnits] /
+                OpenLayers.INCHES_PER_UNIT[targetUnits] : 1;
+        }
+    },
+        
+    /**
+     * Method: updateRectToMap
+     * Updates the extent rectangle position and size to match the map extent
+     */
+    updateRectToMap: function() {
+        // If the projections differ we need to reproject
+        var bounds;
+        if (this.ovmap.getProjection() != this.map.getProjection()) {
+            bounds = this.map.getExtent().transform(
+                this.map.getProjectionObject(), 
+                this.ovmap.getProjectionObject() );
+        } else {
+            bounds = this.map.getExtent();
+        }
+        var pxBounds = this.getRectBoundsFromMapBounds(bounds);
+        if (pxBounds) {
+            this.setRectPxBounds(pxBounds);
+        }
+    },
+    
+    /**
+     * Method: updateMapToRect
+     * Updates the map extent to match the extent rectangle position and size
+     */
+    updateMapToRect: function() {
+        var lonLatBounds = this.getMapBoundsFromRectBounds(this.rectPxBounds);
+        if (this.ovmap.getProjection() != this.map.getProjection()) {
+            lonLatBounds = lonLatBounds.transform(
+                this.ovmap.getProjectionObject(),
+                this.map.getProjectionObject() );
+        }
+        this.map.panTo(lonLatBounds.getCenterLonLat());
+    },
+
+    /**
+     * Method: setRectPxBounds
+     * Set extent rectangle pixel bounds.
+     *
+     * Parameters:
+     * pxBounds - {<OpenLayers.Bounds>}
+     */
+    setRectPxBounds: function(pxBounds) {
+        var top = Math.max(pxBounds.top, 0);
+        var left = Math.max(pxBounds.left, 0);
+        var bottom = Math.min(pxBounds.top + Math.abs(pxBounds.getHeight()),
+                              this.ovmap.size.h - this.hComp);
+        var right = Math.min(pxBounds.left + pxBounds.getWidth(),
+                             this.ovmap.size.w - this.wComp);
+        var width = Math.max(right - left, 0);
+        var height = Math.max(bottom - top, 0);
+        if(width < this.minRectSize || height < this.minRectSize) {
+            this.extentRectangle.className = this.displayClass +
+                                             this.minRectDisplayClass;
+            var rLeft = left + (width / 2) - (this.minRectSize / 2);
+            var rTop = top + (height / 2) - (this.minRectSize / 2);
+            this.extentRectangle.style.top = Math.round(rTop) + 'px';
+            this.extentRectangle.style.left = Math.round(rLeft) + 'px';
+            this.extentRectangle.style.height = this.minRectSize + 'px';
+            this.extentRectangle.style.width = this.minRectSize + 'px';
+        } else {
+            this.extentRectangle.className = this.displayClass +
+                                             'ExtentRectangle';
+            this.extentRectangle.style.top = Math.round(top) + 'px';
+            this.extentRectangle.style.left = Math.round(left) + 'px';
+            this.extentRectangle.style.height = Math.round(height) + 'px';
+            this.extentRectangle.style.width = Math.round(width) + 'px';
+        }
+        this.rectPxBounds = new OpenLayers.Bounds(
+            Math.round(left), Math.round(bottom),
+            Math.round(right), Math.round(top)
+        );
+    },
+
+    /**
+     * Method: getRectBoundsFromMapBounds
+     * Get the rect bounds from the map bounds.
+     *
+     * Parameters:
+     * lonLatBounds - {<OpenLayers.Bounds>}
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>}A bounds which is the passed-in map lon/lat extent
+     * translated into pixel bounds for the overview map
+     */
+    getRectBoundsFromMapBounds: function(lonLatBounds) {
+        var leftBottomLonLat = new OpenLayers.LonLat(lonLatBounds.left,
+                                                     lonLatBounds.bottom);
+        var rightTopLonLat = new OpenLayers.LonLat(lonLatBounds.right,
+                                                   lonLatBounds.top);
+        var leftBottomPx = this.getOverviewPxFromLonLat(leftBottomLonLat);
+        var rightTopPx = this.getOverviewPxFromLonLat(rightTopLonLat);
+        var bounds = null;
+        if (leftBottomPx && rightTopPx) {
+            bounds = new OpenLayers.Bounds(leftBottomPx.x, leftBottomPx.y,
+                                           rightTopPx.x, rightTopPx.y);
+        }
+        return bounds;
+    },
+
+    /**
+     * Method: getMapBoundsFromRectBounds
+     * Get the map bounds from the rect bounds.
+     *
+     * Parameters:
+     * pxBounds - {<OpenLayers.Bounds>}
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>} Bounds which is the passed-in overview rect bounds
+     * translated into lon/lat bounds for the overview map
+     */
+    getMapBoundsFromRectBounds: function(pxBounds) {
+        var leftBottomPx = new OpenLayers.Pixel(pxBounds.left,
+                                                pxBounds.bottom);
+        var rightTopPx = new OpenLayers.Pixel(pxBounds.right,
+                                              pxBounds.top);
+        var leftBottomLonLat = this.getLonLatFromOverviewPx(leftBottomPx);
+        var rightTopLonLat = this.getLonLatFromOverviewPx(rightTopPx);
+        return new OpenLayers.Bounds(leftBottomLonLat.lon, leftBottomLonLat.lat,
+                                     rightTopLonLat.lon, rightTopLonLat.lat);
+    },
+
+    /**
+     * Method: getLonLatFromOverviewPx
+     * Get a map location from a pixel location
+     *
+     * Parameters:
+     * overviewMapPx - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {<OpenLayers.LonLat>} Location which is the passed-in overview map
+     * OpenLayers.Pixel, translated into lon/lat by the overview map
+     */
+    getLonLatFromOverviewPx: function(overviewMapPx) {
+        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); 
+    },
+
+    /**
+     * Method: getOverviewPxFromLonLat
+     * Get a pixel location from a map location
+     *
+     * Parameters:
+     * lonlat - {<OpenLayers.LonLat>}
+     *
+     * Returns:
+     * {<OpenLayers.Pixel>} Location which is the passed-in OpenLayers.LonLat, 
+     * translated into overview map pixels
+     */
+    getOverviewPxFromLonLat: function(lonlat) {
+        var res  = this.ovmap.getResolution();
+        var extent = this.ovmap.getExtent();
+        var px = null;
+        if (extent) {
+            px = new OpenLayers.Pixel(
+                        Math.round(1/res * (lonlat.lon - extent.left)),
+                        Math.round(1/res * (extent.top - lonlat.lat)));
+        } 
+        return px;
+    },
+
+    CLASS_NAME: 'OpenLayers.Control.OverviewMap'
+});
diff --git a/lib/OpenLayers/Control/Pan.js b/lib/OpenLayers/Control/Pan.js
new file mode 100644
index 0000000..fdb9e7d
--- /dev/null
+++ b/lib/OpenLayers/Control/Pan.js
@@ -0,0 +1,86 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Pan
+ * The Pan control is a single button to pan the map in one direction. For
+ * a more complete control see <OpenLayers.Control.PanPanel>.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Pan = OpenLayers.Class(OpenLayers.Control, {
+
+    /** 
+     * APIProperty: slideFactor
+     * {Integer} Number of pixels by which we'll pan the map in any direction 
+     *     on clicking the arrow buttons, defaults to 50.
+     */
+    slideFactor: 50,
+
+    /** 
+     * Property: direction
+     * {String} in {'North', 'South', 'East', 'West'}
+     */
+    direction: null,
+
+    /**
+     * Property: type
+     * {String} The type of <OpenLayers.Control> -- When added to a 
+     *     <Control.Panel>, 'type' is used by the panel to determine how to 
+     *     handle our events.
+     */
+    type: OpenLayers.Control.TYPE_BUTTON,
+
+    /**
+     * Constructor: OpenLayers.Control.Pan 
+     * Control which handles the panning (in any of the cardinal directions)
+     *     of the map by a set px distance. 
+     *
+     * Parameters:
+     * direction - {String} The direction this button should pan.
+     * options - {Object} An optional object whose properties will be used
+     *     to extend the control.
+     */
+    initialize: function(direction, options) {
+    
+        this.direction = direction;
+        this.CLASS_NAME += this.direction;
+        
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Method: trigger
+     */
+    trigger: function(){
+    
+        switch (this.direction) {
+            case OpenLayers.Control.Pan.NORTH: 
+                this.map.pan(0, -this.slideFactor);
+                break;
+            case OpenLayers.Control.Pan.SOUTH: 
+                this.map.pan(0, this.slideFactor);
+                break;
+            case OpenLayers.Control.Pan.WEST: 
+                this.map.pan(-this.slideFactor, 0);
+                break;
+            case OpenLayers.Control.Pan.EAST: 
+                this.map.pan(this.slideFactor, 0);
+                break;
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.Pan"
+});
+
+OpenLayers.Control.Pan.NORTH = "North";
+OpenLayers.Control.Pan.SOUTH = "South";
+OpenLayers.Control.Pan.EAST = "East";
+OpenLayers.Control.Pan.WEST = "West";
diff --git a/lib/OpenLayers/Control/PanPanel.js b/lib/OpenLayers/Control/PanPanel.js
new file mode 100644
index 0000000..37f627e
--- /dev/null
+++ b/lib/OpenLayers/Control/PanPanel.js
@@ -0,0 +1,63 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control/Panel.js
+ * @requires OpenLayers/Control/Pan.js
+ */
+
+/**
+ * Class: OpenLayers.Control.PanPanel
+ * The PanPanel is visible control for panning the map North, South, East or
+ * West in small steps. By default it is drawn in the top left corner of the
+ * map.
+ *
+ * Note: 
+ * If you wish to use this class with the default images and you want 
+ *       it to look nice in ie6, you should add the following, conditionally
+ *       added css stylesheet to your HTML file:
+ * 
+ * (code)
+ * <!--[if lte IE 6]>
+ *   <link rel="stylesheet" href="../theme/default/ie6-style.css" type="text/css" />
+ * <![endif]-->
+ * (end)
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control.Panel> 
+ */
+OpenLayers.Control.PanPanel = OpenLayers.Class(OpenLayers.Control.Panel, {
+
+    /** 
+     * APIProperty: slideFactor
+     * {Integer} Number of pixels by which we'll pan the map in any direction 
+     *     on clicking the arrow buttons, defaults to 50.
+     */
+    slideFactor: 50,
+
+    /**
+     * Constructor: OpenLayers.Control.PanPanel 
+     * Add the four directional pan buttons.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be used
+     *     to extend the control.
+     */
+    initialize: function(options) {
+        OpenLayers.Control.Panel.prototype.initialize.apply(this, [options]);
+        this.addControls([
+            new OpenLayers.Control.Pan(OpenLayers.Control.Pan.NORTH,
+                                       {slideFactor: this.slideFactor}),
+            new OpenLayers.Control.Pan(OpenLayers.Control.Pan.SOUTH,
+                                       {slideFactor: this.slideFactor}),
+            new OpenLayers.Control.Pan(OpenLayers.Control.Pan.EAST,
+                                       {slideFactor: this.slideFactor}),
+            new OpenLayers.Control.Pan(OpenLayers.Control.Pan.WEST,
+                                       {slideFactor: this.slideFactor})
+        ]);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.PanPanel"
+});
diff --git a/lib/OpenLayers/Control/PanZoom.js b/lib/OpenLayers/Control/PanZoom.js
new file mode 100644
index 0000000..95261f8
--- /dev/null
+++ b/lib/OpenLayers/Control/PanZoom.js
@@ -0,0 +1,246 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.PanZoom
+ * The PanZoom is a visible control, composed of a
+ * <OpenLayers.Control.PanPanel> and a <OpenLayers.Control.ZoomPanel>. By
+ * default it is drawn in the upper left corner of the map.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.PanZoom = OpenLayers.Class(OpenLayers.Control, {
+
+    /** 
+     * APIProperty: slideFactor
+     * {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            
+     *     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. 
+     */
+    slideRatio: null,
+
+    /** 
+     * Property: buttons
+     * {Array(DOMElement)} Array of Button Divs 
+     */
+    buttons: null,
+
+    /** 
+     * Property: position
+     * {<OpenLayers.Pixel>} 
+     */
+    position: null,
+
+    /**
+     * Constructor: OpenLayers.Control.PanZoom
+     * 
+     * Parameters:
+     * options - {Object}
+     */
+    initialize: function(options) {
+        this.position = new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,
+                                             OpenLayers.Control.PanZoom.Y);
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+        this.removeButtons();
+        this.buttons = null;
+        this.position = null;
+    },
+
+    /**
+     * Method: draw
+     *
+     * Parameters:
+     * px - {<OpenLayers.Pixel>} 
+     * 
+     * Returns:
+     * {DOMElement} A reference to the container div for the PanZoom control.
+     */
+    draw: function(px) {
+        // initialize our internal div
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        px = this.position;
+
+        // place the controls
+        this.buttons = [];
+
+        var sz = new OpenLayers.Size(18,18);
+        var centered = new OpenLayers.Pixel(px.x+sz.w/2, px.y);
+
+        this._addButton("panup", "north-mini.png", centered, sz);
+        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", 
+                        centered.add(0, sz.h*2), sz);
+        this._addButton("zoomin", "zoom-plus-mini.png", 
+                        centered.add(0, sz.h*3+5), sz);
+        this._addButton("zoomworld", "zoom-world-mini.png", 
+                        centered.add(0, sz.h*4+5), sz);
+        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>} 
+     * 
+     * Returns:
+     * {DOMElement} A Div (an alphaImageDiv, to be precise) that contains the
+     *     image of the button, and has all the proper event handlers set.
+     */
+    _addButton:function(id, img, xy, sz) {
+        var imgLocation = OpenLayers.Util.getImagesLocation() + img;
+        var btn = OpenLayers.Util.createAlphaImageDiv(
+                                    this.id + "_" + id, 
+                                    xy, sz, imgLocation, "absolute");
+
+        //we want to add the outer div
+        this.div.appendChild(btn);
+
+        OpenLayers.Event.observe(btn, "mousedown", 
+            OpenLayers.Function.bindAsEventListener(this.buttonDown, btn));
+        OpenLayers.Event.observe(btn, "dblclick", 
+            OpenLayers.Function.bindAsEventListener(this.doubleClick, btn));
+        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() {
+                return slideFactorPixels;
+            };
+        } else {
+            var slideRatio = this.slideRatio;
+            var getSlideFactor = function(dim) {
+                return this.map.getSize()[dim] * slideRatio;
+            };
+        }
+
+        btn.getSlideFactor = getSlideFactor;
+
+        //we want to remember/reference the outer div
+        this.buttons.push(btn);
+        return btn;
+    },
+    
+    /**
+     * Method: _removeButton
+     * 
+     * Parameters:
+     * btn - {Object}
+     */
+    _removeButton: function(btn) {
+        OpenLayers.Event.stopObservingElement(btn);
+        btn.map = null;
+        btn.getSlideFactor = null;
+        this.div.removeChild(btn);
+        OpenLayers.Util.removeItem(this.buttons, btn);
+    },
+    
+    /**
+     * Method: removeButtons
+     */
+    removeButtons: function() {
+        for(var i=this.buttons.length-1; i>=0; --i) {
+            this._removeButton(this.buttons[i]);
+        }
+    },
+    
+    /**
+     * Method: doubleClick
+     *
+     * Parameters:
+     * evt - {Event} 
+     *
+     * Returns:
+     * {Boolean}
+     */
+    doubleClick: function (evt) {
+        OpenLayers.Event.stop(evt);
+        return false;
+    },
+    
+    /**
+     * Method: buttonDown
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    buttonDown: function (evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+
+        switch (this.action) {
+            case "panup": 
+                this.map.pan(0, -this.getSlideFactor("h"));
+                break;
+            case "pandown": 
+                this.map.pan(0, this.getSlideFactor("h"));
+                break;
+            case "panleft": 
+                this.map.pan(-this.getSlideFactor("w"), 0);
+                break;
+            case "panright": 
+                this.map.pan(this.getSlideFactor("w"), 0);
+                break;
+            case "zoomin": 
+                this.map.zoomIn(); 
+                break;
+            case "zoomout": 
+                this.map.zoomOut(); 
+                break;
+            case "zoomworld": 
+                this.map.zoomToMaxExtent(); 
+                break;
+        }
+
+        OpenLayers.Event.stop(evt);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.PanZoom"
+});
+
+/**
+ * Constant: X
+ * {Integer}
+ */
+OpenLayers.Control.PanZoom.X = 4;
+
+/**
+ * Constant: Y
+ * {Integer}
+ */
+OpenLayers.Control.PanZoom.Y = 4;
diff --git a/lib/OpenLayers/Control/PanZoomBar.js b/lib/OpenLayers/Control/PanZoomBar.js
new file mode 100644
index 0000000..eb1f544
--- /dev/null
+++ b/lib/OpenLayers/Control/PanZoomBar.js
@@ -0,0 +1,396 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control/PanZoom.js
+ */
+
+/**
+ * Class: OpenLayers.Control.PanZoomBar
+ * The PanZoomBar is a visible control composed of a
+ * <OpenLayers.Control.PanPanel> and a <OpenLayers.Control.ZoomBar>. 
+ * By default it is displayed in the upper left corner of the map as 4
+ * directional arrows above a vertical slider.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control.PanZoom>
+ */
+OpenLayers.Control.PanZoomBar = OpenLayers.Class(OpenLayers.Control.PanZoom, {
+
+    /** 
+     * APIProperty: zoomStopWidth
+     */
+    zoomStopWidth: 18,
+
+    /** 
+     * APIProperty: zoomStopHeight
+     */
+    zoomStopHeight: 11,
+
+    /** 
+     * Property: slider
+     */
+    slider: null,
+
+    /** 
+     * Property: sliderEvents
+     * {<OpenLayers.Events>}
+     */
+    sliderEvents: null,
+
+    /** 
+     * Property: zoombarDiv
+     * {DOMElement}
+     */
+    zoombarDiv: null,
+
+    /** 
+     * Property: divEvents
+     * {<OpenLayers.Events>}
+     */
+    divEvents: null,
+
+    /** 
+     * APIProperty: zoomWorldIcon
+     * {Boolean}
+     */
+    zoomWorldIcon: false,
+
+    /**
+     * APIProperty: forceFixedZoomLevel
+     * {Boolean} Force a fixed zoom level even though the map has 
+     *     fractionalZoom
+     */
+    forceFixedZoomLevel: false,
+
+    /**
+     * Property: mouseDragStart
+     * {<OpenLayers.Pixel>}
+     */
+    mouseDragStart: null,
+
+    /**
+     * Property: zoomStart
+     * {<OpenLayers.Pixel>}
+     */
+    zoomStart: null,
+
+    /**
+     * Constructor: OpenLayers.Control.PanZoomBar
+     */ 
+    initialize: function() {
+        OpenLayers.Control.PanZoom.prototype.initialize.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function() {
+
+        this._removeZoomBar();
+
+        this.map.events.un({
+            "changebaselayer": this.redraw,
+            scope: this
+        });
+
+        OpenLayers.Control.PanZoom.prototype.destroy.apply(this, arguments);
+
+        delete this.mouseDragStart;
+        delete this.zoomStart;
+    },
+    
+    /**
+     * Method: setMap
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        OpenLayers.Control.PanZoom.prototype.setMap.apply(this, arguments);
+        this.map.events.register("changebaselayer", this, this.redraw);
+    },
+
+    /** 
+     * Method: redraw
+     * clear the div and start over.
+     */
+    redraw: function() {
+        if (this.div != null) {
+            this.removeButtons();
+            this._removeZoomBar();
+        }  
+        this.draw();
+    },
+    
+    /**
+    * Method: draw 
+    *
+    * Parameters:
+    * px - {<OpenLayers.Pixel>} 
+    */
+    draw: function(px) {
+        // initialize our internal div
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        px = this.position.clone();
+
+        // place the controls
+        this.buttons = [];
+
+        var sz = new OpenLayers.Size(18,18);
+        var centered = new OpenLayers.Pixel(px.x+sz.w/2, px.y);
+        var wposition = sz.w;
+
+        if (this.zoomWorldIcon) {
+            centered = new OpenLayers.Pixel(px.x+sz.w, px.y);
+        }
+
+        this._addButton("panup", "north-mini.png", centered, sz);
+        px.y = centered.y+sz.h;
+        this._addButton("panleft", "west-mini.png", px, sz);
+        if (this.zoomWorldIcon) {
+            this._addButton("zoomworld", "zoom-world-mini.png", px.add(sz.w, 0), sz);
+            
+            wposition *= 2;
+        }
+        this._addButton("panright", "east-mini.png", px.add(wposition, 0), sz);
+        this._addButton("pandown", "south-mini.png", centered.add(0, sz.h*2), sz);
+        this._addButton("zoomin", "zoom-plus-mini.png", centered.add(0, sz.h*3+5), sz);
+        centered = this._addZoomBar(centered.add(0, sz.h*4 + 5));
+        this._addButton("zoomout", "zoom-minus-mini.png", centered, sz);
+        return this.div;
+    },
+
+    /** 
+    * Method: _addZoomBar
+    * 
+    * Parameters:
+    * location - {<OpenLayers.Pixel>} where zoombar drawing is to start.
+    */
+    _addZoomBar:function(centered) {
+        var imgLocation = OpenLayers.Util.getImagesLocation();
+        
+        var id = this.id + "_" + this.map.id;
+        var zoomsToEnd = this.map.getNumZoomLevels() - 1 - this.map.getZoom();
+        var slider = OpenLayers.Util.createAlphaImageDiv(id,
+                       centered.add(-1, zoomsToEnd * this.zoomStopHeight), 
+                       new OpenLayers.Size(20,9), 
+                       imgLocation+"slider.png",
+                       "absolute");
+        this.slider = slider;
+        
+        this.sliderEvents = new OpenLayers.Events(this, slider, null, true,
+                                            {includeXY: true});
+        this.sliderEvents.on({
+            "mousedown": this.zoomBarDown,
+            "mousemove": this.zoomBarDrag,
+            "mouseup": this.zoomBarUp,
+            "dblclick": this.doubleClick,
+            "click": this.doubleClick
+        });
+        
+        var sz = new OpenLayers.Size();
+        sz.h = this.zoomStopHeight * this.map.getNumZoomLevels();
+        sz.w = this.zoomStopWidth;
+        var div = null;
+        
+        if (OpenLayers.Util.alphaHack()) {
+            var id = this.id + "_" + this.map.id;
+            div = OpenLayers.Util.createAlphaImageDiv(id, centered,
+                                      new OpenLayers.Size(sz.w, 
+                                              this.zoomStopHeight),
+                                      imgLocation + "zoombar.png", 
+                                      "absolute", null, "crop");
+            div.style.height = sz.h + "px";
+        } else {
+            div = OpenLayers.Util.createDiv(
+                        'OpenLayers_Control_PanZoomBar_Zoombar' + this.map.id,
+                        centered,
+                        sz,
+                        imgLocation+"zoombar.png");
+        }
+        
+        this.zoombarDiv = div;
+        
+        this.divEvents = new OpenLayers.Events(this, div, null, true, 
+                                                {includeXY: true});
+        this.divEvents.on({
+            "mousedown": this.divClick,
+            "mousemove": this.passEventToSlider,
+            "dblclick": this.doubleClick,
+            "click": this.doubleClick
+        });
+        
+        this.div.appendChild(div);
+
+        this.startTop = parseInt(div.style.top);
+        this.div.appendChild(slider);
+
+        this.map.events.register("zoomend", this, this.moveZoomBar);
+
+        centered = centered.add(0, 
+            this.zoomStopHeight * this.map.getNumZoomLevels());
+        return centered; 
+    },
+    
+    /**
+     * Method: _removeZoomBar
+     */
+    _removeZoomBar: function() {
+        this.sliderEvents.un({
+            "mousedown": this.zoomBarDown,
+            "mousemove": this.zoomBarDrag,
+            "mouseup": this.zoomBarUp,
+            "dblclick": this.doubleClick,
+            "click": this.doubleClick
+        });
+        this.sliderEvents.destroy();
+
+        this.divEvents.un({
+            "mousedown": this.divClick,
+            "mousemove": this.passEventToSlider,
+            "dblclick": this.doubleClick,
+            "click": this.doubleClick
+        });
+        this.divEvents.destroy();
+        
+        this.div.removeChild(this.zoombarDiv);
+        this.zoombarDiv = null;
+        this.div.removeChild(this.slider);
+        this.slider = null;
+        
+        this.map.events.unregister("zoomend", this, this.moveZoomBar);
+    },
+    
+    /**
+     * Method: passEventToSlider
+     * This function is used to pass events that happen on the div, or the map,
+     * through to the slider, which then does its moving thing.
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     */
+    passEventToSlider:function(evt) {
+        this.sliderEvents.handleBrowserEvent(evt);
+    },
+    
+    /**
+     * Method: divClick
+     * Picks up on clicks directly on the zoombar div
+     *           and sets the zoom level appropriately.
+     */
+    divClick: function (evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        var y = evt.xy.y;
+        var top = OpenLayers.Util.pagePosition(evt.object)[1];
+        var levels = (y - top)/this.zoomStopHeight;
+        if(this.forceFixedZoomLevel || !this.map.fractionalZoom) {
+            levels = Math.floor(levels);
+        }    
+        var zoom = (this.map.getNumZoomLevels() - 1) - levels; 
+        zoom = Math.min(Math.max(zoom, 0), this.map.getNumZoomLevels() - 1);
+        this.map.zoomTo(zoom);
+        OpenLayers.Event.stop(evt);
+    },
+    
+    /*
+     * Method: zoomBarDown
+     * event listener for clicks on the slider
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     */
+    zoomBarDown:function(evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        this.map.events.on({
+            "mousemove": this.passEventToSlider,
+            "mouseup": this.passEventToSlider,
+            scope: this
+        });
+        this.mouseDragStart = evt.xy.clone();
+        this.zoomStart = evt.xy.clone();
+        this.div.style.cursor = "move";
+        // reset the div offsets just in case the div moved
+        this.zoombarDiv.offsets = null; 
+        OpenLayers.Event.stop(evt);
+    },
+    
+    /*
+     * Method: zoomBarDrag
+     * This is what happens when a click has occurred, and the client is
+     * dragging.  Here we must ensure that the slider doesn't go beyond the
+     * bottom/top of the zoombar div, as well as moving the slider to its new
+     * visual location
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     */
+    zoomBarDrag:function(evt) {
+        if (this.mouseDragStart != null) {
+            var deltaY = this.mouseDragStart.y - evt.xy.y;
+            var offsets = OpenLayers.Util.pagePosition(this.zoombarDiv);
+            if ((evt.clientY - offsets[1]) > 0 && 
+                (evt.clientY - offsets[1]) < parseInt(this.zoombarDiv.style.height) - 2) {
+                var newTop = parseInt(this.slider.style.top) - deltaY;
+                this.slider.style.top = newTop+"px";
+                this.mouseDragStart = evt.xy.clone();
+            }
+            OpenLayers.Event.stop(evt);
+        }
+    },
+    
+    /*
+     * Method: zoomBarUp
+     * Perform cleanup when a mouseup event is received -- discover new zoom
+     * level and switch to it.
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     */
+    zoomBarUp:function(evt) {
+        if (!OpenLayers.Event.isLeftClick(evt)) {
+            return;
+        }
+        if (this.mouseDragStart) {
+            this.div.style.cursor="";
+            this.map.events.un({
+                "mouseup": this.passEventToSlider,
+                "mousemove": this.passEventToSlider,
+                scope: this
+            });
+            var deltaY = this.zoomStart.y - evt.xy.y;
+            var zoomLevel = this.map.zoom;
+            if (!this.forceFixedZoomLevel && this.map.fractionalZoom) {
+                zoomLevel += deltaY/this.zoomStopHeight;
+                zoomLevel = Math.min(Math.max(zoomLevel, 0), 
+                                     this.map.getNumZoomLevels() - 1);
+            } else {
+                zoomLevel += Math.round(deltaY/this.zoomStopHeight);
+            }
+            this.map.zoomTo(zoomLevel);
+            this.mouseDragStart = null;
+            this.zoomStart = null;
+            OpenLayers.Event.stop(evt);
+        }
+    },
+    
+    /*
+    * Method: moveZoomBar
+    * Change the location of the slider to match the current zoom level.
+    */
+    moveZoomBar:function() {
+        var newTop = 
+            ((this.map.getNumZoomLevels()-1) - this.map.getZoom()) * 
+            this.zoomStopHeight + this.startTop + 1;
+        this.slider.style.top = newTop + "px";
+    },    
+    
+    CLASS_NAME: "OpenLayers.Control.PanZoomBar"
+});
diff --git a/lib/OpenLayers/Control/Panel.js b/lib/OpenLayers/Control/Panel.js
new file mode 100644
index 0000000..3af0f31
--- /dev/null
+++ b/lib/OpenLayers/Control/Panel.js
@@ -0,0 +1,371 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Panel
+ * The Panel control is a container for other controls. With it toolbars
+ * may be composed.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Panel = OpenLayers.Class(OpenLayers.Control, {
+    /**
+     * Property: controls
+     * {Array(<OpenLayers.Control>)}
+     */
+    controls: null,    
+    
+    /**
+     * APIProperty: autoActivate
+     * {Boolean} Activate the control when it is added to a map.  Default is
+     *     true.
+     */
+    autoActivate: true,
+
+    /** 
+     * APIProperty: defaultControl
+     * {<OpenLayers.Control>} The control which is activated when the control is
+     * activated (turned on), which also happens at instantiation.
+     * If <saveState> is true, <defaultControl> will be nullified after the
+     * first activation of the panel.
+     */
+    defaultControl: null,
+    
+    /**
+     * APIProperty: saveState
+     * {Boolean} If set to true, the active state of this panel's controls will
+     * be stored on panel deactivation, and restored on reactivation. Default
+     * is false.
+     */
+    saveState: false,
+      
+    /**
+     * Property: activeState
+     * {Object} stores the active state of this panel's controls.
+     */
+    activeState: null,
+
+    /**
+     * Constructor: OpenLayers.Control.Panel
+     * Create a new control panel.
+     *
+     * Each control in the panel is represented by an icon. When clicking 
+     *     on an icon, the <activateControl> method is called.
+     *
+     * Specific properties for controls on a panel:
+     * type - {Number} One of <OpenLayers.Control.TYPE_TOOL>,
+     *     <OpenLayers.Control.TYPE_TOGGLE>, <OpenLayers.Control.TYPE_BUTTON>.
+     *     If not provided, <OpenLayers.Control.TYPE_TOOL> is assumed.
+     * title - {string} Text displayed when mouse is over the icon that 
+     *     represents the control.     
+     *
+     * The <OpenLayers.Control.type> of a control determines the behavior when
+     * clicking its icon:
+     * <OpenLayers.Control.TYPE_TOOL> - The control is activated and other
+     *     controls of this type in the same panel are deactivated. This is
+     *     the default type.
+     * <OpenLayers.Control.TYPE_TOGGLE> - The active state of the control is
+     *     toggled.
+     * <OpenLayers.Control.TYPE_BUTTON> - The
+     *     <OpenLayers.Control.Button.trigger> method of the control is called,
+     *     but its active state is not changed.
+     *
+     * If a control is <OpenLayers.Control.active>, it will be drawn with the
+     * olControl[Name]ItemActive class, otherwise with the
+     * olControl[Name]ItemInactive class.
+     *
+     * 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]);
+        this.controls = [];
+        this.activeState = {};
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+        for(var i = this.controls.length - 1 ; i >= 0; i--) {
+            if(this.controls[i].events) {
+                this.controls[i].events.un({
+                    "activate": this.redraw,
+                    "deactivate": this.redraw,
+                    scope: this
+                });
+            }
+            OpenLayers.Event.stopObservingElement(this.controls[i].panel_div);
+            this.controls[i].panel_div = null;
+        }
+        this.activeState = null;
+    },
+
+    /**
+     * APIMethod: activate
+     */
+    activate: function() {
+        if (OpenLayers.Control.prototype.activate.apply(this, arguments)) {
+            var control;
+            for (var i=0, len=this.controls.length; i<len; i++) {
+                control = this.controls[i];
+                if (control === this.defaultControl ||
+                            (this.saveState && this.activeState[control.id])) {
+                    control.activate();
+                }
+            }    
+            if (this.saveState === true) {
+                this.defaultControl = null;
+            }
+            this.redraw();
+            return true;
+        } else {
+            return false;
+        }
+    },
+    
+    /**
+     * APIMethod: deactivate
+     */
+    deactivate: function() {
+        if (OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
+            var control;
+            for (var i=0, len=this.controls.length; i<len; i++) {
+                control = this.controls[i];
+                this.activeState[control.id] = control.deactivate();
+            }    
+            return true;
+        } else {
+            return false;
+        }
+    },
+    
+    /**
+     * Method: draw
+     *
+     * Returns:
+     * {DOMElement}
+     */    
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        this.addControlsToMap(this.controls);
+        return this.div;
+    },
+
+    /**
+     * Method: redraw
+     */
+    redraw: function() {
+        if (this.div.children.length>0) {
+            for (var l=this.div.children.length, i=l-1 ; i>=0 ; i--) {
+                this.div.removeChild(this.div.children[i]);
+            }
+        }
+        this.div.innerHTML = "";
+        if (this.active) {
+            for (var i=0, len=this.controls.length; i<len; i++) {
+                var element = this.controls[i].panel_div;
+                if (this.controls[i].active) {
+                    element.className = this.controls[i].displayClass + "ItemActive";
+                } else {    
+                    element.className = this.controls[i].displayClass + "ItemInactive";
+                }    
+                this.div.appendChild(element);
+            }
+        }
+    },
+
+    /**
+     * APIMethod: activateControl
+     * This method is called when the user click on the icon representing a 
+     *     control in the panel.
+     *
+     * Parameters:
+     * control - {<OpenLayers.Control>}
+     */
+    activateControl: function (control) {
+        if (!this.active) { return false; }
+        if (control.type == OpenLayers.Control.TYPE_BUTTON) {
+            control.trigger();
+            this.redraw();
+            return;
+        }
+        if (control.type == OpenLayers.Control.TYPE_TOGGLE) {
+            if (control.active) {
+                control.deactivate();
+            } else {
+                control.activate();
+            }
+            this.redraw();
+            return;
+        }
+        var c;
+        for (var i=0, len=this.controls.length; i<len; i++) {
+            c = this.controls[i];
+            if (c != control &&
+               (c.type === OpenLayers.Control.TYPE_TOOL || c.type == null)) {
+                c.deactivate();
+            }
+        }
+        control.activate();
+    },
+
+    /**
+     * APIMethod: addControls
+     * To build a toolbar, you add a set of controls to it. addControls
+     * lets you add a single control or a list of controls to the 
+     * Control Panel.
+     *
+     * Parameters:
+     * controls - {<OpenLayers.Control>} Controls to add in the panel.
+     */    
+    addControls: function(controls) {
+        if (!(controls instanceof Array)) {
+            controls = [controls];
+        }
+        this.controls = this.controls.concat(controls);
+        
+        // Give each control a panel_div which will be used later.
+        // Access to this div is via the panel_div attribute of the 
+        // control added to the panel.
+        // Also, stop mousedowns and clicks, but don't stop mouseup,
+        // since they need to pass through.
+        for (var i=0, len=controls.length; i<len; i++) {
+            var element = document.createElement("div");
+            controls[i].panel_div = element;
+            if (controls[i].title != "") {
+                controls[i].panel_div.title = controls[i].title;
+            }
+            OpenLayers.Event.observe(controls[i].panel_div, "click", 
+                OpenLayers.Function.bind(this.onClick, this, controls[i]));
+            OpenLayers.Event.observe(controls[i].panel_div, "dblclick", 
+                OpenLayers.Function.bind(this.onDoubleClick, this, controls[i]));
+            OpenLayers.Event.observe(controls[i].panel_div, "mousedown", 
+                OpenLayers.Function.bindAsEventListener(OpenLayers.Event.stop));
+        }    
+
+        if (this.map) { // map.addControl() has already been called on the panel
+            this.addControlsToMap(controls);
+            this.redraw();
+        }
+    },
+   
+    /**
+     * Method: addControlsToMap
+     * Only for internal use in draw() and addControls() methods.
+     *
+     * Parameters:
+     * controls - {Array(<OpenLayers.Control>)} Controls to add into map.
+     */         
+    addControlsToMap: function (controls) {
+        var control;
+        for (var i=0, len=controls.length; i<len; i++) {
+            control = controls[i];
+            if (control.autoActivate === true) {
+                control.autoActivate = false;
+                this.map.addControl(control);
+                control.autoActivate = true;
+            } else {
+                this.map.addControl(control);
+                control.deactivate();
+            }
+            control.events.on({
+                "activate": this.redraw,
+                "deactivate": this.redraw,
+                scope: this
+            });
+        }  
+    },
+
+    /**
+     * Method: onClick
+     */
+    onClick: function (ctrl, evt) {
+        OpenLayers.Event.stop(evt ? evt : window.event);
+        this.activateControl(ctrl);
+    },
+
+    /**
+     * Method: onDoubleClick
+     */
+    onDoubleClick: function(ctrl, evt) {
+        OpenLayers.Event.stop(evt ? evt : window.event);
+    },
+
+    /**
+     * APIMethod: getControlsBy
+     * Get a list of controls with properties matching the given criteria.
+     *
+     * Parameter:
+     * property - {String} A control property to be matched.
+     * match - {String | Object} A string to match.  Can also be a regular
+     *     expression literal or object.  In addition, it can be any object
+     *     with a method named test.  For reqular expressions or other, if
+     *     match.test(control[property]) evaluates to true, the control will be
+     *     included in the array returned.  If no controls are found, an empty
+     *     array is returned.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Control>)} A list of controls matching the given criteria.
+     *     An empty array is returned if no matches are found.
+     */
+    getControlsBy: function(property, match) {
+        var test = (typeof match.test == "function");
+        var found = OpenLayers.Array.filter(this.controls, function(item) {
+            return item[property] == match || (test && match.test(item[property]));
+        });
+        return found;
+    },
+
+    /**
+     * APIMethod: getControlsByName
+     * Get a list of contorls with names matching the given name.
+     *
+     * Parameter:
+     * match - {String | Object} A control name.  The name can also be a regular
+     *     expression literal or object.  In addition, it can be any object
+     *     with a method named test.  For reqular expressions or other, if
+     *     name.test(control.name) evaluates to true, the control will be included
+     *     in the list of controls returned.  If no controls are found, an empty
+     *     array is returned.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Control>)} A list of controls matching the given name.
+     *     An empty array is returned if no matches are found.
+     */
+    getControlsByName: function(match) {
+        return this.getControlsBy("name", match);
+    },
+
+    /**
+     * APIMethod: getControlsByClass
+     * Get a list of controls of a given type (CLASS_NAME).
+     *
+     * Parameter:
+     * match - {String | Object} A control class name.  The type can also be a
+     *     regular expression literal or object.  In addition, it can be any
+     *     object with a method named test.  For reqular expressions or other,
+     *     if type.test(control.CLASS_NAME) evaluates to true, the control will
+     *     be included in the list of controls returned.  If no controls are
+     *     found, an empty array is returned.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Control>)} A list of controls matching the given type.
+     *     An empty array is returned if no matches are found.
+     */
+    getControlsByClass: function(match) {
+        return this.getControlsBy("CLASS_NAME", match);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.Panel"
+});
+
diff --git a/lib/OpenLayers/Control/Permalink.js b/lib/OpenLayers/Control/Permalink.js
new file mode 100644
index 0000000..99f8d13
--- /dev/null
+++ b/lib/OpenLayers/Control/Permalink.js
@@ -0,0 +1,220 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Control/ArgParser.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Permalink
+ * The Permalink control is hyperlink that will return the user to the 
+ * current map view. By default it is drawn in the lower right corner of the
+ * map. The href is updated as the map is zoomed, panned and whilst layers
+ * are switched.
+ * `
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Permalink = OpenLayers.Class(OpenLayers.Control, {
+    
+    /**
+     * APIProperty: argParserClass
+     * {Class} The ArgParser control class (not instance) to use with this
+     *     control.
+     */
+    argParserClass: OpenLayers.Control.ArgParser,
+
+    /** 
+     * Property: element 
+     * {DOMElement}
+     */
+    element: null,
+    
+    /** 
+     * APIProperty: base
+     * {String}
+     */
+    base: '',
+
+    /** 
+     * APIProperty: displayProjection
+     * {<OpenLayers.Projection>} Requires proj4js support.  Projection used
+     *     when creating the coordinates in the link. This will reproject the
+     *     map coordinates into display coordinates. If you are using this
+     *     functionality, the permalink which is last 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. 
+     */
+    displayProjection: null, 
+
+    /**
+     * Constructor: OpenLayers.Control.Permalink
+     *
+     * Parameters: 
+     * element - {DOMElement} 
+     * base - {String} 
+     * options - {Object} options to the control. 
+     */
+    initialize: function(element, base, options) {
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        this.element = OpenLayers.Util.getElement(element);        
+        this.base = base || document.location.href;
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function()  {
+        if (this.element.parentNode == this.div) {
+            this.div.removeChild(this.element);
+        }
+        this.element = null;
+
+        this.map.events.unregister('moveend', this, this.updateLink);
+
+        OpenLayers.Control.prototype.destroy.apply(this, arguments); 
+    },
+
+    /**
+     * Method: setMap
+     * Set the map property for the control. 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+
+        //make sure we have an arg parser attached
+        for(var i=0, len=this.map.controls.length; i<len; i++) {
+            var control = this.map.controls[i];
+            if (control.CLASS_NAME == this.argParserClass.CLASS_NAME) {
+                
+                // If a permalink is added to the map, and an ArgParser already
+                // exists, we override the displayProjection to be the one
+                // on the permalink. 
+                if (control.displayProjection != this.displayProjection) {
+                    this.displayProjection = control.displayProjection;
+                }    
+                
+                break;
+            }
+        }
+        if (i == this.map.controls.length) {
+            this.map.addControl(new this.argParserClass(
+                { 'displayProjection': this.displayProjection }));       
+        }
+
+    },
+
+    /**
+     * Method: draw
+     *
+     * Returns:
+     * {DOMElement}
+     */    
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+          
+        if (!this.element) {
+            this.div.className = this.displayClass;
+            this.element = document.createElement("a");
+            this.element.innerHTML = OpenLayers.i18n("permalink");
+            this.element.href="";
+            this.div.appendChild(this.element);
+        }
+        this.map.events.on({
+            'moveend': this.updateLink,
+            'changelayer': this.updateLink,
+            'changebaselayer': this.updateLink,
+            scope: this
+        });
+        
+        // Make it so there is at least a link even though the map may not have
+        // moved yet.
+        this.updateLink();
+        
+        return this.div;
+    },
+   
+    /**
+     * Method: updateLink 
+     */
+    updateLink: function() {
+        var href = this.base;
+        if (href.indexOf('?') != -1) {
+            href = href.substring( 0, href.indexOf('?') );
+        }
+
+        href += '?' + OpenLayers.Util.getParameterString(this.createParams());
+        this.element.href = href;
+    }, 
+    
+    /**
+     * APIMethod: createParams
+     * Creates the parameters that need to be encoded into the permalink url.
+     * 
+     * Parameters:
+     * center - {<OpenLayers.LonLat>} center to encode in the permalink.
+     *     Defaults to the current map center.
+     * zoom - {Integer} zoom level to encode in the permalink. Defaults to the
+     *     current map zoom level.
+     * layers - {Array(<OpenLayers.Layer>)} layers to encode in the permalink.
+     *     Defaults to the current map layers.
+     * 
+     * Returns:
+     * {Object} Hash of parameters that will be url-encoded into the
+     * permalink.
+     */
+    createParams: function(center, zoom, layers) {
+        center = center || this.map.getCenter();
+          
+        var params = OpenLayers.Util.getParameters(this.base);
+        
+        // If there's still no center, map is not initialized yet. 
+        // Break out of this function, and simply return the params from the
+        // base link.
+        if (center) { 
+
+            //zoom
+            params.zoom = zoom || this.map.getZoom(); 
+
+            //lon,lat
+            var lat = center.lat;
+            var lon = center.lon;
+            
+            if (this.displayProjection) {
+                var mapPosition = OpenLayers.Projection.transform(
+                  { x: lon, y: lat }, 
+                  this.map.getProjectionObject(), 
+                  this.displayProjection );
+                lon = mapPosition.x;  
+                lat = mapPosition.y;  
+            }       
+            params.lat = Math.round(lat*100000)/100000;
+            params.lon = Math.round(lon*100000)/100000;
+    
+            //layers        
+            layers = layers || this.map.layers;  
+            params.layers = '';
+            for (var i=0, len=layers.length; i<len; i++) {
+                var layer = layers[i];
+    
+                if (layer.isBaseLayer) {
+                    params.layers += (layer == this.map.baseLayer) ? "B" : "0";
+                } else {
+                    params.layers += (layer.getVisibility()) ? "T" : "F";           
+                }
+            }
+        }
+
+        return params;
+    }, 
+
+    CLASS_NAME: "OpenLayers.Control.Permalink"
+});
diff --git a/lib/OpenLayers/Control/SLDSelect.js b/lib/OpenLayers/Control/SLDSelect.js
new file mode 100644
index 0000000..d0667a2
--- /dev/null
+++ b/lib/OpenLayers/Control/SLDSelect.js
@@ -0,0 +1,570 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Layer/WMS/Post.js
+ * @requires OpenLayers/Handler/RegularPolygon.js
+ * @requires OpenLayers/Handler/Polygon.js
+ * @requires OpenLayers/Handler/Path.js
+ * @requires OpenLayers/Handler/Click.js
+ * @requires OpenLayers/Filter/Spatial.js
+ */
+
+/**
+ * Class: OpenLayers.Control.SLDSelect
+ * Perform selections on WMS layers using Styled Layer Descriptor (SLD)
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.SLDSelect = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * control.events.register(type, obj, listener);
+     * (end)
+     *
+     * Listeners will be called with a reference to an event object.  The
+     *     properties of this event depends on exactly what happened.
+     *
+     * Supported control event types (in addition to those from 
+     * <OpenLayers.Control>):
+     * selected - Triggered when a selection occurs.  Listeners receive an 
+     *     event with *filters* and *layer* properties.  Filters will be an 
+     *     array of OpenLayers.Filter objects created in order to perform 
+     *     the particular selection.
+     */
+    EVENT_TYPES: ["selected"],
+
+    /**
+     * APIProperty: clearOnDeactivate
+     * {Boolean} Should the selection be cleared when the control is 
+     *     deactivated. Default value is false.
+     */
+    clearOnDeactivate: false,
+
+    /**
+     * APIProperty: layers
+     * {Array(<OpenLayers.Layer.WMS>)} The WMS layers this control will work 
+     *     on.
+     */
+    layers: null,
+
+    /**
+     * Property: callbacks
+     * {Object} The functions that are sent to the handler for callback
+     */
+    callbacks: null,
+
+    /**
+     * APIProperty: selectionSymbolizer
+     * {Object} Determines the styling of the selected objects. Default is
+     *     a selection in red.
+     */
+    selectionSymbolizer: {
+        'Polygon': {fillColor: '#FF0000', stroke: false},
+        'Line': {strokeColor: '#FF0000', strokeWidth: 2},
+        'Point': {graphicName: 'square', fillColor: '#FF0000', pointRadius: 5}
+    },
+
+    /**
+     * APIProperty: layerOptions
+     * {Object} The options to apply to the selection layer, by default the
+     *     selection layer will be kept out of the layer switcher.
+     */
+    layerOptions: null,
+
+    /**
+     * APIProperty: handlerOptions
+     * {Object} Used to set non-default properties on the control's handler
+     */
+    handlerOptions: null,
+
+    /**
+     * APIProperty: sketchStyle
+     * {<OpenLayers.Style>|Object} Style or symbolizer to use for the sketch
+     * handler. The recommended way of styling the sketch layer, however, is
+     * to configure an <OpenLayers.StyleMap> in the layerOptions of the
+     * <handlerOptions>:
+     * 
+     * (code)
+     * new OpenLayers.Control.SLDSelect(OpenLayers.Handler.Path, {
+     *     handlerOptions: {
+     *         layerOptions: {
+     *             styleMap: new OpenLayers.StyleMap({
+     *                 "default": {strokeColor: "yellow"}
+     *             });
+     *         }
+     *     }
+     * });
+     * (end)
+     */
+    sketchStyle: null,
+
+    /**
+     * APIProperty: wfsCache
+     * {Object} Cache to use for storing parsed results from
+     *     <OpenLayers.Format.WFSDescribeFeatureType.read>. If not provided,
+     *     these will be cached on the prototype.
+     */
+    wfsCache: {},
+
+    /**
+     * APIProperty: layerCache
+     * {Object} Cache to use for storing references to the selection layers.
+     *     Normally each source layer will have exactly 1 selection layer of
+     *     type OpenLayers.Layer.WMS.Post. If not provided, layers will
+     *     be cached on the prototype. Note that if <clearOnDeactivate> is
+     *     true, the layer will no longer be cached after deactivating the
+     *     control.
+     */
+    layerCache: {},
+
+    /**
+     * Constructor: OpenLayers.Control.SLDSelect
+     * Create a new control for selecting features in WMS layers using
+     *     Styled Layer Descriptor (SLD).
+     *
+     * Parameters:
+     * handler - {<OpenLayers.Class>} A sketch handler class. This determines
+     *     the type of selection, e.g. box (<OpenLayers.Handler.Box>), point
+     *     (<OpenLayers.Handler.Point>), path (<OpenLayers.Handler.Path>) or
+     *     polygon (<OpenLayers.Handler.Polygon>) selection. To use circle
+     *     type selection, use <OpenLayers.Handler.RegularPolygon> and pass
+     *     the number of desired sides (e.g. 40) as "sides" property to the
+     *     <handlerOptions>.
+     * options - {Object} An object containing all configuration properties for
+     *     the control.
+     *
+     * Valid options:
+     * layers - Array({<OpenLayers.Layer.WMS>}) The layers to perform the
+     *     selection on.
+     */
+    initialize: function(handler, options) {
+        // concatenate events specific to this control with those from the base
+        this.EVENT_TYPES =
+            OpenLayers.Control.SLDSelect.prototype.EVENT_TYPES.concat(
+            OpenLayers.Control.prototype.EVENT_TYPES
+        );
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+
+        this.callbacks = OpenLayers.Util.extend({done: this.select, 
+            click: this.select}, this.callbacks);
+        this.handlerOptions = this.handlerOptions || {};
+        this.layerOptions = OpenLayers.Util.applyDefaults(this.layerOptions, {
+            displayInLayerSwitcher: false
+        });
+        if (this.sketchStyle) {
+            this.handlerOptions.layerOptions = OpenLayers.Util.applyDefaults(
+                this.handlerOptions.layerOptions,
+                {styleMap: new OpenLayers.StyleMap({"default": this.sketchStyle})}
+            );
+        }
+        this.handler = new handler(this, this.callbacks, this.handlerOptions);
+    },
+
+    /**
+     * APIMethod: destroy
+     * Take care of things that are not handled in superclass.
+     */
+    destroy: function() {
+        for (var key in this.layerCache) {
+            delete this.layerCache[key];
+        }
+        for (var key in this.wfsCache) {
+            delete this.wfsCache[key];
+        }
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * Method: coupleLayerVisiblity
+     * Couple the selection layer and the source layer with respect to
+     *     layer visibility. So if the source layer is turned off, the
+     *     selection layer is also turned off.
+     *
+     * Parameters:
+     * evt - {Object}
+     */
+    coupleLayerVisiblity: function(evt) {
+        this.setVisibility(evt.object.getVisibility());
+    },
+
+    /**
+     * Method: createSelectionLayer
+     * Creates a "clone" from the source layer in which the selection can
+     * be drawn. This ensures both the source layer and the selection are 
+     * visible and not only the selection.
+     *
+     * Parameters:
+     * source - {<OpenLayers.Layer.WMS>} The source layer on which the selection
+     *     is performed.
+     *
+     * Returns:
+     * {<OpenLayers.Layer.WMS.Post>} A WMS Post layer since SLD selections can
+     *     easily get quite long.
+     */
+    createSelectionLayer: function(source) {
+        // check if we already have a selection layer for the source layer
+        var selectionLayer;
+        if (!this.layerCache[source.id]) {
+            selectionLayer = new OpenLayers.Layer.WMS.Post(source.name, 
+                source.url, source.params, 
+                OpenLayers.Util.applyDefaults(
+                    this.layerOptions,
+                    source.getOptions())
+            );
+            this.layerCache[source.id] = selectionLayer;
+            // make sure the layers are coupled wrt visibility, but only
+            // if they are not displayed in the layer switcher, because in
+            // that case the user cannot control visibility.
+            if (this.layerOptions.displayInLayerSwitcher === false) {
+                source.events.on({
+                    "visibilitychanged": this.coupleLayerVisiblity,
+                    scope: selectionLayer});
+            }
+            this.map.addLayer(selectionLayer);
+        } else {
+            selectionLayer = this.layerCache[source.id];
+        }
+        return selectionLayer;
+    },
+
+    /**
+     * Method: createSLD
+     * Create the SLD document for the layer using the supplied filters.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer.WMS>}
+     * filters - Array({<OpenLayers.Filter>}) The filters to be applied.
+     * geometryAttributes - Array({Object}) The geometry attributes of the 
+     *     layer.
+     *
+     * Returns:
+     * {String} The SLD document generated as a string.
+     */
+    createSLD: function(layer, filters, geometryAttributes) {
+        var sld = {version: "1.0.0", namedLayers: {}};
+        var layerNames = [layer.params.LAYERS].join(",").split(",");
+        for (var i=0, len=layerNames.length; i<len; i++) { 
+            var name = layerNames[i];
+            sld.namedLayers[name] = {name: name, userStyles: []};
+            var symbolizer = this.selectionSymbolizer;
+            var geometryAttribute = geometryAttributes[i];
+            if (geometryAttribute.type.indexOf('Polygon') >= 0) {
+                symbolizer = {Polygon: this.selectionSymbolizer['Polygon']};
+            } else if (geometryAttribute.type.indexOf('LineString') >= 0) {
+                symbolizer = {Line: this.selectionSymbolizer['Line']};
+            } else if (geometryAttribute.type.indexOf('Point') >= 0) {
+                symbolizer = {Point: this.selectionSymbolizer['Point']};
+            }
+            var filter = filters[i];
+            sld.namedLayers[name].userStyles.push({name: 'default', rules: [
+                new OpenLayers.Rule({symbolizer: symbolizer, 
+                    filter: filter, 
+                    maxScaleDenominator: layer.options.minScale})
+            ]});
+        }
+        return new OpenLayers.Format.SLD().write(sld);
+    },
+
+    /**
+     * Method: parseDescribeLayer
+     * Parse the SLD WMS DescribeLayer response and issue the corresponding
+     *     WFS DescribeFeatureType request
+     *
+     * request - {XMLHttpRequest} The request object.
+     */
+    parseDescribeLayer: function(request) {
+        var format = new OpenLayers.Format.WMSDescribeLayer();
+        var doc = request.responseXML;
+        if(!doc || !doc.documentElement) {
+            doc = request.responseText;
+        }
+        var describeLayer = format.read(doc);
+        var typeNames = [];
+        var url = null;
+        for (var i=0, len=describeLayer.length; i<len; i++) {
+            // perform a WFS DescribeFeatureType request
+            if (describeLayer[i].owsType == "WFS") {
+                typeNames.push(describeLayer[i].typeName);
+                url = describeLayer[i].owsURL;
+            }
+        }
+        var options = {
+            url: url,
+            params: {
+                SERVICE: "WFS",
+                TYPENAME: typeNames.toString(),
+                REQUEST: "DescribeFeatureType",
+                VERSION: "1.0.0"
+            },
+            callback: function(request) {
+                var format = new OpenLayers.Format.WFSDescribeFeatureType();
+                var doc = request.responseXML;
+                if(!doc || !doc.documentElement) {
+                    doc = request.responseText;
+                }
+                var describeFeatureType = format.read(doc);
+                this.control.wfsCache[this.layer.id] = describeFeatureType;
+                this.control._queue && this.control.applySelection();
+            },
+            scope: this
+        };
+        OpenLayers.Request.GET(options);
+    },
+
+   /**
+    * Method: getGeometryAttributes
+    * Look up the geometry attributes from the WFS DescribeFeatureType response
+    *
+    * Parameters:
+    * layer - {<OpenLayers.Layer.WMS>} The layer for which to look up the 
+    *     geometry attributes.
+    *
+    * Returns:
+    * Array({Object}) Array of geometry attributes
+    */ 
+   getGeometryAttributes: function(layer) {
+        var result = [];
+        var cache = this.wfsCache[layer.id];
+        for (var i=0, len=cache.featureTypes.length; i<len; i++) {
+            var typeName = cache.featureTypes[i];
+            var properties = typeName.properties;
+            for (var j=0, lenj=properties.length; j < lenj; j++) {
+                var property = properties[j];
+                var type = property.type;
+                if ((type.indexOf('LineString') >= 0) ||
+                    (type.indexOf('GeometryAssociationType') >=0) ||
+                    (type.indexOf('GeometryPropertyType') >= 0) ||
+                    (type.indexOf('Point') >= 0) ||
+                    (type.indexOf('Polygon') >= 0) ) {
+                        result.push(property);
+                }
+            }
+        }
+        return result;
+    },
+
+    /**
+     * APIMethod: activate
+     * Activate the control. Activating the control will perform a SLD WMS
+     *     DescribeLayer request followed by a WFS DescribeFeatureType request
+     *     so that the proper symbolizers can be chosen based on the geometry
+     *     type.
+     */
+    activate: function() {
+        var activated = OpenLayers.Control.prototype.activate.call(this);
+        if(activated) {
+            for (var i=0, len=this.layers.length; i<len; i++) {
+                var layer = this.layers[i];
+                if (layer && !this.wfsCache[layer.id]) {
+                    var options = {
+                        url: layer.url,
+                        params: {
+                            SERVICE: "WMS",
+                            VERSION: layer.params.VERSION,
+                            LAYERS: layer.params.LAYERS,
+                            REQUEST: "DescribeLayer"
+                        },
+                        callback: this.parseDescribeLayer,
+                        scope: {layer: layer, control: this}
+                    };
+                    OpenLayers.Request.GET(options);
+                }
+            }
+        }
+        return activated;
+    },
+
+    /**
+     * APIMethod: deactivate
+     * Deactivate the control. If clearOnDeactivate is true, remove the
+     *     selection layer(s).
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Control.prototype.deactivate.call(this);
+        if(deactivated) {
+            for (var i=0, len=this.layers.length; i<len; i++) {
+                var layer = this.layers[i];
+                if (layer && this.clearOnDeactivate === true) {
+                    var layerCache = this.layerCache;
+                    var selectionLayer = layerCache[layer.id];
+                    if (selectionLayer) {
+                        layer.events.un({
+                            "visibilitychanged": this.coupleLayerVisiblity,
+                            scope: selectionLayer});
+                        selectionLayer.destroy();
+                        delete layerCache[layer.id];
+                    }
+                }
+            }
+        }
+        return deactivated;
+    },
+
+    /**
+     * APIMethod: setLayers
+     * Set the layers on which the selection should be performed.  Call the 
+     *     setLayers method if the layer(s) to be used change and the same 
+     *     control should be used on a new set of layers.
+     *     If the control is already active, it will be active after the new
+     *     set of layers is set.
+     *
+     * Parameters:
+     * layers - {Array(<OpenLayers.Layer.WMS>)}  The new set of layers on which 
+     *     the selection should be performed.
+     */
+    setLayers: function(layers) {
+        if(this.active) {
+            this.deactivate();
+            this.layers = layers;
+            this.activate();
+        } else {
+            this.layers = layers;
+        }
+    },
+
+    /**
+     * Function: createFilter
+     * Create the filter to be used in the SLD.
+     *
+     * Parameters:
+     * geometryAttribute - {Object} Used to get the name of the geometry 
+     *     attribute which is needed for constructing the spatial filter.
+     * geometry - {<OpenLayers.Geometry>} The geometry to use.
+     *
+     * Returns:
+     * {<OpenLayers.Filter.Spatial>} The spatial filter created.
+     */
+    createFilter: function(geometryAttribute, geometry) {
+        var filter = null;
+        if (this.handler instanceof OpenLayers.Handler.RegularPolygon) {
+            // box
+            if (this.handler.irregular === true) {
+                filter = new OpenLayers.Filter.Spatial({
+                    type: OpenLayers.Filter.Spatial.BBOX,
+                    property: geometryAttribute.name,
+                    value: geometry.getBounds()}
+                );
+            } else {
+                filter = new OpenLayers.Filter.Spatial({
+                    type: OpenLayers.Filter.Spatial.INTERSECTS,
+                    property: geometryAttribute.name,
+                    value: geometry}
+                );
+            }
+        } else if (this.handler instanceof OpenLayers.Handler.Polygon) {
+            filter = new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.INTERSECTS,
+                property: geometryAttribute.name,
+                value: geometry}
+            );
+        } else if (this.handler instanceof OpenLayers.Handler.Path) {
+            // if source layer is point based, use DWITHIN instead
+            if (geometryAttribute.type.indexOf('Point') >= 0) {
+                filter = new OpenLayers.Filter.Spatial({
+                    type: OpenLayers.Filter.Spatial.DWITHIN,
+                    property: geometryAttribute.name,
+                    distance: this.map.getExtent().getWidth()*0.01 ,
+                    distanceUnits: this.map.getUnits(),
+                    value: geometry}
+                );
+            } else {
+                filter = new OpenLayers.Filter.Spatial({
+                    type: OpenLayers.Filter.Spatial.INTERSECTS,
+                    property: geometryAttribute.name,
+                    value: geometry}
+                );
+            }
+        } else if (this.handler instanceof OpenLayers.Handler.Click) {
+            if (geometryAttribute.type.indexOf('Polygon') >= 0) {
+                filter = new OpenLayers.Filter.Spatial({
+                    type: OpenLayers.Filter.Spatial.INTERSECTS,
+                    property: geometryAttribute.name,
+                    value: geometry}
+                );
+            } else {
+                filter = new OpenLayers.Filter.Spatial({
+                    type: OpenLayers.Filter.Spatial.DWITHIN,
+                    property: geometryAttribute.name,
+                    distance: this.map.getExtent().getWidth()*0.01 ,
+                    distanceUnits: this.map.getUnits(),
+                    value: geometry}
+                );
+            }
+        }
+        return filter;
+    },
+
+    /**
+     * Method: select
+     * When the handler is done, use SLD_BODY on the selection layer to
+     *     display the selection in the map.
+     *
+     * Parameters:
+     * geometry - {Object} or {<OpenLayers.Geometry>}
+     */
+    select: function(geometry) {
+        this._queue = function() {
+            for (var i=0, len=this.layers.length; i<len; i++) {
+                var layer = this.layers[i];
+                var geometryAttributes = this.getGeometryAttributes(layer);
+                var filters = [];
+                for (var j=0, lenj=geometryAttributes.length; j<lenj; j++) {
+                    var geometryAttribute = geometryAttributes[j];
+                    if (geometryAttribute !== null) {
+                        // from the click handler we will not get an actual 
+                        // geometry so transform
+                        if (!(geometry instanceof OpenLayers.Geometry)) {
+                            var point = this.map.getLonLatFromPixel(
+                                geometry.xy);
+                            geometry = new OpenLayers.Geometry.Point(
+                                point.lon, point.lat);
+                        }
+                        var filter = this.createFilter(geometryAttribute,
+                        geometry);
+                        if (filter !== null) {
+                            filters.push(filter);
+                        }
+                    }
+                }
+    
+                var selectionLayer = this.createSelectionLayer(layer);
+                var sld = this.createSLD(layer, filters, geometryAttributes);
+    
+                this.events.triggerEvent("selected", {
+                    layer: layer,
+                    filters: filters
+                });
+    
+                selectionLayer.mergeNewParams({SLD_BODY: sld});
+                delete this._queue;
+            }
+        };
+        this.applySelection();
+    },
+    
+    /**
+     * Method: applySelection
+     * Checks if all required wfs data is cached, and applies the selection
+     */
+    applySelection: function() {
+        var canApply = true;
+        for (var i=0, len=this.layers.length; i<len; i++) {
+            if(!this.wfsCache[this.layers[i].id]) {
+                canApply = false;
+                break;
+            }
+        }
+        canApply && this._queue.call(this);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.SLDSelect"
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Control/Scale.js b/lib/OpenLayers/Control/Scale.js
new file mode 100644
index 0000000..9a2f89a
--- /dev/null
+++ b/lib/OpenLayers/Control/Scale.js
@@ -0,0 +1,99 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Scale
+ * The Scale control displays the current map scale as a ratio (e.g. Scale = 
+ * 1:1M). By default it is displayed in the lower right corner of the map.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Scale = OpenLayers.Class(OpenLayers.Control, {
+    
+    /**
+     * Parameter: element
+     * {DOMElement}
+     */
+    element: null,
+    
+    /**
+     * APIProperty: geodesic
+     * {Boolean} Use geodesic measurement. Default is false. The recommended
+     * setting for maps in EPSG:4326 is false, and true EPSG:900913. If set to
+     * true, the scale will be calculated based on the horizontal size of the
+     * pixel in the center of the map viewport.
+     */
+    geodesic: false,
+
+    /**
+     * Constructor: OpenLayers.Control.Scale
+     * 
+     * Parameters:
+     * element - {DOMElement} 
+     * options - {Object} 
+     */
+    initialize: function(element, options) {
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        this.element = OpenLayers.Util.getElement(element);        
+    },
+
+    /**
+     * Method: draw
+     * 
+     * Returns:
+     * {DOMElement}
+     */    
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        if (!this.element) {
+            this.element = document.createElement("div");
+            this.div.appendChild(this.element);
+        }
+        this.map.events.register( 'moveend', this, this.updateScale);
+        this.updateScale();
+        return this.div;
+    },
+   
+    /**
+     * Method: updateScale
+     */
+    updateScale: function() {
+        var scale;
+        if(this.geodesic === true) {
+            var units = this.map.getUnits();
+            if(!units) {
+                return;
+            }
+            var inches = OpenLayers.INCHES_PER_UNIT;
+            scale = (this.map.getGeodesicPixelSize().w || 0.000001) *
+                    inches["km"] * OpenLayers.DOTS_PER_INCH;
+        } else {
+            scale = this.map.getScale();
+        }
+            
+        if (!scale) {
+            return;
+        }
+
+        if (scale >= 9500 && scale <= 950000) {
+            scale = Math.round(scale / 1000) + "K";
+        } else if (scale >= 950000) {
+            scale = Math.round(scale / 1000000) + "M";
+        } else {
+            scale = Math.round(scale);
+        }    
+        
+        this.element.innerHTML = OpenLayers.i18n("scale", {'scaleDenom':scale});
+    }, 
+
+    CLASS_NAME: "OpenLayers.Control.Scale"
+});
+
diff --git a/lib/OpenLayers/Control/ScaleLine.js b/lib/OpenLayers/Control/ScaleLine.js
new file mode 100644
index 0000000..fa8f03e
--- /dev/null
+++ b/lib/OpenLayers/Control/ScaleLine.js
@@ -0,0 +1,223 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.ScaleLine
+ * 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>
+ */
+OpenLayers.Control.ScaleLine = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Property: maxWidth
+     * {Integer} Maximum width of the scale line in pixels.  Default is 100.
+     */
+    maxWidth: 100,
+
+    /**
+     * Property: topOutUnits
+     * {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.
+     */
+    topInUnits: "m",
+
+    /**
+     * Property: bottomOutUnits
+     * {String} Units for zoomed out on bottom bar.  Default is mi.
+     */
+    bottomOutUnits: "mi",
+
+    /**
+     * Property: bottomInUnits
+     * {String} Units for zoomed in on bottom bar.  Default is ft.
+     */
+    bottomInUnits: "ft",
+    
+    /**
+     * Property: eTop
+     * {DOMElement}
+     */
+    eTop: null,
+
+    /**
+     * Property: eBottom
+     * {DOMElement}
+     */
+    eBottom:null,
+    
+    /**
+     * APIProperty: geodesic
+     * {Boolean} Use geodesic measurement. Default is false. The recommended
+     * setting for maps in EPSG:4326 is false, and true EPSG:900913. If set to
+     * true, the scale will be calculated based on the horizontal size of the
+     * pixel in the center of the map viewport.
+     */
+    geodesic: false,
+
+    /**
+     * 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]);     
+    },
+
+    /**
+     * Method: draw
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    draw: function() {
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        if (!this.eTop) {
+            // stick in the top bar
+            this.eTop = document.createElement("div");
+            this.eTop.className = this.displayClass + "Top";
+            var theLen = this.topInUnits.length;
+            this.div.appendChild(this.eTop);
+            if((this.topOutUnits == "") || (this.topInUnits == "")) {
+                this.eTop.style.visibility = "hidden";
+            } else {
+                this.eTop.style.visibility = "visible";
+            }
+
+            // and the bottom bar
+            this.eBottom = document.createElement("div");
+            this.eBottom.className = this.displayClass + "Bottom";
+            this.div.appendChild(this.eBottom);
+            if((this.bottomOutUnits == "") || (this.bottomInUnits == "")) {
+                this.eBottom.style.visibility = "hidden";
+            } else {
+                this.eBottom.style.visibility = "visible";
+            }
+        }
+        this.map.events.register('moveend', this, this.update);
+        this.update();
+        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)
+     */
+    getBarLen: function(maxLen) {
+        // 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);
+
+        // right, put it into the correct bracket
+        var barLen;
+        if(firstChar > 5) {
+            barLen = 5;
+        } else if(firstChar > 2) {
+            barLen = 2;
+        } else {
+            barLen = 1;
+        }
+
+        // scale it up the correct power of 10
+        return barLen * pow10;
+    },
+
+    /**
+     * Method: update
+     * Update the size of the bars, and the labels they contain.
+     */
+    update: function() {
+        var res = this.map.getResolution();
+        if (!res) {
+            return;
+        }
+
+        var curMapUnits = this.map.getUnits();
+        var inches = OpenLayers.INCHES_PER_UNIT;
+
+        // convert maxWidth to map units
+        var maxSizeData = this.maxWidth * res * inches[curMapUnits];
+        var geodesicRatio = 1;
+        if(this.geodesic === true) {
+            var maxSizeGeodesic = (this.map.getGeodesicPixelSize().w ||
+                0.000001) * this.maxWidth;
+            var maxSizeKilometers = maxSizeData / inches["km"];
+            geodesicRatio = maxSizeGeodesic / maxSizeKilometers;
+            maxSizeData *= geodesicRatio;
+        }
+
+        // decide whether to use large or small scale units     
+        var topUnits;
+        var bottomUnits;
+        if(maxSizeData > 100000) {
+            topUnits = this.topOutUnits;
+            bottomUnits = this.bottomOutUnits;
+        } else {
+            topUnits = this.topInUnits;
+            bottomUnits = this.bottomInUnits;
+        }
+
+        // and to map units units
+        var topMax = maxSizeData / inches[topUnits];
+        var bottomMax = maxSizeData / inches[bottomUnits];
+
+        // now trim this down to useful block length
+        var topRounded = this.getBarLen(topMax);
+        var bottomRounded = this.getBarLen(bottomMax);
+
+        // and back to display units
+        topMax = topRounded / inches[curMapUnits] * inches[topUnits];
+        bottomMax = bottomRounded / inches[curMapUnits] * inches[bottomUnits];
+
+        // and to pixel units
+        var topPx = topMax / res / geodesicRatio;
+        var bottomPx = bottomMax / res / geodesicRatio;
+        
+        // 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.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"
+});
+
diff --git a/lib/OpenLayers/Control/SelectFeature.js b/lib/OpenLayers/Control/SelectFeature.js
new file mode 100644
index 0000000..dd7ff70
--- /dev/null
+++ b/lib/OpenLayers/Control/SelectFeature.js
@@ -0,0 +1,613 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Handler/Feature.js
+ * @requires OpenLayers/Layer/Vector/RootContainer.js
+ */
+
+/**
+ * Class: OpenLayers.Control.SelectFeature
+ * The SelectFeature control selects vector features from a given layer on 
+ * click or hover. 
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.SelectFeature = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Constant: EVENT_TYPES
+     *
+     * Supported event types:
+     *  - *beforefeaturehighlighted* Triggered before a feature is highlighted
+     *  - *featurehighlighted* Triggered when a feature is highlighted
+     *  - *featureunhighlighted* Triggered when a feature is unhighlighted
+     */
+    EVENT_TYPES: ["beforefeaturehighlighted", "featurehighlighted", "featureunhighlighted"],
+    
+    /**
+     * Property: multipleKey
+     * {String} An event modifier ('altKey' or 'shiftKey') that temporarily sets
+     *     the <multiple> property to true.  Default is null.
+     */
+    multipleKey: null,
+    
+    /**
+     * Property: toggleKey
+     * {String} An event modifier ('altKey' or 'shiftKey') that temporarily sets
+     *     the <toggle> property to true.  Default is null.
+     */
+    toggleKey: null,
+    
+    /**
+     * APIProperty: multiple
+     * {Boolean} Allow selection of multiple geometries.  Default is false.
+     */
+    multiple: false, 
+
+    /**
+     * APIProperty: clickout
+     * {Boolean} Unselect features when clicking outside any feature.
+     *     Default is true.
+     */
+    clickout: true,
+
+    /**
+     * APIProperty: toggle
+     * {Boolean} Unselect a selected feature on click.  Default is false.  Only
+     *     has meaning if hover is false.
+     */
+    toggle: false,
+
+    /**
+     * APIProperty: hover
+     * {Boolean} Select on mouse over and deselect on mouse out.  If true, this
+     * ignores clicks and only listens to mouse moves.
+     */
+    hover: false,
+
+    /**
+     * APIProperty: highlightOnly
+     * {Boolean} If true do not actually select features (i.e. place them in the
+     * layer's selected features array), just highlight them. This property has
+     * no effect if hover is false. Defaults to false.
+     */
+    highlightOnly: false,
+    
+    /**
+     * APIProperty: box
+     * {Boolean} Allow feature selection by drawing a box.
+     */
+    box: false,
+    
+    /**
+     * Property: onBeforeSelect 
+     * {Function} Optional function to be called before a feature is selected.
+     *     The function should expect to be called with a feature.
+     */
+    onBeforeSelect: function() {},
+    
+    /**
+     * APIProperty: onSelect 
+     * {Function} Optional function to be called when a feature is selected.
+     *     The function should expect to be called with a feature.
+     */
+    onSelect: function() {},
+
+    /**
+     * APIProperty: onUnselect
+     * {Function} Optional function to be called when a feature is unselected.
+     *     The function should expect to be called with a feature.
+     */
+    onUnselect: function() {},
+    
+    /**
+     * Property: scope
+     * {Object} The scope to use with the onBeforeSelect, onSelect, onUnselect
+     *     callbacks. If null the scope will be this control.
+     */
+    scope: null,
+
+    /**
+     * APIProperty: geometryTypes
+     * {Array(String)} To restrict selecting to a limited set of geometry types,
+     *     send a list of strings corresponding to the geometry class names.
+     */
+    geometryTypes: null,
+
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer.Vector>} The vector layer with a common renderer
+     * root for all layers this control is configured with (if an array of
+     * layers was passed to the constructor), or the vector layer the control
+     * was configured with (if a single layer was passed to the constructor).
+     */
+    layer: null,
+    
+    /**
+     * Property: layers
+     * {Array(<OpenLayers.Layer.Vector>} The layers this control will work on,
+     * or null if the control was configured with a single layer
+     */
+    layers: null,
+    
+    /**
+     * APIProperty: callbacks
+     * {Object} The functions that are sent to the handlers.feature for callback
+     */
+    callbacks: null,
+    
+    /**
+     * APIProperty: selectStyle 
+     * {Object} Hash of styles
+     */
+    selectStyle: null,
+    
+    /**
+     * Property: renderIntent
+     * {String} key used to retrieve the select style from the layer's
+     * style map.
+     */
+    renderIntent: "select",
+
+    /**
+     * Property: handlers
+     * {Object} Object with references to multiple <OpenLayers.Handler>
+     *     instances.
+     */
+    handlers: null,
+
+    /**
+     * Constructor: OpenLayers.Control.SelectFeature
+     * Create a new control for selecting features.
+     *
+     * Parameters:
+     * layers - {<OpenLayers.Layer.Vector>}, or an array of vector layers. The
+     *     layer(s) this control will select features from.
+     * options - {Object} 
+     */
+    initialize: function(layers, options) {
+        // concatenate events specific to this control with those from the base
+        this.EVENT_TYPES =
+            OpenLayers.Control.SelectFeature.prototype.EVENT_TYPES.concat(
+            OpenLayers.Control.prototype.EVENT_TYPES
+        );
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        
+        if(this.scope === null) {
+            this.scope = this;
+        }
+        this.initLayer(layers);
+        var callbacks = {
+            click: this.clickFeature,
+            clickout: this.clickoutFeature
+        };
+        if (this.hover) {
+            callbacks.over = this.overFeature;
+            callbacks.out = this.outFeature;
+        }
+             
+        this.callbacks = OpenLayers.Util.extend(callbacks, this.callbacks);
+        this.handlers = {
+            feature: new OpenLayers.Handler.Feature(
+                this, this.layer, this.callbacks,
+                {geometryTypes: this.geometryTypes}
+            )
+        };
+
+        if (this.box) {
+            this.handlers.box = new OpenLayers.Handler.Box(
+                this, {done: this.selectBox},
+                {boxDivClassName: "olHandlerBoxSelectFeature"}
+            ); 
+        }
+    },
+
+    /**
+     * Method: initLayer
+     * Assign the layer property. If layers is an array, we need to use
+     *     a RootContainer.
+     *
+     * Parameters:
+     * layers - {<OpenLayers.Layer.Vector>}, or an array of vector layers.
+     */
+    initLayer: function(layers) {
+        if(layers instanceof Array) {
+            this.layers = layers;
+            this.layer = new OpenLayers.Layer.Vector.RootContainer(
+                this.id + "_container", {
+                    layers: layers
+                }
+            );
+        } else {
+            this.layer = layers;
+        }
+    },
+    
+    /**
+     * Method: destroy
+     */
+    destroy: function() {
+        if(this.active && this.layers) {
+            this.map.removeLayer(this.layer);
+        }
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+        if(this.layers) {
+            this.layer.destroy();
+        }
+    },
+
+    /**
+     * Method: activate
+     * Activates the control.
+     * 
+     * Returns:
+     * {Boolean} The control was effectively activated.
+     */
+    activate: function () {
+        if (!this.active) {
+            if(this.layers) {
+                this.map.addLayer(this.layer);
+            }
+            this.handlers.feature.activate();
+            if(this.box && this.handlers.box) {
+                this.handlers.box.activate();
+            }
+        }
+        return OpenLayers.Control.prototype.activate.apply(
+            this, arguments
+        );
+    },
+
+    /**
+     * Method: deactivate
+     * Deactivates the control.
+     * 
+     * Returns:
+     * {Boolean} The control was effectively deactivated.
+     */
+    deactivate: function () {
+        if (this.active) {
+            this.handlers.feature.deactivate();
+            if(this.handlers.box) {
+                this.handlers.box.deactivate();
+            }
+            if(this.layers) {
+                this.map.removeLayer(this.layer);
+            }
+        }
+        return OpenLayers.Control.prototype.deactivate.apply(
+            this, arguments
+        );
+    },
+
+    /**
+     * Method: unselectAll
+     * Unselect all selected features.  To unselect all except for a single
+     *     feature, set the options.except property to the feature.
+     *
+     * Parameters:
+     * options - {Object} Optional configuration object.
+     */
+    unselectAll: function(options) {
+        // we'll want an option to supress notification here
+        var layers = this.layers || [this.layer];
+        var layer, feature;
+        for(var l=0; l<layers.length; ++l) {
+            layer = layers[l];
+            for(var i=layer.selectedFeatures.length-1; i>=0; --i) {
+                feature = layer.selectedFeatures[i];
+                if(!options || options.except != feature) {
+                    this.unselect(feature);
+                }
+            }
+        }
+    },
+
+    /**
+     * Method: clickFeature
+     * Called on click in a feature
+     * Only responds if this.hover is false.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    clickFeature: function(feature) {
+        if(!this.hover) {
+            var selected = (OpenLayers.Util.indexOf(
+                feature.layer.selectedFeatures, feature) > -1);
+            if(selected) {
+                if(this.toggleSelect()) {
+                    this.unselect(feature);
+                } else if(!this.multipleSelect()) {
+                    this.unselectAll({except: feature});
+                }
+            } else {
+                if(!this.multipleSelect()) {
+                    this.unselectAll({except: feature});
+                }
+                this.select(feature);
+            }
+        }
+    },
+
+    /**
+     * Method: multipleSelect
+     * Allow for multiple selected features based on <multiple> property and
+     *     <multipleKey> event modifier.
+     *
+     * Returns:
+     * {Boolean} Allow for multiple selected features.
+     */
+    multipleSelect: function() {
+        return this.multiple || (this.handlers.feature.evt &&
+                                 this.handlers.feature.evt[this.multipleKey]);
+    },
+    
+    /**
+     * Method: toggleSelect
+     * Event should toggle the selected state of a feature based on <toggle>
+     *     property and <toggleKey> event modifier.
+     *
+     * Returns:
+     * {Boolean} Toggle the selected state of a feature.
+     */
+    toggleSelect: function() {
+        return this.toggle || (this.handlers.feature.evt &&
+                               this.handlers.feature.evt[this.toggleKey]);
+    },
+
+    /**
+     * Method: clickoutFeature
+     * Called on click outside a previously clicked (selected) feature.
+     * Only responds if this.hover is false.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Vector.Feature>} 
+     */
+    clickoutFeature: function(feature) {
+        if(!this.hover && this.clickout) {
+            this.unselectAll();
+        }
+    },
+
+    /**
+     * Method: overFeature
+     * Called on over a feature.
+     * Only responds if this.hover is true.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    overFeature: function(feature) {
+        var layer = feature.layer;
+        if(this.hover) {
+            if(this.highlightOnly) {
+                this.highlight(feature);
+            } else if(OpenLayers.Util.indexOf(
+                layer.selectedFeatures, feature) == -1) {
+                this.select(feature);
+            }
+        }
+    },
+
+    /**
+     * Method: outFeature
+     * Called on out of a selected feature.
+     * Only responds if this.hover is true.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    outFeature: function(feature) {
+        if(this.hover) {
+            if(this.highlightOnly) {
+                // we do nothing if we're not the last highlighter of the
+                // feature
+                if(feature._lastHighlighter == this.id) {
+                    // if another select control had highlighted the feature before
+                    // we did it ourself then we use that control to highlight the
+                    // feature as it was before we highlighted it, else we just
+                    // unhighlight it
+                    if(feature._prevHighlighter &&
+                       feature._prevHighlighter != this.id) {
+                        delete feature._lastHighlighter;
+                        var control = this.map.getControl(
+                            feature._prevHighlighter);
+                        if(control) {
+                            control.highlight(feature);
+                        }
+                    } else {
+                        this.unhighlight(feature);
+                    }
+                }
+            } else {
+                this.unselect(feature);
+            }
+        }
+    },
+
+    /**
+     * Method: highlight
+     * Redraw feature with the select style.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    highlight: function(feature) {
+        var layer = feature.layer;
+        var cont = this.events.triggerEvent("beforefeaturehighlighted", {
+            feature : feature
+        });
+        if(cont !== false) {
+            feature._prevHighlighter = feature._lastHighlighter;
+            feature._lastHighlighter = this.id;
+            var style = this.selectStyle || this.renderIntent;
+            layer.drawFeature(feature, style);
+            this.events.triggerEvent("featurehighlighted", {feature : feature});
+        }
+    },
+
+    /**
+     * Method: unhighlight
+     * Redraw feature with the "default" style
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    unhighlight: function(feature) {
+        var layer = feature.layer;
+        feature._lastHighlighter = feature._prevHighlighter;
+        delete feature._prevHighlighter;
+        layer.drawFeature(feature, feature.style || feature.layer.style ||
+            "default");
+        this.events.triggerEvent("featureunhighlighted", {feature : feature});
+    },
+    
+    /**
+     * Method: select
+     * Add feature to the layer's selectedFeature array, render the feature as
+     * selected, and call the onSelect function.
+     * 
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    select: function(feature) {
+        var cont = this.onBeforeSelect.call(this.scope, feature);
+        var layer = feature.layer;
+        if(cont !== false) {
+            cont = layer.events.triggerEvent("beforefeatureselected", {
+                feature: feature
+            });
+            if(cont !== false) {
+                layer.selectedFeatures.push(feature);
+                this.highlight(feature);
+                // if the feature handler isn't involved in the feature
+                // selection (because the box handler is used or the
+                // feature is selected programatically) we fake the
+                // feature handler to allow unselecting on click
+                if(!this.handlers.feature.lastFeature) {
+                    this.handlers.feature.lastFeature = layer.selectedFeatures[0];
+                }
+                layer.events.triggerEvent("featureselected", {feature: feature});
+                this.onSelect.call(this.scope, feature);
+            }
+        }
+    },
+
+    /**
+     * Method: unselect
+     * Remove feature from the layer's selectedFeature array, render the feature as
+     * normal, and call the onUnselect function.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     */
+    unselect: function(feature) {
+        var layer = feature.layer;
+        // Store feature style for restoration later
+        this.unhighlight(feature);
+        OpenLayers.Util.removeItem(layer.selectedFeatures, feature);
+        layer.events.triggerEvent("featureunselected", {feature: feature});
+        this.onUnselect.call(this.scope, feature);
+    },
+    
+    /**
+     * Method: selectBox
+     * Callback from the handlers.box set up when <box> selection is true
+     *     on.
+     *
+     * Parameters:
+     * position - {<OpenLayers.Bounds> || <OpenLayers.Pixel> }  
+     */
+    selectBox: function(position) {
+        if (position instanceof OpenLayers.Bounds) {
+            var minXY = this.map.getLonLatFromPixel(
+                new OpenLayers.Pixel(position.left, position.bottom)
+            );
+            var maxXY = this.map.getLonLatFromPixel(
+                new OpenLayers.Pixel(position.right, position.top)
+            );
+            var bounds = new OpenLayers.Bounds(
+                minXY.lon, minXY.lat, maxXY.lon, maxXY.lat
+            );
+            
+            // if multiple is false, first deselect currently selected features
+            if (!this.multipleSelect()) {
+                this.unselectAll();
+            }
+            
+            // because we're using a box, we consider we want multiple selection
+            var prevMultiple = this.multiple;
+            this.multiple = true;
+            var layers = this.layers || [this.layer];
+            var layer;
+            for(var l=0; l<layers.length; ++l) {
+                layer = layers[l];
+                for(var i=0, len = layer.features.length; i<len; ++i) {
+                    var feature = layer.features[i];
+                    // check if the feature is displayed
+                    if (!feature.getVisibility()) {
+                        continue;
+                    }
+
+                    if (this.geometryTypes == null || OpenLayers.Util.indexOf(
+                            this.geometryTypes, feature.geometry.CLASS_NAME) > -1) {
+                        if (bounds.toGeometry().intersects(feature.geometry)) {
+                            if (OpenLayers.Util.indexOf(layer.selectedFeatures, feature) == -1) {
+                                this.select(feature);
+                            }
+                        }
+                    }
+                }
+            }
+            this.multiple = prevMultiple;
+        }
+    },
+
+    /** 
+     * Method: setMap
+     * Set the map property for the control. 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        this.handlers.feature.setMap(map);
+        if (this.box) {
+            this.handlers.box.setMap(map);
+        }
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+    },
+    
+    /**
+     * APIMethod: setLayer
+     * Attach a new layer to the control, overriding any existing layers.
+     *
+     * Parameters:
+     * layers - Array of {<OpenLayers.Layer.Vector>} or a single
+     *     {<OpenLayers.Layer.Vector>}
+     */
+    setLayer: function(layers) {
+        var isActive = this.active;
+        this.unselectAll();
+        this.deactivate();
+        if(this.layers) {
+            this.layer.destroy();
+            this.layers = null;
+        }
+        this.initLayer(layers);
+        this.handlers.feature.layer = this.layer;
+        if (isActive) {
+            this.activate();
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Control.SelectFeature"
+});
diff --git a/lib/OpenLayers/Control/Snapping.js b/lib/OpenLayers/Control/Snapping.js
new file mode 100644
index 0000000..3d15539
--- /dev/null
+++ b/lib/OpenLayers/Control/Snapping.js
@@ -0,0 +1,547 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Layer/Vector.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Snapping
+ * Acts as a snapping agent while editing vector features.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Snapping = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * control.events.register(type, obj, listener);
+     * (end)
+     *
+     * Listeners will be called with a reference to an event object.  The
+     *     properties of this event depends on exactly what happened.
+     *
+     * Supported control event types (in addition to those from <OpenLayers.Control>):
+     * beforesnap - Triggered before a snap occurs.  Listeners receive an
+     *     event object with *point*, *x*, *y*, *distance*, *layer*, and
+     *     *snapType* properties.  The point property will be original point
+     *     geometry considered for snapping. The x and y properties represent
+     *     coordinates the point will receive. The distance is the distance
+     *     of the snap.  The layer is the target layer.  The snapType property
+     *     will be one of "node", "vertex", or "edge". Return false to stop
+     *     snapping from occurring.
+     * snap - Triggered when a snap occurs.  Listeners receive an event with
+     *     *point*, *snapType*, *layer*, and *distance* properties.  The point
+     *     will be the location snapped to.  The snapType will be one of "node",
+     *     "vertex", or "edge".  The layer will be the target layer.  The
+     *     distance will be the distance of the snap in map units.
+     * unsnap - Triggered when a vertex is unsnapped.  Listeners receive an
+     *     event with a *point* property.
+     */
+    EVENT_TYPES: ["beforesnap", "snap", "unsnap"],
+    
+    /**
+     * CONSTANT: DEFAULTS
+     * Default target properties.
+     */
+    DEFAULTS: {
+        tolerance: 10,
+        node: true,
+        edge: true,
+        vertex: true
+    },
+    
+    /**
+     * Property: greedy
+     * {Boolean} Snap to closest feature in first layer with an eligible
+     *     feature.  Default is true.
+     */
+    greedy: true,
+    
+    /**
+     * Property: precedence
+     * {Array} List representing precedence of different snapping types.
+     *     Default is "node", "vertex", "edge".
+     */
+    precedence: ["node", "vertex", "edge"],
+    
+    /**
+     * Property: resolution
+     * {Float} The map resolution for the previously considered snap.
+     */
+    resolution: null,
+    
+    /**
+     * Property: geoToleranceCache
+     * {Object} A cache of geo-tolerances.  Tolerance values (in map units) are
+     *     calculated when the map resolution changes.
+     */
+    geoToleranceCache: null,
+    
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer.Vector>} The current editable layer.  Set at
+     *     construction or after construction with <setLayer>.
+     */
+    layer: null,
+    
+    /**
+     * Property: feature
+     * {<OpenLayers.Feature.Vector>} The current editable feature.
+     */
+    feature: null,
+    
+    /**
+     * Property: point
+     * {<OpenLayers.Geometry.Point>} The currently snapped vertex.
+     */
+    point: null,
+
+    /**
+     * Constructor: OpenLayers.Control.Snapping
+     * Creates a new snapping control. A control is constructed with an editable
+     *     layer and a set of configuration objects for target layers. While the
+     *     control is active, dragging vertices while drawing new features or
+     *     modifying existing features on the editable layer will engage
+     *     snapping to features on the target layers. Whether a vertex snaps to
+     *     a feature on a target layer depends on the target layer configuration.
+     *
+     * Parameters:
+     * options - {Object} An object containing all configuration properties for
+     *     the control.
+     *
+     * Valid options:
+     * layer - {OpenLayers.Layer.Vector} The editable layer.  Features from this
+     *     layer that are digitized or modified may have vertices snapped to
+     *     features from any of the target layers.
+     * targets - {Array(Object | OpenLayers.Layer.Vector)} A list of objects for
+     *     configuring target layers.  See valid properties of the target
+     *     objects below.  If the items in the targets list are vector layers
+     *     (instead of configuration objects), the defaults from the <defaults>
+     *     property will apply.  The editable layer itself may be a target
+     *     layer - allowing newly created or edited features to be snapped to
+     *     existing features from the same layer.  If no targets are provided
+     *     the layer given in the constructor (as <layer>) will become the
+     *     initial target.
+     * defaults - {Object} An object with default properties to be applied
+     *     to all target objects.
+     * greedy - {Boolean} Snap to closest feature in first target layer that
+     *     applies.  Default is true.  If false, all features in all target
+     *     layers will be checked and the closest feature in all target layers
+     *     will be chosen.  The greedy property determines if the order of the
+     *     target layers is significant.  By default, the order of the target
+     *     layers is significant where layers earlier in the target layer list
+     *     have precedence over layers later in the list.  Within a single
+     *     layer, the closest feature is always chosen for snapping.  This
+     *     property only determines whether the search for a closer feature
+     *     continues after an eligible feature is found in a target layer.
+     *
+     * Valid target properties:
+     * layer - {OpenLayers.Layer.Vector} A target layer.  Features from this
+     *     layer will be eligible to act as snapping target for the editable
+     *     layer.
+     * tolerance - {Float} The distance (in pixels) at which snapping may occur.
+     *     Default is 10.
+     * node - {Boolean} Snap to nodes (first or last point in a geometry) in
+     *     target layer.  Default is true.
+     * nodeTolerance - {Float} Optional distance at which snapping may occur
+     *     for nodes specifically.  If none is provided, <tolerance> will be
+     *     used.
+     * vertex - {Boolean} Snap to vertices in target layer.  Default is true.
+     * vertexTolerance - {Float} Optional distance at which snapping may occur
+     *     for vertices specifically.  If none is provided, <tolerance> will be
+     *     used.
+     * edge - {Boolean} Snap to edges in target layer.  Default is true.
+     * edgeTolerance - {Float} Optional distance at which snapping may occur
+     *     for edges specifically.  If none is provided, <tolerance> will be
+     *     used.
+     * filter - {OpenLayers.Filter} Optional filter to evaluate to determine if
+     *     feature is eligible for snapping.  If filter evaluates to true for a
+     *     target feature a vertex may be snapped to the feature. 
+     */
+    initialize: function(options) {
+        // concatenate events specific to measure with those from the base
+        Array.prototype.push.apply(
+            this.EVENT_TYPES, OpenLayers.Control.prototype.EVENT_TYPES
+        );
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        this.options = options || {}; // TODO: this could be done by the super
+        
+        // set the editable layer if provided
+        if(this.options.layer) {
+            this.setLayer(this.options.layer);
+        }
+        // configure target layers
+        var defaults = OpenLayers.Util.extend({}, this.options.defaults);
+        this.defaults = OpenLayers.Util.applyDefaults(defaults, this.DEFAULTS);
+        this.setTargets(this.options.targets);
+        if(this.targets.length === 0 && this.layer) {
+            this.addTargetLayer(this.layer);
+        }
+
+        this.geoToleranceCache = {};
+    },
+    
+    /**
+     * APIMethod: setLayer
+     * Set the editable layer.  Call the setLayer method if the editable layer
+     *     changes and the same control should be used on a new editable layer.
+     *     If the control is already active, it will be active after the new
+     *     layer is set.
+     *
+     * Parameters:
+     * layer - {OpenLayers.Layer.Vector}  The new editable layer.
+     */
+    setLayer: function(layer) {
+        if(this.active) {
+            this.deactivate();
+            this.layer = layer;
+            this.activate();
+        } else {
+            this.layer = layer;
+        }
+    },
+    
+    /**
+     * Method: setTargets
+     * Set the targets for the snapping agent.
+     *
+     * Parameters:
+     * targets - {Array} An array of target configs or target layers.
+     */
+    setTargets: function(targets) {
+        this.targets = [];
+        if(targets && targets.length) {
+            var target;
+            for(var i=0, len=targets.length; i<len; ++i) {
+                target = targets[i];
+                if(target instanceof OpenLayers.Layer.Vector) {
+                    this.addTargetLayer(target);
+                } else {
+                    this.addTarget(target);
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: addTargetLayer
+     * Add a target layer with the default target config.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer.Vector>} A target layer.
+     */
+    addTargetLayer: function(layer) {
+        this.addTarget({layer: layer});
+    },
+    
+    /**
+     * Method: addTarget
+     * Add a configured target layer.
+     *
+     * Parameters:
+     * target - {Object} A target config.
+     */
+    addTarget: function(target) {
+        target = OpenLayers.Util.applyDefaults(target, this.defaults);
+        target.nodeTolerance = target.nodeTolerance || target.tolerance;
+        target.vertexTolerance = target.vertexTolerance || target.tolerance;
+        target.edgeTolerance = target.edgeTolerance || target.tolerance;
+        this.targets.push(target);
+    },
+    
+    /**
+     * Method: removeTargetLayer
+     * Remove a target layer.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer.Vector>} The target layer to remove.
+     */
+    removeTargetLayer: function(layer) {
+        var target;
+        for(var i=this.targets.length-1; i>=0; --i) {
+            target = this.targets[i];
+            if(target.layer === layer) {
+                this.removeTarget(target);
+            }
+        }
+    },
+    
+    /**
+     * Method: removeTarget
+     * Remove a target.
+     *
+     * Parameters:
+     * target - {Object} A target config.
+     *
+     * Returns:
+     * {Array} The targets array.
+     */
+    removeTarget: function(target) {
+        return OpenLayers.Util.removeItem(this.targets, target);
+    },
+    
+    /**
+     * APIMethod: activate
+     * Activate the control.  Activating the control registers listeners for
+     *     editing related events so that during feature creation and
+     *     modification, moving vertices will trigger snapping.
+     */
+    activate: function() {
+        var activated = OpenLayers.Control.prototype.activate.call(this);
+        if(activated) {
+            if(this.layer && this.layer.events) {
+                this.layer.events.on({
+                    sketchstarted: this.onSketchModified,
+                    sketchmodified: this.onSketchModified,
+                    vertexmodified: this.onVertexModified,
+                    scope: this
+                });
+            }
+        }
+        return activated;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivate the control.  Deactivating the control unregisters listeners
+     *     so feature editing may proceed without engaging the snapping agent.
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Control.prototype.deactivate.call(this);
+        if(deactivated) {
+            if(this.layer && this.layer.events) {
+                this.layer.events.un({
+                    sketchstarted: this.onSketchModified,
+                    sketchmodified: this.onSketchModified,
+                    vertexmodified: this.onVertexModified,
+                    scope: this
+                });
+            }
+        }
+        this.feature = null;
+        this.point = null;
+        return deactivated;
+    },
+    
+    /**
+     * Method: onSketchModified
+     * Registered as a listener for the sketchmodified event on the editable
+     *     layer.
+     *
+     * Parameters:
+     * event - {Object} The sketch modified event.
+     */
+    onSketchModified: function(event) {
+        this.feature = event.feature;
+        this.considerSnapping(event.vertex, event.vertex);
+    },
+    
+    /**
+     * Method: onVertexModified
+     * Registered as a listener for the vertexmodified event on the editable
+     *     layer.
+     *
+     * Parameters:
+     * event - {Object} The vertex modified event.
+     */
+    onVertexModified: function(event) {
+        this.feature = event.feature;
+        var loc = this.layer.map.getLonLatFromViewPortPx(event.pixel);
+        this.considerSnapping(
+            event.vertex, new OpenLayers.Geometry.Point(loc.lon, loc.lat)
+        );
+    },
+
+    /**
+     * Method: considerSnapping
+     *
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point}} The vertex to be snapped (or
+     *     unsnapped).
+     * loc - {<OpenLayers.Geometry.Point>} The location of the mouse in map
+     *     coords.
+     */
+    considerSnapping: function(point, loc) {
+        var best = {
+            rank: Number.POSITIVE_INFINITY,
+            dist: Number.POSITIVE_INFINITY,
+            x: null, y: null
+        };
+        var snapped = false;
+        var result, target;
+        for(var i=0, len=this.targets.length; i<len; ++i) {
+            target = this.targets[i];
+            result = this.testTarget(target, loc);
+            if(result) {
+                if(this.greedy) {
+                    best = result;
+                    best.target = target; 
+                    snapped = true;
+                    break;
+                } else {
+                    if((result.rank < best.rank) ||
+                       (result.rank === best.rank && result.dist < best.dist)) {
+                        best = result;
+                        best.target = target;
+                        snapped = true;
+                    }
+                }
+            }
+        }
+        if(snapped) {
+            var proceed = this.events.triggerEvent("beforesnap", {
+                point: point, x: best.x, y: best.y, distance: best.dist,
+                layer: best.target.layer, snapType: this.precedence[best.rank]
+            });
+            if(proceed !== false) {
+                point.x = best.x;
+                point.y = best.y;
+                this.point = point;
+                this.events.triggerEvent("snap", {
+                    point: point,
+                    snapType: this.precedence[best.rank],
+                    layer: best.target.layer,
+                    distance: best.dist
+                });
+            } else {
+                snapped = false;
+            }
+        }
+        if(this.point && !snapped) {
+            point.x = loc.x;
+            point.y = loc.y;
+            this.point = null;
+            this.events.triggerEvent("unsnap", {point: point});
+        }
+    },
+    
+    /**
+     * Method: testTarget
+     *
+     * Parameters:
+     * target - {Object} Object with target layer configuration.
+     * loc - {<OpenLayers.Geometry.Point>} The location of the mouse in map
+     *     coords.
+     *
+     * Returns:
+     * {Object} A result object with rank, dist, x, and y properties.
+     *     Returns null if candidate is not eligible for snapping.
+     */
+    testTarget: function(target, loc) {
+        var tolerance = {
+            node: this.getGeoTolerance(target.nodeTolerance),
+            vertex: this.getGeoTolerance(target.vertexTolerance),
+            edge: this.getGeoTolerance(target.edgeTolerance)
+        };
+        // this could be cached if we don't support setting tolerance values directly
+        var maxTolerance = Math.max(
+            tolerance.node, tolerance.vertex, tolerance.edge
+        );
+        var result = {
+            rank: Number.POSITIVE_INFINITY, dist: Number.POSITIVE_INFINITY
+        };
+        var eligible = false;
+        var features = target.layer.features;
+        var feature, type, vertices, vertex, closest, dist, found;
+        var numTypes = this.precedence.length;
+        var ll = new OpenLayers.LonLat(loc.x, loc.y);
+        for(var i=0, len=features.length; i<len; ++i) {
+            feature = features[i];
+            if(feature !== this.feature && !feature._sketch &&
+               feature.state !== OpenLayers.State.DELETE &&
+               (!target.filter || target.filter.evaluate(feature.attributes))) {
+                if(feature.atPoint(ll, maxTolerance, maxTolerance)) {
+                    for(var j=0, stop=Math.min(result.rank+1, numTypes); j<stop; ++j) {
+                        type = this.precedence[j];
+                        if(target[type]) {
+                            if(type === "edge") {
+                                closest = feature.geometry.distanceTo(loc, {details: true});
+                                dist = closest.distance;
+                                if(dist <= tolerance[type] && dist < result.dist) {
+                                    result = {
+                                        rank: j, dist: dist,
+                                        x: closest.x0, y: closest.y0 // closest coords on feature
+                                    };
+                                    eligible = true;
+                                    // don't look for lower precedence types for this feature
+                                    break;
+                                }
+                            } else {
+                                // look for nodes or vertices
+                                vertices = feature.geometry.getVertices(type === "node");
+                                found = false;
+                                for(var k=0, klen=vertices.length; k<klen; ++k) {
+                                    vertex = vertices[k];
+                                    dist = vertex.distanceTo(loc);
+                                    if(dist <= tolerance[type] &&
+                                       (j < result.rank || (j === result.rank && dist < result.dist))) {
+                                        result = {
+                                            rank: j, dist: dist,
+                                            x: vertex.x, y: vertex.y
+                                        };
+                                        eligible = true;
+                                        found = true;
+                                    }
+                                }
+                                if(found) {
+                                    // don't look for lower precedence types for this feature
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return eligible ? result : null;
+    },
+    
+    /**
+     * Method: getGeoTolerance
+     * Calculate a tolerance in map units given a tolerance in pixels.  This
+     *     takes advantage of the <geoToleranceCache> when the map resolution
+     *     has not changed.
+     *     
+     * Parameters:
+     * tolerance - {Number} A tolerance value in pixels.
+     *
+     * Returns:
+     * {Number} A tolerance value in map units.
+     */
+    getGeoTolerance: function(tolerance) {
+        var resolution = this.layer.map.getResolution();
+        if(resolution !== this.resolution) {
+            this.resolution = resolution;
+            this.geoToleranceCache = {};
+        }
+        var geoTolerance = this.geoToleranceCache[tolerance];
+        if(geoTolerance === undefined) {
+            geoTolerance = tolerance * resolution;
+            this.geoToleranceCache[tolerance] = geoTolerance;
+        }
+        return geoTolerance;
+    },
+    
+    /**
+     * Method: destroy
+     * Clean up the control.
+     */
+    destroy: function() {
+        if(this.active) {
+            this.deactivate(); // TODO: this should be handled by the super
+        }
+        delete this.layer;
+        delete this.targets;
+        OpenLayers.Control.prototype.destroy.call(this);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.Snapping"
+});
diff --git a/lib/OpenLayers/Control/Split.js b/lib/OpenLayers/Control/Split.js
new file mode 100644
index 0000000..6750651
--- /dev/null
+++ b/lib/OpenLayers/Control/Split.js
@@ -0,0 +1,498 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Handler/Path.js
+ * @requires OpenLayers/Layer/Vector.js
+ */
+
+/**
+ * Class: OpenLayers.Control.Split
+ * Acts as a split feature agent while editing vector features.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.Split = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * control.events.register(type, obj, listener);
+     * (end)
+     *
+     * Listeners will be called with a reference to an event object.  The
+     *     properties of this event depends on exactly what happened.
+     *
+     * Supported control event types (in addition to those from <OpenLayers.Control>):
+     * beforesplit - Triggered before a split occurs.  Listeners receive an
+     *     event object with *source* and *target* properties.
+     * split - Triggered when a split occurs.  Listeners receive an event with
+     *     an *original* property and a *features* property.  The original
+     *     is a reference to the target feature that the sketch or modified
+     *     feature intersects.  The features property is a list of all features
+     *     that result from this single split.  This event is triggered before
+     *     the resulting features are added to the layer (while the layer still
+     *     has a reference to the original).
+     * aftersplit - Triggered after all splits resulting from a single sketch
+     *     or feature modification have occurred.  The original features
+     *     have been destroyed and features that result from the split
+     *     have already been added to the layer.  Listeners receive an event
+     *     with a *source* and *features* property.  The source references the
+     *     sketch or modified feature used as a splitter.  The features
+     *     property is a list of all resulting features.
+     */
+    EVENT_TYPES: ["beforesplit", "split", "aftersplit"],
+    
+    /**
+     * APIProperty: layer
+     * {<OpenLayers.Layer.Vector>} The target layer with features to be split.
+     *     Set at construction or after construction with <setLayer>.
+     */
+    layer: null,
+    
+    /**
+     * Property: source
+     * {<OpenLayers.Layer.Vector>} Optional source layer.  Any newly created
+     *     or modified features from this layer will be used to split features
+     *     on the target layer.  If not provided, a temporary sketch layer will
+     *     be created.
+     */
+    source: null,
+    
+    /**
+     * Property: sourceOptions
+     * {Options} If a temporary sketch layer is created, these layer options
+     *     will be applied.
+     */
+    sourceOptions: null,
+
+    /**
+     * APIProperty: tolerance
+     * {Number} Distance between the calculated intersection and a vertex on
+     *     the source geometry below which the existing vertex will be used
+     *     for the split.  Default is null.
+     */
+    tolerance: null,
+    
+    /**
+     * APIProperty: edge
+     * {Boolean} Allow splits given intersection of edges only.  Default is
+     *     true.  If false, a vertex on the source must be within the
+     *     <tolerance> distance of the calculated intersection for a split
+     *     to occur.
+     */
+    edge: true,
+    
+    /**
+     * APIProperty: deferDelete
+     * {Boolean} Instead of removing features from the layer, set feature
+     *     states of split features to DELETE.  This assumes a save strategy
+     *     or other component is in charge of removing features from the
+     *     layer.  Default is false.  If false, split features will be
+     *     immediately deleted from the layer.
+     */
+    deferDelete: false,
+    
+    /**
+     * APIProperty: mutual
+     * {Boolean} If source and target layers are the same, split source
+     *     features and target features where they intersect.  Default is
+     *     true.  If false, only target features will be split.
+     */
+    mutual: true,
+    
+    /**
+     * APIProperty: targetFilter
+     * {OpenLayers.Filter} Optional filter that will be evaluated
+     *     to determine if a feature from the target layer is eligible for
+     *     splitting.
+     */
+    targetFilter: null,
+    
+    /**
+     * APIProperty: sourceFilter
+     * {OpenLayers.Filter} Optional filter that will be evaluated
+     *     to determine if a feature from the target layer is eligible for
+     *     splitting.
+     */
+    sourceFilter: null,
+    
+    /**
+     * Property: handler
+     * {<OpenLayers.Handler.Path>} The temporary sketch handler created if
+     *     no source layer is provided.
+     */
+    handler: null,
+
+    /**
+     * Constructor: OpenLayers.Control.Split
+     * Creates a new split control. A control is constructed with a target
+     *     layer and an optional source layer. While the control is active,
+     *     creating new features or modifying existing features on the source
+     *     layer will result in splitting any eligible features on the target
+     *     layer.  If no source layer is provided, a temporary sketch layer will
+     *     be created to create lines for splitting features on the target.
+     *
+     * Parameters:
+     * options - {Object} An object containing all configuration properties for
+     *     the control.
+     *
+     * Valid options:
+     * layer - {OpenLayers.Layer.Vector} The target layer.  Features from this
+     *     layer will be split by new or modified features on the source layer
+     *     or temporary sketch layer.
+     * source - {OpenLayers.Layer.Vector} Optional source layer.  If provided
+     *     newly created features or modified features will be used to split
+     *     features on the target layer.  If not provided, a temporary sketch
+     *     layer will be created for drawing lines.
+     * tolerance - {Number} Optional value for the distance between a source
+     *     vertex and the calculated intersection below which the split will
+     *     occur at the vertex.
+     * edge - {Boolean} Allow splits given intersection of edges only.  Default
+     *     is true.  If false, a vertex on the source must be within the
+     *     <tolerance> distance of the calculated intersection for a split
+     *     to occur.
+     * mutual - {Boolean} If source and target are the same, split source
+     *     features and target features where they intersect.  Default is
+     *     true.  If false, only target features will be split.
+     * targetFilter - {OpenLayers.Filter} Optional filter that will be evaluated
+     *     to determine if a feature from the target layer is eligible for
+     *     splitting.
+     * sourceFilter - {OpenLayers.Filter} Optional filter that will be evaluated
+     *     to determine if a feature from the target layer is eligible for
+     *     splitting.
+     */
+    initialize: function(options) {
+        // concatenate events specific to measure with those from the base
+        Array.prototype.push.apply(
+            this.EVENT_TYPES, OpenLayers.Control.prototype.EVENT_TYPES
+        );
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        this.options = options || {}; // TODO: this could be done by the super
+        
+        // set the source layer if provided
+        if(this.options.source) {
+            this.setSource(this.options.source);
+        }
+    },
+    
+    /**
+     * APIMethod: setSource
+     * Set the source layer for edits layer.
+     *
+     * Parameters:
+     * layer - {OpenLayers.Layer.Vector}  The new source layer layer.  If
+     *     null, a temporary sketch layer will be created.
+     */
+    setSource: function(layer) {
+        if(this.active) {
+            this.deactivate();
+            if(this.handler) {
+                this.handler.destroy();
+                delete this.handler;
+            }
+            this.source = layer;
+            this.activate();
+        } else {
+            this.source = layer;
+        }
+    },
+    
+    /**
+     * APIMethod: activate
+     * Activate the control.  Activating the control registers listeners for
+     *     editing related events so that during feature creation and
+     *     modification, features in the target will be considered for
+     *     splitting.
+     */
+    activate: function() {
+        var activated = OpenLayers.Control.prototype.activate.call(this);
+        if(activated) {
+            if(!this.source) {
+                if(!this.handler) {
+                    this.handler = new OpenLayers.Handler.Path(this,
+                        {done: function(geometry) {
+                            this.onSketchComplete({
+                                feature: new OpenLayers.Feature.Vector(geometry)
+                            });
+                        }},
+                        {layerOptions: this.sourceOptions}
+                    );
+                }
+                this.handler.activate();
+            } else if(this.source.events) {
+                this.source.events.on({
+                    sketchcomplete: this.onSketchComplete,
+                    afterfeaturemodified: this.afterFeatureModified,
+                    scope: this
+                });
+            }
+        }
+        return activated;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivate the control.  Deactivating the control unregisters listeners
+     *     so feature editing may proceed without engaging the split agent.
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Control.prototype.deactivate.call(this);
+        if(deactivated) {
+            if(this.source && this.source.events) {
+                this.layer.events.un({
+                    sketchcomplete: this.onSketchComplete,
+                    afterfeaturemodified: this.afterFeatureModified,
+                    scope: this
+                });
+            }
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: onSketchComplete
+     * Registered as a listener for the sketchcomplete event on the editable
+     *     layer.
+     *
+     * Parameters:
+     * event - {Object} The sketch complete event.
+     *
+     * Returns:
+     * {Boolean} Stop the sketch from being added to the layer (it has been
+     *     split).
+     */
+    onSketchComplete: function(event) {
+        this.feature = null;
+        return !this.considerSplit(event.feature);
+    },
+    
+    /**
+     * Method: afterFeatureModified
+     * Registered as a listener for the afterfeaturemodified event on the
+     *     editable layer.
+     *
+     * Parameters:
+     * event - {Object} The after feature modified event.
+     */
+    afterFeatureModified: function(event) {
+        if(event.modified) {
+            var feature = event.feature;
+            if(feature.geometry instanceof OpenLayers.Geometry.LineString ||
+               feature.geometry instanceof OpenLayers.Geometry.MultiLineString) {
+                this.feature = event.feature;
+                this.considerSplit(event.feature);
+            }
+        }
+    },
+    
+    /**
+     * Method: removeByGeometry
+     * Remove a feature from a list based on the given geometry.
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>} A list of features.
+     * geometry - {<OpenLayers.Geometry>} A geometry.
+     */
+    removeByGeometry: function(features, geometry) {
+        for(var i=0, len=features.length; i<len; ++i) {
+            if(features[i].geometry === geometry) {
+                features.splice(i, 1);
+                break;
+            }
+        }
+    },
+    
+    /**
+     * Method: isEligible
+     * Test if a target feature is eligible for splitting.
+     *
+     * Parameters:
+     * target - {<OpenLayers.Feature.Vector>} The target feature.
+     *
+     * Returns:
+     * {Boolean} The target is eligible for splitting.
+     */
+    isEligible: function(target) {
+        return (
+            target.state !== OpenLayers.State.DELETE
+        ) && (
+            target.geometry instanceof OpenLayers.Geometry.LineString ||
+            target.geometry instanceof OpenLayers.Geometry.MultiLineString
+        ) && (
+            this.feature !== target
+        ) && (
+            !this.targetFilter ||
+            this.targetFilter.evaluate(target.attributes)
+        );
+    },
+
+    /**
+     * Method: considerSplit
+     * Decide whether or not to split target features with the supplied
+     *     feature.  If <mutual> is true, both the source and target features
+     *     will be split if eligible.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector}} The newly created or modified
+     *     feature.
+     *
+     * Returns:
+     * {Boolean} The supplied feature was split (and destroyed).
+     */
+    considerSplit: function(feature) {
+        var sourceSplit = false;
+        var targetSplit = false;
+        if(!this.sourceFilter ||
+           this.sourceFilter.evaluate(feature.attributes)) {
+            var features = this.layer && this.layer.features || [];
+            var target, results, proceed;
+            var additions = [], removals = [];
+            var mutual = (this.layer === this.source) && this.mutual;
+            var options = {
+                edge: this.edge,
+                tolerance: this.tolerance,
+                mutual: mutual
+            };
+            var sourceParts = [feature.geometry];
+            var targetFeature, targetParts;
+            var source, parts;
+            for(var i=0, len=features.length; i<len; ++i) {
+                targetFeature = features[i];
+                if(this.isEligible(targetFeature)) {
+                    targetParts = [targetFeature.geometry];
+                    // work through source geoms - this array may change
+                    for(var j=0; j<sourceParts.length; ++j) { 
+                        source = sourceParts[j];
+                        // work through target parts - this array may change
+                        for(var k=0; k<targetParts.length; ++k) {
+                            target = targetParts[k];
+                            if(source.getBounds().intersectsBounds(target.getBounds())) {
+                                results = source.split(target, options);
+                                if(results) {
+                                    proceed = this.events.triggerEvent(
+                                        "beforesplit", {source: feature, target: targetFeature}
+                                    );
+                                    if(proceed !== false) {
+                                        if(mutual) {
+                                            parts = results[0];
+                                            // handle parts that result from source splitting
+                                            if(parts.length > 1) {
+                                                // splice in new source parts
+                                                parts.unshift(j, 1); // add args for splice below
+                                                Array.prototype.splice.apply(sourceParts, parts);
+                                                j += parts.length - 3;
+                                            }
+                                            results = results[1];
+                                        }
+                                        // handle parts that result from target splitting
+                                        if(results.length > 1) {
+                                            // splice in new target parts
+                                            results.unshift(k, 1); // add args for splice below
+                                            Array.prototype.splice.apply(targetParts, results);
+                                            k += results.length - 3;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    if(targetParts && targetParts.length > 1) {
+                        this.geomsToFeatures(targetFeature, targetParts);
+                        this.events.triggerEvent("split", {
+                            original: targetFeature,
+                            features: targetParts
+                        });
+                        Array.prototype.push.apply(additions, targetParts);
+                        removals.push(targetFeature);
+                        targetSplit = true;
+                    }
+                }
+            }
+            if(sourceParts && sourceParts.length > 1) {
+                this.geomsToFeatures(feature, sourceParts);
+                this.events.triggerEvent("split", {
+                    original: feature,
+                    features: sourceParts
+                });
+                Array.prototype.push.apply(additions, sourceParts);
+                removals.push(feature);
+                sourceSplit = true;
+            }
+            if(sourceSplit || targetSplit) {
+                // remove and add feature events are suppressed
+                // listen for split event on this control instead
+                if(this.deferDelete) {
+                    // Set state instead of removing.  Take care to avoid
+                    // setting delete for features that have not yet been
+                    // inserted - those should be destroyed immediately.
+                    var feat, destroys = [];
+                    for(var i=0, len=removals.length; i<len; ++i) {
+                        feat = removals[i];
+                        if(feat.state === OpenLayers.State.INSERT) {
+                            destroys.push(feat);
+                        } else {
+                            feat.state = OpenLayers.State.DELETE;
+                            this.layer.drawFeature(feat);
+                        }
+                    }
+                    this.layer.destroyFeatures(destroys, {silent: true});
+                    for(var i=0, len=additions.length; i<len; ++i) {
+                        additions[i].state = OpenLayers.State.INSERT;
+                    }
+                } else {
+                    this.layer.destroyFeatures(removals, {silent: true});
+                }
+                this.layer.addFeatures(additions, {silent: true});
+                this.events.triggerEvent("aftersplit", {
+                    source: feature,
+                    features: additions
+                });
+            }
+        }
+        return sourceSplit;
+    },
+    
+    /**
+     * Method: geomsToFeatures
+     * Create new features given a template feature and a list of geometries.
+     *     The list of geometries is modified in place.  The result will be
+     *     a list of new features.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The feature to be cloned.
+     * geoms - {Array(<OpenLayers.Geometry>)} List of goemetries.  This will
+     *     become a list of new features.
+     */
+    geomsToFeatures: function(feature, geoms) {
+        var clone = feature.clone();
+        delete clone.geometry;
+        var newFeature;
+        for(var i=0, len=geoms.length; i<len; ++i) {
+            // turn results list from geoms to features
+            newFeature = clone.clone();
+            newFeature.geometry = geoms[i];
+            newFeature.state = OpenLayers.State.INSERT;
+            geoms[i] = newFeature;
+        }
+    },
+    
+    /**
+     * Method: destroy
+     * Clean up the control.
+     */
+    destroy: function() {
+        if(this.active) {
+            this.deactivate(); // TODO: this should be handled by the super
+        }
+        OpenLayers.Control.prototype.destroy.call(this);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.Split"
+});
diff --git a/lib/OpenLayers/Control/TransformFeature.js b/lib/OpenLayers/Control/TransformFeature.js
new file mode 100644
index 0000000..f5a55ac
--- /dev/null
+++ b/lib/OpenLayers/Control/TransformFeature.js
@@ -0,0 +1,579 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Control/DragFeature.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Geometry/LineString.js
+ * @requires OpenLayers/Geometry/Point.js
+ */
+
+/**
+ * Class: OpenLayers.Control.TransformFeature
+ * Control to transform features with a standard transformation box.
+ *
+ * Inherits From:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.TransformFeature = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Constant: EVENT_TYPES
+     *
+     * Supported event types:
+     *  - *beforesetfeature* Triggered before a feature is set for
+     *      tranformation. The feature will not be set if a listener returns
+     *      false. Listeners receive a *feature* property, with the feature
+     *      that will be set for transformation. Listeners are allowed to
+     *      set the control's *scale*, *ratio* and *rotation* properties,
+     *      which will set the initial scale, ratio and rotation of the
+     *      feature, like the <setFeature> method's initialParams argument.
+     *  - *setfeature* Triggered when a feature is set for tranformation.
+     *      Listeners receive a *feature* property, with the feature that
+     *      is now set for transformation.
+     *  - *beforetransform* Triggered while dragging, before a feature is
+     *      transformed. The feature will not be transformed if a listener
+     *      returns false (but the box still will). Listeners receive one or
+     *      more of *center*, *scale*, *ratio* and *rotation*. The *center*
+     *      property is an <OpenLayers.Geometry.Point> object with the new
+     *      center of the transformed feature, the others are Floats with the
+     *      scale, ratio or rotation change since the last transformation.
+     *  - *transform* Triggered while dragging, when a feature is transformed.
+     *      Listeners receive an event object with one or more of *center*,
+     *      *scale*, *ratio* and *rotation*. The *center* property is an
+     *      <OpenLayers.Geometry.Point> object with the new center of the
+     *      transformed feature, the others are Floats with the scale, ratio
+     *      or rotation change of the feature since the last transformation.
+     *  - *transformcomplete* Triggered after dragging. Listeners receive
+     *      an event object with the transformed *feature*.
+     */
+    EVENT_TYPES: ["beforesetfeature", "setfeature", "beforetransform",
+        "transform", "transformcomplete"],
+
+    /**
+     * APIProperty: geometryTypes
+     * {Array(String)} To restrict transformation to a limited set of geometry
+     *     types, send a list of strings corresponding to the geometry class
+     *     names.
+     */
+    geometryTypes: null,
+
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer.Vector>}
+     */
+    layer: null,
+    
+    /**
+     * APIProperty: preserveAspectRatio
+     * {Boolean} set to true to not change the feature's aspect ratio.
+     */
+    preserveAspectRatio: false,
+    
+    /**
+     * APIProperty: rotate
+     * {Boolean} set to false if rotation should be disabled. Default is true.
+     *     To be passed with the constructor or set when the control is not
+     *     active.
+     */
+    rotate: true,
+    
+    /**
+     * APIProperty: feature
+     * {<OpenLayers.Feature.Vector>} Feature currently available for
+     *     transformation. Read-only, use <setFeature> to set it manually.
+     */
+    feature: null,
+    
+    /**
+     * APIProperty: renderIntent
+     * {String|Object} Render intent for the transformation box and
+     *     handles. A symbolizer object can also be provided here.
+     */
+    renderIntent: "temporary",
+    
+    /**
+     * APIProperty: rotationHandleSymbolizer
+     * {Object|String} Optional. A custom symbolizer for the rotation handles.
+     *     A render intent can also be provided here. Defaults to
+     *     (code)
+     *     {
+     *         stroke: false,
+     *         pointRadius: 10,
+     *         fillOpacity: 0,
+     *         cursor: "pointer"
+     *     }
+     *     (end)
+     */
+    rotationHandleSymbolizer: null,
+    
+    /**
+     * APIProperty: box
+     * {<OpenLayers.Feature.Vector>} The transformation box rectangle.
+     *     Read-only.
+     */
+    box: null,
+    
+    /**
+     * APIProperty: center
+     * {<OpenLayers.Geometry.Point>} The center of the feature bounds.
+     * Read-only.
+     */
+    center: null,
+    
+    /**
+     * APIProperty: scale
+     * {Float} The scale of the feature, relative to the scale the time the
+     *     feature was set. Read-only, except for *beforesetfeature*
+     *     listeners.
+     */
+    scale: 1,
+    
+    /**
+     * APIProperty: ratio
+     * {Float} The ratio of the feature relative to the ratio the time the
+     *     feature was set. Read-only, except for *beforesetfeature*
+     *     listeners.
+     */
+    ratio: 1,
+    
+    /**
+     * Property: rotation
+     * {Integer} the current rotation angle of the box. Read-only, except for
+     *     *beforesetfeature* listeners.
+     */
+    rotation: 0,
+    
+    /**
+     * APIProperty: handles
+     * {Array(<OpenLayers.Feature.Vector>)} The 8 handles currently available
+     *     for scaling/resizing. Numbered counterclockwise, starting from the
+     *     southwest corner. Read-only.
+     */
+    handles: null,
+    
+    /**
+     * APIProperty: rotationHandles
+     * {Array(<OpenLayers.Feature.Vector>)} The 4 rotation handles currently
+     *     available for rotating. Numbered counterclockwise, starting from
+     *     the southwest corner. Read-only.
+     */
+    rotationHandles: null,
+    
+    /**
+     * Property: dragControl
+     * {<OpenLayers.Control.DragFeature>}
+     */
+    dragControl: null,
+    
+    /**
+     * Constructor: OpenLayers.Control.TransformFeature
+     * Create a new transform feature control.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer.Vector>} Layer that contains features that
+     *     will be transformed.
+     * options - {Object} Optional object whose properties will be set on the
+     *     control.
+     */
+    initialize: function(layer, options) {
+        // concatenate events specific to this control with those from the base
+        this.EVENT_TYPES =
+            OpenLayers.Control.TransformFeature.prototype.EVENT_TYPES.concat(
+            OpenLayers.Control.prototype.EVENT_TYPES
+        );
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+
+        this.layer = layer;
+
+        if(!this.rotationHandleSymbolizer) {
+            this.rotationHandleSymbolizer = {
+                stroke: false,
+                pointRadius: 10,
+                fillOpacity: 0,
+                cursor: "pointer"
+            };
+        }
+
+        this.createBox();
+        this.createControl();        
+    },
+    
+    /**
+     * APIMethod: activate
+     * Activates the control.
+     */
+    activate: function() {
+        var activated = false;
+        if(OpenLayers.Control.prototype.activate.apply(this, arguments)) {
+            this.dragControl.activate();
+            this.layer.addFeatures([this.box]);
+            this.rotate && this.layer.addFeatures(this.rotationHandles);
+            this.layer.addFeatures(this.handles);        
+            activated = true;
+        }
+        return activated;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivates the control.
+     */
+    deactivate: function() {
+        var deactivated = false;
+        if(OpenLayers.Control.prototype.deactivate.apply(this, arguments)) {
+            this.layer.removeFeatures(this.handles);
+            this.rotate && this.layer.removeFeatures(this.rotationHandles);
+            this.layer.removeFeatures([this.box]);
+            this.dragControl.deactivate();
+            deactivated = true;
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: setMap
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    setMap: function(map) {
+        this.dragControl.setMap(map);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: setFeature
+     * Place the transformation box on a feature and start transforming it.
+     * If the control is not active, it will be activated.
+     * 
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     * initialParams - {Object} Initial values for rotation, scale or ratio.
+     *     Setting a rotation value here will cause the transformation box to
+     *     start rotated. Setting a scale or ratio will not affect the
+     *     transormation box, but applications may use this to keep track of
+     *     scale and ratio of a feature across multiple transforms.
+     */
+    setFeature: function(feature, initialParams) {
+        initialParams = OpenLayers.Util.applyDefaults(initialParams, {
+            rotation: 0,
+            scale: 1,
+            ratio: 1
+        });
+        var evt = {feature: feature};
+        
+        var oldRotation = this.rotation;
+        var oldCenter = this.center;
+        OpenLayers.Util.extend(this, initialParams);
+
+        if(this.events.triggerEvent("beforesetfeature", evt) === false) {
+            return;
+        }
+
+        this.feature = feature;
+        this.activate();
+
+        this._setfeature = true;
+
+        var featureBounds = this.feature.geometry.getBounds();
+        this.box.move(featureBounds.getCenterLonLat());
+        this.box.geometry.rotate(-oldRotation, oldCenter);
+        this._angle = 0;
+
+        var ll;
+        if(this.rotation) {
+            var geom = feature.geometry.clone();
+            geom.rotate(-this.rotation, this.center);
+            var box = new OpenLayers.Feature.Vector(
+                geom.getBounds().toGeometry());
+            box.geometry.rotate(this.rotation, this.center);
+            this.box.geometry.rotate(this.rotation, this.center);
+            this.box.move(box.geometry.getBounds().getCenterLonLat());
+            var llGeom = box.geometry.components[0].components[0];
+            ll = llGeom.getBounds().getCenterLonLat();
+        } else {
+            ll = new OpenLayers.LonLat(featureBounds.left, featureBounds.bottom);
+        }
+        this.handles[0].move(ll);
+        
+        delete this._setfeature;
+
+        this.events.triggerEvent("setfeature", evt);
+    },
+    
+    /**
+     * Method: createBox
+     * Creates the box with all handles and transformation handles.
+     */
+    createBox: function() {
+        var control = this;
+        
+        this.center = new OpenLayers.Geometry.Point(0, 0);
+        var box = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.LineString([
+                new OpenLayers.Geometry.Point(-1, -1),
+                new OpenLayers.Geometry.Point(0, -1),
+                new OpenLayers.Geometry.Point(1, -1),
+                new OpenLayers.Geometry.Point(1, 0),
+                new OpenLayers.Geometry.Point(1, 1),
+                new OpenLayers.Geometry.Point(0, 1),
+                new OpenLayers.Geometry.Point(-1, 1),
+                new OpenLayers.Geometry.Point(-1, 0),
+                new OpenLayers.Geometry.Point(-1, -1)
+            ]), null,
+            typeof this.renderIntent == "string" ? null : this.renderIntent
+        );
+        
+        // Override for box move - make sure that the center gets updated
+        box.geometry.move = function(x, y) {
+            control._moving = true;
+            OpenLayers.Geometry.LineString.prototype.move.apply(this, arguments);
+            control.center.move(x, y);
+            delete control._moving;
+        };
+
+        // Overrides for vertex move, resize and rotate - make sure that
+        // handle and rotationHandle geometries are also moved, resized and
+        // rotated.
+        var vertexMoveFn = function(x, y) {
+            OpenLayers.Geometry.Point.prototype.move.apply(this, arguments);
+            this._rotationHandle && this._rotationHandle.geometry.move(x, y);
+            this._handle.geometry.move(x, y);
+        };
+        var vertexResizeFn = function(scale, center, ratio) {
+            OpenLayers.Geometry.Point.prototype.resize.apply(this, arguments);
+            this._rotationHandle && this._rotationHandle.geometry.resize(
+                scale, center, ratio);
+            this._handle.geometry.resize(scale, center, ratio);
+        };
+        var vertexRotateFn = function(angle, center) {
+            OpenLayers.Geometry.Point.prototype.rotate.apply(this, arguments);
+            this._rotationHandle && this._rotationHandle.geometry.rotate(
+                angle, center);
+            this._handle.geometry.rotate(angle, center);
+        };
+        
+        // Override for handle move - make sure that the box and other handles
+        // are updated, and finally transform the feature.
+        var handleMoveFn = function(x, y) {
+            var oldX = this.x, oldY = this.y;
+            OpenLayers.Geometry.Point.prototype.move.call(this, x, y);
+            if(control._moving) {
+                return;
+            }
+            var evt = control.dragControl.handlers.drag.evt;
+            var preserveAspectRatio = !control._setfeature &&
+                control.preserveAspectRatio;
+            var reshape = !preserveAspectRatio && !(evt && evt.shiftKey);
+            var oldGeom = new OpenLayers.Geometry.Point(oldX, oldY);
+            var centerGeometry = control.center;
+            this.rotate(-control.rotation, centerGeometry);
+            oldGeom.rotate(-control.rotation, centerGeometry);
+            var dx1 = this.x - centerGeometry.x;
+            var dy1 = this.y - centerGeometry.y;
+            var dx0 = dx1 - (this.x - oldGeom.x);
+            var dy0 = dy1 - (this.y - oldGeom.y);
+            this.x = oldX;
+            this.y = oldY;
+            var scale, ratio = 1;
+            if (reshape) {
+                scale = Math.abs(dy0) < 0.00001 ? 1 : dy1 / dy0;
+                ratio = (Math.abs(dx0) < 0.00001 ? 1 : (dx1 / dx0)) / scale;
+            } else {
+                var l0 = Math.sqrt((dx0 * dx0) + (dy0 * dy0));
+                var l1 = Math.sqrt((dx1 * dx1) + (dy1 * dy1));
+                scale = l1 / l0;
+            }
+
+            // rotate the box to 0 before resizing - saves us some
+            // calculations and is inexpensive because we don't drawFeature.
+            control._moving = true;
+            control.box.geometry.rotate(-control.rotation, centerGeometry);
+            delete control._moving;
+
+            control.box.geometry.resize(scale, centerGeometry, ratio);
+            control.box.geometry.rotate(control.rotation, centerGeometry);
+            control.transformFeature({scale: scale, ratio: ratio});
+        };
+        
+        // Override for rotation handle move - make sure that the box and
+        // other handles are updated, and finally transform the feature.
+        var rotationHandleMoveFn = function(x, y){
+            var oldX = this.x, oldY = this.y;
+            OpenLayers.Geometry.Point.prototype.move.call(this, x, y);
+            if(control._moving) {
+                return;
+            }
+            var evt = control.dragControl.handlers.drag.evt;
+            var constrain = (evt && evt.shiftKey) ? 45 : 1;
+            var centerGeometry = control.center;
+            var dx1 = this.x - centerGeometry.x;
+            var dy1 = this.y - centerGeometry.y;
+            var dx0 = dx1 - x;
+            var dy0 = dy1 - y;
+            this.x = oldX;
+            this.y = oldY;
+            var a0 = Math.atan2(dy0, dx0);
+            var a1 = Math.atan2(dy1, dx1);
+            var angle = a1 - a0;
+            angle *= 180 / Math.PI;
+            control._angle = (control._angle + angle) % 360;
+            var diff = control.rotation % constrain;
+            if(Math.abs(control._angle) >= constrain || diff !== 0) {
+                angle = Math.round(control._angle / constrain) * constrain -
+                    diff;
+                control._angle = 0;
+                control.box.geometry.rotate(angle, centerGeometry);
+                control.transformFeature({rotation: angle});
+            } 
+        };
+
+        var handles = new Array(8);
+        var rotationHandles = new Array(4);
+        var geom, handle, rotationHandle;
+        for(var i=0; i<8; ++i) {
+            geom = box.geometry.components[i];
+            handle = new OpenLayers.Feature.Vector(geom.clone(), null,
+                typeof this.renderIntent == "string" ? null :
+                this.renderIntent);
+            if(i % 2 == 0) {
+                rotationHandle = new OpenLayers.Feature.Vector(geom.clone(),
+                    null, typeof this.rotationHandleSymbolizer == "string" ?
+                    null : this.rotationHandleSymbolizer);
+                rotationHandle.geometry.move = rotationHandleMoveFn;
+                geom._rotationHandle = rotationHandle;
+                rotationHandles[i/2] = rotationHandle;
+            }
+            geom.move = vertexMoveFn;
+            geom.resize = vertexResizeFn;
+            geom.rotate = vertexRotateFn;
+            handle.geometry.move = handleMoveFn;
+            geom._handle = handle;
+            handles[i] = handle;
+        }
+        
+        this.box = box;
+        this.rotationHandles = rotationHandles;
+        this.handles = handles;
+    },
+    
+    /**
+     * Method: createControl
+     * Creates a DragFeature control for this control.
+     */
+    createControl: function() {
+        var control = this;
+        this.dragControl = new OpenLayers.Control.DragFeature(this.layer, {
+            documentDrag: true,
+            // avoid moving the feature itself - move the box instead
+            moveFeature: function(pixel) {
+                if(this.feature === control.feature) {
+                    this.feature = control.box;
+                }
+                OpenLayers.Control.DragFeature.prototype.moveFeature.apply(this,
+                    arguments);
+            },
+            // transform while dragging
+            onDrag: function(feature, pixel) {
+                if(feature === control.box) {
+                    control.transformFeature({center: control.center});
+                    control.drawHandles();
+                }
+            },
+            // set a new feature
+            onStart: function(feature, pixel) {
+                var eligible = !control.geometryTypes ||
+                    OpenLayers.Util.indexOf(control.geometryTypes,
+                        feature.geometry.CLASS_NAME) !== -1;
+                var i = OpenLayers.Util.indexOf(control.handles, feature);
+                i += OpenLayers.Util.indexOf(control.rotationHandles,
+                    feature);
+                if(feature !== control.feature && feature !== control.box &&
+                                                        i == -2 && eligible) {
+                    control.setFeature(feature);
+                }
+            },
+            onComplete: function(feature, pixel) {
+                control.events.triggerEvent("transformcomplete",
+                    {feature: control.feature});
+            }
+        });
+    },
+    
+    /**
+     * Method: drawHandles
+     * Draws the handles to match the box.
+     */
+    drawHandles: function() {
+        var layer = this.layer;
+        for(var i=0; i<8; ++i) {
+            if(this.rotate && i % 2 === 0) {
+                layer.drawFeature(this.rotationHandles[i/2],
+                    this.rotationHandleSymbolizer);
+            }
+            layer.drawFeature(this.handles[i], this.renderIntent);
+        }
+    },
+    
+    /**
+     * Method: transformFeature
+     * Transforms the feature.
+     * 
+     * Parameters:
+     * mods - {Object} An object with optional scale, ratio, rotation and
+     *     center properties.
+     */
+    transformFeature: function(mods) {
+        if(!this._setfeature) {
+            this.scale *= (mods.scale || 1);
+            this.ratio *= (mods.ratio || 1);
+            var oldRotation = this.rotation;
+            this.rotation = (this.rotation + (mods.rotation || 0)) % 360;
+            
+            if(this.events.triggerEvent("beforetransform", mods) !== false) {
+                var feature = this.feature;
+                var geom = feature.geometry;
+                var center = this.center;
+                geom.rotate(-oldRotation, center);
+                if(mods.scale || mods.ratio) {
+                    geom.resize(mods.scale, center, mods.ratio);
+                } else if(mods.center) {
+                    feature.move(mods.center.getBounds().getCenterLonLat());
+                }
+                geom.rotate(this.rotation, center);
+                this.layer.drawFeature(feature);
+                feature.toState(OpenLayers.State.UPDATE);
+                this.events.triggerEvent("transform", mods);
+            }
+        }
+        this.layer.drawFeature(this.box, this.renderIntent);
+        this.drawHandles();
+    },
+        
+    /**
+     * APIMethod: destroy
+     * Take care of things that are not handled in superclass.
+     */
+    destroy: function() {
+        var geom;
+        for(var i=0; i<8; ++i) {
+            geom = this.box.geometry.components[i];
+            geom._handle.destroy();
+            geom._handle = null;
+            geom._rotationHandle && geom._rotationHandle.destroy();
+            geom._rotationHandle = null;
+        }
+        this.box.destroy();
+        this.box = null;
+        this.layer = null;
+        this.dragControl.destroy();
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.TransformFeature"
+});
diff --git a/lib/OpenLayers/Control/WMSGetFeatureInfo.js b/lib/OpenLayers/Control/WMSGetFeatureInfo.js
new file mode 100644
index 0000000..3573274
--- /dev/null
+++ b/lib/OpenLayers/Control/WMSGetFeatureInfo.js
@@ -0,0 +1,524 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Handler/Click.js
+ * @requires OpenLayers/Handler/Hover.js
+ * @requires OpenLayers/Request.js
+ */
+
+/**
+ * Class: OpenLayers.Control.WMSGetFeatureInfo
+ * The WMSGetFeatureInfo control uses a WMS query to get information about a point on the map.  The
+ * information may be in a display-friendly format such as HTML, or a machine-friendly format such 
+ * as GML, depending on the server's capabilities and the client's configuration.  This control 
+ * handles click or hover events, attempts to parse the results using an OpenLayers.Format, and 
+ * fires a 'getfeatureinfo' event with the click position, the raw body of the response, and an 
+ * array of features if it successfully read the response.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
+
+   /**
+     * APIProperty: hover
+     * {Boolean} Send GetFeatureInfo requests when mouse stops moving.
+     *     Default is false.
+     */
+    hover: false,
+
+    /**
+     * APIProperty: drillDown
+     * {Boolean} Drill down over all WMS layers in the map. When
+     *     using drillDown mode, hover is not possible, and an infoFormat that
+     *     returns parseable features is required. Default is false.
+     */
+    drillDown: false,
+
+    /**
+     * APIProperty: maxFeatures
+     * {Integer} Maximum number of features to return from a WMS query. This
+     *     sets the feature_count parameter on WMS GetFeatureInfo
+     *     requests.
+     */
+    maxFeatures: 10,
+
+    /** APIProperty: clickCallback
+     *  {String} The click callback to register in the
+     *      {<OpenLayers.Handler.Click>} object created when the hover
+     *      option is set to false. Default is "click".
+     */
+    clickCallback: "click",
+    
+    /**
+     * Property: layers
+     * {Array(<OpenLayers.Layer.WMS>)} The layers to query for feature info.
+     *     If omitted, all map WMS layers with a url that matches this <url> or
+     *     <layerUrls> will be considered.
+     */
+    layers: null,
+
+    /**
+     * Property: queryVisible
+     * {Boolean} If true, filter out hidden layers when searching the map for
+     *     layers to query.  Default is false.
+     */
+    queryVisible: false,
+
+    /**
+     * Property: url
+     * {String} The URL of the WMS service to use.  If not provided, the url
+     *     of the first eligible layer will be used.
+     */
+    url: null,
+    
+    /**
+     * Property: layerUrls
+     * {Array(String)} Optional list of urls for layers that should be queried.
+     *     This can be used when the layer url differs from the url used for
+     *     making GetFeatureInfo requests (in the case of a layer using cached
+     *     tiles).
+     */
+    layerUrls: null,
+
+    /**
+     * Property: infoFormat
+     * {String} The mimetype to request from the server
+     */
+    infoFormat: 'text/html',
+    
+    /**
+     * Property: vendorParams
+     * {Object} Additional parameters that will be added to the request, for
+     * WMS implementations that support them. This could e.g. look like
+     * (start code)
+     * {
+     *     radius: 5
+     * }
+     * (end)
+     */
+    vendorParams: {},
+    
+    /**
+     * Property: format
+     * {<OpenLayers.Format>} A format for parsing GetFeatureInfo responses.
+     *     Default is <OpenLayers.Format.WMSGetFeatureInfo>.
+     */
+    format: null,
+    
+    /**
+     * Property: formatOptions
+     * {Object} Optional properties to set on the format (if one is not provided
+     *     in the <format> property.
+     */
+    formatOptions: null,
+
+    /**
+     * APIProperty: handlerOptions
+     * {Object} Additional options for the handlers used by this control, e.g.
+     * (start code)
+     * {
+     *     "click": {delay: 100},
+     *     "hover": {delay: 300}
+     * }
+     * (end)
+     */
+    handlerOptions: null,
+    
+    /**
+     * Property: handler
+     * {Object} Reference to the <OpenLayers.Handler> for this control
+     */
+    handler: null,
+    
+    /**
+     * Property: hoverRequest
+     * {<OpenLayers.Request>} contains the currently running hover request
+     *     (if any).
+     */
+    hoverRequest: null,
+    
+    /**
+     * Constant: EVENT_TYPES
+     *
+     * Supported event types (in addition to those from <OpenLayers.Control>):
+     * beforegetfeatureinfo - Triggered before the request is sent.
+     *      The event object has an *xy* property with the position of the 
+     *      mouse click or hover event that triggers the request.
+     * nogetfeatureinfo - no queryable layers were found.
+     * getfeatureinfo - Triggered when a GetFeatureInfo response is received.
+     *      The event object has a *text* property with the body of the
+     *      response (String), a *features* property with an array of the
+     *      parsed features, an *xy* property with the position of the mouse
+     *      click or hover event that triggered the request, and a *request*
+     *      property with the request itself. If drillDown is set to true and
+     *      multiple requests were issued to collect feature info from all
+     *      layers, *text* and *request* will only contain the response body
+     *      and request object of the last request.
+     */
+    EVENT_TYPES: ["beforegetfeatureinfo", "nogetfeatureinfo", "getfeatureinfo"],
+
+    /**
+     * Constructor: <OpenLayers.Control.WMSGetFeatureInfo>
+     *
+     * Parameters:
+     * options - {Object} 
+     */
+    initialize: function(options) {
+        // concatenate events specific to vector with those from the base
+        this.EVENT_TYPES =
+            OpenLayers.Control.WMSGetFeatureInfo.prototype.EVENT_TYPES.concat(
+            OpenLayers.Control.prototype.EVENT_TYPES
+        );
+
+        options = options || {};
+        options.handlerOptions = options.handlerOptions || {};
+
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        
+        if(!this.format) {
+            this.format = new OpenLayers.Format.WMSGetFeatureInfo(
+                options.formatOptions
+            );
+        }
+        
+        if(this.drillDown === true) {
+            this.hover = false;
+        }
+
+        if(this.hover) {
+            this.handler = new OpenLayers.Handler.Hover(
+                   this, {
+                       'move': this.cancelHover,
+                       'pause': this.getInfoForHover
+                   },
+                   OpenLayers.Util.extend(this.handlerOptions.hover || {}, {
+                       'delay': 250
+                   }));
+        } else {
+            var callbacks = {};
+            callbacks[this.clickCallback] = this.getInfoForClick;
+            this.handler = new OpenLayers.Handler.Click(
+                this, callbacks, this.handlerOptions.click || {});
+        }
+    },
+
+    /**
+     * Method: activate
+     * Activates the control.
+     * 
+     * Returns:
+     * {Boolean} The control was effectively activated.
+     */
+    activate: function () {
+        if (!this.active) {
+            this.handler.activate();
+        }
+        return OpenLayers.Control.prototype.activate.apply(
+            this, arguments
+        );
+    },
+
+    /**
+     * Method: deactivate
+     * Deactivates the control.
+     * 
+     * Returns:
+     * {Boolean} The control was effectively deactivated.
+     */
+    deactivate: function () {
+        return OpenLayers.Control.prototype.deactivate.apply(
+            this, arguments
+        );
+    },
+    
+    /**
+     * Method: getInfoForClick 
+     * Called on click
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     */
+    getInfoForClick: function(evt) {
+        this.events.triggerEvent("beforegetfeatureinfo", {xy: evt.xy});
+        // Set the cursor to "wait" to tell the user we're working on their
+        // click.
+        OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait");
+        this.request(evt.xy, {});
+    },
+   
+    /**
+     * Method: getInfoForHover
+     * Pause callback for the hover handler
+     *
+     * Parameters:
+     * evt - {Object}
+     */
+    getInfoForHover: function(evt) {
+        this.events.triggerEvent("beforegetfeatureinfo", {xy: evt.xy});
+        this.request(evt.xy, {hover: true});
+    },
+
+    /**
+     * Method: cancelHover
+     * Cancel callback for the hover handler
+     */
+    cancelHover: function() {
+        if (this.hoverRequest) {
+            this.hoverRequest.abort();
+            this.hoverRequest = null;
+        }
+    },
+
+    /**
+     * Method: findLayers
+     * Internal method to get the layers, independent of whether we are
+     *     inspecting the map or using a client-provided array
+     */
+    findLayers: function() {
+
+        var candidates = this.layers || this.map.layers;
+        var layers = [];
+        var layer, url;
+        for(var i=0, len=candidates.length; i<len; ++i) {
+            layer = candidates[i];
+            if(layer instanceof OpenLayers.Layer.WMS &&
+               (!this.queryVisible || layer.getVisibility())) {
+                url = layer.url instanceof Array ? layer.url[0] : layer.url;
+                // if the control was not configured with a url, set it
+                // to the first layer url
+                if(this.drillDown === false && !this.url) {
+                    this.url = url;
+                }
+                if(this.drillDown === true || this.urlMatches(url)) {
+                    layers.push(layer);
+                }
+            }
+        }
+        return layers;
+    },
+    
+    /**
+     * Method: urlMatches
+     * Test to see if the provided url matches either the control <url> or one
+     *     of the <layerUrls>.
+     *
+     * Parameters:
+     * url - {String} The url to test.
+     *
+     * Returns:
+     * {Boolean} The provided url matches the control <url> or one of the
+     *     <layerUrls>.
+     */
+    urlMatches: function(url) {
+        var matches = OpenLayers.Util.isEquivalentUrl(this.url, url);
+        if(!matches && this.layerUrls) {
+            for(var i=0, len=this.layerUrls.length; i<len; ++i) {
+                if(OpenLayers.Util.isEquivalentUrl(this.layerUrls[i], url)) {
+                    matches = true;
+                    break;
+                }
+            }
+        }
+        return matches;
+    },
+
+    /**
+     * Method: buildWMSOptions
+     * Build an object with the relevant WMS options for the GetFeatureInfo request
+     *
+     * Parameters:
+     * url - {String} The url to be used for sending the request
+     * layers - {Array(<OpenLayers.Layer.WMS)} An array of layers
+     * clickPosition - {<OpenLayers.Pixel>} The position on the map where the mouse
+     *     event occurred.
+     * format - {String} The format from the corresponding GetMap request
+     */
+    buildWMSOptions: function(url, layers, clickPosition, format) {
+        var layerNames = [], styleNames = [];
+        for (var i = 0, len = layers.length; i < len; i++) { 
+            layerNames = layerNames.concat(layers[i].params.LAYERS);
+            styleNames = styleNames.concat(this.getStyleNames(layers[i]));
+        }
+        var params = OpenLayers.Util.extend({
+            service: "WMS",
+            version: layers[0].params.VERSION,
+            request: "GetFeatureInfo",
+            layers: layerNames,
+            query_layers: layerNames,
+            styles: styleNames,
+            bbox: this.map.getExtent().toBBOX(null,
+                layers[0].reverseAxisOrder()),
+            feature_count: this.maxFeatures,
+            height: this.map.getSize().h,
+            width: this.map.getSize().w,
+            format: format,
+            info_format: this.infoFormat
+        }, (parseFloat(layers[0].params.VERSION) >= 1.3) ?
+            {
+                crs: this.map.getProjection(),
+                i: clickPosition.x,
+                j: clickPosition.y
+            } :
+            {
+                srs: this.map.getProjection(),
+                x: clickPosition.x,
+                y: clickPosition.y
+            }
+        );
+        OpenLayers.Util.applyDefaults(params, this.vendorParams);
+        return {
+            url: url,
+            params: OpenLayers.Util.upperCaseObject(params),
+            callback: function(request) {
+                this.handleResponse(clickPosition, request);
+            },
+            scope: this
+        };
+    },
+
+    /**
+     * Method: getStyleNames
+     * Gets the STYLES parameter for the layer. Make sure the STYLES parameter
+     * matches the LAYERS parameter
+     * 
+     * Parameters:
+     * layer - {<OpenLayers.Layer.WMS>}
+     *
+     * Returns:
+     * {Array(String)} The STYLES parameter
+     */
+    getStyleNames: function(layer) {
+        // in the event of a WMS layer bundling multiple layers but not
+        // specifying styles,we need the same number of commas to specify
+        // the default style for each of the layers.  We can't just leave it
+        // blank as we may be including other layers that do specify styles.
+        var styleNames;
+        if (layer.params.STYLES) {
+            styleNames = layer.params.STYLES;
+        } else {
+            if (layer.params.LAYERS instanceof Array) {
+                styleNames = new Array(layer.params.LAYERS.length);
+            } else { // Assume it's a String
+                styleNames = layer.params.LAYERS.replace(/[^,]/g, "");
+            }
+        }
+        return styleNames;
+    },
+
+    /**
+     * Method: request
+     * Sends a GetFeatureInfo request to the WMS
+     * 
+     * Parameters:
+     * clickPosition - {<OpenLayers.Pixel>} The position on the map where the
+     *     mouse event occurred.
+     * options - {Object} additional options for this method.
+     * 
+     * Valid options:
+     * - *hover* {Boolean} true if we do the request for the hover handler
+     */
+    request: function(clickPosition, options) {
+        var layers = this.findLayers();
+        if(layers.length == 0) {
+            this.events.triggerEvent("nogetfeatureinfo");
+            // Reset the cursor.
+            OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
+            return;
+        }
+        
+        options = options || {};
+        if(this.drillDown === false) {
+            var wmsOptions = this.buildWMSOptions(this.url, layers,
+                clickPosition, layers[0].params.FORMAT); 
+            var request = OpenLayers.Request.GET(wmsOptions);
+    
+            if (options.hover === true) {
+                this.hoverRequest = request;
+            }
+        } else {
+            this._requestCount = 0;
+            this._numRequests = 0;
+            this.features = [];
+            // group according to service url to combine requests
+            var services = {}, url;
+            for(var i=0, len=layers.length; i<len; i++) {
+                var layer = layers[i];
+                var service, found = false;
+                url = layer.url instanceof Array ? layer.url[0] : layer.url;
+                if(url in services) {
+                    services[url].push(layer);
+                } else {
+                    this._numRequests++;
+                    services[url] = [layer];
+                }
+            }
+            var layers;
+            for (var url in services) {
+                layers = services[url];
+                var wmsOptions = this.buildWMSOptions(url, layers, 
+                    clickPosition, layers[0].params.FORMAT);
+                OpenLayers.Request.GET(wmsOptions); 
+            }
+        }
+    },
+
+    /**
+     * Method: triggerGetFeatureInfo
+     * Trigger the getfeatureinfo event when all is done
+     *
+     * Parameters:
+     * request - {XMLHttpRequest} The request object
+     * xy - {<OpenLayers.Pixel>} The position on the map where the
+     *     mouse event occurred.
+     * features - {Array(<OpenLayers.Feature.Vector>)}
+     */
+    triggerGetFeatureInfo: function(request, xy, features) {
+        this.events.triggerEvent("getfeatureinfo", {
+            text: request.responseText,
+            features: features,
+            request: request,
+            xy: xy
+        });
+
+        // Reset the cursor.
+        OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
+    },
+    
+    /**
+     * Method: handleResponse
+     * Handler for the GetFeatureInfo response.
+     * 
+     * Parameters:
+     * xy - {<OpenLayers.Pixel>} The position on the map where the
+     *     mouse event occurred.
+     * request - {XMLHttpRequest} The request object.
+     */
+    handleResponse: function(xy, request) {
+        
+        var doc = request.responseXML;
+        if(!doc || !doc.documentElement) {
+            doc = request.responseText;
+        }
+        var features = this.format.read(doc);
+        if (this.drillDown === false) {
+            this.triggerGetFeatureInfo(request, xy, features);
+        } else {
+            this._requestCount++;
+            this._features = (this._features || []).concat(features);
+            if (this._requestCount === this._numRequests) {
+                this.triggerGetFeatureInfo(request, xy, this._features.concat()); 
+                delete this._features;
+                delete this._requestCount;
+                delete this._numRequests;
+            }
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.WMSGetFeatureInfo"
+});
diff --git a/lib/OpenLayers/Control/WMTSGetFeatureInfo.js b/lib/OpenLayers/Control/WMTSGetFeatureInfo.js
new file mode 100644
index 0000000..851457a
--- /dev/null
+++ b/lib/OpenLayers/Control/WMTSGetFeatureInfo.js
@@ -0,0 +1,442 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Handler/Click.js
+ * @requires OpenLayers/Handler/Hover.js
+ * @requires OpenLayers/Request.js
+ * @requires OpenLayers/Format/WMSGetFeatureInfo.js
+ */
+
+/**
+ * Class: OpenLayers.Control.WMTSGetFeatureInfo
+ * The WMTSGetFeatureInfo control uses a WMTS query to get information about a 
+ *     point on the map.  The information may be in a display-friendly format 
+ *     such as HTML, or a machine-friendly format such as GML, depending on the 
+ *     server's capabilities and the client's configuration.  This control 
+ *     handles click or hover events, attempts to parse the results using an 
+ *     OpenLayers.Format, and fires a 'getfeatureinfo' event for each layer
+ *     queried.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.WMTSGetFeatureInfo = OpenLayers.Class(OpenLayers.Control, {
+
+   /**
+     * APIProperty: hover
+     * {Boolean} Send GetFeatureInfo requests when mouse stops moving.
+     *     Default is false.
+     */
+    hover: false,
+    
+    /**
+     * Property: requestEncoding
+     * {String} One of "KVP" or "REST".  Only KVP encoding is supported at this 
+     *     time.
+     */
+    requestEncoding: "KVP",
+
+    /**
+     * APIProperty: drillDown
+     * {Boolean} Drill down over all WMTS layers in the map. When
+     *     using drillDown mode, hover is not possible.  A getfeatureinfo event
+     *     will be fired for each layer queried.
+     */
+    drillDown: false,
+
+    /**
+     * APIProperty: maxFeatures
+     * {Integer} Maximum number of features to return from a WMTS query. This
+     *     sets the feature_count parameter on WMTS GetFeatureInfo
+     *     requests.
+     */
+    maxFeatures: 10,
+
+    /** APIProperty: clickCallback
+     *  {String} The click callback to register in the
+     *      {<OpenLayers.Handler.Click>} object created when the hover
+     *      option is set to false. Default is "click".
+     */
+    clickCallback: "click",
+    
+    /**
+     * Property: layers
+     * {Array(<OpenLayers.Layer.WMTS>)} The layers to query for feature info.
+     *     If omitted, all map WMTS layers will be considered.
+     */
+    layers: null,
+
+    /**
+     * APIProperty: queryVisible
+     * {Boolean} Filter out hidden layers when searching the map for layers to 
+     *     query.  Default is true.
+     */
+    queryVisible: true,
+
+    /**
+     * Property: infoFormat
+     * {String} The mimetype to request from the server
+     */
+    infoFormat: 'text/html',
+    
+    /**
+     * Property: vendorParams
+     * {Object} Additional parameters that will be added to the request, for
+     * WMTS implementations that support them. This could e.g. look like
+     * (start code)
+     * {
+     *     radius: 5
+     * }
+     * (end)
+     */
+    vendorParams: {},
+    
+    /**
+     * Property: format
+     * {<OpenLayers.Format>} A format for parsing GetFeatureInfo responses.
+     *     Default is <OpenLayers.Format.WMSGetFeatureInfo>.
+     */
+    format: null,
+    
+    /**
+     * Property: formatOptions
+     * {Object} Optional properties to set on the format (if one is not provided
+     *     in the <format> property.
+     */
+    formatOptions: null,
+
+    /**
+     * APIProperty: handlerOptions
+     * {Object} Additional options for the handlers used by this control, e.g.
+     * (start code)
+     * {
+     *     "click": {delay: 100},
+     *     "hover": {delay: 300}
+     * }
+     * (end)
+     */
+    handlerOptions: null,
+    
+    /**
+     * Property: handler
+     * {Object} Reference to the <OpenLayers.Handler> for this control
+     */
+    handler: null,
+    
+    /**
+     * Property: hoverRequest
+     * {<OpenLayers.Request>} contains the currently running hover request
+     *     (if any).
+     */
+    hoverRequest: null,
+    
+    /**
+     * Constant: EVENT_TYPES
+     *
+     * Supported event types (in addition to those from <OpenLayers.Control>):
+     * beforegetfeatureinfo - Triggered before each request is sent.
+     *      The event object has an *xy* property with the position of the 
+     *      mouse click or hover event that triggers the request and a *layer*
+     *      property referencing the layer about to be queried.  If a listener
+     *      returns false, the request will not be issued.
+     * getfeatureinfo - Triggered when a GetFeatureInfo response is received.
+     *      The event object has a *text* property with the body of the
+     *      response (String), a *features* property with an array of the
+     *      parsed features, an *xy* property with the position of the mouse
+     *      click or hover event that triggered the request, a *layer* property
+     *      referencing the layer queried and a *request* property with the 
+     *      request itself. If drillDown is set to true, one event will be fired
+     *      for each layer queried.
+     * exception - Triggered when a GetFeatureInfo request fails (with a 
+     *      status other than 200) or whenparsing fails.  Listeners will receive 
+     *      an event with *request*, *xy*, and *layer*  properties.  In the case 
+     *      of a parsing error, the event will also contain an *error* property.
+     */
+    EVENT_TYPES: ["beforegetfeatureinfo", "getfeatureinfo", "exception"],
+    
+    /** 
+     * Property: pending
+     * {Number}  The number of pending requests.
+     */
+    pending: 0,
+
+    /**
+     * Constructor: <OpenLayers.Control.WMTSGetFeatureInfo>
+     *
+     * Parameters:
+     * options - {Object} 
+     */
+    initialize: function(options) {
+        // concatenate events specific to vector with those from the base
+        this.EVENT_TYPES =
+            OpenLayers.Control.WMTSGetFeatureInfo.prototype.EVENT_TYPES.concat(
+            OpenLayers.Control.prototype.EVENT_TYPES
+        );
+
+        options = options || {};
+        options.handlerOptions = options.handlerOptions || {};
+
+        OpenLayers.Control.prototype.initialize.apply(this, [options]);
+        
+        if (!this.format) {
+            this.format = new OpenLayers.Format.WMSGetFeatureInfo(
+                options.formatOptions
+            );
+        }
+        
+        if (this.drillDown === true) {
+            this.hover = false;
+        }
+
+        if (this.hover) {
+            this.handler = new OpenLayers.Handler.Hover(
+                this, {
+                    move: this.cancelHover,
+                    pause: this.getInfoForHover
+                },
+                OpenLayers.Util.extend(
+                    this.handlerOptions.hover || {}, {delay: 250}
+                )
+            );
+        } else {
+            var callbacks = {};
+            callbacks[this.clickCallback] = this.getInfoForClick;
+            this.handler = new OpenLayers.Handler.Click(
+                this, callbacks, this.handlerOptions.click || {}
+            );
+        }
+    },
+
+    /**
+     * Method: activate
+     * Activates the control.
+     * 
+     * Returns:
+     * {Boolean} The control was effectively activated.
+     */
+    activate: function () {
+        if (!this.active) {
+            this.handler.activate();
+        }
+        return OpenLayers.Control.prototype.activate.apply(
+            this, arguments
+        );
+    },
+
+    /**
+     * Method: deactivate
+     * Deactivates the control.
+     * 
+     * Returns:
+     * {Boolean} The control was effectively deactivated.
+     */
+    deactivate: function () {
+        return OpenLayers.Control.prototype.deactivate.apply(
+            this, arguments
+        );
+    },
+    
+    /**
+     * Method: getInfoForClick 
+     * Called on click
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     */
+    getInfoForClick: function(evt) {
+        this.request(evt.xy, {});
+    },
+   
+    /**
+     * Method: getInfoForHover
+     * Pause callback for the hover handler
+     *
+     * Parameters:
+     * evt - {Object}
+     */
+    getInfoForHover: function(evt) {
+        this.request(evt.xy, {hover: true});
+    },
+
+    /**
+     * Method: cancelHover
+     * Cancel callback for the hover handler
+     */
+    cancelHover: function() {
+        if (this.hoverRequest) {
+            --this.pending;
+            if (this.pending <= 0) {
+                OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
+                this.pending = 0;
+            }            
+            this.hoverRequest.abort();
+            this.hoverRequest = null;
+        }
+    },
+
+    /**
+     * Method: findLayers
+     * Internal method to get the layers, independent of whether we are
+     *     inspecting the map or using a client-provided array
+     */
+    findLayers: function() {
+        var candidates = this.layers || this.map.layers;
+        var layers = [];
+        var layer;
+        for (var i=candidates.length-1; i>=0; --i) {
+            layer = candidates[i];
+            if (layer instanceof OpenLayers.Layer.WMTS &&
+                layer.requestEncoding === this.requestEncoding &&
+                (!this.queryVisible || layer.getVisibility())) {
+                layers.push(layer);
+                if (!this.drillDown || this.hover) {
+                    break;
+                }
+            }
+        }
+        return layers;
+    },
+    
+    /**
+     * Method: buildRequestOptions
+     * Build an object with the relevant options for the GetFeatureInfo request.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer.WMTS>} A WMTS layer.
+     * xy - {<OpenLayers.Pixel>} The position on the map where the 
+     *     mouse event occurred.
+     */
+    buildRequestOptions: function(layer, xy) {
+        var loc = this.map.getLonLatFromPixel(xy);
+        var getTileUrl = layer.getURL(
+            new OpenLayers.Bounds(loc.lon, loc.lat, loc.lon, loc.lat)
+        );
+        var params = OpenLayers.Util.getParameters(getTileUrl);
+        var tileInfo = layer.getTileInfo(loc);
+        OpenLayers.Util.extend(params, {
+            service: "WMTS",
+            version: layer.version,
+            request: "GetFeatureInfo",
+            infoFormat: this.infoFormat,
+            i: tileInfo.i,
+            j: tileInfo.j
+        });
+        OpenLayers.Util.applyDefaults(params, this.vendorParams);
+        return {
+            url: layer.url instanceof Array ? layer.url[0] : layer.url,
+            params: OpenLayers.Util.upperCaseObject(params),
+            callback: function(request) {
+                this.handleResponse(xy, request, layer);
+            },
+            scope: this
+        };
+    },
+
+    /**
+     * Method: request
+     * Sends a GetFeatureInfo request to the WMTS
+     * 
+     * Parameters:
+     * xy - {<OpenLayers.Pixel>} The position on the map where the mouse event 
+     *     occurred.
+     * options - {Object} additional options for this method.
+     * 
+     * Valid options:
+     * - *hover* {Boolean} true if we do the request for the hover handler
+     */
+    request: function(xy, options) {
+        options = options || {};
+        var layers = this.findLayers();
+        if (layers.length > 0) {
+            var issue, layer;
+            for (var i=0, len=layers.length; i<len; i++) {
+                layer = layers[i];
+                issue = this.events.triggerEvent("beforegetfeatureinfo", {
+                    xy: xy,
+                    layer: layer
+                });
+                if (issue !== false) {
+                    ++this.pending;
+                    var requestOptions = this.buildRequestOptions(layer, xy);
+                    var request = OpenLayers.Request.GET(requestOptions);
+                    if (options.hover === true) {
+                        this.hoverRequest = request;
+                    }
+                }
+            }
+            if (this.pending > 0) {
+                OpenLayers.Element.addClass(this.map.viewPortDiv, "olCursorWait");
+            }
+        }
+    },
+
+    /**
+     * Method: handleResponse
+     * Handler for the GetFeatureInfo response.
+     * 
+     * Parameters:
+     * xy - {<OpenLayers.Pixel>} The position on the map where the mouse event 
+     *     occurred.
+     * request - {XMLHttpRequest} The request object.
+     * layer - {<OpenLayers.Layer.WMTS>} The queried layer.
+     */
+    handleResponse: function(xy, request, layer) {
+        --this.pending;
+        if (this.pending <= 0) {
+            OpenLayers.Element.removeClass(this.map.viewPortDiv, "olCursorWait");
+            this.pending = 0;
+        }
+        if (request.status && (request.status < 200 || request.status >= 300)) {
+            this.events.triggerEvent("exception", {
+                xy: xy, 
+                request: request,
+                layer: layer
+            });
+        } else {
+            var doc = request.responseXML;
+            if (!doc || !doc.documentElement) {
+                doc = request.responseText;
+            }
+            var features, except;
+            try {
+                features = this.format.read(doc);
+            } catch (error) {
+                except = true;
+                this.events.triggerEvent("exception", {
+                    xy: xy,
+                    request: request,
+                    error: error,
+                    layer: layer
+                });
+            }
+            if (!except) {
+                this.events.triggerEvent("getfeatureinfo", {
+                    text: request.responseText,
+                    features: features,
+                    request: request,
+                    xy: xy,
+                    layer: layer
+                });
+            }
+        }
+    },
+   
+    /** 
+     * Method: setMap
+     * Set the map property for the control. 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        this.handler.setMap(map);
+        OpenLayers.Control.prototype.setMap.apply(this, arguments);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.WMTSGetFeatureInfo"
+});
diff --git a/lib/OpenLayers/Control/ZoomBox.js b/lib/OpenLayers/Control/ZoomBox.js
new file mode 100644
index 0000000..62a48b2
--- /dev/null
+++ b/lib/OpenLayers/Control/ZoomBox.js
@@ -0,0 +1,95 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ * @requires OpenLayers/Handler/Box.js
+ */
+
+/**
+ * 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 mouse.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.ZoomBox = OpenLayers.Class(OpenLayers.Control, {
+    /**
+     * Property: type
+     * {OpenLayers.Control.TYPE}
+     */
+    type: OpenLayers.Control.TYPE_TOOL,
+
+    /**
+     * Property: out
+     * {Boolean} Should the control be used for zooming out?
+     */
+    out: false,
+
+    /**
+     * Property: alwaysZoom
+     * {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} );
+    },
+
+    /**
+     * Method: zoomBox
+     *
+     * Parameters:
+     * position - {<OpenLayers.Bounds>} or {<OpenLayers.Pixel>}
+     */
+    zoomBox: function (position) {
+        if (position instanceof OpenLayers.Bounds) {
+            var bounds;
+            if (!this.out) {
+                var minXY = this.map.getLonLatFromPixel(
+                            new OpenLayers.Pixel(position.left, position.bottom));
+                var maxXY = this.map.getLonLatFromPixel(
+                            new OpenLayers.Pixel(position.right, position.top));
+                bounds = new OpenLayers.Bounds(minXY.lon, minXY.lat,
+                                               maxXY.lon, maxXY.lat);
+            } else {
+                var pixWidth = Math.abs(position.right-position.left);
+                var pixHeight = Math.abs(position.top-position.bottom);
+                var zoomFactor = Math.min((this.map.size.h / pixHeight),
+                    (this.map.size.w / pixWidth));
+                var extent = this.map.getExtent();
+                var center = this.map.getLonLatFromPixel(
+                    position.getCenterPixel());
+                var xmin = center.lon - (extent.getWidth()/2)*zoomFactor;
+                var xmax = center.lon + (extent.getWidth()/2)*zoomFactor;
+                var ymin = center.lat - (extent.getHeight()/2)*zoomFactor;
+                var ymax = center.lat + (extent.getHeight()/2)*zoomFactor;
+                bounds = new OpenLayers.Bounds(xmin, ymin, xmax, ymax);
+            }
+            // 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)); 
+            }
+        } else { // it's a pixel
+            if (!this.out) {
+                this.map.setCenter(this.map.getLonLatFromPixel(position),
+                               this.map.getZoom() + 1);
+            } else {
+                this.map.setCenter(this.map.getLonLatFromPixel(position),
+                               this.map.getZoom() - 1);
+            }
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Control.ZoomBox"
+});
diff --git a/lib/OpenLayers/Control/ZoomIn.js b/lib/OpenLayers/Control/ZoomIn.js
new file mode 100644
index 0000000..c742b44
--- /dev/null
+++ b/lib/OpenLayers/Control/ZoomIn.js
@@ -0,0 +1,35 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.ZoomIn
+ * The ZoomIn control is a button to increase the zoom level of a map.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.ZoomIn = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Property: type
+     * {String} The type of <OpenLayers.Control> -- When added to a 
+     *     <Control.Panel>, 'type' is used by the panel to determine how to 
+     *     handle our events.
+     */
+    type: OpenLayers.Control.TYPE_BUTTON,
+    
+    /**
+     * Method: trigger
+     */
+    trigger: function(){
+        this.map.zoomIn();
+    },
+
+    CLASS_NAME: "OpenLayers.Control.ZoomIn"
+});
diff --git a/lib/OpenLayers/Control/ZoomOut.js b/lib/OpenLayers/Control/ZoomOut.js
new file mode 100644
index 0000000..1dab2d9
--- /dev/null
+++ b/lib/OpenLayers/Control/ZoomOut.js
@@ -0,0 +1,35 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.ZoomOut
+ * The ZoomOut control is a button to decrease the zoom level of a map.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.ZoomOut = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Property: type
+     * {String} The type of <OpenLayers.Control> -- When added to a 
+     *     <Control.Panel>, 'type' is used by the panel to determine how to 
+     *     handle our events.
+     */
+    type: OpenLayers.Control.TYPE_BUTTON,
+    
+    /**
+     * Method: trigger
+     */
+    trigger: function(){
+        this.map.zoomOut();
+    },
+
+    CLASS_NAME: "OpenLayers.Control.ZoomOut"
+});
diff --git a/lib/OpenLayers/Control/ZoomPanel.js b/lib/OpenLayers/Control/ZoomPanel.js
new file mode 100644
index 0000000..099f48e
--- /dev/null
+++ b/lib/OpenLayers/Control/ZoomPanel.js
@@ -0,0 +1,54 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control/Panel.js
+ * @requires OpenLayers/Control/ZoomIn.js
+ * @requires OpenLayers/Control/ZoomOut.js
+ * @requires OpenLayers/Control/ZoomToMaxExtent.js
+ */
+
+/**
+ * Class: OpenLayers.Control.ZoomPanel
+ * The ZoomPanel control is a compact collecton of 3 zoom controls: a 
+ * <OpenLayers.Control.ZoomIn>, a <OpenLayers.Control.ZoomToMaxExtent>, and a
+ * <OpenLayers.Control.ZoomOut>. By default it is drawn in the upper left 
+ * corner of the map.
+ *
+ * Note: 
+ * If you wish to use this class with the default images and you want 
+ *       it to look nice in ie6, you should add the following, conditionally
+ *       added css stylesheet to your HTML file:
+ * 
+ * (code)
+ * <!--[if lte IE 6]>
+ *   <link rel="stylesheet" href="../theme/default/ie6-style.css" type="text/css" />
+ * <![endif]-->
+ * (end)
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Control.Panel>
+ */
+OpenLayers.Control.ZoomPanel = OpenLayers.Class(OpenLayers.Control.Panel, {
+
+    /**
+     * Constructor: OpenLayers.Control.ZoomPanel 
+     * Add the three zooming controls.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be used
+     *     to extend the control.
+     */
+    initialize: function(options) {
+        OpenLayers.Control.Panel.prototype.initialize.apply(this, [options]);
+        this.addControls([
+            new OpenLayers.Control.ZoomIn(),
+            new OpenLayers.Control.ZoomToMaxExtent(),
+            new OpenLayers.Control.ZoomOut()
+        ]);
+    },
+
+    CLASS_NAME: "OpenLayers.Control.ZoomPanel"
+});
diff --git a/lib/OpenLayers/Control/ZoomToMaxExtent.js b/lib/OpenLayers/Control/ZoomToMaxExtent.js
new file mode 100644
index 0000000..cf38490
--- /dev/null
+++ b/lib/OpenLayers/Control/ZoomToMaxExtent.js
@@ -0,0 +1,40 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Control.js
+ */
+
+/**
+ * Class: OpenLayers.Control.ZoomToMaxExtent 
+ * The ZoomToMaxExtent control is a button that zooms out to the maximum
+ * extent of the map. It is designed to be used with a 
+ * <OpenLayers.Control.Panel>.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Control>
+ */
+OpenLayers.Control.ZoomToMaxExtent = OpenLayers.Class(OpenLayers.Control, {
+
+    /**
+     * Property: type
+     * {String} The type of <OpenLayers.Control> -- When added to a 
+     *     <Control.Panel>, 'type' is used by the panel to determine how to 
+     *     handle our events.
+     */
+    type: OpenLayers.Control.TYPE_BUTTON,
+    
+    /*
+     * Method: trigger
+     * Do the zoom.
+     */
+    trigger: function() {
+        if (this.map) {
+            this.map.zoomToMaxExtent();
+        }    
+    },
+
+    CLASS_NAME: "OpenLayers.Control.ZoomToMaxExtent"
+});
diff --git a/lib/OpenLayers/Events.js b/lib/OpenLayers/Events.js
new file mode 100644
index 0000000..588a10c
--- /dev/null
+++ b/lib/OpenLayers/Events.js
@@ -0,0 +1,855 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Util.js
+ */
+
+/**
+ * Namespace: OpenLayers.Event
+ * Utility functions for event handling.
+ */
+OpenLayers.Event = {
+
+    /** 
+     * Property: observers 
+     * {Object} A hashtable cache of the event observers. Keyed by
+     * element._eventCacheID 
+     */
+    observers: false,
+    
+    /** 
+     * Constant: KEY_BACKSPACE 
+     * {int} 
+     */
+    KEY_BACKSPACE: 8,
+
+    /** 
+     * Constant: KEY_TAB 
+     * {int} 
+     */
+    KEY_TAB: 9,
+
+    /** 
+     * Constant: KEY_RETURN 
+     * {int} 
+     */
+    KEY_RETURN: 13,
+
+    /** 
+     * Constant: KEY_ESC 
+     * {int} 
+     */
+    KEY_ESC: 27,
+
+    /** 
+     * Constant: KEY_LEFT 
+     * {int} 
+     */
+    KEY_LEFT: 37,
+
+    /** 
+     * Constant: KEY_UP 
+     * {int} 
+     */
+    KEY_UP: 38,
+
+    /** 
+     * Constant: KEY_RIGHT 
+     * {int} 
+     */
+    KEY_RIGHT: 39,
+
+    /** 
+     * Constant: KEY_DOWN 
+     * {int} 
+     */
+    KEY_DOWN: 40,
+
+    /** 
+     * Constant: KEY_DELETE 
+     * {int} 
+     */
+    KEY_DELETE: 46,
+
+
+    /**
+     * Method: element
+     * Cross browser event element detection.
+     * 
+     * Parameters:
+     * event - {Event} 
+     * 
+     * Returns:
+     * {DOMElement} The element that caused the event 
+     */
+    element: function(event) {
+        return event.target || event.srcElement;
+    },
+
+    /**
+     * Method: isLeftClick
+     * Determine whether event was caused by a left click. 
+     *
+     * Parameters:
+     * event - {Event} 
+     * 
+     * Returns:
+     * {Boolean}
+     */
+    isLeftClick: function(event) {
+        return (((event.which) && (event.which == 1)) ||
+                ((event.button) && (event.button == 1)));
+    },
+
+    /**
+     * Method: isRightClick
+     * Determine whether event was caused by a right mouse click. 
+     *
+     * Parameters:
+     * event - {Event} 
+     * 
+     * Returns:
+     * {Boolean}
+     */
+     isRightClick: function(event) {
+        return (((event.which) && (event.which == 3)) ||
+                ((event.button) && (event.button == 2)));
+    },
+     
+    /**
+     * Method: stop
+     * 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 
+     *                               clicking, etc)
+     *                               Default false
+     */
+    stop: function(event, allowDefault) {
+        
+        if (!allowDefault) { 
+            if (event.preventDefault) {
+                event.preventDefault();
+            } else {
+                event.returnValue = false;
+            }
+        }
+                
+        if (event.stopPropagation) {
+            event.stopPropagation();
+        } else {
+            event.cancelBubble = true;
+        }
+    },
+
+    /** 
+     * Method: findElement
+     * 
+     * Parameters:
+     * 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
+     */
+    findElement: function(event, tagName) {
+        var element = OpenLayers.Event.element(event);
+        while (element.parentNode && (!element.tagName ||
+              (element.tagName.toUpperCase() != tagName.toUpperCase()))){
+            element = element.parentNode;
+        }
+        return element;
+    },
+
+    /** 
+     * Method: observe
+     * 
+     * Parameters:
+     * elementParam - {DOMElement || String} 
+     * name - {String} 
+     * observer - {function} 
+     * useCapture - {Boolean} 
+     */
+    observe: function(elementParam, name, observer, useCapture) {
+        var element = OpenLayers.Util.getElement(elementParam);
+        useCapture = useCapture || false;
+
+        if (name == 'keypress' &&
+           (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+           || element.attachEvent)) {
+            name = 'keydown';
+        }
+
+        //if observers cache has not yet been created, create it
+        if (!this.observers) {
+            this.observers = {};
+        }
+
+        //if not already assigned, make a new unique cache ID
+        if (!element._eventCacheID) {
+            var idPrefix = "eventCacheID_";
+            if (element.id) {
+                idPrefix = element.id + "_" + idPrefix;
+            }
+            element._eventCacheID = OpenLayers.Util.createUniqueID(idPrefix);
+        }
+
+        var cacheID = element._eventCacheID;
+
+        //if there is not yet a hash entry for this element, add one
+        if (!this.observers[cacheID]) {
+            this.observers[cacheID] = [];
+        }
+
+        //add a new observer to this element's list
+        this.observers[cacheID].push({
+            'element': element,
+            'name': name,
+            'observer': observer,
+            'useCapture': useCapture
+        });
+
+        //add the actual browser event listener
+        if (element.addEventListener) {
+            element.addEventListener(name, observer, useCapture);
+        } else if (element.attachEvent) {
+            element.attachEvent('on' + name, observer);
+        }
+    },
+
+    /** 
+     * Method: stopObservingElement
+     * 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} 
+     */
+    stopObservingElement: function(elementParam) {
+        var element = OpenLayers.Util.getElement(elementParam);
+        var cacheID = element._eventCacheID;
+
+        this._removeElementObservers(OpenLayers.Event.observers[cacheID]);
+    },
+
+    /**
+     * Method: _removeElementObservers
+     *
+     * Parameters:
+     * elementObservers - {Array(Object)} Array of (element, name, 
+     *                                         observer, usecapture) objects, 
+     *                                         taken directly from hashtable
+     */
+    _removeElementObservers: function(elementObservers) {
+        if (elementObservers) {
+            for(var i = elementObservers.length-1; i >= 0; i--) {
+                var entry = elementObservers[i];
+                var args = new Array(entry.element,
+                                     entry.name,
+                                     entry.observer,
+                                     entry.useCapture);
+                var removed = OpenLayers.Event.stopObserving.apply(this, args);
+            }
+        }
+    },
+
+    /**
+     * Method: stopObserving
+     * 
+     * Parameters:
+     * 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/) || 
+                 element.detachEvent) {
+              name = 'keydown';
+            }
+        }
+
+        // find element's entry in this.observers cache and remove it
+        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; 
+                }
+                i++;           
+            }
+        }
+    
+        //actually remove the event listener from browser
+        if (foundEntry) {
+            if (element.removeEventListener) {
+                element.removeEventListener(name, observer, useCapture);
+            } else if (element && element.detachEvent) {
+                element.detachEvent('on' + name, observer);
+            }
+        }
+        return foundEntry;
+    },
+    
+    /** 
+     * Method: unloadCache
+     * Cycle through all the element entries in the events cache and call
+     *   stopObservingElement on each. 
+     */
+    unloadCache: function() {
+        // check for OpenLayers.Event before checking for observers, because
+        // OpenLayers.Event may be undefined in IE if no map instance was
+        // created
+        if (OpenLayers.Event && OpenLayers.Event.observers) {
+            for (var cacheID in OpenLayers.Event.observers) {
+                var elementObservers = OpenLayers.Event.observers[cacheID];
+                OpenLayers.Event._removeElementObservers.apply(this, 
+                                                           [elementObservers]);
+            }
+            OpenLayers.Event.observers = false;
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Event"
+};
+
+/* prevent memory leaks in IE */
+OpenLayers.Event.observe(window, 'unload', OpenLayers.Event.unloadCache, false);
+
+// FIXME: Remove this in 3.0. In 3.0, Event.stop will no longer be provided
+// by OpenLayers.
+if (window.Event) {
+    OpenLayers.Util.applyDefaults(window.Event, OpenLayers.Event);
+} else {
+    var Event = OpenLayers.Event;
+}
+
+/**
+ * Class: OpenLayers.Events
+ */
+OpenLayers.Events = OpenLayers.Class({
+
+    /** 
+     * Constant: BROWSER_EVENTS
+     * {Array(String)} supported events 
+     */
+    BROWSER_EVENTS: [
+        "mouseover", "mouseout",
+        "mousedown", "mouseup", "mousemove", 
+        "click", "dblclick", "rightclick", "dblrightclick",
+        "resize", "focus", "blur"
+    ],
+
+    /** 
+     * Property: listeners 
+     * {Object} Hashtable of Array(Function): events listener functions  
+     */
+    listeners: null,
+
+    /** 
+     * Property: object 
+     * {Object}  the code object issuing application events 
+     */
+    object: null,
+
+    /** 
+     * Property: element 
+     * {DOMElement}  the DOM element receiving browser events 
+     */
+    element: null,
+
+    /** 
+     * Property: eventTypes 
+     * {Array(String)}  list of support application events 
+     */
+    eventTypes: null,
+
+    /** 
+     * Property: eventHandler 
+     * {Function}  bound event handler attached to elements 
+     */
+    eventHandler: null,
+
+    /** 
+     * 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 
+     *    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) 
+     *    } 
+     *
+     *    This option typically defaults to false for performance reasons:
+     *    when creating an events object whose primary purpose is to manage
+     *    relatively positioned mouse events within a div, it may make
+     *    sense to set it to true.
+     *
+     *    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 
+     *    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,      
+
+    /**
+     * Method: clearMouseListener
+     * A version of <clearMouseCache> that is bound to this instance so that
+     *     it can be used with <OpenLayers.Event.observe> and
+     *     <OpenLayers.Event.stopObserving>.
+     */
+    clearMouseListener: null,
+
+    /**
+     * Constructor: OpenLayers.Events
+     * Construct an OpenLayers.Events object.
+     *
+     * 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 
+     * fallThrough - {Boolean} Allow events to fall through after these have
+     *                         been handled?
+     * options - {Object} Options for the events object.
+     */
+    initialize: function (object, element, eventTypes, fallThrough, options) {
+        OpenLayers.Util.extend(this, options);
+        this.object     = object;
+        this.fallThrough = fallThrough;
+        this.listeners  = {};
+
+        // keep a bound copy of handleBrowserEvent() so that we can
+        // pass the same function to both Event.observe() and .stopObserving()
+        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 
+        // custom application event.
+        this.eventTypes = [];
+        if (eventTypes != null) {
+            for (var i=0, len=eventTypes.length; i<len; i++) {
+                this.addEventType(eventTypes[i]);
+            }
+        }
+        
+        // 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);
+        }
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function () {
+        if (this.element) {
+            OpenLayers.Event.stopObservingElement(this.element);
+            if(this.element.hasScrollEvent) {
+                OpenLayers.Event.stopObserving(
+                    window, "scroll", this.clearMouseListener
+                );
+            }
+        }
+        this.element = null;
+
+        this.listeners = null;
+        this.object = null;
+        this.eventTypes = null;
+        this.fallThrough = null;
+        this.eventHandler = null;
+    },
+
+    /**
+     * APIMethod: addEventType
+     * Add a new event type to this events object.
+     * If the event type has already been added, do nothing.
+     * 
+     * Parameters:
+     * eventName - {String}
+     */
+    addEventType: function(eventName) {
+        if (!this.listeners[eventName]) {
+            this.eventTypes.push(eventName);
+            this.listeners[eventName] = [];
+        }
+    },
+
+    /**
+     * Method: attachToElement
+     *
+     * Parameters:
+     * element - {HTMLDOMElement} a DOM element to attach browser events to
+     */
+    attachToElement: function (element) {
+        if(this.element) {
+            OpenLayers.Event.stopObservingElement(this.element);
+        }
+        this.element = element;
+        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 
+            // (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);
+    },
+    
+    /**
+     * APIMethod: on
+     * Convenience method for registering listeners with a common scope.
+     *     Internally, this method calls <register> as shown in the examples
+     *     below.
+     *
+     * Example use:
+     * (code)
+     * // register a single listener for the "loadstart" event
+     * events.on({"loadstart", loadStartListener});
+     *
+     * // this is equivalent to the following
+     * events.register("loadstart", undefined, loadStartListener);
+     *
+     * // register multiple listeners to be called with the same `this` object
+     * events.on({
+     *     "loadstart": loadStartListener,
+     *     "loadend": loadEndListener,
+     *     scope: object
+     * });
+     *
+     * // this is equivalent to the following
+     * events.register("loadstart", object, loadStartListener);
+     * events.register("loadstart", object, loadEndListener);
+     * (end)
+     */
+    on: function(object) {
+        for(var type in object) {
+            if(type != "scope") {
+                this.register(type, object.scope, object[type]);
+            }
+        }
+    },
+
+    /**
+     * APIMethod: register
+     * 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 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: 
+     * :    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 
+     *                     'object' property.
+     * func - {Function} The callback function. If no callback is 
+     *                        specified, this function does nothing.
+     * 
+     * 
+     */
+    register: function (type, obj, func) {
+
+        if ( (func != null) && 
+             (OpenLayers.Util.indexOf(this.eventTypes, type) != -1) ) {
+
+            if (obj == null)  {
+                obj = this.object;
+            }
+            var listeners = this.listeners[type];
+            listeners.push( {obj: obj, func: func} );
+        }
+    },
+
+    /**
+     * 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 
+     *     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 
+     *                'object' property.
+     * func - {Function} The callback function. If no callback is 
+     *                   specified, this function does nothing.
+     */
+    registerPriority: function (type, obj, func) {
+
+        if (func != null) {
+            if (obj == null)  {
+                obj = this.object;
+            }
+            var listeners = this.listeners[type];
+            if (listeners != null) {
+                listeners.unshift( {obj: obj, func: func} );
+            }
+        }
+    },
+    
+    /**
+     * APIMethod: un
+     * Convenience method for unregistering listeners with a common scope.
+     *     Internally, this method calls <unregister> as shown in the examples
+     *     below.
+     *
+     * Example use:
+     * (code)
+     * // unregister a single listener for the "loadstart" event
+     * events.un({"loadstart", loadStartListener});
+     *
+     * // this is equivalent to the following
+     * events.unregister("loadstart", undefined, loadStartListener);
+     *
+     * // unregister multiple listeners with the same `this` object
+     * events.un({
+     *     "loadstart": loadStartListener,
+     *     "loadend": loadEndListener,
+     *     scope: object
+     * });
+     *
+     * // this is equivalent to the following
+     * events.unregister("loadstart", object, loadStartListener);
+     * events.unregister("loadstart", object, loadEndListener);
+     * (end)
+     */
+    un: function(object) {
+        for(var type in object) {
+            if(type != "scope") {
+                this.unregister(type, object.scope, object[type]);
+            }
+        }
+    },
+
+    /**
+     * APIMethod: unregister
+     *
+     * Parameters:
+     * type - {String} 
+     * obj - {Object} If none specified, defaults to this.object
+     * func - {Function} 
+     */
+    unregister: function (type, obj, func) {
+        if (obj == null)  {
+            obj = this.object;
+        }
+        var listeners = this.listeners[type];
+        if (listeners != null) {
+            for (var i=0, len=listeners.length; i<len; i++) {
+                if (listeners[i].obj == obj && listeners[i].func == func) {
+                    listeners.splice(i, 1);
+                    break;
+                }
+            }
+        }
+    },
+
+    /** 
+     * Method: remove
+     * Remove all listeners for a given event type. If type is not registered,
+     *     does nothing.
+     *
+     * Parameters:
+     * type - {String} 
+     */
+    remove: function(type) {
+        if (this.listeners[type] != null) {
+            this.listeners[type] = [];
+        }
+    },
+
+    /**
+     * APIMethod: triggerEvent
+     * Trigger a specified registered event.  
+     * 
+     * Parameters:
+     * type - {String} 
+     * evt - {Event}
+     *
+     * Returns:
+     * {Boolean} The last listener return.  If a listener returns false, the
+     *     chain of listeners will stop getting called.
+     */
+    triggerEvent: function (type, evt) {
+        var listeners = this.listeners[type];
+
+        // fast path
+        if(!listeners || listeners.length == 0) {
+            return;
+        }
+
+        // prep evt object with object & div references
+        if (evt == null) {
+            evt = {};
+        }
+        evt.object = this.object;
+        evt.element = this.element;
+        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
+        var listeners = listeners.slice(), continueChain;
+        for (var i=0, len=listeners.length; i<len; i++) {
+            var callback = listeners[i];
+            // bind the context to callback.obj
+            continueChain = callback.func.apply(callback.obj, [evt]);
+
+            if ((continueChain != undefined) && (continueChain == false)) {
+                // if callback returns false, execute no more callbacks.
+                break;
+            }
+        }
+        // don't fall through to other DOM elements
+        if (!this.fallThrough) {           
+            OpenLayers.Event.stop(evt, true);
+        }
+        return continueChain;
+    },
+
+    /**
+     * 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 
+     *     position.
+     *
+     * Parameters:
+     * 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 
+     *     within the page.
+     */
+    clearMouseCache: function() { 
+        this.element.scrolls = null;
+        this.element.lefttop = null;
+        this.element.offsets = null;
+    },      
+
+    /**
+     * Method: getMousePosition
+     * 
+     * Parameters:
+     * evt - {Event} 
+     * 
+     * Returns:
+     * {<OpenLayers.Pixel>} The current xy coordinate of the mouse, adjusted
+     *                      for offsets
+     */
+    getMousePosition: function (evt) {
+        if (!this.includeXY) {
+            this.clearMouseCache();
+        } else if (!this.element.hasScrollEvent) {
+            OpenLayers.Event.observe(window, "scroll", this.clearMouseListener);
+            this.element.hasScrollEvent = true;
+        }
+        
+        if (!this.element.scrolls) {
+            this.element.scrolls = [
+                (document.documentElement.scrollLeft
+                         || document.body.scrollLeft),
+                (document.documentElement.scrollTop
+                         || document.body.scrollTop)
+            ];
+        }
+
+        if (!this.element.lefttop) {
+            this.element.lefttop = [
+                (document.documentElement.clientLeft || 0),
+                (document.documentElement.clientTop  || 0)
+            ];
+        }
+        
+        if (!this.element.offsets) {
+            this.element.offsets = OpenLayers.Util.pagePosition(this.element);
+            this.element.offsets[0] += this.element.scrolls[0];
+            this.element.offsets[1] += this.element.scrolls[1];
+        }
+        return new OpenLayers.Pixel(
+            (evt.clientX + this.element.scrolls[0]) - this.element.offsets[0]
+                         - this.element.lefttop[0], 
+            (evt.clientY + this.element.scrolls[1]) - this.element.offsets[1]
+                         - this.element.lefttop[1]
+        ); 
+    },
+
+    CLASS_NAME: "OpenLayers.Events"
+});
diff --git a/lib/OpenLayers/Feature.js b/lib/OpenLayers/Feature.js
new file mode 100644
index 0000000..4da1faf
--- /dev/null
+++ b/lib/OpenLayers/Feature.js
@@ -0,0 +1,227 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Util.js
+ * @requires OpenLayers/Marker.js
+ * @requires OpenLayers/Popup/AnchoredBubble.js
+ */
+
+/**
+ * Class: OpenLayers.Feature
+ * Features are combinations of geography and attributes. The OpenLayers.Feature
+ *     class specifically combines a marker and a lonlat.
+ */
+OpenLayers.Feature = OpenLayers.Class({
+
+    /** 
+     * Property: layer 
+     * {<OpenLayers.Layer>} 
+     */
+    layer: null,
+
+    /** 
+     * Property: id 
+     * {String} 
+     */
+    id: null,
+    
+    /** 
+     * Property: lonlat 
+     * {<OpenLayers.LonLat>} 
+     */
+    lonlat: null,
+
+    /** 
+     * Property: data 
+     * {Object} 
+     */
+    data: null,
+
+    /** 
+     * Property: marker 
+     * {<OpenLayers.Marker>} 
+     */
+    marker: null,
+
+    /**
+     * APIProperty: popupClass
+     * {<OpenLayers.Class>} The class which will be used to instantiate
+     *     a new Popup. Default is <OpenLayers.Popup.AnchoredBubble>.
+     */
+    popupClass: OpenLayers.Popup.AnchoredBubble,
+
+    /** 
+     * Property: popup 
+     * {<OpenLayers.Popup>} 
+     */
+    popup: null,
+
+    /** 
+     * Constructor: OpenLayers.Feature
+     * Constructor for features.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer>} 
+     * lonlat - {<OpenLayers.LonLat>} 
+     * data - {Object} 
+     * 
+     * Returns:
+     * {<OpenLayers.Feature>}
+     */
+    initialize: function(layer, lonlat, data) {
+        this.layer = layer;
+        this.lonlat = lonlat;
+        this.data = (data != null) ? data : {};
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_"); 
+    },
+
+    /** 
+     * Method: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+
+        //remove the popup from the map
+        if ((this.layer != null) && (this.layer.map != null)) {
+            if (this.popup != null) {
+                this.layer.map.removePopup(this.popup);
+            }
+        }
+        // remove the marker from the layer
+        if (this.layer != null && this.marker != null) {
+            this.layer.removeMarker(this.marker);
+        }
+
+        this.layer = null;
+        this.id = null;
+        this.lonlat = null;
+        this.data = null;
+        if (this.marker != null) {
+            this.destroyMarker(this.marker);
+            this.marker = null;
+        }
+        if (this.popup != null) {
+            this.destroyPopup(this.popup);
+            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: 
+     * {<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() {
+
+        if (this.lonlat != null) {
+            this.marker = new OpenLayers.Marker(this.lonlat, this.data.icon);
+        }
+        return this.marker;
+    },
+
+    /**
+     * Method: destroyMarker
+     * Destroys marker.
+     * If user overrides the createMarker() function, s/he should be able
+     *   to also specify an alternative function for destroying it
+     */
+    destroyMarker: function() {
+        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. 
+     *  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: 
+     * 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.lonlat,
+                                                 this.data.popupSize,
+                                                 this.data.popupContentHTML,
+                                                 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 
+     *   should also be able to override the destruction
+     */
+    destroyPopup: function() {
+        if (this.popup) {
+            this.popup.feature = null;
+            this.popup.destroy();
+            this.popup = null;
+        }    
+    },
+
+    CLASS_NAME: "OpenLayers.Feature"
+});
diff --git a/lib/OpenLayers/Feature/Vector.js b/lib/OpenLayers/Feature/Vector.js
new file mode 100644
index 0000000..4abcf93
--- /dev/null
+++ b/lib/OpenLayers/Feature/Vector.js
@@ -0,0 +1,454 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+// TRASH THIS
+OpenLayers.State = {
+    /** states */
+    UNKNOWN: 'Unknown',
+    INSERT: 'Insert',
+    UPDATE: 'Update',
+    DELETE: 'Delete'
+};
+
+/**
+ * @requires OpenLayers/Feature.js
+ * @requires OpenLayers/Util.js
+ */
+
+/**
+ * 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 
+ * <OpenLayers.Feature.Vector.style> objects.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Feature>
+ */
+OpenLayers.Feature.Vector = OpenLayers.Class(OpenLayers.Feature, {
+
+    /** 
+     * Property: fid 
+     * {String} 
+     */
+    fid: null,
+    
+    /** 
+     * APIProperty: geometry 
+     * {<OpenLayers.Geometry>} 
+     */
+    geometry: null,
+
+    /** 
+     * APIProperty: attributes 
+     * {Object} This object holds arbitrary, serializable properties that
+     *     describe the feature.
+     */
+    attributes: null,
+
+    /**
+     * Property: bounds
+     * {<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. 
+     */
+    bounds: null,
+
+    /** 
+     * Property: state 
+     * {String} 
+     */
+    state: null,
+    
+    /** 
+     * APIProperty: style 
+     * {Object} 
+     */
+    style: null,
+
+    /**
+     * APIProperty: url
+     * {String} If this property is set it will be taken into account by
+     *     {<OpenLayers.HTTP>} when upadting or deleting the feature.
+     */
+    url: null,
+    
+    /**
+     * Property: renderIntent
+     * {String} rendering intent currently being used
+     */
+    renderIntent: "default",
+
+    /** 
+     * Constructor: OpenLayers.Feature.Vector
+     * 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. 
+     * style - {Object} An optional style object.
+     */
+    initialize: function(geometry, attributes, style) {
+        OpenLayers.Feature.prototype.initialize.apply(this,
+                                                      [null, null, attributes]);
+        this.lonlat = null;
+        this.geometry = geometry ? geometry : null;
+        this.state = null;
+        this.attributes = {};
+        if (attributes) {
+            this.attributes = OpenLayers.Util.extend(this.attributes,
+                                                     attributes);
+        }
+        this.style = style ? style : null; 
+    },
+    
+    /** 
+     * Method: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+        if (this.layer) {
+            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
+     *     properties.
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>} An exact clone of this vector feature.
+     */
+    clone: function () {
+        return new OpenLayers.Feature.Vector(
+            this.geometry ? this.geometry.clone() : null,
+            this.attributes,
+            this.style);
+    },
+
+    /**
+     * Method: onScreen
+     * Determine whether the feature is within the map viewport.  This method
+     *     tests for an intersection between the geometry and the viewport
+     *     bounds.  If a more effecient but less precise geometry bounds
+     *     intersection is desired, call the method with the boundsOnly
+     *     parameter true.
+     *
+     * Parameters:
+     * 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).
+     */
+    onScreen:function(boundsOnly) {
+        var onScreen = false;
+        if(this.layer && this.layer.map) {
+            var screenBounds = this.layer.map.getExtent();
+            if(boundsOnly) {
+                var featureBounds = this.geometry.getBounds();
+                onScreen = screenBounds.intersectsBounds(featureBounds);
+            } else {
+                var screenPoly = screenBounds.toGeometry();
+                onScreen = screenPoly.intersects(this.geometry);
+            }
+        }    
+        return onScreen;
+    },
+
+    /**
+     * Method: getVisibility
+     * Determine whether the feature is displayed or not. It may not displayed
+     *     because:
+     *     - its style display property is set to 'none',
+     *     - it doesn't belong to any layer,
+     *     - the styleMap creates a symbolizer with display property set to 'none'
+     *          for it,
+     *     - the layer which it belongs to is not visible.
+     * 
+     * Returns:
+     * {Boolean} The feature is currently displayed.
+     */
+    getVisibility: function() {
+        return !(this.style && this.style.display == 'none' ||
+                 !this.layer ||
+                 this.layer && this.layer.styleMap &&
+                 this.layer.styleMap.createSymbolizer(this, this.renderIntent).display == 'none' ||
+                 this.layer && !this.layer.getVisibility());
+    },
+    
+    /**
+     * 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
+     */
+    createMarker: function() {
+        return null;
+    },
+
+    /**
+     * 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
+     */
+    destroyMarker: function() {
+        // pass
+    },
+
+    /**
+     * 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
+     */
+    createPopup: function() {
+        return null;
+    },
+
+    /**
+     * Method: atPoint
+     * Determins whether the feature intersects with the specified location.
+     * 
+     * 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, 
+                                                    toleranceLat);
+        }
+        return atPoint;
+    },
+
+    /**
+     * Method: destroyPopup
+     * HACK - we need to decide if all vector features should be able to
+     * delete popups
+     */
+    destroyPopup: function() {
+        // pass
+    },
+
+    /**
+     * Method: move
+     * Moves the feature and redraws it at its new location
+     *
+     * Parameters:
+     * state - {OpenLayers.LonLat or OpenLayers.Pixel} the
+     *         location to which to move the feature.
+     */
+    move: function(location) {
+
+        if(!this.layer || !this.geometry.move){
+            //do nothing if no layer or immoveable geometry
+            return;
+        }
+
+        var pixel;
+        if (location.CLASS_NAME == "OpenLayers.LonLat") {
+            pixel = this.layer.getViewPortPxFromLonLat(location);
+        } 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),
+                           res * (lastPixel.y - pixel.y));
+        this.layer.drawFeature(this);
+        return lastPixel;
+    },
+    
+    /**
+     * Method: toState
+     * Sets the new state
+     *
+     * Parameters:
+     * state - {String} 
+     */
+    toState: function(state) {
+        if (state == OpenLayers.State.UPDATE) {
+            switch (this.state) {
+                case OpenLayers.State.UNKNOWN:
+                case OpenLayers.State.DELETE:
+                    this.state = state;
+                    break;
+                case OpenLayers.State.UPDATE:
+                case OpenLayers.State.INSERT:
+                    break;
+            }
+        } else if (state == OpenLayers.State.INSERT) {
+            switch (this.state) {
+                case OpenLayers.State.UNKNOWN:
+                    break;
+                default:
+                    this.state = state;
+                    break;
+            }
+        } else if (state == OpenLayers.State.DELETE) {
+            switch (this.state) {
+                case OpenLayers.State.INSERT:
+                    // the feature should be destroyed
+                    break;
+                case OpenLayers.State.DELETE:
+                    break;
+                case OpenLayers.State.UNKNOWN:
+                case OpenLayers.State.UPDATE:
+                    this.state = state;
+                    break;
+            }
+        } else if (state == OpenLayers.State.UNKNOWN) {
+            this.state = state;
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Feature.Vector"
+});
+
+
+/**
+ * Constant: OpenLayers.Feature.Vector.style
+ * 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. 
+ *     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 
+ * 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.
+ * strokeWidth - {Number} Pixel stroke width.  Default is 1.
+ * strokeLinecap - {String} Stroke cap type.  Default is "round".  [butt | round | square]
+ * strokeDashstyle - {String} Stroke dash style.  Default is "solid". [dot | dash | dashdot | longdash | longdashdot | solid]
+ * graphic - {Boolean} Set to false if no graphic is desired.
+ * pointRadius - {Number} Pixel point radius.  Default is 6.
+ * pointerEvents - {String}  Default is "visiblePainted".
+ * cursor - {String} Default is "".
+ * externalGraphic - {String} Url to an external graphic that will be used for rendering points.
+ * graphicWidth - {Number} Pixel width for sizing an external graphic.
+ * graphicHeight - {Number} Pixel height for sizing an external graphic.
+ * graphicOpacity - {Number} Opacity (0-1) for an external graphic.
+ * graphicXOffset - {Number} Pixel offset along the positive x axis for displacing an external graphic.
+ * graphicYOffset - {Number} Pixel offset along the positive y axis for displacing an external graphic.
+ * rotation - {Number} For point symbolizers, this is the rotation of a graphic in the clockwise direction about its center point (or any point off center as specified by graphicXOffset and graphicYOffset).
+ * graphicZIndex - {Number} The integer z-index value to use in rendering.
+ * graphicName - {String} Named graphic to use when rendering points.  Supported values include "circle" (default),
+ *     "square", "star", "x", "cross", "triangle".
+ * graphicTitle - {String} Tooltip for an external graphic. Only supported in Firefox and Internet Explorer.
+ * backgroundGraphic - {String} Url to a graphic to be used as the background under an externalGraphic.
+ * backgroundGraphicZIndex - {Number} The integer z-index value to use in rendering the background graphic.
+ * backgroundXOffset - {Number} The x offset (in pixels) for the background graphic.
+ * backgroundYOffset - {Number} The y offset (in pixels) for the background graphic.
+ * backgroundHeight - {Number} The height of the background graphic.  If not provided, the graphicHeight will be used.
+ * backgroundWidth - {Number} The width of the background width.  If not provided, the graphicWidth will be used.
+ * label - {String} The text for an optional label. For browsers that use the canvas renderer, this requires either
+ *     fillText or mozDrawText to be available.
+ * labelAlign - {String} Label alignment. This specifies the insertion point relative to the text. It is a string
+ *     composed of two characters. The first character is for the horizontal alignment, the second for the vertical
+ *     alignment. Valid values for horizontal alignment: "l"=left, "c"=center, "r"=right. Valid values for vertical
+ *     alignment: "t"=top, "m"=middle, "b"=bottom. Example values: "lt", "cm", "rb". The canvas renderer does not
+ *     support vertical alignment, it will always use "b".
+ * labelXOffset - {Number} Pixel offset along the positive x axis for displacing the label.
+ * labelYOffset - {Number} Pixel offset along the positive y axis for displacing the label.
+ * labelSelect - {Boolean} If set to true, labels will be selectable using SelectFeature or similar controls.
+ *     Default is false.
+ * fontColor - {String} The font color for the label, to be provided like CSS.
+ * fontOpacity - {Number} Opacity (0-1) for the label
+ * fontFamily - {String} The font family for the label, to be provided like in CSS.
+ * 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, 
+        hoverFillColor: "white",
+        hoverFillOpacity: 0.8,
+        strokeColor: "#ee9900",
+        strokeOpacity: 1,
+        strokeWidth: 1,
+        strokeLinecap: "round",
+        strokeDashstyle: "solid",
+        hoverStrokeColor: "red",
+        hoverStrokeOpacity: 1,
+        hoverStrokeWidth: 0.2,
+        pointRadius: 6,
+        hoverPointRadius: 1,
+        hoverPointUnit: "%",
+        pointerEvents: "visiblePainted",
+        cursor: "inherit"
+    },
+    'select': {
+        fillColor: "blue",
+        fillOpacity: 0.4, 
+        hoverFillColor: "white",
+        hoverFillOpacity: 0.8,
+        strokeColor: "blue",
+        strokeOpacity: 1,
+        strokeWidth: 2,
+        strokeLinecap: "round",
+        strokeDashstyle: "solid",
+        hoverStrokeColor: "red",
+        hoverStrokeOpacity: 1,
+        hoverStrokeWidth: 0.2,
+        pointRadius: 6,
+        hoverPointRadius: 1,
+        hoverPointUnit: "%",
+        pointerEvents: "visiblePainted",
+        cursor: "pointer"
+    },
+    'temporary': {
+        fillColor: "#66cccc",
+        fillOpacity: 0.2, 
+        hoverFillColor: "white",
+        hoverFillOpacity: 0.8,
+        strokeColor: "#66cccc",
+        strokeOpacity: 1,
+        strokeLinecap: "round",
+        strokeWidth: 2,
+        strokeDashstyle: "solid",
+        hoverStrokeColor: "red",
+        hoverStrokeOpacity: 1,
+        hoverStrokeWidth: 0.2,
+        pointRadius: 6,
+        hoverPointRadius: 1,
+        hoverPointUnit: "%",
+        pointerEvents: "visiblePainted",
+        cursor: "inherit"
+    },
+    'delete': {
+        display: "none"
+    }
+};    
diff --git a/lib/OpenLayers/Feature/WFS.js b/lib/OpenLayers/Feature/WFS.js
new file mode 100644
index 0000000..2abc352
--- /dev/null
+++ b/lib/OpenLayers/Feature/WFS.js
@@ -0,0 +1,80 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Feature.js
+ */
+
+/**
+ * Class: OpenLayers.Feature.WFS
+ * WFS handling class, for use as a featureClass on the WFS layer for handling
+ * 'point' WFS types. Good for subclassing when creating a custom WFS like
+ * XML application.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Feature>
+ */
+OpenLayers.Feature.WFS = OpenLayers.Class(OpenLayers.Feature, {
+      
+    /** 
+     * Constructor: OpenLayers.Feature.WFS
+     * Create a WFS feature.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer>} 
+     * xmlNode - {XMLNode} 
+     */
+    initialize: function(layer, xmlNode) {
+        var newArguments = arguments;
+        var data = this.processXMLNode(xmlNode);
+        newArguments = new Array(layer, data.lonlat, data);
+        OpenLayers.Feature.prototype.initialize.apply(this, newArguments);
+        this.createMarker();
+        this.layer.addMarker(this.marker);
+    },
+    
+    /** 
+     * Method: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+        if (this.marker != null) {
+            this.layer.removeMarker(this.marker);  
+        }
+        OpenLayers.Feature.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * Method: processXMLNode
+     * When passed an xmlNode, parses it for a GML point, and passes
+     * back an object describing that point.
+     *
+     * For subclasses of Feature.WFS, this is the feature to change.
+     *
+     * Parameters:
+     * xmlNode - {XMLNode} 
+     * 
+     * Returns:
+     * {Object} Data Object with 'id', 'lonlat', and private properties set
+     */
+    processXMLNode: function(xmlNode) {
+        //this should be overridden by subclasses
+        // must return an Object with 'id' and 'lonlat' values set
+        var point = OpenLayers.Ajax.getElementsByTagNameNS(xmlNode, "http://www.opengis.net/gml", "gml", "Point");
+        var text  = OpenLayers.Util.getXmlNodeValue(OpenLayers.Ajax.getElementsByTagNameNS(point[0], "http://www.opengis.net/gml","gml", "coordinates")[0]);
+        var floats = text.split(",");
+        return {lonlat: new OpenLayers.LonLat(parseFloat(floats[0]),
+                                              parseFloat(floats[1])),
+                id: null};
+
+    },
+
+    CLASS_NAME: "OpenLayers.Feature.WFS"
+});
+  
+  
+  
+  
+
diff --git a/lib/OpenLayers/Filter.js b/lib/OpenLayers/Filter.js
new file mode 100644
index 0000000..ae81981
--- /dev/null
+++ b/lib/OpenLayers/Filter.js
@@ -0,0 +1,68 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Util.js
+ * @requires OpenLayers/Style.js
+ */
+
+/**
+ * Class: OpenLayers.Filter
+ * This class represents an OGC Filter.
+ */
+OpenLayers.Filter = OpenLayers.Class({
+    
+    /** 
+     * Constructor: OpenLayers.Filter
+     * This is an abstract class.  Create an instance of a filter subclass.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     * 
+     * Returns:
+     * {<OpenLayers.Filter>}
+     */
+    initialize: function(options) {
+        OpenLayers.Util.extend(this, options);
+    },
+
+    /** 
+     * APIMethod: destroy
+     * Remove reference to anything added.
+     */
+    destroy: function() {
+    },
+
+    /**
+     * APIMethod: evaluate
+     * Evaluates this filter in a specific context.  Should be implemented by
+     *     subclasses.
+     * 
+     * Parameters:
+     * context - {Object} Context to use in evaluating the filter.  If a vector
+     *     feature is provided, the feature.attributes will be used as context.
+     * 
+     * Returns:
+     * {Boolean} The filter applies.
+     */
+    evaluate: function(context) {
+        return true;
+    },
+    
+    /**
+     * APIMethod: clone
+     * Clones this filter. Should be implementted by subclasses.
+     * 
+     * Returns:
+     * {<OpenLayers.Filter>} Clone of this filter.
+     */
+    clone: function() {
+        return null;
+    },
+    
+    CLASS_NAME: "OpenLayers.Filter"
+});
diff --git a/lib/OpenLayers/Filter/Comparison.js b/lib/OpenLayers/Filter/Comparison.js
new file mode 100644
index 0000000..cf8c0eb
--- /dev/null
+++ b/lib/OpenLayers/Filter/Comparison.js
@@ -0,0 +1,258 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Filter.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Filter.Comparison
+ * This class represents a comparison filter.
+ * 
+ * Inherits from
+ * - <OpenLayers.Filter>
+ */
+OpenLayers.Filter.Comparison = OpenLayers.Class(OpenLayers.Filter, {
+
+    /**
+     * APIProperty: type
+     * {String} type: type of the comparison. This is one of
+     * - OpenLayers.Filter.Comparison.EQUAL_TO                 = "==";
+     * - OpenLayers.Filter.Comparison.NOT_EQUAL_TO             = "!=";
+     * - OpenLayers.Filter.Comparison.LESS_THAN                = "<";
+     * - OpenLayers.Filter.Comparison.GREATER_THAN             = ">";
+     * - OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO    = "<=";
+     * - OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = ">=";
+     * - OpenLayers.Filter.Comparison.BETWEEN                  = "..";
+     * - OpenLayers.Filter.Comparison.LIKE                     = "~"; 
+     */
+    type: null,
+    
+    /**
+     * APIProperty: property
+     * {String}
+     * name of the context property to compare
+     */
+    property: null,
+    
+    /**
+     * APIProperty: value
+     * {Number} or {String}
+     * comparison value for binary comparisons. In the case of a String, this
+     * can be a combination of text and propertyNames in the form
+     * "literal ${propertyName}"
+     */
+    value: null,
+    
+    /**
+     * Property: matchCase
+     * {Boolean} Force case sensitive searches for EQUAL_TO and NOT_EQUAL_TO
+     *     comparisons.  The Filter Encoding 1.1 specification added a matchCase
+     *     attribute to ogc:PropertyIsEqualTo and ogc:PropertyIsNotEqualTo
+     *     elements.  This property will be serialized with those elements only
+     *     if using the v1.1.0 filter format. However, when evaluating filters
+     *     here, the matchCase property will always be respected (for EQUAL_TO
+     *     and NOT_EQUAL_TO).  Default is true.
+     */
+    matchCase: true,
+    
+    /**
+     * APIProperty: lowerBoundary
+     * {Number} or {String}
+     * lower boundary for between comparisons. In the case of a String, this
+     * can be a combination of text and propertyNames in the form
+     * "literal ${propertyName}"
+     */
+    lowerBoundary: null,
+    
+    /**
+     * APIProperty: upperBoundary
+     * {Number} or {String}
+     * upper boundary for between comparisons. In the case of a String, this
+     * can be a combination of text and propertyNames in the form
+     * "literal ${propertyName}"
+     */
+    upperBoundary: null,
+
+    /** 
+     * Constructor: OpenLayers.Filter.Comparison
+     * Creates a comparison rule.
+     *
+     * Parameters:
+     * options - {Object} An optional object with properties to set on the
+     *           rule
+     * 
+     * Returns:
+     * {<OpenLayers.Filter.Comparison>}
+     */
+    initialize: function(options) {
+        OpenLayers.Filter.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: evaluate
+     * Evaluates this filter in a specific context.
+     * 
+     * Parameters:
+     * context - {Object} Context to use in evaluating the filter.  If a vector
+     *     feature is provided, the feature.attributes will be used as context.
+     * 
+     * Returns:
+     * {Boolean} The filter applies.
+     */
+    evaluate: function(context) {
+        if (context instanceof OpenLayers.Feature.Vector) {
+            context = context.attributes;
+        }
+        var result = false;
+        var got = context[this.property];
+        switch(this.type) {
+            case OpenLayers.Filter.Comparison.EQUAL_TO:
+                var exp = this.value;
+                if(!this.matchCase &&
+                   typeof got == "string" && typeof exp == "string") {
+                    result = (got.toUpperCase() == exp.toUpperCase());
+                } else {
+                    result = (got == exp);
+                }
+                break;
+            case OpenLayers.Filter.Comparison.NOT_EQUAL_TO:
+                var exp = this.value;
+                if(!this.matchCase &&
+                   typeof got == "string" && typeof exp == "string") {
+                    result = (got.toUpperCase() != exp.toUpperCase());
+                } else {
+                    result = (got != exp);
+                }
+                break;
+            case OpenLayers.Filter.Comparison.LESS_THAN:
+                result = got < this.value;
+                break;
+            case OpenLayers.Filter.Comparison.GREATER_THAN:
+                result = got > this.value;
+                break;
+            case OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO:
+                result = got <= this.value;
+                break;
+            case OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO:
+                result = got >= this.value;
+                break;
+            case OpenLayers.Filter.Comparison.BETWEEN:
+                result = (got >= this.lowerBoundary) &&
+                    (got <= this.upperBoundary);
+                break;
+            case OpenLayers.Filter.Comparison.LIKE:
+                var regexp = new RegExp(this.value, "gi");
+                result = regexp.test(got);
+                break;
+        }
+        return result;
+    },
+    
+    /**
+     * APIMethod: value2regex
+     * Converts the value of this rule into a regular expression string,
+     * according to the wildcard characters specified. This method has to
+     * be called after instantiation of this class, if the value is not a
+     * regular expression already.
+     * 
+     * Parameters:
+     * wildCard   - {<Char>} wildcard character in the above value, default
+     *              is "*"
+     * singleChar - {<Char>) single-character wildcard in the above value
+     *              default is "."
+     * escape     - {<Char>) escape character in the above value, default is
+     *              "!"
+     * 
+     * Returns:
+     * {String} regular expression string
+     */
+    value2regex: function(wildCard, singleChar, escapeChar) {
+        if (wildCard == ".") {
+            var msg = "'.' is an unsupported wildCard character for "+
+                    "OpenLayers.Filter.Comparison";
+            OpenLayers.Console.error(msg);
+            return null;
+        }
+        
+
+        // set UMN MapServer defaults for unspecified parameters
+        wildCard = wildCard ? wildCard : "*";
+        singleChar = singleChar ? singleChar : ".";
+        escapeChar = escapeChar ? escapeChar : "!";
+        
+        this.value = this.value.replace(
+                new RegExp("\\"+escapeChar+"(.|$)", "g"), "\\$1");
+        this.value = this.value.replace(
+                new RegExp("\\"+singleChar, "g"), ".");
+        this.value = this.value.replace(
+                new RegExp("\\"+wildCard, "g"), ".*");
+        this.value = this.value.replace(
+                new RegExp("\\\\.\\*", "g"), "\\"+wildCard);
+        this.value = this.value.replace(
+                new RegExp("\\\\\\.", "g"), "\\"+singleChar);
+        
+        return this.value;
+    },
+    
+    /**
+     * Method: regex2value
+     * Convert the value of this rule from a regular expression string into an
+     *     ogc literal string using a wildCard of *, a singleChar of ., and an
+     *     escape of !.  Leaves the <value> property unmodified.
+     * 
+     * Returns:
+     * {String} A string value.
+     */
+    regex2value: function() {
+        
+        var value = this.value;
+        
+        // replace ! with !!
+        value = value.replace(/!/g, "!!");
+
+        // replace \. with !. (watching out for \\.)
+        value = value.replace(/(\\)?\\\./g, function($0, $1) {
+            return $1 ? $0 : "!.";
+        });
+        
+        // replace \* with #* (watching out for \\*)
+        value = value.replace(/(\\)?\\\*/g, function($0, $1) {
+            return $1 ? $0 : "!*";
+        });
+        
+        // replace \\ with \
+        value = value.replace(/\\\\/g, "\\");
+
+        // convert .* to * (the sequence #.* is not allowed)
+        value = value.replace(/\.\*/g, "*");
+        
+        return value;
+    },
+    
+    /**
+     * APIMethod: clone
+     * Clones this filter.
+     * 
+     * Returns:
+     * {<OpenLayers.Filter.Comparison>} Clone of this filter.
+     */
+    clone: function() {
+        return OpenLayers.Util.extend(new OpenLayers.Filter.Comparison(), this);
+    },
+    
+    CLASS_NAME: "OpenLayers.Filter.Comparison"
+});
+
+
+OpenLayers.Filter.Comparison.EQUAL_TO                 = "==";
+OpenLayers.Filter.Comparison.NOT_EQUAL_TO             = "!=";
+OpenLayers.Filter.Comparison.LESS_THAN                = "<";
+OpenLayers.Filter.Comparison.GREATER_THAN             = ">";
+OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO    = "<=";
+OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = ">=";
+OpenLayers.Filter.Comparison.BETWEEN                  = "..";
+OpenLayers.Filter.Comparison.LIKE                     = "~";
diff --git a/lib/OpenLayers/Filter/FeatureId.js b/lib/OpenLayers/Filter/FeatureId.js
new file mode 100644
index 0000000..b45c4a0
--- /dev/null
+++ b/lib/OpenLayers/Filter/FeatureId.js
@@ -0,0 +1,81 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Filter.js
+ */
+
+/**
+ * Class: OpenLayers.Filter.FeatureId
+ * This class represents a ogc:FeatureId Filter, as being used for rule-based SLD
+ * styling
+ * 
+ * Inherits from
+ * - <OpenLayers.Filter>
+ */
+OpenLayers.Filter.FeatureId = OpenLayers.Class(OpenLayers.Filter, {
+
+    /** 
+     * APIProperty: fids
+     * {Array(String)} Feature Ids to evaluate this rule against. To be passed
+     * To be passed inside the params object.
+     */
+    fids: null,
+    
+    /** 
+     * Constructor: OpenLayers.Filter.FeatureId
+     * Creates an ogc:FeatureId rule.
+     *
+     * Parameters:
+     * options - {Object} An optional object with properties to set on the
+     *           rule
+     * 
+     * Returns:
+     * {<OpenLayers.Filter.FeatureId>}
+     */
+    initialize: function(options) {
+        this.fids = [];
+        OpenLayers.Filter.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: evaluate
+     * evaluates this rule for a specific feature
+     * 
+     * Parameters:
+     * feature - {<OpenLayers.Feature>} feature to apply the rule to.
+     *           For vector features, the check is run against the fid,
+     *           for plain features against the id.
+     * 
+     * Returns:
+     * {Boolean} true if the rule applies, false if it does not
+     */
+    evaluate: function(feature) {
+        for (var i=0, len=this.fids.length; i<len; i++) {
+            var fid = feature.fid || feature.id;
+            if (fid == this.fids[i]) {
+                return true;
+            }
+        }
+        return false;
+    },
+    
+    /**
+     * APIMethod: clone
+     * Clones this filter.
+     * 
+     * Returns:
+     * {<OpenLayers.Filter.FeatureId>} Clone of this filter.
+     */
+    clone: function() {
+        var filter = new OpenLayers.Filter.FeatureId();
+        OpenLayers.Util.extend(filter, this);
+        filter.fids = this.fids.slice();
+        return filter;
+    },
+    
+    CLASS_NAME: "OpenLayers.Filter.FeatureId"
+});
diff --git a/lib/OpenLayers/Filter/Logical.js b/lib/OpenLayers/Filter/Logical.js
new file mode 100644
index 0000000..71e5bfc
--- /dev/null
+++ b/lib/OpenLayers/Filter/Logical.js
@@ -0,0 +1,119 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Filter.js
+ */
+
+/**
+ * Class: OpenLayers.Filter.Logical
+ * This class represents ogc:And, ogc:Or and ogc:Not rules.
+ * 
+ * Inherits from
+ * - <OpenLayers.Filter>
+ */
+OpenLayers.Filter.Logical = OpenLayers.Class(OpenLayers.Filter, {
+
+    /**
+     * APIProperty: filters
+     * {Array(<OpenLayers.Filter>)} Child filters for this filter.
+     */
+    filters: null, 
+     
+    /**
+     * APIProperty: type
+     * {String} type of logical operator. Available types are:
+     * - OpenLayers.Filter.Logical.AND = "&&";
+     * - OpenLayers.Filter.Logical.OR  = "||";
+     * - OpenLayers.Filter.Logical.NOT = "!";
+     */
+    type: null,
+
+    /** 
+     * Constructor: OpenLayers.Filter.Logical
+     * Creates a logical filter (And, Or, Not).
+     *
+     * Parameters:
+     * options - {Object} An optional object with properties to set on the
+     *     filter.
+     * 
+     * Returns:
+     * {<OpenLayers.Filter.Logical>}
+     */
+    initialize: function(options) {
+        this.filters = [];
+        OpenLayers.Filter.prototype.initialize.apply(this, [options]);
+    },
+    
+    /** 
+     * APIMethod: destroy
+     * Remove reference to child filters.
+     */
+    destroy: function() {
+        this.filters = null;
+        OpenLayers.Filter.prototype.destroy.apply(this);
+    },
+
+    /**
+     * APIMethod: evaluate
+     * Evaluates this filter in a specific context.
+     * 
+     * Parameters:
+     * context - {Object} Context to use in evaluating the filter.  A vector
+     *     feature may also be provided to evaluate feature attributes in 
+     *     comparison filters or geometries in spatial filters.
+     * 
+     * Returns:
+     * {Boolean} The filter applies.
+     */
+    evaluate: function(context) {
+        switch(this.type) {
+            case OpenLayers.Filter.Logical.AND:
+                for (var i=0, len=this.filters.length; i<len; i++) {
+                    if (this.filters[i].evaluate(context) == false) {
+                        return false;
+                    }
+                }
+                return true;
+                
+            case OpenLayers.Filter.Logical.OR:
+                for (var i=0, len=this.filters.length; i<len; i++) {
+                    if (this.filters[i].evaluate(context) == true) {
+                        return true;
+                    }
+                }
+                return false;
+            
+            case OpenLayers.Filter.Logical.NOT:
+                return (!this.filters[0].evaluate(context));
+        }
+    },
+    
+    /**
+     * APIMethod: clone
+     * Clones this filter.
+     * 
+     * Returns:
+     * {<OpenLayers.Filter.Logical>} Clone of this filter.
+     */
+    clone: function() {
+        var filters = [];        
+        for(var i=0, len=this.filters.length; i<len; ++i) {
+            filters.push(this.filters[i].clone());
+        }
+        return new OpenLayers.Filter.Logical({
+            type: this.type,
+            filters: filters
+        });
+    },
+    
+    CLASS_NAME: "OpenLayers.Filter.Logical"
+});
+
+
+OpenLayers.Filter.Logical.AND = "&&";
+OpenLayers.Filter.Logical.OR  = "||";
+OpenLayers.Filter.Logical.NOT = "!";
diff --git a/lib/OpenLayers/Filter/Spatial.js b/lib/OpenLayers/Filter/Spatial.js
new file mode 100644
index 0000000..11f86d7
--- /dev/null
+++ b/lib/OpenLayers/Filter/Spatial.js
@@ -0,0 +1,128 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Filter.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Filter.Spatial
+ * This class represents a spatial filter.
+ * Currently implemented: BBOX, DWithin and Intersects
+ * 
+ * Inherits from
+ * - <OpenLayers.Filter>
+ */
+OpenLayers.Filter.Spatial = OpenLayers.Class(OpenLayers.Filter, {
+
+    /**
+     * APIProperty: type
+     * {String} Type of spatial filter.
+     *
+     * The type should be one of:
+     * - OpenLayers.Filter.Spatial.BBOX
+     * - OpenLayers.Filter.Spatial.INTERSECTS
+     * - OpenLayers.Filter.Spatial.DWITHIN
+     * - OpenLayers.Filter.Spatial.WITHIN
+     * - OpenLayers.Filter.Spatial.CONTAINS
+     */
+    type: null,
+    
+    /**
+     * APIProperty: property
+     * {String} Name of the context property to compare.
+     */
+    property: null,
+    
+    /**
+     * APIProperty: value
+     * {<OpenLayers.Bounds> || <OpenLayers.Geometry>} The bounds or geometry
+     *     to be used by the filter.  Use bounds for BBOX filters and geometry
+     *     for INTERSECTS or DWITHIN filters.
+     */
+    value: null,
+
+    /**
+     * APIProperty: distance
+     * {Number} The distance to use in a DWithin spatial filter.
+     */
+    distance: null,
+
+    /**
+     * APIProperty: distanceUnits
+     * {String} The units to use for the distance, e.g. 'm'.
+     */
+    distanceUnits: null,
+    
+    /** 
+     * Constructor: OpenLayers.Filter.Spatial
+     * Creates a spatial filter.
+     *
+     * Parameters:
+     * options - {Object} An optional object with properties to set on the
+     *     filter.
+     * 
+     * Returns:
+     * {<OpenLayers.Filter.Spatial>}
+     */
+    initialize: function(options) {
+        OpenLayers.Filter.prototype.initialize.apply(this, [options]);
+    },
+
+   /**
+    * Method: evaluate
+    * Evaluates this filter for a specific feature.
+    * 
+    * Parameters:
+    * feature - {<OpenLayers.Feature.Vector>} feature to apply the filter to.
+    * 
+    * Returns:
+    * {Boolean} The feature meets filter criteria.
+    */
+    evaluate: function(feature) {
+        var intersect = false;
+        switch(this.type) {
+            case OpenLayers.Filter.Spatial.BBOX:
+            case OpenLayers.Filter.Spatial.INTERSECTS:
+                if(feature.geometry) {
+                    var geom = this.value;
+                    if(this.value.CLASS_NAME == "OpenLayers.Bounds") {
+                        geom = this.value.toGeometry();
+                    }
+                    if(feature.geometry.intersects(geom)) {
+                        intersect = true;
+                    }
+                }
+                break;
+            default:
+                OpenLayers.Console.error(
+                    OpenLayers.i18n("filterEvaluateNotImplemented"));
+                break;
+        }
+        return intersect;
+    },
+
+    /**
+     * APIMethod: clone
+     * Clones this filter.
+     * 
+     * Returns:
+     * {<OpenLayers.Filter.Spatial>} Clone of this filter.
+     */
+    clone: function() {
+        var options = OpenLayers.Util.applyDefaults({
+            value: this.value && this.value.clone && this.value.clone()
+        }, this);
+        return new OpenLayers.Filter.Spatial(options);
+    },
+    CLASS_NAME: "OpenLayers.Filter.Spatial"
+});
+
+OpenLayers.Filter.Spatial.BBOX = "BBOX";
+OpenLayers.Filter.Spatial.INTERSECTS = "INTERSECTS";
+OpenLayers.Filter.Spatial.DWITHIN = "DWITHIN";
+OpenLayers.Filter.Spatial.WITHIN = "WITHIN";
+OpenLayers.Filter.Spatial.CONTAINS = "CONTAINS";
diff --git a/lib/OpenLayers/Format.js b/lib/OpenLayers/Format.js
new file mode 100644
index 0000000..751584f
--- /dev/null
+++ b/lib/OpenLayers/Format.js
@@ -0,0 +1,123 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Util.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Format
+ * Base class for format reading/writing a variety of formats.  Subclasses
+ *     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
+     *     internalProjection, the format will reproject the geometries it
+     *     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 
+     *     provided via proj4js or via a custom transformation function. See
+     *     {<OpenLayers.Projection.addTransform>} for more information on
+     *     custom transformations.
+     */
+    externalProjection: null,
+
+    /**
+     * APIProperty: internalProjection
+     * {<OpenLayers.Projection>} When passed a externalProjection and
+     *     internalProjection, the format will reproject the geometries it
+     *     reads or writes. The internalProjection is the projection used by
+     *     the geometries which are returned by read or which are passed into
+     *     write.  In order to reproject, a projection transformation function
+     *     for the 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.
+     */
+    internalProjection: null,
+
+    /**
+     * APIProperty: data
+     * {Object} When <keepData> is true, this is the parsed string sent to
+     *     <read>.
+     */
+    data: null,
+
+    /**
+     * APIProperty: keepData
+     * {Object} Maintain a reference (<data>) to the most recently read data.
+     *     Default is false.
+     */
+    keepData: false,
+
+    /**
+     * Constructor: OpenLayers.Format
+     * Instances of this class are not useful.  See one of the subclasses.
+     *
+     * Parameters:
+     * options - {Object} An optional object with properties to set on the
+     *           format
+     *
+     * Valid options:
+     * keepData - {Boolean} If true, upon <read>, the data property will be
+     *     set to the parsed object (e.g. the json or xml object).
+     *
+     * Returns:
+     * An instance of OpenLayers.Format
+     */
+    initialize: function(options) {
+        OpenLayers.Util.extend(this, options);
+        this.options = options;
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Clean up.
+     */
+    destroy: function() {
+    },
+
+    /**
+     * Method: read
+     * Read data from a string, and return an object whose type depends on the
+     * subclass. 
+     * 
+     * Parameters:
+     * data - {string} Data to read/parse.
+     *
+     * Returns:
+     * Depends on the subclass
+     */
+    read: function(data) {
+        OpenLayers.Console.userError(OpenLayers.i18n("readNotImplemented"));
+    },
+    
+    /**
+     * Method: write
+     * Accept an object, and return a string. 
+     *
+     * Parameters:
+     * object - {Object} Object to be serialized
+     *
+     * Returns:
+     * {String} A string representation of the object.
+     */
+    write: function(object) {
+        OpenLayers.Console.userError(OpenLayers.i18n("writeNotImplemented"));
+    },
+
+    CLASS_NAME: "OpenLayers.Format"
+});     
diff --git a/lib/OpenLayers/Format/ArcXML.js b/lib/OpenLayers/Format/ArcXML.js
new file mode 100644
index 0000000..7111422
--- /dev/null
+++ b/lib/OpenLayers/Format/ArcXML.js
@@ -0,0 +1,1028 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Geometry/Polygon.js
+ * @requires OpenLayers/Geometry/Point.js
+ * @requires OpenLayers/Geometry/MultiPolygon.js
+ * @requires OpenLayers/Geometry/LinearRing.js
+ */
+
+/**
+ * Class: OpenLayers.Format.ArcXML
+ * Read/Wite ArcXML. Create a new instance with the <OpenLayers.Format.ArcXML>
+ *     constructor.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format>
+ */
+OpenLayers.Format.ArcXML = OpenLayers.Class(OpenLayers.Format.XML, {
+
+    /**
+     * Property: fontStyleKeys
+     * {Array} List of keys used in font styling.
+     */
+    fontStyleKeys: [
+        'antialiasing', 'blockout', 'font', 'fontcolor','fontsize', 'fontstyle',
+        'glowing', 'interval', 'outline', 'printmode', 'shadow', 'transparency'
+    ],
+
+    /**
+     * Property: request
+     * A get_image request destined for an ArcIMS server.
+     */
+    request: null,
+    
+    /**
+     * Property: response
+     * A parsed response from an ArcIMS server.
+     */
+    response: null,
+
+    /**
+     * Constructor: OpenLayers.Format.ArcXML
+     * Create a new parser/writer for ArcXML.  Create an instance of this class
+     *    to begin authoring a request to an ArcIMS service.  This is used
+     *    primarily by the ArcIMS layer, but could be used to do other wild
+     *    stuff, like geocoding.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        this.request = new OpenLayers.Format.ArcXML.Request();
+        this.response = new OpenLayers.Format.ArcXML.Response();
+
+        if (options) {
+            if (options.requesttype == "feature") {
+                this.request.get_image = null;
+            
+                var qry = this.request.get_feature.query;
+                this.addCoordSys(qry.featurecoordsys, options.featureCoordSys);
+                this.addCoordSys(qry.filtercoordsys, options.filterCoordSys);
+            
+                if (options.polygon) {
+                    qry.isspatial = true;
+                    qry.spatialfilter.polygon = options.polygon;
+                } else if (options.envelope) {
+                    qry.isspatial = true;
+                    qry.spatialfilter.envelope = {minx:0, miny:0, maxx:0, maxy:0};
+                    this.parseEnvelope(qry.spatialfilter.envelope, options.envelope);
+                }
+            } else if (options.requesttype == "image") {
+                this.request.get_feature = null;
+            
+                var props = this.request.get_image.properties;
+                this.parseEnvelope(props.envelope, options.envelope);
+            
+                this.addLayers(props.layerlist, options.layers);
+                this.addImageSize(props.imagesize, options.tileSize);
+                this.addCoordSys(props.featurecoordsys, options.featureCoordSys);
+                this.addCoordSys(props.filtercoordsys, options.filterCoordSys);
+            } else {
+                // if an arcxml object is being created with no request type, it is
+                // probably going to consume a response, so do not throw an error if
+                // the requesttype is not defined
+                this.request = null;
+            }
+        }
+        
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Method: parseEnvelope
+     * Parse an array of coordinates into an ArcXML envelope structure.
+     *
+     * Parameters:
+     * env - {Object} An envelope object that will contain the parsed coordinates.
+     * arr - {Array(double)} An array of coordinates in the order: [ minx, miny, maxx, maxy ]
+     */
+    parseEnvelope: function(env, arr) {
+        if (arr && arr.length == 4) {          
+            env.minx = arr[0];
+            env.miny = arr[1];
+            env.maxx = arr[2];
+            env.maxy = arr[3];
+        }
+    },
+    
+    /** 
+     * Method: addLayers
+     * Add a collection of layers to another collection of layers. Each layer in the list is tuple of
+     * { id, visible }.  These layer collections represent the 
+     * /ARCXML/REQUEST/get_image/PROPERTIES/LAYERLIST/LAYERDEF items in ArcXML
+     *
+     * TODO: Add support for dynamic layer rendering.
+     *
+     * Parameters:
+     * ll - {Array({id,visible})} A list of layer definitions.
+     * lyrs - {Array({id,visible})} A list of layer definitions.
+     */
+    addLayers: function(ll, lyrs) {
+        for(var lind = 0, len=lyrs.length; lind < len; lind++) {
+            ll.push(lyrs[lind]);
+        }
+    },
+    
+    /**
+     * Method: addImageSize
+     * Set the size of the requested image.
+     *
+     * Parameters:
+     * imsize - {Object} An ArcXML imagesize object.
+     * olsize - {OpenLayers.Size} The image size to set.
+     */
+    addImageSize: function(imsize, olsize) {
+        if (olsize !== null) {
+            imsize.width = olsize.w;
+            imsize.height = olsize.h;
+            imsize.printwidth = olsize.w;
+            imsize.printheight = olsize.h;
+        }
+    },
+
+    /**
+     * Method: addCoordSys
+     * Add the coordinate system information to an object. The object may be 
+     *
+     * Parameters:
+     * featOrFilt - {Object} A featurecoordsys or filtercoordsys ArcXML structure.
+     * fsys - {String} or {OpenLayers.Projection} or {filtercoordsys} or 
+     * {featurecoordsys} A projection representation. If it's a {String}, 
+     * the value is assumed to be the SRID.  If it's a {OpenLayers.Projection} 
+     * AND Proj4js is available, the projection number and name are extracted 
+     * from there.  If it's a filter or feature ArcXML structure, it is copied.
+     */
+    addCoordSys: function(featOrFilt, fsys) {
+        if (typeof fsys == "string") {
+            featOrFilt.id = parseInt(fsys);
+            featOrFilt.string = fsys;
+        }
+        // is this a proj4js instance?
+        else if (typeof fsys == "object" && fsys.proj !== null){
+            featOrFilt.id = fsys.proj.srsProjNumber;
+            featOrFilt.string = fsys.proj.srsCode;
+        } else {
+            featOrFilt = fsys;
+        }
+    },
+
+    /**
+     * APIMethod: iserror
+     * Check to see if the response from the server was an error.
+     *
+     * Parameters:
+     * data - {String} or {DOMElement} data to read/parse. If nothing is supplied,
+     * the current response is examined.
+     *
+     * Returns:
+     * {Boolean} true if the response was an error.
+     */
+    iserror: function(data) {
+        var ret = null; 
+        
+        if (!data) {
+            ret = (this.response.error !== '');
+        } else {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+            var errorNodes = data.documentElement.getElementsByTagName("ERROR");
+            ret = (errorNodes !== null && errorNodes.length > 0);
+        }
+
+        return ret;
+    },
+
+    /**
+     * APIMethod: read
+     * Read data from a string, and return an response. 
+     * 
+     * Parameters:
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {OpenLayers.Format.ArcXML.Response} An ArcXML response. Note that this response
+     *     data may change in the future. 
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        
+        var arcNode = null;
+        if (data && data.documentElement) {
+            if(data.documentElement.nodeName == "ARCXML") {
+                arcNode = data.documentElement;
+            } else {
+                arcNode = data.documentElement.getElementsByTagName("ARCXML")[0];
+            }
+        }
+          
+        // in Safari, arcNode will be there but will have a child named 
+        // parsererror
+        if (!arcNode || arcNode.firstChild.nodeName === 'parsererror') {
+            var error, source;
+            try {
+                error = data.firstChild.nodeValue;
+                source = data.firstChild.childNodes[1].firstChild.nodeValue;
+            } catch (err) {
+                // pass
+            }
+            throw {
+                message: "Error parsing the ArcXML request", 
+                error: error,
+                source: source
+            };
+        }
+        
+        var response = this.parseResponse(arcNode);
+        return response;
+    },
+    
+    /**
+     * APIMethod: write
+     * Generate an ArcXml document string for sending to an ArcIMS server. 
+     * 
+     * Returns:
+     * {String} A string representing the ArcXML document request.
+     */
+    write: function(request) {       
+        if (!request) {
+            request = this.request;
+        }    
+        var root = this.createElementNS("", "ARCXML");
+        root.setAttribute("version","1.1");
+
+        var reqElem = this.createElementNS("", "REQUEST");
+        
+        if (request.get_image != null) {
+            var getElem = this.createElementNS("", "GET_IMAGE");
+            reqElem.appendChild(getElem);
+
+            var propElem = this.createElementNS("", "PROPERTIES");
+            getElem.appendChild(propElem);
+
+            var props = request.get_image.properties;
+            if (props.featurecoordsys != null) {
+                var feat = this.createElementNS("", "FEATURECOORDSYS");
+                propElem.appendChild(feat);
+                
+                if (props.featurecoordsys.id === 0) {
+                    feat.setAttribute("string", props.featurecoordsys['string']);
+                }
+                else {
+                    feat.setAttribute("id", props.featurecoordsys.id);
+                }
+            }
+          
+            if (props.filtercoordsys != null) {
+                var filt = this.createElementNS("", "FILTERCOORDSYS");
+                propElem.appendChild(filt);
+
+                if (props.filtercoordsys.id === 0) {
+                    filt.setAttribute("string", props.filtercoordsys.string);
+                }
+                else {
+                    filt.setAttribute("id", props.filtercoordsys.id);
+                }
+            }
+          
+            if (props.envelope != null) {
+                var env = this.createElementNS("", "ENVELOPE");
+                propElem.appendChild(env);
+
+                env.setAttribute("minx", props.envelope.minx);
+                env.setAttribute("miny", props.envelope.miny);
+                env.setAttribute("maxx", props.envelope.maxx);
+                env.setAttribute("maxy", props.envelope.maxy);
+            }        
+          
+            var imagesz = this.createElementNS("", "IMAGESIZE");
+            propElem.appendChild(imagesz);
+          
+            imagesz.setAttribute("height", props.imagesize.height);
+            imagesz.setAttribute("width", props.imagesize.width);
+          
+            if (props.imagesize.height != props.imagesize.printheight ||
+                 props.imagesize.width != props.imagesize.printwidth) {
+                imagesz.setAttribute("printheight", props.imagesize.printheight);
+                imagesz.setArrtibute("printwidth", props.imagesize.printwidth);
+            }
+          
+            if (props.background != null) {
+                var backgrnd = this.createElementNS("", "BACKGROUND");
+                propElem.appendChild(backgrnd);
+            
+                backgrnd.setAttribute("color", 
+                    props.background.color.r + "," + 
+                    props.background.color.g + "," + 
+                    props.background.color.b);
+              
+                if (props.background.transcolor !== null) {
+                    backgrnd.setAttribute("transcolor", 
+                        props.background.transcolor.r + "," + 
+                        props.background.transcolor.g + "," + 
+                        props.background.transcolor.b);
+                }
+            }
+          
+            if (props.layerlist != null && props.layerlist.length > 0) {
+                var layerlst = this.createElementNS("", "LAYERLIST");
+                propElem.appendChild(layerlst);
+            
+                for (var ld = 0; ld < props.layerlist.length; ld++) {
+                    var ldef = this.createElementNS("", "LAYERDEF");
+                    layerlst.appendChild(ldef);
+              
+                    ldef.setAttribute("id", props.layerlist[ld].id);
+                    ldef.setAttribute("visible", props.layerlist[ld].visible);
+              
+                    if (typeof props.layerlist[ld].query == "object") {
+                        var query = props.layerlist[ld].query;
+
+                        if (query.where.length < 0) {
+                            continue;
+                        }
+                  
+                        var queryElem = null;
+                        if (typeof query.spatialfilter == "boolean" && query.spatialfilter) {
+                            // handle spatial filter madness
+                            queryElem = this.createElementNS("", "SPATIALQUERY");
+                        }
+                        else {
+                            queryElem = this.createElementNS("", "QUERY");
+                        }
+                
+                        queryElem.setAttribute("where", query.where);
+                
+                        if (typeof query.accuracy == "number" && query.accuracy > 0) {
+                            queryElem.setAttribute("accuracy", query.accuracy);
+                        }
+                        if (typeof query.featurelimit == "number" && query.featurelimit < 2000) {
+                            queryElem.setAttribute("featurelimit", query.featurelimit);
+                        }
+                        if (typeof query.subfields == "string" && query.subfields != "#ALL#") {
+                            queryElem.setAttribute("subfields", query.subfields);
+                        }
+                        if (typeof query.joinexpression == "string" && query.joinexpression.length > 0) {
+                            queryElem.setAttribute("joinexpression", query.joinexpression);
+                        }
+                        if (typeof query.jointables == "string" && query.jointables.length > 0) {
+                            queryElem.setAttribute("jointables", query.jointables);
+                        }
+
+                        ldef.appendChild(queryElem);
+                    }
+              
+                    if (typeof props.layerlist[ld].renderer == "object") {
+                        this.addRenderer(ldef, props.layerlist[ld].renderer);                  
+                    }
+                }
+            }
+        } else if (request.get_feature != null) {
+            var getElem = this.createElementNS("", "GET_FEATURES");
+            getElem.setAttribute("outputmode", "newxml");
+            getElem.setAttribute("checkesc", "true");
+          
+            if (request.get_feature.geometry) {
+                getElem.setAttribute("geometry", request.get_feature.geometry);
+            }
+            else {
+                getElem.setAttribute("geometry", "false");
+            }
+          
+            if (request.get_feature.compact) {
+                getElem.setAttribute("compact", request.get_feature.compact);
+            }
+          
+            if (request.get_feature.featurelimit == "number") {
+                getElem.setAttribute("featurelimit", request.get_feature.featurelimit);
+            }
+          
+            getElem.setAttribute("globalenvelope", "true");
+            reqElem.appendChild(getElem);
+          
+            if (request.get_feature.layer != null && request.get_feature.layer.length > 0) {
+                var lyrElem = this.createElementNS("", "LAYER");
+                lyrElem.setAttribute("id", request.get_feature.layer);
+                getElem.appendChild(lyrElem);
+            }
+          
+            var fquery = request.get_feature.query;
+            if (fquery != null) {
+                var qElem = null;
+                if (fquery.isspatial) {
+                    qElem = this.createElementNS("", "SPATIALQUERY");
+                } else {
+                    qElem = this.createElementNS("", "QUERY");
+                }
+                getElem.appendChild(qElem);
+                
+                if (typeof fquery.accuracy == "number") {
+                    qElem.setAttribute("accuracy", fquery.accuracy);
+                }
+                //qElem.setAttribute("featurelimit", "5");
+            
+                if (fquery.featurecoordsys != null) {
+                    var fcsElem1 = this.createElementNS("", "FEATURECOORDSYS");
+              
+                    if (fquery.featurecoordsys.id == 0) {
+                        fcsElem1.setAttribute("string", fquery.featurecoordsys.string);
+                    } else {
+                        fcsElem1.setAttribute("id", fquery.featurecoordsys.id);
+                    }
+                    qElem.appendChild(fcsElem1);
+                }
+            
+                if (fquery.filtercoordsys != null) {
+                    var fcsElem2 = this.createElementNS("", "FILTERCOORDSYS");
+              
+                    if (fquery.filtercoordsys.id === 0) {
+                        fcsElem2.setAttribute("string", fquery.filtercoordsys.string);
+                    } else {
+                        fcsElem2.setAttribute("id", fquery.filtercoordsys.id);
+                    }
+                    qElem.appendChild(fcsElem2);
+                }
+            
+                if (fquery.buffer > 0) {   
+                    var bufElem = this.createElementNS("", "BUFFER");
+                    bufElem.setAttribute("distance", fquery.buffer);
+                    qElem.appendChild(bufElem);
+                }
+            
+                if (fquery.isspatial) {
+                    var spfElem = this.createElementNS("", "SPATIALFILTER");
+                    spfElem.setAttribute("relation", fquery.spatialfilter.relation);
+                    qElem.appendChild(spfElem);
+              
+                    if (fquery.spatialfilter.envelope) {
+                        var envElem = this.createElementNS("", "ENVELOPE"); 
+                        envElem.setAttribute("minx", fquery.spatialfilter.envelope.minx);
+                        envElem.setAttribute("miny", fquery.spatialfilter.envelope.miny);
+                        envElem.setAttribute("maxx", fquery.spatialfilter.envelope.maxx);
+                        envElem.setAttribute("maxy", fquery.spatialfilter.envelope.maxy);
+                        spfElem.appendChild(envElem);
+                    } else if(typeof fquery.spatialfilter.polygon == "object") {
+                        spfElem.appendChild(this.writePolygonGeometry(fquery.spatialfilter.polygon));                
+                    }
+                }
+            
+                if (fquery.where != null && fquery.where.length > 0) {
+                    qElem.setAttribute("where", fquery.where);
+                }
+            }
+        }
+
+        root.appendChild(reqElem);
+
+        return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
+    },
+    
+    
+    addGroupRenderer: function(ldef, toprenderer) {
+        var topRelem = this.createElementNS("", "GROUPRENDERER");
+        ldef.appendChild(topRelem);
+      
+        for (var rind = 0; rind < toprenderer.length; rind++) {
+            var renderer = toprenderer[rind];
+            this.addRenderer(topRelem, renderer);
+        }
+    },
+    
+    
+    addRenderer: function(topRelem, renderer) {
+        if (renderer instanceof Array) {
+            this.addGroupRenderer(topRelem, renderer);
+        } else {
+            var renderElem = this.createElementNS("", renderer.type.toUpperCase() + "RENDERER");
+            topRelem.appendChild(renderElem);
+          
+            if (renderElem.tagName == "VALUEMAPRENDERER") {
+                this.addValueMapRenderer(renderElem, renderer);
+            } else if (renderElem.tagName == "VALUEMAPLABELRENDERER") {
+                this.addValueMapLabelRenderer(renderElem, renderer);
+            } else if (renderElem.tagName == "SIMPLELABELRENDERER") {
+                this.addSimpleLabelRenderer(renderElem, renderer);
+            } else if (renderElem.tagName == "SCALEDEPENDENTRENDERER") {
+                this.addScaleDependentRenderer(renderElem, renderer);
+            }
+        }             
+    },
+    
+    
+    addScaleDependentRenderer: function(renderElem, renderer) {
+        if (typeof renderer.lower == "string" || typeof renderer.lower == "number") {
+            renderElem.setAttribute("lower", renderer.lower);
+        }
+        if (typeof renderer.upper == "string" || typeof renderer.upper == "number") {
+            renderElem.setAttribute("upper", renderer.upper);
+        }
+        
+        this.addRenderer(renderElem, renderer.renderer);
+    },
+    
+    
+    addValueMapLabelRenderer: function(renderElem, renderer) {
+        renderElem.setAttribute("lookupfield", renderer.lookupfield);
+        renderElem.setAttribute("labelfield", renderer.labelfield);
+      
+        if (typeof renderer.exacts == "object") {
+            for (var ext=0, extlen=renderer.exacts.length; ext<extlen; ext++) {
+                var exact = renderer.exacts[ext];
+          
+                var eelem = this.createElementNS("", "EXACT");
+          
+                if (typeof exact.value == "string") {
+                    eelem.setAttribute("value", exact.value);
+                }
+                if (typeof exact.label == "string") {
+                    eelem.setAttribute("label", exact.label);
+                }
+                if (typeof exact.method == "string") {
+                    eelem.setAttribute("method", exact.method);
+                }
+
+                renderElem.appendChild(eelem);
+            
+                if (typeof exact.symbol == "object") {
+                    var selem = null;
+                
+                    if (exact.symbol.type == "text") {
+                        selem = this.createElementNS("", "TEXTSYMBOL");
+                    }
+                
+                    if (selem != null) {
+                        var keys = this.fontStyleKeys;
+                        for (var i = 0, len = keys.length; i < len; i++) {
+                            var key = keys[i];
+                            if (exact.symbol[key]) {
+                                selem.setAttribute(key, exact.symbol[key]);
+                            }
+                        }    
+                        eelem.appendChild(selem);
+                    }
+                }
+            } // for each exact
+        }      
+    },
+    
+    addValueMapRenderer: function(renderElem, renderer) {
+        renderElem.setAttribute("lookupfield", renderer.lookupfield);
+        
+        if (typeof renderer.ranges == "object") {
+            for(var rng=0, rnglen=renderer.ranges.length; rng<rnglen; rng++) {
+                var range = renderer.ranges[rng];
+                
+                var relem = this.createElementNS("", "RANGE");
+                relem.setAttribute("lower", range.lower);
+                relem.setAttribute("upper", range.upper);
+                
+                renderElem.appendChild(relem);
+                
+                if (typeof range.symbol == "object") {
+                    var selem = null;
+              
+                    if (range.symbol.type == "simplepolygon") {
+                        selem = this.createElementNS("", "SIMPLEPOLYGONSYMBOL");
+                    }
+              
+                    if (selem != null) {
+                        if (typeof range.symbol.boundarycolor == "string") {
+                            selem.setAttribute("boundarycolor", range.symbol.boundarycolor);
+                        }
+                        if (typeof range.symbol.fillcolor == "string") {
+                            selem.setAttribute("fillcolor", range.symbol.fillcolor);
+                        }
+                        if (typeof range.symbol.filltransparency == "number") {
+                            selem.setAttribute("filltransparency", range.symbol.filltransparency);
+                        }
+                        relem.appendChild(selem);
+                    }   
+                }
+            } // for each range
+        } else if (typeof renderer.exacts == "object") {
+            for (var ext=0, extlen=renderer.exacts.length; ext<extlen; ext++) {
+                var exact = renderer.exacts[ext];
+          
+                var eelem = this.createElementNS("", "EXACT");
+                if (typeof exact.value == "string") {
+                    eelem.setAttribute("value", exact.value);
+                }
+                if (typeof exact.label == "string") {
+                    eelem.setAttribute("label", exact.label);
+                }
+                if (typeof exact.method == "string") {
+                    eelem.setAttribute("method", exact.method);
+                }
+            
+                renderElem.appendChild(eelem);
+            
+                if (typeof exact.symbol == "object") {
+                    var selem = null;
+            
+                    if (exact.symbol.type == "simplemarker") {
+                        selem = this.createElementNS("", "SIMPLEMARKERSYMBOL");
+                    }
+            
+                    if (selem != null) {
+                        if (typeof exact.symbol.antialiasing == "string") {
+                            selem.setAttribute("antialiasing", exact.symbol.antialiasing);
+                        }
+                        if (typeof exact.symbol.color == "string") {
+                            selem.setAttribute("color", exact.symbol.color);
+                        }
+                        if (typeof exact.symbol.outline == "string") {
+                            selem.setAttribute("outline", exact.symbol.outline);
+                        }
+                        if (typeof exact.symbol.overlap == "string") {
+                            selem.setAttribute("overlap", exact.symbol.overlap);
+                        }
+                        if (typeof exact.symbol.shadow == "string") {
+                            selem.setAttribute("shadow", exact.symbol.shadow);
+                        }
+                        if (typeof exact.symbol.transparency == "number") {
+                            selem.setAttribute("transparency", exact.symbol.transparency);
+                        }
+                        //if (typeof exact.symbol.type == "string")
+                        //    selem.setAttribute("type", exact.symbol.type);
+                        if (typeof exact.symbol.usecentroid == "string") {
+                            selem.setAttribute("usecentroid", exact.symbol.usecentroid);
+                        }
+                        if (typeof exact.symbol.width == "number") {
+                            selem.setAttribute("width", exact.symbol.width);
+                        }
+                
+                        eelem.appendChild(selem);
+                    }
+                }
+            } // for each exact
+        }
+    },
+    
+    
+    addSimpleLabelRenderer: function(renderElem, renderer) {
+        renderElem.setAttribute("field", renderer.field);
+        var keys = ['featureweight', 'howmanylabels', 'labelbufferratio', 
+                    'labelpriorities', 'labelweight', 'linelabelposition',
+                    'rotationalangles'];
+        for (var i=0, len=keys.length; i<len; i++) {
+            var key = keys[i];
+            if (renderer[key]) {
+                renderElem.setAttribute(key, renderer[key]);
+            }
+        }     
+           
+        if (renderer.symbol.type == "text") {
+            var symbol = renderer.symbol;
+            var selem = this.createElementNS("", "TEXTSYMBOL");
+            renderElem.appendChild(selem);
+          
+            var keys = this.fontStyleKeys;
+            for (var i=0, len=keys.length; i<len; i++) {
+                var key = keys[i];
+                if (symbol[key]) {
+                    selem.setAttribute(key, renderer[key]);
+                }
+            }    
+        }    
+    },
+    
+    writePolygonGeometry: function(polygon) {
+        if (!(polygon instanceof OpenLayers.Geometry.Polygon)) {
+            throw { 
+                message:'Cannot write polygon geometry to ArcXML with an ' +
+                    polygon.CLASS_NAME + ' object.',
+                geometry: polygon
+            };
+        }
+        
+        var polyElem = this.createElementNS("", "POLYGON");
+      
+        for (var ln=0, lnlen=polygon.components.length; ln<lnlen; ln++) {
+            var ring = polygon.components[ln];
+            var ringElem = this.createElementNS("", "RING");
+        
+            for (var rn=0, rnlen=ring.components.length; rn<rnlen; rn++) {
+                var point = ring.components[rn];
+                var pointElem = this.createElementNS("", "POINT");
+            
+                pointElem.setAttribute("x", point.x);
+                pointElem.setAttribute("y", point.y);
+            
+                ringElem.appendChild(pointElem);
+            }
+        
+            polyElem.appendChild(ringElem);
+        }
+      
+        return polyElem;
+    },
+    
+    /**
+     * Method: parseResponse
+     * Take an ArcXML response, and parse in into this object's internal properties.
+     *
+     * Parameters:
+     * data - {String} or {DOMElement} The ArcXML response, as either a string or the
+     * top level DOMElement of the response.
+     */
+    parseResponse: function(data) {
+        if(typeof data == "string") { 
+            var newData = new OpenLayers.Format.XML();
+            data = newData.read(data);
+        }
+        var response = new OpenLayers.Format.ArcXML.Response();
+        
+        var errorNode = data.getElementsByTagName("ERROR");
+        
+        if (errorNode != null && errorNode.length > 0) {
+            response.error = this.getChildValue(errorNode, "Unknown error.");
+        } else {
+            var responseNode = data.getElementsByTagName("RESPONSE");
+          
+            if (responseNode == null || responseNode.length == 0) {
+                response.error = "No RESPONSE tag found in ArcXML response.";
+                return response;
+            }
+          
+            var rtype = responseNode[0].firstChild.nodeName;
+            if (rtype == "#text") {
+                rtype = responseNode[0].firstChild.nextSibling.nodeName;
+            }
+          
+            if (rtype == "IMAGE") {
+                var envelopeNode = data.getElementsByTagName("ENVELOPE");
+                var outputNode = data.getElementsByTagName("OUTPUT");
+                
+                if (envelopeNode == null || envelopeNode.length == 0) {
+                    response.error = "No ENVELOPE tag found in ArcXML response.";
+                } else if (outputNode == null || outputNode.length == 0) {
+                    response.error = "No OUTPUT tag found in ArcXML response.";
+                } else {
+                    var envAttr = this.parseAttributes(envelopeNode[0]);            
+                    var outputAttr = this.parseAttributes(outputNode[0]);
+                  
+                    if (typeof outputAttr.type == "string") {
+                        response.image = { 
+                            envelope: envAttr, 
+                            output: { 
+                                type: outputAttr.type, 
+                                data: this.getChildValue(outputNode[0])
+                            }
+                        };
+                    } else {
+                        response.image = { envelope: envAttr, output: outputAttr };
+                    }
+                }
+            } else if (rtype == "FEATURES") {
+                var features = responseNode[0].getElementsByTagName("FEATURES");
+            
+                // get the feature count
+                var featureCount = features[0].getElementsByTagName("FEATURECOUNT");
+                response.features.featurecount = featureCount[0].getAttribute("count");
+            
+                if (response.features.featurecount > 0) {
+                    // get the feature envelope
+                    var envelope = features[0].getElementsByTagName("ENVELOPE");
+                    response.features.envelope = this.parseAttributes(envelope[0], typeof(0));
+
+                    // get the field values per feature
+                    var featureList = features[0].getElementsByTagName("FEATURE");
+                    for (var fn = 0; fn < featureList.length; fn++) {
+                        var feature = new OpenLayers.Feature.Vector();
+                        var fields = featureList[fn].getElementsByTagName("FIELD");
+
+                        for (var fdn = 0; fdn < fields.length; fdn++) {
+                            var fieldName = fields[fdn].getAttribute("name");
+                            var fieldValue = fields[fdn].getAttribute("value");
+                            feature.attributes[ fieldName ] = fieldValue;
+                        }
+
+                        var geom = featureList[fn].getElementsByTagName("POLYGON");
+
+                        if (geom.length > 0) {
+                            // if there is a polygon, create an openlayers polygon, and assign
+                            // it to the .geometry property of the feature
+                            var ring = geom[0].getElementsByTagName("RING");
+
+                            var polys = [];
+                            for (var rn = 0; rn < ring.length; rn++) {
+                                var linearRings = [];
+                                linearRings.push(this.parsePointGeometry(ring[rn]));
+
+                                var holes = ring[rn].getElementsByTagName("HOLE");
+                                for (var hn = 0; hn < holes.length; hn++) {
+                                    linearRings.push(this.parsePointGeometry(holes[hn]));
+                                }
+                                holes = null;
+                                polys.push(new OpenLayers.Geometry.Polygon(linearRings));
+                                linearRings = null;
+                            }
+                            ring = null;
+                          
+                            if (polys.length == 1) {
+                                feature.geometry = polys[0];
+                            } else
+                            {
+                                feature.geometry = new OpenLayers.Geometry.MultiPolygon(polys);
+                            }
+                        }
+
+                        response.features.feature.push(feature);
+                    }
+                }
+            } else {
+                response.error = "Unidentified response type.";
+            }
+        }
+        return response;
+    },
+    
+    
+    /**
+     * Method: parseAttributes
+     *
+     * Parameters:
+     * node - {<DOMElement>} An element to parse attributes from.
+     *
+     * Returns:
+     * {Object} An attributes object, with properties set to attribute values.
+     */
+    parseAttributes: function(node,type) {
+        var attributes = {};
+        for(var attr = 0; attr < node.attributes.length; attr++) {
+            if (type == "number") {
+                attributes[node.attributes[attr].nodeName] = parseFloat(node.attributes[attr].nodeValue);
+            } else {
+                attributes[node.attributes[attr].nodeName] = node.attributes[attr].nodeValue;
+            }
+        }
+        return attributes;
+    },
+    
+    
+    /**
+     * Method: parsePointGeometry
+     *
+     * Parameters:
+     * node - {<DOMElement>} An element to parse <COORDS> or <POINT> arcxml data from.
+     *
+     * Returns:
+     * {OpenLayers.Geometry.LinearRing} A linear ring represented by the node's points.
+     */
+    parsePointGeometry: function(node) {
+        var ringPoints = [];
+        var coords = node.getElementsByTagName("COORDS");
+
+        if (coords.length > 0) {
+            // if coords is present, it's the only coords item
+            var coordArr = this.getChildValue(coords[0]);
+            coordArr = coordArr.split(/;/);
+            for (var cn = 0; cn < coordArr.length; cn++) {
+                var coordItems = coordArr[cn].split(/ /);
+                ringPoints.push(new OpenLayers.Geometry.Point(parseFloat(coordItems[0]), parseFloat(coordItems[1])));
+            }
+            coords = null;
+        } else {
+            var point = node.getElementsByTagName("POINT");
+            if (point.length > 0) {
+                for (var pn = 0; pn < point.length; pn++) {
+                    ringPoints.push(
+                        new OpenLayers.Geometry.Point(
+                            parseFloat(point[pn].getAttribute("x")),
+                            parseFloat(point[pn].getAttribute("y"))
+                        )
+                    );
+                }
+            }
+            point = null;
+        }
+
+        return new OpenLayers.Geometry.LinearRing(ringPoints);      
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.ArcXML" 
+});
+
+OpenLayers.Format.ArcXML.Request = OpenLayers.Class({
+    initialize: function(params) {
+        var defaults = {
+            get_image: {
+                properties: {
+                    background: null,
+                    /*{ 
+                        color: { r:255, g:255, b:255 },
+                        transcolor: null
+                    },*/
+                    draw: true,
+                    envelope: {
+                        minx: 0, 
+                        miny: 0, 
+                        maxx: 0, 
+                        maxy: 0
+                    },
+                    featurecoordsys: { 
+                        id:0, 
+                        string:"",
+                        datumtransformid:0,
+                        datumtransformstring:""
+                    },
+                    filtercoordsys:{
+                        id:0,
+                        string:"",
+                        datumtransformid:0,
+                        datumtransformstring:""
+                    },
+                    imagesize:{
+                        height:0,
+                        width:0,
+                        dpi:96,
+                        printheight:0,
+                        printwidth:0,
+                        scalesymbols:false
+                    },
+                    layerlist:[],
+                    /* no support for legends */
+                    output:{
+                        baseurl:"",
+                        legendbaseurl:"",
+                        legendname:"",
+                        legendpath:"",
+                        legendurl:"",
+                        name:"",
+                        path:"",
+                        type:"jpg",
+                        url:""
+                    }
+                }
+            },
+
+            get_feature: {
+                layer: "",
+                query: {
+                    isspatial: false,
+                    featurecoordsys: {
+                        id:0,
+                        string:"",
+                        datumtransformid:0,
+                        datumtransformstring:""
+                    },
+                    filtercoordsys: {
+                        id:0,
+                        string:"",
+                        datumtransformid:0,
+                        datumtransformstring:""
+                    },
+                    buffer:0,
+                    where:"",
+                    spatialfilter: {
+                        relation: "envelope_intersection",
+                        envelope: null
+                    }
+                }
+            },
+      
+            environment: {
+                separators: {
+                    cs:" ",
+                    ts:";"
+                }
+            },
+      
+            layer: [],
+            workspaces: []
+        };
+      
+        return OpenLayers.Util.extend(this, defaults);      
+    },
+  
+    CLASS_NAME: "OpenLayers.Format.ArcXML.Request"
+});
+
+OpenLayers.Format.ArcXML.Response = OpenLayers.Class({  
+    initialize: function(params) {
+        var defaults = {
+            image: {
+                envelope:null,
+                output:''
+            },
+      
+            features: {
+                featurecount: 0,
+                envelope: null,
+                feature: []
+            },
+      
+            error:''
+        };
+  
+        return OpenLayers.Util.extend(this, defaults);
+    },
+  
+    CLASS_NAME: "OpenLayers.Format.ArcXML.Response"
+});
diff --git a/lib/OpenLayers/Format/ArcXML/Features.js b/lib/OpenLayers/Format/ArcXML/Features.js
new file mode 100644
index 0000000..9809f93
--- /dev/null
+++ b/lib/OpenLayers/Format/ArcXML/Features.js
@@ -0,0 +1,49 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/ArcXML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.ArcXML.Features
+ * Read/Wite ArcXML features. Create a new instance with the 
+ *     <OpenLayers.Format.ArcXML.Features> constructor.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.ArcXML.Features = OpenLayers.Class(OpenLayers.Format.XML, {
+
+    /**
+     * Constructor: OpenLayers.Format.ArcXML.Features
+     * Create a new parser/writer for ArcXML Features.  Create an instance of this class
+     * to get a set of features from an ArcXML response.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {     
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * APIMethod: read
+     * Read data from a string of ArcXML, and return a set of OpenLayers features. 
+     * 
+     * Parameters:
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Feature.Vector>)} A collection of features.
+     */
+    read: function(data) {
+        var axl = new OpenLayers.Format.ArcXML();
+        var parsed = axl.read(data);
+        
+        return parsed.features.feature;
+    }
+});
diff --git a/lib/OpenLayers/Format/Atom.js b/lib/OpenLayers/Format/Atom.js
new file mode 100644
index 0000000..63b3f61
--- /dev/null
+++ b/lib/OpenLayers/Format/Atom.js
@@ -0,0 +1,727 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/GML/v3.js
+ * @requires OpenLayers/Feature/Vector.js
+ */
+
+/**
+ * Class: OpenLayers.Format.Atom
+ * Read/write Atom feeds. Create a new instance with the
+ *     <OpenLayers.Format.AtomFeed> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.Atom = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.  Properties
+     *     of this object should not be set individually.  Read-only.  All
+     *     XML subclasses should have their own namespaces object.  Use
+     *     <setNamespace> to add or set a namespace alias after construction.
+     */
+    namespaces: {
+        atom: "http://www.w3.org/2005/Atom",
+        georss: "http://www.georss.org/georss"
+    },
+    
+    /**
+     * APIProperty: feedTitle
+     * {String} Atom feed elements require a title.  Default is "untitled".
+     */
+    feedTitle: "untitled",
+
+    /**
+     * APIProperty: defaultEntryTitle
+     * {String} Atom entry elements require a title.  In cases where one is
+     *     not provided in the feature attributes, this will be used.  Default
+     *     is "untitled".
+     */
+    defaultEntryTitle: "untitled",
+
+    /**
+     * Property: gmlParse
+     * {Object} GML Format object for parsing features
+     * Non-API and only created if necessary
+     */
+    gmlParser: null,
+    
+    /**
+     * APIProperty: xy
+     * {Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x)
+     * For GeoRSS the default is (y,x), therefore: false
+     */
+    xy: false,
+    
+    /**
+     * Constructor: OpenLayers.Format.AtomEntry
+     * Create a new parser for Atom.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * APIMethod: read
+     * Return a list of features from an Atom feed or entry document.
+     
+     * Parameters:
+     * doc - {Element} or {String}
+     *
+     * Returns:
+     * An Array of <OpenLayers.Feature.Vector>s
+     */
+    read: function(doc) {
+        if (typeof doc == "string") {
+            doc = OpenLayers.Format.XML.prototype.read.apply(this, [doc]);
+        }
+        return this.parseFeatures(doc);
+    },
+    
+    /**
+     * APIMethod: write
+     * Serialize or more feature nodes to Atom documents.
+     *
+     * Parameters:
+     * features - a single {<OpenLayers.Feature.Vector>} or an
+     * Array({<OpenLayers.Feature.Vector>}).
+     *
+     * Returns:
+     * {String} an Atom entry document if passed one feature node, or a feed
+     * document if passed an array of feature nodes.
+     */
+    write: function(features) {
+        var doc;
+        if (features instanceof Array) {
+            doc = this.createElementNSPlus("atom:feed");
+            doc.appendChild(
+                this.createElementNSPlus("atom:title", {
+                    value: this.feedTitle
+                })
+            );
+            for (var i=0, ii=features.length; i<ii; i++) {
+                doc.appendChild(this.buildEntryNode(features[i]));
+            }
+        }
+        else {
+            doc = this.buildEntryNode(features);
+        }
+        return OpenLayers.Format.XML.prototype.write.apply(this, [doc]);
+    },
+    
+    /**
+     * Method: buildContentNode
+     *
+     * Parameters:
+     * content - {Object}
+     *
+     * Returns:
+     * {DOMElement} an Atom content node.
+     *
+     * TODO: types other than text.
+     */
+    buildContentNode: function(content) {
+        var node = this.createElementNSPlus("atom:content", {
+            attributes: {
+                type: content.type || null
+            }
+        });
+        if (content.src) {
+            node.setAttribute("src", content.src);
+        } else {
+            if (content.type == "text" || content.type == null) {
+                node.appendChild(
+                    this.createTextNode(content.value)
+                );
+            } else if (content.type == "html") {
+                if (typeof content.value != "string") {
+                    throw "HTML content must be in form of an escaped string";
+                }
+                node.appendChild(
+                    this.createTextNode(content.value)
+                );
+            } else if (content.type == "xhtml") {
+                node.appendChild(content.value);
+            } else if (content.type == "xhtml" ||
+                           content.type.match(/(\+|\/)xml$/)) {
+                node.appendChild(content.value);
+            }
+            else { // MUST be a valid Base64 encoding
+                node.appendChild(
+                    this.createTextNode(content.value)
+                );
+            }
+        }
+        return node;
+    },
+    
+    /**
+     * Method: buildEntryNode
+     * Build an Atom entry node from a feature object.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     *
+     * Returns:
+     * {DOMElement} an Atom entry node.
+     *
+     * These entries are geared for publication using AtomPub.
+     *
+     * TODO: support extension elements
+     */
+    buildEntryNode: function(feature) {
+        var attrib = feature.attributes;
+        var atomAttrib = attrib.atom || {};
+        var entryNode = this.createElementNSPlus("atom:entry");
+        
+        // atom:author
+        if (atomAttrib.authors) {
+            var authors = atomAttrib.authors instanceof Array ?
+                atomAttrib.authors : [atomAttrib.authors];
+            for (var i=0, ii=authors.length; i<ii; i++) {
+                entryNode.appendChild(
+                    this.buildPersonConstructNode(
+                        "author", authors[i]
+                    )
+                );
+            }
+        }
+        
+        // atom:category
+        if (atomAttrib.categories) {
+            var categories = atomAttrib.categories instanceof Array ?
+                atomAttrib.categories : [atomAttrib.categories];
+            var category;
+            for (var i=0, ii=categories.length; i<ii; i++) {
+                category = categories[i];
+                entryNode.appendChild(
+                    this.createElementNSPlus("atom:category", {
+                        attributes: {
+                            term: category.term,
+                            scheme: category.scheme || null,
+                            label: category.label || null
+                        }
+                    })
+                );
+            }
+        }
+        
+        // atom:content
+        if (atomAttrib.content) {
+            entryNode.appendChild(this.buildContentNode(atomAttrib.content));
+        }
+        
+        // atom:contributor
+        if (atomAttrib.contributors) {
+            var contributors = atomAttrib.contributors instanceof Array ?
+                atomAttrib.contributors : [atomAttrib.contributors];
+            for (var i=0, ii=contributors.length; i<ii; i++) {
+                entryNode.appendChild(
+                    this.buildPersonConstructNode(
+                        "contributor",
+                        contributors[i]
+                        )
+                    );
+            }
+        }
+        
+        // atom:id
+        if (feature.fid) {
+            entryNode.appendChild(
+                this.createElementNSPlus("atom:id", {
+                    value: feature.fid
+                })
+            );
+        }
+        
+        // atom:link
+        if (atomAttrib.links) {
+            var links = atomAttrib.links instanceof Array ?
+                atomAttrib.links : [atomAttrib.links];
+            var link;
+            for (var i=0, ii=links.length; i<ii; i++) {
+                link = links[i];
+                entryNode.appendChild(
+                    this.createElementNSPlus("atom:link", {
+                        attributes: {
+                            href: link.href,
+                            rel: link.rel || null,
+                            type: link.type || null,
+                            hreflang: link.hreflang || null,
+                            title: link.title || null,
+                            length: link.length || null
+                        }
+                    })
+                );
+            }
+        }
+        
+        // atom:published
+        if (atomAttrib.published) {
+            entryNode.appendChild(
+                this.createElementNSPlus("atom:published", {
+                    value: atomAttrib.published
+                })
+            );
+        }
+        
+        // atom:rights
+        if (atomAttrib.rights) {
+            entryNode.appendChild(
+                this.createElementNSPlus("atom:rights", {
+                    value: atomAttrib.rights
+                })
+            );
+        }
+        
+        // atom:source not implemented
+        
+        // atom:summary
+        if (atomAttrib.summary || attrib.description) {
+            entryNode.appendChild(
+                this.createElementNSPlus("atom:summary", {
+                    value: atomAttrib.summary || attrib.description
+                })
+            );
+        }
+        
+        // atom:title
+        entryNode.appendChild(
+            this.createElementNSPlus("atom:title", {
+                value: atomAttrib.title || attrib.title || this.defaultEntryTitle
+            })
+        );
+        
+        // atom:updated
+        if (atomAttrib.updated) {
+            entryNode.appendChild(
+                this.createElementNSPlus("atom:updated", {
+                    value: atomAttrib.updated
+                })
+            );
+        }
+        
+        // georss:where
+        if (feature.geometry) {
+            var whereNode = this.createElementNSPlus("georss:where");
+            whereNode.appendChild(
+                this.buildGeometryNode(feature.geometry)
+            );
+            entryNode.appendChild(whereNode);
+        }
+        
+        return entryNode;
+    },
+    
+    /**
+     * Method: initGmlParser
+     * Creates a GML parser.
+     */
+    initGmlParser: function() {
+        this.gmlParser = new OpenLayers.Format.GML.v3({
+            xy: this.xy,
+            featureNS: "http://example.com#feature",
+            internalProjection: this.internalProjection,
+            externalProjection: this.externalProjection
+        });
+    },
+    
+    /**
+     * Method: buildGeometryNode
+     * builds a GeoRSS node with a given geometry
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     *
+     * Returns:
+     * {DOMElement} A gml node.
+     */
+    buildGeometryNode: function(geometry) {
+        if (!this.gmlParser) {
+            this.initGmlParser();
+        }
+        var node = this.gmlParser.writeNode("feature:_geometry", geometry);
+        return node.firstChild;
+    },
+    
+    /**
+     * Method: buildPersonConstructNode
+     *
+     * Parameters:
+     * name - {String}
+     * value - {Object}
+     *
+     * Returns:
+     * {DOMElement} an Atom person construct node.
+     *
+     * Example:
+     * >>> buildPersonConstructNode("author", {name: "John Smith"})
+     * {<author><name>John Smith</name></author>}
+     *
+     * TODO: how to specify extension elements? Add to the oNames array?
+     */
+    buildPersonConstructNode: function(name, value) {
+        var oNames = ["uri", "email"];
+        var personNode = this.createElementNSPlus("atom:" + name);
+        personNode.appendChild(
+            this.createElementNSPlus("atom:name", {
+                value: value.name
+            })
+        );
+        for (var i=0, ii=oNames.length; i<ii; i++) {
+            if (value[oNames[i]]) {
+                personNode.appendChild(
+                    this.createElementNSPlus("atom:" + oNames[i], {
+                        value: value[oNames[i]]
+                    })
+                );
+            }
+        }
+        return personNode;
+    },
+    
+    /**
+     * Method: getFirstChildValue
+     *
+     * Parameters:
+     * node - {DOMElement}
+     * nsuri - {String} Child node namespace uri ("*" for any).
+     * name - {String} Child node name.
+     * def - {String} Optional string default to return if no child found.
+     *
+     * Returns:
+     * {String} The value of the first child with the given tag name.  Returns
+     *     default value or empty string if none found.
+     */
+    getFirstChildValue: function(node, nsuri, name, def) {
+        var value;
+        var nodes = this.getElementsByTagNameNS(node, nsuri, name);
+        if (nodes && nodes.length > 0) {
+            value = this.getChildValue(nodes[0], def);
+        } else {
+            value = def;
+        }
+        return value;
+    },
+    
+    /**
+     * Method: parseFeature
+     * Parse feature from an Atom entry node..
+     *
+     * Parameters:
+     * node - {DOMElement} An Atom entry or feed node.
+     *
+     * Returns:
+     * An <OpenLayers.Feature.Vector>.
+     */
+    parseFeature: function(node) {
+        var atomAttrib = {};
+        var value = null;
+        var nodes = null;
+        var attval = null;
+        var atomns = this.namespaces.atom;
+        
+        // atomAuthor*
+        this.parsePersonConstructs(node, "author", atomAttrib);
+        
+        // atomCategory*
+        nodes = this.getElementsByTagNameNS(node, atomns, "category");
+        if (nodes.length > 0) {
+            atomAttrib.categories = [];
+        }
+        for (var i=0, ii=nodes.length; i<ii; i++) {
+            value = {};
+            value.term = nodes[i].getAttribute("term");
+            attval = nodes[i].getAttribute("scheme");
+            if (attval) { value.scheme = attval; }
+            attval = nodes[i].getAttribute("label");
+            if (attval) { value.label = attval; }
+            atomAttrib.categories.push(value);
+        }
+        
+        // atomContent?
+        nodes = this.getElementsByTagNameNS(node, atomns, "content");
+        if (nodes.length > 0) {
+            value = {};
+            attval = nodes[0].getAttribute("type");
+            if (attval) {
+                value.type = attval;
+            }
+            attval = nodes[0].getAttribute("src");
+            if (attval) {
+                value.src = attval;
+            } else {
+                if (value.type == "text" || 
+                    value.type == "html" || 
+                    value.type == null ) {
+                    value.value = this.getFirstChildValue(
+                                        node,
+                                        atomns,
+                                        "content",
+                                        null
+                                        );
+                } else if (value.type == "xhtml" ||
+                           value.type.match(/(\+|\/)xml$/)) {
+                    value.value = this.getChildEl(nodes[0]);
+                } else { // MUST be base64 encoded
+                    value.value = this.getFirstChildValue(
+                                        node,
+                                        atomns,
+                                        "content",
+                                        null
+                                        );
+                }
+                atomAttrib.content = value;
+            }
+        }
+        
+        // atomContributor*
+        this.parsePersonConstructs(node, "contributor", atomAttrib);
+        
+        // atomId
+        atomAttrib.id = this.getFirstChildValue(node, atomns, "id", null);
+        
+        // atomLink*
+        nodes = this.getElementsByTagNameNS(node, atomns, "link");
+        if (nodes.length > 0) {
+            atomAttrib.links = new Array(nodes.length);
+        }
+        var oAtts = ["rel", "type", "hreflang", "title", "length"];
+        for (var i=0, ii=nodes.length; i<ii; i++) {
+            value = {};
+            value.href = nodes[i].getAttribute("href");
+            for (var j=0, jj=oAtts.length; j<jj; j++) {
+                attval = nodes[i].getAttribute(oAtts[j]);
+                if (attval) {
+                    value[oAtts[j]] = attval;
+                }
+            }
+            atomAttrib.links[i] = value;
+        }
+        
+        // atomPublished?
+        value = this.getFirstChildValue(node, atomns, "published", null);
+        if (value) {
+            atomAttrib.published = value;
+        }
+        
+        // atomRights?
+        value = this.getFirstChildValue(node, atomns, "rights", null);
+        if (value) {
+            atomAttrib.rights = value;
+        }
+        
+        // atomSource? -- not implemented
+        
+        // atomSummary?
+        value = this.getFirstChildValue(node, atomns, "summary", null);
+        if (value) {
+            atomAttrib.summary = value;
+        }
+        
+        // atomTitle
+        atomAttrib.title = this.getFirstChildValue(
+                                node, atomns, "title", null
+                                );
+        
+        // atomUpdated
+        atomAttrib.updated = this.getFirstChildValue(
+                                node, atomns, "updated", null
+                                );
+        
+        var featureAttrib = {
+            title: atomAttrib.title,
+            description: atomAttrib.summary,
+            atom: atomAttrib
+        };
+        var geometry = this.parseLocations(node)[0];
+        var feature = new OpenLayers.Feature.Vector(geometry, featureAttrib);
+        feature.fid = atomAttrib.id;
+        return feature;
+    },
+    
+    /**
+     * Method: parseFeatures
+     * Return features from an Atom entry or feed.
+     *
+     * Parameters:
+     * node - {DOMElement} An Atom entry or feed node.
+     *
+     * Returns:
+     * An Array of <OpenLayers.Feature.Vector>s.
+     */
+    parseFeatures: function(node) {
+        var features = [];
+        var entries = this.getElementsByTagNameNS(
+            node, this.namespaces.atom, "entry"
+        );
+        if (entries.length == 0) {
+            entries = [node];
+        }
+        for (var i=0, ii=entries.length; i<ii; i++) {
+            features.push(this.parseFeature(entries[i]));
+        }
+        return features;
+    },
+    
+    /**
+     * Method: parseLocations
+     * Parse the locations from an Atom entry or feed.
+     *
+     * Parameters:
+     * node - {DOMElement} An Atom entry or feed node.
+     *
+     * Returns:
+     * An Array of <OpenLayers.Geometry>s.
+     */
+    parseLocations: function(node) {
+        var georssns = this.namespaces.georss;
+
+        var locations = {components: []};
+        var where = this.getElementsByTagNameNS(node, georssns, "where");
+        if (where && where.length > 0) {
+            if (!this.gmlParser) {
+                this.initGmlParser();
+            }
+            for (var i=0, ii=where.length; i<ii; i++) {
+                this.gmlParser.readChildNodes(where[i], locations);
+            }
+        }
+        
+        var components = locations.components;
+        var point = this.getElementsByTagNameNS(node, georssns, "point");
+        if (point && point.length > 0) {
+            for (var i=0, ii=point.length; i<ii; i++) {
+                var xy = OpenLayers.String.trim(
+                            point[i].firstChild.nodeValue
+                            ).split(/\s+/);
+                if (xy.length !=2) {
+                    xy = OpenLayers.String.trim(
+                                point[i].firstChild.nodeValue
+                                ).split(/\s*,\s*/);
+                }
+                components.push(
+                    new OpenLayers.Geometry.Point(
+                        parseFloat(xy[1]),
+                        parseFloat(xy[0])
+                    )
+                );
+            }
+        }
+
+        var line = this.getElementsByTagNameNS(node, georssns, "line");
+        if (line && line.length > 0) {
+            var coords;
+            var p;
+            var points;
+            for (var i=0, ii=line.length; i<ii; i++) {
+                coords = OpenLayers.String.trim(
+                                line[i].firstChild.nodeValue
+                                ).split(/\s+/);
+                points = [];
+                for (var j=0, jj=coords.length; j<jj; j+=2) {
+                    p = new OpenLayers.Geometry.Point(
+                        parseFloat(coords[j+1]),
+                        parseFloat(coords[j])
+                    );
+                    points.push(p);
+                }
+                components.push(
+                    new OpenLayers.Geometry.LineString(points)
+                );
+            }
+        }        
+
+        var polygon = this.getElementsByTagNameNS(node, georssns, "polygon");
+        if (polygon && polygon.length > 0) {
+            var coords;
+            var p;
+            var points;
+            for (var i=0, ii=polygon.length; i<ii; i++) {
+                coords = OpenLayers.String.trim(
+                            polygon[i].firstChild.nodeValue
+                            ).split(/\s+/);
+                points = [];
+                for (var j=0, jj=coords.length; j<jj; j+=2) {
+                    p = new OpenLayers.Geometry.Point(
+                        parseFloat(coords[j+1]),
+                        parseFloat(coords[j])
+                    );
+                    points.push(p);
+                }
+                components.push(
+                    new OpenLayers.Geometry.Polygon(
+                        [new OpenLayers.Geometry.LinearRing(components)]
+                    )
+                );
+            }
+        }
+        
+        if (this.internalProjection && this.externalProjection) {
+            for (var i=0, ii=components.length; i<ii; i++) {
+                if (components[i]) {
+                    components[i].transform(
+                        this.externalProjection,
+                        this.internalProjection
+                    );
+                }
+            }
+        }
+        
+        return components;
+    },
+    
+    /**
+     * Method: parsePersonConstruct
+     * Parse Atom person constructs from an Atom entry node.
+     *
+     * Parameters:
+     * node - {DOMElement} An Atom entry or feed node.
+     * name - {String} Construcy name ("author" or "contributor")
+     * data = {Object} Object in which to put parsed persons.
+     *
+     * Returns:
+     * An {Object}.
+     */
+    parsePersonConstructs: function(node, name, data) {
+        var persons = [];
+        var atomns = this.namespaces.atom;
+        var nodes = this.getElementsByTagNameNS(node, atomns, name);
+        var oAtts = ["uri", "email"];
+        for (var i=0, ii=nodes.length; i<ii; i++) {
+            var value = {};
+            value.name = this.getFirstChildValue(
+                            nodes[i],
+                            atomns,
+                            "name",
+                            null
+                            );
+            for (var j=0, jj=oAtts.length; j<jj; j++) {
+                var attval = this.getFirstChildValue(
+                            nodes[i],
+                            atomns,
+                            oAtts[j],
+                            null);
+                if (attval) {
+                    value[oAtts[j]] = attval;
+                }
+            }
+            persons.push(value);
+        }
+        if (persons.length > 0) {
+            data[name + "s"] = persons;
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Format.Atom"
+});
diff --git a/lib/OpenLayers/Format/CSWGetDomain.js b/lib/OpenLayers/Format/CSWGetDomain.js
new file mode 100644
index 0000000..e50b98c
--- /dev/null
+++ b/lib/OpenLayers/Format/CSWGetDomain.js
@@ -0,0 +1,34 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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.js
+ */
+
+/**
+ * Function: OpenLayers.Format.CSWGetDomain.
+ *     Default version is 2.0.2.
+ *
+ * Returns:
+ * {<OpenLayers.Format>} A CSWGetDomain format of the given version.
+ */
+OpenLayers.Format.CSWGetDomain = function(options) {
+    options = OpenLayers.Util.applyDefaults(
+        options, OpenLayers.Format.CSWGetDomain.DEFAULTS
+    );
+    var cls = OpenLayers.Format.CSWGetDomain["v"+options.version.replace(/\./g, "_")];
+    if(!cls) {
+        throw "Unsupported CSWGetDomain version: " + options.version;
+    }
+    return new cls(options);
+};
+
+/**
+ * Constant: OpenLayers.Format.CSWGetDomain.DEFAULTS
+ * {Object} Default properties for the CSWGetDomain format.
+ */
+OpenLayers.Format.CSWGetDomain.DEFAULTS = {
+    "version": "2.0.2"
+};
diff --git a/lib/OpenLayers/Format/CSWGetDomain/v2_0_2.js b/lib/OpenLayers/Format/CSWGetDomain/v2_0_2.js
new file mode 100644
index 0000000..66d0546
--- /dev/null
+++ b/lib/OpenLayers/Format/CSWGetDomain/v2_0_2.js
@@ -0,0 +1,243 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/CSWGetDomain.js
+ */
+
+/**
+ * Class: OpenLayers.Format.CSWGetDomain.v2_0_2
+ *     A format for creating CSWGetDomain v2.0.2 transactions. 
+ *     Create a new instance with the
+ *     <OpenLayers.Format.CSWGetDomain.v2_0_2> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.CSWGetDomain.v2_0_2 = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance",
+        csw: "http://www.opengis.net/cat/csw/2.0.2"
+    },
+
+    /**
+     * Property: defaultPrefix
+     * {String} The default prefix (used by Format.XML).
+     */
+    defaultPrefix: "csw",
+    
+    /**
+     * Property: version
+     * {String} CSW version number.
+     */
+    version: "2.0.2",
+    
+    /**
+     * Property: schemaLocation
+     * {String} http://www.opengis.net/cat/csw/2.0.2
+     *   http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd
+     */
+    schemaLocation: "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd",
+
+    /**
+     * APIProperty: PropertyName
+     * {String} Value of the csw:PropertyName element, used when
+     *     writing a GetDomain document.
+     */
+    PropertyName: null,
+
+    /**
+     * APIProperty: ParameterName
+     * {String} Value of the csw:ParameterName element, used when
+     *     writing a GetDomain document.
+     */
+    ParameterName: null,
+    
+    /**
+     * Constructor: OpenLayers.Format.CSWGetDomain.v2_0_2
+     * A class for parsing and generating CSWGetDomain v2.0.2 transactions.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     *
+     * Valid options properties:
+     * - PropertyName
+     * - ParameterName
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Parse the response from a GetDomain request.
+     */
+    read: function(data) {
+        if(typeof data == "string") { 
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var obj = {};
+        this.readNode(data, obj);
+        return obj;
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "csw": {
+            "GetDomainResponse": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "DomainValues": function(node, obj) {
+                if (!(obj.DomainValues instanceof Array)) {
+                    obj.DomainValues = [];
+                }
+                var attrs = node.attributes;
+                var domainValue = {};
+                for(var i=0, len=attrs.length; i<len; ++i) {
+                    domainValue[attrs[i].name] = attrs[i].nodeValue;
+                }
+                this.readChildNodes(node, domainValue);
+                obj.DomainValues.push(domainValue);
+            },
+            "PropertyName": function(node, obj) {
+                obj.PropertyName = this.getChildValue(node);
+            },
+            "ParameterName": function(node, obj) {
+                obj.ParameterName = this.getChildValue(node);
+            },
+            "ListOfValues": function(node, obj) {
+                if (!(obj.ListOfValues instanceof Array)) {
+                    obj.ListOfValues = [];
+                }
+                this.readChildNodes(node, obj.ListOfValues);
+            },
+            "Value": function(node, obj) {
+                var attrs = node.attributes;
+                var value = {}
+                for(var i=0, len=attrs.length; i<len; ++i) {
+                    value[attrs[i].name] = attrs[i].nodeValue;
+                }
+                value.value = this.getChildValue(node);
+                obj.push({Value: value});
+            },
+            "ConceptualScheme": function(node, obj) {
+                obj.ConceptualScheme = {};
+                this.readChildNodes(node, obj.ConceptualScheme);
+            },
+            "Name": function(node, obj) {
+                obj.Name = this.getChildValue(node);
+            },
+            "Document": function(node, obj) {
+                obj.Document = this.getChildValue(node);
+            },
+            "Authority": function(node, obj) {
+                obj.Authority = this.getChildValue(node);
+            },
+            "RangeOfValues": function(node, obj) {
+                obj.RangeOfValues = {};
+                this.readChildNodes(node, obj.RangeOfValues);
+            },
+            "MinValue": function(node, obj) {
+                var attrs = node.attributes;
+                var value = {}
+                for(var i=0, len=attrs.length; i<len; ++i) {
+                    value[attrs[i].name] = attrs[i].nodeValue;
+                }
+                value.value = this.getChildValue(node);
+                obj.MinValue = value;
+            },
+            "MaxValue": function(node, obj) {
+                var attrs = node.attributes;
+                var value = {}
+                for(var i=0, len=attrs.length; i<len; ++i) {
+                    value[attrs[i].name] = attrs[i].nodeValue;
+                }
+                value.value = this.getChildValue(node);
+                obj.MaxValue = value;
+            }
+        }
+    },
+    
+    /**
+     * APIMethod: write
+     * Given an configuration js object, write a CSWGetDomain request. 
+     *
+     * Parameters:
+     * options - {Object} A object mapping the request.
+     *
+     * Returns:
+     * {String} A serialized CSWGetDomain request.
+     */
+    write: function(options) {
+        var node = this.writeNode("csw:GetDomain", options);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [node]);
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "csw": {
+            "GetDomain": function(options) {
+                var node = this.createElementNSPlus("csw:GetDomain", {
+                    attributes: {
+                        service: "CSW",
+                        version: this.version
+                    }
+                });
+                if (options.PropertyName || this.PropertyName) {
+                    this.writeNode(
+                        "csw:PropertyName",
+                        options.PropertyName || this.PropertyName,
+                        node
+                    );
+                } else if (options.ParameterName || this.ParameterName) {
+                    this.writeNode(
+                        "csw:ParameterName",
+                        options.ParameterName || this.ParameterName,
+                        node
+                    );
+                }
+                this.readChildNodes(node, options);
+                return node;
+            },
+            "PropertyName": function(value) {
+                var node = this.createElementNSPlus("csw:PropertyName", {
+                    value: value
+                });
+                return node;
+            },
+            "ParameterName": function(value) {
+                var node = this.createElementNSPlus("csw:ParameterName", {
+                    value: value
+                });
+                return node;
+            }
+        }
+    },
+   
+    CLASS_NAME: "OpenLayers.Format.CSWGetDomain.v2_0_2" 
+});
diff --git a/lib/OpenLayers/Format/CSWGetRecords.js b/lib/OpenLayers/Format/CSWGetRecords.js
new file mode 100644
index 0000000..938df50
--- /dev/null
+++ b/lib/OpenLayers/Format/CSWGetRecords.js
@@ -0,0 +1,34 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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.js
+ */
+
+/**
+ * Function: OpenLayers.Format.CSWGetRecords.
+ *     Default version is 2.0.2.
+ *
+ * Returns:
+ * {<OpenLayers.Format>} A CSWGetRecords format of the given version.
+ */
+OpenLayers.Format.CSWGetRecords = function(options) {
+    options = OpenLayers.Util.applyDefaults(
+        options, OpenLayers.Format.CSWGetRecords.DEFAULTS
+    );
+    var cls = OpenLayers.Format.CSWGetRecords["v"+options.version.replace(/\./g, "_")];
+    if(!cls) {
+        throw "Unsupported CSWGetRecords version: " + options.version;
+    }
+    return new cls(options);
+};
+
+/**
+ * Constant: OpenLayers.Format.CSWGetRecords.DEFAULTS
+ * {Object} Default properties for the CSWGetRecords format.
+ */
+OpenLayers.Format.CSWGetRecords.DEFAULTS = {
+    "version": "2.0.2"
+};
diff --git a/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js b/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js
new file mode 100644
index 0000000..b269fbf
--- /dev/null
+++ b/lib/OpenLayers/Format/CSWGetRecords/v2_0_2.js
@@ -0,0 +1,440 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/CSWGetRecords.js
+ * @requires OpenLayers/Format/Filter/v1_0_0.js
+ * @requires OpenLayers/Format/Filter/v1_1_0.js
+ * @requires OpenLayers/Format/OWSCommon/v1_0_0.js
+ */
+
+/**
+ * Class: OpenLayers.Format.CSWGetRecords.v2_0_2
+ *     A format for creating CSWGetRecords v2.0.2 transactions. 
+ *     Create a new instance with the
+ *     <OpenLayers.Format.CSWGetRecords.v2_0_2> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.CSWGetRecords.v2_0_2 = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance",
+        csw: "http://www.opengis.net/cat/csw/2.0.2",
+        dc: "http://purl.org/dc/elements/1.1/",
+        dct: "http://purl.org/dc/terms/",
+        ows: "http://www.opengis.net/ows"
+    },
+    
+    /**
+     * Property: defaultPrefix
+     * {String} The default prefix (used by Format.XML).
+     */
+    defaultPrefix: "csw",
+    
+    /**
+     * Property: version
+     * {String} CSW version number.
+     */
+    version: "2.0.2",
+    
+    /**
+     * Property: schemaLocation
+     * {String} http://www.opengis.net/cat/csw/2.0.2
+     *   http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd
+     */
+    schemaLocation: "http://www.opengis.net/cat/csw/2.0.2 http://schemas.opengis.net/csw/2.0.2/CSW-discovery.xsd",
+
+    /**
+     * APIProperty: requestId
+     * {String} Value of the requestId attribute of the GetRecords element.
+     */
+    requestId: null,
+
+    /**
+     * APIProperty: resultType
+     * {String} Value of the resultType attribute of the GetRecords element,
+     *     specifies the result type in the GetRecords response, "hits" is
+     *     the default.
+     */
+    resultType: null,
+
+    /**
+     * APIProperty: outputFormat
+     * {String} Value of the outputFormat attribute of the GetRecords element,
+     *     specifies the format of the GetRecords response,
+     *     "application/xml" is the default.
+     */
+    outputFormat: null,
+
+    /**
+     * APIProperty: outputSchema
+     * {String} Value of the outputSchema attribute of the GetRecords element,
+     *     specifies the schema of the GetRecords response.
+     */
+    outputSchema: null,
+
+    /**
+     * APIProperty: startPosition
+     * {String} Value of the startPosition attribute of the GetRecords element,
+     *     specifies the start position (offset+1) for the GetRecords response,
+     *     1 is the default.
+     */
+    startPosition: null,
+
+    /**
+     * APIProperty: maxRecords
+     * {String} Value of the maxRecords attribute of the GetRecords element,
+     *     specifies the maximum number of records in the GetRecords response,
+     *     10 is the default.
+     */
+    maxRecords: null,
+
+    /**
+     * APIProperty: DistributedSearch
+     * {String} Value of the csw:DistributedSearch element, used when writing
+     *     a csw:GetRecords document.
+     */
+    DistributedSearch: null,
+
+    /**
+     * APIProperty: ResponseHandler
+     * {Array({String})} Values of the csw:ResponseHandler elements, used when
+     *     writting a csw:GetRecords document.
+     */
+    ResponseHandler: null,
+
+    /**
+     * APIProperty: Query
+     * {String} Value of the csw:Query element, used when writing a csw:GetRecords
+     *     document.
+     */
+    Query: null,
+
+    /**
+     * Property: regExes
+     * Compiled regular expressions for manipulating strings.
+     */
+    regExes: {
+        trimSpace: (/^\s*|\s*$/g),
+        removeSpace: (/\s*/g),
+        splitSpace: (/\s+/),
+        trimComma: (/\s*,\s*/g)
+    },
+
+    /**
+     * Constructor: OpenLayers.Format.CSWGetRecords.v2_0_2
+     * A class for parsing and generating CSWGetRecords v2.0.2 transactions.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     *
+     * Valid options properties (documented as class properties):
+     * - requestId
+     * - resultType
+     * - outputFormat
+     * - outputSchema
+     * - startPosition
+     * - maxRecords
+     * - DistributedSearch
+     * - ResponseHandler
+     * - Query
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Parse the response from a GetRecords request.
+     */
+    read: function(data) {
+        if(typeof data == "string") { 
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var obj = {};
+        this.readNode(data, obj);
+        return obj;
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "csw": {
+            "GetRecordsResponse": function(node, obj) {
+                obj.records = [];
+                this.readChildNodes(node, obj);
+                var version = this.getAttributeNS(node, "", 'version');
+                if (version != "") {
+                    obj.version = version;
+                }
+            },
+            "RequestId": function(node, obj) {
+                obj.RequestId = this.getChildValue(node);
+            },
+            "SearchStatus": function(node, obj) {
+                obj.SearchStatus = {};
+                var timestamp = this.getAttributeNS(node, "", 'timestamp');
+                if (timestamp != "") {
+                    obj.SearchStatus.timestamp = timestamp;
+                }
+            },
+            "SearchResults": function(node, obj) {
+                this.readChildNodes(node, obj);
+                var attrs = node.attributes;
+                var SearchResults = {};
+                for(var i=0, len=attrs.length; i<len; ++i) {
+                    if ((attrs[i].name == "numberOfRecordsMatched") ||
+                        (attrs[i].name == "numberOfRecordsReturned") ||
+                        (attrs[i].name == "nextRecord")) {
+                        SearchResults[attrs[i].name] = parseInt(attrs[i].nodeValue);
+                    } else {
+                        SearchResults[attrs[i].name] = attrs[i].nodeValue;
+                    }
+                }
+                obj.SearchResults = SearchResults;
+            },
+            "SummaryRecord": function(node, obj) {
+                var record = {type: "SummaryRecord"};
+                this.readChildNodes(node, record);
+                obj.records.push(record);
+            },
+            "BriefRecord": function(node, obj) {
+                var record = {type: "BriefRecord"};
+                this.readChildNodes(node, record);
+                obj.records.push(record);
+            },
+            "DCMIRecord": function(node, obj) {
+                var record = {type: "DCMIRecord"};
+                this.readChildNodes(node, record);
+                obj.records.push(record);
+            },
+            "Record": function(node, obj) {
+                var record = {type: "Record"};
+                this.readChildNodes(node, record);
+                obj.records.push(record);
+            }
+        },
+        "dc": {
+            // audience, contributor, coverage, creator, date, description, format,
+            // identifier, language, provenance, publisher, relation, rights,
+            // rightsHolder, source, subject, title, type, URI
+            "*": function(node, obj) {
+                var name = node.localName || node.nodeName.split(":").pop();
+                if (!(obj[name] instanceof Array)) {
+                    obj[name] = new Array();
+                }
+                var dc_element = {};
+                var attrs = node.attributes;
+                for(var i=0, len=attrs.length; i<len; ++i) {
+                    dc_element[attrs[i].name] = attrs[i].nodeValue;
+                }
+                dc_element.value = this.getChildValue(node);
+                obj[name].push(dc_element);
+            }
+        },
+        "dct": {
+            // abstract, modified, spatial
+            "*": function(node, obj) {
+                var name = node.localName || node.nodeName.split(":").pop();
+                if (!(obj[name] instanceof Array)) {
+                    obj[name] = new Array();
+                }
+                obj[name].push(this.getChildValue(node));
+            }
+        },
+        "ows": OpenLayers.Util.applyDefaults({
+            "BoundingBox": function(node, obj) {
+                if (obj.bounds) {
+                    obj.BoundingBox = [{crs: obj.projection, value: 
+                        [
+                            obj.bounds.left, 
+                            obj.bounds.bottom, 
+                            obj.bounds.right, 
+                            obj.bounds.top
+                    ]
+                    }];
+                    delete obj.projection;
+                    delete obj.bounds;
+                }
+                OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers["ows"]["BoundingBox"].apply(
+                    this, arguments);
+            }
+        }, OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers["ows"])
+    },
+    
+    /**
+     * Method: write
+     * Given an configuration js object, write a CSWGetRecords request. 
+     *
+     * Parameters:
+     * options - {Object} A object mapping the request.
+     *
+     * Returns:
+     * {String} A serialized CSWGetRecords request.
+     */
+    write: function(options) {
+        var node = this.writeNode("csw:GetRecords", options);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [node]);
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "csw": {
+            "GetRecords": function(options) {
+                if (!options) {
+                    options = {};
+                }
+                var node = this.createElementNSPlus("csw:GetRecords", {
+                    attributes: {
+                        service: "CSW",
+                        version: this.version,
+                        requestId: options.requestId || this.requestId,
+                        resultType: options.resultType || this.resultType,
+                        outputFormat: options.outputFormat || this.outputFormat,
+                        outputSchema: options.outputSchema || this.outputSchema,
+                        startPosition: options.startPosition || this.startPosition,
+                        maxRecords: options.maxRecords || this.maxRecords
+                    }
+                });
+                if (options.DistributedSearch || this.DistributedSearch) {
+                    this.writeNode(
+                        "csw:DistributedSearch",
+                        options.DistributedSearch || this.DistributedSearch,
+                        node
+                    );
+                }
+                var ResponseHandler = options.ResponseHandler || this.ResponseHandler;
+                if (ResponseHandler instanceof Array && ResponseHandler.length > 0) {
+                    // ResponseHandler must be a non-empty array
+                    for(var i=0, len=ResponseHandler.length; i<len; i++) {
+                        this.writeNode(
+                            "csw:ResponseHandler",
+                            ResponseHandler[i],
+                            node
+                        );
+                    }
+                }
+                this.writeNode("Query", options.Query || this.Query, node);
+                return node;
+            },
+            "DistributedSearch": function(options) {
+                var node = this.createElementNSPlus("csw:DistributedSearch", {
+                    attributes: {
+                        hopCount: options.hopCount
+                    }
+                });
+                return node;
+            },
+            "ResponseHandler": function(options) {
+                var node = this.createElementNSPlus("csw:ResponseHandler", {
+                    value: options.value
+                });
+                return node;
+            },
+            "Query": function(options) {
+                if (!options) {
+                    options = {};
+                }
+                var node = this.createElementNSPlus("csw:Query", {
+                    attributes: {
+                        typeNames: options.typeNames || "csw:Record"
+                    }
+                });
+                var ElementName = options.ElementName;
+                if (ElementName instanceof Array && ElementName.length > 0) {
+                    // ElementName must be a non-empty array
+                    for(var i=0, len=ElementName.length; i<len; i++) {
+                        this.writeNode(
+                            "csw:ElementName",
+                            ElementName[i],
+                            node
+                        );
+                    }
+                } else {
+                    this.writeNode(
+                        "csw:ElementSetName",
+                        options.ElementSetName || {value: 'summary'},
+                        node
+                    );
+                }
+                if (options.Constraint) {
+                    this.writeNode(
+                        "csw:Constraint",
+                        options.Constraint,
+                        node
+                    );
+                }
+                //TODO: not implemented in ogc filters?
+                //if (options.SortBy) {
+                    //this.writeNode(
+                        //"ogc:SortBy",
+                        //options.SortBy,
+                        //node
+                    //);
+                //}
+                return node;
+            },
+            "ElementName": function(options) {
+                var node = this.createElementNSPlus("csw:ElementName", {
+                    value: options.value
+                });
+                return node;
+            },
+            "ElementSetName": function(options) {
+                var node = this.createElementNSPlus("csw:ElementSetName", {
+                    attributes: {
+                        typeNames: options.typeNames
+                    },
+                    value: options.value
+                });
+                return node;
+            },
+            "Constraint": function(options) {
+                var node = this.createElementNSPlus("csw:Constraint", {
+                    attributes: {
+                        version: options.version
+                    }
+                });
+                if (options.Filter) {
+                    var format = new OpenLayers.Format.Filter({
+                        version: options.version
+                    });
+                    node.appendChild(format.write(options.Filter));
+                } else if (options.CqlText) {
+                    var child = this.createElementNSPlus("CqlText", {
+                        value: options.CqlText.value
+                    });
+                    node.appendChild(child);
+                }
+                return node;
+            }
+        }
+    },
+   
+    CLASS_NAME: "OpenLayers.Format.CSWGetRecords.v2_0_2" 
+});
diff --git a/lib/OpenLayers/Format/Context.js b/lib/OpenLayers/Format/Context.js
new file mode 100644
index 0000000..5386df2
--- /dev/null
+++ b/lib/OpenLayers/Format/Context.js
@@ -0,0 +1,334 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.Context
+ * Base class for both Format.WMC and Format.OWSContext
+ */
+OpenLayers.Format.Context = OpenLayers.Class({
+
+    /**
+     * APIProperty: version
+     * {String} Specify a version string if one is known.
+     */
+    version: null,
+
+    /**
+     * Property: layerOptions
+     * {Object} Default options for layers created by the parser. These
+     *     options are overridden by the options which are read from the
+     *     capabilities document.
+     */
+    layerOptions: null,
+
+    /**
+     * Property: layerParams
+     * {Object} Default parameters for layers created by the parser. This
+     *     can be used e.g. to override DEFAULT_PARAMS for 
+     *     OpenLayers.Layer.WMS.
+     */
+    layerParams: null,
+
+    /**
+     * Property: parser
+     * {Object} Instance of the versioned parser.  Cached for multiple read and
+     *     write calls of the same version.
+     */
+    parser: null,
+
+    /**
+     * Constructor: OpenLayers.Format.Context
+     * Create a new parser for Context documents.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Util.extend(this, options);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read Context data from a string, and return an object with map
+     *     properties and a list of layers.
+     *
+     * Parameters:
+     * data - {String} or {DOMElement} data to read/parse.
+     * options - {Object} The options object must contain a map property.  If
+     *     the map property is a string, it must be the id of a dom element
+     *     where the new map will be placed.  If the map property is an
+     *     <OpenLayers.Map>, the layers from the context document will be added
+     *     to the map.
+     *
+     * Returns:
+     * {<OpenLayers.Map>} A map based on the context.
+     */
+    read: function(data, options) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        var version = this.version;
+        if(!version) {
+            version = root.getAttribute("version");
+        }
+        var parser = this.getParser(version);
+        var context = parser.read(data, options);
+        var map;
+        if(options && options.map) {
+            this.context = context;
+            if(options.map instanceof OpenLayers.Map) {
+                map = this.mergeContextToMap(context, options.map);
+            } else {
+                var mapOptions = options.map;
+                if(OpenLayers.Util.isElement(mapOptions) ||
+                   typeof mapOptions == "string") {
+                    // we assume mapOptions references a div
+                    // element
+                    mapOptions = {div: mapOptions};
+                }
+                map = this.contextToMap(context, mapOptions);
+            }
+        } else {
+            // not documented as part of the API, provided as a non-API option
+            map = context;
+        }
+        return map;
+    },
+
+    /**
+     * Method: getLayerFromContext
+     * Create a WMS layer from a layerContext object.
+     *
+     * Parameters:
+     * layerContext - {Object} An object representing a WMS layer.
+     *
+     * Returns:
+     * {<OpenLayers.Layer.WMS>} A WMS layer.
+     */
+    getLayerFromContext: function(layerContext) {
+        var i, len;
+        // fill initial options object from layerContext
+        var options = {
+            queryable: layerContext.queryable, //keep queryable for api compatibility
+            visibility: layerContext.visibility,
+            maxExtent: layerContext.maxExtent,
+            metadata: OpenLayers.Util.applyDefaults(layerContext.metadata, 
+                {styles: layerContext.styles}),
+            numZoomLevels: layerContext.numZoomLevels,
+            units: layerContext.units,
+            isBaseLayer: layerContext.isBaseLayer,
+            opacity: layerContext.opacity,
+            displayInLayerSwitcher: layerContext.displayInLayerSwitcher,
+            singleTile: layerContext.singleTile,
+            tileSize: (layerContext.tileSize) ? 
+                new OpenLayers.Size(
+                    layerContext.tileSize.width, 
+                    layerContext.tileSize.height
+                ) : undefined,
+            minScale: layerContext.minScale || layerContext.maxScaleDenominator,
+            maxScale: layerContext.maxScale || layerContext.minScaleDenominator
+        };
+        if (this.layerOptions) {
+            OpenLayers.Util.applyDefaults(options, this.layerOptions);
+        }
+
+        var params = {
+            layers: layerContext.name,
+            transparent: layerContext.transparent,
+            version: layerContext.version
+        };
+        if (layerContext.formats && layerContext.formats.length>0) {
+            // set default value for params if current attribute is not positionned
+            params.format = layerContext.formats[0].value;
+            for (i=0, len=layerContext.formats.length; i<len; i++) {
+                var format = layerContext.formats[i];
+                if (format.current == true) {
+                    params.format = format.value;
+                    break;
+                }
+            }
+        }
+        if (layerContext.styles && layerContext.styles.length>0) {
+            for (i=0, len=layerContext.styles.length; i<len; i++) {
+                var style = layerContext.styles[i];
+                if (style.current == true) {
+                    // three style types to consider
+                    // 1) linked SLD
+                    // 2) inline SLD
+                    // 3) named style
+                    if(style.href) {
+                        params.sld = style.href;
+                    } else if(style.body) {
+                        params.sld_body = style.body;
+                    } else {
+                        params.styles = style.name;
+                    }
+                    break;
+                }
+            }
+        }
+        if (this.layerParams) {
+            OpenLayers.Util.applyDefaults(params, this.layerParams);
+        }
+
+        var layer = null;
+        var service = layerContext.service;
+        if (service == OpenLayers.Format.Context.serviceTypes.WFS) {
+            options.strategies = [new OpenLayers.Strategy.BBOX()];
+            options.protocol = new OpenLayers.Protocol.WFS({
+                url: layerContext.url,
+                // since we do not know featureNS, let the protocol
+                // determine it automagically using featurePrefix
+                featurePrefix: layerContext.name.split(":")[0],
+                featureType: layerContext.name.split(":").pop()
+            });
+            layer = new OpenLayers.Layer.Vector(
+                layerContext.title || layerContext.name,
+                options
+            );
+        } else if (service == OpenLayers.Format.Context.serviceTypes.KML) {
+            // use a vector layer with an HTTP Protcol and a Fixed strategy
+            options.strategies = [new OpenLayers.Strategy.Fixed()];
+            options.protocol = new OpenLayers.Protocol.HTTP({
+                url: layerContext.url, 
+                format: new OpenLayers.Format.KML()
+            });
+            layer = new OpenLayers.Layer.Vector(
+                layerContext.title || layerContext.name,
+                options
+            );
+        } else if (service == OpenLayers.Format.Context.serviceTypes.GML) {
+            // use a vector layer with a HTTP Protocol and a Fixed strategy
+            options.strategies = [new OpenLayers.Strategy.Fixed()];
+            options.protocol = new OpenLayers.Protocol.HTTP({
+                url: layerContext.url, 
+                format: new OpenLayers.Format.GML()
+            });
+            layer = new OpenLayers.Layer.Vector(
+                layerContext.title || layerContext.name,
+                options
+            );
+        } else if (layerContext.features) {
+            // inline GML or KML features
+            layer = new OpenLayers.Layer.Vector(
+                layerContext.title || layerContext.name,
+                options
+            );
+            layer.addFeatures(layerContext.features);
+        } else if (layerContext.categoryLayer !== true) {
+            layer = new OpenLayers.Layer.WMS(
+                layerContext.title || layerContext.name,
+                layerContext.url,
+                params,
+                options
+            );
+        }
+        return layer;
+    },
+
+    /**
+     * Method: getLayersFromContext
+     * Create an array of layers from an array of layerContext objects.
+     *
+     * Parameters:
+     * layersContext - {Array(Object)} An array of objects representing layers.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Layer>)} An array of layers.
+     */
+    getLayersFromContext: function(layersContext) {
+        var layers = [];
+        for (var i=0, len=layersContext.length; i<len; i++) {
+            var layer = this.getLayerFromContext(layersContext[i]);
+            if (layer !== null) {
+                layers.push(layer);
+            }
+        }
+        return layers;
+    },
+
+    /**
+     * Method: contextToMap
+     * Create a map given a context object.
+     *
+     * Parameters:
+     * context - {Object} The context object.
+     * options - {Object} Default map options.
+     *
+     * Returns:
+     * {<OpenLayers.Map>} A map based on the context object.
+     */
+    contextToMap: function(context, options) {
+        options = OpenLayers.Util.applyDefaults({
+            maxExtent: context.maxExtent,
+            projection: context.projection
+        }, options);
+        var map = new OpenLayers.Map(options);
+        map.addLayers(this.getLayersFromContext(context.layersContext));
+        map.setCenter(
+            context.bounds.getCenterLonLat(),
+            map.getZoomForExtent(context.bounds, true)
+        );
+        return map;
+    },
+
+    /**
+     * Method: mergeContextToMap
+     * Add layers from a context object to a map.
+     *
+     * Parameters:
+     * context - {Object} The context object.
+     * map - {<OpenLayers.Map>} The map.
+     *
+     * Returns:
+     * {<OpenLayers.Map>} The same map with layers added.
+     */
+    mergeContextToMap: function(context, map) {
+        map.addLayers(this.getLayersFromContext(context.layersContext));
+        return map;
+    },
+
+    /**
+     * APIMethod: write
+     * Write a context document given a map.
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Map> | Object} A map or context object.
+     * options - {Object} Optional configuration object.
+     *
+     * Returns:
+     * {String} A context document string.
+     */
+    write: function(obj, options) {
+        obj = this.toContext(obj);
+        var version = options && options.version;
+        var parser = this.getParser(version);
+        var context = parser.write(obj, options);
+        return context;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.Context"
+});
+
+/**
+ * Constant: OpenLayers.Format.Context.serviceTypes
+ * Enumeration for service types
+ */
+OpenLayers.Format.Context.serviceTypes = {
+    "WMS": "urn:ogc:serviceType:WMS",
+    "WFS": "urn:ogc:serviceType:WFS",
+    "WCS": "urn:ogc:serviceType:WCS",
+    "GML": "urn:ogc:serviceType:GML",
+    "SLD": "urn:ogc:serviceType:SLD",
+    "FES": "urn:ogc:serviceType:FES",
+    "KML": "urn:ogc:serviceType:KML"
+};
diff --git a/lib/OpenLayers/Format/Filter.js b/lib/OpenLayers/Format/Filter.js
new file mode 100644
index 0000000..1361aaa
--- /dev/null
+++ b/lib/OpenLayers/Format/Filter.js
@@ -0,0 +1,115 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Filter/FeatureId.js
+ * @requires OpenLayers/Filter/Logical.js
+ * @requires OpenLayers/Filter/Comparison.js
+ */
+
+/**
+ * Class: OpenLayers.Format.Filter
+ * Read/Wite ogc:Filter. Create a new instance with the <OpenLayers.Format.Filter>
+ *     constructor.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.Filter = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "1.0.0".
+     */
+    defaultVersion: "1.0.0",
+    
+    /**
+     * APIProperty: version
+     * {String} Specify a version string if one is known.
+     */
+    version: null,
+    
+    /**
+     * Property: parser
+     * {Object} Instance of the versioned parser.  Cached for multiple read and
+     *     write calls of the same version.
+     */
+    parser: null,
+
+    /**
+     * Constructor: OpenLayers.Format.Filter
+     * Create a new parser for Filter.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: write
+     * Write an ogc:Filter given a filter object.
+     *
+     * Parameters:
+     * filter - {<OpenLayers.Filter>} An filter.
+     * options - {Object} Optional configuration object.
+     *
+     * Returns:
+     * {Elment} An ogc:Filter element node.
+     */
+    write: function(filter, options) {
+        var version = (options && options.version) ||
+                      this.version || this.defaultVersion;
+        if(!this.parser || this.parser.VERSION != version) {
+            var format = OpenLayers.Format.Filter[
+                "v" + version.replace(/\./g, "_")
+            ];
+            if(!format) {
+                throw "Can't find a Filter parser for version " +
+                      version;
+            }
+            this.parser = new format(this.options);
+        }
+        return this.parser.write(filter);
+        //return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
+    },
+    
+    /**
+     * APIMethod: read
+     * Read and Filter doc and return an object representing the Filter.
+     *
+     * Parameters:
+     * data - {String | DOMElement} Data to read.
+     *
+     * Returns:
+     * {<OpenLayers.Filter>} A filter object.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var version = this.version;
+        if(!version) {
+            version = this.defaultVersion;
+        }
+        if(!this.parser || this.parser.VERSION != version) {
+            var format = OpenLayers.Format.Filter[
+                "v" + version.replace(/\./g, "_")
+            ];
+            if(!format) {
+                throw "Can't find a Filter parser for version " +
+                      version;
+            }
+            this.parser = new format(this.options);
+        }
+        var filter = this.parser.read(data);
+        return filter;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.Filter" 
+});
diff --git a/lib/OpenLayers/Format/Filter/v1.js b/lib/OpenLayers/Format/Filter/v1.js
new file mode 100644
index 0000000..713c45f
--- /dev/null
+++ b/lib/OpenLayers/Format/Filter/v1.js
@@ -0,0 +1,426 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/Filter.js
+ * @requires OpenLayers/Format/XML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.Filter.v1
+ * Superclass for Filter version 1 parsers.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        ogc: "http://www.opengis.net/ogc",
+        gml: "http://www.opengis.net/gml",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    
+    /**
+     * Property: defaultPrefix
+     */
+    defaultPrefix: "ogc",
+
+    /**
+     * Property: schemaLocation
+     * {String} Schema location for a particular minor version.
+     */
+    schemaLocation: null,
+    
+    /**
+     * Constructor: OpenLayers.Format.Filter.v1
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.Filter> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Method: read
+     *
+     * Parameters:
+     * data - {DOMElement} A Filter document element.
+     *
+     * Returns:
+     * {<OpenLayers.Filter>} A filter object.
+     */
+    read: function(data) {
+        var obj = {};
+        this.readers.ogc["Filter"].apply(this, [data, obj]);
+        return obj.filter;
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "ogc": {
+            "Filter": function(node, parent) {
+                // Filters correspond to subclasses of OpenLayers.Filter.
+                // Since they contain information we don't persist, we
+                // create a temporary object and then pass on the filter
+                // (ogc:Filter) to the parent obj.
+                var obj = {
+                    fids: [],
+                    filters: []
+                };
+                this.readChildNodes(node, obj);
+                if(obj.fids.length > 0) {
+                    parent.filter = new OpenLayers.Filter.FeatureId({
+                        fids: obj.fids
+                    });
+                } else if(obj.filters.length > 0) {
+                    parent.filter = obj.filters[0];
+                }
+            },
+            "FeatureId": function(node, obj) {
+                var fid = node.getAttribute("fid");
+                if(fid) {
+                    obj.fids.push(fid);
+                }
+            },
+            "And": function(node, obj) {
+                var filter = new OpenLayers.Filter.Logical({
+                    type: OpenLayers.Filter.Logical.AND
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "Or": function(node, obj) {
+                var filter = new OpenLayers.Filter.Logical({
+                    type: OpenLayers.Filter.Logical.OR
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "Not": function(node, obj) {
+                var filter = new OpenLayers.Filter.Logical({
+                    type: OpenLayers.Filter.Logical.NOT
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsLessThan": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LESS_THAN
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsGreaterThan": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.GREATER_THAN
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsLessThanOrEqualTo": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsGreaterThanOrEqualTo": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsBetween": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.BETWEEN
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "Literal": function(node, obj) {
+                obj.value = OpenLayers.String.numericIf(
+                    this.getChildValue(node));
+            },
+            "PropertyName": function(node, filter) {
+                filter.property = this.getChildValue(node);
+            },
+            "LowerBoundary": function(node, filter) {
+                filter.lowerBoundary = OpenLayers.String.numericIf(
+                    this.readOgcExpression(node));
+            },
+            "UpperBoundary": function(node, filter) {
+                filter.upperBoundary = OpenLayers.String.numericIf(
+                    this.readOgcExpression(node));
+            },
+            "Intersects": function(node, obj) {
+                this.readSpatial(node, obj, OpenLayers.Filter.Spatial.INTERSECTS);
+            },
+            "Within": function(node, obj) {
+                this.readSpatial(node, obj, OpenLayers.Filter.Spatial.WITHIN);
+            },
+            "Contains": function(node, obj) {
+                this.readSpatial(node, obj, OpenLayers.Filter.Spatial.CONTAINS);
+            },
+            "DWithin": function(node, obj) {
+                this.readSpatial(node, obj, OpenLayers.Filter.Spatial.DWITHIN);
+            },
+            "Distance": function(node, obj) {
+                obj.distance = parseInt(this.getChildValue(node));
+                obj.distanceUnits = node.getAttribute("units");
+            }
+        }
+    },
+    
+    /**
+     * Method: readSpatial
+     *
+     * Read a {<OpenLayers.Filter.Spatial>} filter.
+     * 
+     * Parameters:
+     * node - {DOMElement} A DOM element that contains an ogc:expression.
+     * obj - {Object} The target object.
+     * type - {String} One of the OpenLayers.Filter.Spatial.* constants.
+     *
+     * Returns:
+     * {<OpenLayers.Filter.Spatial>} The created filter.
+     */
+    readSpatial: function(node, obj, type) {
+        var filter = new OpenLayers.Filter.Spatial({
+            type: type
+        });
+        this.readChildNodes(node, filter);
+        filter.value = filter.components[0];
+        delete filter.components;
+        obj.filters.push(filter);
+    },
+
+    /**
+     * Method: readOgcExpression
+     * Limited support for OGC expressions.
+     *
+     * Parameters:
+     * node - {DOMElement} A DOM element that contains an ogc:expression.
+     *
+     * Returns:
+     * {String} A value to be used in a symbolizer.
+     */
+    readOgcExpression: function(node) {
+        var obj = {};
+        this.readChildNodes(node, obj);
+        var value = obj.value;
+        if(value === undefined) {
+            value = this.getChildValue(node);
+        }
+        return value;
+    },
+
+    /**
+     * Method: write
+     *
+     * Parameters:
+     * filter - {<OpenLayers.Filter>} A filter object.
+     *
+     * Returns:
+     * {DOMElement} An ogc:Filter element.
+     */
+    write: function(filter) {
+        return this.writers.ogc["Filter"].apply(this, [filter]);
+    },
+    
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "ogc": {
+            "Filter": function(filter) {
+                var node = this.createElementNSPlus("ogc:Filter");
+                var sub = filter.CLASS_NAME.split(".").pop();
+                if(sub == "FeatureId") {
+                    for(var i=0; i<filter.fids.length; ++i) {
+                        this.writeNode("FeatureId", filter.fids[i], node);
+                    }
+                } else {
+                    this.writeNode(this.getFilterType(filter), filter, node);
+                }
+                return node;
+            },
+            "FeatureId": function(fid) {
+                return this.createElementNSPlus("ogc:FeatureId", {
+                    attributes: {fid: fid}
+                });
+            },
+            "And": function(filter) {
+                var node = this.createElementNSPlus("ogc:And");
+                var childFilter;
+                for(var i=0; i<filter.filters.length; ++i) {
+                    childFilter = filter.filters[i];
+                    this.writeNode(
+                        this.getFilterType(childFilter), childFilter, node
+                    );
+                }
+                return node;
+            },
+            "Or": function(filter) {
+                var node = this.createElementNSPlus("ogc:Or");
+                var childFilter;
+                for(var i=0; i<filter.filters.length; ++i) {
+                    childFilter = filter.filters[i];
+                    this.writeNode(
+                        this.getFilterType(childFilter), childFilter, node
+                    );
+                }
+                return node;
+            },
+            "Not": function(filter) {
+                var node = this.createElementNSPlus("ogc:Not");
+                var childFilter = filter.filters[0];
+                this.writeNode(
+                    this.getFilterType(childFilter), childFilter, node
+                );
+                return node;
+            },
+            "PropertyIsLessThan": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsLessThan");
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("Literal", filter.value, node);                
+                return node;
+            },
+            "PropertyIsGreaterThan": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsGreaterThan");
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("Literal", filter.value, node);
+                return node;
+            },
+            "PropertyIsLessThanOrEqualTo": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsLessThanOrEqualTo");
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("Literal", filter.value, node);
+                return node;
+            },
+            "PropertyIsGreaterThanOrEqualTo": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsGreaterThanOrEqualTo");
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("Literal", filter.value, node);
+                return node;
+            },
+            "PropertyIsBetween": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsBetween");
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("LowerBoundary", filter, node);
+                this.writeNode("UpperBoundary", filter, node);
+                return node;
+            },
+            "PropertyName": function(filter) {
+                // no ogc:expression handling for now
+                return this.createElementNSPlus("ogc:PropertyName", {
+                    value: filter.property
+                });
+            },
+            "Literal": function(value) {
+                // no ogc:expression handling for now
+                return this.createElementNSPlus("ogc:Literal", {
+                    value: value
+                });
+            },
+            "LowerBoundary": function(filter) {
+                // no ogc:expression handling for now
+                var node = this.createElementNSPlus("ogc:LowerBoundary");
+                this.writeNode("Literal", filter.lowerBoundary, node);
+                return node;
+            },
+            "UpperBoundary": function(filter) {
+                // no ogc:expression handling for now
+                var node = this.createElementNSPlus("ogc:UpperBoundary");
+                this.writeNode("Literal", filter.upperBoundary, node);
+                return node;
+            },
+            "INTERSECTS": function(filter) {
+                return this.writeSpatial(filter, "Intersects");
+            },
+            "WITHIN": function(filter) {
+                return this.writeSpatial(filter, "Within");
+            },
+            "CONTAINS": function(filter) {
+                return this.writeSpatial(filter, "Contains");
+            },
+            "DWITHIN": function(filter) {
+                var node = this.writeSpatial(filter, "DWithin");
+                this.writeNode("Distance", filter, node);
+                return node;
+            },
+            "Distance": function(filter) {
+                return this.createElementNSPlus("ogc:Distance", {
+                    attributes: {
+                        units: filter.distanceUnits
+                    },
+                    value: filter.distance
+                });
+            }
+        }
+    },
+
+    /**
+     * Method: getFilterType
+     */
+    getFilterType: function(filter) {
+        var filterType = this.filterMap[filter.type];
+        if(!filterType) {
+            throw "Filter writing not supported for rule type: " + filter.type;
+        }
+        return filterType;
+    },
+    
+    /**
+     * Property: filterMap
+     * {Object} Contains a member for each filter type.  Values are node names
+     *     for corresponding OGC Filter child elements.
+     */
+    filterMap: {
+        "&&": "And",
+        "||": "Or",
+        "!": "Not",
+        "==": "PropertyIsEqualTo",
+        "!=": "PropertyIsNotEqualTo",
+        "<": "PropertyIsLessThan",
+        ">": "PropertyIsGreaterThan",
+        "<=": "PropertyIsLessThanOrEqualTo",
+        ">=": "PropertyIsGreaterThanOrEqualTo",
+        "..": "PropertyIsBetween",
+        "~": "PropertyIsLike",
+        "BBOX": "BBOX",
+        "DWITHIN": "DWITHIN",
+        "WITHIN": "WITHIN",
+        "CONTAINS": "CONTAINS",
+        "INTERSECTS": "INTERSECTS"
+    },
+
+    CLASS_NAME: "OpenLayers.Format.Filter.v1" 
+
+});
diff --git a/lib/OpenLayers/Format/Filter/v1_0_0.js b/lib/OpenLayers/Format/Filter/v1_0_0.js
new file mode 100644
index 0000000..55ce2e4
--- /dev/null
+++ b/lib/OpenLayers/Format/Filter/v1_0_0.js
@@ -0,0 +1,169 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/GML/v2.js
+ * @requires OpenLayers/Format/Filter/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.Filter.v1_0_0
+ * Write ogc:Filter version 1.0.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.GML.v2>
+ *  - <OpenLayers.Format.Filter.v1>
+ */
+OpenLayers.Format.Filter.v1_0_0 = OpenLayers.Class(
+    OpenLayers.Format.GML.v2, OpenLayers.Format.Filter.v1, {
+    
+    /**
+     * Constant: VERSION
+     * {String} 1.0.0
+     */
+    VERSION: "1.0.0",
+    
+    /**
+     * Property: schemaLocation
+     * {String} http://www.opengis.net/ogc/filter/1.0.0/filter.xsd
+     */
+    schemaLocation: "http://www.opengis.net/ogc/filter/1.0.0/filter.xsd",
+
+    /**
+     * Constructor: OpenLayers.Format.Filter.v1_0_0
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.Filter> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.GML.v2.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "ogc": OpenLayers.Util.applyDefaults({
+            "PropertyIsEqualTo": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsNotEqualTo": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsLike": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LIKE
+                });
+                this.readChildNodes(node, filter);
+                var wildCard = node.getAttribute("wildCard");
+                var singleChar = node.getAttribute("singleChar");
+                var esc = node.getAttribute("escape");
+                filter.value2regex(wildCard, singleChar, esc);
+                obj.filters.push(filter);
+            }
+        }, OpenLayers.Format.Filter.v1.prototype.readers["ogc"]),
+        "gml": OpenLayers.Format.GML.v2.prototype.readers["gml"],
+        "feature": OpenLayers.Format.GML.v2.prototype.readers["feature"]        
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "ogc": OpenLayers.Util.applyDefaults({
+            "PropertyIsEqualTo": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsEqualTo");
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("Literal", filter.value, node);
+                return node;
+            },
+            "PropertyIsNotEqualTo": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsNotEqualTo");
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("Literal", filter.value, node);
+                return node;
+            },
+            "PropertyIsLike": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsLike", {
+                    attributes: {
+                        wildCard: "*", singleChar: ".", escape: "!"
+                    }
+                });
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                // convert regex string to ogc string
+                this.writeNode("Literal", filter.regex2value(), node);
+                return node;
+            },
+            "BBOX": function(filter) {
+                var node = this.createElementNSPlus("ogc:BBOX");
+                this.writeNode("PropertyName", filter, node);
+                var box = this.writeNode("gml:Box", filter.value, node);
+                if(filter.projection) {
+                    box.setAttribute("srsName", filter.projection);
+                }
+                return node;
+            }}, OpenLayers.Format.Filter.v1.prototype.writers["ogc"]),
+            
+        "gml": OpenLayers.Format.GML.v2.prototype.writers["gml"],
+        "feature": OpenLayers.Format.GML.v2.prototype.writers["feature"]
+        
+    },
+
+    /**
+     * Method: writeSpatial
+     *
+     * Read a {<OpenLayers.Filter.Spatial>} filter and converts it into XML.
+     *
+     * Parameters:
+     * filter - {<OpenLayers.Filter.Spatial>} The filter.
+     * name - {String} Name of the generated XML element.
+     *
+     * Returns:
+     * {DOMElement} The created XML element.
+     */
+    writeSpatial: function(filter, name) {
+        var node = this.createElementNSPlus("ogc:"+name);
+        this.writeNode("PropertyName", filter, node);
+        var child;
+        if(filter.value instanceof OpenLayers.Geometry) {
+            child = this.writeNode("feature:_geometry", filter.value).firstChild;
+        } else {
+            child = this.writeNode("gml:Box", filter.value);
+        }
+        if(filter.projection) {
+            child.setAttribute("srsName", filter.projection);
+        }
+        node.appendChild(child);
+        return node;
+    },
+
+
+    CLASS_NAME: "OpenLayers.Format.Filter.v1_0_0" 
+
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Format/Filter/v1_1_0.js b/lib/OpenLayers/Format/Filter/v1_1_0.js
new file mode 100644
index 0000000..ced6a67
--- /dev/null
+++ b/lib/OpenLayers/Format/Filter/v1_1_0.js
@@ -0,0 +1,182 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/Filter/v1.js
+ * @requires OpenLayers/Format/GML/v3.js
+ */
+
+/**
+ * Class: OpenLayers.Format.Filter.v1_1_0
+ * Write ogc:Filter version 1.1.0.
+ *
+ * Differences from the v1.0.0 parser:
+ *  - uses GML v3 instead of GML v2
+ *  - reads matchCase attribute on ogc:PropertyIsEqual and
+ *        ogc:PropertyIsNotEqualelements.
+ *  - writes matchCase attribute from comparison filters of type EQUAL_TO and
+ *        type NOT_EQUAL_TO.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.Filter.v1>
+ */
+OpenLayers.Format.Filter.v1_1_0 = OpenLayers.Class(
+    OpenLayers.Format.GML.v3, OpenLayers.Format.Filter.v1, {
+    
+    /**
+     * Constant: VERSION
+     * {String} 1.1.0
+     */
+    VERSION: "1.1.0",
+    
+    /**
+     * Property: schemaLocation
+     * {String} http://www.opengis.net/ogc/filter/1.1.0/filter.xsd
+     */
+    schemaLocation: "http://www.opengis.net/ogc/filter/1.1.0/filter.xsd",
+
+    /**
+     * Constructor: OpenLayers.Format.Filter.v1_1_0
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.Filter> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.GML.v3.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "ogc": OpenLayers.Util.applyDefaults({
+            "PropertyIsEqualTo": function(node, obj) {
+                var matchCase = node.getAttribute("matchCase");
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                    matchCase: !(matchCase === "false" || matchCase === "0")
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsNotEqualTo": function(node, obj) {
+                var matchCase = node.getAttribute("matchCase");
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                    matchCase: !(matchCase === "false" || matchCase === "0")
+                });
+                this.readChildNodes(node, filter);
+                obj.filters.push(filter);
+            },
+            "PropertyIsLike": function(node, obj) {
+                var filter = new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LIKE
+                });
+                this.readChildNodes(node, filter);
+                var wildCard = node.getAttribute("wildCard");
+                var singleChar = node.getAttribute("singleChar");
+                var esc = node.getAttribute("escapeChar");
+                filter.value2regex(wildCard, singleChar, esc);
+                obj.filters.push(filter);
+            }
+        }, OpenLayers.Format.Filter.v1.prototype.readers["ogc"]),
+        "gml": OpenLayers.Format.GML.v3.prototype.readers["gml"],
+        "feature": OpenLayers.Format.GML.v3.prototype.readers["feature"]        
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "ogc": OpenLayers.Util.applyDefaults({
+            "PropertyIsEqualTo": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsEqualTo", {
+                    attributes: {matchCase: filter.matchCase}
+                });
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("Literal", filter.value, node);
+                return node;
+            },
+            "PropertyIsNotEqualTo": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsNotEqualTo", {
+                    attributes: {matchCase: filter.matchCase}
+                });
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                this.writeNode("Literal", filter.value, node);
+                return node;
+            },
+            "PropertyIsLike": function(filter) {
+                var node = this.createElementNSPlus("ogc:PropertyIsLike", {
+                    attributes: {
+                        wildCard: "*", singleChar: ".", escapeChar: "!"
+                    }
+                });
+                // no ogc:expression handling for now
+                this.writeNode("PropertyName", filter, node);
+                // convert regex string to ogc string
+                this.writeNode("Literal", filter.regex2value(), node);
+                return node;
+            },
+            "BBOX": function(filter) {
+                var node = this.createElementNSPlus("ogc:BBOX");
+                this.writeNode("PropertyName", filter, node);
+                var box = this.writeNode("gml:Envelope", filter.value);
+                if(filter.projection) {
+                    box.setAttribute("srsName", filter.projection);
+                }
+                node.appendChild(box); 
+                return node;
+            }}, OpenLayers.Format.Filter.v1.prototype.writers["ogc"]),
+            
+        "gml": OpenLayers.Format.GML.v3.prototype.writers["gml"],
+        "feature": OpenLayers.Format.GML.v3.prototype.writers["feature"]
+    },
+
+    /**
+     * Method: writeSpatial
+     *
+     * Read a {<OpenLayers.Filter.Spatial>} filter and converts it into XML.
+     *
+     * Parameters:
+     * filter - {<OpenLayers.Filter.Spatial>} The filter.
+     * name - {String} Name of the generated XML element.
+     *
+     * Returns:
+     * {DOMElement} The created XML element.
+     */
+    writeSpatial: function(filter, name) {
+        var node = this.createElementNSPlus("ogc:"+name);
+        this.writeNode("PropertyName", filter, node);
+        var child;
+        if(filter.value instanceof OpenLayers.Geometry) {
+            child = this.writeNode("feature:_geometry", filter.value).firstChild;
+        } else {
+            child = this.writeNode("gml:Envelope", filter.value);
+        }
+        if(filter.projection) {
+            child.setAttribute("srsName", filter.projection);
+        }
+        node.appendChild(child);
+        return node;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.Filter.v1_1_0" 
+
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Format/GML.js b/lib/OpenLayers/Format/GML.js
new file mode 100644
index 0000000..d34ce52
--- /dev/null
+++ b/lib/OpenLayers/Format/GML.js
@@ -0,0 +1,924 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Geometry/Point.js
+ * @requires OpenLayers/Geometry/MultiPoint.js
+ * @requires OpenLayers/Geometry/LineString.js
+ * @requires OpenLayers/Geometry/MultiLineString.js
+ * @requires OpenLayers/Geometry/Polygon.js
+ * @requires OpenLayers/Geometry/MultiPolygon.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * 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", 
+    
+    /*
+     * 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.
+     */
+    gmlns: "http://www.opengis.net/gml",
+
+    /**
+     * APIProperty: extractAttributes
+     * {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.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        // compile regular expressions once instead of every time they are used
+        this.regExes = {
+            trimSpace: (/^\s*|\s*$/g),
+            removeSpace: (/\s*/g),
+            splitSpace: (/\s+/),
+            trimComma: (/\s*,\s*/g)
+        };
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Read data from a string, and return a list of features. 
+     * 
+     * Parameters:
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Feature.Vector>)} An array of features.
+     */
+    read: function(data) {
+        if(typeof data == "string") { 
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var featureNodes = this.getElementsByTagNameNS(data.documentElement,
+                                                       this.gmlns,
+                                                       this.featureName);
+        var features = [];
+        for(var i=0; i<featureNodes.length; i++) {
+            var feature = this.parseFeature(featureNodes[i]);
+            if(feature) {
+                features.push(feature);
+            }
+        }
+        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. 
+     */
+    parseFeature: function(node) {
+        // only accept one geometry per feature - look for highest "order"
+        var order = ["MultiPolygon", "Polygon",
+                     "MultiLineString", "LineString",
+                     "MultiPoint", "Point", "Envelope"];
+        // FIXME: In case we parse a feature with no geometry, but boundedBy an Envelope,
+        // this code creates a geometry derived from the Envelope. This is not correct.
+        var type, nodeList, geometry, parser;
+        for(var i=0; i<order.length; ++i) {
+            type = order[i];
+            nodeList = this.getElementsByTagNameNS(node, this.gmlns, type);
+            if(nodeList.length > 0) {
+                // only deal with first geometry of this type
+                parser = this.parseGeometry[type.toLowerCase()];
+                if(parser) {
+                    geometry = parser.apply(this, [nodeList[0]]);
+                    if (this.internalProjection && this.externalProjection) {
+                        geometry.transform(this.externalProjection, 
+                                           this.internalProjection); 
+                    }                       
+                } else {
+                    OpenLayers.Console.error(OpenLayers.i18n(
+                                "unsupportedGeometryType", {'geomType':type}));
+                }
+                // stop looking for different geometry types
+                break;
+            }
+        }
+
+        var bounds;
+        var boxNodes = this.getElementsByTagNameNS(node, this.gmlns, "Box");
+        for(i=0; i<boxNodes.length; ++i) {
+            var boxNode = boxNodes[i];
+            var box = this.parseGeometry["box"].apply(this, [boxNode]);
+            var parentNode = boxNode.parentNode;
+            var parentName = parentNode.localName ||
+                             parentNode.nodeName.split(":").pop();
+            if(parentName === "boundedBy") {
+                bounds = box;
+            } else {
+                geometry = box.toGeometry();
+            }
+        }
+        
+        // construct feature (optionally with attributes)
+        var attributes;
+        if(this.extractAttributes) {
+            attributes = this.parseAttributes(node);
+        }
+        var feature = new OpenLayers.Feature.Vector(geometry, attributes);
+        feature.bounds = bounds;
+        
+        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;
+        while(childNode) {
+            if(childNode.nodeType == 1) {
+                fid = childNode.getAttribute("fid") ||
+                      childNode.getAttribute("id");
+                if(fid) {
+                    break;
+                }
+            }
+            childNode = childNode.nextSibling;
+        }
+        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
+         *     point geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A GML node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.Point>} A point geometry.
+         */
+        point: function(node) {
+            /**
+             * Three coordinate variations to consider:
+             * 1) <gml:pos>x y z</gml:pos>
+             * 2) <gml:coordinates>x, y, z</gml:coordinates>
+             * 3) <gml:coord><gml:X>x</gml:X><gml:Y>y</gml:Y></gml:coord>
+             */
+            var nodeList, coordString;
+            var coords = [];
+
+            // look for <gml:pos>
+            var nodeList = this.getElementsByTagNameNS(node, this.gmlns, "pos");
+            if(nodeList.length > 0) {
+                coordString = nodeList[0].firstChild.nodeValue;
+                coordString = coordString.replace(this.regExes.trimSpace, "");
+                coords = coordString.split(this.regExes.splitSpace);
+            }
+
+            // look for <gml:coordinates>
+            if(coords.length == 0) {
+                nodeList = this.getElementsByTagNameNS(node, this.gmlns,
+                                                       "coordinates");
+                if(nodeList.length > 0) {
+                    coordString = nodeList[0].firstChild.nodeValue;
+                    coordString = coordString.replace(this.regExes.removeSpace,
+                                                      "");
+                    coords = coordString.split(",");
+                }
+            }
+
+            // look for <gml:coord>
+            if(coords.length == 0) {
+                nodeList = this.getElementsByTagNameNS(node, this.gmlns,
+                                                       "coord");
+                if(nodeList.length > 0) {
+                    var xList = this.getElementsByTagNameNS(nodeList[0],
+                                                            this.gmlns, "X");
+                    var yList = this.getElementsByTagNameNS(nodeList[0],
+                                                            this.gmlns, "Y");
+                    if(xList.length > 0 && yList.length > 0) {
+                        coords = [xList[0].firstChild.nodeValue,
+                                  yList[0].firstChild.nodeValue];
+                    }
+                }
+            }
+                
+            // preserve third dimension
+            if(coords.length == 2) {
+                coords[2] = null;
+            }
+            
+            if (this.xy) {
+                return new OpenLayers.Geometry.Point(coords[0], coords[1],
+                                                 coords[2]);
+            }
+            else{
+                return new OpenLayers.Geometry.Point(coords[1], coords[0],
+                                                 coords[2]);
+            }
+        },
+        
+        /**
+         * Method: parseGeometry.multipoint
+         * Given a GML node representing a multipoint geometry, create an
+         *     OpenLayers multipoint geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A GML node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.MultiPoint>} A multipoint geometry.
+         */
+        multipoint: function(node) {
+            var nodeList = this.getElementsByTagNameNS(node, this.gmlns,
+                                                       "Point");
+            var components = [];
+            if(nodeList.length > 0) {
+                var point;
+                for(var i=0; i<nodeList.length; ++i) {
+                    point = this.parseGeometry.point.apply(this, [nodeList[i]]);
+                    if(point) {
+                        components.push(point);
+                    }
+                }
+            }
+            return new OpenLayers.Geometry.MultiPoint(components);
+        },
+        
+        /**
+         * Method: parseGeometry.linestring
+         * Given a GML node representing a linestring geometry, create an
+         *     OpenLayers linestring geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A GML node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.LineString>} A linestring geometry.
+         */
+        linestring: function(node, ring) {
+            /**
+             * Two coordinate variations to consider:
+             * 1) <gml:posList dimension="d">x0 y0 z0 x1 y1 z1</gml:posList>
+             * 2) <gml:coordinates>x0, y0, z0 x1, y1, z1</gml:coordinates>
+             */
+            var nodeList, coordString;
+            var coords = [];
+            var points = [];
+
+            // look for <gml:posList>
+            nodeList = this.getElementsByTagNameNS(node, this.gmlns, "posList");
+            if(nodeList.length > 0) {
+                coordString = this.getChildValue(nodeList[0]);
+                coordString = coordString.replace(this.regExes.trimSpace, "");
+                coords = coordString.split(this.regExes.splitSpace);
+                var dim = parseInt(nodeList[0].getAttribute("dimension"));
+                var j, x, y, z;
+                for(var i=0; i<coords.length/dim; ++i) {
+                    j = i * dim;
+                    x = coords[j];
+                    y = coords[j+1];
+                    z = (dim == 2) ? null : coords[j+2];
+                    if (this.xy) {
+                        points.push(new OpenLayers.Geometry.Point(x, y, z));
+                    } else {
+                        points.push(new OpenLayers.Geometry.Point(y, x, z));
+                    }
+                }
+            }
+
+            // look for <gml:coordinates>
+            if(coords.length == 0) {
+                nodeList = this.getElementsByTagNameNS(node, this.gmlns,
+                                                       "coordinates");
+                if(nodeList.length > 0) {
+                    coordString = this.getChildValue(nodeList[0]);
+                    coordString = coordString.replace(this.regExes.trimSpace,
+                                                      "");
+                    coordString = coordString.replace(this.regExes.trimComma,
+                                                      ",");
+                    var pointList = coordString.split(this.regExes.splitSpace);
+                    for(var i=0; i<pointList.length; ++i) {
+                        coords = pointList[i].split(",");
+                        if(coords.length == 2) {
+                            coords[2] = null;
+                        }
+                        if (this.xy) {
+                            points.push(new OpenLayers.Geometry.Point(coords[0],
+                                                                  coords[1],
+                                                                  coords[2]));
+                        } else {
+                            points.push(new OpenLayers.Geometry.Point(coords[1],
+                                                                  coords[0],
+                                                                  coords[2]));
+                        }
+                    }
+                }
+            }
+
+            var line = null;
+            if(points.length != 0) {
+                if(ring) {
+                    line = new OpenLayers.Geometry.LinearRing(points);
+                } else {
+                    line = new OpenLayers.Geometry.LineString(points);
+                }
+            }
+            return line;
+        },
+        
+        /**
+         * Method: parseGeometry.multilinestring
+         * Given a GML node representing a multilinestring geometry, create an
+         *     OpenLayers multilinestring geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A GML node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.MultiLineString>} A multilinestring geometry.
+         */
+        multilinestring: function(node) {
+            var nodeList = this.getElementsByTagNameNS(node, this.gmlns,
+                                                       "LineString");
+            var components = [];
+            if(nodeList.length > 0) {
+                var line;
+                for(var i=0; i<nodeList.length; ++i) {
+                    line = this.parseGeometry.linestring.apply(this,
+                                                               [nodeList[i]]);
+                    if(line) {
+                        components.push(line);
+                    }
+                }
+            }
+            return new OpenLayers.Geometry.MultiLineString(components);
+        },
+        
+        /**
+         * Method: parseGeometry.polygon
+         * Given a GML node representing a polygon geometry, create an
+         *     OpenLayers polygon geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A GML node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.Polygon>} A polygon geometry.
+         */
+        polygon: function(node) {
+            var nodeList = this.getElementsByTagNameNS(node, this.gmlns,
+                                                       "LinearRing");
+            var components = [];
+            if(nodeList.length > 0) {
+                // this assumes exterior ring first, inner rings after
+                var ring;
+                for(var i=0; i<nodeList.length; ++i) {
+                    ring = this.parseGeometry.linestring.apply(this,
+                                                        [nodeList[i], true]);
+                    if(ring) {
+                        components.push(ring);
+                    }
+                }
+            }
+            return new OpenLayers.Geometry.Polygon(components);
+        },
+        
+        /**
+         * Method: parseGeometry.multipolygon
+         * Given a GML node representing a multipolygon geometry, create an
+         *     OpenLayers multipolygon geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A GML node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.MultiPolygon>} A multipolygon geometry.
+         */
+        multipolygon: function(node) {
+            var nodeList = this.getElementsByTagNameNS(node, this.gmlns,
+                                                       "Polygon");
+            var components = [];
+            if(nodeList.length > 0) {
+                var polygon;
+                for(var i=0; i<nodeList.length; ++i) {
+                    polygon = this.parseGeometry.polygon.apply(this,
+                                                               [nodeList[i]]);
+                    if(polygon) {
+                        components.push(polygon);
+                    }
+                }
+            }
+            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;
+                }
+                if (this.xy) {
+                    var lowerPoint = new OpenLayers.Geometry.Point(coords[0], coords[1],coords[2]);
+                } else {
+                    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;
+                }
+                if (this.xy) {
+                    var upperPoint = new OpenLayers.Geometry.Point(coords[0], coords[1],coords[2]);
+                } else {
+                    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; 
+        },
+
+        /**
+         * Method: parseGeometry.box
+         * Given a GML node representing a box geometry, create an
+         *     OpenLayers.Bounds.
+         *
+         * Parameters:
+         * node - {DOMElement} A GML node.
+         *
+         * Returns:
+         * {<OpenLayers.Bounds>} A bounds representing the box.
+         */
+        box: function(node) {
+            var nodeList = this.getElementsByTagNameNS(node, this.gmlns,
+                                                   "coordinates");
+            var coordString;
+            var coords, beginPoint = null, endPoint = null;
+            if (nodeList.length > 0) {
+                coordString = nodeList[0].firstChild.nodeValue;
+                coords = coordString.split(" ");
+                if (coords.length == 2) {
+                    beginPoint = coords[0].split(",");
+                    endPoint = coords[1].split(",");
+                }
+            }
+            if (beginPoint !== null && endPoint !== null) {
+                return new OpenLayers.Bounds(parseFloat(beginPoint[0]),
+                    parseFloat(beginPoint[1]),
+                    parseFloat(endPoint[0]),
+                    parseFloat(endPoint[1]) );
+            }
+        }
+        
+    },
+    
+    /**
+     * Method: parseAttributes
+     *
+     * Parameters:
+     * node - {<DOMElement>}
+     *
+     * Returns:
+     * {Object} An attributes object.
+     */
+    parseAttributes: function(node) {
+        var attributes = {};
+        // assume attributes are children of the first type 1 child
+        var childNode = node.firstChild;
+        var children, i, child, grandchildren, grandchild, name, value;
+        while(childNode) {
+            if(childNode.nodeType == 1) {
+                // attributes are type 1 children with one type 3 child
+                children = childNode.childNodes;
+                for(i=0; i<children.length; ++i) {
+                    child = children[i];
+                    if(child.nodeType == 1) {
+                        grandchildren = child.childNodes;
+                        if(grandchildren.length == 1) {
+                            grandchild = grandchildren[0];
+                            if(grandchild.nodeType == 3 ||
+                               grandchild.nodeType == 4) {
+                                name = (child.prefix) ?
+                                        child.nodeName.split(":")[1] :
+                                        child.nodeName;
+                                value = grandchild.nodeValue.replace(
+                                                this.regExes.trimSpace, "");
+                                attributes[name] = value;
+                            }
+                        } else {
+                            // If child has no childNodes (grandchildren),
+                            // set an attribute with null value.
+                            // e.g. <prefix:fieldname/> becomes
+                            // {fieldname: null}
+                            attributes[child.nodeName.split(":").pop()] = null;
+                        }
+                    }
+                }
+                break;
+            }
+            childNode = childNode.nextSibling;
+        }
+        return attributes;
+    },
+    
+    /**
+     * APIMethod: write
+     * Generate a GML document string given a list of features. 
+     * 
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>)} List of features to
+     *     serialize into a string.
+     *
+     * Returns:
+     * {String} A string representing the GML document.
+     */
+    write: function(features) {
+        if(!(features instanceof Array)) {
+            features = [features];
+        }
+        var gml = this.createElementNS("http://www.opengis.net/wfs",
+                                       "wfs:" + this.collectionName);
+        for(var i=0; i<features.length; i++) {
+            gml.appendChild(this.createFeatureXML(features[i]));
+        }
+        return OpenLayers.Format.XML.prototype.write.apply(this, [gml]);
+    },
+
+    /** 
+     * Method: createFeatureXML
+     * Accept an OpenLayers.Feature.Vector, and build a GML node for it.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The feature to be built as GML.
+     *
+     * Returns:
+     * {DOMElement} A node reprensting the feature in GML.
+     */
+    createFeatureXML: function(feature) {
+        var geometry = feature.geometry;
+        var geometryNode = this.buildGeometryNode(geometry);
+        var geomContainer = this.createElementNS(this.featureNS,
+                                                 this.featurePrefix + ":" +
+                                                 this.geometryName);
+        geomContainer.appendChild(geometryNode);
+        var featureNode = this.createElementNS(this.gmlns,
+                                               "gml:" + this.featureName);
+        var featureContainer = this.createElementNS(this.featureNS,
+                                                    this.featurePrefix + ":" +
+                                                    this.layerName);
+        var fid = feature.fid || feature.id;
+        featureContainer.setAttribute("fid", fid);
+        featureContainer.appendChild(geomContainer);
+        for(var attr in feature.attributes) {
+            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, 
+                               this.externalProjection);
+        }    
+        var className = geometry.CLASS_NAME;
+        var type = className.substring(className.lastIndexOf(".") + 1);
+        var builder = this.buildGeometry[type.toLowerCase()];
+        return builder.apply(this, [geometry]);
+    },
+
+    /**
+     * Property: buildGeometry
+     * Object containing methods to do the actual geometry node building
+     *     based on geometry type.
+     */
+    buildGeometry: {
+        // TBD retrieve the srs from layer
+        // srsName is non-standard, so not including it until it's right.
+        // gml.setAttribute("srsName",
+        //                  "http://www.opengis.net/gml/srs/epsg.xml#4326");
+
+        /**
+         * Method: buildGeometry.point
+         * Given an OpenLayers point geometry, create a GML point.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.Point>} A point geometry.
+         *
+         * Returns:
+         * {DOMElement} A GML point node.
+         */
+        point: function(geometry) {
+            var gml = this.createElementNS(this.gmlns, "gml:Point");
+            gml.appendChild(this.buildCoordinatesNode(geometry));
+            return gml;
+        },
+        
+        /**
+         * Method: buildGeometry.multipoint
+         * Given an OpenLayers multipoint geometry, create a GML multipoint.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.MultiPoint>} A multipoint geometry.
+         *
+         * Returns:
+         * {DOMElement} A GML multipoint node.
+         */
+        multipoint: function(geometry) {
+            var gml = this.createElementNS(this.gmlns, "gml:MultiPoint");
+            var points = geometry.components;
+            var pointMember, pointGeom;
+            for(var i=0; i<points.length; i++) { 
+                pointMember = this.createElementNS(this.gmlns,
+                                                   "gml:pointMember");
+                pointGeom = this.buildGeometry.point.apply(this,
+                                                               [points[i]]);
+                pointMember.appendChild(pointGeom);
+                gml.appendChild(pointMember);
+            }
+            return gml;            
+        },
+        
+        /**
+         * Method: buildGeometry.linestring
+         * Given an OpenLayers linestring geometry, create a GML linestring.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.LineString>} A linestring geometry.
+         *
+         * Returns:
+         * {DOMElement} A GML linestring node.
+         */
+        linestring: function(geometry) {
+            var gml = this.createElementNS(this.gmlns, "gml:LineString");
+            gml.appendChild(this.buildCoordinatesNode(geometry));
+            return gml;
+        },
+        
+        /**
+         * Method: buildGeometry.multilinestring
+         * Given an OpenLayers multilinestring geometry, create a GML
+         *     multilinestring.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.MultiLineString>} A multilinestring
+         *     geometry.
+         *
+         * Returns:
+         * {DOMElement} A GML multilinestring node.
+         */
+        multilinestring: function(geometry) {
+            var gml = this.createElementNS(this.gmlns, "gml:MultiLineString");
+            var lines = geometry.components;
+            var lineMember, lineGeom;
+            for(var i=0; i<lines.length; ++i) {
+                lineMember = this.createElementNS(this.gmlns,
+                                                  "gml:lineStringMember");
+                lineGeom = this.buildGeometry.linestring.apply(this,
+                                                                   [lines[i]]);
+                lineMember.appendChild(lineGeom);
+                gml.appendChild(lineMember);
+            }
+            return gml;
+        },
+        
+        /**
+         * Method: buildGeometry.linearring
+         * Given an OpenLayers linearring geometry, create a GML linearring.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.LinearRing>} A linearring geometry.
+         *
+         * Returns:
+         * {DOMElement} A GML linearring node.
+         */
+        linearring: function(geometry) {
+            var gml = this.createElementNS(this.gmlns, "gml:LinearRing");
+            gml.appendChild(this.buildCoordinatesNode(geometry));
+            return gml;
+        },
+        
+        /**
+         * Method: buildGeometry.polygon
+         * Given an OpenLayers polygon geometry, create a GML polygon.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.Polygon>} A polygon geometry.
+         *
+         * Returns:
+         * {DOMElement} A GML polygon node.
+         */
+        polygon: function(geometry) {
+            var gml = this.createElementNS(this.gmlns, "gml:Polygon");
+            var rings = geometry.components;
+            var ringMember, ringGeom, type;
+            for(var i=0; i<rings.length; ++i) {
+                type = (i==0) ? "outerBoundaryIs" : "innerBoundaryIs";
+                ringMember = this.createElementNS(this.gmlns,
+                                                  "gml:" + type);
+                ringGeom = this.buildGeometry.linearring.apply(this,
+                                                                   [rings[i]]);
+                ringMember.appendChild(ringGeom);
+                gml.appendChild(ringMember);
+            }
+            return gml;
+        },
+        
+        /**
+         * Method: buildGeometry.multipolygon
+         * Given an OpenLayers multipolygon geometry, create a GML multipolygon.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.MultiPolygon>} A multipolygon
+         *     geometry.
+         *
+         * Returns:
+         * {DOMElement} A GML multipolygon node.
+         */
+        multipolygon: function(geometry) {
+            var gml = this.createElementNS(this.gmlns, "gml:MultiPolygon");
+            var polys = geometry.components;
+            var polyMember, polyGeom;
+            for(var i=0; i<polys.length; ++i) {
+                polyMember = this.createElementNS(this.gmlns,
+                                                  "gml:polygonMember");
+                polyGeom = this.buildGeometry.polygon.apply(this,
+                                                                [polys[i]]);
+                polyMember.appendChild(polyGeom);
+                gml.appendChild(polyMember);
+            }
+            return gml;
+
+        },
+ 
+        /**
+         * Method: buildGeometry.bounds
+         * Given an OpenLayers bounds, create a GML box.
+         *
+         * Parameters:
+         * bounds - {<OpenLayers.Geometry.Bounds>} A bounds object.
+         *
+         * Returns:
+         * {DOMElement} A GML box node.
+         */
+        bounds: function(bounds) {
+            var gml = this.createElementNS(this.gmlns, "gml:Box");
+            gml.appendChild(this.buildCoordinatesNode(bounds));
+            return gml;
+        }
+    },
+
+    /**
+     * Method: buildCoordinates
+     * builds the coordinates XmlNode
+     * (code)
+     * <gml:coordinates decimal="." cs="," ts=" ">...</gml:coordinates>
+     * (end)
+     * Parameters: 
+     * geometry - {<OpenLayers.Geometry>} 
+     *
+     * Returns:
+     * {XmlNode} created xmlNode
+     */
+    buildCoordinatesNode: function(geometry) {
+        var coordinatesNode = this.createElementNS(this.gmlns,
+                                                   "gml:coordinates");
+        coordinatesNode.setAttribute("decimal", ".");
+        coordinatesNode.setAttribute("cs", ",");
+        coordinatesNode.setAttribute("ts", " ");
+
+        var parts = [];
+
+        if(geometry instanceof OpenLayers.Bounds){
+            parts.push(geometry.left + "," + geometry.bottom);
+            parts.push(geometry.right + "," + geometry.top);
+        } else {
+            var points = (geometry.components) ? geometry.components : [geometry];
+            for(var i=0; i<points.length; i++) {
+                parts.push(points[i].x + "," + points[i].y);                
+            }            
+        }
+
+        var txtNode = this.createTextNode(parts.join(" "));
+        coordinatesNode.appendChild(txtNode);
+        
+        return coordinatesNode;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.GML" 
+});
diff --git a/lib/OpenLayers/Format/GML/Base.js b/lib/OpenLayers/Format/GML/Base.js
new file mode 100644
index 0000000..2494c04
--- /dev/null
+++ b/lib/OpenLayers/Format/GML/Base.js
@@ -0,0 +1,578 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/GML.js
+ */
+
+/**
+ * Though required in the full build, if the GML format is excluded, we set
+ * the namespace here.
+ */
+if(!OpenLayers.Format.GML) {
+    OpenLayers.Format.GML = {};
+}
+
+/**
+ * Class: OpenLayers.Format.GML.Base
+ * Superclass for GML parsers.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.GML.Base = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        gml: "http://www.opengis.net/gml",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance",
+        wfs: "http://www.opengis.net/wfs" // this is a convenience for reading wfs:FeatureCollection
+    },
+    
+    /**
+     * Property: defaultPrefix
+     */
+    defaultPrefix: "gml",
+
+    /**
+     * Property: schemaLocation
+     * {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
+     *     construction.
+     */
+    featureNS: null,
+
+    /**
+     * APIProperty: geometry
+     * {String} Name of geometry element.  Defaults to "geometry".
+     */
+    geometryName: "geometry",
+
+    /**
+     * APIProperty: extractAttributes
+     * {Boolean} Extract attributes from GML.  Default is true.
+     */
+    extractAttributes: true,
+    
+    /**
+     * APIProperty: srsName
+     * {String} URI for spatial reference system.  This is optional for
+     *     single part geometries and mandatory for collections and multis.
+     *     If set, the srsName attribute will be written for all geometries.
+     *     Default is null.
+     */
+    srsName: null,
+
+    /**
+     * 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,
+
+    /**
+     * Property: geometryTypes
+     * {Object} Maps OpenLayers geometry class names to GML element names.
+     *     Use <setGeometryTypes> before accessing this property.
+     */
+    geometryTypes: null,
+
+    /**
+     * Property: singleFeatureType
+     * {Boolean} True if there is only 1 featureType, and not an array
+     *     of featuretypes.
+     */
+    singleFeatureType: null,
+
+    /**
+     * Property: regExes
+     * Compiled regular expressions for manipulating strings.
+     */
+    regExes: {
+        trimSpace: (/^\s*|\s*$/g),
+        removeSpace: (/\s*/g),
+        splitSpace: (/\s+/),
+        trimComma: (/\s*,\s*/g)
+    },
+
+    /**
+     * Constructor: OpenLayers.Format.GML.Base
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.GML.v2> or <OpenLayers.Format.GML.v3> constructor
+     *     instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     *
+     * Valid options properties:
+     * featureType - {Array(String) or String} Local (without prefix) feature 
+     *     typeName(s) (required).
+     * featureNS - {String} Feature namespace (required).
+     * geometryName - {String} Geometry element name.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.setGeometryTypes();
+        if(options && options.featureNS) {
+            this.setNamespace("feature", options.featureNS);
+        }
+        this.singleFeatureType = !options || (typeof options.featureType === "string");
+    },
+    
+    /**
+     * Method: read
+     *
+     * Parameters:
+     * data - {DOMElement} A gml:featureMember element, a gml:featureMembers
+     *     element, or an element containing either of the above at any level.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Feature.Vector>)} An array of features.
+     */
+    read: function(data) {
+        if(typeof data == "string") { 
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var features = [];
+        this.readNode(data, {features: features});
+        if(features.length == 0) {
+            // look for gml:featureMember elements
+            var elements = this.getElementsByTagNameNS(
+                data, this.namespaces.gml, "featureMember"
+            );
+            if(elements.length) {
+                for(var i=0, len=elements.length; i<len; ++i) {
+                    this.readNode(elements[i], {features: features});
+                }
+            } else {
+                // look for gml:featureMembers elements (this is v3, but does no harm here)
+                var elements = this.getElementsByTagNameNS(
+                    data, this.namespaces.gml, "featureMembers"
+                );
+                if(elements.length) {
+                    // there can be only one
+                    this.readNode(elements[0], {features: features});
+                }
+            }
+        }
+        return features;
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "gml": {
+            "featureMember": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "featureMembers": function(node, obj) {
+                this.readChildNodes(node, obj);                
+            },
+            "name": function(node, obj) {
+                obj.name = this.getChildValue(node);
+            },
+            "boundedBy": function(node, obj) {
+                var container = {};
+                this.readChildNodes(node, container);
+                if(container.components && container.components.length > 0) {
+                    obj.bounds = container.components[0];
+                }
+            },
+            "Point": function(node, container) {
+                var obj = {points: []};
+                this.readChildNodes(node, obj);
+                if(!container.components) {
+                    container.components = [];
+                }
+                container.components.push(obj.points[0]);
+            },
+            "coordinates": function(node, obj) {
+                var str = this.getChildValue(node).replace(
+                    this.regExes.trimSpace, ""
+                );
+                str = str.replace(this.regExes.trimComma, ",");
+                var pointList = str.split(this.regExes.splitSpace);
+                var coords;
+                var numPoints = pointList.length;
+                var points = new Array(numPoints);
+                for(var i=0; i<numPoints; ++i) {
+                    coords = pointList[i].split(",");
+                    if (this.xy) {
+                        points[i] = new OpenLayers.Geometry.Point(
+                            coords[0], coords[1], coords[2]
+                        );
+                    } else {
+                        points[i] = new OpenLayers.Geometry.Point(
+                            coords[1], coords[0], coords[2]
+                        );
+                    }
+                }
+                obj.points = points;
+            },
+            "coord": function(node, obj) {
+                var coord = {};
+                this.readChildNodes(node, coord);
+                if(!obj.points) {
+                    obj.points = [];
+                }
+                obj.points.push(new OpenLayers.Geometry.Point(
+                    coord.x, coord.y, coord.z
+                ));
+            },
+            "X": function(node, coord) {
+                coord.x = this.getChildValue(node);
+            },
+            "Y": function(node, coord) {
+                coord.y = this.getChildValue(node);
+            },
+            "Z": function(node, coord) {
+                coord.z = this.getChildValue(node);
+            },
+            "MultiPoint": function(node, container) {
+                var obj = {components: []};
+                this.readChildNodes(node, obj);
+                container.components = [
+                    new OpenLayers.Geometry.MultiPoint(obj.components)
+                ];
+            },
+            "pointMember": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "LineString": function(node, container) {
+                var obj = {};
+                this.readChildNodes(node, obj);
+                if(!container.components) {
+                    container.components = [];
+                }
+                container.components.push(
+                    new OpenLayers.Geometry.LineString(obj.points)
+                );
+            },
+            "MultiLineString": function(node, container) {
+                var obj = {components: []};
+                this.readChildNodes(node, obj);
+                container.components = [
+                    new OpenLayers.Geometry.MultiLineString(obj.components)
+                ];
+            },
+            "lineStringMember": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Polygon": function(node, container) {
+                var obj = {outer: null, inner: []};
+                this.readChildNodes(node, obj);
+                obj.inner.unshift(obj.outer);
+                if(!container.components) {
+                    container.components = [];
+                }
+                container.components.push(
+                    new OpenLayers.Geometry.Polygon(obj.inner)
+                );
+            },
+            "LinearRing": function(node, obj) {
+                var container = {};
+                this.readChildNodes(node, container);
+                obj.components = [new OpenLayers.Geometry.LinearRing(
+                    container.points
+                )];
+            },
+            "MultiPolygon": function(node, container) {
+                var obj = {components: []};
+                this.readChildNodes(node, obj);
+                container.components = [
+                    new OpenLayers.Geometry.MultiPolygon(obj.components)
+                ];
+            },
+            "polygonMember": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "GeometryCollection": function(node, container) {
+                var obj = {components: []};
+                this.readChildNodes(node, obj);
+                container.components = [
+                    new OpenLayers.Geometry.Collection(obj.components)
+                ];
+            },
+            "geometryMember": function(node, obj) {
+                this.readChildNodes(node, obj);
+            }
+        },
+        "feature": {
+            "*": function(node, obj) {
+                // The node can either be named like the featureType, or it
+                // can be a child of the feature:featureType.  Children can be
+                // geometry or attributes.
+                var name;
+                var local = node.localName || node.nodeName.split(":").pop();
+                // Since an attribute can have the same name as the feature type
+                // we only want to read the node as a feature if the parent
+                // node can have feature nodes as children.  In this case, the
+                // obj.features property is set.
+                if (obj.features) {
+                    if (!this.singleFeatureType &&
+                        (OpenLayers.Util.indexOf(this.featureType, local) !== -1)) {
+                        name = "_typeName";
+                    } else if(local === this.featureType) {
+                        name = "_typeName";
+                    }
+                } else {
+                    // Assume attribute elements have one child node and that the child
+                    // is a text node.  Otherwise assume it is a geometry node.
+                    if(node.childNodes.length == 0 ||
+                       (node.childNodes.length == 1 && node.firstChild.nodeType == 3)) {
+                        if(this.extractAttributes) {
+                            name = "_attribute";
+                        }
+                    } else {
+                        name = "_geometry";
+                    }
+                }
+                if(name) {
+                    this.readers.feature[name].apply(this, [node, obj]);
+                }
+            },
+            "_typeName": function(node, obj) {
+                var container = {components: [], attributes: {}};
+                this.readChildNodes(node, container);
+                // look for common gml namespaced elements
+                if(container.name) {
+                    container.attributes.name = container.name;
+                }
+                var feature = new OpenLayers.Feature.Vector(
+                    container.components[0], container.attributes
+                );
+                if (!this.singleFeatureType) {
+                    feature.type = node.nodeName.split(":").pop();
+                    feature.namespace = node.namespaceURI;
+                }
+                var fid = node.getAttribute("fid") ||
+                    this.getAttributeNS(node, this.namespaces["gml"], "id");
+                if(fid) {
+                    feature.fid = fid;
+                }
+                if(this.internalProjection && this.externalProjection &&
+                   feature.geometry) {
+                    feature.geometry.transform(
+                        this.externalProjection, this.internalProjection
+                    );
+                }
+                if(container.bounds) {
+                    feature.bounds = container.bounds;
+                }
+                obj.features.push(feature);
+            },
+            "_geometry": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "_attribute": function(node, obj) {
+                var local = node.localName || node.nodeName.split(":").pop();
+                var value = this.getChildValue(node);
+                obj.attributes[local] = value;
+            }
+        },
+        "wfs": {
+            "FeatureCollection": function(node, obj) {
+                this.readChildNodes(node, obj);
+            }
+        }
+    },
+    
+    /**
+     * Method: write
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>) | OpenLayers.Feature.Vector}
+     *     An array of features or a single feature.
+     *
+     * Returns:
+     * {String} Given an array of features, a doc with a gml:featureMembers
+     *     element will be returned.  Given a single feature, a doc with a
+     *     gml:featureMember element will be returned.
+     */
+    write: function(features) {
+        var name;
+        if(features instanceof Array) {
+            name = "featureMembers";
+        } else {
+            name = "featureMember";
+        }
+        var root = this.writeNode("gml:" + name, features);
+        this.setAttributeNS(
+            root, this.namespaces["xsi"],
+            "xsi:schemaLocation", this.schemaLocation
+        );
+
+        return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
+    },
+    
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "gml": {
+            "featureMember": function(feature) {
+                var node = this.createElementNSPlus("gml:featureMember");
+                this.writeNode("feature:_typeName", feature, node);
+                return node;
+            },
+            "MultiPoint": function(geometry) {
+                var node = this.createElementNSPlus("gml:MultiPoint");
+                for(var i=0; i<geometry.components.length; ++i) {
+                    this.writeNode("pointMember", geometry.components[i], node);
+                }
+                return node;
+            },
+            "pointMember": function(geometry) {
+                var node = this.createElementNSPlus("gml:pointMember");
+                this.writeNode("Point", geometry, node);
+                return node;
+            },
+            "MultiLineString": function(geometry) {
+                var node = this.createElementNSPlus("gml:MultiLineString");
+                for(var i=0; i<geometry.components.length; ++i) {
+                    this.writeNode("lineStringMember", geometry.components[i], node);
+                }
+                return node;
+            },
+            "lineStringMember": function(geometry) {
+                var node = this.createElementNSPlus("gml:lineStringMember");
+                this.writeNode("LineString", geometry, node);
+                return node;
+            },
+            "MultiPolygon": function(geometry) {
+                var node = this.createElementNSPlus("gml:MultiPolygon");
+                for(var i=0; i<geometry.components.length; ++i) {
+                    this.writeNode(
+                        "polygonMember", geometry.components[i], node
+                    );
+                }
+                return node;
+            },
+            "polygonMember": function(geometry) {
+                var node = this.createElementNSPlus("gml:polygonMember");
+                this.writeNode("Polygon", geometry, node);
+                return node;
+            },
+            "GeometryCollection": function(geometry) {
+                var node = this.createElementNSPlus("gml:GeometryCollection");
+                for(var i=0, len=geometry.components.length; i<len; ++i) {
+                    this.writeNode("geometryMember", geometry.components[i], node);
+                }
+                return node;
+            },
+            "geometryMember": function(geometry) {
+                var node = this.createElementNSPlus("gml:geometryMember");
+                var child = this.writeNode("feature:_geometry", geometry);
+                node.appendChild(child.firstChild);
+                return node;
+            }
+        },
+        "feature": {
+            "_typeName": function(feature) {
+                var node = this.createElementNSPlus("feature:" + this.featureType, {
+                    attributes: {fid: feature.fid}
+                });
+                if(feature.geometry) {
+                    this.writeNode("feature:_geometry", feature.geometry, node);
+                }
+                for(var name in feature.attributes) {
+                    var value = feature.attributes[name];
+                    if(value != null) {
+                        this.writeNode(
+                            "feature:_attribute",
+                            {name: name, value: value}, node
+                        );
+                    }
+                }
+                return node;
+            },
+            "_geometry": function(geometry) {
+                if(this.externalProjection && this.internalProjection) {
+                    geometry = geometry.clone().transform(
+                        this.internalProjection, this.externalProjection
+                    );
+                }    
+                var node = this.createElementNSPlus(
+                    "feature:" + this.geometryName
+                );
+                var type = this.geometryTypes[geometry.CLASS_NAME];
+                var child = this.writeNode("gml:" + type, geometry, node);
+                if(this.srsName) {
+                    child.setAttribute("srsName", this.srsName);
+                }
+                return node;
+            },
+            "_attribute": function(obj) {
+                return this.createElementNSPlus("feature:" + obj.name, {
+                    value: obj.value
+                });
+            }
+        },
+        "wfs": {
+            "FeatureCollection": function(features) {
+                /**
+                 * This is only here because GML2 only describes abstract
+                 * feature collections.  Typically, you would not be using
+                 * the GML format to write wfs elements.  This just provides
+                 * some way to write out lists of features.  GML3 defines the
+                 * featureMembers element, so that is used by default instead.
+                 */
+                var node = this.createElementNSPlus("wfs:FeatureCollection");
+                for(var i=0, len=features.length; i<len; ++i) {
+                    this.writeNode("gml:featureMember", features[i], node);
+                }
+                return node;
+            }
+        }
+    },
+    
+    /**
+     * Function: setGeometryTypes
+     * Sets the <geometryTypes> mapping.
+     */
+    setGeometryTypes: function() {
+        this.geometryTypes = {
+            "OpenLayers.Geometry.Point": "Point",
+            "OpenLayers.Geometry.MultiPoint": "MultiPoint",
+            "OpenLayers.Geometry.LineString": "LineString",
+            "OpenLayers.Geometry.MultiLineString": "MultiLineString",
+            "OpenLayers.Geometry.Polygon": "Polygon",
+            "OpenLayers.Geometry.MultiPolygon": "MultiPolygon",
+            "OpenLayers.Geometry.Collection": "GeometryCollection"
+        };
+    },
+
+    CLASS_NAME: "OpenLayers.Format.GML.Base" 
+
+});
diff --git a/lib/OpenLayers/Format/GML/v2.js b/lib/OpenLayers/Format/GML/v2.js
new file mode 100644
index 0000000..afcf578
--- /dev/null
+++ b/lib/OpenLayers/Format/GML/v2.js
@@ -0,0 +1,193 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/GML/Base.js
+ */
+
+/**
+ * Class: OpenLayers.Format.GML.v2
+ * Parses GML version 2.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.GML.Base>
+ */
+OpenLayers.Format.GML.v2 = OpenLayers.Class(OpenLayers.Format.GML.Base, {
+    
+    /**
+     * Property: schemaLocation
+     * {String} Schema location for a particular minor version.
+     */
+    schemaLocation: "http://www.opengis.net/gml http://schemas.opengis.net/gml/2.1.2/feature.xsd",
+
+    /**
+     * Constructor: OpenLayers.Format.GML.v2
+     * Create a parser for GML v2.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     *
+     * Valid options properties:
+     * featureType - {String} Local (without prefix) feature typeName (required).
+     * featureNS - {String} Feature namespace (required).
+     * geometryName - {String} Geometry element name.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.GML.Base.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "gml": OpenLayers.Util.applyDefaults({
+            "outerBoundaryIs": function(node, container) {
+                var obj = {};
+                this.readChildNodes(node, obj);
+                container.outer = obj.components[0];
+            },
+            "innerBoundaryIs": function(node, container) {
+                var obj = {};
+                this.readChildNodes(node, obj);
+                container.inner.push(obj.components[0]);
+            },
+            "Box": function(node, container) {
+                var obj = {};
+                this.readChildNodes(node, obj);
+                if(!container.components) {
+                    container.components = [];
+                }
+                var min = obj.points[0];
+                var max = obj.points[1];
+                container.components.push(
+                    new OpenLayers.Bounds(min.x, min.y, max.x, max.y)
+                );
+            }
+        }, 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
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>) | OpenLayers.Feature.Vector}
+     *     An array of features or a single feature.
+     *
+     * Returns:
+     * {String} Given an array of features, a doc with a gml:featureMembers
+     *     element will be returned.  Given a single feature, a doc with a
+     *     gml:featureMember element will be returned.
+     */
+    write: function(features) {
+        var name;
+        if(features instanceof Array) {
+            // GML2 only has abstract feature collections
+            // wfs provides a feature collection from a well-known schema
+            name = "wfs:FeatureCollection";
+        } else {
+            name = "gml:featureMember";
+        }
+        var root = this.writeNode(name, features);
+        this.setAttributeNS(
+            root, this.namespaces["xsi"],
+            "xsi:schemaLocation", this.schemaLocation
+        );
+
+        return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "gml": OpenLayers.Util.applyDefaults({
+            "Point": function(geometry) {
+                var node = this.createElementNSPlus("gml:Point");
+                this.writeNode("coordinates", [geometry], node);
+                return node;
+            },
+            "coordinates": function(points) {
+                var numPoints = points.length;
+                var parts = new Array(numPoints);
+                var point;
+                for(var i=0; i<numPoints; ++i) {
+                    point = points[i];
+                    if(this.xy) {
+                        parts[i] = point.x + "," + point.y;
+                    } else {
+                        parts[i] = point.y + "," + point.x;
+                    }
+                    if(point.z != undefined) { // allow null or undefined
+                        parts[i] += "," + point.z;
+                    }
+                }
+                return this.createElementNSPlus("gml:coordinates", {
+                    attributes: {
+                        decimal: ".", cs: ",", ts: " "
+                    },
+                    value: (numPoints == 1) ? parts[0] : parts.join(" ")
+                });
+            },
+            "LineString": function(geometry) {
+                var node = this.createElementNSPlus("gml:LineString");
+                this.writeNode("coordinates", geometry.components, node);
+                return node;
+            },
+            "Polygon": function(geometry) {
+                var node = this.createElementNSPlus("gml:Polygon");
+                this.writeNode("outerBoundaryIs", geometry.components[0], node);
+                for(var i=1; i<geometry.components.length; ++i) {
+                    this.writeNode(
+                        "innerBoundaryIs", geometry.components[i], node
+                    );
+                }
+                return node;
+            },
+            "outerBoundaryIs": function(ring) {
+                var node = this.createElementNSPlus("gml:outerBoundaryIs");
+                this.writeNode("LinearRing", ring, node);
+                return node;
+            },
+            "innerBoundaryIs": function(ring) {
+                var node = this.createElementNSPlus("gml:innerBoundaryIs");
+                this.writeNode("LinearRing", ring, node);
+                return node;
+            },
+            "LinearRing": function(ring) {
+                var node = this.createElementNSPlus("gml:LinearRing");
+                this.writeNode("coordinates", ring.components, node);
+                return node;
+            },
+            "Box": function(bounds) {
+                var node = this.createElementNSPlus("gml:Box");
+                this.writeNode("coordinates", [
+                    {x: bounds.left, y: bounds.bottom},
+                    {x: bounds.right, y: bounds.top}
+                ], node);
+                // srsName attribute is optional for gml:Box
+                if(this.srsName) {
+                    node.setAttribute("srsName", this.srsName);
+                }
+                return node;
+            }
+        }, OpenLayers.Format.GML.Base.prototype.writers["gml"]),
+        "feature": OpenLayers.Format.GML.Base.prototype.writers["feature"],
+        "wfs": OpenLayers.Format.GML.Base.prototype.writers["wfs"]
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.GML.v2" 
+
+});
diff --git a/lib/OpenLayers/Format/GML/v3.js b/lib/OpenLayers/Format/GML/v3.js
new file mode 100644
index 0000000..8e7c9a4
--- /dev/null
+++ b/lib/OpenLayers/Format/GML/v3.js
@@ -0,0 +1,462 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/GML/Base.js
+ */
+
+/**
+ * Class: OpenLayers.Format.GML.v3
+ * Parses GML version 3.
+ *
+ * Inherits from:
+ *  - <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
+     *     conform with the Simple Features Profile for GML.
+     */
+    schemaLocation: "http://www.opengis.net/gml http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/1.0.0/gmlsf.xsd",
+
+    /**
+     * Property: curve
+     * {Boolean} Write gml:Curve instead of gml:LineString elements.  This also
+     *     affects the elements in multi-part geometries.  Default is false.
+     *     To write gml:Curve elements instead of gml:LineString, set curve
+     *     to true in the options to the contstructor (cannot be changed after
+     *     instantiation).
+     */
+    curve: false,
+    
+    /**
+     * Property: multiCurve
+     * {Boolean} Write gml:MultiCurve instead of gml:MultiLineString.  Since
+     *     the latter is deprecated in GML 3, the default is true.  To write
+     *     gml:MultiLineString instead of gml:MultiCurve, set multiCurve to
+     *     false in the options to the constructor (cannot be changed after
+     *     instantiation).
+     */
+    multiCurve: true,
+    
+    /**
+     * Property: surface
+     * {Boolean} Write gml:Surface instead of gml:Polygon elements.  This also
+     *     affects the elements in multi-part geometries.  Default is false.
+     *     To write gml:Surface elements instead of gml:Polygon, set surface
+     *     to true in the options to the contstructor (cannot be changed after
+     *     instantiation).
+     */
+    surface: false,
+
+    /**
+     * Property: multiSurface
+     * {Boolean} Write gml:multiSurface instead of gml:MultiPolygon.  Since
+     *     the latter is deprecated in GML 3, the default is true.  To write
+     *     gml:MultiPolygon instead of gml:multiSurface, set multiSurface to
+     *     false in the options to the constructor (cannot be changed after
+     *     instantiation).
+     */
+    multiSurface: true,
+
+    /**
+     * Constructor: OpenLayers.Format.GML.v3
+     * Create a parser for GML v3.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     *
+     * Valid options properties:
+     * featureType - {String} Local (without prefix) feature typeName (required).
+     * featureNS - {String} Feature namespace (required).
+     * geometryName - {String} Geometry element name.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.GML.Base.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "gml": OpenLayers.Util.applyDefaults({
+            "featureMembers": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Curve": function(node, container) {
+                var obj = {points: []};
+                this.readChildNodes(node, obj);
+                if(!container.components) {
+                    container.components = [];
+                }
+                container.components.push(
+                    new OpenLayers.Geometry.LineString(obj.points)
+                );
+            },
+            "segments": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "LineStringSegment": function(node, container) {
+                var obj = {};
+                this.readChildNodes(node, obj);
+                if(obj.points) {
+                    Array.prototype.push.apply(container.points, obj.points);
+                }
+            },
+            "pos": function(node, obj) {
+                var str = this.getChildValue(node).replace(
+                    this.regExes.trimSpace, ""
+                );
+                var coords = str.split(this.regExes.splitSpace);
+                var point;
+                if(this.xy) {
+                    point = new OpenLayers.Geometry.Point(
+                        coords[0], coords[1], coords[2]
+                    );
+                } else {
+                    point = new OpenLayers.Geometry.Point(
+                        coords[1], coords[0], coords[2]
+                    );
+                }
+                obj.points = [point];
+            },
+            "posList": function(node, obj) {
+                var str = this.getChildValue(node).replace(
+                    this.regExes.trimSpace, ""
+                );
+                var coords = str.split(this.regExes.splitSpace);
+                var dim = parseInt(node.getAttribute("dimension")) || 2;
+                var j, x, y, z;
+                var numPoints = coords.length / dim;
+                var points = new Array(numPoints);
+                for(var i=0, len=coords.length; i<len; i += dim) {
+                    x = coords[i];
+                    y = coords[i+1];
+                    z = (dim == 2) ? undefined : coords[i+2];
+                    if (this.xy) {
+                        points[i/dim] = new OpenLayers.Geometry.Point(x, y, z);
+                    } else {
+                        points[i/dim] = new OpenLayers.Geometry.Point(y, x, z);
+                    }
+                }
+                obj.points = points;
+            },
+            "Surface": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "patches": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "PolygonPatch": function(node, obj) {
+                this.readers.gml.Polygon.apply(this, [node, obj]);
+            },
+            "exterior": function(node, container) {
+                var obj = {};
+                this.readChildNodes(node, obj);
+                container.outer = obj.components[0];
+            },
+            "interior": function(node, container) {
+                var obj = {};
+                this.readChildNodes(node, obj);
+                container.inner.push(obj.components[0]);
+            },
+            "MultiCurve": function(node, container) {
+                var obj = {components: []};
+                this.readChildNodes(node, obj);
+                if(obj.components.length > 0) {
+                    container.components = [
+                        new OpenLayers.Geometry.MultiLineString(obj.components)
+                    ];
+                }
+            },
+            "curveMember": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "MultiSurface": function(node, container) {
+                var obj = {components: []};
+                this.readChildNodes(node, obj);
+                if(obj.components.length > 0) {
+                    container.components = [
+                        new OpenLayers.Geometry.MultiPolygon(obj.components)
+                    ];
+                }
+            },
+            "surfaceMember": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "surfaceMembers": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "pointMembers": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "lineStringMembers": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "polygonMembers": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "geometryMembers": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Envelope": function(node, container) {
+                var obj = {points: new Array(2)};
+                this.readChildNodes(node, obj);
+                if(!container.components) {
+                    container.components = [];
+                }
+                var min = obj.points[0];
+                var max = obj.points[1];
+                container.components.push(
+                    new OpenLayers.Bounds(min.x, min.y, max.x, max.y)
+                );
+            },
+            "lowerCorner": function(node, container) {
+                var obj = {};
+                this.readers.gml.pos.apply(this, [node, obj]);
+                container.points[0] = obj.points[0];
+            },
+            "upperCorner": function(node, container) {
+                var obj = {};
+                this.readers.gml.pos.apply(this, [node, obj]);
+                container.points[1] = obj.points[0];
+            }
+        }, 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
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>) | OpenLayers.Feature.Vector}
+     *     An array of features or a single feature.
+     *
+     * Returns:
+     * {String} Given an array of features, a doc with a gml:featureMembers
+     *     element will be returned.  Given a single feature, a doc with a
+     *     gml:featureMember element will be returned.
+     */
+    write: function(features) {
+        var name;
+        if(features instanceof Array) {
+            name = "featureMembers";
+        } else {
+            name = "featureMember";
+        }
+        var root = this.writeNode("gml:" + name, features);
+        this.setAttributeNS(
+            root, this.namespaces["xsi"],
+            "xsi:schemaLocation", this.schemaLocation
+        );
+
+        return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "gml": OpenLayers.Util.applyDefaults({
+            "featureMembers": function(features) {
+                var node = this.createElementNSPlus("gml:featureMembers");
+                for(var i=0, len=features.length; i<len; ++i) {
+                    this.writeNode("feature:_typeName", features[i], node);
+                }
+                return node;
+            },
+            "Point": function(geometry) {
+                var node = this.createElementNSPlus("gml:Point");
+                this.writeNode("pos", geometry, node);
+                return node;
+            },
+            "pos": function(point) {
+                // only 2d for simple features profile
+                var pos = (this.xy) ?
+                    (point.x + " " + point.y) : (point.y + " " + point.x);
+                return this.createElementNSPlus("gml:pos", {
+                    value: pos
+                });
+            },
+            "LineString": function(geometry) {
+                var node = this.createElementNSPlus("gml:LineString");
+                this.writeNode("posList", geometry.components, node);
+                return node;
+            },
+            "Curve": function(geometry) {
+                var node = this.createElementNSPlus("gml:Curve");
+                this.writeNode("segments", geometry, node);
+                return node;
+            },
+            "segments": function(geometry) {
+                var node = this.createElementNSPlus("gml:segments");
+                this.writeNode("LineStringSegment", geometry, node);
+                return node;
+            },
+            "LineStringSegment": function(geometry) {
+                var node = this.createElementNSPlus("gml:LineStringSegment");
+                this.writeNode("posList", geometry.components, node);
+                return node;
+            },
+            "posList": function(points) {
+                // only 2d for simple features profile
+                var len = points.length;
+                var parts = new Array(len);
+                var point;
+                for(var i=0; i<len; ++i) {
+                    point = points[i];
+                    if(this.xy) {
+                        parts[i] = point.x + " " + point.y;
+                    } else {
+                        parts[i] = point.y + " " + point.x;
+                    }
+                }
+                return this.createElementNSPlus("gml:posList", {
+                    value: parts.join(" ")
+                }); 
+            },
+            "Surface": function(geometry) {
+                var node = this.createElementNSPlus("gml:Surface");
+                this.writeNode("patches", geometry, node);
+                return node;
+            },
+            "patches": function(geometry) {
+                var node = this.createElementNSPlus("gml:patches");
+                this.writeNode("PolygonPatch", geometry, node);
+                return node;
+            },
+            "PolygonPatch": function(geometry) {
+                var node = this.createElementNSPlus("gml:PolygonPatch", {
+                    attributes: {interpolation: "planar"}
+                });
+                this.writeNode("exterior", geometry.components[0], node);
+                for(var i=1, len=geometry.components.length; i<len; ++i) {
+                    this.writeNode(
+                        "interior", geometry.components[i], node
+                    );
+                }
+                return node;
+            },
+            "Polygon": function(geometry) {
+                var node = this.createElementNSPlus("gml:Polygon");
+                this.writeNode("exterior", geometry.components[0], node);
+                for(var i=1, len=geometry.components.length; i<len; ++i) {
+                    this.writeNode(
+                        "interior", geometry.components[i], node
+                    );
+                }
+                return node;
+            },
+            "exterior": function(ring) {
+                var node = this.createElementNSPlus("gml:exterior");
+                this.writeNode("LinearRing", ring, node);
+                return node;
+            },
+            "interior": function(ring) {
+                var node = this.createElementNSPlus("gml:interior");
+                this.writeNode("LinearRing", ring, node);
+                return node;
+            },
+            "LinearRing": function(ring) {
+                var node = this.createElementNSPlus("gml:LinearRing");
+                this.writeNode("posList", ring.components, node);
+                return node;
+            },
+            "MultiCurve": function(geometry) {
+                var node = this.createElementNSPlus("gml:MultiCurve");
+                for(var i=0, len=geometry.components.length; i<len; ++i) {
+                    this.writeNode("curveMember", geometry.components[i], node);
+                }
+                return node;
+            },
+            "curveMember": function(geometry) {
+                var node = this.createElementNSPlus("gml:curveMember");
+                if(this.curve) {
+                    this.writeNode("Curve", geometry, node);
+                } else {
+                    this.writeNode("LineString", geometry, node);
+                }
+                return node;
+            },
+            "MultiSurface": function(geometry) {
+                var node = this.createElementNSPlus("gml:MultiSurface");
+                for(var i=0, len=geometry.components.length; i<len; ++i) {
+                    this.writeNode("surfaceMember", geometry.components[i], node);
+                }
+                return node;
+            },
+            "surfaceMember": function(polygon) {
+                var node = this.createElementNSPlus("gml:surfaceMember");
+                if(this.surface) {
+                    this.writeNode("Surface", polygon, node);
+                } else {
+                    this.writeNode("Polygon", polygon, node);
+                }
+                return node;
+            },
+            "Envelope": function(bounds) {
+                var node = this.createElementNSPlus("gml:Envelope");
+                this.writeNode("lowerCorner", bounds, node);
+                this.writeNode("upperCorner", bounds, node);
+                // srsName attribute is required for gml:Envelope
+                if(this.srsName) {
+                    node.setAttribute("srsName", this.srsName);
+                }
+                return node;
+            },
+            "lowerCorner": function(bounds) {
+                // only 2d for simple features profile
+                var pos = (this.xy) ?
+                    (bounds.left + " " + bounds.bottom) :
+                    (bounds.bottom + " " + bounds.left);
+                return this.createElementNSPlus("gml:lowerCorner", {
+                    value: pos
+                });
+            },
+            "upperCorner": function(bounds) {
+                // only 2d for simple features profile
+                var pos = (this.xy) ?
+                    (bounds.right + " " + bounds.top) :
+                    (bounds.top + " " + bounds.right);
+                return this.createElementNSPlus("gml:upperCorner", {
+                    value: pos
+                });
+            }
+        }, OpenLayers.Format.GML.Base.prototype.writers["gml"]),
+        "feature": OpenLayers.Format.GML.Base.prototype.writers["feature"],
+        "wfs": OpenLayers.Format.GML.Base.prototype.writers["wfs"]
+    },
+
+    /**
+     * Function: setGeometryTypes
+     * Sets the <geometryTypes> mapping.
+     */
+    setGeometryTypes: function() {
+        this.geometryTypes = {
+            "OpenLayers.Geometry.Point": "Point",
+            "OpenLayers.Geometry.MultiPoint": "MultiPoint",
+            "OpenLayers.Geometry.LineString": (this.curve === true) ? "Curve": "LineString",
+            "OpenLayers.Geometry.MultiLineString": (this.multiCurve === false) ? "MultiLineString" : "MultiCurve",
+            "OpenLayers.Geometry.Polygon": (this.surface === true) ? "Surface" : "Polygon",
+            "OpenLayers.Geometry.MultiPolygon": (this.multiSurface === false) ? "MultiPolygon" : "MultiSurface",
+            "OpenLayers.Geometry.Collection": "GeometryCollection"
+        };
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.GML.v3" 
+
+});
diff --git a/lib/OpenLayers/Format/GPX.js b/lib/OpenLayers/Format/GPX.js
new file mode 100644
index 0000000..870ccb3
--- /dev/null
+++ b/lib/OpenLayers/Format/GPX.js
@@ -0,0 +1,184 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Geometry/Point.js
+ * @requires OpenLayers/Geometry/LineString.js
+ * @requires OpenLayers/Projection.js
+ */
+
+/**
+ * Class: OpenLayers.Format.GPX
+ * Read/write GPX parser. Create a new instance with the 
+ *     <OpenLayers.Format.GPX> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.GPX = OpenLayers.Class(OpenLayers.Format.XML, {
+   /**
+    * APIProperty: extractWaypoints
+    * {Boolean} Extract waypoints from GPX. (default: true)
+    */
+    extractWaypoints: true,
+    
+   /**
+    * APIProperty: extractTracks
+    * {Boolean} Extract tracks from GPX. (default: true)
+    */
+    extractTracks: true,
+    
+   /**
+    * APIProperty: extractRoutes
+    * {Boolean} Extract routes from GPX. (default: true)
+    */
+    extractRoutes: true,
+    
+    /**
+     * APIProperty: extractAttributes
+     * {Boolean} Extract feature attributes from GPX. (default: true)
+     *     NOTE: Attributes as part of extensions to the GPX standard may not
+     *     be extracted.
+     */
+    extractAttributes: true,
+    
+    /**
+     * Constructor: OpenLayers.Format.GPX
+     * Create a new parser for GPX.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        // GPX coordinates are always in longlat WGS84
+        this.externalProjection = new OpenLayers.Projection("EPSG:4326");
+
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * APIMethod: read
+     * Return a list of features from a GPX doc
+     *
+     * Parameters:
+     * doc - {Element} 
+     *
+     * Returns:
+     * An Array of <OpenLayers.Feature.Vector>s
+     */
+    read: function(doc) {
+        if (typeof doc == "string") { 
+            doc = OpenLayers.Format.XML.prototype.read.apply(this, [doc]);
+        }
+        var features = [];
+        
+        if(this.extractTracks) {
+            var tracks = doc.getElementsByTagName("trk");
+            for (var i=0, len=tracks.length; i<len; i++) {
+                // Attributes are only in trk nodes, not trkseg nodes
+                var attrs = {};
+                if(this.extractAttributes) {
+                    attrs = this.parseAttributes(tracks[i]);
+                }
+                
+                var segs = this.getElementsByTagNameNS(tracks[i], tracks[i].namespaceURI, "trkseg");
+                for (var j = 0, seglen = segs.length; j < seglen; j++) {
+                    // We don't yet support extraction of trkpt attributes
+                    // All trksegs of a trk get that trk's attributes
+                    var track = this.extractSegment(segs[j], "trkpt");
+                    features.push(new OpenLayers.Feature.Vector(track, attrs));
+                }
+            }
+        }
+        
+        if(this.extractRoutes) {
+            var routes = doc.getElementsByTagName("rte");
+            for (var k=0, klen=routes.length; k<klen; k++) {
+                var attrs = {};
+                if(this.extractAttributes) {
+                    attrs = this.parseAttributes(routes[k]);
+                }
+                var route = this.extractSegment(routes[k], "rtept");
+                features.push(new OpenLayers.Feature.Vector(route, attrs));
+            }
+        }
+        
+        if(this.extractWaypoints) {
+            var waypoints = doc.getElementsByTagName("wpt");
+            for (var l = 0, len = waypoints.length; l < len; l++) {
+                var attrs = {};
+                if(this.extractAttributes) {
+                    attrs = this.parseAttributes(waypoints[l]);
+                }
+                var wpt = new OpenLayers.Geometry.Point(waypoints[l].getAttribute("lon"), waypoints[l].getAttribute("lat"));
+                features.push(new OpenLayers.Feature.Vector(wpt, attrs));
+            }
+        }
+        
+        if (this.internalProjection && this.externalProjection) {
+            for (var g = 0, featLength = features.length; g < featLength; g++) {
+                features[g].geometry.transform(this.externalProjection,
+                                    this.internalProjection);
+            }
+        }
+        
+        return features;
+    },
+    
+   /**
+    * Method: extractSegment
+    *
+    * Parameters:
+    * segment - {<DOMElement>} a trkseg or rte node to parse
+    * segmentType - {String} nodeName of waypoints that form the line
+    *
+    * Returns:
+    * {<OpenLayers.Geometry.LineString>} A linestring geometry
+    */
+    extractSegment: function(segment, segmentType) {
+        var points = this.getElementsByTagNameNS(segment, segment.namespaceURI, segmentType);
+        var point_features = [];
+        for (var i = 0, len = points.length; i < len; i++) {
+            point_features.push(new OpenLayers.Geometry.Point(points[i].getAttribute("lon"), points[i].getAttribute("lat")));
+        }
+        return new OpenLayers.Geometry.LineString(point_features);
+    },
+    
+    /**
+     * Method: parseAttributes
+     *
+     * Parameters:
+     * node - {<DOMElement>}
+     *
+     * Returns:
+     * {Object} An attributes object.
+     */
+    parseAttributes: function(node) {
+        // node is either a wpt, trk or rte
+        // attributes are children of the form <attr>value</attr>
+        var attributes = {};
+        var attrNode = node.firstChild;
+        while(attrNode) {
+            if(attrNode.nodeType == 1) {
+                var value = attrNode.firstChild;
+                if(value.nodeType == 3 || value.nodeType == 4) {
+                    name = (attrNode.prefix) ?
+                        attrNode.nodeName.split(":")[1] :
+                        attrNode.nodeName;
+                    if(name != "trkseg" && name != "rtept") {
+                        attributes[name] = value.nodeValue;
+                    }
+                }
+            }
+            attrNode = attrNode.nextSibling;
+        }
+        return attributes;
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.GPX"
+});
diff --git a/lib/OpenLayers/Format/GeoJSON.js b/lib/OpenLayers/Format/GeoJSON.js
new file mode 100644
index 0000000..ca5047a
--- /dev/null
+++ b/lib/OpenLayers/Format/GeoJSON.js
@@ -0,0 +1,716 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/JSON.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Geometry/Point.js
+ * @requires OpenLayers/Geometry/MultiPoint.js
+ * @requires OpenLayers/Geometry/LineString.js
+ * @requires OpenLayers/Geometry/MultiLineString.js
+ * @requires OpenLayers/Geometry/Polygon.js
+ * @requires OpenLayers/Geometry/MultiPolygon.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Format.GeoJSON
+ * Read and write GeoJSON. Create a new parser with the
+ *     <OpenLayers.Format.GeoJSON> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.JSON>
+ */
+OpenLayers.Format.GeoJSON = OpenLayers.Class(OpenLayers.Format.JSON, {
+
+    /**
+     * APIProperty: ignoreExtraDims
+     * {Boolean} Ignore dimensions higher than 2 when reading geometry
+     * coordinates.
+     */ 
+    ignoreExtraDims: false,
+    
+    /**
+     * Constructor: OpenLayers.Format.GeoJSON
+     * Create a new parser for GeoJSON.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.JSON.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Deserialize a GeoJSON string.
+     *
+     * Parameters:
+     * json - {String} A GeoJSON string
+     * type - {String} Optional string that determines the structure of
+     *     the output.  Supported values are "Geometry", "Feature", and
+     *     "FeatureCollection".  If absent or null, a default of
+     *     "FeatureCollection" is assumed.
+     * filter - {Function} A function which will be called for every key and
+     *     value at every level of the final result. Each value will be
+     *     replaced by the result of the filter function. This can be used to
+     *     reform generic objects into instances of classes, or to transform
+     *     date strings into Date objects.
+     *
+     * Returns: 
+     * {Object} The return depends on the value of the type argument. If type
+     *     is "FeatureCollection" (the default), the return will be an array
+     *     of <OpenLayers.Feature.Vector>. If type is "Geometry", the input json
+     *     must represent a single geometry, and the return will be an
+     *     <OpenLayers.Geometry>.  If type is "Feature", the input json must
+     *     represent a single feature, and the return will be an
+     *     <OpenLayers.Feature.Vector>.
+     */
+    read: function(json, type, filter) {
+        type = (type) ? type : "FeatureCollection";
+        var results = null;
+        var obj = null;
+        if (typeof json == "string") {
+            obj = OpenLayers.Format.JSON.prototype.read.apply(this,
+                                                              [json, filter]);
+        } else { 
+            obj = json;
+        }    
+        if(!obj) {
+            OpenLayers.Console.error("Bad JSON: " + json);
+        } else if(typeof(obj.type) != "string") {
+            OpenLayers.Console.error("Bad GeoJSON - no type: " + json);
+        } else if(this.isValidType(obj, type)) {
+            switch(type) {
+                case "Geometry":
+                    try {
+                        results = this.parseGeometry(obj);
+                    } catch(err) {
+                        OpenLayers.Console.error(err);
+                    }
+                    break;
+                case "Feature":
+                    try {
+                        results = this.parseFeature(obj);
+                        results.type = "Feature";
+                    } catch(err) {
+                        OpenLayers.Console.error(err);
+                    }
+                    break;
+                case "FeatureCollection":
+                    // for type FeatureCollection, we allow input to be any type
+                    results = [];
+                    switch(obj.type) {
+                        case "Feature":
+                            try {
+                                results.push(this.parseFeature(obj));
+                            } catch(err) {
+                                results = null;
+                                OpenLayers.Console.error(err);
+                            }
+                            break;
+                        case "FeatureCollection":
+                            for(var i=0, len=obj.features.length; i<len; ++i) {
+                                try {
+                                    results.push(this.parseFeature(obj.features[i]));
+                                } catch(err) {
+                                    results = null;
+                                    OpenLayers.Console.error(err);
+                                }
+                            }
+                            break;
+                        default:
+                            try {
+                                var geom = this.parseGeometry(obj);
+                                results.push(new OpenLayers.Feature.Vector(geom));
+                            } catch(err) {
+                                results = null;
+                                OpenLayers.Console.error(err);
+                            }
+                    }
+                break;
+            }
+        }
+        return results;
+    },
+    
+    /**
+     * Method: isValidType
+     * Check if a GeoJSON object is a valid representative of the given type.
+     *
+     * Returns:
+     * {Boolean} The object is valid GeoJSON object of the given type.
+     */
+    isValidType: function(obj, type) {
+        var valid = false;
+        switch(type) {
+            case "Geometry":
+                if(OpenLayers.Util.indexOf(
+                    ["Point", "MultiPoint", "LineString", "MultiLineString",
+                     "Polygon", "MultiPolygon", "Box", "GeometryCollection"],
+                    obj.type) == -1) {
+                    // unsupported geometry type
+                    OpenLayers.Console.error("Unsupported geometry type: " +
+                                              obj.type);
+                } else {
+                    valid = true;
+                }
+                break;
+            case "FeatureCollection":
+                // allow for any type to be converted to a feature collection
+                valid = true;
+                break;
+            default:
+                // for Feature types must match
+                if(obj.type == type) {
+                    valid = true;
+                } else {
+                    OpenLayers.Console.error("Cannot convert types from " +
+                                              obj.type + " to " + type);
+                }
+        }
+        return valid;
+    },
+    
+    /**
+     * Method: parseFeature
+     * Convert a feature object from GeoJSON into an
+     *     <OpenLayers.Feature.Vector>.
+     *
+     * Parameters:
+     * obj - {Object} An object created from a GeoJSON object
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>} A feature.
+     */
+    parseFeature: function(obj) {
+        var feature, geometry, attributes, bbox;
+        attributes = (obj.properties) ? obj.properties : {};
+        bbox = (obj.geometry && obj.geometry.bbox) || obj.bbox;
+        try {
+            geometry = this.parseGeometry(obj.geometry);
+        } catch(err) {
+            // deal with bad geometries
+            throw err;
+        }
+        feature = new OpenLayers.Feature.Vector(geometry, attributes);
+        if(bbox) {
+            feature.bounds = OpenLayers.Bounds.fromArray(bbox);
+        }
+        if(obj.id) {
+            feature.fid = obj.id;
+        }
+        return feature;
+    },
+    
+    /**
+     * Method: parseGeometry
+     * Convert a geometry object from GeoJSON into an <OpenLayers.Geometry>.
+     *
+     * Parameters:
+     * obj - {Object} An object created from a GeoJSON object
+     *
+     * Returns: 
+     * {<OpenLayers.Geometry>} A geometry.
+     */
+    parseGeometry: function(obj) {
+        if (obj == null) {
+            return null;
+        }
+        var geometry, collection = false;
+        if(obj.type == "GeometryCollection") {
+            if(!(obj.geometries instanceof Array)) {
+                throw "GeometryCollection must have geometries array: " + obj;
+            }
+            var numGeom = obj.geometries.length;
+            var components = new Array(numGeom);
+            for(var i=0; i<numGeom; ++i) {
+                components[i] = this.parseGeometry.apply(
+                    this, [obj.geometries[i]]
+                );
+            }
+            geometry = new OpenLayers.Geometry.Collection(components);
+            collection = true;
+        } else {
+            if(!(obj.coordinates instanceof Array)) {
+                throw "Geometry must have coordinates array: " + obj;
+            }
+            if(!this.parseCoords[obj.type.toLowerCase()]) {
+                throw "Unsupported geometry type: " + obj.type;
+            }
+            try {
+                geometry = this.parseCoords[obj.type.toLowerCase()].apply(
+                    this, [obj.coordinates]
+                );
+            } catch(err) {
+                // deal with bad coordinates
+                throw err;
+            }
+        }
+        // We don't reproject collections because the children are reprojected
+        // for us when they are created.
+        if (this.internalProjection && this.externalProjection && !collection) {
+            geometry.transform(this.externalProjection, 
+                               this.internalProjection); 
+        }                       
+        return geometry;
+    },
+    
+    /**
+     * Property: parseCoords
+     * Object with properties corresponding to the GeoJSON geometry types.
+     *     Property values are functions that do the actual parsing.
+     */
+    parseCoords: {
+        /**
+         * Method: parseCoords.point
+         * Convert a coordinate array from GeoJSON into an
+         *     <OpenLayers.Geometry>.
+         *
+         * Parameters:
+         * array - {Object} The coordinates array from the GeoJSON fragment.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry>} A geometry.
+         */
+        "point": function(array) {
+            if (this.ignoreExtraDims == false && 
+                  array.length != 2) {
+                    throw "Only 2D points are supported: " + array;
+            }
+            return new OpenLayers.Geometry.Point(array[0], array[1]);
+        },
+        
+        /**
+         * Method: parseCoords.multipoint
+         * Convert a coordinate array from GeoJSON into an
+         *     <OpenLayers.Geometry>.
+         *
+         * Parameters:
+         * array {Object} The coordinates array from the GeoJSON fragment.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry>} A geometry.
+         */
+        "multipoint": function(array) {
+            var points = [];
+            var p = null;
+            for(var i=0, len=array.length; i<len; ++i) {
+                try {
+                    p = this.parseCoords["point"].apply(this, [array[i]]);
+                } catch(err) {
+                    throw err;
+                }
+                points.push(p);
+            }
+            return new OpenLayers.Geometry.MultiPoint(points);
+        },
+
+        /**
+         * Method: parseCoords.linestring
+         * Convert a coordinate array from GeoJSON into an
+         *     <OpenLayers.Geometry>.
+         *
+         * Parameters:
+         * array - {Object} The coordinates array from the GeoJSON fragment.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry>} A geometry.
+         */
+        "linestring": function(array) {
+            var points = [];
+            var p = null;
+            for(var i=0, len=array.length; i<len; ++i) {
+                try {
+                    p = this.parseCoords["point"].apply(this, [array[i]]);
+                } catch(err) {
+                    throw err;
+                }
+                points.push(p);
+            }
+            return new OpenLayers.Geometry.LineString(points);
+        },
+        
+        /**
+         * Method: parseCoords.multilinestring
+         * Convert a coordinate array from GeoJSON into an
+         *     <OpenLayers.Geometry>.
+         *
+         * Parameters:
+         * array - {Object} The coordinates array from the GeoJSON fragment.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry>} A geometry.
+         */
+        "multilinestring": function(array) {
+            var lines = [];
+            var l = null;
+            for(var i=0, len=array.length; i<len; ++i) {
+                try {
+                    l = this.parseCoords["linestring"].apply(this, [array[i]]);
+                } catch(err) {
+                    throw err;
+                }
+                lines.push(l);
+            }
+            return new OpenLayers.Geometry.MultiLineString(lines);
+        },
+        
+        /**
+         * Method: parseCoords.polygon
+         * Convert a coordinate array from GeoJSON into an
+         *     <OpenLayers.Geometry>.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry>} A geometry.
+         */
+        "polygon": function(array) {
+            var rings = [];
+            var r, l;
+            for(var i=0, len=array.length; i<len; ++i) {
+                try {
+                    l = this.parseCoords["linestring"].apply(this, [array[i]]);
+                } catch(err) {
+                    throw err;
+                }
+                r = new OpenLayers.Geometry.LinearRing(l.components);
+                rings.push(r);
+            }
+            return new OpenLayers.Geometry.Polygon(rings);
+        },
+
+        /**
+         * Method: parseCoords.multipolygon
+         * Convert a coordinate array from GeoJSON into an
+         *     <OpenLayers.Geometry>.
+         *
+         * Parameters:
+         * array - {Object} The coordinates array from the GeoJSON fragment.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry>} A geometry.
+         */
+        "multipolygon": function(array) {
+            var polys = [];
+            var p = null;
+            for(var i=0, len=array.length; i<len; ++i) {
+                try {
+                    p = this.parseCoords["polygon"].apply(this, [array[i]]);
+                } catch(err) {
+                    throw err;
+                }
+                polys.push(p);
+            }
+            return new OpenLayers.Geometry.MultiPolygon(polys);
+        },
+
+        /**
+         * Method: parseCoords.box
+         * Convert a coordinate array from GeoJSON into an
+         *     <OpenLayers.Geometry>.
+         *
+         * Parameters:
+         * array - {Object} The coordinates array from the GeoJSON fragment.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry>} A geometry.
+         */
+        "box": function(array) {
+            if(array.length != 2) {
+                throw "GeoJSON box coordinates must have 2 elements";
+            }
+            return new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(array[0][0], array[0][1]),
+                    new OpenLayers.Geometry.Point(array[1][0], array[0][1]),
+                    new OpenLayers.Geometry.Point(array[1][0], array[1][1]),
+                    new OpenLayers.Geometry.Point(array[0][0], array[1][1]),
+                    new OpenLayers.Geometry.Point(array[0][0], array[0][1])
+                ])
+            ]);
+        }
+
+    },
+
+    /**
+     * APIMethod: write
+     * Serialize a feature, geometry, array of features into a GeoJSON string.
+     *
+     * Parameters:
+     * obj - {Object} An <OpenLayers.Feature.Vector>, <OpenLayers.Geometry>,
+     *     or an array of features.
+     * pretty - {Boolean} Structure the output with newlines and indentation.
+     *     Default is false.
+     *
+     * Returns:
+     * {String} The GeoJSON string representation of the input geometry,
+     *     features, or array of features.
+     */
+    write: function(obj, pretty) {
+        var geojson = {
+            "type": null
+        };
+        if(obj instanceof Array) {
+            geojson.type = "FeatureCollection";
+            var numFeatures = obj.length;
+            geojson.features = new Array(numFeatures);
+            for(var i=0; i<numFeatures; ++i) {
+                var element = obj[i];
+                if(!element instanceof OpenLayers.Feature.Vector) {
+                    var msg = "FeatureCollection only supports collections " +
+                              "of features: " + element;
+                    throw msg;
+                }
+                geojson.features[i] = this.extract.feature.apply(
+                    this, [element]
+                );
+            }
+        } else if (obj.CLASS_NAME.indexOf("OpenLayers.Geometry") == 0) {
+            geojson = this.extract.geometry.apply(this, [obj]);
+        } else if (obj instanceof OpenLayers.Feature.Vector) {
+            geojson = this.extract.feature.apply(this, [obj]);
+            if(obj.layer && obj.layer.projection) {
+                geojson.crs = this.createCRSObject(obj);
+            }
+        }
+        return OpenLayers.Format.JSON.prototype.write.apply(this,
+                                                            [geojson, pretty]);
+    },
+
+    /**
+     * Method: createCRSObject
+     * Create the CRS object for an object.
+     *
+     * Parameters:
+     * object - {<OpenLayers.Feature.Vector>} 
+     *
+     * Returns:
+     * {Object} An object which can be assigned to the crs property
+     * of a GeoJSON object.
+     */
+    createCRSObject: function(object) {
+       var proj = object.layer.projection.toString();
+       var crs = {};
+       if (proj.match(/epsg:/i)) {
+           var code = parseInt(proj.substring(proj.indexOf(":") + 1));
+           if (code == 4326) {
+               crs = {
+                   "type": "OGC",
+                   "properties": {
+                       "urn": "urn:ogc:def:crs:OGC:1.3:CRS84"
+                   }
+               };
+           } else {    
+               crs = {
+                   "type": "EPSG",
+                   "properties": {
+                       "code": code 
+                   }
+               };
+           }    
+       }
+       return crs;
+    },
+    
+    /**
+     * Property: extract
+     * Object with properties corresponding to the GeoJSON types.
+     *     Property values are functions that do the actual value extraction.
+     */
+    extract: {
+        /**
+         * Method: extract.feature
+         * Return a partial GeoJSON object representing a single feature.
+         *
+         * Parameters:
+         * feature - {<OpenLayers.Feature.Vector>}
+         *
+         * Returns:
+         * {Object} An object representing the point.
+         */
+        'feature': function(feature) {
+            var geom = this.extract.geometry.apply(this, [feature.geometry]);
+            return {
+                "type": "Feature",
+                "id": feature.fid == null ? feature.id : feature.fid,
+                "properties": feature.attributes,
+                "geometry": geom
+            };
+        },
+        
+        /**
+         * Method: extract.geometry
+         * Return a GeoJSON object representing a single geometry.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry>}
+         *
+         * Returns:
+         * {Object} An object representing the geometry.
+         */
+        'geometry': function(geometry) {
+            if (geometry == null) {
+                return null;
+            }
+            if (this.internalProjection && this.externalProjection) {
+                geometry = geometry.clone();
+                geometry.transform(this.internalProjection, 
+                                   this.externalProjection);
+            }                       
+            var geometryType = geometry.CLASS_NAME.split('.')[2];
+            var data = this.extract[geometryType.toLowerCase()].apply(this, [geometry]);
+            var json;
+            if(geometryType == "Collection") {
+                json = {
+                    "type": "GeometryCollection",
+                    "geometries": data
+                };
+            } else {
+                json = {
+                    "type": geometryType,
+                    "coordinates": data
+                };
+            }
+            
+            return json;
+        },
+
+        /**
+         * Method: extract.point
+         * Return an array of coordinates from a point.
+         *
+         * Parameters:
+         * point - {<OpenLayers.Geometry.Point>}
+         *
+         * Returns: 
+         * {Array} An array of coordinates representing the point.
+         */
+        'point': function(point) {
+            return [point.x, point.y];
+        },
+
+        /**
+         * Method: extract.multipoint
+         * Return an array of point coordinates from a multipoint.
+         *
+         * Parameters:
+         * multipoint - {<OpenLayers.Geometry.MultiPoint>}
+         *
+         * Returns:
+         * {Array} An array of point coordinate arrays representing
+         *     the multipoint.
+         */
+        'multipoint': function(multipoint) {
+            var array = [];
+            for(var i=0, len=multipoint.components.length; i<len; ++i) {
+                array.push(this.extract.point.apply(this, [multipoint.components[i]]));
+            }
+            return array;
+        },
+        
+        /**
+         * Method: extract.linestring
+         * Return an array of coordinate arrays from a linestring.
+         *
+         * Parameters:
+         * linestring - {<OpenLayers.Geometry.LineString>}
+         *
+         * Returns:
+         * {Array} An array of coordinate arrays representing
+         *     the linestring.
+         */
+        'linestring': function(linestring) {
+            var array = [];
+            for(var i=0, len=linestring.components.length; i<len; ++i) {
+                array.push(this.extract.point.apply(this, [linestring.components[i]]));
+            }
+            return array;
+        },
+
+        /**
+         * Method: extract.multilinestring
+         * Return an array of linestring arrays from a linestring.
+         * 
+         * Parameters:
+         * linestring - {<OpenLayers.Geometry.MultiLineString>}
+         * 
+         * Returns:
+         * {Array} An array of linestring arrays representing
+         *     the multilinestring.
+         */
+        'multilinestring': function(multilinestring) {
+            var array = [];
+            for(var i=0, len=multilinestring.components.length; i<len; ++i) {
+                array.push(this.extract.linestring.apply(this, [multilinestring.components[i]]));
+            }
+            return array;
+        },
+        
+        /**
+         * Method: extract.polygon
+         * Return an array of linear ring arrays from a polygon.
+         *
+         * Parameters:
+         * polygon - {<OpenLayers.Geometry.Polygon>}
+         * 
+         * Returns:
+         * {Array} An array of linear ring arrays representing the polygon.
+         */
+        'polygon': function(polygon) {
+            var array = [];
+            for(var i=0, len=polygon.components.length; i<len; ++i) {
+                array.push(this.extract.linestring.apply(this, [polygon.components[i]]));
+            }
+            return array;
+        },
+
+        /**
+         * Method: extract.multipolygon
+         * Return an array of polygon arrays from a multipolygon.
+         * 
+         * Parameters:
+         * multipolygon - {<OpenLayers.Geometry.MultiPolygon>}
+         * 
+         * Returns:
+         * {Array} An array of polygon arrays representing
+         *     the multipolygon
+         */
+        'multipolygon': function(multipolygon) {
+            var array = [];
+            for(var i=0, len=multipolygon.components.length; i<len; ++i) {
+                array.push(this.extract.polygon.apply(this, [multipolygon.components[i]]));
+            }
+            return array;
+        },
+        
+        /**
+         * Method: extract.collection
+         * Return an array of geometries from a geometry collection.
+         * 
+         * Parameters:
+         * collection - {<OpenLayers.Geometry.Collection>}
+         * 
+         * Returns:
+         * {Array} An array of geometry objects representing the geometry
+         *     collection.
+         */
+        'collection': function(collection) {
+            var len = collection.components.length;
+            var array = new Array(len);
+            for(var i=0; i<len; ++i) {
+                array[i] = this.extract.geometry.apply(
+                    this, [collection.components[i]]
+                );
+            }
+            return array;
+        }
+        
+
+    },
+
+    CLASS_NAME: "OpenLayers.Format.GeoJSON" 
+
+});     
diff --git a/lib/OpenLayers/Format/GeoRSS.js b/lib/OpenLayers/Format/GeoRSS.js
new file mode 100644
index 0000000..331f08c
--- /dev/null
+++ b/lib/OpenLayers/Format/GeoRSS.js
@@ -0,0 +1,420 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Geometry/Point.js
+ * @requires OpenLayers/Geometry/LineString.js
+ * @requires OpenLayers/Geometry/Polygon.js
+ */
+
+/**
+ * Class: OpenLayers.Format.GeoRSS
+ * Read/write GeoRSS parser. Create a new instance with the 
+ *     <OpenLayers.Format.GeoRSS> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.GeoRSS = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * APIProperty: rssns
+     * {String} RSS namespace to use. Defaults to
+     *   "http://backend.userland.com/rss2"
+     */
+    rssns: "http://backend.userland.com/rss2",
+    
+    /**
+     * APIProperty: featurens
+     * {String} Feature Attributes namespace.  Defaults to
+     *    "http://mapserver.gis.umn.edu/mapserver"
+     */
+    featureNS: "http://mapserver.gis.umn.edu/mapserver",
+    
+    /**
+     * APIProperty: georssns
+     * {String} GeoRSS namespace to use.  Defaults to
+     *     "http://www.georss.org/georss"
+     */
+    georssns: "http://www.georss.org/georss",
+
+    /**
+     * APIProperty: geons
+     * {String} W3C Geo namespace to use.  Defaults to
+     *     "http://www.w3.org/2003/01/geo/wgs84_pos#"
+     */
+    geons: "http://www.w3.org/2003/01/geo/wgs84_pos#",
+    
+    /**
+     * APIProperty: featureTitle
+     * {String} Default title for features.  Defaults to "Untitled"
+     */
+    featureTitle: "Untitled",
+    
+    /**
+     * APIProperty: featureDescription
+     * {String} Default description for features.  Defaults to "No Description"
+     */
+    featureDescription: "No Description",
+    
+    /**
+     * Property: gmlParse
+     * {Object} GML Format object for parsing features
+     * Non-API and only created if necessary
+     */
+    gmlParser: null,
+
+    /**
+     * APIProperty: xy
+     * {Boolean} Order of the GML coordinate: true:(x,y) or false:(y,x)
+     * For GeoRSS the default is (y,x), therefore: false
+     */ 
+    xy: false,
+    
+    /**
+     * Constructor: OpenLayers.Format.GeoRSS
+     * Create a new parser for GeoRSS.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Method: createGeometryFromItem
+     * Return a geometry from a GeoRSS Item.
+     *
+     * Parameters:
+     * item - {DOMElement} A GeoRSS item node.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry>} A geometry representing the node.
+     */
+    createGeometryFromItem: function(item) {
+        var point = this.getElementsByTagNameNS(item, this.georssns, "point");
+        var lat = this.getElementsByTagNameNS(item, this.geons, 'lat');
+        var lon = this.getElementsByTagNameNS(item, this.geons, 'long');
+        
+        var line = this.getElementsByTagNameNS(item,
+                                                this.georssns,
+                                                "line");
+        var polygon = this.getElementsByTagNameNS(item,
+                                                this.georssns,
+                                                "polygon");
+        var where = this.getElementsByTagNameNS(item, 
+                                                this.georssns, 
+                                                "where");
+        var box = this.getElementsByTagNameNS(item, 
+                                              this.georssns, 
+                                              "box");
+												
+        if (point.length > 0 || (lat.length > 0 && lon.length > 0)) {
+            var location;
+            if (point.length > 0) {
+                location = OpenLayers.String.trim(
+                                point[0].firstChild.nodeValue).split(/\s+/);
+                if (location.length !=2) {
+                    location = OpenLayers.String.trim(
+                                point[0].firstChild.nodeValue).split(/\s*,\s*/);
+                }
+            } else {
+                location = [parseFloat(lat[0].firstChild.nodeValue),
+                                parseFloat(lon[0].firstChild.nodeValue)];
+            }    
+
+            var geometry = new OpenLayers.Geometry.Point(parseFloat(location[1]),
+                                                         parseFloat(location[0]));
+              
+        } else if (line.length > 0) {
+            var coords = OpenLayers.String.trim(this.concatChildValues(line[0])).split(/\s+/);
+            var components = []; 
+            var point;
+            for (var i=0, len=coords.length; i<len; i+=2) {
+                point = new OpenLayers.Geometry.Point(parseFloat(coords[i+1]), 
+                                                     parseFloat(coords[i]));
+                components.push(point);
+            }
+            geometry = new OpenLayers.Geometry.LineString(components);
+        } else if (polygon.length > 0) { 
+            var coords = OpenLayers.String.trim(this.concatChildValues(polygon[0])).split(/\s+/);
+            var components = []; 
+            var point;
+            for (var i=0, len=coords.length; i<len; i+=2) {
+                point = new OpenLayers.Geometry.Point(parseFloat(coords[i+1]), 
+                                                     parseFloat(coords[i]));
+                components.push(point);
+            }
+            geometry = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(components)]);
+        } else if (where.length > 0) { 
+            if (!this.gmlParser) {
+              this.gmlParser = new OpenLayers.Format.GML({'xy': this.xy});
+            }
+            var feature = this.gmlParser.parseFeature(where[0]);
+            geometry = feature.geometry;
+        } else if (box.length  > 0) {
+            var coords = OpenLayers.String.trim(box[0].firstChild.nodeValue).split(/\s+/);
+            var components = [];
+            var point;
+            if (coords.length > 3) {
+                point = new OpenLayers.Geometry.Point(parseFloat(coords[1]), 
+                                                     parseFloat(coords[0]));
+                components.push(point);
+                point = new OpenLayers.Geometry.Point(parseFloat(coords[1]), 
+                                                     parseFloat(coords[2]));
+                components.push(point);
+                point = new OpenLayers.Geometry.Point(parseFloat(coords[3]), 
+                                                     parseFloat(coords[2]));
+                components.push(point);
+                point = new OpenLayers.Geometry.Point(parseFloat(coords[3]), 
+                                                     parseFloat(coords[0]));
+                components.push(point);
+                point = new OpenLayers.Geometry.Point(parseFloat(coords[1]), 
+                                                     parseFloat(coords[0]));
+                components.push(point);
+            }
+            geometry = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing(components)]);									 
+        }
+        
+        if (geometry && this.internalProjection && this.externalProjection) {
+            geometry.transform(this.externalProjection, 
+                               this.internalProjection);
+        }
+
+        return geometry;
+    },        
+
+    /**
+     * Method: createFeatureFromItem
+     * Return a feature from a GeoRSS Item.
+     *
+     * Parameters:
+     * item - {DOMElement} A GeoRSS item node.
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>} A feature representing the item.
+     */
+    createFeatureFromItem: function(item) {
+        var geometry = this.createGeometryFromItem(item);
+     
+        /* Provide defaults for title and description */
+        var title = this.getChildValue(item, "*", "title", this.featureTitle);
+       
+        /* First try RSS descriptions, then Atom summaries */
+        var description = this.getChildValue(
+            item, "*", "description",
+            this.getChildValue(item, "*", "content",
+                this.getChildValue(item, "*", "summary", this.featureDescription)));
+
+        /* If no link URL is found in the first child node, try the
+           href attribute */
+        var link = this.getChildValue(item, "*", "link");
+        if(!link) {
+            try {
+                link = this.getElementsByTagNameNS(item, "*", "link")[0].getAttribute("href");
+            } catch(e) {
+                link = null;
+            }
+        }
+
+        var id = this.getChildValue(item, "*", "id", null);
+        
+        var data = {
+            "title": title,
+            "description": description,
+            "link": link
+        };
+        var feature = new OpenLayers.Feature.Vector(geometry, data);
+        feature.fid = id;
+        return feature;
+    },        
+    
+    /**
+     * Method: getChildValue
+     *
+     * Parameters:
+     * node - {DOMElement}
+     * nsuri - {String} Child node namespace uri ("*" for any).
+     * name - {String} Child node name.
+     * def - {String} Optional string default to return if no child found.
+     *
+     * Returns:
+     * {String} The value of the first child with the given tag name.  Returns
+     *     default value or empty string if none found.
+     */
+    getChildValue: function(node, nsuri, name, def) {
+        var value;
+        var eles = this.getElementsByTagNameNS(node, nsuri, name);
+        if(eles && eles[0] && eles[0].firstChild
+            && eles[0].firstChild.nodeValue) {
+            value = eles[0].firstChild.nodeValue;
+        } else {
+            value = (def == undefined) ? "" : def;
+        }
+        return value;
+    },
+    
+    /**
+     * APIMethod: read
+     * Return a list of features from a GeoRSS doc
+     
+     * Parameters:
+     * data - {Element} 
+     *
+     * Returns:
+     * An Array of <OpenLayers.Feature.Vector>s
+     */
+    read: function(doc) {
+        if (typeof doc == "string") { 
+            doc = OpenLayers.Format.XML.prototype.read.apply(this, [doc]);
+        }
+
+        /* Try RSS items first, then Atom entries */
+        var itemlist = null;
+        itemlist = this.getElementsByTagNameNS(doc, '*', 'item');
+        if (itemlist.length == 0) {
+            itemlist = this.getElementsByTagNameNS(doc, '*', 'entry');
+        }
+        
+        var numItems = itemlist.length;
+        var features = new Array(numItems);
+        for(var i=0; i<numItems; i++) {
+            features[i] = this.createFeatureFromItem(itemlist[i]);
+        }
+        return features;
+    },
+    
+
+    /**
+     * APIMethod: write
+     * Accept Feature Collection, and return a string. 
+     * 
+     * Parameters: 
+     * features - {Array(<OpenLayers.Feature.Vector>)} List of features to serialize into a string.
+     */
+    write: function(features) {
+        var georss;
+        if(features instanceof Array) {
+            georss = this.createElementNS(this.rssns, "rss");
+            for(var i=0, len=features.length; i<len; i++) {
+                georss.appendChild(this.createFeatureXML(features[i]));
+            }
+        } else {
+            georss = this.createFeatureXML(features);
+        }
+        return OpenLayers.Format.XML.prototype.write.apply(this, [georss]);
+    },
+
+    /**
+     * Method: createFeatureXML
+     * Accept an <OpenLayers.Feature.Vector>, and build a geometry for it.
+     * 
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     *
+     * Returns:
+     * {DOMElement}
+     */
+    createFeatureXML: function(feature) {
+        var geometryNode = this.buildGeometryNode(feature.geometry);
+        var featureNode = this.createElementNS(this.rssns, "item");
+        var titleNode = this.createElementNS(this.rssns, "title");
+        titleNode.appendChild(this.createTextNode(feature.attributes.title ? feature.attributes.title : ""));
+        var descNode = this.createElementNS(this.rssns, "description");
+        descNode.appendChild(this.createTextNode(feature.attributes.description ? feature.attributes.description : ""));
+        featureNode.appendChild(titleNode);
+        featureNode.appendChild(descNode);
+        if (feature.attributes.link) {
+            var linkNode = this.createElementNS(this.rssns, "link");
+            linkNode.appendChild(this.createTextNode(feature.attributes.link));
+            featureNode.appendChild(linkNode);
+        }    
+        for(var attr in feature.attributes) {
+            if (attr == "link" || attr == "title" || attr == "description") { continue; } 
+            var attrText = this.createTextNode(feature.attributes[attr]); 
+            var nodename = attr;
+            if (attr.search(":") != -1) {
+                nodename = attr.split(":")[1];
+            }    
+            var attrContainer = this.createElementNS(this.featureNS, "feature:"+nodename);
+            attrContainer.appendChild(attrText);
+            featureNode.appendChild(attrContainer);
+        }    
+        featureNode.appendChild(geometryNode);
+        return featureNode;
+    },    
+    
+    /** 
+     * Method: buildGeometryNode
+     * builds a GeoRSS node with a given geometry
+     * 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     *
+     * Returns:
+     * {DOMElement} A gml node.
+     */
+    buildGeometryNode: function(geometry) {
+        if (this.internalProjection && this.externalProjection) {
+            geometry = geometry.clone();
+            geometry.transform(this.internalProjection, 
+                               this.externalProjection);
+        }
+        var node;
+        // match Polygon
+        if (geometry.CLASS_NAME == "OpenLayers.Geometry.Polygon") {
+            node = this.createElementNS(this.georssns, 'georss:polygon');
+            
+            node.appendChild(this.buildCoordinatesNode(geometry.components[0]));
+        }
+        // match LineString
+        else if (geometry.CLASS_NAME == "OpenLayers.Geometry.LineString") {
+            node = this.createElementNS(this.georssns, 'georss:line');
+            
+            node.appendChild(this.buildCoordinatesNode(geometry));
+        }
+        // match Point
+        else if (geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+            node = this.createElementNS(this.georssns, 'georss:point');
+            node.appendChild(this.buildCoordinatesNode(geometry));
+        } else {
+            throw "Couldn't parse " + geometry.CLASS_NAME;
+        }  
+        return node;         
+    },
+    
+    /** 
+     * Method: buildCoordinatesNode
+     * 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     */
+    buildCoordinatesNode: function(geometry) {
+        var points = null;
+        
+        if (geometry.components) {
+            points = geometry.components;
+        }
+
+        var path;
+        if (points) {
+            var numPoints = points.length;
+            var parts = new Array(numPoints);
+            for (var i = 0; i < numPoints; i++) {
+                parts[i] = points[i].y + " " + points[i].x;
+            }
+            path = parts.join(" ");
+        } else {
+            path = geometry.y + " " + geometry.x;
+        }
+        return this.createTextNode(path);
+    },
+
+    CLASS_NAME: "OpenLayers.Format.GeoRSS" 
+});     
diff --git a/lib/OpenLayers/Format/JSON.js b/lib/OpenLayers/Format/JSON.js
new file mode 100644
index 0000000..4ba3138
--- /dev/null
+++ b/lib/OpenLayers/Format/JSON.js
@@ -0,0 +1,389 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * Note:
+ * This work draws heavily from the public domain JSON serializer/deserializer
+ *     at http://www.json.org/json.js. Rewritten so that it doesn't modify
+ *     basic data prototypes.
+ */
+
+/**
+ * @requires OpenLayers/Format.js
+ */
+
+/**
+ * Class: OpenLayers.Format.JSON
+ * A parser to read/write JSON safely.  Create a new instance with the
+ *     <OpenLayers.Format.JSON> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format>
+ */
+OpenLayers.Format.JSON = OpenLayers.Class(OpenLayers.Format, {
+    
+    /**
+     * APIProperty: indent
+     * {String} For "pretty" printing, the indent string will be used once for
+     *     each indentation level.
+     */
+    indent: "    ",
+    
+    /**
+     * APIProperty: space
+     * {String} For "pretty" printing, the space string will be used after
+     *     the ":" separating a name/value pair.
+     */
+    space: " ",
+    
+    /**
+     * APIProperty: newline
+     * {String} For "pretty" printing, the newline string will be used at the
+     *     end of each name/value pair or array item.
+     */
+    newline: "\n",
+    
+    /**
+     * Property: level
+     * {Integer} For "pretty" printing, this is incremented/decremented during
+     *     serialization.
+     */
+    level: 0,
+
+    /**
+     * Property: pretty
+     * {Boolean} Serialize with extra whitespace for structure.  This is set
+     *     by the <write> method.
+     */
+    pretty: false,
+
+    /**
+     * Constructor: OpenLayers.Format.JSON
+     * Create a new parser for JSON.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Deserialize a json string.
+     *
+     * Parameters:
+     * json - {String} A JSON string
+     * filter - {Function} A function which will be called for every key and
+     *     value at every level of the final result. Each value will be
+     *     replaced by the result of the filter function. This can be used to
+     *     reform generic objects into instances of classes, or to transform
+     *     date strings into Date objects.
+     *     
+     * Returns:
+     * {Object} An object, array, string, or number .
+     */
+    read: function(json, filter) {
+        /**
+         * Parsing happens in three stages. In the first stage, we run the text
+         *     against a regular expression which looks for non-JSON
+         *     characters. We are especially concerned with '()' and 'new'
+         *     because they can cause invocation, and '=' because it can cause
+         *     mutation. But just to be safe, we will reject all unexpected
+         *     characters.
+         */
+        try {
+            if (/^[\],:{}\s]*$/.test(json.replace(/\\["\\\/bfnrtu]/g, '@').
+                                replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
+                                replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+                /**
+                 * In the second stage we use the eval function to compile the
+                 *     text into a JavaScript structure. The '{' operator is
+                 *     subject to a syntactic ambiguity in JavaScript - it can
+                 *     begin a block or an object literal. We wrap the text in
+                 *     parens to eliminate the ambiguity.
+                 */
+                var object = eval('(' + json + ')');
+
+                /**
+                 * In the optional third stage, we recursively walk the new
+                 *     structure, passing each name/value pair to a filter
+                 *     function for possible transformation.
+                 */
+                if(typeof filter === 'function') {
+                    function walk(k, v) {
+                        if(v && typeof v === 'object') {
+                            for(var i in v) {
+                                if(v.hasOwnProperty(i)) {
+                                    v[i] = walk(i, v[i]);
+                                }
+                            }
+                        }
+                        return filter(k, v);
+                    }
+                    object = walk('', object);
+                }
+
+                if(this.keepData) {
+                    this.data = object;
+                }
+
+                return object;
+            }
+        } catch(e) {
+            // Fall through if the regexp test fails.
+        }
+        return null;
+    },
+
+    /**
+     * APIMethod: write
+     * Serialize an object into a JSON string.
+     *
+     * Parameters:
+     * value - {String} The object, array, string, number, boolean or date
+     *     to be serialized.
+     * pretty - {Boolean} Structure the output with newlines and indentation.
+     *     Default is false.
+     *
+     * Returns:
+     * {String} The JSON string representation of the input value.
+     */
+    write: function(value, pretty) {
+        this.pretty = !!pretty;
+        var json = null;
+        var type = typeof value;
+        if(this.serialize[type]) {
+            try {
+                json = this.serialize[type].apply(this, [value]);
+            } catch(err) {
+                OpenLayers.Console.error("Trouble serializing: " + err);
+            }
+        }
+        return json;
+    },
+    
+    /**
+     * Method: writeIndent
+     * Output an indentation string depending on the indentation level.
+     *
+     * Returns:
+     * {String} An appropriate indentation string.
+     */
+    writeIndent: function() {
+        var pieces = [];
+        if(this.pretty) {
+            for(var i=0; i<this.level; ++i) {
+                pieces.push(this.indent);
+            }
+        }
+        return pieces.join('');
+    },
+    
+    /**
+     * Method: writeNewline
+     * Output a string representing a newline if in pretty printing mode.
+     *
+     * Returns:
+     * {String} A string representing a new line.
+     */
+    writeNewline: function() {
+        return (this.pretty) ? this.newline : '';
+    },
+    
+    /**
+     * Method: writeSpace
+     * Output a string representing a space if in pretty printing mode.
+     *
+     * Returns:
+     * {String} A space.
+     */
+    writeSpace: function() {
+        return (this.pretty) ? this.space : '';
+    },
+
+    /**
+     * Property: serialize
+     * Object with properties corresponding to the serializable data types.
+     *     Property values are functions that do the actual serializing.
+     */
+    serialize: {
+        /**
+         * Method: serialize.object
+         * Transform an object into a JSON string.
+         *
+         * Parameters:
+         * object - {Object} The object to be serialized.
+         * 
+         * Returns:
+         * {String} A JSON string representing the object.
+         */
+        'object': function(object) {
+            // three special objects that we want to treat differently
+            if(object == null) {
+                return "null";
+            }
+            if(object.constructor == Date) {
+                return this.serialize.date.apply(this, [object]);
+            }
+            if(object.constructor == Array) {
+                return this.serialize.array.apply(this, [object]);
+            }
+            var pieces = ['{'];
+            this.level += 1;
+            var key, keyJSON, valueJSON;
+            
+            var addComma = false;
+            for(key in object) {
+                if(object.hasOwnProperty(key)) {
+                    // recursive calls need to allow for sub-classing
+                    keyJSON = OpenLayers.Format.JSON.prototype.write.apply(this,
+                                                    [key, this.pretty]);
+                    valueJSON = OpenLayers.Format.JSON.prototype.write.apply(this,
+                                                    [object[key], this.pretty]);
+                    if(keyJSON != null && valueJSON != null) {
+                        if(addComma) {
+                            pieces.push(',');
+                        }
+                        pieces.push(this.writeNewline(), this.writeIndent(),
+                                    keyJSON, ':', this.writeSpace(), valueJSON);
+                        addComma = true;
+                    }
+                }
+            }
+            
+            this.level -= 1;
+            pieces.push(this.writeNewline(), this.writeIndent(), '}');
+            return pieces.join('');
+        },
+        
+        /**
+         * Method: serialize.array
+         * Transform an array into a JSON string.
+         *
+         * Parameters:
+         * array - {Array} The array to be serialized
+         * 
+         * Returns:
+         * {String} A JSON string representing the array.
+         */
+        'array': function(array) {
+            var json;
+            var pieces = ['['];
+            this.level += 1;
+    
+            for(var i=0, len=array.length; i<len; ++i) {
+                // recursive calls need to allow for sub-classing
+                json = OpenLayers.Format.JSON.prototype.write.apply(this,
+                                                    [array[i], this.pretty]);
+                if(json != null) {
+                    if(i > 0) {
+                        pieces.push(',');
+                    }
+                    pieces.push(this.writeNewline(), this.writeIndent(), json);
+                }
+            }
+
+            this.level -= 1;    
+            pieces.push(this.writeNewline(), this.writeIndent(), ']');
+            return pieces.join('');
+        },
+        
+        /**
+         * Method: serialize.string
+         * Transform a string into a JSON string.
+         *
+         * Parameters:
+         * string - {String} The string to be serialized
+         * 
+         * Returns:
+         * {String} A JSON string representing the string.
+         */
+        'string': function(string) {
+            // If the string contains no control characters, no quote characters, and no
+            // backslash characters, then we can simply slap some quotes around it.
+            // Otherwise we must also replace the offending characters with safe
+            // sequences.    
+            var m = {
+                '\b': '\\b',
+                '\t': '\\t',
+                '\n': '\\n',
+                '\f': '\\f',
+                '\r': '\\r',
+                '"' : '\\"',
+                '\\': '\\\\'
+            };
+            if(/["\\\x00-\x1f]/.test(string)) {
+                return '"' + string.replace(/([\x00-\x1f\\"])/g, function(a, b) {
+                    var c = m[b];
+                    if(c) {
+                        return c;
+                    }
+                    c = b.charCodeAt();
+                    return '\\u00' +
+                        Math.floor(c / 16).toString(16) +
+                        (c % 16).toString(16);
+                }) + '"';
+            }
+            return '"' + string + '"';
+        },
+
+        /**
+         * Method: serialize.number
+         * Transform a number into a JSON string.
+         *
+         * Parameters:
+         * number - {Number} The number to be serialized.
+         *
+         * Returns:
+         * {String} A JSON string representing the number.
+         */
+        'number': function(number) {
+            return isFinite(number) ? String(number) : "null";
+        },
+        
+        /**
+         * Method: serialize.boolean
+         * Transform a boolean into a JSON string.
+         *
+         * Parameters:
+         * bool - {Boolean} The boolean to be serialized.
+         * 
+         * Returns:
+         * {String} A JSON string representing the boolean.
+         */
+        'boolean': function(bool) {
+            return String(bool);
+        },
+        
+        /**
+         * Method: serialize.object
+         * Transform a date into a JSON string.
+         *
+         * Parameters:
+         * date - {Date} The date to be serialized.
+         * 
+         * Returns:
+         * {String} A JSON string representing the date.
+         */
+        'date': function(date) {    
+            function format(number) {
+                // Format integers to have at least two digits.
+                return (number < 10) ? '0' + number : number;
+            }
+            return '"' + date.getFullYear() + '-' +
+                    format(date.getMonth() + 1) + '-' +
+                    format(date.getDate()) + 'T' +
+                    format(date.getHours()) + ':' +
+                    format(date.getMinutes()) + ':' +
+                    format(date.getSeconds()) + '"';
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Format.JSON" 
+
+});     
diff --git a/lib/OpenLayers/Format/KML.js b/lib/OpenLayers/Format/KML.js
new file mode 100644
index 0000000..811312e
--- /dev/null
+++ b/lib/OpenLayers/Format/KML.js
@@ -0,0 +1,1429 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Geometry/Point.js
+ * @requires OpenLayers/Geometry/LineString.js
+ * @requires OpenLayers/Geometry/Polygon.js
+ * @requires OpenLayers/Geometry/Collection.js
+ * @requires OpenLayers/Request/XMLHttpRequest.js
+ * @requires OpenLayers/Console.js
+ * @requires OpenLayers/Projection.js
+ */
+
+/**
+ * Class: OpenLayers.Format.KML
+ * Read/Write KML. Create a new instance with the <OpenLayers.Format.KML>
+ *     constructor. 
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.KML = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        kml: "http://www.opengis.net/kml/2.2",
+        gx: "http://www.google.com/kml/ext/2.2"
+    },
+
+    /**
+     * APIProperty: kmlns
+     * {String} KML Namespace to use. Defaults to 2.0 namespace.
+     */
+    kmlns: "http://earth.google.com/kml/2.0",
+    
+    /** 
+     * APIProperty: placemarksDesc
+     * {String} Name of the placemarks.  Default is "No description available".
+     */
+    placemarksDesc: "No description available",
+    
+    /** 
+     * APIProperty: foldersName
+     * {String} Name of the folders.  Default is "OpenLayers export".
+     *          If set to null, no name element will be created.
+     */
+    foldersName: "OpenLayers export",
+    
+    /** 
+     * APIProperty: foldersDesc
+     * {String} Description of the folders. Default is "Exported on [date]."
+     *          If set to null, no description element will be created.
+     */
+    foldersDesc: "Exported on " + new Date(),
+    
+    /**
+     * APIProperty: extractAttributes
+     * {Boolean} Extract attributes from KML.  Default is true.
+     *           Extracting styleUrls requires this to be set to true
+     */
+    extractAttributes: true,
+    
+    /**
+     * Property: extractStyles
+     * {Boolean} Extract styles from KML.  Default is false.
+     *           Extracting styleUrls also requires extractAttributes to be
+     *           set to true
+     */
+    extractStyles: false,
+    
+    /**
+     * APIProperty: extractTracks
+     * {Boolean} Extract gx:Track elements from Placemark elements.  Default
+     *     is false.  If true, features will be generated for all points in
+     *     all gx:Track elements.  Features will have a when (Date) attribute
+     *     based on when elements in the track.  If tracks include angle
+     *     elements, features will have heading, tilt, and roll attributes.
+     *     If track point coordinates have three values, features will have
+     *     an altitude attribute with the third coordinate value.
+     */
+    extractTracks: false,
+    
+    /**
+     * APIProperty: trackAttributes
+     * {Array} If <extractTracks> is true, points within gx:Track elements will 
+     *     be parsed as features with when, heading, tilt, and roll attributes.
+     *     Any additional attribute names can be provided in <trackAttributes>.
+     */
+    trackAttributes: null,
+    
+    /**
+     * Property: internalns
+     * {String} KML Namespace to use -- defaults to the namespace of the
+     *     Placemark node being parsed, but falls back to kmlns. 
+     */
+    internalns: null,
+
+    /**
+     * Property: features
+     * {Array} Array of features
+     *     
+     */
+    features: null,
+
+    /**
+     * Property: styles
+     * {Object} Storage of style objects
+     *     
+     */
+    styles: null,
+    
+    /**
+     * Property: styleBaseUrl
+     * {String}
+     */
+    styleBaseUrl: "",
+
+    /**
+     * Property: fetched
+     * {Object} Storage of KML URLs that have been fetched before
+     *     in order to prevent reloading them.
+     */
+    fetched: null,
+
+    /**
+     * APIProperty: maxDepth
+     * {Integer} Maximum depth for recursive loading external KML URLs 
+     *           Defaults to 0: do no external fetching
+     */
+    maxDepth: 0,
+
+    /**
+     * Constructor: OpenLayers.Format.KML
+     * Create a new parser for KML.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        // compile regular expressions once instead of every time they are used
+        this.regExes = {
+            trimSpace: (/^\s*|\s*$/g),
+            removeSpace: (/\s*/g),
+            splitSpace: (/\s+/),
+            trimComma: (/\s*,\s*/g),
+            kmlColor: (/(\w{2})(\w{2})(\w{2})(\w{2})/),
+            kmlIconPalette: (/root:\/\/icons\/palette-(\d+)(\.\w+)/),
+            straightBracket: (/\$\[(.*?)\]/g)
+        };
+        // KML coordinates are always in longlat WGS84
+        this.externalProjection = new OpenLayers.Projection("EPSG:4326");
+
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Read data from a string, and return a list of features. 
+     * 
+     * Parameters: 
+     * data    - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Feature.Vector>)} List of features.
+     */
+    read: function(data) {
+        this.features = [];
+        this.styles   = {};
+        this.fetched  = {};
+
+        // Set default options 
+        var options = {
+            depth: 0,
+            styleBaseUrl: this.styleBaseUrl
+        };
+
+        return this.parseData(data, options);
+    },
+
+    /**
+     * Method: parseData
+     * Read data from a string, and return a list of features. 
+     * 
+     * Parameters: 
+     * data    - {String} or {DOMElement} data to read/parse.
+     * options - {Object} Hash of options
+     *
+     * Returns:
+     * {Array(<OpenLayers.Feature.Vector>)} List of features.
+     */
+    parseData: function(data, options) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+
+        // Loop throught the following node types in this order and
+        // process the nodes found 
+        var types = ["Link", "NetworkLink", "Style", "StyleMap", "Placemark"];
+        for(var i=0, len=types.length; i<len; ++i) {
+            var type = types[i];
+
+            var nodes = this.getElementsByTagNameNS(data, "*", type);
+
+            // skip to next type if no nodes are found
+            if(nodes.length == 0) { 
+                continue;
+            }
+
+            switch (type.toLowerCase()) {
+
+                // Fetch external links 
+                case "link":
+                case "networklink":
+                    this.parseLinks(nodes, options);
+                    break;
+
+                // parse style information
+                case "style":
+                    if (this.extractStyles) {
+                        this.parseStyles(nodes, options);
+                    }
+                    break;
+                case "stylemap":
+                    if (this.extractStyles) {
+                        this.parseStyleMaps(nodes, options);
+                    }
+                    break;
+
+                // parse features
+                case "placemark":
+                    this.parseFeatures(nodes, options);
+                    break;
+            }
+        }
+        
+        return this.features;
+    },
+
+    /**
+     * Method: parseLinks
+     * Finds URLs of linked KML documents and fetches them
+     * 
+     * Parameters: 
+     * nodes   - {Array} of {DOMElement} data to read/parse.
+     * options - {Object} Hash of options
+     * 
+     */
+    parseLinks: function(nodes, options) {
+        
+        // Fetch external links <NetworkLink> and <Link>
+        // Don't do anything if we have reached our maximum depth for recursion
+        if (options.depth >= this.maxDepth) {
+            return false;
+        }
+
+        // increase depth
+        var newOptions = OpenLayers.Util.extend({}, options);
+        newOptions.depth++;
+
+        for(var i=0, len=nodes.length; i<len; i++) {
+            var href = this.parseProperty(nodes[i], "*", "href");
+            if(href && !this.fetched[href]) {
+                this.fetched[href] = true; // prevent reloading the same urls
+                var data = this.fetchLink(href);
+                if (data) {
+                    this.parseData(data, newOptions);
+                }
+            } 
+        }
+
+    },
+
+    /**
+     * Method: fetchLink
+     * Fetches a URL and returns the result
+     * 
+     * Parameters: 
+     * href  - {String} url to be fetched
+     * 
+     */
+    fetchLink: function(href) {
+        var request = OpenLayers.Request.GET({url: href, async: false});
+        if (request) {
+            return request.responseText;
+        }
+    },
+
+    /**
+     * Method: parseStyles
+     * Looks for <Style> nodes in the data and parses them
+     * Also parses <StyleMap> nodes, but only uses the 'normal' key
+     * 
+     * Parameters: 
+     * nodes    - {Array} of {DOMElement} data to read/parse.
+     * options  - {Object} Hash of options
+     * 
+     */
+    parseStyles: function(nodes, options) {
+        for(var i=0, len=nodes.length; i<len; i++) {
+            var style = this.parseStyle(nodes[i]);
+            if(style) {
+                var styleName = (options.styleBaseUrl || "") + "#" + style.id;
+                
+                this.styles[styleName] = style;
+            }
+        }
+    },
+
+    /**
+     * Method: parseKmlColor
+     * Parses a kml color (in 'aabbggrr' format) and returns the corresponding 
+     * color and opacity or null if the color is invalid.
+     *
+     * Parameters: 
+     * kmlColor - {String} a kml formated color
+     *
+     * Returns:
+     * {Object}
+     */
+    parseKmlColor: function(kmlColor) {
+        var color = null;
+        if (kmlColor) {
+            var matches = kmlColor.match(this.regExes.kmlColor);
+            if (matches) {
+                color = {
+                    color: '#' + matches[4] + matches[3] + matches[2],
+                    opacity: parseInt(matches[1], 16) / 255
+                };
+            }
+        }
+        return color;
+    },
+
+    /**
+     * Method: parseStyle
+     * Parses the children of a <Style> node and builds the style hash
+     * accordingly
+     * 
+     * Parameters: 
+     * node - {DOMElement} <Style> node
+     * 
+     */
+    parseStyle: function(node) {
+        var style = {};
+        
+        var types = ["LineStyle", "PolyStyle", "IconStyle", "BalloonStyle", 
+                     "LabelStyle"];
+        var type, nodeList, geometry, parser;
+        for(var i=0, len=types.length; i<len; ++i) {
+            type = types[i];
+            styleTypeNode = this.getElementsByTagNameNS(node, 
+                                                   "*", type)[0];
+            if(!styleTypeNode) { 
+                continue;
+            }
+
+            // only deal with first geometry of this type
+            switch (type.toLowerCase()) {
+                case "linestyle":
+                    var kmlColor = this.parseProperty(styleTypeNode, "*", "color");
+                    var color = this.parseKmlColor(kmlColor);
+                    if (color) {
+                        style["strokeColor"] = color.color;
+                        style["strokeOpacity"] = color.opacity;
+                    }
+                    
+                    var width = this.parseProperty(styleTypeNode, "*", "width");
+                    if (width) {
+                        style["strokeWidth"] = width;
+                    }
+                    break;
+
+                case "polystyle":
+                    var kmlColor = this.parseProperty(styleTypeNode, "*", "color");
+                    var color = this.parseKmlColor(kmlColor);
+                    if (color) {
+                        style["fillOpacity"] = color.opacity;
+                        style["fillColor"] = color.color;
+                    }
+                    // Check if fill is disabled
+                    var fill = this.parseProperty(styleTypeNode, "*", "fill");
+                    if (fill == "0") {
+                        style["fillColor"] = "none";
+                    }
+                    // Check if outline is disabled
+                    var outline = this.parseProperty(styleTypeNode, "*", "outline");
+                    if (outline == "0") {
+                        style["strokeWidth"] = "0";
+                    }
+                   
+                    break;
+
+                case "iconstyle":
+                    // set scale
+                    var scale = parseFloat(this.parseProperty(styleTypeNode, 
+                                                          "*", "scale") || 1);
+  
+                    // set default width and height of icon
+                    var width = 32 * scale;
+                    var height = 32 * scale;
+
+                    var iconNode = this.getElementsByTagNameNS(styleTypeNode, 
+                                               "*", 
+                                               "Icon")[0];
+                    if (iconNode) {
+                        var href = this.parseProperty(iconNode, "*", "href");
+                        if (href) {                                                   
+
+                            var w = this.parseProperty(iconNode, "*", "w");
+                            var h = this.parseProperty(iconNode, "*", "h");
+
+                            // Settings for Google specific icons that are 64x64
+                            // We set the width and height to 64 and halve the
+                            // scale to prevent icons from being too big
+                            var google = "http://maps.google.com/mapfiles/kml";
+                            if (OpenLayers.String.startsWith(
+                                                 href, google) && !w && !h) {
+                                w = 64;
+                                h = 64;
+                                scale = scale / 2;
+                            }
+                                
+                            // if only dimension is defined, make sure the
+                            // other one has the same value
+                            w = w || h;
+                            h = h || w;
+
+                            if (w) {
+                                width = parseInt(w) * scale;
+                            }
+
+                            if (h) {
+                                height = parseInt(h) * scale;
+                            }
+
+                            // support for internal icons 
+                            //    (/root://icons/palette-x.png)
+                            // x and y tell the position on the palette:
+                            // - in pixels
+                            // - starting from the left bottom
+                            // We translate that to a position in the list 
+                            // and request the appropriate icon from the 
+                            // google maps website
+                            var matches = href.match(this.regExes.kmlIconPalette);
+                            if (matches)  {
+                                var palette = matches[1];
+                                var file_extension = matches[2];
+
+                                var x = this.parseProperty(iconNode, "*", "x");
+                                var y = this.parseProperty(iconNode, "*", "y");
+
+                                var posX = x ? x/32 : 0;
+                                var posY = y ? (7 - y/32) : 7;
+
+                                var pos = posY * 8 + posX;
+                                href = "http://maps.google.com/mapfiles/kml/pal" 
+                                     + palette + "/icon" + pos + file_extension;
+                            }
+
+                            style["graphicOpacity"] = 1; // fully opaque
+                            style["externalGraphic"] = href;
+                        }
+
+                    }
+
+
+                    // hotSpots define the offset for an Icon
+                    var hotSpotNode = this.getElementsByTagNameNS(styleTypeNode, 
+                                               "*", 
+                                               "hotSpot")[0];
+                    if (hotSpotNode) {
+                        var x = parseFloat(hotSpotNode.getAttribute("x"));
+                        var y = parseFloat(hotSpotNode.getAttribute("y"));
+
+                        var xUnits = hotSpotNode.getAttribute("xunits");
+                        if (xUnits == "pixels") {
+                            style["graphicXOffset"] = -x * scale;
+                        }
+                        else if (xUnits == "insetPixels") {
+                            style["graphicXOffset"] = -width + (x * scale);
+                        }
+                        else if (xUnits == "fraction") {
+                            style["graphicXOffset"] = -width * x;
+                        }
+
+                        var yUnits = hotSpotNode.getAttribute("yunits");
+                        if (yUnits == "pixels") {
+                            style["graphicYOffset"] = -height + (y * scale) + 1;
+                        }
+                        else if (yUnits == "insetPixels") {
+                            style["graphicYOffset"] = -(y * scale) + 1;
+                        }
+                        else if (yUnits == "fraction") {
+                            style["graphicYOffset"] =  -height * (1 - y) + 1;
+                        }
+                    }
+
+                    style["graphicWidth"] = width;
+                    style["graphicHeight"] = height;
+                    break;
+
+                case "balloonstyle":
+                    var balloonStyle = OpenLayers.Util.getXmlNodeValue(
+                                            styleTypeNode);
+                    if (balloonStyle) {
+                        style["balloonStyle"] = balloonStyle.replace(
+                                       this.regExes.straightBracket, "${$1}");
+                    }
+                    break;
+                case "labelstyle":
+                    var kmlColor = this.parseProperty(styleTypeNode, "*", "color");
+                    var color = this.parseKmlColor(kmlColor);
+                    if (color) {
+                        style["fontColor"] = color.color;
+                        style["fontOpacity"] = color.opacity;
+                    }
+                    break;
+
+                default:
+            }
+        }
+
+        // Some polygons have no line color, so we use the fillColor for that
+        if (!style["strokeColor"] && style["fillColor"]) {
+            style["strokeColor"] = style["fillColor"];
+        }
+
+        var id = node.getAttribute("id");
+        if (id && style) {
+            style.id = id;
+        }
+
+        return style;
+    },
+
+    /**
+     * Method: parseStyleMaps
+     * Looks for <Style> nodes in the data and parses them
+     * Also parses <StyleMap> nodes, but only uses the 'normal' key
+     * 
+     * Parameters: 
+     * nodes    - {Array} of {DOMElement} data to read/parse.
+     * options  - {Object} Hash of options
+     * 
+     */
+    parseStyleMaps: function(nodes, options) {
+        // Only the default or "normal" part of the StyleMap is processed now
+        // To do the select or "highlight" bit, we'd need to change lots more
+
+        for(var i=0, len=nodes.length; i<len; i++) {
+            var node = nodes[i];
+            var pairs = this.getElementsByTagNameNS(node, "*", 
+                            "Pair");
+
+            var id = node.getAttribute("id");
+            for (var j=0, jlen=pairs.length; j<jlen; j++) {
+                var pair = pairs[j];
+                // Use the shortcut in the SLD format to quickly retrieve the 
+                // value of a node. Maybe it's good to have a method in 
+                // Format.XML to do this
+                var key = this.parseProperty(pair, "*", "key");
+                var styleUrl = this.parseProperty(pair, "*", "styleUrl");
+
+                if (styleUrl && key == "normal") {
+                    this.styles[(options.styleBaseUrl || "") + "#" + id] =
+                        this.styles[(options.styleBaseUrl || "") + styleUrl];
+                }
+
+                if (styleUrl && key == "highlight") {
+                    // TODO: implement the "select" part
+                }
+
+            }
+        }
+
+    },
+
+
+    /**
+     * Method: parseFeatures
+     * Loop through all Placemark nodes and parse them.
+     * Will create a list of features
+     * 
+     * Parameters: 
+     * nodes    - {Array} of {DOMElement} data to read/parse.
+     * options  - {Object} Hash of options
+     * 
+     */
+    parseFeatures: function(nodes, options) {
+        var features = [];
+        for(var i=0, len=nodes.length; i<len; i++) {
+            var featureNode = nodes[i];
+            var feature = this.parseFeature.apply(this,[featureNode]) ;
+            if(feature) {
+
+                // Create reference to styleUrl 
+                if (this.extractStyles && feature.attributes &&
+                    feature.attributes.styleUrl) {
+                    feature.style = this.getStyle(feature.attributes.styleUrl, options);
+                }
+
+                if (this.extractStyles) {
+                    // Make sure that <Style> nodes within a placemark are 
+                    // processed as well
+                    var inlineStyleNode = this.getElementsByTagNameNS(featureNode,
+                                                        "*",
+                                                        "Style")[0];
+                    if (inlineStyleNode) {
+                        var inlineStyle= this.parseStyle(inlineStyleNode);
+                        if (inlineStyle) {
+                            feature.style = OpenLayers.Util.extend(
+                                feature.style, inlineStyle
+                            );
+                        }
+                    }
+                }
+
+                // check if gx:Track elements should be parsed
+                if (this.extractTracks) {
+                    var tracks = this.getElementsByTagNameNS(
+                        featureNode, this.namespaces.gx, "Track"
+                    );
+                    if (tracks && tracks.length > 0) {
+                        var track = tracks[0];
+                        var container = {
+                            features: [],
+                            feature: feature
+                        };
+                        this.readNode(track, container);
+                        if (container.features.length > 0) {
+                            features.push.apply(features, container.features);
+                        }
+                    }
+                } else {
+                    // add feature to list of features
+                    features.push(feature);                    
+                }
+            } else {
+                throw "Bad Placemark: " + i;
+            }
+        }
+
+        // add new features to existing feature list
+        this.features = this.features.concat(features);
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "kml": {
+            "when": function(node, container) {
+                container.whens.push(OpenLayers.Date.parse(
+                    this.getChildValue(node)
+                ));
+            },
+            "_trackPointAttribute": function(node, container) {
+                var name = node.nodeName.split(":").pop();
+                container.attributes[name].push(this.getChildValue(node));
+            }
+        },
+        "gx": {
+            "Track": function(node, container) {
+                var obj = {
+                    whens: [],
+                    points: [],
+                    angles: []
+                };
+                if (this.trackAttributes) {
+                    var name;
+                    obj.attributes = {};
+                    for (var i=0, ii=this.trackAttributes.length; i<ii; ++i) {
+                        name = this.trackAttributes[i];
+                        obj.attributes[name] = [];
+                        if (!(name in this.readers.kml)) {
+                            this.readers.kml[name] = this.readers.kml._trackPointAttribute;
+                        }
+                    }
+                }
+                this.readChildNodes(node, obj);
+                if (obj.whens.length !== obj.points.length) {
+                    throw new Error("gx:Track with unequal number of when (" + obj.whens.length + ") and gx:coord (" + obj.points.length + ") elements.");
+                }
+                var hasAngles = obj.angles.length > 0;
+                if (hasAngles && obj.whens.length !== obj.angles.length) {
+                    throw new Error("gx:Track with unequal number of when (" + obj.whens.length + ") and gx:angles (" + obj.angles.length + ") elements.");
+                }
+                var feature, point, angles;
+                for (var i=0, ii=obj.whens.length; i<ii; ++i) {
+                    feature = container.feature.clone();
+                    feature.fid = container.feature.fid || container.feature.id;
+                    point = obj.points[i];
+                    feature.geometry = point;
+                    if ("z" in point) {
+                        feature.attributes.altitude = point.z;
+                    }
+                    if (this.internalProjection && this.externalProjection) {
+                        feature.geometry.transform(
+                            this.externalProjection, this.internalProjection
+                        ); 
+                    }
+                    if (this.trackAttributes) {
+                        for (var j=0, jj=this.trackAttributes.length; j<jj; ++j) {
+                            feature.attributes[name] = obj.attributes[this.trackAttributes[j]][i];
+                        }
+                    }
+                    feature.attributes.when = obj.whens[i];
+                    feature.attributes.trackId = container.feature.id;
+                    if (hasAngles) {
+                        angles = obj.angles[i];
+                        feature.attributes.heading = parseFloat(angles[0]);
+                        feature.attributes.tilt = parseFloat(angles[1]);
+                        feature.attributes.roll = parseFloat(angles[2]);
+                    }
+                    container.features.push(feature);
+                }
+            },
+            "coord": function(node, container) {
+                var str = this.getChildValue(node);
+                var coords = str.replace(this.regExes.trimSpace, "").split(/\s+/);
+                var point = new OpenLayers.Geometry.Point(coords[0], coords[1]);
+                if (coords.length > 2) {
+                    point.z = parseFloat(coords[2]);
+                }
+                container.points.push(point);
+            },
+            "angles": function(node, container) {
+                var str = this.getChildValue(node);
+                var parts = str.replace(this.regExes.trimSpace, "").split(/\s+/);
+                container.angles.push(parts);
+            }
+        }
+    },
+    
+    /**
+     * Method: parseFeature
+     * This function is the core of the KML 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}
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>} A vector feature.
+     */
+    parseFeature: function(node) {
+        // only accept one geometry per feature - look for highest "order"
+        var order = ["MultiGeometry", "Polygon", "LineString", "Point"];
+        var type, nodeList, geometry, parser;
+        for(var i=0, len=order.length; i<len; ++i) {
+            type = order[i];
+            this.internalns = node.namespaceURI ? 
+                    node.namespaceURI : this.kmlns;
+            nodeList = this.getElementsByTagNameNS(node, 
+                                                   this.internalns, type);
+            if(nodeList.length > 0) {
+                // only deal with first geometry of this type
+                var parser = this.parseGeometry[type.toLowerCase()];
+                if(parser) {
+                    geometry = parser.apply(this, [nodeList[0]]);
+                    if (this.internalProjection && this.externalProjection) {
+                        geometry.transform(this.externalProjection, 
+                                           this.internalProjection); 
+                    }                       
+                } else {
+                    OpenLayers.Console.error(OpenLayers.i18n(
+                                "unsupportedGeometryType", {'geomType':type}));
+                }
+                // stop looking for different geometry types
+                break;
+            }
+        }
+
+        // construct feature (optionally with attributes)
+        var attributes;
+        if(this.extractAttributes) {
+            attributes = this.parseAttributes(node);
+        }
+        var feature = new OpenLayers.Feature.Vector(geometry, attributes);
+
+        var fid = node.getAttribute("id") || node.getAttribute("name");
+        if(fid != null) {
+            feature.fid = fid;
+        }
+
+        return feature;
+    },        
+    
+    /**
+     * Method: getStyle
+     * Retrieves a style from a style hash using styleUrl as the key
+     * If the styleUrl doesn't exist yet, we try to fetch it 
+     * Internet
+     * 
+     * Parameters: 
+     * styleUrl  - {String} URL of style
+     * options   - {Object} Hash of options 
+     *
+     * Returns:
+     * {Object}  - (reference to) Style hash
+     */
+    getStyle: function(styleUrl, options) {
+
+        var styleBaseUrl = OpenLayers.Util.removeTail(styleUrl);
+
+        var newOptions = OpenLayers.Util.extend({}, options);
+        newOptions.depth++;
+        newOptions.styleBaseUrl = styleBaseUrl;
+
+        // Fetch remote Style URLs (if not fetched before) 
+        if (!this.styles[styleUrl] 
+                && !OpenLayers.String.startsWith(styleUrl, "#") 
+                && newOptions.depth <= this.maxDepth
+                && !this.fetched[styleBaseUrl] ) {
+
+            var data = this.fetchLink(styleBaseUrl);
+            if (data) {
+                this.parseData(data, newOptions);
+            }
+
+        }
+
+        // return requested style
+        var style = OpenLayers.Util.extend({}, this.styles[styleUrl]);
+        return style;
+    },
+    
+    /**
+     * Property: parseGeometry
+     * Properties of this object are the functions that parse geometries based
+     *     on their type.
+     */
+    parseGeometry: {
+        
+        /**
+         * Method: parseGeometry.point
+         * Given a KML node representing a point geometry, create an OpenLayers
+         *     point geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A KML Point node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.Point>} A point geometry.
+         */
+        point: function(node) {
+            var nodeList = this.getElementsByTagNameNS(node, this.internalns,
+                                                       "coordinates");
+            var coords = [];
+            if(nodeList.length > 0) {
+                var coordString = nodeList[0].firstChild.nodeValue;
+                coordString = coordString.replace(this.regExes.removeSpace, "");
+                coords = coordString.split(",");
+            }
+
+            var point = null;
+            if(coords.length > 1) {
+                // preserve third dimension
+                if(coords.length == 2) {
+                    coords[2] = null;
+                }
+                point = new OpenLayers.Geometry.Point(coords[0], coords[1],
+                                                      coords[2]);
+            } else {
+                throw "Bad coordinate string: " + coordString;
+            }
+            return point;
+        },
+        
+        /**
+         * Method: parseGeometry.linestring
+         * Given a KML node representing a linestring geometry, create an
+         *     OpenLayers linestring geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A KML LineString node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.LineString>} A linestring geometry.
+         */
+        linestring: function(node, ring) {
+            var nodeList = this.getElementsByTagNameNS(node, this.internalns,
+                                                       "coordinates");
+            var line = null;
+            if(nodeList.length > 0) {
+                var coordString = this.getChildValue(nodeList[0]);
+
+                coordString = coordString.replace(this.regExes.trimSpace,
+                                                  "");
+                coordString = coordString.replace(this.regExes.trimComma,
+                                                  ",");
+                var pointList = coordString.split(this.regExes.splitSpace);
+                var numPoints = pointList.length;
+                var points = new Array(numPoints);
+                var coords, numCoords;
+                for(var i=0; i<numPoints; ++i) {
+                    coords = pointList[i].split(",");
+                    numCoords = coords.length;
+                    if(numCoords > 1) {
+                        if(coords.length == 2) {
+                            coords[2] = null;
+                        }
+                        points[i] = new OpenLayers.Geometry.Point(coords[0],
+                                                                  coords[1],
+                                                                  coords[2]);
+                    } else {
+                        throw "Bad LineString point coordinates: " +
+                              pointList[i];
+                    }
+                }
+                if(numPoints) {
+                    if(ring) {
+                        line = new OpenLayers.Geometry.LinearRing(points);
+                    } else {
+                        line = new OpenLayers.Geometry.LineString(points);
+                    }
+                } else {
+                    throw "Bad LineString coordinates: " + coordString;
+                }
+            }
+
+            return line;
+        },
+        
+        /**
+         * Method: parseGeometry.polygon
+         * Given a KML node representing a polygon geometry, create an
+         *     OpenLayers polygon geometry.
+         *
+         * Parameters:
+         * node - {DOMElement} A KML Polygon node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.Polygon>} A polygon geometry.
+         */
+        polygon: function(node) {
+            var nodeList = this.getElementsByTagNameNS(node, this.internalns,
+                                                       "LinearRing");
+            var numRings = nodeList.length;
+            var components = new Array(numRings);
+            if(numRings > 0) {
+                // this assumes exterior ring first, inner rings after
+                var ring;
+                for(var i=0, len=nodeList.length; i<len; ++i) {
+                    ring = this.parseGeometry.linestring.apply(this,
+                                                        [nodeList[i], true]);
+                    if(ring) {
+                        components[i] = ring;
+                    } else {
+                        throw "Bad LinearRing geometry: " + i;
+                    }
+                }
+            }
+            return new OpenLayers.Geometry.Polygon(components);
+        },
+        
+        /**
+         * Method: parseGeometry.multigeometry
+         * Given a KML node representing a multigeometry, create an
+         *     OpenLayers geometry collection.
+         *
+         * Parameters:
+         * node - {DOMElement} A KML MultiGeometry node.
+         *
+         * Returns:
+         * {<OpenLayers.Geometry.Collection>} A geometry collection.
+         */
+        multigeometry: function(node) {
+            var child, parser;
+            var parts = [];
+            var children = node.childNodes;
+            for(var i=0, len=children.length; i<len; ++i ) {
+                child = children[i];
+                if(child.nodeType == 1) {
+                    var type = (child.prefix) ?
+                            child.nodeName.split(":")[1] :
+                            child.nodeName;
+                    var parser = this.parseGeometry[type.toLowerCase()];
+                    if(parser) {
+                        parts.push(parser.apply(this, [child]));
+                    }
+                }
+            }
+            return new OpenLayers.Geometry.Collection(parts);
+        }
+        
+    },
+
+    /**
+     * Method: parseAttributes
+     *
+     * Parameters:
+     * node - {DOMElement}
+     *
+     * Returns:
+     * {Object} An attributes object.
+     */
+    parseAttributes: function(node) {
+        var attributes = {};
+       
+        // Extended Data is parsed first.
+        var edNodes = node.getElementsByTagName("ExtendedData");
+        if (edNodes.length) {
+            attributes = this.parseExtendedData(edNodes[0]);
+        }
+        
+        // assume attribute nodes are type 1 children with a type 3 or 4 child
+        var child, grandchildren, grandchild;
+        var children = node.childNodes;
+
+        for(var i=0, len=children.length; i<len; ++i) {
+            child = children[i];
+            if(child.nodeType == 1) {
+                grandchildren = child.childNodes;
+                if(grandchildren.length >= 1 && grandchildren.length <= 3) {
+                    var grandchild;
+                    switch (grandchildren.length) {
+                        case 1:
+                            grandchild = grandchildren[0];
+                            break;
+                        case 2:
+                            var c1 = grandchildren[0];
+                            var c2 = grandchildren[1];
+                            grandchild = (c1.nodeType == 3 || c1.nodeType == 4) ?
+                                c1 : c2;
+                            break;
+                        case 3:
+                        default:
+                            grandchild = grandchildren[1];
+                            break;
+                    }
+                    if(grandchild.nodeType == 3 || grandchild.nodeType == 4) {
+                        var name = (child.prefix) ?
+                                child.nodeName.split(":")[1] :
+                                child.nodeName;
+                        var value = OpenLayers.Util.getXmlNodeValue(grandchild);
+                        if (value) {
+                            value = value.replace(this.regExes.trimSpace, "");
+                            attributes[name] = value;
+                        }
+                    }
+                } 
+            }
+        }
+        return attributes;
+    },
+
+    /**
+     * Method: parseExtendedData
+     * Parse ExtendedData from KML. Limited support for schemas/datatypes.
+     *     See http://code.google.com/apis/kml/documentation/kmlreference.html#extendeddata
+     *     for more information on extendeddata.
+     */
+    parseExtendedData: function(node) {
+        var attributes = {};
+        var i, len, data, key;
+        var dataNodes = node.getElementsByTagName("Data");
+        for (i = 0, len = dataNodes.length; i < len; i++) {
+            data = dataNodes[i];
+            key = data.getAttribute("name");
+            var ed = {};
+            var valueNode = data.getElementsByTagName("value");
+            if (valueNode.length) {
+                ed['value'] = this.getChildValue(valueNode[0]);
+            }    
+            var nameNode = data.getElementsByTagName("displayName");
+            if (nameNode.length) {
+                ed['displayName'] = this.getChildValue(nameNode[0]);
+            }
+            attributes[key] = ed;
+        }
+        var simpleDataNodes = node.getElementsByTagName("SimpleData");
+        for (i = 0, len = simpleDataNodes.length; i < len; i++) {
+            var ed = {};
+            data = simpleDataNodes[i];
+            key = data.getAttribute("name");
+            ed['value'] = this.getChildValue(data);
+            ed['displayName'] = key;
+            attributes[key] = ed;
+        }
+        
+        return attributes;    
+    },
+    
+    /**
+     * Method: parseProperty
+     * Convenience method to find a node and return its value
+     *
+     * Parameters:
+     * xmlNode    - {<DOMElement>}
+     * namespace  - {String} namespace of the node to find
+     * tagName    - {String} name of the property to parse
+     * 
+     * Returns:
+     * {String} The value for the requested property (defaults to null)
+     */    
+    parseProperty: function(xmlNode, namespace, tagName) {
+        var value;
+        var nodeList = this.getElementsByTagNameNS(xmlNode, namespace, tagName);
+        try {
+            value = OpenLayers.Util.getXmlNodeValue(nodeList[0]);
+        } catch(e) {
+            value = null;
+        }
+     
+        return value;
+    },                                                              
+
+    /**
+     * APIMethod: write
+     * Accept Feature Collection, and return a string. 
+     * 
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>} An array of features.
+     *
+     * Returns:
+     * {String} A KML string.
+     */
+    write: function(features) {
+        if(!(features instanceof Array)) {
+            features = [features];
+        }
+        var kml = this.createElementNS(this.kmlns, "kml");
+        var folder = this.createFolderXML();
+        for(var i=0, len=features.length; i<len; ++i) {
+            folder.appendChild(this.createPlacemarkXML(features[i]));
+        }
+        kml.appendChild(folder);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [kml]);
+    },
+
+    /**
+     * Method: createFolderXML
+     * Creates and returns a KML folder node
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    createFolderXML: function() {
+        // Folder
+        var folder = this.createElementNS(this.kmlns, "Folder");
+
+        // Folder name
+        if (this.foldersName) {
+            var folderName = this.createElementNS(this.kmlns, "name");
+            var folderNameText = this.createTextNode(this.foldersName); 
+            folderName.appendChild(folderNameText);
+            folder.appendChild(folderName);
+        }
+
+        // Folder description
+        if (this.foldersDesc) {
+            var folderDesc = this.createElementNS(this.kmlns, "description");        
+            var folderDescText = this.createTextNode(this.foldersDesc); 
+            folderDesc.appendChild(folderDescText);
+            folder.appendChild(folderDesc);
+        }
+
+        return folder;
+    },
+
+    /**
+     * Method: createPlacemarkXML
+     * Creates and returns a KML placemark node representing the given feature. 
+     * 
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    createPlacemarkXML: function(feature) {        
+        // Placemark name
+        var placemarkName = this.createElementNS(this.kmlns, "name");
+        var name = feature.style && feature.style.label ? feature.style.label :
+                   feature.attributes.name || feature.id;
+        placemarkName.appendChild(this.createTextNode(name));
+
+        // Placemark description
+        var placemarkDesc = this.createElementNS(this.kmlns, "description");
+        var desc = feature.attributes.description || this.placemarksDesc;
+        placemarkDesc.appendChild(this.createTextNode(desc));
+        
+        // Placemark
+        var placemarkNode = this.createElementNS(this.kmlns, "Placemark");
+        if(feature.fid != null) {
+            placemarkNode.setAttribute("id", feature.fid);
+        }
+        placemarkNode.appendChild(placemarkName);
+        placemarkNode.appendChild(placemarkDesc);
+
+        // Geometry node (Point, LineString, etc. nodes)
+        var geometryNode = this.buildGeometryNode(feature.geometry);
+        placemarkNode.appendChild(geometryNode);        
+        
+        // TBD - deal with remaining (non name/description) attributes.
+        return placemarkNode;
+    },    
+
+    /**
+     * Method: buildGeometryNode
+     * Builds and returns a KML geometry node with the given geometry.
+     * 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    buildGeometryNode: function(geometry) {
+        if (this.internalProjection && this.externalProjection) {
+            geometry = geometry.clone();
+            geometry.transform(this.internalProjection, 
+                               this.externalProjection);
+        }                       
+        var className = geometry.CLASS_NAME;
+        var type = className.substring(className.lastIndexOf(".") + 1);
+        var builder = this.buildGeometry[type.toLowerCase()];
+        var node = null;
+        if(builder) {
+            node = builder.apply(this, [geometry]);
+        }
+        return node;
+    },
+
+    /**
+     * Property: buildGeometry
+     * Object containing methods to do the actual geometry node building
+     *     based on geometry type.
+     */
+    buildGeometry: {
+        // TBD: Anybody care about namespace aliases here (these nodes have
+        //    no prefixes)?
+
+        /**
+         * Method: buildGeometry.point
+         * Given an OpenLayers point geometry, create a KML point.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.Point>} A point geometry.
+         *
+         * Returns:
+         * {DOMElement} A KML point node.
+         */
+        point: function(geometry) {
+            var kml = this.createElementNS(this.kmlns, "Point");
+            kml.appendChild(this.buildCoordinatesNode(geometry));
+            return kml;
+        },
+        
+        /**
+         * Method: buildGeometry.multipoint
+         * Given an OpenLayers multipoint geometry, create a KML
+         *     GeometryCollection.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.Point>} A multipoint geometry.
+         *
+         * Returns:
+         * {DOMElement} A KML GeometryCollection node.
+         */
+        multipoint: function(geometry) {
+            return this.buildGeometry.collection.apply(this, [geometry]);
+        },
+
+        /**
+         * Method: buildGeometry.linestring
+         * Given an OpenLayers linestring geometry, create a KML linestring.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.LineString>} A linestring geometry.
+         *
+         * Returns:
+         * {DOMElement} A KML linestring node.
+         */
+        linestring: function(geometry) {
+            var kml = this.createElementNS(this.kmlns, "LineString");
+            kml.appendChild(this.buildCoordinatesNode(geometry));
+            return kml;
+        },
+        
+        /**
+         * Method: buildGeometry.multilinestring
+         * Given an OpenLayers multilinestring geometry, create a KML
+         *     GeometryCollection.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.Point>} A multilinestring geometry.
+         *
+         * Returns:
+         * {DOMElement} A KML GeometryCollection node.
+         */
+        multilinestring: function(geometry) {
+            return this.buildGeometry.collection.apply(this, [geometry]);
+        },
+
+        /**
+         * Method: buildGeometry.linearring
+         * Given an OpenLayers linearring geometry, create a KML linearring.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.LinearRing>} A linearring geometry.
+         *
+         * Returns:
+         * {DOMElement} A KML linearring node.
+         */
+        linearring: function(geometry) {
+            var kml = this.createElementNS(this.kmlns, "LinearRing");
+            kml.appendChild(this.buildCoordinatesNode(geometry));
+            return kml;
+        },
+        
+        /**
+         * Method: buildGeometry.polygon
+         * Given an OpenLayers polygon geometry, create a KML polygon.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.Polygon>} A polygon geometry.
+         *
+         * Returns:
+         * {DOMElement} A KML polygon node.
+         */
+        polygon: function(geometry) {
+            var kml = this.createElementNS(this.kmlns, "Polygon");
+            var rings = geometry.components;
+            var ringMember, ringGeom, type;
+            for(var i=0, len=rings.length; i<len; ++i) {
+                type = (i==0) ? "outerBoundaryIs" : "innerBoundaryIs";
+                ringMember = this.createElementNS(this.kmlns, type);
+                ringGeom = this.buildGeometry.linearring.apply(this,
+                                                               [rings[i]]);
+                ringMember.appendChild(ringGeom);
+                kml.appendChild(ringMember);
+            }
+            return kml;
+        },
+        
+        /**
+         * Method: buildGeometry.multipolygon
+         * Given an OpenLayers multipolygon geometry, create a KML
+         *     GeometryCollection.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.Point>} A multipolygon geometry.
+         *
+         * Returns:
+         * {DOMElement} A KML GeometryCollection node.
+         */
+        multipolygon: function(geometry) {
+            return this.buildGeometry.collection.apply(this, [geometry]);
+        },
+
+        /**
+         * Method: buildGeometry.collection
+         * Given an OpenLayers geometry collection, create a KML MultiGeometry.
+         *
+         * Parameters:
+         * geometry - {<OpenLayers.Geometry.Collection>} A geometry collection.
+         *
+         * Returns:
+         * {DOMElement} A KML MultiGeometry node.
+         */
+        collection: function(geometry) {
+            var kml = this.createElementNS(this.kmlns, "MultiGeometry");
+            var child;
+            for(var i=0, len=geometry.components.length; i<len; ++i) {
+                child = this.buildGeometryNode.apply(this,
+                                                     [geometry.components[i]]);
+                if(child) {
+                    kml.appendChild(child);
+                }
+            }
+            return kml;
+        }
+    },
+
+    /**
+     * Method: buildCoordinatesNode
+     * Builds and returns the KML coordinates node with the given geometry
+     * <coordinates>...</coordinates>
+     * 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * 
+     * Return:
+     * {DOMElement}
+     */     
+    buildCoordinatesNode: function(geometry) {
+        var coordinatesNode = this.createElementNS(this.kmlns, "coordinates");
+        
+        var path;
+        var points = geometry.components;
+        if(points) {
+            // LineString or LinearRing
+            var point;
+            var numPoints = points.length;
+            var parts = new Array(numPoints);
+            for(var i=0; i<numPoints; ++i) {
+                point = points[i];
+                parts[i] = point.x + "," + point.y;
+            }
+            path = parts.join(" ");
+        } else {
+            // Point
+            path = geometry.x + "," + geometry.y;
+        }
+        
+        var txtNode = this.createTextNode(path);
+        coordinatesNode.appendChild(txtNode);
+        
+        return coordinatesNode;
+    },    
+
+    CLASS_NAME: "OpenLayers.Format.KML" 
+});
diff --git a/lib/OpenLayers/Format/OSM.js b/lib/OpenLayers/Format/OSM.js
new file mode 100644
index 0000000..e53ec8e
--- /dev/null
+++ b/lib/OpenLayers/Format/OSM.js
@@ -0,0 +1,457 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Geometry/Point.js
+ * @requires OpenLayers/Geometry/LineString.js
+ * @requires OpenLayers/Geometry/Polygon.js
+ * @requires OpenLayers/Projection.js
+ */
+
+/**  
+ * Class: OpenLayers.Format.OSM
+ * OSM parser. Create a new instance with the 
+ *     <OpenLayers.Format.OSM> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.OSM = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * APIProperty: checkTags
+     * {Boolean} Should tags be checked to determine whether something
+     * should be treated as a seperate node. Will slow down parsing.
+     * Default is false.
+     */
+    checkTags: false,
+
+    /**
+     * Property: interestingTagsExclude
+     * {Array} List of tags to exclude from 'interesting' checks on nodes.
+     * Must be set when creating the format. Will only be used if checkTags
+     * is set.
+     */
+    interestingTagsExclude: null, 
+    
+    /**
+     * APIProperty: areaTags
+     * {Array} List of tags indicating that something is an area.  
+     * Must be set when creating the format. Will only be used if 
+     * checkTags is true.
+     */
+    areaTags: null, 
+    
+    /**
+     * Constructor: OpenLayers.Format.OSM
+     * Create a new parser for OSM.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        var layer_defaults = {
+          'interestingTagsExclude': ['source', 'source_ref', 
+              'source:ref', 'history', 'attribution', 'created_by'],
+          'areaTags': ['area', 'building', 'leisure', 'tourism', 'ruins',
+              'historic', 'landuse', 'military', 'natural', 'sport'] 
+        };
+          
+        layer_defaults = OpenLayers.Util.extend(layer_defaults, options);
+        
+        var interesting = {};
+        for (var i = 0; i < layer_defaults.interestingTagsExclude.length; i++) {
+            interesting[layer_defaults.interestingTagsExclude[i]] = true;
+        }
+        layer_defaults.interestingTagsExclude = interesting;
+        
+        var area = {};
+        for (var i = 0; i < layer_defaults.areaTags.length; i++) {
+            area[layer_defaults.areaTags[i]] = true;
+        }
+        layer_defaults.areaTags = area;
+
+        // OSM coordinates are always in longlat WGS84
+        this.externalProjection = new OpenLayers.Projection("EPSG:4326");
+        
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [layer_defaults]);
+    },
+    
+    /**
+     * APIMethod: read
+     * Return a list of features from a OSM doc
+     
+     * Parameters:
+     * data - {Element} 
+     *
+     * Returns:
+     * An Array of <OpenLayers.Feature.Vector>s
+     */
+    read: function(doc) {
+        if (typeof doc == "string") { 
+            doc = OpenLayers.Format.XML.prototype.read.apply(this, [doc]);
+        }
+
+        var nodes = this.getNodes(doc);
+        var ways = this.getWays(doc);
+        
+        // Geoms will contain at least ways.length entries.
+        var feat_list = new Array(ways.length);
+        
+        for (var i = 0; i < ways.length; i++) {
+            // We know the minimal of this one ahead of time. (Could be -1
+            // due to areas/polygons)
+            var point_list = new Array(ways[i].nodes.length);
+            
+            var poly = this.isWayArea(ways[i]) ? 1 : 0; 
+            for (var j = 0; j < ways[i].nodes.length; j++) {
+               var node = nodes[ways[i].nodes[j]];
+               
+               var point = new OpenLayers.Geometry.Point(node.lon, node.lat);
+               
+               // Since OSM is topological, we stash the node ID internally. 
+               point.osm_id = parseInt(ways[i].nodes[j]);
+               point_list[j] = point;
+               
+               // We don't display nodes if they're used inside other 
+               // elements.
+               node.used = true; 
+            }
+            var geometry = null;
+            if (poly) { 
+                geometry = new OpenLayers.Geometry.Polygon(
+                    new OpenLayers.Geometry.LinearRing(point_list));
+            } else {    
+                geometry = new OpenLayers.Geometry.LineString(point_list);
+            }
+            if (this.internalProjection && this.externalProjection) {
+                geometry.transform(this.externalProjection, 
+                    this.internalProjection);
+            }        
+            var feat = new OpenLayers.Feature.Vector(geometry,
+                ways[i].tags);
+            feat.osm_id = parseInt(ways[i].id);
+            feat.fid = "way." + feat.osm_id;
+            feat_list[i] = feat;
+        } 
+        for (var node_id in nodes) {
+            var node = nodes[node_id];
+            if (!node.used || this.checkTags) {
+                var tags = null;
+                
+                if (this.checkTags) {
+                    var result = this.getTags(node.node, true);
+                    if (node.used && !result[1]) {
+                        continue;
+                    }
+                    tags = result[0];
+                } else { 
+                    tags = this.getTags(node.node);
+                }    
+                
+                var feat = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.Point(node['lon'], node['lat']),
+                    tags);
+                if (this.internalProjection && this.externalProjection) {
+                    feat.geometry.transform(this.externalProjection, 
+                        this.internalProjection);
+                }        
+                feat.osm_id = parseInt(node_id); 
+                feat.fid = "node." + feat.osm_id;
+                feat_list.push(feat);
+            }   
+            // Memory cleanup
+            node.node = null;
+        }        
+        return feat_list;
+    },
+
+    /**
+     * Method: getNodes
+     * Return the node items from a doc.  
+     *
+     * Parameters:
+     * node - {DOMElement} node to parse tags from
+     */
+    getNodes: function(doc) {
+        var node_list = doc.getElementsByTagName("node");
+        var nodes = {};
+        for (var i = 0; i < node_list.length; i++) {
+            var node = node_list[i];
+            var id = node.getAttribute("id");
+            nodes[id] = {
+                'lat': node.getAttribute("lat"),
+                'lon': node.getAttribute("lon"),
+                'node': node
+            };
+        }
+        return nodes;
+    },
+
+    /**
+     * Method: getWays
+     * Return the way items from a doc.  
+     *
+     * Parameters:
+     * node - {DOMElement} node to parse tags from
+     */
+    getWays: function(doc) {
+        var way_list = doc.getElementsByTagName("way");
+        var return_ways = [];
+        for (var i = 0; i < way_list.length; i++) {
+            var way = way_list[i];
+            var way_object = {
+              id: way.getAttribute("id")
+            };
+            
+            way_object.tags = this.getTags(way);
+            
+            var node_list = way.getElementsByTagName("nd");
+            
+            way_object.nodes = new Array(node_list.length);
+            
+            for (var j = 0; j < node_list.length; j++) {
+                way_object.nodes[j] = node_list[j].getAttribute("ref");
+            }  
+            return_ways.push(way_object);
+        }
+        return return_ways; 
+        
+    },  
+    
+    /**
+     * Method: getTags
+     * Return the tags list attached to a specific DOM element.
+     *
+     * Parameters:
+     * node - {DOMElement} node to parse tags from
+     * interesting_tags - {Boolean} whether the return from this function should
+     *    return a boolean indicating that it has 'interesting tags' -- 
+     *    tags like attribution and source are ignored. (To change the list
+     *    of tags, see interestingTagsExclude)
+     * 
+     * Returns:
+     * tags - {Object} hash of tags
+     * interesting - {Boolean} if interesting_tags is passed, returns
+     *     whether there are any interesting tags on this element.
+     */
+    getTags: function(dom_node, interesting_tags) {
+        var tag_list = dom_node.getElementsByTagName("tag");
+        var tags = {};
+        var interesting = false;
+        for (var j = 0; j < tag_list.length; j++) {
+            var key = tag_list[j].getAttribute("k");
+            tags[key] = tag_list[j].getAttribute("v");
+            if (interesting_tags) {
+                if (!this.interestingTagsExclude[key]) {
+                    interesting = true;
+                }
+            }    
+        }  
+        return interesting_tags ? [tags, interesting] : tags;     
+    },
+
+    /** 
+     * Method: isWayArea
+     * Given a way object from getWays, check whether the tags and geometry
+     * indicate something is an area.
+     *
+     * Returns:
+     * {Boolean}
+     */
+    isWayArea: function(way) { 
+        var poly_shaped = false;
+        var poly_tags = false;
+        
+        if (way.nodes[0] == way.nodes[way.nodes.length - 1]) {
+            poly_shaped = true;
+        }
+        if (this.checkTags) {
+            for(var key in way.tags) {
+                if (this.areaTags[key]) {
+                    poly_tags = true;
+                    break;
+                }
+            }
+        }    
+        return poly_shaped && (this.checkTags ? poly_tags : true);            
+    }, 
+
+    /**
+     * APIMethod: write 
+     * Takes a list of features, returns a serialized OSM format file for use
+     * in tools like JOSM.
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>)}
+     */
+    write: function(features) { 
+        if (!(features instanceof Array)) {
+            features = [features];
+        }
+        
+        this.osm_id = 1;
+        this.created_nodes = {};
+        var root_node = this.createElementNS(null, "osm");
+        root_node.setAttribute("version", "0.5");
+        root_node.setAttribute("generator", "OpenLayers "+ OpenLayers.VERSION_NUMBER);
+
+        // Loop backwards, because the deserializer puts nodes last, and 
+        // we want them first if possible
+        for(var i = features.length - 1; i >= 0; i--) {
+            var nodes = this.createFeatureNodes(features[i]);
+            for (var j = 0; j < nodes.length; j++) {
+                root_node.appendChild(nodes[j]);
+            }    
+        }
+        return OpenLayers.Format.XML.prototype.write.apply(this, [root_node]);
+    },
+
+    /**
+     * Method: createFeatureNodes
+     * Takes a feature, returns a list of nodes from size 0->n.
+     * Will include all pieces of the serialization that are required which
+     * have not already been created. Calls out to createXML based on geometry
+     * type.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     */
+    createFeatureNodes: function(feature) {
+        var nodes = [];
+        var className = feature.geometry.CLASS_NAME;
+        var type = className.substring(className.lastIndexOf(".") + 1);
+        type = type.toLowerCase();
+        var builder = this.createXML[type];
+        if (builder) {
+            nodes = builder.apply(this, [feature]);
+        }
+        return nodes;
+    },
+    
+    /**
+     * Method: createXML
+     * Takes a feature, returns a list of nodes from size 0->n.
+     * Will include all pieces of the serialization that are required which
+     * have not already been created.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     */
+    createXML: {
+        'point': function(point) {
+            var id = null;
+            var geometry = point.geometry ? point.geometry : point;
+            var already_exists = false; // We don't return anything if the node
+                                        // has already been created
+            if (point.osm_id) {
+                id = point.osm_id;
+                if (this.created_nodes[id]) {
+                    already_exists = true;
+                }    
+            } else {
+               id = -this.osm_id;
+               this.osm_id++; 
+            }
+            if (already_exists) {
+                node = this.created_nodes[id];
+            } else {    
+                var node = this.createElementNS(null, "node");
+            }
+            this.created_nodes[id] = node;
+            node.setAttribute("id", id);
+            node.setAttribute("lon", geometry.x); 
+            node.setAttribute("lat", geometry.y);
+            if (point.attributes) {
+                this.serializeTags(point, node);
+            }
+            this.setState(point, node);
+            return already_exists ? [] : [node];
+        }, 
+        linestring: function(feature) {
+            var nodes = [];
+            var geometry = feature.geometry;
+            if (feature.osm_id) {
+                id = feature.osm_id;
+            } else {
+               id = -this.osm_id;
+               this.osm_id++; 
+            }
+            var way = this.createElementNS(null, "way");
+            way.setAttribute("id", id);
+            for (var i = 0; i < geometry.components.length; i++) {
+                var node = this.createXML['point'].apply(this, [geometry.components[i]]);
+                if (node.length) {
+                    node = node[0];
+                    var node_ref = node.getAttribute("id");
+                    nodes.push(node);
+                } else {
+                    node_ref = geometry.components[i].osm_id;
+                    node = this.created_nodes[node_ref];
+                }
+                this.setState(feature, node);
+                var nd_dom = this.createElementNS(null, "nd");
+                nd_dom.setAttribute("ref", node_ref);
+                way.appendChild(nd_dom);
+            }
+            this.serializeTags(feature, way);
+            nodes.push(way);
+            
+            return nodes;
+        },
+        polygon: function(feature) {
+            var attrs = OpenLayers.Util.extend({'area':'yes'}, feature.attributes);
+            var feat = new OpenLayers.Feature.Vector(feature.geometry.components[0], attrs); 
+            feat.osm_id = feature.osm_id;
+            return this.createXML['linestring'].apply(this, [feat]);
+        }
+    },
+
+    /**
+     * Method: serializeTags
+     * Given a feature, serialize the attributes onto the given node.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     * node - {DOMNode}
+     */
+    serializeTags: function(feature, node) {
+        for (var key in feature.attributes) {
+            var tag = this.createElementNS(null, "tag");
+            tag.setAttribute("k", key);
+            tag.setAttribute("v", feature.attributes[key]);
+            node.appendChild(tag);
+        }
+    },
+
+    /**
+     * Method: setState 
+     * OpenStreetMap has a convention that 'state' is stored for modification or deletion.
+     * This allows the file to be uploaded via JOSM or the bulk uploader tool.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     * node - {DOMNode}
+     */
+    setState: function(feature, node) {
+        if (feature.state) {
+            var state = null;
+            switch(feature.state) {
+                case OpenLayers.State.UPDATE:
+                    state = "modify";
+                case OpenLayers.State.DELETE:
+                    state = "delete";
+            }
+            if (state) {
+                node.setAttribute("action", state);
+            }
+        }    
+    },
+
+    CLASS_NAME: "OpenLayers.Format.OSM" 
+});     
diff --git a/lib/OpenLayers/Format/OWSCommon/v1.js b/lib/OpenLayers/Format/OWSCommon/v1.js
new file mode 100644
index 0000000..69f3c71
--- /dev/null
+++ b/lib/OpenLayers/Format/OWSCommon/v1.js
@@ -0,0 +1,256 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ */
+
+if (!OpenLayers.Format.OWSCommon) {
+    OpenLayers.Format.OWSCommon = {};
+}
+
+/**
+ * Class: OpenLayers.Format.OWSCommon.v1
+ * Common readers and writers for OWSCommon v1.X formats
+ */
+OpenLayers.Format.OWSCommon.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+   
+    /**
+     * Property: regExes
+     * Compiled regular expressions for manipulating strings.
+     */
+    regExes: {
+        trimSpace: (/^\s*|\s*$/g),
+        removeSpace: (/\s*/g),
+        splitSpace: (/\s+/),
+        trimComma: (/\s*,\s*/g)
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "ows": {
+            "ServiceIdentification": function(node, obj) {
+                obj.serviceIdentification = {};
+                this.readChildNodes(node, obj.serviceIdentification);
+            },
+            "Title": function(node, obj) {
+                obj.title = this.getChildValue(node);
+            },
+            "Abstract": function(node, serviceIdentification) {
+                serviceIdentification["abstract"] = this.getChildValue(node);
+            },
+            "Keywords": function(node, serviceIdentification) {
+                serviceIdentification.keywords = {};
+                this.readChildNodes(node, serviceIdentification.keywords);
+            },
+            "Keyword": function(node, keywords) {
+                keywords[this.getChildValue(node)] = true;
+            },
+            "ServiceType": function(node, serviceIdentification) {
+                serviceIdentification.serviceType = {
+                    codeSpace: node.getAttribute('codeSpace'), 
+                    value: this.getChildValue(node)};
+            },
+            "ServiceTypeVersion": function(node, serviceIdentification) {
+                serviceIdentification.serviceTypeVersion = this.getChildValue(node);
+            },
+            "Fees": function(node, serviceIdentification) {
+                serviceIdentification.fees = this.getChildValue(node);
+            },
+            "AccessConstraints": function(node, serviceIdentification) {
+                serviceIdentification.accessConstraints = 
+                    this.getChildValue(node);
+            },
+            "ServiceProvider": function(node, obj) {
+                obj.serviceProvider = {};
+                this.readChildNodes(node, obj.serviceProvider);
+            },
+            "ProviderName": function(node, serviceProvider) {
+                serviceProvider.providerName = this.getChildValue(node);
+            },
+            "ProviderSite": function(node, serviceProvider) {
+                serviceProvider.providerSite = this.getAttributeNS(node, 
+                    this.namespaces.xlink, "href");
+            },
+            "ServiceContact": function(node, serviceProvider) {
+                serviceProvider.serviceContact = {};
+                this.readChildNodes(node, serviceProvider.serviceContact);
+            },
+            "IndividualName": function(node, serviceContact) {
+                serviceContact.individualName = this.getChildValue(node);
+            },
+            "PositionName": function(node, serviceContact) {
+                serviceContact.positionName = this.getChildValue(node);
+            },
+            "ContactInfo": function(node, serviceContact) {
+                serviceContact.contactInfo = {};
+                this.readChildNodes(node, serviceContact.contactInfo);
+            },
+            "Phone": function(node, contactInfo) {
+                contactInfo.phone = {};
+                this.readChildNodes(node, contactInfo.phone);
+            },
+            "Voice": function(node, phone) {
+                phone.voice = this.getChildValue(node);
+            },
+            "Address": function(node, contactInfo) {
+                contactInfo.address = {};
+                this.readChildNodes(node, contactInfo.address);
+            },
+            "DeliveryPoint": function(node, address) {
+                address.deliveryPoint = this.getChildValue(node);
+            },
+            "City": function(node, address) {
+                address.city = this.getChildValue(node);
+            },
+            "AdministrativeArea": function(node, address) {
+                address.administrativeArea = this.getChildValue(node);
+            },
+            "PostalCode": function(node, address) {
+                address.postalCode = this.getChildValue(node);
+            },
+            "Country": function(node, address) {
+                address.country = this.getChildValue(node);
+            },
+            "ElectronicMailAddress": function(node, address) {
+                address.electronicMailAddress = this.getChildValue(node);
+            },
+            "Role": function(node, serviceContact) {
+                serviceContact.role = this.getChildValue(node);
+            },
+            "OperationsMetadata": function(node, obj) {
+                obj.operationsMetadata = {};
+                this.readChildNodes(node, obj.operationsMetadata);
+            },
+            "Operation": function(node, operationsMetadata) {
+                var name = node.getAttribute("name");
+                operationsMetadata[name] = {};
+                this.readChildNodes(node, operationsMetadata[name]);
+            },
+            "DCP": function(node, operation) {
+                operation.dcp = {};
+                this.readChildNodes(node, operation.dcp);
+            },
+            "HTTP": function(node, dcp) {
+                dcp.http = {};
+                this.readChildNodes(node, dcp.http);
+            },
+            "Get": function(node, http) {
+                http.get = this.getAttributeNS(node, 
+                    this.namespaces.xlink, "href");
+            },
+            "Post": function(node, http) {
+                http.post = this.getAttributeNS(node, 
+                    this.namespaces.xlink, "href");
+            },
+            "Parameter": function(node, operation) {
+                if (!operation.parameters) {
+                    operation.parameters = {};
+                }
+                var name = node.getAttribute("name");
+                operation.parameters[name] = {};
+                this.readChildNodes(node, operation.parameters[name]);
+            },
+            "Value": function(node, allowedValues) {
+                allowedValues[this.getChildValue(node)] = true;
+            },
+            "OutputFormat": function(node, obj) {
+                obj.formats.push({value: this.getChildValue(node)});
+                this.readChildNodes(node, obj);
+            },
+            "WGS84BoundingBox": function(node, obj) {
+                var boundingBox = {};
+                boundingBox.crs = node.getAttribute("crs");
+                if (obj.BoundingBox) {
+                    obj.BoundingBox.push(boundingBox);
+                } else {
+                    obj.projection = boundingBox.crs;
+                    boundingBox = obj;
+               }
+               this.readChildNodes(node, boundingBox);
+            },
+            "BoundingBox": function(node, obj) {
+                // FIXME: We consider that BoundingBox is the same as WGS84BoundingBox
+                // LowerCorner = "min_x min_y"
+                // UpperCorner = "max_x max_y"
+                // It should normally depend on the projection
+                this.readers['ows']['WGS84BoundingBox'].apply(this, [node, obj]);
+            },
+            "LowerCorner": function(node, obj) {
+                var str = this.getChildValue(node).replace(
+                    this.regExes.trimSpace, "");
+                str = str.replace(this.regExes.trimComma, ",");
+                var pointList = str.split(this.regExes.splitSpace);
+                obj.left = pointList[0];
+                obj.bottom = pointList[1];
+            },
+            "UpperCorner": function(node, obj) {
+                var str = this.getChildValue(node).replace(
+                    this.regExes.trimSpace, "");
+                str = str.replace(this.regExes.trimComma, ",");
+                var pointList = str.split(this.regExes.splitSpace);
+                obj.right = pointList[0];
+                obj.top = pointList[1];
+                obj.bounds = new OpenLayers.Bounds(obj.left, obj.bottom,
+                    obj.right, obj.top);
+                delete obj.left;
+                delete obj.bottom;
+                delete obj.right;
+                delete obj.top;
+            }
+        }
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "ows": {
+            "BoundingBox": function(options) {
+                var node = this.createElementNSPlus("ows:BoundingBox", {
+                    attributes: {
+                        crs: options.projection
+                    }
+                });
+                this.writeNode("ows:LowerCorner", options, node);
+                this.writeNode("ows:UpperCorner", options, node);
+                return node;
+            },
+            "LowerCorner": function(options) {
+                var node = this.createElementNSPlus("ows:LowerCorner", {
+                    value: options.bounds.left + " " + options.bounds.bottom });
+                return node;
+            },
+            "UpperCorner": function(options) {
+                var node = this.createElementNSPlus("ows:UpperCorner", {
+                    value: options.bounds.right + " " + options.bounds.top });
+                return node;
+            },
+            "Title": function(title) {
+                var node = this.createElementNSPlus("ows:Title", {
+                    value: title });
+                return node;
+            },
+            "OutputFormat": function(format) {
+                var node = this.createElementNSPlus("ows:OutputFormat", {
+                    value: format });
+                return node;
+            }
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Format.OWSCommon.v1"
+
+});
diff --git a/lib/OpenLayers/Format/OWSCommon/v1_0_0.js b/lib/OpenLayers/Format/OWSCommon/v1_0_0.js
new file mode 100644
index 0000000..73bac2b
--- /dev/null
+++ b/lib/OpenLayers/Format/OWSCommon/v1_0_0.js
@@ -0,0 +1,50 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/OWSCommon/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.OWSCommon.v1_0_0
+ * Parser for OWS Common version 1.0.0 which can be used by other parsers.
+ * It is not intended to be used on its own.
+ */
+OpenLayers.Format.OWSCommon.v1_0_0 = OpenLayers.Class(OpenLayers.Format.OWSCommon.v1, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.0",
+        xlink: "http://www.w3.org/1999/xlink"
+    },    
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "ows": OpenLayers.Format.OWSCommon.v1.prototype.readers["ows"]
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "ows": OpenLayers.Format.OWSCommon.v1.prototype.writers["ows"]
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.OWSCommon.v1_1_0"
+
+});
diff --git a/lib/OpenLayers/Format/OWSCommon/v1_1_0.js b/lib/OpenLayers/Format/OWSCommon/v1_1_0.js
new file mode 100644
index 0000000..c6586a7
--- /dev/null
+++ b/lib/OpenLayers/Format/OWSCommon/v1_1_0.js
@@ -0,0 +1,64 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/OWSCommon/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.OWSCommon.v1_1_0
+ * Parser for OWS Common version 1.1.0 which can be used by other parsers.
+ * It is not intended to be used on its own.
+ */
+OpenLayers.Format.OWSCommon.v1_1_0 = OpenLayers.Class(OpenLayers.Format.OWSCommon.v1, {
+
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        xlink: "http://www.w3.org/1999/xlink"
+    },    
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "ows": OpenLayers.Util.applyDefaults({
+            "AllowedValues": function(node, parameter) {
+                parameter.allowedValues = {};
+                this.readChildNodes(node, parameter.allowedValues);
+            },
+            "AnyValue": function(node, parameter) {
+                parameter.anyValue = true;
+            },
+            "Range": function(node, allowedValues) {
+                allowedValues.range = {};
+                this.readChildNodes(node, allowedValues.range);
+            },
+            "MinimumValue": function(node, range) {
+                range.minValue = this.getChildValue(node);
+            },
+            "MaximumValue": function(node, range) {
+                range.maxValue = this.getChildValue(node);
+            },
+            "Identifier": function(node, obj) {
+            	obj.identifier = this.getChildValue(node);
+            },
+            "SupportedCRS": function(node, obj) {
+                obj.supportedCRS = this.getChildValue(node);
+            }
+        }, OpenLayers.Format.OWSCommon.v1.prototype.readers["ows"])
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.OWSCommon.v1_1_0"
+
+});
diff --git a/lib/OpenLayers/Format/OWSContext.js b/lib/OpenLayers/Format/OWSContext.js
new file mode 100644
index 0000000..d31c55f
--- /dev/null
+++ b/lib/OpenLayers/Format/OWSContext.js
@@ -0,0 +1,81 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/Context.js
+ */
+
+/**
+ * Class: OpenLayers.Format.OWSContext
+ * Read and write OWS Context documents. OWS Context documents are a 
+ * preliminary OGC (Open Geospatial Consortium) standard for storing the 
+ * state of a web mapping application. In a way it is the successor to
+ * Web Map Context (WMC), since it is more generic and more types of layers
+ * can be stored. Also, nesting of layers is supported since version 0.3.1.
+ * For more information see: http://www.ogcnetwork.net/context
+ */
+OpenLayers.Format.OWSContext = OpenLayers.Class(OpenLayers.Format.Context,{
+    
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "0.3.1".
+     */
+    defaultVersion: "0.3.1",
+    
+    /**
+     * Method: getParser
+     * Get the OWSContext parser given a version. Create a new parser if it does not
+     * already exist.
+     *
+     * Parameters:
+     * version - {String} The version of the parser.
+     *
+     * Returns:
+     * {<OpenLayers.Format.OWSContext>} An OWSContext parser.
+     */
+    getParser: function(version) {
+        var v = version || this.version || this.defaultVersion;
+        // 0.3.1 is backwards compatible with 0.3.0
+        if (v === "0.3.0") {
+            v = this.defaultVersion;
+        }
+        if(!this.parser || this.parser.VERSION != v) {
+            var format = OpenLayers.Format.OWSContext[
+                "v" + v.replace(/\./g, "_")
+            ];
+            if(!format) {
+                throw "Can't find a OWSContext parser for version " + v;
+            }
+            this.parser = new format(this.options);
+        }
+        return this.parser;
+    },
+
+    /**
+     * Method: toContext
+     * Create a context object free from layer given a map or a
+     * context object.
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Map> | Object} The map or context.
+     *
+     * Returns:
+     * {Object} A context object.
+     */
+    toContext: function(obj) {
+        var context = {};
+        if(obj.CLASS_NAME == "OpenLayers.Map") {
+            context.bounds = obj.getExtent();
+            context.maxExtent = obj.maxExtent;
+            context.projection = obj.projection;
+            context.size = obj.getSize();
+            context.layers = obj.layers;
+        }
+        return context;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.OWSContext" 
+
+});
diff --git a/lib/OpenLayers/Format/OWSContext/v0_3_1.js b/lib/OpenLayers/Format/OWSContext/v0_3_1.js
new file mode 100644
index 0000000..5a092cd
--- /dev/null
+++ b/lib/OpenLayers/Format/OWSContext/v0_3_1.js
@@ -0,0 +1,589 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/KML.js
+ * @requires OpenLayers/Format/GML.js
+ * @requires OpenLayers/Format/GML/v2.js
+ * @requires OpenLayers/Format/SLD/v1_0_0.js
+ * @requires OpenLayers/Format/OWSContext.js
+ * @requires OpenLayers/Format/OWSCommon/v1_0_0.js
+ */
+
+/**
+ * Class: OpenLayers.Format.OWSContext.v0_3_1
+ * Read and write OWSContext version 0.3.1.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.OWSContext.v0_3_1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        owc: "http://www.opengis.net/ows-context",
+        gml: "http://www.opengis.net/gml",
+        kml: "http://www.opengis.net/kml/2.2",
+        ogc: "http://www.opengis.net/ogc",
+        ows: "http://www.opengis.net/ows",
+        sld: "http://www.opengis.net/sld",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+
+    /**
+     * Constant: VERSION
+     * {String} 0.3.1
+     */
+    VERSION: "0.3.1", 
+
+    /**
+     * Property: schemaLocation
+     * {String} Schema location
+     */
+    schemaLocation: "http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd",
+
+    /**
+     * Property: defaultPrefix
+     * {String} Default namespace prefix to use.
+     */
+    defaultPrefix: "owc",
+
+    /**
+     * APIProperty: extractAttributes
+     * {Boolean} Extract attributes from GML.  Default is true.
+     */
+    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, 
+
+    /**
+     * Property: regExes
+     * Compiled regular expressions for manipulating strings.
+     */
+    regExes: {
+        trimSpace: (/^\s*|\s*$/g),
+        removeSpace: (/\s*/g),
+        splitSpace: (/\s+/),
+        trimComma: (/\s*,\s*/g)
+    },
+
+    /**
+     * Property: featureNS
+     * {String} The namespace uri to use for writing InlineGeometry
+     */
+    featureNS: "http://mapserver.gis.umn.edu/mapserver",
+
+    /**
+     * Property: featureType
+     * {String} The name to use as the feature type when writing out
+     *     InlineGeometry
+     */
+    featureType: 'vector',
+              
+    /**
+     * Property: geometryName
+     * {String} The name to use for the geometry attribute when writing out
+     *     InlineGeometry
+     */
+    geometryName: 'geometry',
+
+    /**
+     * Property: nestingLayerLookup
+     * {Object} Hashtable lookup for nesting layer nodes. Used while writing 
+     *     the OWS context document. It is necessary to keep track of the 
+     *     nestingPaths for which nesting layer nodes have already been 
+     *     created, so (nesting) layer nodes are added to those nodes.
+     *
+     * For example:
+     *
+     *     If there are three layers with nestingPaths:
+     *         layer1.metadata.nestingPath = "a/b/"
+     *         layer2.metadata.nestingPath = "a/b/"
+     *         layer2.metadata.nestingPath = "a/c"
+     *
+     *     then a nesting layer node "a" should be created once and added 
+     *     to the resource list, a nesting layer node "b" should be created 
+     *     once and added under "a", and a nesting layer node "c" should be 
+     *     created and added under "a". The lookup paths for these nodes 
+     *     will be "a", "a/b", and "a/c" respectively.
+     */
+    nestingLayerLookup: null,
+
+    /**
+     * Constructor: OpenLayers.Format.OWSContext.v0_3_1
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.OWSContext> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        OpenLayers.Format.GML.v2.prototype.setGeometryTypes.call(this);
+    },
+
+    /**
+     * Method: setNestingPath
+     * Set the nestingPath property of the layer depending on the position
+     *     of the layer in hierarchy of layers.
+     *
+     * Parameters:
+     * l - {Object} An object that may have a layersContext array property.
+     * 
+     */
+    setNestingPath : function(l){
+        if(l.layersContext){
+            for (var i = 0, len = l.layersContext.length; i < len; i++) {
+                var layerContext = l.layersContext[i];
+                var nPath = [];
+                var nTitle = l.title || "";
+                if(l.metadata && l.metadata.nestingPath){
+                    nPath = l.metadata.nestingPath.slice();
+                }
+                if (nTitle != "") {
+                    nPath.push(nTitle);
+                }
+                layerContext.metadata.nestingPath = nPath;
+                if(layerContext.layersContext){
+                    this.setNestingPath(layerContext);
+                }
+            }
+        }
+    },
+
+    /**
+     * Function: decomposeNestingPath
+     * Takes a nestingPath like "a/b/c" and decomposes it into subpaths:
+     * "a", "a/b", "a/b/c"
+     *
+     * Parameters:
+     * nPath  - {Array} the nesting path
+     *
+     * Returns:
+     * Array({String}) Array with subpaths, or empty array if there is nothing
+     *     to decompose
+     */
+    decomposeNestingPath: function(nPath){
+        var a = [];
+        if (nPath instanceof Array) {
+            while (nPath.length > 0) {
+                a.push(nPath.slice());
+                nPath.pop();
+            }
+            a.reverse();
+        }
+        return a;
+    },
+
+    /**
+     * APIMethod: read
+     * Read OWS context data from a string or DOMElement, and return a list 
+     *     of layers. 
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Object} The context object with a flat layer list as a property named
+     *     layersContext.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var context = {};
+        this.readNode(data, context);
+        // since an OWSContext can be nested we need to go through this
+        // structure recursively      
+        this.setNestingPath({layersContext : context.layersContext});
+        // after nesting path has been set, create a flat list of layers
+        var layers = [];
+        this.processLayer(layers, context);
+        delete context.layersContext;
+        context.layersContext = layers;
+        return context;
+    },
+
+    /**
+     * Method: processLayer
+     * Recursive function to get back a flat list of layers from the hierarchic
+     *     layer structure.
+     *
+     * Parameters:
+     * layerArray - {Array({Object})} Array of layerContext objects
+     * layerContext - {Object} layerContext object
+     */
+    processLayer: function(layerArray, layer) {
+        if (layer.layersContext) {
+            for (var i=0, len = layer.layersContext.length; i<len; i++) {
+                var l = layer.layersContext[i];
+                layerArray.push(l);
+                if (l.layersContext) {
+                    this.processLayer(layerArray, l);
+                }
+            }
+        }
+    },
+
+    /**
+     * APIMethod: write
+     *
+     * Parameters:
+     * context - {Object} An object representing the map context.
+     * options - {Object} Optional object.
+     *
+     * Returns:
+     * {String} An OWS Context document string.
+     */
+    write: function(context, options) {
+        var name = "OWSContext";
+        this.nestingLayerLookup = {}; //start with empty lookup
+        options = options || {};
+        OpenLayers.Util.applyDefaults(options, context);
+        var root = this.writeNode(name, options);
+        this.nestingLayerLookup = null; //clear lookup
+        this.setAttributeNS(
+            root, this.namespaces["xsi"],
+            "xsi:schemaLocation", this.schemaLocation
+        );
+        return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
+    }, 
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "kml": {
+            "Document": function(node, obj) {
+                obj.features = new OpenLayers.Format.KML(
+                    {kmlns: this.namespaces.kml, 
+                        extractStyles: true}).read(node);
+            }
+        },
+        "owc": { 
+            "OWSContext": function(node, obj) {
+                this.readChildNodes(node, obj);
+            }, 
+            "General": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "ResourceList": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Layer": function(node, obj) {
+                var layerContext = {
+                    metadata: {},
+                    visibility: (node.getAttribute("hidden") != "1"),
+                    queryable: (node.getAttribute("queryable") == "1"),
+                    opacity: ((node.getAttribute("opacity") != null) ? 
+                        parseFloat(node.getAttribute("opacity")) : null),
+                    name: node.getAttribute("name"),
+                    /* A category layer is a dummy layer meant for creating
+                       hierarchies. It is not a physical layer in the 
+                       OpenLayers sense. The assumption we make here is that
+                       category layers do not have a name attribute */
+                    categoryLayer: (node.getAttribute("name") == null),
+                    formats: [],
+                    styles: []
+                };
+                if (!obj.layersContext) {
+                    obj.layersContext = [];
+                }
+                obj.layersContext.push(layerContext);
+                this.readChildNodes(node, layerContext);
+            },
+            "InlineGeometry": function(node, obj) {
+                obj.features = [];
+                var elements = this.getElementsByTagNameNS(node, 
+                    this.namespaces.gml, "featureMember");
+                var el;
+                if (elements.length >= 1) {
+                    el = elements[0];
+                }
+                if (el && el.firstChild) {
+                    var featurenode = (el.firstChild.nextSibling) ? 
+                        el.firstChild.nextSibling : el.firstChild;
+                    this.setNamespace("feature", featurenode.namespaceURI);
+                    this.featureType = featurenode.localName || 
+                        featurenode.nodeName.split(":").pop();
+                    this.readChildNodes(node, obj);
+                }
+            },
+            "Server": function(node, obj) {
+                // when having multiple Server types, we prefer WMS
+                if ((!obj.service && !obj.version) || 
+                    (obj.service != 
+                        OpenLayers.Format.Context.serviceTypes.WMS)) {
+                            obj.service = node.getAttribute("service");
+                            obj.version = node.getAttribute("version");
+                            this.readChildNodes(node, obj);
+                }
+            },
+            "Name": function(node, obj) {
+                obj.name = this.getChildValue(node);
+                this.readChildNodes(node, obj);
+            },
+            "Title": function(node, obj) {
+                obj.title = this.getChildValue(node);
+                this.readChildNodes(node, obj);
+            },
+            "StyleList": function(node, obj) {
+                this.readChildNodes(node, obj.styles);
+            },
+            "Style": function(node, obj) {
+                var style = {};
+                obj.push(style);
+                this.readChildNodes(node, style);
+            },
+            "LegendURL": function(node, obj) {
+                var legend = {};
+                obj.legend = legend;
+                this.readChildNodes(node, legend);
+            },
+            "OnlineResource": function(node, obj) {
+                obj.url = this.getAttributeNS(node, this.namespaces.xlink, 
+                    "href");
+                this.readChildNodes(node, obj);
+            }
+        },
+        "ows": OpenLayers.Format.OWSCommon.v1_0_0.prototype.readers.ows,
+        "gml": OpenLayers.Format.GML.v2.prototype.readers.gml,
+        "sld": OpenLayers.Format.SLD.v1_0_0.prototype.readers.sld,
+        "feature": OpenLayers.Format.GML.v2.prototype.readers.feature
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "owc": {
+            "OWSContext": function(options) {
+                var node = this.createElementNSPlus("OWSContext", {
+                    attributes: {
+                        version: this.VERSION,
+                        id: options.id || OpenLayers.Util.createUniqueID("OpenLayers_OWSContext_")
+                    } 
+                }); 
+                this.writeNode("General", options, node);
+                this.writeNode("ResourceList", options, node);
+                return node; 
+            },
+            "General": function(options) {
+                var node = this.createElementNSPlus("General");
+                this.writeNode("ows:BoundingBox", options, node);
+                this.writeNode("ows:Title", options.title || 'OpenLayers OWSContext', node);
+                return node;
+            },
+            "ResourceList": function(options) {
+                var node = this.createElementNSPlus("ResourceList");
+                for (var i=0, len=options.layers.length; i<len; i++) {
+                    var layer = options.layers[i];
+                    var decomposedPath = this.decomposeNestingPath(layer.metadata.nestingPath);
+                    this.writeNode("_Layer", {layer: layer, subPaths: decomposedPath}, node);
+                }
+                return node;
+            },
+            "Server": function(options) {
+                var node = this.createElementNSPlus("Server", {attributes: {
+                    version: options.version,
+                    service: options.service }
+                });
+                this.writeNode("OnlineResource", options, node);
+                return node;
+            },
+            "OnlineResource": function(options) {
+                var node = this.createElementNSPlus("OnlineResource", {attributes: {
+                    "xlink:href": options.url }
+                });
+                return node;
+            },
+            "InlineGeometry": function(layer) {
+                var node = this.createElementNSPlus("InlineGeometry");
+                this.writeNode("gml:boundedBy", layer.getDataExtent(), node);
+                for (var i=0, len=layer.features.length; i<len; i++) {
+                    this.writeNode("gml:featureMember", layer.features[i], node);
+                }
+                return node;
+            },
+            "StyleList": function(styles) {
+                var node = this.createElementNSPlus("StyleList");
+                for (var i=0, len=styles.length; i<len; i++) {
+                    this.writeNode("Style", styles[i], node);
+                }
+                return node;
+            },
+            "Style": function(style) {
+                var node = this.createElementNSPlus("Style");
+                this.writeNode("Name", style, node);
+                this.writeNode("Title", style, node);
+                this.writeNode("LegendURL", style, node);
+                return node;
+            },
+            "Name": function(obj) {
+                var node = this.createElementNSPlus("Name", {
+                    value: obj.name });
+                return node;
+            },
+            "Title": function(obj) {
+                var node = this.createElementNSPlus("Title", {
+                    value: obj.title });
+                return node;
+            },
+            "LegendURL": function(style) {
+                var node = this.createElementNSPlus("LegendURL");
+                this.writeNode("OnlineResource", style.legend, node);
+                return node;
+            },
+            "_WMS": function(layer) {
+                var node = this.createElementNSPlus("Layer", {attributes: {
+                    name: layer.params.LAYERS,
+                    queryable: layer.queryable ? "1" : "0",
+                    hidden: layer.visibility ? "0" : "1",
+                    opacity: layer.opacity ? layer.opacity: null}
+                });
+                this.writeNode("ows:Title", layer.name, node);
+                this.writeNode("ows:OutputFormat", layer.params.FORMAT, node);
+                this.writeNode("Server", {service: 
+                    OpenLayers.Format.Context.serviceTypes.WMS,
+                    version: layer.params.VERSION, url: layer.url}, node);
+                if (layer.metadata.styles && layer.metadata.styles.length > 0) {
+                    this.writeNode("StyleList", layer.metadata.styles, node);
+                }
+                return node;
+            },
+            "_Layer": function(options) {
+                var layer, subPaths, node, title;
+                layer = options.layer;
+                subPaths = options.subPaths;
+                node = null;
+                title = null;
+                // subPaths is an array of an array
+                // recursively calling _Layer writer eats up subPaths, until a 
+                // real writer is called and nodes are returned.
+                if(subPaths.length > 0){
+                    var path = subPaths[0].join("/");
+                    var index = path.lastIndexOf("/");
+                    node = this.nestingLayerLookup[path];
+                    title = (index > 0)?path.substring(index + 1, path.length):path;
+                    if(!node){
+                        // category layer
+                        node = this.createElementNSPlus("Layer");
+                        this.writeNode("ows:Title", title, node);
+                        this.nestingLayerLookup[path] = node;
+                    }
+                    options.subPaths.shift();//remove a path after each call
+                    this.writeNode("_Layer", options, node);
+                    return node;
+                } else {
+                    // write out the actual layer
+                    if (layer instanceof OpenLayers.Layer.WMS) {
+                        node = this.writeNode("_WMS", layer);
+                    } else if (layer instanceof OpenLayers.Layer.Vector) {
+                        if (layer.protocol instanceof OpenLayers.Protocol.WFS.v1) {
+                            node = this.writeNode("_WFS", layer);
+                        } else if (layer.protocol instanceof OpenLayers.Protocol.HTTP) {
+                            if (layer.protocol.format instanceof OpenLayers.Format.GML) {
+                                layer.protocol.format.version = "2.1.2";
+                                node = this.writeNode("_GML", layer);
+                            } else if (layer.protocol.format instanceof OpenLayers.Format.KML) {
+                                layer.protocol.format.version = "2.2";
+                                node = this.writeNode("_KML", layer);
+                            }
+                        } else {
+                            // write out as inline GML since we have no idea
+                            // about the original Format
+                            this.setNamespace("feature", this.featureNS);
+                            node = this.writeNode("_InlineGeometry", layer);
+                        }
+                    }
+                    if (layer.options.maxScale) {
+                        this.writeNode("sld:MinScaleDenominator", 
+                            layer.options.maxScale, node);
+                    }
+                    if (layer.options.minScale) {
+                        this.writeNode("sld:MaxScaleDenominator", 
+                            layer.options.minScale, node);
+                    }
+                    this.nestingLayerLookup[layer.name] = node;
+                    return node;
+                }
+            },
+            "_WFS": function(layer) {
+                var node = this.createElementNSPlus("Layer", {attributes: {
+                    name: layer.protocol.featurePrefix + ":" + layer.protocol.featureType,
+                    hidden: layer.visibility ? "0" : "1" }
+                });
+                this.writeNode("ows:Title", layer.name, node);
+                this.writeNode("Server", {service: 
+                    OpenLayers.Format.Context.serviceTypes.WFS, 
+                    version: layer.protocol.version, 
+                    url: layer.protocol.url}, node);
+                return node;
+            },
+            "_InlineGeometry": function(layer) {
+                var node = this.createElementNSPlus("Layer", {attributes: {
+                    name: this.featureType,
+                    hidden: layer.visibility ? "0" : "1" }
+                });
+                this.writeNode("ows:Title", layer.name, node);
+                this.writeNode("InlineGeometry", layer, node);
+                return node;
+            },
+            "_GML": function(layer) {
+                var node = this.createElementNSPlus("Layer");
+                this.writeNode("ows:Title", layer.name, node);
+                this.writeNode("Server", {service: 
+                    OpenLayers.Format.Context.serviceTypes.GML, 
+                    url: layer.protocol.url, version: 
+                    layer.protocol.format.version}, node);
+                return node;
+            },
+            "_KML": function(layer) {
+                var node = this.createElementNSPlus("Layer");
+                this.writeNode("ows:Title", layer.name, node);
+                this.writeNode("Server", {service: 
+                    OpenLayers.Format.Context.serviceTypes.KML,
+                    version: layer.protocol.format.version, url: 
+                    layer.protocol.url}, node);
+                return node;
+            }
+        },
+        "gml": OpenLayers.Util.applyDefaults({
+            "boundedBy": function(bounds) {
+                var node = this.createElementNSPlus("gml:boundedBy");
+                this.writeNode("gml:Box", bounds, node);
+                return node;
+            }
+        }, OpenLayers.Format.GML.v2.prototype.writers.gml),
+        "ows": OpenLayers.Format.OWSCommon.v1_0_0.prototype.writers.ows,
+        "sld": OpenLayers.Format.SLD.v1_0_0.prototype.writers.sld,
+        "feature": OpenLayers.Format.GML.v2.prototype.writers.feature
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.OWSContext.v0_3_1" 
+
+});
diff --git a/lib/OpenLayers/Format/SLD.js b/lib/OpenLayers/Format/SLD.js
new file mode 100644
index 0000000..0383c58
--- /dev/null
+++ b/lib/OpenLayers/Format/SLD.js
@@ -0,0 +1,131 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Style.js
+ * @requires OpenLayers/Rule.js
+ * @requires OpenLayers/Filter/FeatureId.js
+ * @requires OpenLayers/Filter/Logical.js
+ * @requires OpenLayers/Filter/Comparison.js
+ * @requires OpenLayers/Filter/Spatial.js
+ */
+
+/**
+ * Class: OpenLayers.Format.SLD
+ * Read/Wite SLD. Create a new instance with the <OpenLayers.Format.SLD>
+ *     constructor.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.SLD = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "1.0.0".
+     */
+    defaultVersion: "1.0.0",
+    
+    /**
+     * APIProperty: version
+     * {String} Specify a version string if one is known.
+     */
+    version: null,
+    
+    /**
+     * APIProperty: namedLayersAsArray
+     * {Boolean} Generate a namedLayers array.  If false, the namedLayers
+     *     property value will be an object keyed by layer name. Default is
+     *     false.
+     */
+    namedLayersAsArray: false,
+    
+    /**
+     * Property: parser
+     * {Object} Instance of the versioned parser.  Cached for multiple read and
+     *     write calls of the same version.
+     */
+    parser: null,
+
+    /**
+     * Constructor: OpenLayers.Format.SLD
+     * Create a new parser for SLD.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: write
+     * Write a SLD document given a list of styles.
+     *
+     * Parameters:
+     * sld - {Object} An object representing the SLD.
+     * options - {Object} Optional configuration object.
+     *
+     * Returns:
+     * {String} An SLD document string.
+     */
+    write: function(sld, options) {
+        var version = (options && options.version) ||
+                      this.version || this.defaultVersion;
+        if(!this.parser || this.parser.VERSION != version) {
+            var format = OpenLayers.Format.SLD[
+                "v" + version.replace(/\./g, "_")
+            ];
+            if(!format) {
+                throw "Can't find a SLD parser for version " +
+                      version;
+            }
+            this.parser = new format(this.options);
+        }
+        var root = this.parser.write(sld);
+        return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
+    },
+    
+    /**
+     * APIMethod: read
+     * Read and SLD doc and return an object representing the SLD.
+     *
+     * Parameters:
+     * data - {String | DOMElement} Data to read.
+     * options - {Object} Options for the reader.
+     *
+     * Returns:
+     * {Object} An object representing the SLD.
+     */
+    read: function(data, options) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        var version = this.version;
+        if(!version) {
+            version = root.getAttribute("version");
+            if(!version) {
+                version = this.defaultVersion;
+            }
+        }
+        if(!this.parser || this.parser.VERSION != version) {
+            var format = OpenLayers.Format.SLD[
+                "v" + version.replace(/\./g, "_")
+            ];
+            if(!format) {
+                throw "Can't find a SLD parser for version " +
+                      version;
+            }
+            this.parser = new format(this.options);
+        }
+        var sld = this.parser.read(data, options);
+        return sld;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.SLD" 
+});
diff --git a/lib/OpenLayers/Format/SLD/v1.js b/lib/OpenLayers/Format/SLD/v1.js
new file mode 100644
index 0000000..f2ac8da
--- /dev/null
+++ b/lib/OpenLayers/Format/SLD/v1.js
@@ -0,0 +1,1100 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Rule.js
+ * @requires OpenLayers/Format/SLD.js
+ * @requires OpenLayers/Format/Filter/v1_0_0.js
+ */
+
+/**
+ * Class: OpenLayers.Format.SLD.v1
+ * Superclass for SLD version 1 parsers.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.Filter.v1_0_0>
+ */
+OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        sld: "http://www.opengis.net/sld",
+        ogc: "http://www.opengis.net/ogc",
+        gml: "http://www.opengis.net/gml",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    
+    /**
+     * Property: defaultPrefix
+     */
+    defaultPrefix: "sld",
+
+    /**
+     * Property: schemaLocation
+     * {String} Schema location for a particular minor version.
+     */
+    schemaLocation: null,
+    
+    /** 
+     * APIProperty: multipleSymbolizers
+     * {Boolean} Support multiple symbolizers per rule.  Default is false.  if
+     *     true, an OpenLayers.Style2 instance will be created to represent 
+     *     user styles instead of an OpenLayers.Style instace.  The 
+     *     OpenLayers.Style2 class allows collections of rules with multiple
+     *     symbolizers, but is not currently useful for client side rendering.
+     *     If multiple symbolizers is true, multiple FeatureTypeStyle elements
+     *     are preserved in reading/writing by setting symbolizer zIndex values.
+     *     In addition, the <defaultSymbolizer> property is ignored if 
+     *     multiple symbolizers are supported (defaults should be applied
+     *     when rendering).
+     */
+    multipleSymbolizers: false,
+
+    /**
+     * Property: featureTypeCounter
+     * {Number} Private counter for multiple feature type styles.
+     */
+    featureTypeCounter: null,
+
+    /**
+     * APIProperty: defaultSymbolizer.
+     * {Object} A symbolizer with the SLD defaults.
+     */
+    defaultSymbolizer: {
+        fillColor: "#808080",
+        fillOpacity: 1,
+        strokeColor: "#000000",
+        strokeOpacity: 1,
+        strokeWidth: 1,
+        strokeDashstyle: "solid",
+        pointRadius: 3,
+        graphicName: "square"
+    },
+    
+    /**
+     * Constructor: OpenLayers.Format.SLD.v1
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.SLD> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.Filter.v1_0_0.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Method: read
+     *
+     * Parameters:
+     * data - {DOMElement} An SLD document element.
+     * options - {Object} Options for the reader.
+     *
+     * Valid options:
+     * namedLayersAsArray - {Boolean}  Generate a namedLayers array.  If false,
+     *     the namedLayers property value will be an object keyed by layer name.
+     *     Default is false.
+     *
+     * Returns:
+     * {Object} An object representing the SLD.
+     */
+    read: function(data, options) {
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+        var sld = {
+            namedLayers: options.namedLayersAsArray === true ? [] : {}
+        };
+        this.readChildNodes(data, sld);
+        return sld;
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: OpenLayers.Util.applyDefaults({
+        "sld": {
+            "StyledLayerDescriptor": function(node, sld) {
+                sld.version = node.getAttribute("version");
+                this.readChildNodes(node, sld);
+            },
+            "Name": function(node, obj) {
+                obj.name = this.getChildValue(node);
+            },
+            "Title": function(node, obj) {
+                obj.title = this.getChildValue(node);
+            },
+            "Abstract": function(node, obj) {
+                obj.description = this.getChildValue(node);
+            },
+            "NamedLayer": function(node, sld) {
+                var layer = {
+                    userStyles: [],
+                    namedStyles: []
+                };
+                this.readChildNodes(node, layer);
+                // give each of the user styles this layer name
+                for(var i=0, len=layer.userStyles.length; i<len; ++i) {
+                    layer.userStyles[i].layerName = layer.name;
+                }
+                if(sld.namedLayers instanceof Array) {
+                    sld.namedLayers.push(layer);                
+                } else {
+                    sld.namedLayers[layer.name] = layer;
+                }
+            },
+            "NamedStyle": function(node, layer) {
+                layer.namedStyles.push(
+                    this.getChildName(node.firstChild)
+                );
+            },
+            "UserStyle": function(node, layer) {
+                var obj = {defaultsPerSymbolizer: true, rules: []};
+                this.featureTypeCounter = -1;
+                this.readChildNodes(node, obj);
+                var style;
+                if (this.multipleSymbolizers) {
+                    delete obj.defaultsPerSymbolizer;
+                    style = new OpenLayers.Style2(obj);
+                } else {
+                    style = new OpenLayers.Style(this.defaultSymbolizer, obj);
+                }
+                layer.userStyles.push(style);
+            },
+            "IsDefault": function(node, style) {
+                if(this.getChildValue(node) == "1") {
+                    style.isDefault = true;
+                }
+            },
+            "FeatureTypeStyle": function(node, style) {
+                ++this.featureTypeCounter;
+                var obj = {
+                    rules: this.multipleSymbolizers ? style.rules : []
+                };
+                this.readChildNodes(node, obj);
+                if (!this.multipleSymbolizers) {
+                    style.rules = obj.rules;
+                }
+            },
+            "Rule": function(node, obj) {
+                var config;
+                if (this.multipleSymbolizers) {
+                    config = {symbolizers: []};
+                }
+                var rule = new OpenLayers.Rule(config);
+                this.readChildNodes(node, rule);
+                obj.rules.push(rule);
+            },
+            "ElseFilter": function(node, rule) {
+                rule.elseFilter = true;
+            },
+            "MinScaleDenominator": function(node, rule) {
+                rule.minScaleDenominator = parseFloat(this.getChildValue(node));
+            },
+            "MaxScaleDenominator": function(node, rule) {
+                rule.maxScaleDenominator = parseFloat(this.getChildValue(node));
+            },
+            "TextSymbolizer": function(node, rule) {
+                var config = {};
+                this.readChildNodes(node, config);
+                if (this.multipleSymbolizers) {
+                    config.zIndex = this.featureTypeCounter;
+                    rule.symbolizers.push(
+                        new OpenLayers.Symbolizer.Text(config)
+                    );
+                } else {
+                    rule.symbolizer["Text"] = OpenLayers.Util.applyDefaults(
+                        config, rule.symbolizer["Text"]
+                    );
+                }
+            },
+            "Label": function(node, symbolizer) {
+                // only supporting literal or property name
+                var obj = {};
+                this.readChildNodes(node, obj);
+                if(obj.property) {
+                    symbolizer.label = "${" + obj.property + "}";
+                } else {
+                    var value = this.readOgcExpression(node);
+                    if(value) {
+                        symbolizer.label = value;
+                    }
+                }
+            },
+            "Font": function(node, symbolizer) {
+                this.readChildNodes(node, symbolizer);
+            },
+            "Halo": function(node, symbolizer) {
+                // halo has a fill, so send fresh object
+                var obj = {};
+                this.readChildNodes(node, obj);
+                symbolizer.haloRadius = obj.haloRadius;
+                symbolizer.haloColor = obj.fillColor;
+                symbolizer.haloOpacity = obj.fillOpacity;
+            },
+            "Radius": function(node, symbolizer) {
+                var radius = this.readOgcExpression(node);
+                if(radius != null) {
+                    // radius is only used for halo
+                    symbolizer.haloRadius = radius;
+                }
+            },
+            "RasterSymbolizer": function(node, rule) {
+                var config = {};
+                this.readChildNodes(node, config);
+                if (this.multipleSymbolizers) {
+                    config.zIndex = this.featureTypeCounter;
+                    rule.symbolizers.push(
+                        new OpenLayers.Symbolizer.Raster(config)
+                    );
+                } else {
+                    rule.symbolizer["Raster"] = OpenLayers.Util.applyDefaults(
+                        config, rule.symbolizer["Raster"]
+                    );
+                }
+            },
+            "Geometry": function(node, obj) {
+                obj.geometry = {};
+                this.readChildNodes(node, obj.geometry);
+            },
+            "ColorMap": function(node, symbolizer) {
+                symbolizer.colorMap = [];
+                this.readChildNodes(node, symbolizer.colorMap);
+            },
+            "ColorMapEntry": function(node, colorMap) {
+                var q = node.getAttribute("quantity");
+                var o = node.getAttribute("opacity");
+                colorMap.push({
+                    color: node.getAttribute("color"),
+                    quantity: q !== null ? parseFloat(q) : undefined,
+                    label: node.getAttribute("label") || undefined,
+                    opacity: o !== null ? parseFloat(o) : undefined
+                });
+            },
+            "LineSymbolizer": function(node, rule) {
+                var config = {};
+                this.readChildNodes(node, config);
+                if (this.multipleSymbolizers) {
+                    config.zIndex = this.featureTypeCounter;
+                    rule.symbolizers.push(
+                        new OpenLayers.Symbolizer.Line(config)
+                    );
+                } else {
+                    rule.symbolizer["Line"] = OpenLayers.Util.applyDefaults(
+                        config, rule.symbolizer["Line"]
+                    );
+                }
+            },
+            "PolygonSymbolizer": function(node, rule) {
+                var config = {
+                    fill: false,
+                    stroke: false
+                };
+                if (!this.multipleSymbolizers) {
+                    config = rule.symbolizer["Polygon"] || config;
+                }
+                this.readChildNodes(node, config);
+                if (this.multipleSymbolizers) {
+                    config.zIndex = this.featureTypeCounter;
+                    rule.symbolizers.push(
+                        new OpenLayers.Symbolizer.Polygon(config)
+                    );
+                } else {
+                    rule.symbolizer["Polygon"] = config;
+                }
+            },
+            "PointSymbolizer": function(node, rule) {
+                var config = {
+                    fill: false,
+                    stroke: false,
+                    graphic: false
+                };
+                if (!this.multipleSymbolizers) {
+                    config = rule.symbolizer["Point"] || config;
+                }
+                this.readChildNodes(node, config);
+                if (this.multipleSymbolizers) {
+                    config.zIndex = this.featureTypeCounter;
+                    rule.symbolizers.push(
+                        new OpenLayers.Symbolizer.Point(config)
+                    );
+                } else {
+                    rule.symbolizer["Point"] = config;
+                }
+            },
+            "Stroke": function(node, symbolizer) {
+                symbolizer.stroke = true;
+                this.readChildNodes(node, symbolizer);
+            },
+            "Fill": function(node, symbolizer) {
+                symbolizer.fill = true;
+                this.readChildNodes(node, symbolizer);
+            },
+            "CssParameter": function(node, symbolizer) {
+                var cssProperty = node.getAttribute("name");
+                var symProperty = this.cssMap[cssProperty];
+                if(symProperty) {
+                    // Limited support for parsing of OGC expressions
+                    var value = this.readOgcExpression(node);
+                    // always string, could be an empty string
+                    if(value) {
+                        symbolizer[symProperty] = value;
+                    }
+                }
+            },
+            "Graphic": function(node, symbolizer) {
+                symbolizer.graphic = true;
+                var graphic = {};
+                // painter's order not respected here, clobber previous with next
+                this.readChildNodes(node, graphic);
+                // directly properties with names that match symbolizer properties
+                var properties = [
+                    "stroke", "strokeColor", "strokeWidth", "strokeOpacity",
+                    "strokeLinecap", "fill", "fillColor", "fillOpacity",
+                    "graphicName", "rotation", "graphicFormat"
+                ];
+                var prop, value;
+                for(var i=0, len=properties.length; i<len; ++i) {
+                    prop = properties[i];
+                    value = graphic[prop];
+                    if(value != undefined) {
+                        symbolizer[prop] = value;
+                    }
+                }
+                // set other generic properties with specific graphic property names
+                if(graphic.opacity != undefined) {
+                    symbolizer.graphicOpacity = graphic.opacity;
+                }
+                if(graphic.size != undefined) {
+                    symbolizer.pointRadius = graphic.size / 2;
+                }
+                if(graphic.href != undefined) {
+                    symbolizer.externalGraphic = graphic.href;
+                }
+                if(graphic.rotation != undefined) {
+                    symbolizer.rotation = graphic.rotation;
+                }
+            },
+            "ExternalGraphic": function(node, graphic) {
+                this.readChildNodes(node, graphic);
+            },
+            "Mark": function(node, graphic) {
+                this.readChildNodes(node, graphic);
+            },
+            "WellKnownName": function(node, graphic) {
+                graphic.graphicName = this.getChildValue(node);
+            },
+            "Opacity": function(node, obj) {
+                var opacity = this.readOgcExpression(node);
+                // always string, could be empty string
+                if(opacity) {
+                    obj.opacity = opacity;
+                }
+            },
+            "Size": function(node, obj) {
+                var size = this.readOgcExpression(node);
+                // always string, could be empty string
+                if(size) {
+                    obj.size = size;
+                }
+            },
+            "Rotation": function(node, obj) {
+                var rotation = this.readOgcExpression(node);
+                // always string, could be empty string
+                if(rotation) {
+                    obj.rotation = rotation;
+                }
+            },
+            "OnlineResource": function(node, obj) {
+                obj.href = this.getAttributeNS(
+                    node, this.namespaces.xlink, "href"
+                );
+            },
+            "Format": function(node, graphic) {
+                graphic.graphicFormat = this.getChildValue(node);
+            }
+        }
+    }, OpenLayers.Format.Filter.v1_0_0.prototype.readers),
+    
+    /**
+     * Property: cssMap
+     * {Object} Object mapping supported css property names to OpenLayers
+     *     symbolizer property names.
+     */
+    cssMap: {
+        "stroke": "strokeColor",
+        "stroke-opacity": "strokeOpacity",
+        "stroke-width": "strokeWidth",
+        "stroke-linecap": "strokeLinecap",
+        "stroke-dasharray": "strokeDashstyle",
+        "fill": "fillColor",
+        "fill-opacity": "fillOpacity",
+        "font-family": "fontFamily",
+        "font-size": "fontSize",
+        "font-weight": "fontWeight",
+        "font-style": "fontStyle"
+    },
+    
+    /**
+     * Method: getCssProperty
+     * Given a symbolizer property, get the corresponding CSS property
+     *     from the <cssMap>.
+     *
+     * Parameters:
+     * sym - {String} A symbolizer property name.
+     *
+     * Returns:
+     * {String} A CSS property name or null if none found.
+     */
+    getCssProperty: function(sym) {
+        var css = null;
+        for(var prop in this.cssMap) {
+            if(this.cssMap[prop] == sym) {
+                css = prop;
+                break;
+            }
+        }
+        return css;
+    },
+    
+    /**
+     * Method: getGraphicFormat
+     * Given a href for an external graphic, try to determine the mime-type.
+     *     This method doesn't try too hard, and will fall back to
+     *     <defautlGraphicFormat> if one of the known <graphicFormats> is not
+     *     the file extension of the provided href.
+     *
+     * Parameters:
+     * href - {String}
+     *
+     * Returns:
+     * {String} The graphic format.
+     */
+    getGraphicFormat: function(href) {
+        var format, regex;
+        for(var key in this.graphicFormats) {
+            if(this.graphicFormats[key].test(href)) {
+                format = key;
+                break;
+            }
+        }
+        return format || this.defautlGraphicFormat;
+    },
+    
+    /**
+     * Property: defaultGraphicFormat
+     * {String} If none other can be determined from <getGraphicFormat>, this
+     *     default will be returned.
+     */
+    defaultGraphicFormat: "image/png",
+    
+    /**
+     * Property: graphicFormats
+     * {Object} Mapping of image mime-types to regular extensions matching 
+     *     well-known file extensions.
+     */
+    graphicFormats: {
+        "image/jpeg": /\.jpe?g$/i,
+        "image/gif": /\.gif$/i,
+        "image/png": /\.png$/i
+    },
+
+    /**
+     * Method: write
+     *
+     * Parameters:
+     * sld - {Object} An object representing the SLD.
+     *
+     * Returns:
+     * {DOMElement} The root of an SLD document.
+     */
+    write: function(sld) {
+        return this.writers.sld.StyledLayerDescriptor.apply(this, [sld]);
+    },
+    
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: OpenLayers.Util.applyDefaults({
+        "sld": {
+            "StyledLayerDescriptor": function(sld) {
+                var root = this.createElementNSPlus(
+                    "sld:StyledLayerDescriptor",
+                    {attributes: {
+                        "version": this.VERSION,
+                        "xsi:schemaLocation": this.schemaLocation
+                    }}
+                );
+
+                // For ArcGIS Server it is necessary to define this
+                // at the root level (see ticket:2166).
+                root.setAttribute("xmlns:ogc", this.namespaces.ogc);
+                root.setAttribute("xmlns:gml", this.namespaces.gml);
+
+                // add in optional name
+                if(sld.name) {
+                    this.writeNode("Name", sld.name, root);
+                }
+                // add in optional title
+                if(sld.title) {
+                    this.writeNode("Title", sld.title, root);
+                }
+                // add in optional description
+                if(sld.description) {
+                    this.writeNode("Abstract", sld.description, root);
+                }
+                // add in named layers
+                // allow namedLayers to be an array
+                if(sld.namedLayers instanceof Array) {
+                    for(var i=0, len=sld.namedLayers.length; i<len; ++i) {
+                        this.writeNode("NamedLayer", sld.namedLayers[i], root);
+                    }
+                } else {
+                    for(var name in sld.namedLayers) {
+                        this.writeNode("NamedLayer", sld.namedLayers[name], root);
+                    }
+                }
+                return root;
+            },
+            "Name": function(name) {
+                return this.createElementNSPlus("sld:Name", {value: name});
+            },
+            "Title": function(title) {
+                return this.createElementNSPlus("sld:Title", {value: title});
+            },
+            "Abstract": function(description) {
+                return this.createElementNSPlus(
+                    "sld:Abstract", {value: description}
+                );
+            },
+            "NamedLayer": function(layer) {
+                var node = this.createElementNSPlus("sld:NamedLayer");
+
+                // add in required name
+                this.writeNode("Name", layer.name, node);
+
+                // optional sld:LayerFeatureConstraints here
+
+                // add in named styles
+                if(layer.namedStyles) {
+                    for(var i=0, len=layer.namedStyles.length; i<len; ++i) {
+                        this.writeNode(
+                            "NamedStyle", layer.namedStyles[i], node
+                        );
+                    }
+                }
+                
+                // add in user styles
+                if(layer.userStyles) {
+                    for(var i=0, len=layer.userStyles.length; i<len; ++i) {
+                        this.writeNode(
+                            "UserStyle", layer.userStyles[i], node
+                        );
+                    }
+                }
+                
+                return node;
+            },
+            "NamedStyle": function(name) {
+                var node = this.createElementNSPlus("sld:NamedStyle");
+                this.writeNode("Name", name, node);
+                return node;
+            },
+            "UserStyle": function(style) {
+                var node = this.createElementNSPlus("sld:UserStyle");
+
+                // add in optional name
+                if(style.name) {
+                    this.writeNode("Name", style.name, node);
+                }
+                // add in optional title
+                if(style.title) {
+                    this.writeNode("Title", style.title, node);
+                }
+                // add in optional description
+                if(style.description) {
+                    this.writeNode("Abstract", style.description, node);
+                }
+                
+                // add isdefault
+                if(style.isDefault) {
+                    this.writeNode("IsDefault", style.isDefault, node);
+                }
+                
+                // add FeatureTypeStyles
+                if (this.multipleSymbolizers && style.rules) {
+                    // group style objects by symbolizer zIndex
+                    var rulesByZ = {
+                        0: []
+                    };
+                    var zValues = [0];
+                    var rule, ruleMap, symbolizer, zIndex, clone;
+                    for (var i=0, ii=style.rules.length; i<ii; ++i) {
+                        rule = style.rules[i];
+                        if (rule.symbolizers) {
+                            ruleMap = {};
+                            for (var j=0, jj=rule.symbolizers.length; j<jj; ++j) {
+                                symbolizer = rule.symbolizers[j];
+                                zIndex = symbolizer.zIndex;
+                                if (!(zIndex in ruleMap)) {
+                                    clone = rule.clone();
+                                    clone.symbolizers = [];
+                                    ruleMap[zIndex] = clone;
+                                }
+                                ruleMap[zIndex].symbolizers.push(symbolizer.clone());
+                            }
+                            for (zIndex in ruleMap) {
+                                if (!(zIndex in rulesByZ)) {
+                                    zValues.push(zIndex);
+                                    rulesByZ[zIndex] = [];
+                                }
+                                rulesByZ[zIndex].push(ruleMap[zIndex]);
+                            }
+                        } else {
+                            // no symbolizers in rule
+                            rulesByZ[0].push(rule.clone());
+                        }
+                    }
+                    // write one FeatureTypeStyle per zIndex
+                    zValues.sort();
+                    var rules;
+                    for (var i=0, ii=zValues.length; i<ii; ++i) {
+                        rules = rulesByZ[zValues[i]];
+                        if (rules.length > 0) {
+                            clone = style.clone();
+                            clone.rules = rulesByZ[zValues[i]];
+                            this.writeNode("FeatureTypeStyle", clone, node);
+                        }
+                    }                    
+                } else {
+                    this.writeNode("FeatureTypeStyle", style, node);
+                }
+                
+                return node;
+            },
+            "IsDefault": function(bool) {
+                return this.createElementNSPlus(
+                    "sld:IsDefault", {value: (bool) ? "1" : "0"}
+                );
+            },
+            "FeatureTypeStyle": function(style) {
+                var node = this.createElementNSPlus("sld:FeatureTypeStyle");
+                
+                // OpenLayers currently stores no Name, Title, Abstract,
+                // FeatureTypeName, or SemanticTypeIdentifier information
+                // related to FeatureTypeStyle
+                
+                // add in rules
+                for(var i=0, len=style.rules.length; i<len; ++i) {
+                    this.writeNode("Rule", style.rules[i], node);
+                }
+                
+                return node;
+            },
+            "Rule": function(rule) {
+                var node = this.createElementNSPlus("sld:Rule");
+
+                // add in optional name
+                if(rule.name) {
+                    this.writeNode("Name", rule.name, node);
+                }
+                // add in optional title
+                if(rule.title) {
+                    this.writeNode("Title", rule.title, node);
+                }
+                // add in optional description
+                if(rule.description) {
+                    this.writeNode("Abstract", rule.description, node);
+                }
+                
+                // add in LegendGraphic here
+                
+                // add in optional filters
+                if(rule.elseFilter) {
+                    this.writeNode("ElseFilter", null, node);
+                } else if(rule.filter) {
+                    this.writeNode("ogc:Filter", rule.filter, node);
+                }
+                
+                // add in scale limits
+                if(rule.minScaleDenominator != undefined) {
+                    this.writeNode(
+                        "MinScaleDenominator", rule.minScaleDenominator, node
+                    );
+                }
+                if(rule.maxScaleDenominator != undefined) {
+                    this.writeNode(
+                        "MaxScaleDenominator", rule.maxScaleDenominator, node
+                    );
+                }
+                
+                var type, symbolizer;
+                if (this.multipleSymbolizers && rule.symbolizers) {
+                    var symbolizer;
+                    for (var i=0, ii=rule.symbolizers.length; i<ii; ++i) {
+                        symbolizer = rule.symbolizers[i];
+                        type = symbolizer.CLASS_NAME.split(".").pop();
+                        this.writeNode(
+                            type + "Symbolizer", symbolizer, node
+                        );
+                    }
+                } else {
+                    // add in symbolizers (relies on geometry type keys)
+                    var types = OpenLayers.Style.SYMBOLIZER_PREFIXES;
+                    for(var i=0, len=types.length; i<len; ++i) {
+                        type = types[i];
+                        symbolizer = rule.symbolizer[type];
+                        if(symbolizer) {
+                            this.writeNode(
+                                type + "Symbolizer", symbolizer, node
+                            );
+                        }
+                    }
+                }
+                return node;
+
+            },
+            "ElseFilter": function() {
+                return this.createElementNSPlus("sld:ElseFilter");
+            },
+            "MinScaleDenominator": function(scale) {
+                return this.createElementNSPlus(
+                    "sld:MinScaleDenominator", {value: scale}
+                );
+            },
+            "MaxScaleDenominator": function(scale) {
+                return this.createElementNSPlus(
+                    "sld:MaxScaleDenominator", {value: scale}
+                );
+            },
+            "LineSymbolizer": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:LineSymbolizer");
+                this.writeNode("Stroke", symbolizer, node);
+                return node;
+            },
+            "Stroke": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:Stroke");
+
+                // GraphicFill here
+                // GraphicStroke here
+
+                // add in CssParameters
+                if(symbolizer.strokeColor != undefined) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "strokeColor"},
+                        node
+                    );
+                }
+                if(symbolizer.strokeOpacity != undefined) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "strokeOpacity"},
+                        node
+                    );
+                }
+                if(symbolizer.strokeWidth != undefined) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "strokeWidth"},
+                        node
+                    );
+                }
+                if(symbolizer.strokeDashstyle != undefined && symbolizer.strokeDashstyle !== "solid") {
+                    // assumes valid stroke-dasharray value
+                    this.writeNode(
+                        "CssParameter", 
+                        {symbolizer: symbolizer, key: "strokeDashstyle"},
+                        node
+                    );
+                }
+                if(symbolizer.strokeLinecap != undefined) {
+                    this.writeNode(
+                        "CssParameter", 
+                        {symbolizer: symbolizer, key: "strokeLinecap"},
+                        node
+                    );
+                }
+                return node;
+            },
+            "CssParameter": function(obj) {
+                // not handling ogc:expressions for now
+                return this.createElementNSPlus("sld:CssParameter", {
+                    attributes: {name: this.getCssProperty(obj.key)},
+                    value: obj.symbolizer[obj.key]
+                });
+            },
+            "TextSymbolizer": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:TextSymbolizer");
+                // add in optional Label
+                if(symbolizer.label != null) {
+                    this.writeNode("Label", symbolizer.label, node);
+                }
+                // add in optional Font
+                if(symbolizer.fontFamily != null ||
+                   symbolizer.fontSize != null ||
+                   symbolizer.fontWeight != null ||
+                   symbolizer.fontStyle != null) {
+                    this.writeNode("Font", symbolizer, node);
+                }
+                // add in optional Halo
+                if(symbolizer.haloRadius != null ||
+                   symbolizer.haloColor != null ||
+                   symbolizer.haloOpacity != null) {
+                    this.writeNode("Halo", symbolizer, node);
+                }
+                // add in optional Fill
+                if(symbolizer.fillColor != null ||
+                   symbolizer.fillOpacity != null) {
+                    this.writeNode("Fill", symbolizer, node);
+                }
+                return node;
+            },
+            "Font": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:Font");
+                // add in CssParameters
+                if(symbolizer.fontFamily) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "fontFamily"},
+                        node
+                    );
+                }
+                if(symbolizer.fontSize) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "fontSize"},
+                        node
+                    );
+                }
+                if(symbolizer.fontWeight) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "fontWeight"},
+                        node
+                    );
+                }
+                if(symbolizer.fontStyle) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "fontStyle"},
+                        node
+                    );
+                }
+                return node;
+            },
+            "Label": function(label) {
+                // only the simplest of ogc:expression handled
+                // {label: "some text and a ${propertyName}"}
+                var node = this.createElementNSPlus("sld:Label");
+                var tokens = label.split("${");
+                node.appendChild(this.createTextNode(tokens[0]));
+                var item, last;
+                for(var i=1, len=tokens.length; i<len; i++) {
+                    item = tokens[i];
+                    last = item.indexOf("}"); 
+                    if(last > 0) {
+                        this.writeNode(
+                            "ogc:PropertyName",
+                            {property: item.substring(0, last)},
+                            node
+                        );
+                        node.appendChild(
+                            this.createTextNode(item.substring(++last))
+                        );
+                    } else {
+                        // no ending }, so this is a literal ${
+                        node.appendChild(
+                            this.createTextNode("${" + item)
+                        );
+                    }
+                }
+                return node;
+            },
+            "Halo": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:Halo");
+                if(symbolizer.haloRadius) {
+                    this.writeNode("Radius", symbolizer.haloRadius, node);
+                }
+                if(symbolizer.haloColor || symbolizer.haloOpacity) {
+                    this.writeNode("Fill", {
+                        fillColor: symbolizer.haloColor,
+                        fillOpacity: symbolizer.haloOpacity
+                    }, node);
+                }
+                return node;
+            },
+            "Radius": function(value) {
+                return this.createElementNSPlus("sld:Radius", {
+                    value: value
+                });
+            },
+            "RasterSymbolizer": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:RasterSymbolizer");
+                if (symbolizer.geometry) {
+                    this.writeNode("Geometry", symbolizer.geometry, node);
+                }
+                if (symbolizer.opacity) {
+                    this.writeNode("Opacity", symbolizer.opacity, node);
+                }
+                if (symbolizer.colorMap) {
+                    this.writeNode("ColorMap", symbolizer.colorMap, node);
+                }
+                return node;
+            },
+            "Geometry": function(geometry) {
+                var node = this.createElementNSPlus("sld:Geometry");
+                if (geometry.property) {
+                    this.writeNode("ogc:PropertyName", geometry, node);
+                }
+                return node;
+            },
+            "ColorMap": function(colorMap) {
+                var node = this.createElementNSPlus("sld:ColorMap");
+                for (var i=0, len=colorMap.length; i<len; ++i) {
+                    this.writeNode("ColorMapEntry", colorMap[i], node);
+                }
+                return node;
+            },
+            "ColorMapEntry": function(colorMapEntry) {
+                var node = this.createElementNSPlus("sld:ColorMapEntry");
+                var a = colorMapEntry;
+                node.setAttribute("color", a.color);
+                a.opacity !== undefined && node.setAttribute("opacity",
+                    parseFloat(a.opacity));
+                a.quantity !== undefined && node.setAttribute("quantity",
+                    parseFloat(a.quantity));
+                a.label !== undefined && node.setAttribute("label", a.label);
+                return node;
+            },
+            "PolygonSymbolizer": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:PolygonSymbolizer");
+                if(symbolizer.fill !== false) {
+                    this.writeNode("Fill", symbolizer, node);
+                }
+                if(symbolizer.stroke !== false) {
+                    this.writeNode("Stroke", symbolizer, node);
+                }
+                return node;
+            },
+            "Fill": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:Fill");
+                
+                // GraphicFill here
+                
+                // add in CssParameters
+                if(symbolizer.fillColor) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "fillColor"},
+                        node
+                    );
+                }
+                if(symbolizer.fillOpacity != null) {
+                    this.writeNode(
+                        "CssParameter",
+                        {symbolizer: symbolizer, key: "fillOpacity"},
+                        node
+                    );
+                }
+                return node;
+            },
+            "PointSymbolizer": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:PointSymbolizer");
+                this.writeNode("Graphic", symbolizer, node);
+                return node;
+            },
+            "Graphic": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:Graphic");
+                if(symbolizer.externalGraphic != undefined) {
+                    this.writeNode("ExternalGraphic", symbolizer, node);
+                } else {
+                    this.writeNode("Mark", symbolizer, node);
+                }
+                
+                if(symbolizer.graphicOpacity != undefined) {
+                    this.writeNode("Opacity", symbolizer.graphicOpacity, node);
+                }
+                if(symbolizer.pointRadius != undefined) {
+                    this.writeNode("Size", symbolizer.pointRadius * 2, node);
+                }
+                if(symbolizer.rotation != undefined) {
+                    this.writeNode("Rotation", symbolizer.rotation, node);
+                }
+                return node;
+            },
+            "ExternalGraphic": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:ExternalGraphic");
+                this.writeNode(
+                    "OnlineResource", symbolizer.externalGraphic, node
+                );
+                var format = symbolizer.graphicFormat ||
+                             this.getGraphicFormat(symbolizer.externalGraphic);
+                this.writeNode("Format", format, node);
+                return node;
+            },
+            "Mark": function(symbolizer) {
+                var node = this.createElementNSPlus("sld:Mark");
+                if(symbolizer.graphicName) {
+                    this.writeNode("WellKnownName", symbolizer.graphicName, node);
+                }
+                if (symbolizer.fill !== false) {
+                    this.writeNode("Fill", symbolizer, node);
+                }
+                if (symbolizer.stroke !== false) {
+                    this.writeNode("Stroke", symbolizer, node);
+                }
+                return node;
+            },
+            "WellKnownName": function(name) {
+                return this.createElementNSPlus("sld:WellKnownName", {
+                    value: name
+                });
+            },
+            "Opacity": function(value) {
+                return this.createElementNSPlus("sld:Opacity", {
+                    value: value
+                });
+            },
+            "Size": function(value) {
+                return this.createElementNSPlus("sld:Size", {
+                    value: value
+                });
+            },
+            "Rotation": function(value) {
+                return this.createElementNSPlus("sld:Rotation", {
+                    value: value
+                });
+            },
+            "OnlineResource": function(href) {
+                return this.createElementNSPlus("sld:OnlineResource", {
+                    attributes: {
+                        "xlink:type": "simple",
+                        "xlink:href": href
+                    }
+                });
+            },
+            "Format": function(format) {
+                return this.createElementNSPlus("sld:Format", {
+                    value: format
+                });
+            }
+        }
+    }, OpenLayers.Format.Filter.v1_0_0.prototype.writers),
+    
+    CLASS_NAME: "OpenLayers.Format.SLD.v1" 
+
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Format/SLD/v1_0_0.js b/lib/OpenLayers/Format/SLD/v1_0_0.js
new file mode 100644
index 0000000..11378d9
--- /dev/null
+++ b/lib/OpenLayers/Format/SLD/v1_0_0.js
@@ -0,0 +1,51 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/SLD/v1.js
+ * @requires OpenLayers/Format/Filter/v1_0_0.js
+ */
+
+/**
+ * Class: OpenLayers.Format.SLD.v1_0_0
+ * Write SLD version 1.0.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.SLD.v1>
+ */
+OpenLayers.Format.SLD.v1_0_0 = OpenLayers.Class(
+    OpenLayers.Format.SLD.v1, {
+    
+    /**
+     * Constant: VERSION
+     * {String} 1.0.0
+     */
+    VERSION: "1.0.0",
+    
+    /**
+     * Property: schemaLocation
+     * {String} http://www.opengis.net/sld
+     *   http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd
+     */
+    schemaLocation: "http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd",
+
+    /**
+     * Constructor: OpenLayers.Format.SLD.v1_0_0
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.SLD> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.SLD.v1.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+
+    CLASS_NAME: "OpenLayers.Format.SLD.v1_0_0" 
+
+});
diff --git a/lib/OpenLayers/Format/SOSCapabilities.js b/lib/OpenLayers/Format/SOSCapabilities.js
new file mode 100644
index 0000000..381145d
--- /dev/null
+++ b/lib/OpenLayers/Format/SOSCapabilities.js
@@ -0,0 +1,83 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ */
+ 
+/**
+ * Class: OpenLayers.Format.SOSCapabilities
+ * Read SOS Capabilities.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.SOSCapabilities = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "1.0.0".
+     */
+    defaultVersion: "1.0.0",
+    
+    /**
+     * APIProperty: version
+     * {String} Specify a version string if one is known.
+     */
+    version: null,
+
+    /**
+     * Property: parser
+     * {<OpenLayers.Format>} A cached versioned format used for reading.
+     */
+    parser: null,     
+
+    /**
+     * Constructor: OpenLayers.Format.SOSCapabilities
+     * Create a new parser for SOS capabilities.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read capabilities data from a string, and return information about
+     * the service (offering and observedProperty mostly).
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Object} Info about the SOS
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        var version = this.version || root.getAttribute("version") || this.defaultVersion;
+        if(!this.parser || this.parser.version !== version) {
+            var constr = OpenLayers.Format.SOSCapabilities[
+                "v" + version.replace(/\./g, "_")
+            ];
+            if(!constr) {
+                throw "Can't find a SOS capabilities parser for version " + version;
+            }
+            var parser = new constr(this.options);
+        }
+        var capabilities = parser.read(data);
+        capabilities.version = version;
+        return capabilities; 
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.SOSCapabilities" 
+
+});
diff --git a/lib/OpenLayers/Format/SOSCapabilities/v1_0_0.js b/lib/OpenLayers/Format/SOSCapabilities/v1_0_0.js
new file mode 100644
index 0000000..b6a8382
--- /dev/null
+++ b/lib/OpenLayers/Format/SOSCapabilities/v1_0_0.js
@@ -0,0 +1,158 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/SOSCapabilities.js
+ * @requires OpenLayers/Format/OWSCommon/v1_1_0.js
+ * @requires OpenLayers/Format/GML/v3.js
+ */
+
+/**
+ * Class: OpenLayers.Format.SOSCapabilities.v1_0_0
+ * Read SOS Capabilities version 1.0.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.SOSCapabilities>
+ */
+OpenLayers.Format.SOSCapabilities.v1_0_0 = OpenLayers.Class(
+    OpenLayers.Format.SOSCapabilities, {
+
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        sos: "http://www.opengis.net/sos/1.0",
+        gml: "http://www.opengis.net/gml",
+        xlink: "http://www.w3.org/1999/xlink"
+    },
+
+    /**
+     * Property: regExes
+     * Compiled regular expressions for manipulating strings.
+     */
+    regExes: {
+        trimSpace: (/^\s*|\s*$/g),
+        removeSpace: (/\s*/g),
+        splitSpace: (/\s+/),
+        trimComma: (/\s*,\s*/g)
+    },
+    
+    /**
+     * Constructor: OpenLayers.Format.SOSCapabilities.v1_0_0
+     * Create a new parser for SOS capabilities version 1.0.0. 
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read capabilities data from a string, and return info about the SOS.
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Object} Information about the SOS service.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var capabilities = {};
+        this.readNode(data, capabilities);
+        return capabilities;
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "gml": OpenLayers.Util.applyDefaults({
+            "name": function(node, obj) {
+                obj.name = this.getChildValue(node);
+            },
+            "TimePeriod": function(node, obj) {
+                obj.timePeriod = {};
+                this.readChildNodes(node, obj.timePeriod);
+            },
+            "beginPosition": function(node, timePeriod) {
+                timePeriod.beginPosition = this.getChildValue(node);
+            },
+            "endPosition": function(node, timePeriod) {
+                timePeriod.endPosition = this.getChildValue(node);
+            }
+        }, OpenLayers.Format.GML.v3.prototype.readers["gml"]),
+        "sos": {
+            "Capabilities": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Contents": function(node, obj) {
+                obj.contents = {};
+                this.readChildNodes(node, obj.contents);
+            },
+            "ObservationOfferingList": function(node, contents) {
+                contents.offeringList = {};
+                this.readChildNodes(node, contents.offeringList);
+            },
+            "ObservationOffering": function(node, offeringList) {
+                var id = this.getAttributeNS(node, this.namespaces.gml, "id");
+                offeringList[id] = {
+                    procedures: [],
+                    observedProperties: [],
+                    featureOfInterestIds: [],
+                    responseFormats: [],
+                    resultModels: [],
+                    responseModes: []
+                };
+                this.readChildNodes(node, offeringList[id]);
+            },
+            "time": function(node, offering) {
+                offering.time = {};
+                this.readChildNodes(node, offering.time);
+            },
+            "procedure": function(node, offering) {
+                offering.procedures.push(this.getAttributeNS(node, 
+                    this.namespaces.xlink, "href"));
+            },
+            "observedProperty": function(node, offering) {
+                offering.observedProperties.push(this.getAttributeNS(node, 
+                    this.namespaces.xlink, "href"));
+            },
+            "featureOfInterest": function(node, offering) {
+                offering.featureOfInterestIds.push(this.getAttributeNS(node, 
+                    this.namespaces.xlink, "href"));
+            },
+            "responseFormat": function(node, offering) {
+                offering.responseFormats.push(this.getChildValue(node));
+            },
+            "resultModel": function(node, offering) {
+                offering.resultModels.push(this.getChildValue(node));
+            },
+            "responseMode": function(node, offering) {
+                offering.responseModes.push(this.getChildValue(node));;
+            }
+        },
+        "ows": OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers["ows"]
+    },    
+    
+    CLASS_NAME: "OpenLayers.Format.SOSCapabilities.v1_0_0" 
+
+});
diff --git a/lib/OpenLayers/Format/SOSGetFeatureOfInterest.js b/lib/OpenLayers/Format/SOSGetFeatureOfInterest.js
new file mode 100644
index 0000000..1487a61
--- /dev/null
+++ b/lib/OpenLayers/Format/SOSGetFeatureOfInterest.js
@@ -0,0 +1,193 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/GML/v3.js
+ */
+
+/**
+ * Class: OpenLayers.Format.SOSGetFeatureOfInterest
+ * Read and write SOS GetFeatureOfInterest. This is used to get to
+ * the location of the features (stations). The stations can have 1 or more
+ * sensors.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.SOSGetFeatureOfInterest = OpenLayers.Class(
+    OpenLayers.Format.XML, {
+    
+    /**
+     * Constant: VERSION
+     * {String} 1.0.0
+     */
+    VERSION: "1.0.0",
+
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        sos: "http://www.opengis.net/sos/1.0",
+        gml: "http://www.opengis.net/gml",
+        sa: "http://www.opengis.net/sampling/1.0",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+
+    /**
+     * Property: schemaLocation
+     * {String} Schema location
+     */
+    schemaLocation: "http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd",
+
+    /**
+     * Property: defaultPrefix
+     */
+    defaultPrefix: "sos",
+
+    /**
+     * Property: regExes
+     * Compiled regular expressions for manipulating strings.
+     */
+    regExes: {
+        trimSpace: (/^\s*|\s*$/g),
+        removeSpace: (/\s*/g),
+        splitSpace: (/\s+/),
+        trimComma: (/\s*,\s*/g)
+    },
+    
+    /**
+     * Constructor: OpenLayers.Format.SOSGetFeatureOfInterest
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Parse a GetFeatureOfInterest response and return an array of features
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Feature.Vector>)} An array of features. 
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+
+        var info = {features: []};
+        this.readNode(data, info);
+       
+        var features = [];
+        for (var i=0, len=info.features.length; i<len; i++) {
+            var container = info.features[i];
+            // reproject features if needed
+            if(this.internalProjection && this.externalProjection &&
+                container.components[0]) {
+                    container.components[0].transform(
+                        this.externalProjection, this.internalProjection
+                    );
+            }             
+            var feature = new OpenLayers.Feature.Vector(
+                container.components[0], container.attributes);
+            features.push(feature);
+        }
+        return features;
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "sa": {
+            "SamplingPoint": function(node, obj) {
+                // sampling point can also be without a featureMember if 
+                // there is only 1
+                if (!obj.attributes) {
+                    var feature = {attributes: {}};
+                    obj.features.push(feature);
+                    obj = feature;
+                }
+                obj.attributes.id = this.getAttributeNS(node, 
+                    this.namespaces.gml, "id");
+                this.readChildNodes(node, obj);
+            },
+            "position": function (node, obj) {
+                this.readChildNodes(node, obj);
+            }
+        },
+        "gml": OpenLayers.Util.applyDefaults({
+            "FeatureCollection": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "featureMember": function(node, obj) {
+                var feature = {attributes: {}};
+                obj.features.push(feature);
+                this.readChildNodes(node, feature);
+            },
+            "name": function(node, obj) {
+                obj.attributes.name = this.getChildValue(node);
+            },
+            "pos": function(node, obj) {
+                // we need to parse the srsName to get to the 
+                // externalProjection, that's why we cannot use
+                // GML v3 for this
+                if (!this.externalProjection) {
+                    this.externalProjection = new OpenLayers.Projection(
+                        node.getAttribute("srsName"));
+                }
+             OpenLayers.Format.GML.v3.prototype.readers.gml.pos.apply(
+                    this, [node, obj]);
+            }
+        }, OpenLayers.Format.GML.v3.prototype.readers.gml)
+    },
+    
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "sos": {
+            "GetFeatureOfInterest": function(options) {
+                var node = this.createElementNSPlus("GetFeatureOfInterest", {
+                    attributes: {
+                        version: this.VERSION,
+                        service: 'SOS',
+                        "xsi:schemaLocation": this.schemaLocation
+                    } 
+                }); 
+                for (var i=0, len=options.fois.length; i<len; i++) {
+                    this.writeNode("FeatureOfInterestId", {foi: options.fois[i]}, node);
+                }
+                return node; 
+            },
+            "FeatureOfInterestId": function(options) {
+                var node = this.createElementNSPlus("FeatureOfInterestId", {value: options.foi});
+                return node;
+            }
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Format.SOSGetFeatureOfInterest" 
+
+});
diff --git a/lib/OpenLayers/Format/SOSGetObservation.js b/lib/OpenLayers/Format/SOSGetObservation.js
new file mode 100644
index 0000000..c6823cc
--- /dev/null
+++ b/lib/OpenLayers/Format/SOSGetObservation.js
@@ -0,0 +1,262 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/GML.js
+ * @requires OpenLayers/Format/GML/v3.js
+ */
+
+/**
+ * Class: OpenLayers.Format.SOSGetObservation
+ * Read and write SOS GetObersation (to get the actual values from a sensor) 
+ *     version 1.0.0
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.SOSGetObservation = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        ows: "http://www.opengis.net/ows",
+        gml: "http://www.opengis.net/gml",
+        sos: "http://www.opengis.net/sos/1.0",
+        ogc: "http://www.opengis.net/ogc",
+        om: "http://www.opengis.net/om/1.0",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+
+    /**
+     * Property: regExes
+     * Compiled regular expressions for manipulating strings.
+     */
+    regExes: {
+        trimSpace: (/^\s*|\s*$/g),
+        removeSpace: (/\s*/g),
+        splitSpace: (/\s+/),
+        trimComma: (/\s*,\s*/g)
+    },
+
+    /**
+     * Constant: VERSION
+     * {String} 1.0.0
+     */
+    VERSION: "1.0.0",
+
+    /**
+     * Property: schemaLocation
+     * {String} Schema location
+     */
+    schemaLocation: "http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd",
+
+    /**
+     * Property: defaultPrefix
+     */
+    defaultPrefix: "sos",
+
+    /**
+     * Constructor: OpenLayers.Format.SOSGetObservation
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * Method: read
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Object} An object containing the measurements
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var info = {measurements: []};
+        this.readNode(data, info);
+        return info;
+    },
+
+    /**
+     * Method: write
+     *
+     * Parameters:
+     * options - {Object} Optional object.
+     *
+     * Returns:
+     * {String} An SOS GetObservation request XML string.
+     */
+    write: function(options) {
+        var node = this.writeNode("sos:GetObservation", options);
+        node.setAttribute("xmlns:om", this.namespaces.om);
+        this.setAttributeNS(
+            node, this.namespaces.xsi,
+            "xsi:schemaLocation", this.schemaLocation
+        );
+        return OpenLayers.Format.XML.prototype.write.apply(this, [node]);
+    }, 
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "om": {
+            "ObservationCollection": function(node, obj) {
+                obj.id = this.getAttributeNS(node, this.namespaces.gml, "id");
+                this.readChildNodes(node, obj);
+            },
+            "member": function(node, observationCollection) {
+                this.readChildNodes(node, observationCollection);
+            },
+            "Measurement": function(node, observationCollection) {
+                var measurement = {};
+                observationCollection.measurements.push(measurement);
+                this.readChildNodes(node, measurement);
+            },
+            "samplingTime": function(node, measurement) {
+                var samplingTime = {};
+                measurement.samplingTime = samplingTime;
+                this.readChildNodes(node, samplingTime);
+            },
+            "observedProperty": function(node, measurement) {
+                measurement.observedProperty = 
+                    this.getAttributeNS(node, this.namespaces.xlink, "href");
+                this.readChildNodes(node, measurement);
+            },
+            "procedure": function(node, measurement) {
+                measurement.procedure = 
+                    this.getAttributeNS(node, this.namespaces.xlink, "href");
+                this.readChildNodes(node, measurement);
+            },
+            "result": function(node, measurement) {
+                var result = {};
+                measurement.result = result;
+                if (this.getChildValue(node) !== '') {
+                    result.value = this.getChildValue(node);
+                    result.uom = node.getAttribute("uom");
+                } else {
+                    this.readChildNodes(node, result);
+                }
+            }
+        },
+        "gml": OpenLayers.Util.applyDefaults({
+            "TimeInstant": function(node, samplingTime) {
+               var timeInstant = {};
+                samplingTime.timeInstant = timeInstant;
+                this.readChildNodes(node, timeInstant);
+            },
+            "timePosition": function(node, timeInstant) {
+                timeInstant.timePosition = this.getChildValue(node);
+            }
+        }, OpenLayers.Format.GML.v3.prototype.readers.gml)
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "sos": {
+            "GetObservation": function(options) {
+                var node = this.createElementNSPlus("GetObservation", {
+                    attributes: {
+                        version: this.VERSION,
+                        service: 'SOS'
+                    } 
+                }); 
+                this.writeNode("offering", options, node);
+                this.writeNode("eventTime", options, node);
+                this.writeNode("procedure", options, node);
+                this.writeNode("observedProperty", options, node);
+                this.writeNode("responseFormat", options, node);
+                this.writeNode("resultModel", options, node);                                
+                this.writeNode("responseMode", options, node);
+                return node; 
+            },
+            "responseFormat": function(options) {
+                return this.createElementNSPlus("responseFormat", 
+                    {value: options.responseFormat});
+            },
+            "procedure": function(options) {
+                return this.createElementNSPlus("procedure", 
+                    {value: options.procedure});
+            },
+            "offering": function(options) {
+                return this.createElementNSPlus("offering", {value: 
+                    options.offering});
+            },
+            "observedProperty": function(options) {
+                return this.createElementNSPlus("observedProperty", 
+                    {value: options.observedProperty});
+            },
+            "eventTime": function(options) {
+                var node = this.createElementNSPlus("eventTime");
+                if (options.eventTime === 'latest') {
+                    this.writeNode("ogc:TM_Equals", options, node);
+                }
+                return node;
+            },
+            "resultModel": function(options) {
+                return this.createElementNSPlus("resultModel", {value: 
+                    options.resultModel});
+            },
+            "responseMode": function(options) {
+                return this.createElementNSPlus("responseMode", {value: 
+                    options.responseMode});
+            }
+        },
+        "ogc": {
+            "TM_Equals": function(options) {
+                var node = this.createElementNSPlus("ogc:TM_Equals");
+                this.writeNode("ogc:PropertyName", {property: 
+                    "urn:ogc:data:time:iso8601"}, node);
+                if (options.eventTime === 'latest') {
+                    this.writeNode("gml:TimeInstant", {value: 'latest'}, node);
+                }
+                return node;
+            },
+            "PropertyName": function(options) {
+                return this.createElementNSPlus("ogc:PropertyName", 
+                    {value: options.property});
+            }
+        },
+        "gml": {
+            "TimeInstant": function(options) {
+                var node = this.createElementNSPlus("gml:TimeInstant");
+                this.writeNode("gml:timePosition", options, node);
+                return node;
+            },
+            "timePosition": function(options) {
+                var node = this.createElementNSPlus("gml:timePosition", 
+                    {value: options.value});
+                return node;
+            }
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.SOSGetObservation" 
+
+});
diff --git a/lib/OpenLayers/Format/Text.js b/lib/OpenLayers/Format/Text.js
new file mode 100644
index 0000000..6177790
--- /dev/null
+++ b/lib/OpenLayers/Format/Text.js
@@ -0,0 +1,152 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Geometry/Point.js
+ */
+
+/**
+ * Class: OpenLayers.Format.Text
+ * Read Text format. Create a new instance with the <OpenLayers.Format.Text>
+ *     constructor. This reads text which is formatted like CSV text, using
+ *     tabs as the seperator by default. It provides parsing of data originally
+ *     used in the MapViewerService, described on the wiki. This Format is used
+ *     by the <OpenLayers.Layer.Text> class.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format>
+ */
+OpenLayers.Format.Text = OpenLayers.Class(OpenLayers.Format, {
+    
+    /**
+     * APIProperty: defaultStyle
+     * defaultStyle allows one to control the default styling of the features.
+     *    It should be a symbolizer hash. By default, this is set to match the
+     *    Layer.Text behavior, which is to use the default OpenLayers Icon.
+     */
+    defaultStyle: null,
+     
+    /**
+     * APIProperty: extractStyles
+     * set to true to extract styles from the TSV files, using information
+     * from the image or icon, iconSize and iconOffset fields. This will result
+     * in features with a symbolizer (style) property set, using the
+     * default symbolizer specified in <defaultStyle>. Set to false if you
+     * wish to use a styleMap or OpenLayers.Style options to style your
+     * layer instead.
+     */
+    extractStyles: true,
+
+    /**
+     * Constructor: OpenLayers.Format.Text
+     * Create a new parser for TSV Text.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        options = options || {};
+
+        if(options.extractStyles !== false) {
+            options.defaultStyle = {
+                'externalGraphic': OpenLayers.Util.getImagesLocation() +
+                                                                "marker.png",
+                'graphicWidth': 21,
+                'graphicHeight': 25,
+                'graphicXOffset': -10.5,
+                'graphicYOffset': -12.5
+            };
+        }
+        
+        OpenLayers.Format.prototype.initialize.apply(this, [options]);
+    }, 
+
+    /**
+     * APIMethod: read
+     * Return a list of features from a Tab Seperated Values text string.
+     * 
+     * Parameters:
+     * data - {String} 
+     *
+     * Returns:
+     * An Array of <OpenLayers.Feature.Vector>s
+     */
+    read: function(text) {
+        var lines = text.split('\n');
+        var columns;
+        var features = [];
+        // length - 1 to allow for trailing new line
+        for (var lcv = 0; lcv < (lines.length - 1); lcv++) {
+            var currLine = lines[lcv].replace(/^\s*/,'').replace(/\s*$/,'');
+        
+            if (currLine.charAt(0) != '#') { /* not a comment */
+            
+                if (!columns) {
+                    //First line is columns
+                    columns = currLine.split('\t');
+                } else {
+                    var vals = currLine.split('\t');
+                    var geometry = new OpenLayers.Geometry.Point(0,0);
+                    var attributes = {};
+                    var style = this.defaultStyle ? 
+                        OpenLayers.Util.applyDefaults({}, this.defaultStyle) :
+                        null;  
+                    var icon, iconSize, iconOffset, overflow;
+                    var set = false;
+                    for (var valIndex = 0; valIndex < vals.length; valIndex++) {
+                        if (vals[valIndex]) {
+                            if (columns[valIndex] == 'point') {
+                                var coords = vals[valIndex].split(',');
+                                geometry.y = parseFloat(coords[0]);
+                                geometry.x = parseFloat(coords[1]);
+                                set = true;
+                            } else if (columns[valIndex] == 'lat') {
+                                geometry.y = parseFloat(vals[valIndex]);
+                                set = true;
+                            } else if (columns[valIndex] == 'lon') {
+                                geometry.x = parseFloat(vals[valIndex]);
+                                set = true;
+                            } else if (columns[valIndex] == 'title')
+                                attributes['title'] = vals[valIndex];
+                            else if (columns[valIndex] == 'image' ||
+                                     columns[valIndex] == 'icon' && style) {
+                                style['externalGraphic'] = vals[valIndex];
+                            } else if (columns[valIndex] == 'iconSize' && style) {
+                                var size = vals[valIndex].split(',');
+                                style['graphicWidth'] = parseFloat(size[0]);
+                                style['graphicHeight'] = parseFloat(size[1]);
+                            } else if (columns[valIndex] == 'iconOffset' && style) {
+                                var offset = vals[valIndex].split(',');
+                                style['graphicXOffset'] = parseFloat(offset[0]);
+                                style['graphicYOffset'] = parseFloat(offset[1]);
+                            } else if (columns[valIndex] == 'description') {
+                                attributes['description'] = vals[valIndex];
+                            } else if (columns[valIndex] == 'overflow') {
+                                attributes['overflow'] = vals[valIndex];
+                            } else {
+                                // For StyleMap filtering, allow additional
+                                // columns to be stored as attributes.
+                                attributes[columns[valIndex]] = vals[valIndex];
+                            }    
+                        }
+                    }
+                    if (set) {
+                      if (this.internalProjection && this.externalProjection) {
+                          geometry.transform(this.externalProjection, 
+                                             this.internalProjection); 
+                      }
+                      var feature = new OpenLayers.Feature.Vector(geometry, attributes, style);
+                      features.push(feature);
+                    }
+                }
+            }
+        }
+        return features;
+    },   
+
+    CLASS_NAME: "OpenLayers.Format.Text" 
+});    
diff --git a/lib/OpenLayers/Format/WFS.js b/lib/OpenLayers/Format/WFS.js
new file mode 100644
index 0000000..ca82270
--- /dev/null
+++ b/lib/OpenLayers/Format/WFS.js
@@ -0,0 +1,220 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/GML.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WFS
+ * Read/Write WFS. 
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.GML>
+ */
+OpenLayers.Format.WFS = OpenLayers.Class(OpenLayers.Format.GML, {
+    
+    /** 
+     * Property: layer
+     */
+    layer: null,
+    
+    /**
+     * APIProperty: wfsns
+     */
+    wfsns: "http://www.opengis.net/wfs",
+    
+    /**
+     * Property: ogcns
+     */
+    ogcns: "http://www.opengis.net/ogc",
+    
+    /*
+     * Constructor: OpenLayers.Format.WFS
+     * Create a WFS-T formatter. This requires a layer: that layer should
+     * have two properties: geometry_column and typename. The parser
+     * for this format is subclassed entirely from GML: There is a writer 
+     * only, which uses most of the code from the GML layer, and wraps
+     * it in transactional elements.
+     * 
+     * Parameters: 
+     * options - {Object} 
+     * layer - {<OpenLayers.Layer>} 
+     */
+    
+    initialize: function(options, layer) {
+        OpenLayers.Format.GML.prototype.initialize.apply(this, [options]);
+        this.layer = layer;
+        if (this.layer.featureNS) {
+            this.featureNS = this.layer.featureNS;
+        }    
+        if (this.layer.options.geometry_column) {
+            this.geometryName = this.layer.options.geometry_column;
+        }
+        if (this.layer.options.typename) {
+            this.featureName = this.layer.options.typename;
+        }
+    },
+    
+    /**
+     * Method: write 
+     * Takes a feature list, and generates a WFS-T Transaction 
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     */
+    write: function(features) {
+    
+        var transaction = this.createElementNS(this.wfsns, 'wfs:Transaction');
+        transaction.setAttribute("version","1.0.0");
+        transaction.setAttribute("service","WFS");
+        for (var i=0; i < features.length; i++) {
+            switch (features[i].state) {
+                case OpenLayers.State.INSERT:
+                    transaction.appendChild(this.insert(features[i]));
+                    break;
+                case OpenLayers.State.UPDATE:
+                    transaction.appendChild(this.update(features[i]));
+                    break;
+                case OpenLayers.State.DELETE:
+                    transaction.appendChild(this.remove(features[i]));
+                    break;
+            }
+        }
+        
+        return OpenLayers.Format.XML.prototype.write.apply(this,[transaction]);
+    },
+   
+    /**
+     * Method: createFeatureXML
+     *
+     * Parameters: 
+     * feature - {<OpenLayers.Feature.Vector>}
+     */ 
+    createFeatureXML: function(feature) {
+        var geometryNode = this.buildGeometryNode(feature.geometry);
+        var geomContainer = this.createElementNS(this.featureNS, "feature:" + this.geometryName);
+        geomContainer.appendChild(geometryNode);
+        var featureContainer = this.createElementNS(this.featureNS, "feature:" + this.featureName);
+        featureContainer.appendChild(geomContainer);
+        for(var attr in feature.attributes) {
+            var attrText = this.createTextNode(feature.attributes[attr]); 
+            var nodename = attr;
+            if (attr.search(":") != -1) {
+                nodename = attr.split(":")[1];
+            }    
+            var attrContainer = this.createElementNS(this.featureNS, "feature:" + nodename);
+            attrContainer.appendChild(attrText);
+            featureContainer.appendChild(attrContainer);
+        }    
+        return featureContainer;
+    },
+    
+    /**
+     * Method: insert 
+     * Takes a feature, and generates a WFS-T Transaction "Insert" 
+     *
+     * Parameters: 
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    insert: function(feature) {
+        var insertNode = this.createElementNS(this.wfsns, 'wfs:Insert');
+        insertNode.appendChild(this.createFeatureXML(feature));
+        return insertNode;
+    },
+    
+    /**
+     * Method: update
+     * Takes a feature, and generates a WFS-T Transaction "Update" 
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    update: function(feature) {
+        if (!feature.fid) { OpenLayers.Console.userError(OpenLayers.i18n("noFID")); }
+        var updateNode = this.createElementNS(this.wfsns, 'wfs:Update');
+        updateNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName); 
+        updateNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); 
+
+        var propertyNode = this.createElementNS(this.wfsns, 'wfs:Property');
+        var nameNode = this.createElementNS(this.wfsns, 'wfs:Name');
+        
+        var txtNode = this.createTextNode(this.geometryName);
+        nameNode.appendChild(txtNode);
+        propertyNode.appendChild(nameNode);
+        
+        var valueNode = this.createElementNS(this.wfsns, 'wfs:Value');
+        
+        var geometryNode = this.buildGeometryNode(feature.geometry);
+        
+        if(feature.layer){
+            geometryNode.setAttribute(
+                "srsName", feature.layer.projection.getCode()
+            );
+        }
+        
+        valueNode.appendChild(geometryNode);
+        
+        propertyNode.appendChild(valueNode);
+        updateNode.appendChild(propertyNode);
+        
+         // add in attributes
+        for(var propName in feature.attributes) {
+            propertyNode = this.createElementNS(this.wfsns, 'wfs:Property');
+            nameNode = this.createElementNS(this.wfsns, 'wfs:Name');
+            nameNode.appendChild(this.createTextNode(propName));
+            propertyNode.appendChild(nameNode);
+            valueNode = this.createElementNS(this.wfsns, 'wfs:Value');
+            valueNode.appendChild(this.createTextNode(feature.attributes[propName]));
+            propertyNode.appendChild(valueNode);
+            updateNode.appendChild(propertyNode);
+        }
+        
+        
+        var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter');
+        var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId');
+        filterIdNode.setAttribute("fid", feature.fid);
+        filterNode.appendChild(filterIdNode);
+        updateNode.appendChild(filterNode);
+
+        return updateNode;
+    },
+    
+    /**
+     * Method: remove 
+     * Takes a feature, and generates a WFS-T Transaction "Delete" 
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    remove: function(feature) {
+        if (!feature.fid) { 
+            OpenLayers.Console.userError(OpenLayers.i18n("noFID")); 
+            return false; 
+        }
+        var deleteNode = this.createElementNS(this.wfsns, 'wfs:Delete');
+        deleteNode.setAttribute("typeName", this.featurePrefix + ':' + this.featureName); 
+        deleteNode.setAttribute("xmlns:" + this.featurePrefix, this.featureNS); 
+
+        var filterNode = this.createElementNS(this.ogcns, 'ogc:Filter');
+        var filterIdNode = this.createElementNS(this.ogcns, 'ogc:FeatureId');
+        filterIdNode.setAttribute("fid", feature.fid);
+        filterNode.appendChild(filterIdNode);
+        deleteNode.appendChild(filterNode);
+
+        return deleteNode;
+    },
+
+    /**
+     * APIMethod: destroy
+     * Remove ciruclar ref to layer 
+     */
+    destroy: function() {
+        this.layer = null;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WFS" 
+});    
diff --git a/lib/OpenLayers/Format/WFSCapabilities.js b/lib/OpenLayers/Format/WFSCapabilities.js
new file mode 100644
index 0000000..ac4f698
--- /dev/null
+++ b/lib/OpenLayers/Format/WFSCapabilities.js
@@ -0,0 +1,80 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WFSCapabilities
+ * Read WFS Capabilities.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WFSCapabilities = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "1.1.0".
+     */
+    defaultVersion: "1.1.0",
+    
+    /**
+     * APIProperty: version
+     * {String} Specify a version string if one is known.
+     */
+    version: null,
+
+    /**
+     * Constructor: OpenLayers.Format.WFSCapabilities
+     * Create a new parser for WFS capabilities.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read capabilities data from a string, and return a list of layers. 
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array} List of named layers.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        var version = this.version;
+        if(!version) {
+            version = root.getAttribute("version");
+            if(!version) {
+                version = this.defaultVersion;
+            }
+        }
+        var constr = OpenLayers.Format.WFSCapabilities[
+            "v" + version.replace(/\./g, "_")
+        ];
+        if(!constr) {
+            throw "Can't find a WFS capabilities parser for version " + version;
+        }
+        var parser = new constr(this.options);
+        var capabilities = parser.read(data);
+        capabilities.version = version;
+        return capabilities;
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WFSCapabilities" 
+
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Format/WFSCapabilities/v1.js b/lib/OpenLayers/Format/WFSCapabilities/v1.js
new file mode 100644
index 0000000..8ff20c6
--- /dev/null
+++ b/lib/OpenLayers/Format/WFSCapabilities/v1.js
@@ -0,0 +1,126 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WFSCapabilities.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WFSCapabilities.v1
+ * Abstract class not to be instantiated directly.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WFSCapabilities.v1 = OpenLayers.Class(
+    OpenLayers.Format.WFSCapabilities, {
+    
+    /**
+     * Constructor: OpenLayers.Format.WFSCapabilities.v1_1
+     * Create an instance of one of the subclasses.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read capabilities data from a string, and return a list of layers. 
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array} List of named layers.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var capabilities = {};
+        var root = data.documentElement;
+        this.runChildNodes(capabilities, root);
+        return capabilities;
+    },
+    
+    /**
+     * Method: runChildNodes
+     */
+    runChildNodes: function(obj, node) {
+        var children = node.childNodes;
+        var childNode, processor;
+        for(var i=0; i<children.length; ++i) {
+            childNode = children[i];
+            if(childNode.nodeType == 1) {
+                processor = this["read_cap_" + childNode.nodeName];
+                if(processor) {
+                    processor.apply(this, [obj, childNode]);
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: read_cap_FeatureTypeList
+     */
+    read_cap_FeatureTypeList: function(request, node) {
+        var featureTypeList = {
+            featureTypes: []
+        };
+        this.runChildNodes(featureTypeList, node);
+        request.featureTypeList = featureTypeList;
+    },
+    
+    /**
+     * Method: read_cap_FeatureType
+     */
+    read_cap_FeatureType: function(featureTypeList, node, parentLayer) {
+        var featureType = {};
+        this.runChildNodes(featureType, node);
+        featureTypeList.featureTypes.push(featureType);
+    },
+    
+    /**
+     * Method: read_cap_Name
+     */
+    read_cap_Name: function(obj, node) {
+        var name = this.getChildValue(node);
+        if(name) {
+            var parts = name.split(":");
+            obj.name = parts.pop();
+            if(parts.length > 0) {
+                obj.featureNS = this.lookupNamespaceURI(node, parts[0]);
+            }
+        }
+    },
+
+    /**
+     * Method: read_cap_Title
+     */
+    read_cap_Title: function(obj, node) {
+        var title = this.getChildValue(node);
+        if(title) {
+            obj.title = title;
+        }
+    },
+
+    /**
+     * Method: read_cap_Abstract
+     */
+    read_cap_Abstract: function(obj, node) {
+        var abst = this.getChildValue(node);
+        if(abst) {
+            obj["abstract"] = abst;
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1" 
+
+});
diff --git a/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js b/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js
new file mode 100644
index 0000000..f283132
--- /dev/null
+++ b/lib/OpenLayers/Format/WFSCapabilities/v1_0_0.js
@@ -0,0 +1,157 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WFSCapabilities/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WFSCapabilities/v1_0_0
+ * Read WMS Capabilities version 1.0.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WFSCapabilities>
+ */
+OpenLayers.Format.WFSCapabilities.v1_0_0 = OpenLayers.Class(
+    OpenLayers.Format.WFSCapabilities.v1, {
+    
+    /**
+     * Constructor: OpenLayers.Format.WFSCapabilities.v1_0_0
+     * Create a new parser for WFS capabilities version 1.0.0.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.WFSCapabilities.v1.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+    
+    /**
+     * Method: read_cap_Service
+     */
+    read_cap_Service: function(capabilities, node) {
+        var service = {};
+        this.runChildNodes(service, node);
+        capabilities.service = service;
+    },
+
+    /**
+     * Method: read_cap_Fees
+     */
+    read_cap_Fees: function(service, node) {
+        var fees = this.getChildValue(node);
+        if (fees && fees.toLowerCase() != "none") {
+            service.fees = fees;
+        }
+    },
+
+    /**
+     * Method: read_cap_AccessConstraints
+     */
+    read_cap_AccessConstraints: function(service, node) {
+        var constraints = this.getChildValue(node);
+        if (constraints && constraints.toLowerCase() != "none") {
+            service.accessConstraints = constraints;
+        }
+    },
+    
+    /**
+     * Method: read_cap_OnlineResource
+     */
+    read_cap_OnlineResource: function(service, node) {
+        var onlineResource = this.getChildValue(node);
+        if (onlineResource && onlineResource.toLowerCase() != "none") {
+            service.onlineResource = onlineResource;
+        }
+    },
+    
+    /**
+     * Method: read_cap_Keywords
+     */
+    read_cap_Keywords: function(service, node) {
+        var keywords = this.getChildValue(node);
+        if (keywords && keywords.toLowerCase() != "none") {
+            service.keywords = keywords.split(', ');
+        }
+    },
+    
+    /**
+     * Method: read_cap_Capability
+     */
+    read_cap_Capability: function(capabilities, node) {
+        var capability = {};
+        this.runChildNodes(capability, node);
+        capabilities.capability = capability;
+    },
+    
+    /**
+     * Method: read_cap_Request
+     */
+    read_cap_Request: function(obj, node) {
+        var request = {};
+        this.runChildNodes(request, node);
+        obj.request = request;
+    },
+    
+    /**
+     * Method: read_cap_GetFeature
+     */
+    read_cap_GetFeature: function(request, node) {
+        var getfeature = {
+            href: {}, // DCPType
+            formats: [] // ResultFormat
+        };
+        this.runChildNodes(getfeature, node);
+        request.getfeature = getfeature;
+    },
+    
+    /**
+     * Method: read_cap_ResultFormat
+     */
+    read_cap_ResultFormat: function(obj, node) {
+        var children = node.childNodes;
+        var childNode;
+        for(var i=0; i<children.length; i++) {
+            childNode = children[i];
+            if(childNode.nodeType == 1) {
+                obj.formats.push(childNode.nodeName);
+            }
+        }
+    },
+    
+    /**
+     * Method: read_cap_DCPType
+     */
+    read_cap_DCPType: function(obj, node) {
+        this.runChildNodes(obj, node);
+    },
+    
+    /**
+     * Method: read_cap_HTTP
+     */
+    read_cap_HTTP: function(obj, node) {
+        this.runChildNodes(obj.href, node);
+    },
+    
+    /**
+     * Method: read_cap_Get
+     */
+    read_cap_Get: function(obj, node) {
+        obj.get = node.getAttribute("onlineResource");
+    },
+    
+    /**
+     * Method: read_cap_Post
+     */
+    read_cap_Post: function(obj, node) {
+        obj.post = node.getAttribute("onlineResource");
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1_0_0" 
+
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Format/WFSCapabilities/v1_1_0.js b/lib/OpenLayers/Format/WFSCapabilities/v1_1_0.js
new file mode 100644
index 0000000..99489c0
--- /dev/null
+++ b/lib/OpenLayers/Format/WFSCapabilities/v1_1_0.js
@@ -0,0 +1,36 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WFSCapabilities/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WFSCapabilities/v1_1_0
+ * Read WFS Capabilities version 1.1.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WFSCapabilities>
+ */
+OpenLayers.Format.WFSCapabilities.v1_1_0 = OpenLayers.Class(
+    OpenLayers.Format.WFSCapabilities.v1, {
+    
+    /**
+     * Constructor: OpenLayers.Format.WFSCapabilities.v1_1_0
+     * Create a new parser for WFS capabilities version 1.1.0.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.WFSCapabilities.v1.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WFSCapabilities.v1_1_0" 
+
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Format/WFSDescribeFeatureType.js b/lib/OpenLayers/Format/WFSDescribeFeatureType.js
new file mode 100644
index 0000000..72c4ee8
--- /dev/null
+++ b/lib/OpenLayers/Format/WFSDescribeFeatureType.js
@@ -0,0 +1,198 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ *
+ * Class: OpenLayers.Format.WFSDescribeFeatureType
+ * Read WFS DescribeFeatureType response
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WFSDescribeFeatureType = OpenLayers.Class(
+    OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        xsd: "http://www.w3.org/2001/XMLSchema"
+    },
+    
+    /**
+     * Constructor: OpenLayers.Format.WFSDescribeFeatureType
+     * Create a new parser for WFS DescribeFeatureType responses.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "xsd": {
+            "schema": function(node, obj) {
+                var complexTypes = [];
+                var customTypes = {};
+                var schema = {
+                    complexTypes: complexTypes,
+                    customTypes: customTypes
+                };
+                
+                this.readChildNodes(node, schema);
+
+                var attributes = node.attributes;
+                var attr, name;
+                for(var i=0, len=attributes.length; i<len; ++i) {
+                    attr = attributes[i];
+                    name = attr.name;
+                    if(name.indexOf("xmlns") == 0) {
+                        this.setNamespace(name.split(":")[1] || "", attr.value);
+                    } else {
+                        obj[name] = attr.value;
+                    }
+                }
+                obj.featureTypes = complexTypes;                
+                obj.targetPrefix = this.namespaceAlias[obj.targetNamespace];
+                
+                // map complexTypes to names of customTypes
+                var complexType, customType;
+                for(var i=0, len=complexTypes.length; i<len; ++i) {
+                    complexType = complexTypes[i];
+                    customType = customTypes[complexType.typeName];
+                    if(customTypes[complexType.typeName]) {
+                        complexType.typeName = customType.name;
+                    }
+                }
+            },
+            "complexType": function(node, obj) {
+                var complexType = {
+                    // this is a temporary typeName, it will be overwritten by
+                    // the schema reader with the metadata found in the
+                    // customTypes hash
+                    "typeName": node.getAttribute("name")
+                };
+                this.readChildNodes(node, complexType);
+                obj.complexTypes.push(complexType);
+            },
+            "complexContent": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "extension": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "sequence": function(node, obj) {
+                var sequence = {
+                    elements: []
+                };
+                this.readChildNodes(node, sequence);
+                obj.properties = sequence.elements;
+            },
+            "element": function(node, obj) {
+                if(obj.elements) {
+                    var element = {};
+                    var attributes = node.attributes;
+                    var attr;
+                    for(var i=0, len=attributes.length; i<len; ++i) {
+                        attr = attributes[i];
+                        element[attr.name] = attr.value;
+                    }
+                    
+                    var type = element.type;
+                    if(!type) {
+                        type = {};
+                        this.readChildNodes(node, type);
+                        element.restriction = type;
+                        element.type = type.base;
+                    }
+                    var fullType = type.base || type;
+                    element.localType = fullType.split(":").pop();
+                    obj.elements.push(element);
+                }
+                
+                if(obj.complexTypes) {
+                    var type = node.getAttribute("type");
+                    var localType = type.split(":").pop();
+                    obj.customTypes[localType] = {
+                        "name": node.getAttribute("name"),
+                        "type": type
+                    };
+                }
+            },
+            "simpleType": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "restriction": function(node, obj) {
+                obj.base = node.getAttribute("base");
+                this.readRestriction(node, obj);
+            }
+        }
+    },
+    
+    /**
+     * Method: readRestriction
+     * Reads restriction defined in the child nodes of a restriction element
+     * 
+     * Parameters:
+     * node {DOMElement} - the node to parse
+     * obj {Object} - the object that receives the read result
+     */
+    readRestriction: function(node, obj) {
+        var children = node.childNodes;
+        var child, nodeName, value;
+        for(var i=0, len=children.length; i<len; ++i) {
+            child = children[i];
+            if(child.nodeType == 1) {
+                nodeName = child.nodeName.split(":").pop();
+                value = child.getAttribute("value");
+                if(!obj[nodeName]) {
+                    obj[nodeName] = value;
+                } else {
+                    if(typeof obj[nodeName] == "string") {
+                        obj[nodeName] = [obj[nodeName]];
+                    }
+                    obj[nodeName].push(value);
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: read
+     *
+     * Parameters:
+     * data - {DOMElement|String} A WFS DescribeFeatureType document.
+     *
+     * Returns:
+     * {Object} An object representing the WFS DescribeFeatureType response.
+     */
+    read: function(data) {
+        if(typeof data == "string") { 
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var schema = {};
+        this.readNode(data, schema);
+        
+        return schema;
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WFSDescribeFeatureType" 
+
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Format/WFST.js b/lib/OpenLayers/Format/WFST.js
new file mode 100644
index 0000000..079dd80
--- /dev/null
+++ b/lib/OpenLayers/Format/WFST.js
@@ -0,0 +1,34 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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.js
+ */
+
+/**
+ * Function: OpenLayers.Format.WFST
+ * Used to create a versioned WFS protocol.  Default version is 1.0.0.
+ *
+ * Returns:
+ * {<OpenLayers.Format>} A WFST format of the given version.
+ */
+OpenLayers.Format.WFST = function(options) {
+    options = OpenLayers.Util.applyDefaults(
+        options, OpenLayers.Format.WFST.DEFAULTS
+    );
+    var cls = OpenLayers.Format.WFST["v"+options.version.replace(/\./g, "_")];
+    if(!cls) {
+        throw "Unsupported WFST version: " + options.version;
+    }
+    return new cls(options);
+};
+
+/**
+ * Constant: OpenLayers.Format.WFST.DEFAULTS
+ * {Object} Default properties for the WFST format.
+ */
+OpenLayers.Format.WFST.DEFAULTS = {
+    "version": "1.0.0"
+};
diff --git a/lib/OpenLayers/Format/WFST/v1.js b/lib/OpenLayers/Format/WFST/v1.js
new file mode 100644
index 0000000..1a4eda7
--- /dev/null
+++ b/lib/OpenLayers/Format/WFST/v1.js
@@ -0,0 +1,368 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/WFST.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WFST.v1
+ * Superclass for WFST parsers.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WFST.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance",
+        wfs: "http://www.opengis.net/wfs",
+        gml: "http://www.opengis.net/gml",
+        ogc: "http://www.opengis.net/ogc"
+    },
+    
+    /**
+     * Property: defaultPrefix
+     */
+    defaultPrefix: "wfs",
+
+    /**
+     * Property: version
+     * {String} WFS version number.
+     */
+    version: null,
+
+    /**
+     * Property: schemaLocation
+     * {String} Schema location for a particular minor version.
+     */
+    schemaLocations: null,
+    
+    /**
+     * APIProperty: srsName
+     * {String} URI for spatial reference system.
+     */
+    srsName: null,
+
+    /**
+     * APIProperty: extractAttributes
+     * {Boolean} Extract attributes from GML.  Default is true.
+     */
+    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,
+
+    /**
+     * Property: stateName
+     * {Object} Maps feature states to node names.
+     */
+    stateName: null,
+
+    /**
+     * Constructor: OpenLayers.Format.WFST.v1
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.WFST.v1_0_0> or <OpenLayers.Format.WFST.v1_1_0>
+     *     constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        // set state name mapping
+        this.stateName = {};
+        this.stateName[OpenLayers.State.INSERT] = "wfs:Insert";
+        this.stateName[OpenLayers.State.UPDATE] = "wfs:Update";
+        this.stateName[OpenLayers.State.DELETE] = "wfs:Delete";
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Method: getSrsName
+     */
+    getSrsName: function(feature, options) {
+        var srsName = options && options.srsName;
+        if(!srsName) {
+            if(feature && feature.layer) {
+                srsName = feature.layer.projection.getCode();
+            } else {
+                srsName = this.srsName;
+            }
+        }
+        return srsName;
+    },
+
+    /**
+     * APIMethod: read
+     * Parse the response from a transaction.  Because WFS is split into
+     *     Transaction requests (create, update, and delete) and GetFeature
+     *     requests (read), this method handles parsing of both types of
+     *     responses.
+     *
+     * Parameters:
+     * data - {String | Document} The WFST document to read
+     * options - {Object} Options for the reader
+     *
+     * Valid options properties:
+     * output - {String} either "features" or "object". The default is
+     *     "features", which means that the method will return an array of
+     *     features. If set to "object", an object with a "features" property
+     *     and other properties read by the parser will be returned.
+     *
+     * Returns:
+     * {Array | Object} Output depending on the output option.
+     */
+    read: function(data, options) {
+        options = options || {};
+        OpenLayers.Util.applyDefaults(options, {
+            output: "features"
+        });
+        
+        if(typeof data == "string") { 
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var obj = {};
+        if(data) {
+            this.readNode(data, obj);
+        }
+        if(obj.features && options.output === "features") {
+            obj = obj.features;
+        }
+        return obj;
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "wfs": {
+            "FeatureCollection": function(node, obj) {
+                obj.features = [];
+                this.readChildNodes(node, obj);
+            }
+        }
+    },
+    
+    /**
+     * Method: write
+     * Given an array of features, write a WFS transaction.  This assumes
+     *     the features have a state property that determines the operation
+     *     type - insert, update, or delete.
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>)} A list of features.
+     *
+     * Returns:
+     * {String} A serialized WFS transaction.
+     */
+    write: function(features) {
+        var node = this.writeNode("wfs:Transaction", features);
+        var value = this.schemaLocationAttr();
+        if(value) {
+            this.setAttributeNS(
+                node, this.namespaces["xsi"], "xsi:schemaLocation",  value
+            )
+        }
+        return OpenLayers.Format.XML.prototype.write.apply(this, [node]);
+    },
+    
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "wfs": {
+            "GetFeature": function(options) {
+                var node = this.createElementNSPlus("wfs:GetFeature", {
+                    attributes: {
+                        service: "WFS",
+                        version: this.version,
+                        outputFormat: options && options.outputFormat,
+                        maxFeatures: options && options.maxFeatures,
+                        "xsi:schemaLocation": this.schemaLocationAttr(options)
+                    }
+                });
+                if (typeof this.featureType == "string") {
+                    this.writeNode("Query", options, node);
+                } else {
+                    for (var i=0,len = this.featureType.length; i<len; i++) { 
+                        options.featureType = this.featureType[i]; 
+                        this.writeNode("Query", options, node); 
+                    } 
+                }
+                return node;
+            },
+            "Transaction": function(features) {
+                var node = this.createElementNSPlus("wfs:Transaction", {
+                    attributes: {
+                        service: "WFS",
+                        version: this.version
+                    }
+                });
+                if(features) {
+                    var name, feature;
+                    for(var i=0, len=features.length; i<len; ++i) {
+                        feature = features[i];
+                        name = this.stateName[feature.state];
+                        if(name) {
+                            this.writeNode(name, feature, node);
+                        }
+                    }
+                }
+                return node;
+            },
+            "Insert": function(feature) {
+                var node = this.createElementNSPlus("wfs:Insert");
+                this.srsName = this.getSrsName(feature);
+                this.writeNode("feature:_typeName", feature, node);
+                return node;
+            },
+            "Update": function(feature) {
+                var node = this.createElementNSPlus("wfs:Update", {
+                    attributes: {
+                        typeName: (this.featureNS ? this.featurePrefix + ":" : "") +
+                            this.featureType
+                    }
+                });
+                if(this.featureNS) {
+                    node.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
+                }
+                
+                // add in geometry
+                if (this.geometryName !== null) {
+                    this.writeNode(
+                        "Property", {name: this.geometryName, value: feature}, node
+                    );
+                }
+        
+                // add in attributes
+                for(var key in feature.attributes) {
+                    if(feature.attributes[key] !== undefined) {
+                        this.writeNode(
+                            "Property", {name: key, value: feature.attributes[key]}, node
+                        );
+                    }
+                }
+                
+                // add feature id filter
+                this.writeNode("ogc:Filter", new OpenLayers.Filter.FeatureId({
+                    fids: [feature.fid]
+                }), node);
+        
+                return node;
+            },
+            "Property": function(obj) {
+                var node = this.createElementNSPlus("wfs:Property");
+                this.writeNode("Name", obj.name, node);
+                if(obj.value !== null) {
+                    this.writeNode("Value", obj.value, node);
+                }
+                return node;
+            },
+            "Name": function(name) {
+                return this.createElementNSPlus("wfs:Name", {value: name});
+            },
+            "Value": function(obj) {
+                var node;
+                if(obj instanceof OpenLayers.Feature.Vector) {
+                    node = this.createElementNSPlus("wfs:Value");
+                    this.srsName = this.getSrsName(obj);
+                    var geom = this.writeNode("feature:_geometry", obj.geometry).firstChild;
+                    node.appendChild(geom);
+                } else {
+                    node = this.createElementNSPlus("wfs:Value", {value: obj});                
+                }
+                return node;
+            },
+            "Delete": function(feature) {
+                var node = this.createElementNSPlus("wfs:Delete", {
+                    attributes: {
+                        typeName: (this.featureNS ? this.featurePrefix + ":" : "") +
+                            this.featureType
+                    }
+                });
+                if(this.featureNS) {
+                    node.setAttribute("xmlns:" + this.featurePrefix, this.featureNS);
+                }
+                this.writeNode("ogc:Filter", new OpenLayers.Filter.FeatureId({
+                    fids: [feature.fid]
+                }), node);
+                return node;
+            }
+        }
+    },
+
+    /**
+     * Method: schemaLocationAttr
+     * Generate the xsi:schemaLocation attribute value.
+     *
+     * Returns:
+     * {String} The xsi:schemaLocation attribute or undefined if none.
+     */
+    schemaLocationAttr: function(options) {
+        options = OpenLayers.Util.extend({
+            featurePrefix: this.featurePrefix,
+            schema: this.schema
+        }, options);
+        var schemaLocations = OpenLayers.Util.extend({}, this.schemaLocations);
+        if(options.schema) {
+            schemaLocations[options.featurePrefix] = options.schema;
+        }
+        var parts = [];
+        var uri;
+        for(var key in schemaLocations) {
+            uri = this.namespaces[key];
+            if(uri) {
+                parts.push(uri + " " + schemaLocations[key]);
+            }
+        }
+        var value = parts.join(" ") || undefined;
+        return value;
+    },
+    
+    /**
+     * Method: setFilterProperty
+     * Set the property of each spatial filter.
+     *
+     * Parameters:
+     * filter - {<OpenLayers.Filter>}
+     */
+    setFilterProperty: function(filter) {
+        if(filter.filters) {
+            for(var i=0, len=filter.filters.length; i<len; ++i) {
+                this.setFilterProperty(filter.filters[i]);
+            }
+        } else {
+            if(filter instanceof OpenLayers.Filter.Spatial) {
+                // got a spatial filter, set its property
+                filter.property = this.geometryName;
+            }
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WFST.v1" 
+
+});
diff --git a/lib/OpenLayers/Format/WFST/v1_0_0.js b/lib/OpenLayers/Format/WFST/v1_0_0.js
new file mode 100644
index 0000000..6f706f5
--- /dev/null
+++ b/lib/OpenLayers/Format/WFST/v1_0_0.js
@@ -0,0 +1,150 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WFST/v1.js
+ * @requires OpenLayers/Format/Filter/v1_0_0.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WFST.v1_0_0
+ * A format for creating WFS v1.0.0 transactions.  Create a new instance with the
+ *     <OpenLayers.Format.WFST.v1_0_0> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.Filter.v1_0_0>
+ *  - <OpenLayers.Format.WFST.v1>
+ */
+OpenLayers.Format.WFST.v1_0_0 = OpenLayers.Class(
+    OpenLayers.Format.Filter.v1_0_0, OpenLayers.Format.WFST.v1, {
+    
+    /**
+     * Property: version
+     * {String} WFS version number.
+     */
+    version: "1.0.0",
+
+    /**
+     * APIProperty: srsNameInQuery
+     * {Boolean} If true the reference system is passed in Query requests
+     *     via the "srsName" attribute to the "wfs:Query" element, this
+     *     property defaults to false as it isn't WFS 1.0.0 compliant.
+     */
+    srsNameInQuery: false,
+    
+    /**
+     * Property: schemaLocations
+     * {Object} Properties are namespace aliases, values are schema locations.
+     */
+    schemaLocations: {
+        "wfs": "http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd"
+    },
+
+    /**
+     * Constructor: OpenLayers.Format.WFST.v1_0_0
+     * A class for parsing and generating WFS v1.0.0 transactions.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     *
+     * Valid options properties:
+     * featureType - {String} Local (without prefix) feature typeName (required).
+     * featureNS - {String} Feature namespace (optional).
+     * featurePrefix - {String} Feature namespace alias (optional - only used
+     *     if featureNS is provided).  Default is 'feature'.
+     * geometryName - {String} Name of geometry attribute.  Default is 'the_geom'.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.Filter.v1_0_0.prototype.initialize.apply(this, [options]);
+        OpenLayers.Format.WFST.v1.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "wfs": OpenLayers.Util.applyDefaults({
+            "WFS_TransactionResponse": function(node, obj) {
+                obj.insertIds = [];
+                obj.success = false;
+                this.readChildNodes(node, obj);
+            },
+            "InsertResult": function(node, container) {
+                var obj = {fids: []};
+                this.readChildNodes(node, obj);
+                container.insertIds.push(obj.fids[0]);
+            },
+            "TransactionResult": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Status": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "SUCCESS": function(node, obj) {
+                obj.success = true;
+            }
+        }, OpenLayers.Format.WFST.v1.prototype.readers["wfs"]),
+        "gml": OpenLayers.Format.GML.v2.prototype.readers["gml"],
+        "feature": OpenLayers.Format.GML.v2.prototype.readers["feature"],
+        "ogc": OpenLayers.Format.Filter.v1_0_0.prototype.readers["ogc"]
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "wfs": OpenLayers.Util.applyDefaults({
+            "Query": function(options) {
+                options = OpenLayers.Util.extend({
+                    featureNS: this.featureNS,
+                    featurePrefix: this.featurePrefix,
+                    featureType: this.featureType,
+                    srsName: this.srsName,
+                    srsNameInQuery: this.srsNameInQuery
+                }, options);
+                var node = this.createElementNSPlus("wfs:Query", {
+                    attributes: {
+                        typeName: (options.featureNS ? options.featurePrefix + ":" : "") +
+                            options.featureType
+                    }
+                });
+                if(options.srsNameInQuery && options.srsName) {
+                    node.setAttribute("srsName", options.srsName);
+                }
+                if(options.featureNS) {
+                    node.setAttribute("xmlns:" + options.featurePrefix, options.featureNS);
+                }
+                if(options.propertyNames) {
+                    for(var i=0,len = options.propertyNames.length; i<len; i++) {
+                        this.writeNode(
+                            "ogc:PropertyName", 
+                            {property: options.propertyNames[i]},
+                            node
+                        );
+                    }
+                }
+                if(options.filter) {
+                    this.setFilterProperty(options.filter);
+                    this.writeNode("ogc:Filter", options.filter, node);
+                }
+                return node;
+            }
+        }, OpenLayers.Format.WFST.v1.prototype.writers["wfs"]),
+        "gml": OpenLayers.Format.GML.v2.prototype.writers["gml"],
+        "feature": OpenLayers.Format.GML.v2.prototype.writers["feature"],
+        "ogc": OpenLayers.Format.Filter.v1_0_0.prototype.writers["ogc"]
+    },
+   
+    CLASS_NAME: "OpenLayers.Format.WFST.v1_0_0" 
+});
diff --git a/lib/OpenLayers/Format/WFST/v1_1_0.js b/lib/OpenLayers/Format/WFST/v1_1_0.js
new file mode 100644
index 0000000..3cb44ba
--- /dev/null
+++ b/lib/OpenLayers/Format/WFST/v1_1_0.js
@@ -0,0 +1,161 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WFST/v1.js
+ * @requires OpenLayers/Format/Filter/v1_1_0.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WFST.v1_1_0
+ * A format for creating WFS v1.1.0 transactions.  Create a new instance with the
+ *     <OpenLayers.Format.WFST.v1_1_0> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.Filter.v1_1_0>
+ *  - <OpenLayers.Format.WFST.v1>
+ */
+OpenLayers.Format.WFST.v1_1_0 = OpenLayers.Class(
+    OpenLayers.Format.Filter.v1_1_0, OpenLayers.Format.WFST.v1, {
+    
+    /**
+     * Property: version
+     * {String} WFS version number.
+     */
+    version: "1.1.0",
+    
+    /**
+     * Property: schemaLocations
+     * {Object} Properties are namespace aliases, values are schema locations.
+     */
+    schemaLocations: {
+        "wfs": "http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"
+    },
+    
+    /**
+     * Constructor: OpenLayers.Format.WFST.v1_1_0
+     * A class for parsing and generating WFS v1.1.0 transactions.
+     *
+     * To read additional information like hit count (numberOfFeatures) from
+     * the  FeatureCollection, call the <OpenLayers.Format.WFST.v1.read> method
+     * with {output: "object"} as 2nd argument. Note that it is possible to
+     * just request the hit count from a WFS 1.1.0 server with the
+     * resultType="hits" request parameter.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     *
+     * Valid options properties:
+     * featureType - {String} Local (without prefix) feature typeName (required).
+     * featureNS - {String} Feature namespace (optional).
+     * featurePrefix - {String} Feature namespace alias (optional - only used
+     *     if featureNS is provided).  Default is 'feature'.
+     * geometryName - {String} Name of geometry attribute.  Default is 'the_geom'.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.Filter.v1_1_0.prototype.initialize.apply(this, [options]);
+        OpenLayers.Format.WFST.v1.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "wfs": OpenLayers.Util.applyDefaults({
+            "FeatureCollection": function(node, obj) {
+                obj.numberOfFeatures = parseInt(node.getAttribute(
+                    "numberOfFeatures"));
+                OpenLayers.Format.WFST.v1.prototype.readers["wfs"]["FeatureCollection"].apply(
+                    this, arguments);
+            },
+            "TransactionResponse": function(node, obj) {
+                obj.insertIds = [];
+                obj.success = false;
+                this.readChildNodes(node, obj);
+            },
+            "TransactionSummary": function(node, obj) {
+                // this is a limited test of success
+                obj.success = true;
+            },
+            "InsertResults": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Feature": function(node, container) {
+                var obj = {fids: []};
+                this.readChildNodes(node, obj);
+                container.insertIds.push(obj.fids[0]);
+            }
+        }, OpenLayers.Format.WFST.v1.prototype.readers["wfs"]),
+        "gml": OpenLayers.Format.GML.v3.prototype.readers["gml"],
+        "feature": OpenLayers.Format.GML.v3.prototype.readers["feature"],
+        "ogc": OpenLayers.Format.Filter.v1_1_0.prototype.readers["ogc"]
+    },
+
+    /**
+     * Property: writers
+     * As a compliment to the readers property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {
+        "wfs": OpenLayers.Util.applyDefaults({
+            "GetFeature": function(options) {
+                var node = OpenLayers.Format.WFST.v1.prototype.writers["wfs"]["GetFeature"].apply(this, arguments);
+                options && options.resultType && this.setAttributes(node, {
+                    resultType: options.resultType
+                });
+                return node;
+            },
+            "Query": function(options) {
+                options = OpenLayers.Util.extend({
+                    featureNS: this.featureNS,
+                    featurePrefix: this.featurePrefix,
+                    featureType: this.featureType,
+                    srsName: this.srsName
+                }, options);
+                var node = this.createElementNSPlus("wfs:Query", {
+                    attributes: {
+                        typeName: (options.featureNS ? options.featurePrefix + ":" : "") +
+                            options.featureType,
+                        srsName: options.srsName
+                    }
+                });
+                if(options.featureNS) {
+                    node.setAttribute("xmlns:" + options.featurePrefix, options.featureNS);
+                }
+                if(options.propertyNames) {
+                    for(var i=0,len = options.propertyNames.length; i<len; i++) {
+                        this.writeNode(
+                            "wfs:PropertyName", 
+                            {property: options.propertyNames[i]},
+                            node
+                        );
+                    }
+                }
+                if(options.filter) {
+                    this.setFilterProperty(options.filter);
+                    this.writeNode("ogc:Filter", options.filter, node);
+                }
+                return node;
+            },
+            "PropertyName": function(obj) {
+                return this.createElementNSPlus("wfs:PropertyName", {
+                    value: obj.property
+                });
+            }            
+        }, OpenLayers.Format.WFST.v1.prototype.writers["wfs"]),
+        "gml": OpenLayers.Format.GML.v3.prototype.writers["gml"],
+        "feature": OpenLayers.Format.GML.v3.prototype.writers["feature"],
+        "ogc": OpenLayers.Format.Filter.v1_1_0.prototype.writers["ogc"]
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WFST.v1_1_0" 
+});
diff --git a/lib/OpenLayers/Format/WKT.js b/lib/OpenLayers/Format/WKT.js
new file mode 100644
index 0000000..b662fbf
--- /dev/null
+++ b/lib/OpenLayers/Format/WKT.js
@@ -0,0 +1,358 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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.js
+ * @requires OpenLayers/Feature/Vector.js
+ */
+
+/**
+ * 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
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *           this instance
+     *
+     * Returns:
+     * {<OpenLayers.Format.WKT>} A new WKT parser.
+     */
+    initialize: function(options) {
+        this.regExes = {
+            'typeStr': /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,
+            'spaces': /\s+/,
+            'parenComma': /\)\s*,\s*\(/,
+            'doubleParenComma': /\)\s*\)\s*,\s*\(\s*\(/,  // can't use {2} here
+            'trimParens': /^\s*\(?(.*?)\)?\s*$/
+        };
+        OpenLayers.Format.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * Method: read
+     * Deserialize a WKT string and return a vector feature or an
+     * array of vector features.  Supports WKT for POINT, MULTIPOINT,
+     * LINESTRING, MULTILINESTRING, POLYGON, MULTIPOLYGON, and
+     * GEOMETRYCOLLECTION.
+     *
+     * Parameters:
+     * wkt - {String} A WKT string
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>|Array} A feature or array of features for
+     * GEOMETRYCOLLECTION WKT.
+     */
+    read: function(wkt) {
+        var features, type, str;
+        var matches = this.regExes.typeStr.exec(wkt);
+        if(matches) {
+            type = matches[1].toLowerCase();
+            str = matches[2];
+            if(this.parse[type]) {
+                features = this.parse[type].apply(this, [str]);
+            }
+            if (this.internalProjection && this.externalProjection) {
+                if (features && 
+                    features.CLASS_NAME == "OpenLayers.Feature.Vector") {
+                    features.geometry.transform(this.externalProjection,
+                                                this.internalProjection);
+                } else if (features &&
+                           type != "geometrycollection" &&
+                           typeof features == "object") {
+                    for (var i=0, len=features.length; i<len; i++) {
+                        var component = features[i];
+                        component.geometry.transform(this.externalProjection,
+                                                     this.internalProjection);
+                    }
+                }
+            }
+        }    
+        return features;
+    },
+
+    /**
+     * Method: write
+     * Serialize a feature or array of features into a WKT string.
+     *
+     * Parameters:
+     * features - {<OpenLayers.Feature.Vector>|Array} A feature or array of
+     *            features
+     *
+     * Returns:
+     * {String} The WKT string representation of the input geometries
+     */
+    write: function(features) {
+        var collection, geometry, type, data, isCollection;
+        if(features.constructor == Array) {
+            collection = features;
+            isCollection = true;
+        } else {
+            collection = [features];
+            isCollection = false;
+        }
+        var pieces = [];
+        if(isCollection) {
+            pieces.push('GEOMETRYCOLLECTION(');
+        }
+        for(var i=0, len=collection.length; i<len; ++i) {
+            if(isCollection && i>0) {
+                pieces.push(',');
+            }
+            geometry = collection[i].geometry;
+            type = geometry.CLASS_NAME.split('.')[2].toLowerCase();
+            if(!this.extract[type]) {
+                return null;
+            }
+            if (this.internalProjection && this.externalProjection) {
+                geometry = geometry.clone();
+                geometry.transform(this.internalProjection, 
+                                   this.externalProjection);
+            }                       
+            data = this.extract[type].apply(this, [geometry]);
+            pieces.push(type.toUpperCase() + '(' + data + ')');
+        }
+        if(isCollection) {
+            pieces.push(')');
+        }
+        return pieces.join('');
+    },
+    
+    /**
+     * Object with properties corresponding to the geometry types.
+     * Property values are functions that do the actual data extraction.
+     */
+    extract: {
+        /**
+         * Return a space delimited string of point coordinates.
+         * @param {<OpenLayers.Geometry.Point>} point
+         * @returns {String} A string of coordinates representing the point
+         */
+        'point': function(point) {
+            return point.x + ' ' + point.y;
+        },
+
+        /**
+         * Return a comma delimited string of point coordinates from a multipoint.
+         * @param {<OpenLayers.Geometry.MultiPoint>} multipoint
+         * @returns {String} A string of point coordinate strings representing
+         *                  the multipoint
+         */
+        'multipoint': function(multipoint) {
+            var array = [];
+            for(var i=0, len=multipoint.components.length; i<len; ++i) {
+                array.push('(' +
+                           this.extract.point.apply(this, [multipoint.components[i]]) +
+                           ')');
+            }
+            return array.join(',');
+        },
+        
+        /**
+         * Return a comma delimited string of point coordinates from a line.
+         * @param {<OpenLayers.Geometry.LineString>} linestring
+         * @returns {String} A string of point coordinate strings representing
+         *                  the linestring
+         */
+        'linestring': function(linestring) {
+            var array = [];
+            for(var i=0, len=linestring.components.length; i<len; ++i) {
+                array.push(this.extract.point.apply(this, [linestring.components[i]]));
+            }
+            return array.join(',');
+        },
+
+        /**
+         * Return a comma delimited string of linestring strings from a multilinestring.
+         * @param {<OpenLayers.Geometry.MultiLineString>} multilinestring
+         * @returns {String} A string of of linestring strings representing
+         *                  the multilinestring
+         */
+        'multilinestring': function(multilinestring) {
+            var array = [];
+            for(var i=0, len=multilinestring.components.length; i<len; ++i) {
+                array.push('(' +
+                           this.extract.linestring.apply(this, [multilinestring.components[i]]) +
+                           ')');
+            }
+            return array.join(',');
+        },
+        
+        /**
+         * Return a comma delimited string of linear ring arrays from a polygon.
+         * @param {<OpenLayers.Geometry.Polygon>} polygon
+         * @returns {String} An array of linear ring arrays representing the polygon
+         */
+        'polygon': function(polygon) {
+            var array = [];
+            for(var i=0, len=polygon.components.length; i<len; ++i) {
+                array.push('(' +
+                           this.extract.linestring.apply(this, [polygon.components[i]]) +
+                           ')');
+            }
+            return array.join(',');
+        },
+
+        /**
+         * Return an array of polygon arrays from a multipolygon.
+         * @param {<OpenLayers.Geometry.MultiPolygon>} multipolygon
+         * @returns {Array} An array of polygon arrays representing
+         *                  the multipolygon
+         */
+        'multipolygon': function(multipolygon) {
+            var array = [];
+            for(var i=0, len=multipolygon.components.length; i<len; ++i) {
+                array.push('(' +
+                           this.extract.polygon.apply(this, [multipolygon.components[i]]) +
+                           ')');
+            }
+            return array.join(',');
+        }
+
+    },
+
+    /**
+     * Object with properties corresponding to the geometry types.
+     * Property values are functions that do the actual parsing.
+     */
+    parse: {
+        /**
+         * Return point feature given a point WKT fragment.
+         * @param {String} str A WKT fragment representing the point
+         * @returns {<OpenLayers.Feature.Vector>} A point feature
+         * @private
+         */
+        'point': function(str) {
+            var coords = OpenLayers.String.trim(str).split(this.regExes.spaces);
+            return new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(coords[0], coords[1])
+            );
+        },
+
+        /**
+         * Return a multipoint feature given a multipoint WKT fragment.
+         * @param {String} A WKT fragment representing the multipoint
+         * @returns {<OpenLayers.Feature.Vector>} A multipoint feature
+         * @private
+         */
+        'multipoint': function(str) {
+            var point;
+            var points = OpenLayers.String.trim(str).split(this.regExes.parenComma);
+            var components = [];
+            for(var i=0, len=points.length; i<len; ++i) {
+                point = points[i].replace(this.regExes.trimParens, '$1');
+                components.push(this.parse.point.apply(this, [point]).geometry);
+            }
+            return new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.MultiPoint(components)
+            );
+        },
+        
+        /**
+         * Return a linestring feature given a linestring WKT fragment.
+         * @param {String} A WKT fragment representing the linestring
+         * @returns {<OpenLayers.Feature.Vector>} A linestring feature
+         * @private
+         */
+        'linestring': function(str) {
+            var points = OpenLayers.String.trim(str).split(',');
+            var components = [];
+            for(var i=0, len=points.length; i<len; ++i) {
+                components.push(this.parse.point.apply(this, [points[i]]).geometry);
+            }
+            return new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.LineString(components)
+            );
+        },
+
+        /**
+         * Return a multilinestring feature given a multilinestring WKT fragment.
+         * @param {String} A WKT fragment representing the multilinestring
+         * @returns {<OpenLayers.Feature.Vector>} A multilinestring feature
+         * @private
+         */
+        'multilinestring': function(str) {
+            var line;
+            var lines = OpenLayers.String.trim(str).split(this.regExes.parenComma);
+            var components = [];
+            for(var i=0, len=lines.length; i<len; ++i) {
+                line = lines[i].replace(this.regExes.trimParens, '$1');
+                components.push(this.parse.linestring.apply(this, [line]).geometry);
+            }
+            return new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.MultiLineString(components)
+            );
+        },
+        
+        /**
+         * Return a polygon feature given a polygon WKT fragment.
+         * @param {String} A WKT fragment representing the polygon
+         * @returns {<OpenLayers.Feature.Vector>} A polygon feature
+         * @private
+         */
+        'polygon': function(str) {
+            var ring, linestring, linearring;
+            var rings = OpenLayers.String.trim(str).split(this.regExes.parenComma);
+            var components = [];
+            for(var i=0, len=rings.length; i<len; ++i) {
+                ring = rings[i].replace(this.regExes.trimParens, '$1');
+                linestring = this.parse.linestring.apply(this, [ring]).geometry;
+                linearring = new OpenLayers.Geometry.LinearRing(linestring.components);
+                components.push(linearring);
+            }
+            return new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon(components)
+            );
+        },
+
+        /**
+         * Return a multipolygon feature given a multipolygon WKT fragment.
+         * @param {String} A WKT fragment representing the multipolygon
+         * @returns {<OpenLayers.Feature.Vector>} A multipolygon feature
+         * @private
+         */
+        'multipolygon': function(str) {
+            var polygon;
+            var polygons = OpenLayers.String.trim(str).split(this.regExes.doubleParenComma);
+            var components = [];
+            for(var i=0, len=polygons.length; i<len; ++i) {
+                polygon = polygons[i].replace(this.regExes.trimParens, '$1');
+                components.push(this.parse.polygon.apply(this, [polygon]).geometry);
+            }
+            return new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.MultiPolygon(components)
+            );
+        },
+
+        /**
+         * Return an array of features given a geometrycollection WKT fragment.
+         * @param {String} A WKT fragment representing the geometrycollection
+         * @returns {Array} An array of OpenLayers.Feature.Vector
+         * @private
+         */
+        'geometrycollection': function(str) {
+            // separate components of the collection with |
+            str = str.replace(/,\s*([A-Za-z])/g, '|$1');
+            var wktArray = OpenLayers.String.trim(str).split('|');
+            var components = [];
+            for(var i=0, len=wktArray.length; i<len; ++i) {
+                components.push(OpenLayers.Format.WKT.prototype.read.apply(this,[wktArray[i]]));
+            }
+            return components;
+        }
+
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WKT" 
+});     
diff --git a/lib/OpenLayers/Format/WMC.js b/lib/OpenLayers/Format/WMC.js
new file mode 100644
index 0000000..bf7b008
--- /dev/null
+++ b/lib/OpenLayers/Format/WMC.js
@@ -0,0 +1,152 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ * @requires OpenLayers/Format/Context.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMC
+ * Read and write Web Map Context documents.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WMC = OpenLayers.Class(OpenLayers.Format.Context, {
+    
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "1.1.0".
+     */
+    defaultVersion: "1.1.0",
+    
+    /**
+     * Method: getParser
+     * Get the WMC parser given a version. Create a new parser if it does not
+     * already exist.
+     *
+     * Parameters:
+     * version - {String} The version of the parser.
+     *
+     * Returns:
+     * {<OpenLayers.Format.WMC.v1>} A WMC parser.
+     */
+    getParser: function(version) {
+        var v = version || this.version || this.defaultVersion;
+        if(!this.parser || this.parser.VERSION != v) {
+            var format = OpenLayers.Format.WMC[
+                "v" + v.replace(/\./g, "_")
+            ];
+            if(!format) {
+                throw "Can't find a WMC parser for version " + v;
+            }
+            this.parser = new format(this.options);
+        }
+        return this.parser;
+    },
+
+    /**
+     * Method: layerToContext
+     * Create a layer context object given a wms layer object.
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Layer.WMS>} The layer.
+     *
+     * Returns:
+     * {Object} A layer context object.
+     */
+    layerToContext: function(layer) {
+        var parser = this.getParser();
+        var layerContext = {
+            queryable: layer.queryable,
+            visibility: layer.visibility,
+            name: layer.params["LAYERS"],
+            title: layer.name,
+            metadataURL: layer.metadataURL,
+            version: layer.params["VERSION"],
+            url: layer.url,
+            maxExtent: layer.maxExtent,
+            transparent: layer.params["TRANSPARENT"],
+            numZoomLevels: layer.numZoomLevels,
+            units: layer.units,
+            isBaseLayer: layer.isBaseLayer,
+            opacity: layer.opacity,
+            displayInLayerSwitcher: layer.displayInLayerSwitcher,
+            singleTile: layer.singleTile,
+            tileSize: (layer.singleTile || !layer.tileSize) ? 
+                undefined : {width: layer.tileSize.w, height: layer.tileSize.h},
+            minScale : (layer.options.resolutions ||
+                        layer.options.scales || 
+                        layer.options.maxResolution || 
+                        layer.options.minScale) ? 
+                        layer.minScale : undefined,
+            maxScale : (layer.options.resolutions ||
+                        layer.options.scales || 
+                        layer.options.minResolution || 
+                        layer.options.maxScale) ? 
+                        layer.maxScale : undefined,
+            formats: [{
+                value: layer.params["FORMAT"],
+                current: true
+            }],
+            styles: [{
+                href: layer.params["SLD"],
+                body: layer.params["SLD_BODY"],
+                name: layer.params["STYLES"] || parser.defaultStyleName,
+                title: parser.defaultStyleTitle,
+                current: true
+            }]
+        };
+        return layerContext;
+    },
+    
+    /**
+     * Method: toContext
+     * Create a context object free from layer given a map or a
+     * context object.
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Map> | Object} The map or context.
+     *
+     * Returns:
+     * {Object} A context object.
+     */
+    toContext: function(obj) {
+        var context = {};
+        var layers = obj.layers;
+        if(obj.CLASS_NAME == "OpenLayers.Map") {
+            context.bounds = obj.getExtent();
+            context.maxExtent = obj.maxExtent;
+            context.projection = obj.projection;
+            context.size = obj.getSize();
+        }
+        else {
+            // copy all obj properties except the "layers" property
+            OpenLayers.Util.applyDefaults(context, obj);
+            if(context.layers != undefined) {
+                delete(context.layers);
+            }
+        }
+
+        if (context.layersContext == undefined) {
+            context.layersContext = [];
+        }
+
+        // let's convert layers into layersContext object (if any)
+        if (layers != undefined && layers instanceof Array) {
+            for (var i=0, len=layers.length; i<len; i++) {
+                var layer = layers[i];
+                if(layer instanceof OpenLayers.Layer.WMS) {
+                    context.layersContext.push(this.layerToContext(layer));
+                }
+            }
+        }
+        return context;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WMC" 
+
+});
diff --git a/lib/OpenLayers/Format/WMC/v1.js b/lib/OpenLayers/Format/WMC/v1.js
new file mode 100644
index 0000000..98ca8d5
--- /dev/null
+++ b/lib/OpenLayers/Format/WMC/v1.js
@@ -0,0 +1,835 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMC.js
+ * @requires OpenLayers/Format/XML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMC.v1
+ * Superclass for WMC version 1 parsers.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        ol: "http://openlayers.org/context",
+        wmc: "http://www.opengis.net/context",
+        sld: "http://www.opengis.net/sld",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+    
+    /**
+     * Property: schemaLocation
+     * {String} Schema location for a particular minor version.
+     */
+    schemaLocation: "",
+
+    /**
+     * Method: getNamespacePrefix
+     * Get the namespace prefix for a given uri from the <namespaces> object.
+     *
+     * Returns:
+     * {String} A namespace prefix or null if none found.
+     */
+    getNamespacePrefix: function(uri) {
+        var prefix = null;
+        if(uri == null) {
+            prefix = this.namespaces[this.defaultPrefix];
+        } else {
+            for(prefix in this.namespaces) {
+                if(this.namespaces[prefix] == uri) {
+                    break;
+                }
+            }
+        }
+        return prefix;
+    },
+    
+    /**
+     * Property: defaultPrefix
+     */
+    defaultPrefix: "wmc",
+
+    /**
+     * Property: rootPrefix
+     * {String} Prefix on the root node that maps to the context namespace URI.
+     */
+    rootPrefix: null,
+    
+    /**
+     * Property: defaultStyleName
+     * {String} Style name used if layer has no style param.  Default is "".
+     */
+    defaultStyleName: "",
+    
+    /**
+     * Property: defaultStyleTitle
+     * {String} Default style title.  Default is "Default".
+     */
+    defaultStyleTitle: "Default",
+    
+    /**
+     * Constructor: OpenLayers.Format.WMC.v1
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.WMC> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * Method: read
+     * Read capabilities data from a string, and return a list of layers. 
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array} List of named layers.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        this.rootPrefix = root.prefix;
+        var context = {
+            version: root.getAttribute("version")
+        };
+        this.runChildNodes(context, root);
+        return context;
+    },
+    
+    /**
+     * Method: runChildNodes
+     */
+    runChildNodes: function(obj, node) {
+        var children = node.childNodes;
+        var childNode, processor, prefix, local;
+        for(var i=0, len=children.length; i<len; ++i) {
+            childNode = children[i];
+            if(childNode.nodeType == 1) {
+                prefix = this.getNamespacePrefix(childNode.namespaceURI);
+                local = childNode.nodeName.split(":").pop();
+                processor = this["read_" + prefix + "_" + local];
+                if(processor) {
+                    processor.apply(this, [obj, childNode]);
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: read_wmc_General
+     */
+    read_wmc_General: function(context, node) {
+        this.runChildNodes(context, node);
+    },
+    
+    /**
+     * Method: read_wmc_BoundingBox
+     */
+    read_wmc_BoundingBox: function(context, node) {
+        context.projection = node.getAttribute("SRS");
+        context.bounds = new OpenLayers.Bounds(
+            parseFloat(node.getAttribute("minx")),
+            parseFloat(node.getAttribute("miny")),
+            parseFloat(node.getAttribute("maxx")),
+            parseFloat(node.getAttribute("maxy"))
+        );
+    },
+    
+    /**
+     * Method: read_wmc_LayerList
+     */
+    read_wmc_LayerList: function(context, node) {
+        // layersContext is an array containing info for each layer
+        context.layersContext = [];
+        this.runChildNodes(context, node);
+    },
+    
+    /**
+     * Method: read_wmc_Layer
+     */
+    read_wmc_Layer: function(context, node) {
+        var layerContext = {
+            visibility: (node.getAttribute("hidden") != "1"),
+            queryable: (node.getAttribute("queryable") == "1"),
+            formats: [],
+            styles: []
+        };
+
+        this.runChildNodes(layerContext, node);
+        // set properties common to multiple objects on layer options/params
+        context.layersContext.push(layerContext);
+    },
+    
+    /**
+     * Method: read_wmc_Extension
+     */
+    read_wmc_Extension: function(obj, node) {
+        this.runChildNodes(obj, node);
+    },
+
+    /**
+     * Method: read_ol_units
+     */
+    read_ol_units: function(layerContext, node) {
+        layerContext.units = this.getChildValue(node);
+    },
+    
+    /**
+     * Method: read_ol_maxExtent
+     */
+    read_ol_maxExtent: function(obj, node) {
+        var bounds = new OpenLayers.Bounds(
+            node.getAttribute("minx"), node.getAttribute("miny"),
+            node.getAttribute("maxx"), node.getAttribute("maxy")
+        );
+        obj.maxExtent = bounds;
+    },
+    
+    /**
+     * Method: read_ol_transparent
+     */
+    read_ol_transparent: function(layerContext, node) {
+        layerContext.transparent = this.getChildValue(node);
+    },
+
+    /**
+     * Method: read_ol_numZoomLevels
+     */
+    read_ol_numZoomLevels: function(layerContext, node) {
+        layerContext.numZoomLevels = parseInt(this.getChildValue(node));
+    },
+
+    /**
+     * Method: read_ol_opacity
+     */
+    read_ol_opacity: function(layerContext, node) {
+        layerContext.opacity = parseFloat(this.getChildValue(node));
+    },
+
+    /**
+     * Method: read_ol_singleTile
+     */
+    read_ol_singleTile: function(layerContext, node) {
+        layerContext.singleTile = (this.getChildValue(node) == "true");
+    },
+
+    /**
+     * Method: read_ol_tileSize
+     */
+    read_ol_tileSize: function(layerContext, node) {
+        var obj = {"width": node.getAttribute("width"), "height": node.getAttribute("height")};
+        layerContext.tileSize = obj;
+    },
+    
+    /**
+     * Method: read_ol_isBaseLayer
+     */
+    read_ol_isBaseLayer: function(layerContext, node) {
+        layerContext.isBaseLayer = (this.getChildValue(node) == "true");
+    },
+
+    /**
+     * Method: read_ol_displayInLayerSwitcher
+     */
+    read_ol_displayInLayerSwitcher: function(layerContext, node) {
+        layerContext.displayInLayerSwitcher = (this.getChildValue(node) == "true");
+    },
+
+    /**
+     * Method: read_wmc_Server
+     */
+    read_wmc_Server: function(layerContext, node) {
+        layerContext.version = node.getAttribute("version");
+        var server = {};
+        var links = node.getElementsByTagName("OnlineResource");
+        if(links.length > 0) {
+            this.read_wmc_OnlineResource(server, links[0]);
+        }
+        layerContext.url = server.href;
+    },
+
+    /**
+     * Method: read_wmc_FormatList
+     */
+    read_wmc_FormatList: function(layerContext, node) {
+        this.runChildNodes(layerContext, node);
+    },
+
+    /**
+     * Method: read_wmc_Format
+     */
+    read_wmc_Format: function(layerContext, node) {
+        var format = {
+            value: this.getChildValue(node)
+        };
+        if(node.getAttribute("current") == "1") {
+            format.current = true;
+        }
+        layerContext.formats.push(format);
+    },
+    
+    /**
+     * Method: read_wmc_StyleList
+     */
+    read_wmc_StyleList: function(layerContext, node) {
+        this.runChildNodes(layerContext, node);
+    },
+
+    /**
+     * Method: read_wmc_Style
+     */
+    read_wmc_Style: function(layerContext, node) {
+        var style = {};
+        this.runChildNodes(style, node);
+        if(node.getAttribute("current") == "1") {
+            style.current = true;
+        }
+        layerContext.styles.push(style);
+    },
+    
+    /**
+     * Method: read_wmc_SLD
+     */
+    read_wmc_SLD: function(style, node) {
+        this.runChildNodes(style, node);
+        // style either comes back with an href or a body property
+    },
+    
+    /**
+     * Method: read_sld_StyledLayerDescriptor
+     */
+    read_sld_StyledLayerDescriptor: function(sld, node) {
+        var xml = OpenLayers.Format.XML.prototype.write.apply(this, [node]);
+        sld.body = xml;
+    },
+
+    /**
+     * Method: read_wmc_OnlineResource
+     */
+    read_wmc_OnlineResource: function(obj, node) {
+        obj.href = this.getAttributeNS(
+            node, this.namespaces.xlink, "href"
+        );
+    },
+    
+    /**
+     * Method: read_wmc_Name
+     */
+    read_wmc_Name: function(obj, node) {
+        var name = this.getChildValue(node);
+        if(name) {
+            obj.name = name;
+        }
+    },
+
+    /**
+     * Method: read_wmc_Title
+     */
+    read_wmc_Title: function(obj, node) {
+        var title = this.getChildValue(node);
+        if(title) {
+            obj.title = title;
+        }
+    },
+
+    /**
+     * Method: read_wmc_MetadataURL
+     */
+    read_wmc_MetadataURL: function(layerContext, node) {
+        var metadataURL = {};
+        var links = node.getElementsByTagName("OnlineResource");
+        if(links.length > 0) {
+            this.read_wmc_OnlineResource(metadataURL, links[0]);
+        }
+        layerContext.metadataURL = metadataURL.href;
+
+    },
+
+    /**
+     * Method: read_wmc_Abstract
+     */
+    read_wmc_Abstract: function(obj, node) {
+        var abst = this.getChildValue(node);
+        if(abst) {
+            obj["abstract"] = abst;
+        }
+    },
+    
+    /**
+     * Method: read_wmc_LegendURL
+     */
+    read_wmc_LegendURL: function(style, node) {
+        var legend = {
+            width: node.getAttribute('width'),
+            height: node.getAttribute('height')
+        };
+        var links = node.getElementsByTagName("OnlineResource");
+        if(links.length > 0) {
+            this.read_wmc_OnlineResource(legend, links[0]);
+        }
+        style.legend = legend;
+    },
+    
+    /**
+     * Method: write
+     *
+     * Parameters:
+     * context - {Object} An object representing the map context.
+     * options - {Object} Optional object.
+     *
+     * Returns:
+     * {String} A WMC document string.
+     */
+    write: function(context, options) {
+        var root = this.createElementDefaultNS("ViewContext");
+        this.setAttributes(root, {
+            version: this.VERSION,
+            id: (options && typeof options.id == "string") ?
+                    options.id :
+                    OpenLayers.Util.createUniqueID("OpenLayers_Context_")
+        });
+        
+        // add schemaLocation attribute
+        this.setAttributeNS(
+            root, this.namespaces.xsi,
+            "xsi:schemaLocation", this.schemaLocation
+        );
+        
+        // required General element
+        root.appendChild(this.write_wmc_General(context));
+
+        // required LayerList element
+        root.appendChild(this.write_wmc_LayerList(context));
+
+        return OpenLayers.Format.XML.prototype.write.apply(this, [root]);
+    },
+    
+    /**
+     * Method: createElementDefaultNS
+     * Shorthand for createElementNS with namespace from <defaultPrefix>.
+     *     Can optionally be used to set attributes and a text child value.
+     *
+     * Parameters:
+     * name - {String} The qualified node name.
+     * childValue - {String} Optional value for text child node.
+     * attributes - {Object} Optional object representing attributes.
+     *
+     * Returns:
+     * {Element} An element node.
+     */
+    createElementDefaultNS: function(name, childValue, attributes) {
+        var node = this.createElementNS(
+            this.namespaces[this.defaultPrefix],
+            name
+        );
+        if(childValue) {
+            node.appendChild(this.createTextNode(childValue));
+        }
+        if(attributes) {
+            this.setAttributes(node, attributes);
+        }
+        return node;
+    },
+    
+    /**
+     * Method: setAttributes
+     * Set multiple attributes given key value pairs from an object.
+     *
+     * Parameters:
+     * node - {Element} An element node.
+     * obj - {Object} An object whose properties represent attribute names and
+     *     values represent attribute values.
+     */
+    setAttributes: function(node, obj) {
+        var value;
+        for(var name in obj) {
+            value = obj[name].toString();
+            if(value.match(/[A-Z]/)) {
+                // safari lowercases attributes with setAttribute
+                this.setAttributeNS(node, null, name, value);
+            } else {
+                node.setAttribute(name, value);
+            }
+        }
+    },
+
+    /**
+     * Method: write_wmc_General
+     * Create a General node given an context object.
+     *
+     * Parameters:
+     * context - {Object} Context object.
+     *
+     * Returns:
+     * {Element} A WMC General element node.
+     */
+    write_wmc_General: function(context) {
+        var node = this.createElementDefaultNS("General");
+
+        // optional Window element
+        if(context.size) {
+            node.appendChild(this.createElementDefaultNS(
+                "Window", null,
+                {
+                    width: context.size.w,
+                    height: context.size.h
+                }
+            ));
+        }
+        
+        // required BoundingBox element
+        var bounds = context.bounds;
+        node.appendChild(this.createElementDefaultNS(
+            "BoundingBox", null,
+            {
+                minx: bounds.left.toPrecision(18),
+                miny: bounds.bottom.toPrecision(18),
+                maxx: bounds.right.toPrecision(18),
+                maxy: bounds.top.toPrecision(18),
+                SRS: context.projection
+            }
+        ));
+
+        // required Title element
+        node.appendChild(this.createElementDefaultNS(
+            "Title", context.title
+        ));
+        
+        // OpenLayers specific map properties
+        node.appendChild(this.write_ol_MapExtension(context));
+        
+        return node;
+    },
+    
+    /**
+     * Method: write_ol_MapExtension
+     */
+    write_ol_MapExtension: function(context) {
+        var node = this.createElementDefaultNS("Extension");
+        
+        var bounds = context.maxExtent;
+        if(bounds) {
+            var maxExtent = this.createElementNS(
+                this.namespaces.ol, "ol:maxExtent"
+            );
+            this.setAttributes(maxExtent, {
+                minx: bounds.left.toPrecision(18),
+                miny: bounds.bottom.toPrecision(18),
+                maxx: bounds.right.toPrecision(18),
+                maxy: bounds.top.toPrecision(18)
+            });
+            node.appendChild(maxExtent);
+        }
+        
+        return node;
+    },
+    
+    /**
+     * Method: write_wmc_LayerList
+     * Create a LayerList node given an context object.
+     *
+     * Parameters:
+     * context - {Object} Context object.
+     *
+     * Returns:
+     * {Element} A WMC LayerList element node.
+     */
+    write_wmc_LayerList: function(context) {
+        var list = this.createElementDefaultNS("LayerList");
+        
+        for(var i=0, len=context.layersContext.length; i<len; ++i) {
+            list.appendChild(this.write_wmc_Layer(context.layersContext[i]));
+        }
+        
+        return list;
+    },
+
+    /**
+     * Method: write_wmc_Layer
+     * Create a Layer node given a layer context object.
+     *
+     * Parameters:
+     * context - {Object} A layer context object.}
+     *
+     * Returns:
+     * {Element} A WMC Layer element node.
+     */
+    write_wmc_Layer: function(context) {
+        var node = this.createElementDefaultNS(
+            "Layer", null, {
+                queryable: context.queryable ? "1" : "0",
+                hidden: context.visibility ? "0" : "1"
+            }
+        );
+        
+        // required Server element
+        node.appendChild(this.write_wmc_Server(context));
+
+        // required Name element
+        node.appendChild(this.createElementDefaultNS(
+            "Name", context.name
+        ));
+        
+        // required Title element
+        node.appendChild(this.createElementDefaultNS(
+            "Title", context.title
+        ));
+
+        // optional MetadataURL element
+        if (context.metadataURL) {
+            node.appendChild(this.write_wmc_MetadataURL(context.metadataURL));
+        }
+        
+        return node;
+    },
+    
+    /**
+     * Method: write_wmc_LayerExtension
+     * Add OpenLayers specific layer parameters to an Extension element.
+     *
+     * Parameters:
+     * context - {Object} A layer context object.
+     *
+     * Returns:
+     * {Element} A WMC Extension element (for a layer).
+     */
+    write_wmc_LayerExtension: function(context) {
+        var node = this.createElementDefaultNS("Extension");
+        
+        var bounds = context.maxExtent;
+        var maxExtent = this.createElementNS(
+            this.namespaces.ol, "ol:maxExtent"
+        );
+        this.setAttributes(maxExtent, {
+            minx: bounds.left.toPrecision(18),
+            miny: bounds.bottom.toPrecision(18),
+            maxx: bounds.right.toPrecision(18),
+            maxy: bounds.top.toPrecision(18)
+        });
+        node.appendChild(maxExtent);
+        
+        if (context.tileSize && !context.singleTile) {
+            var size = this.createElementNS(
+                this.namespaces.ol, "ol:tileSize"
+            );
+            this.setAttributes(size, context.tileSize);
+            node.appendChild(size);
+        }
+        
+        var properties = [
+            "transparent", "numZoomLevels", "units", "isBaseLayer",
+            "opacity", "displayInLayerSwitcher", "singleTile"
+        ];
+        var child;
+        for(var i=0, len=properties.length; i<len; ++i) {
+            child = this.createOLPropertyNode(context, properties[i]);
+            if(child) {
+                node.appendChild(child);
+            }
+        }
+
+        return node;
+    },
+    
+    /**
+     * Method: createOLPropertyNode
+     * Create a node representing an OpenLayers property.  If the property is
+     *     null or undefined, null will be returned.
+     *
+     * Parameters:
+     * object - {Object} An object.
+     * prop - {String} A property.
+     *
+     * Returns:
+     * {Element} A property node.
+     */
+    createOLPropertyNode: function(obj, prop) {
+        var node = null;
+        if(obj[prop] != null) {
+            node = this.createElementNS(this.namespaces.ol, "ol:" + prop);
+            node.appendChild(this.createTextNode(obj[prop].toString()));
+        }
+        return node;
+    },
+
+    /**
+     * Method: write_wmc_Server
+     * Create a Server node given a layer context object.
+     *
+     * Parameters:
+     * context - {Object} Layer context object.
+     *
+     * Returns:
+     * {Element} A WMC Server element node.
+     */
+    write_wmc_Server: function(context) {
+        var node = this.createElementDefaultNS("Server");
+        this.setAttributes(node, {
+            service: "OGC:WMS",
+            version: context.version
+        });
+        
+        // required OnlineResource element
+        node.appendChild(this.write_wmc_OnlineResource(context.url));
+        
+        return node;
+    },
+
+    /**
+     * Method: write_wmc_MetadataURL
+     * Create a MetadataURL node given a metadataURL string.
+     *
+     * Parameters:
+     * metadataURL - {String} MetadataURL string value.
+     *
+     * Returns:
+     * {Element} A WMC metadataURL element node.
+     */
+    write_wmc_MetadataURL: function(metadataURL) {
+        var node = this.createElementDefaultNS("MetadataURL");
+
+        // required OnlineResource element
+        node.appendChild(this.write_wmc_OnlineResource(metadataURL));
+
+        return node;
+    },
+
+    /**
+     * Method: write_wmc_FormatList
+     * Create a FormatList node given a layer context.
+     *
+     * Parameters:
+     * context - {Object} Layer context object.
+     *
+     * Returns:
+     * {Element} A WMC FormatList element node.
+     */
+    write_wmc_FormatList: function(context) {
+        var node = this.createElementDefaultNS("FormatList");
+        for (var i=0, len=context.formats.length; i<len; i++) {
+            var format = context.formats[i];
+            node.appendChild(this.createElementDefaultNS(
+                "Format",
+                format.value,
+                (format.current && format.current == true) ?
+                    {current: "1"} : null
+            ));
+        }
+
+        return node;
+    },
+
+    /**
+     * Method: write_wmc_StyleList
+     * Create a StyleList node given a layer context.
+     *
+     * Parameters:
+     * context - {Object} Layer context object.
+     *
+     * Returns:
+     * {Element} A WMC StyleList element node.
+     */
+    write_wmc_StyleList: function(layer) {
+        var node = this.createElementDefaultNS("StyleList");
+
+        var styles = layer.styles;
+        if (styles && styles instanceof Array) {
+            var sld;
+            for (var i=0, len=styles.length; i<len; i++) {
+                var s = styles[i];
+                // three style types to consider
+                // [1] linked SLD
+                // [2] inline SLD
+                // [3] named style
+                // running child nodes always gets name, optionally gets href or body
+                var style = this.createElementDefaultNS(
+                    "Style",
+                    null,
+                    (s.current && s.current == true) ?
+                    {current: "1"} : null
+                );
+                if(s.href) { // [1]
+                    sld = this.createElementDefaultNS("SLD");
+                    var link = this.write_wmc_OnlineResource(s.href);
+                    sld.appendChild(link);
+                    // Name is required.
+                    sld.appendChild(this.createElementDefaultNS("Name", s.name));
+                    // Title is optional.
+                    if (s.title) {
+                        sld.appendChild(this.createElementDefaultNS("Title", s.title));
+                    }
+                    style.appendChild(sld);
+                } else if(s.body) { // [2]
+                    sld = this.createElementDefaultNS("SLD");
+                    // read in body as xml doc - assume proper namespace declarations
+                    var doc = OpenLayers.Format.XML.prototype.read.apply(this, [s.body]);
+                    // append to StyledLayerDescriptor node
+                    var imported = doc.documentElement;
+                    if(sld.ownerDocument && sld.ownerDocument.importNode) {
+                        imported = sld.ownerDocument.importNode(imported, true);
+                    }
+                    sld.appendChild(imported);
+                    // Name is required.
+                    sld.appendChild(this.createElementDefaultNS("Name", s.name));
+                    // Title is optional.
+                    if (s.title) {
+                        sld.appendChild(this.createElementDefaultNS("Title", s.title));
+                    }
+                    style.appendChild(sld);            
+                } else { // [3]
+                    // both Name and Title are required.
+                    style.appendChild(this.createElementDefaultNS("Name", s.name));
+                    style.appendChild(this.createElementDefaultNS("Title", s.title));
+                    // Abstract is optional
+                    if (s['abstract']) { // abstract is a js keyword
+                        style.appendChild(this.createElementDefaultNS(
+                            "Abstract", s['abstract']
+                        ));
+                    }
+                }
+                node.appendChild(style);
+            }
+        }
+
+        return node;
+    },
+
+    /**
+     * Method: write_wmc_OnlineResource
+     * Create an OnlineResource node given a URL.
+     *
+     * Parameters:
+     * href - {String} URL for the resource.
+     *
+     * Returns:
+     * {Element} A WMC OnlineResource element node.
+     */
+    write_wmc_OnlineResource: function(href) {
+        var node = this.createElementDefaultNS("OnlineResource");
+        this.setAttributeNS(node, this.namespaces.xlink, "xlink:type", "simple");
+        this.setAttributeNS(node, this.namespaces.xlink, "xlink:href", href);
+        return node;
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WMC.v1" 
+
+});
diff --git a/lib/OpenLayers/Format/WMC/v1_0_0.js b/lib/OpenLayers/Format/WMC/v1_0_0.js
new file mode 100644
index 0000000..3a41344
--- /dev/null
+++ b/lib/OpenLayers/Format/WMC/v1_0_0.js
@@ -0,0 +1,76 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMC/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMC.v1_0_0
+ * Read and write WMC version 1.0.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WMC.v1>
+ */
+OpenLayers.Format.WMC.v1_0_0 = OpenLayers.Class(
+    OpenLayers.Format.WMC.v1, {
+    
+    /**
+     * Constant: VERSION
+     * {String} 1.0.0
+     */
+    VERSION: "1.0.0",
+    
+    /**
+     * Property: schemaLocation
+     * {String} http://www.opengis.net/context
+     *     http://schemas.opengis.net/context/1.0.0/context.xsd
+     */
+    schemaLocation: "http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd",
+
+    /**
+     * Constructor: OpenLayers.Format.WMC.v1_0_0
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.WMC> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.WMC.v1.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+
+    /**
+     * Method: write_wmc_Layer
+     * Create a Layer node given a layer context object. This method adds
+     *     elements specific to version 1.0.0.
+     *
+     * Parameters:
+     * context - {Object} A layer context object.}
+     *
+     * Returns:
+     * {Element} A WMC Layer element node.
+     */
+    write_wmc_Layer: function(context) {
+        var node = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(
+            this, [context]
+        );
+    
+        // optional FormatList element
+        node.appendChild(this.write_wmc_FormatList(context));
+
+        // optional StyleList element
+        node.appendChild(this.write_wmc_StyleList(context));
+        
+        // OpenLayers specific properties go in an Extension element
+        node.appendChild(this.write_wmc_LayerExtension(context));
+    },    
+
+    CLASS_NAME: "OpenLayers.Format.WMC.v1_0_0" 
+
+});
diff --git a/lib/OpenLayers/Format/WMC/v1_1_0.js b/lib/OpenLayers/Format/WMC/v1_1_0.js
new file mode 100644
index 0000000..fc88f2a
--- /dev/null
+++ b/lib/OpenLayers/Format/WMC/v1_1_0.js
@@ -0,0 +1,127 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMC/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMC.v1_1_0
+ * Read and write WMC version 1.1.0.
+ *
+ * Differences between 1.1.0 and 1.0.0:
+ *     - 1.1.0 Layers have optional sld:MinScaleDenominator and
+ *       sld:MaxScaleDenominator
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WMC.v1>
+ */
+OpenLayers.Format.WMC.v1_1_0 = OpenLayers.Class(
+    OpenLayers.Format.WMC.v1, {
+    
+    /**
+     * Constant: VERSION
+     * {String} 1.1.0
+     */
+    VERSION: "1.1.0",
+
+    /**
+     * Property: schemaLocation
+     * {String} http://www.opengis.net/context
+     *     http://schemas.opengis.net/context/1.1.0/context.xsd
+     */
+    schemaLocation: "http://www.opengis.net/context http://schemas.opengis.net/context/1.1.0/context.xsd",
+
+    /**
+     * Constructor: OpenLayers.Format.WMC.v1_1_0
+     * Instances of this class are not created directly.  Use the
+     *     <OpenLayers.Format.WMC> constructor instead.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.WMC.v1.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+
+    /**
+     * Method: read_sld_MinScaleDenominator
+     * Read a sld:MinScaleDenominator node.
+     *
+     * Parameters:
+     * layerContext - {Object} An object representing a layer.
+     * node - {Element} An element node.
+     */
+    read_sld_MinScaleDenominator: function(layerContext, node) {
+        var minScaleDenominator = parseFloat(this.getChildValue(node));
+        if (minScaleDenominator > 0) {
+            layerContext.maxScale = minScaleDenominator;
+        }
+    },
+
+    /**
+     * Method: read_sld_MaxScaleDenominator
+     * Read a sld:MaxScaleDenominator node.
+     *
+     * Parameters:
+     * layerContext - {Object} An object representing a layer.
+     * node - {Element} An element node.
+     */
+    read_sld_MaxScaleDenominator: function(layerContext, node) {
+        layerContext.minScale = parseFloat(this.getChildValue(node));
+    },
+
+    /**
+     * Method: write_wmc_Layer
+     * Create a Layer node given a layer context object. This method adds
+     *     elements specific to version 1.1.0.
+     *
+     * Parameters:
+     * context - {Object} A layer context object.}
+     *
+     * Returns:
+     * {Element} A WMC Layer element node.
+     */
+    write_wmc_Layer: function(context) {
+        var node = OpenLayers.Format.WMC.v1.prototype.write_wmc_Layer.apply(
+            this, [context]
+        );
+        
+        // min/max scale denominator elements go before the 4th element in v1
+        if(context.maxScale) {
+            var minSD = this.createElementNS(
+                this.namespaces.sld, "sld:MinScaleDenominator"
+            );
+            minSD.appendChild(this.createTextNode(context.maxScale.toPrecision(16)));
+            node.appendChild(minSD);
+        }
+        
+        if(context.minScale) {
+            var maxSD = this.createElementNS(
+                this.namespaces.sld, "sld:MaxScaleDenominator"
+            );
+            maxSD.appendChild(this.createTextNode(context.minScale.toPrecision(16)));
+            node.appendChild(maxSD);
+        }
+
+        // optional FormatList element
+        node.appendChild(this.write_wmc_FormatList(context));
+
+        // optional StyleList element
+        node.appendChild(this.write_wmc_StyleList(context));
+        
+        // OpenLayers specific properties go in an Extension element
+        node.appendChild(this.write_wmc_LayerExtension(context));
+        
+        return node;
+        
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WMC.v1_1_0" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSCapabilities.js b/lib/OpenLayers/Format/WMSCapabilities.js
new file mode 100644
index 0000000..3114afa
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSCapabilities.js
@@ -0,0 +1,82 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSCapabilities
+ * Read WMS Capabilities.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WMSCapabilities = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "1.1.1".
+     */
+    defaultVersion: "1.1.1",
+    
+    /**
+     * APIProperty: version
+     * {String} Specify a version string if one is known.
+     */
+    version: null,
+    
+    /**
+     * Property: parser
+     * {<OpenLayers.Format>} A cached versioned format used for reading.
+     */
+    parser: null,
+
+    /**
+     * Constructor: OpenLayers.Format.WMSCapabilities
+     * Create a new parser for WMS capabilities.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read capabilities data from a string, and return a list of layers. 
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array} List of named layers.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        var version = this.version || root.getAttribute("version") || this.defaultVersion;
+        if(!this.parser || this.parser.version !== version) {
+            var constr = OpenLayers.Format.WMSCapabilities[
+                "v" + version.replace(/\./g, "_")
+            ];
+            if(!constr) {
+                throw "Can't find a WMS capabilities parser for version " + version;
+            }
+            this.parser = new constr(this.options);
+        }
+        var capabilities = this.parser.read(data);
+        capabilities.version = version;
+        return capabilities;
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities" 
+
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/Format/WMSCapabilities/v1.js b/lib/OpenLayers/Format/WMSCapabilities/v1.js
new file mode 100644
index 0000000..7cf9166
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSCapabilities/v1.js
@@ -0,0 +1,418 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMSCapabilities.js
+ * @requires OpenLayers/Format/XML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSCapabilities.v1
+ * Abstract class not to be instantiated directly. Creates
+ * the common parts for both WMS 1.1.X and WMS 1.3.X.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WMSCapabilities.v1 = OpenLayers.Class(
+    OpenLayers.Format.XML, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        wms: "http://www.opengis.net/wms",
+        xlink: "http://www.w3.org/1999/xlink",
+        xsi: "http://www.w3.org/2001/XMLSchema-instance"
+    },
+
+    /**
+     * Property: defaultPrefix
+     */
+    defaultPrefix: "wms",
+    
+    /**
+     * Constructor: OpenLayers.Format.WMSCapabilities.v1
+     * Create an instance of one of the subclasses.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Read capabilities data from a string, and return a list of layers. 
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array} List of named layers.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var capabilities = {};
+        this.readNode(data, capabilities);
+    
+        // postprocess the layer list
+        this.postProcessLayers(capabilities);
+    
+        return capabilities;
+    },
+
+    /**
+     * Method: postProcessLayers
+     * Post process the layers, so that the nested layer structure is converted
+     * to a flat layer list with only named layers.
+     *
+     * Parameters:
+     * capabilities - {Object} The object (structure) returned by the parser with
+     *     all the info from the GetCapabilities response.
+     */
+    postProcessLayers: function(capabilities) {
+        if (capabilities.capability) {
+            capabilities.capability.layers = [];
+            var layers = capabilities.capability.nestedLayers;
+            for (var i=0, len = layers.length; i<len; ++i) {
+                var layer = layers[i];
+                this.processLayer(capabilities.capability, layer);
+            }
+        }
+    },
+
+    /**
+     * Method: processLayer
+     * Recursive submethod of postProcessLayers. This function will among
+     * others deal with property inheritance.
+     *
+     * Parameters:
+     * capability - {Object} The capability part of the capabilities object
+     * layer - {Object} The layer that needs processing
+     * parentLayer - {Object} The parent layer of the respective layer
+    */
+    processLayer: function(capability, layer, parentLayer) {
+        if (layer.formats === undefined) {
+            layer.formats = capability.request.getmap.formats;
+        }
+
+        // deal with property inheritance
+        if(parentLayer) {
+            // add style
+            layer.styles = layer.styles.concat(parentLayer.styles);
+            var attributes = ["queryable",
+                              "cascaded",
+                              "fixedWidth",
+                              "fixedHeight",
+                              "opaque",
+                              "noSubsets",
+                              "llbbox",
+                              "minScale",
+                              "maxScale",
+                              "attribution"];
+
+            var complexAttr = ["srs",
+                               "bbox",
+                               "dimensions",
+                               "authorityURLs"];
+            
+            var key;
+            for (var j=0; j<attributes.length; j++) {
+                key = attributes[j];
+                if (key in parentLayer) {
+                    // only take parent value if not present (null or undefined)
+                    if (layer[key] == null) {
+                        layer[key] = parentLayer[key];
+                    }
+                    // if attribute isn't present, and we haven't
+                    // inherited anything from a parent layer
+                    // set to default value
+                    if (layer[key] == null) {
+                        var intAttr = ["cascaded", "fixedWidth", "fixedHeight"];
+                        var boolAttr = ["queryable", "opaque", "noSubsets"];
+                        if (OpenLayers.Util.indexOf(intAttr, key) != -1) {
+                            layer[key] = 0;
+                        }
+                        if (OpenLayers.Util.indexOf(boolAttr, key) != -1) {
+                            layer[key] = false;
+                        }
+                    }
+                }
+            }
+
+            for (var j=0; j<complexAttr.length; j++) {
+                key = complexAttr[j];
+                layer[key] = OpenLayers.Util.extend(
+                    layer[key], parentLayer[key]);
+            }
+        }
+
+        // process sublayers
+        for (var i=0, len=layer.nestedLayers.length; i<len; i++) {
+            var childLayer = layer.nestedLayers[i];
+            this.processLayer(capability, childLayer, layer);
+        }
+        
+        if (layer.name) {
+            capability.layers.push(layer);
+        }
+    
+    },
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "wms": {
+            "Service": function(node, obj) {
+                obj.service = {};
+                this.readChildNodes(node, obj.service);
+            },
+            "Name": function(node, obj) {
+                obj.name = this.getChildValue(node);
+            },
+            "Title": function(node, obj) {
+                obj.title = this.getChildValue(node);
+            },
+            "Abstract": function(node, obj) {
+                obj["abstract"] = this.getChildValue(node);
+            },
+            "BoundingBox": function(node, obj) {
+                var bbox = {};
+                bbox.bbox = [
+                    parseFloat(node.getAttribute("minx")),
+                    parseFloat(node.getAttribute("miny")),
+                    parseFloat(node.getAttribute("maxx")),
+                    parseFloat(node.getAttribute("maxy"))
+                ];
+                var res = {
+                    x: parseFloat(node.getAttribute("resx")),
+                    y: parseFloat(node.getAttribute("resy"))
+                };
+
+                if (! (isNaN(res.x) && isNaN(res.y))) {
+                    bbox.res = res;
+                }
+                // return the bbox so that descendant classes can set the
+                // CRS and SRS and add it to the obj
+                return bbox;
+            },
+            "OnlineResource": function(node, obj) {
+                obj.href = this.getAttributeNS(node, this.namespaces.xlink, 
+                    "href");
+            },
+            "ContactInformation": function(node, obj) {
+                obj.contactInformation = {};
+                this.readChildNodes(node, obj.contactInformation);
+            },
+            "ContactPersonPrimary": function(node, obj) {
+                obj.personPrimary = {};
+                this.readChildNodes(node, obj.personPrimary);
+            },
+            "ContactPerson": function(node, obj) {
+                obj.person = this.getChildValue(node);
+            },
+            "ContactOrganization": function(node, obj) {
+                obj.organization = this.getChildValue(node);
+            },
+            "ContactPosition": function(node, obj) {
+                obj.position = this.getChildValue(node);
+            },
+            "ContactAddress": function(node, obj) {
+                obj.contactAddress = {};
+                this.readChildNodes(node, obj.contactAddress);
+            },
+            "AddressType": function(node, obj) {
+                obj.type = this.getChildValue(node);
+            },
+            "Address": function(node, obj) {
+                obj.address = this.getChildValue(node);
+            },
+            "City": function(node, obj) {
+                obj.city = this.getChildValue(node);
+            },
+            "StateOrProvince": function(node, obj) {
+                obj.stateOrProvince = this.getChildValue(node);
+            },
+            "PostCode": function(node, obj) {
+                obj.postcode = this.getChildValue(node);
+            },
+            "Country": function(node, obj) {
+                obj.country = this.getChildValue(node);
+            },
+            "ContactVoiceTelephone": function(node, obj) {
+                obj.phone = this.getChildValue(node);
+            },
+            "ContactFacsimileTelephone": function(node, obj) {
+                obj.fax = this.getChildValue(node);
+            },
+            "ContactElectronicMailAddress": function(node, obj) {
+                obj.email = this.getChildValue(node);
+            },
+            "Fees": function(node, obj) {
+                var fees = this.getChildValue(node);
+                if (fees && fees.toLowerCase() != "none") {
+                    obj.fees = fees;
+                }
+            },
+            "AccessConstraints": function(node, obj) {
+                var constraints = this.getChildValue(node);
+                if (constraints && constraints.toLowerCase() != "none") {
+                    obj.accessConstraints = constraints;
+                }
+            },
+            "Capability": function(node, obj) {
+                obj.capability = {nestedLayers: []};
+                this.readChildNodes(node, obj.capability);
+            },
+            "Request": function(node, obj) {
+                obj.request = {};
+                this.readChildNodes(node, obj.request);
+            },
+            "GetCapabilities": function(node, obj) {
+                obj.getcapabilities = {formats: []};
+                this.readChildNodes(node, obj.getcapabilities);
+            },
+            "Format": function(node, obj) {
+                if (obj.formats instanceof Array) {
+                    obj.formats.push(this.getChildValue(node));
+                } else {
+                    obj.format = this.getChildValue(node);
+                }
+            },
+            "DCPType": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "HTTP": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Get": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Post": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "GetMap": function(node, obj) {
+                obj.getmap = {formats: []};
+                this.readChildNodes(node, obj.getmap);
+            },
+            "GetFeatureInfo": function(node, obj) {
+                obj.getfeatureinfo = {formats: []};
+                this.readChildNodes(node, obj.getfeatureinfo);
+            },
+            "Exception": function(node, obj) {
+                obj.exception = {formats: []};
+                this.readChildNodes(node, obj.exception);
+            },
+            "Layer": function(node, obj) {
+                var attrNode = node.getAttributeNode("queryable");
+                var queryable = (attrNode && attrNode.specified) ? 
+                    node.getAttribute("queryable") : null;
+                attrNode = node.getAttributeNode("cascaded");
+                var cascaded = (attrNode && attrNode.specified) ?
+                    node.getAttribute("cascaded") : null;
+                attrNode = node.getAttributeNode("opaque");
+                var opaque = (attrNode && attrNode.specified) ?
+                    node.getAttribute('opaque') : null;
+                var noSubsets = node.getAttribute('noSubsets');
+                var fixedWidth = node.getAttribute('fixedWidth');
+                var fixedHeight = node.getAttribute('fixedHeight');
+                var layer = {nestedLayers: [], styles: [], srs: {}, 
+                    metadataURLs: [], bbox: {}, dimensions: {},
+                    authorityURLs: {}, identifiers: {}, keywords: [],
+                    queryable: (queryable && queryable !== "") ? 
+                        ( queryable === "1" || queryable === "true" ) : null,
+                    cascaded: (cascaded !== null) ? parseInt(cascaded) : null,
+                    opaque: opaque ? 
+                        (opaque === "1" || opaque === "true" ) : null,
+                    noSubsets: (noSubsets !== null) ? 
+                        ( noSubsets === "1" || noSubsets === "true" ) : null,
+                    fixedWidth: (fixedWidth != null) ? 
+                        parseInt(fixedWidth) : null,
+                    fixedHeight: (fixedHeight != null) ? 
+                        parseInt(fixedHeight) : null
+                };
+                obj.nestedLayers.push(layer);
+                this.readChildNodes(node, layer);
+                if(layer.name) {
+                    var parts = layer.name.split(":");
+                    if(parts.length > 0) {
+                        layer.prefix = parts[0];
+                    }
+                }
+            },
+            "Attribution": function(node, obj) {
+                obj.attribution = {};
+                this.readChildNodes(node, obj.attribution);
+            },
+            "LogoURL": function(node, obj) {
+                obj.logo = {
+                    width: node.getAttribute("width"),
+                    height: node.getAttribute("height")
+                };
+                this.readChildNodes(node, obj.logo);
+            },
+            "Style": function(node, obj) {
+                var style = {};
+                obj.styles.push(style);
+                this.readChildNodes(node, style);
+            },
+            "LegendURL": function(node, obj) {
+                var legend = {
+                    width: node.getAttribute("width"),
+                    height: node.getAttribute("height")
+                };
+                obj.legend = legend;
+                this.readChildNodes(node, legend);
+            },
+            "MetadataURL": function(node, obj) {
+                var metadataURL = {type: node.getAttribute("type")};
+                obj.metadataURLs.push(metadataURL);
+                this.readChildNodes(node, metadataURL);
+            },
+            "DataURL": function(node, obj) {
+                obj.dataURL = {};
+                this.readChildNodes(node, obj.dataURL);
+            },
+            "FeatureListURL": function(node, obj) {
+                obj.featureListURL = {};
+                this.readChildNodes(node, obj.featureListURL);
+            },
+            "AuthorityURL": function(node, obj) {
+                var name = node.getAttribute("name");
+                var authority = {};
+                this.readChildNodes(node, authority);
+                obj.authorityURLs[name] = authority.href;
+            },
+            "Identifier": function(node, obj) {
+                var authority = node.getAttribute("authority");
+                obj.identifiers[authority] = this.getChildValue(node);
+            },
+            "KeywordList": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "SRS": function(node, obj) {
+                obj.srs[this.getChildValue(node)] = true;
+            }
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSCapabilities/v1_1.js b/lib/OpenLayers/Format/WMSCapabilities/v1_1.js
new file mode 100644
index 0000000..8af1b7d
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSCapabilities/v1_1.js
@@ -0,0 +1,118 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMSCapabilities/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSCapabilities.v1_1
+ * Abstract class not to be instantiated directly.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WMSCapabilities.v1>
+ */
+OpenLayers.Format.WMSCapabilities.v1_1 = OpenLayers.Class(
+    OpenLayers.Format.WMSCapabilities.v1, {
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "wms": OpenLayers.Util.applyDefaults({
+            "WMT_MS_Capabilities": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Keyword": function(node, obj) {
+                if (obj.keywords) {
+                    obj.keywords.push(this.getChildValue(node));
+                }
+            },
+            "DescribeLayer": function(node, obj) {
+                obj.describelayer = {formats: []};
+                this.readChildNodes(node, obj.describelayer);
+            },
+            "GetLegendGraphic": function(node, obj) {
+                obj.getlegendgraphic = {formats: []};
+                this.readChildNodes(node, obj.getlegendgraphic);
+            },
+            "GetStyles": function(node, obj) {
+                obj.getstyles = {formats: []};
+                this.readChildNodes(node, obj.getstyles);
+            },
+            "PutStyles": function(node, obj) {
+                obj.putstyles = {formats: []};
+                this.readChildNodes(node, obj.putstyles);
+            },
+            "UserDefinedSymbolization": function(node, obj) {
+                var userSymbols = {
+                    supportSLD: parseInt(node.getAttribute("SupportSLD")) == 1,
+                    userLayer: parseInt(node.getAttribute("UserLayer")) == 1,
+                    userStyle: parseInt(node.getAttribute("UserStyle")) == 1,
+                    remoteWFS: parseInt(node.getAttribute("RemoteWFS")) == 1
+                };
+                obj.userSymbols = userSymbols;
+            },
+            "LatLonBoundingBox": function(node, obj) {
+                obj.llbbox = [
+                    parseFloat(node.getAttribute("minx")),
+                    parseFloat(node.getAttribute("miny")),
+                    parseFloat(node.getAttribute("maxx")),
+                    parseFloat(node.getAttribute("maxy"))
+                ];
+            },
+            "BoundingBox": function(node, obj) {
+                var bbox = OpenLayers.Format.WMSCapabilities.v1.prototype.readers["wms"].BoundingBox.apply(this, [node, obj]);
+                bbox.srs  = node.getAttribute("SRS");
+                obj.bbox[bbox.srs] = bbox;
+            },
+            "ScaleHint": function(node, obj) {
+                var min = node.getAttribute("min");
+                var max = node.getAttribute("max");
+                var rad2 = Math.pow(2, 0.5);
+                var ipm = OpenLayers.INCHES_PER_UNIT["m"];
+                obj.maxScale = parseFloat(
+                    ((min / rad2) * ipm * 
+                        OpenLayers.DOTS_PER_INCH).toPrecision(13)
+                );
+                obj.minScale = parseFloat(
+                    ((max / rad2) * ipm * 
+                        OpenLayers.DOTS_PER_INCH).toPrecision(13)
+                );
+            },
+            "Dimension": function(node, obj) {
+                var name = node.getAttribute("name").toLowerCase();
+                var dim = {
+                    name: name,
+                    units: node.getAttribute("units"),
+                    unitsymbol: node.getAttribute("unitSymbol")
+                };
+                obj.dimensions[dim.name] = dim;
+            },
+            "Extent": function(node, obj) {
+                var name = node.getAttribute("name").toLowerCase();
+                if (name in obj["dimensions"]) {
+                    var extent = obj.dimensions[name];
+                    extent.nearestVal = 
+                        node.getAttribute("nearestValue") === "1";
+                    extent.multipleVal = 
+                        node.getAttribute("multipleValues") === "1";
+                    extent.current = node.getAttribute("current") === "1";
+                    extent["default"] = node.getAttribute("default") || "";
+                    var values = this.getChildValue(node);
+                    extent.values = values.split(",");
+                }
+                }
+        }, OpenLayers.Format.WMSCapabilities.v1.prototype.readers["wms"])
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSCapabilities/v1_1_0.js b/lib/OpenLayers/Format/WMSCapabilities/v1_1_0.js
new file mode 100644
index 0000000..52eba6b
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSCapabilities/v1_1_0.js
@@ -0,0 +1,62 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMSCapabilities/v1_1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSCapabilities/v1_1_0
+ * Read WMS Capabilities version 1.1.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WMSCapabilities.v1_1>
+ */
+OpenLayers.Format.WMSCapabilities.v1_1_0 = OpenLayers.Class(
+    OpenLayers.Format.WMSCapabilities.v1_1, {
+    
+    /**
+     * Property: version
+     * {String} The specific parser version.
+     */
+    version: "1.1.0",
+    
+    /**
+     * Constructor: OpenLayers.Format.WMSCapabilities.v1_1_0
+     * Create a new parser for WMS capabilities version 1.1.0.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.WMSCapabilities.v1_1.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "wms": OpenLayers.Util.applyDefaults({
+            "SRS": function(node, obj) {
+                var srs = this.getChildValue(node);
+                var values = srs.split(/ +/);
+                for (var i=0, len=values.length; i<len; i++) {
+                    obj.srs[values[i]] = true;
+                }
+            }
+        }, OpenLayers.Format.WMSCapabilities.v1_1.prototype.readers["wms"])
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1_0" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSCapabilities/v1_1_1.js b/lib/OpenLayers/Format/WMSCapabilities/v1_1_1.js
new file mode 100644
index 0000000..8cb0fa2
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSCapabilities/v1_1_1.js
@@ -0,0 +1,58 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMSCapabilities/v1_1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSCapabilities/v1_1_1
+ * Read WMS Capabilities version 1.1.1.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WMSCapabilities.v1_1>
+ */
+OpenLayers.Format.WMSCapabilities.v1_1_1 = OpenLayers.Class(
+    OpenLayers.Format.WMSCapabilities.v1_1, {
+    
+    /**
+     * Property: version
+     * {String} The specific parser version.
+     */
+    version: "1.1.1",
+    
+    /**
+     * Constructor: OpenLayers.Format.WMSCapabilities.v1_1_1
+     * Create a new parser for WMS capabilities version 1.1.1.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.WMSCapabilities.v1_1.prototype.initialize.apply(
+            this, [options]
+        );
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "wms": OpenLayers.Util.applyDefaults({
+            "SRS": function(node, obj) {
+                obj.srs[this.getChildValue(node)] = true;
+            }
+        }, OpenLayers.Format.WMSCapabilities.v1_1.prototype.readers["wms"])
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_1_1" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSCapabilities/v1_3.js b/lib/OpenLayers/Format/WMSCapabilities/v1_3.js
new file mode 100644
index 0000000..6662c1e
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSCapabilities/v1_3.js
@@ -0,0 +1,128 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMSCapabilities/v1.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSCapabilities/v1_3
+ * Abstract base class for WMS Capabilities version 1.3.X. 
+ * SLD 1.1.0 adds in the extra operations DescribeLayer and GetLegendGraphic, 
+ * see: http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WMSCapabilities.v1>
+ */
+OpenLayers.Format.WMSCapabilities.v1_3 = OpenLayers.Class(
+    OpenLayers.Format.WMSCapabilities.v1, {
+    
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {
+        "wms": OpenLayers.Util.applyDefaults({
+            "WMS_Capabilities": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "LayerLimit": function(node, obj) {
+                obj.layerLimit = parseInt(this.getChildValue(node));
+            },
+            "MaxWidth": function(node, obj) {
+                obj.maxWidth = parseInt(this.getChildValue(node));
+            },
+            "MaxHeight": function(node, obj) {
+                obj.maxHeight = parseInt(this.getChildValue(node));
+            },
+            "BoundingBox": function(node, obj) {
+                var bbox = OpenLayers.Format.WMSCapabilities.v1.prototype.readers["wms"].BoundingBox.apply(this, [node, obj]);
+                bbox.srs  = node.getAttribute("CRS");
+                obj.bbox[bbox.srs] = bbox;
+            },
+            "CRS": function(node, obj) {
+                // CRS is the synonym of SRS
+                this.readers.wms.SRS.apply(this, [node, obj]); 
+            },
+            "EX_GeographicBoundingBox": function(node, obj) {
+                // replacement of LatLonBoundingBox
+                obj.llbbox = [];
+                this.readChildNodes(node, obj.llbbox);
+                
+            },
+            "westBoundLongitude": function(node, obj) {
+                obj[0] = this.getChildValue(node);
+            },
+            "eastBoundLongitude": function(node, obj) {
+                obj[2] = this.getChildValue(node);
+            },
+            "southBoundLatitude": function(node, obj) {
+                obj[1] = this.getChildValue(node);
+            },
+            "northBoundLatitude": function(node, obj) {
+                obj[3] = this.getChildValue(node);
+            },
+            "MinScaleDenominator": function(node, obj) {
+                obj.maxScale = parseFloat(this.getChildValue(node)).toPrecision(16);
+            },
+            "MaxScaleDenominator": function(node, obj) {
+                obj.minScale = parseFloat(this.getChildValue(node)).toPrecision(16);
+            },
+            "Dimension": function(node, obj) {
+                // dimension has extra attributes: default, multipleValues, 
+                // nearestValue, current which used to be part of Extent. It now
+                // also contains the values.
+                var name = node.getAttribute("name").toLowerCase();
+                var dim = {
+                    name: name,
+                    units: node.getAttribute("units"),
+                    unitsymbol: node.getAttribute("unitSymbol"),
+                    nearestVal: node.getAttribute("nearestValue") === "1",
+                    multipleVal: node.getAttribute("multipleValues") === "1",
+                    "default": node.getAttribute("default") || "",
+                    current: node.getAttribute("current") === "1",
+                    values: this.getChildValue(node).split(",")
+                    
+                };
+                // Theoretically there can be more dimensions with the same
+                // name, but with a different unit. Until we meet such a case,
+                // let's just keep the same structure as the WMS 1.1 
+                // GetCapabilities parser uses. We will store the last
+                // one encountered.
+                obj.dimensions[dim.name] = dim;
+            },
+            "Keyword": function(node, obj) {
+                // TODO: should we change the structure of keyword in v1.js?
+                // Make it an object with a value instead of a string?
+                var keyword = {value: this.getChildValue(node), 
+                    vocabulary: node.getAttribute("vocabulary")};
+                if (obj.keywords) {
+                    obj.keywords.push(keyword);
+                }
+            }
+        }, OpenLayers.Format.WMSCapabilities.v1.prototype.readers["wms"]),
+        "sld": {
+            "UserDefinedSymbolization": function(node, obj) {
+                this.readers.wms.UserDefinedSymbolization.apply(this, [node, obj]);
+                // add the two extra attributes
+                obj.userSymbols.inlineFeature = parseInt(node.getAttribute("InlineFeature")) == 1;
+                obj.userSymbols.remoteWCS = parseInt(node.getAttribute("RemoteWCS")) == 1;
+            },
+            "DescribeLayer": function(node, obj) {
+                this.readers.wms.DescribeLayer.apply(this, [node, obj]);
+            },
+            "GetLegendGraphic": function(node, obj) {
+                this.readers.wms.GetLegendGraphic.apply(this, [node, obj]);
+            }
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_3" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSCapabilities/v1_3_0.js b/lib/OpenLayers/Format/WMSCapabilities/v1_3_0.js
new file mode 100644
index 0000000..3ec471b
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSCapabilities/v1_3_0.js
@@ -0,0 +1,30 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMSCapabilities/v1_3.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSCapabilities/v1_3_0
+ * Read WMS Capabilities version 1.3.0. 
+ * SLD 1.1.0 adds in the extra operations DescribeLayer and GetLegendGraphic, 
+ * see: http://schemas.opengis.net/sld/1.1.0/sld_capabilities.xsd
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WMSCapabilities.v1_3>
+ */
+OpenLayers.Format.WMSCapabilities.v1_3_0 = OpenLayers.Class(
+    OpenLayers.Format.WMSCapabilities.v1_3, {
+    
+    /**
+     * Property: version
+     * {String} The specific parser version.
+     */
+    version: "1.3.0",
+    
+    CLASS_NAME: "OpenLayers.Format.WMSCapabilities.v1_3_0" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSDescribeLayer.js b/lib/OpenLayers/Format/WMSDescribeLayer.js
new file mode 100644
index 0000000..19c9681
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSDescribeLayer.js
@@ -0,0 +1,91 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSDescribeLayer
+ * Read SLD WMS DescribeLayer response
+ * DescribeLayer is meant to couple WMS to WFS and WCS
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WMSDescribeLayer = OpenLayers.Class(OpenLayers.Format.XML, {
+
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "1.1.1".
+     */
+    defaultVersion: "1.1.1",
+   
+    /**
+     * APIProperty: version
+     * {String} Specify a version string if one is known.
+     */
+    version: null,
+
+    /**
+     * Constructor: OpenLayers.Format.WMSDescribeLayer
+     * Create a new parser for WMS DescribeLayer responses.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read DescribeLayer data from a string, and return the response. 
+     * The OGC currently defines 2 formats which are allowed for output,
+     * so we need to parse these 2 types
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array} Array of {<LayerDescription>} objects which have:
+     * - {String} owsType: WFS/WCS
+     * - {String} owsURL: the online resource
+     * - {String} typeName: the name of the typename on the service
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        var version = this.version;
+        if(!version) {
+            version = root.getAttribute("version");
+            if(!version) {
+                version = this.defaultVersion;
+            }
+        }
+        // these are identical to us, but some WMS use 1.1.1 and some use 1.1.0
+        if (version == "1.1.1" || version == "1.1.0") {
+            version = "1.1";
+        }
+        var constructor = OpenLayers.Format.WMSDescribeLayer[
+            "v" + version.replace(/\./g, "_")
+        ];
+        if(!constructor) {
+            throw "Can't find a WMS DescribeLayer parser for version " + 
+                version;
+        }
+        var parser = new constructor(this.options);
+        var describelayer = parser.read(data);
+        describelayer.version = version;
+        return describelayer;
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WMSDescribeLayer" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js b/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js
new file mode 100644
index 0000000..f1c9ad9
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSDescribeLayer/v1_1.js
@@ -0,0 +1,100 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMSDescribeLayer.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSDescribeLayer.v1_1
+ * Read SLD WMS DescribeLayer response for WMS 1.1.X
+ * WMS 1.1.X is tightly coupled to SLD 1.0.0
+ *
+ * Example DescribeLayer request: 
+ * http://demo.opengeo.org/geoserver/wms?request=DescribeLayer&version=1.1.1&layers=topp:states
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.WMSDescribeLayer>
+ */
+OpenLayers.Format.WMSDescribeLayer.v1_1 = OpenLayers.Class(
+    OpenLayers.Format.WMSDescribeLayer, {
+    
+    /**
+     * Constructor: OpenLayers.Format.WMSDescribeLayer
+     * Create a new parser for WMS DescribeLayer responses.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.WMSDescribeLayer.prototype.initialize.apply(this, 
+            [options]);
+    },
+
+    /**
+     * APIMethod: read
+     * Read DescribeLayer data from a string, and return the response. 
+     * The OGC defines 2 formats which are allowed for output,
+     * so we need to parse these 2 types for version 1.1.X
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array} Array of {<LayerDescription>} objects which have:
+     * - {String} owsType: WFS/WCS
+     * - {String} owsURL: the online resource
+     * - {String} typeName: the name of the typename on the service
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        var children = root.childNodes; 
+        var describelayer = [];
+        var childNode, nodeName;
+        for(var i=0; i<children.length; ++i) { 
+            childNode = children[i];
+            nodeName = childNode.nodeName; 
+            if (nodeName == 'LayerDescription') {
+                var layerName = childNode.getAttribute('name');
+                var owsType = '';
+                var owsURL = '';
+                var typeName = '';
+                // check for owsType and owsURL attributes
+                if (childNode.getAttribute('owsType')) {
+                  owsType = childNode.getAttribute('owsType');
+                  owsURL = childNode.getAttribute('owsURL');
+                } else {
+                    // look for wfs or wcs attribute
+                    if (childNode.getAttribute('wfs') != '') {
+                        owsType = 'WFS';
+                        owsURL = childNode.getAttribute('wfs');
+                    } else if (childNode.getAttribute('wcs') != '') {
+                        owsType = 'WCS';
+                        owsURL = childNode.getAttribute('wcs');
+                    }
+                }
+                // look for Query child
+                var query = childNode.getElementsByTagName('Query');
+                if(query.length > 0) {
+                    typeName = query[0].getAttribute('typeName');
+                    if (!typeName) {
+                        // because of Ionic bug
+                        typeName = query[0].getAttribute('typename');
+                    }
+                }
+                describelayer.push({layerName: layerName, owsType: owsType, 
+                    owsURL: owsURL, typeName: typeName}); 
+            }
+        }
+        return describelayer;
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WMSDescribeLayer.v1_1" 
+
+});
diff --git a/lib/OpenLayers/Format/WMSGetFeatureInfo.js b/lib/OpenLayers/Format/WMSGetFeatureInfo.js
new file mode 100644
index 0000000..2fc7038
--- /dev/null
+++ b/lib/OpenLayers/Format/WMSGetFeatureInfo.js
@@ -0,0 +1,284 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMSGetFeatureInfo
+ * Class to read GetFeatureInfo responses from Web Mapping Services
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WMSGetFeatureInfo = OpenLayers.Class(OpenLayers.Format.XML, {
+
+    /**
+     * APIProperty: layerIdentifier
+     * {String} All xml nodes containing this search criteria will populate an
+     *     internal array of layer nodes.
+     */ 
+    layerIdentifier: '_layer',
+
+    /**
+     * APIProperty: featureIdentifier
+     * {String} All xml nodes containing this search criteria will populate an 
+     *     internal array of feature nodes for each layer node found.
+     */
+    featureIdentifier: '_feature',
+
+    /**
+     * Property: regExes
+     * Compiled regular expressions for manipulating strings.
+     */
+    regExes: {
+        trimSpace: (/^\s*|\s*$/g),
+        removeSpace: (/\s*/g),
+        splitSpace: (/\s+/),
+        trimComma: (/\s*,\s*/g)
+    },
+
+    /**
+     * Property: gmlFormat
+     * {<OpenLayers.Format.GML>} internal GML format for parsing geometries
+     *     in msGMLOutput
+     */
+    gmlFormat: null,
+
+    /**
+     * Constructor: OpenLayers.Format.WMSGetFeatureInfo
+     * Create a new parser for WMS GetFeatureInfo responses
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, arguments);
+        OpenLayers.Util.extend(this, options);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read WMS GetFeatureInfo data from a string, and return an array of features
+     *
+     * Parameters:
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Feature.Vector>)} An array of features.
+     */
+    read: function(data) {
+        var result;
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        if(root) {
+            var scope = this;
+            var read = this["read_" + root.nodeName];
+            if(read) {
+                result = read.call(this, root);
+            } else {
+                // fall-back to GML since this is a common output format for WMS
+                // GetFeatureInfo responses
+                result = new OpenLayers.Format.GML((this.options ? this.options : {})).read(data);
+            }
+        } else {
+            result = data;
+        }
+        return result;
+    },
+    
+    
+    /**
+     * Method: read_msGMLOutput
+     * Parse msGMLOutput nodes.
+     *
+     * Parameters:
+     * data - {DOMElement}
+     *
+     * Returns:
+     * {Array}
+     */
+    read_msGMLOutput: function(data) {
+        var response = [];
+        var layerNodes = this.getSiblingNodesByTagCriteria(data,
+            this.layerIdentifier);
+        if (layerNodes) {
+            for (var i=0, len=layerNodes.length; i<len; ++i) {
+                var node = layerNodes[i];
+                var layerName = node.nodeName;
+                if (node.prefix) {
+                    layerName = layerName.split(':')[1];
+                }
+                var layerName = layerName.replace(this.layerIdentifier, '');
+                var featureNodes = this.getSiblingNodesByTagCriteria(node, 
+                    this.featureIdentifier);
+                if (featureNodes) {
+                    for (var j = 0; j < featureNodes.length; j++) {
+                        var featureNode = featureNodes[j];
+                        var geomInfo = this.parseGeometry(featureNode);
+                        var attributes = this.parseAttributes(featureNode);
+                        var feature = new OpenLayers.Feature.Vector(geomInfo.geometry, 
+                            attributes, null);
+                        feature.bounds = geomInfo.bounds;
+                        feature.type = layerName;
+                        response.push(feature);
+                    }
+                }
+            }
+        }
+        return response;
+    },
+    
+    /**
+     * Method: read_FeatureInfoResponse
+     * Parse FeatureInfoResponse nodes.
+     *
+     * Parameters:
+     * data - {DOMElement}
+     *
+     * Returns:
+     * {Array}
+     */
+    read_FeatureInfoResponse: function(data) {
+        var response = [];
+        var featureNodes = this.getElementsByTagNameNS(data, '*',
+            'FIELDS');
+
+        for(var i=0, len=featureNodes.length;i<len;i++) {
+            var featureNode = featureNodes[i];
+            var geom = null;
+
+            var attributes = {};
+            for(var j=0, jlen=featureNode.attributes.length; j<jlen; j++) {
+                var attribute = featureNode.attributes[j];
+                attributes[attribute.nodeName] = attribute.nodeValue;
+            }
+
+            response.push(
+                new OpenLayers.Feature.Vector(geom, attributes, null)
+            );
+        }
+        return response;
+    },
+
+    /**
+     * Method: getSiblingNodesByTagCriteria
+     * Recursively searches passed xml node and all it's descendant levels for 
+     *     nodes whose tagName contains the passed search string. This returns an 
+     *     array of all sibling nodes which match the criteria from the highest 
+     *     hierarchial level from which a match is found.
+     * 
+     * Parameters:
+     * node - {DOMElement} An xml node
+     * criteria - {String} Search string which will match some part of a tagName 
+     *                                       
+     * Returns:
+     * Array({DOMElement)) An array of sibling xml nodes
+     */                
+    getSiblingNodesByTagCriteria: function(node, criteria){
+        var nodes = [];
+        var children, tagName, n, matchNodes, child;
+        if (node && node.hasChildNodes()) {
+            children = node.childNodes;
+            n = children.length;
+
+            for(var k=0; k<n; k++){
+                child = children[k];
+                while (child && child.nodeType != 1) {
+                    child = child.nextSibling;
+                    k++;
+                }
+                tagName = (child ? child.nodeName : '');
+                if (tagName.length > 0 && tagName.indexOf(criteria) > -1) {
+                    nodes.push(child);
+                } else {
+                    matchNodes = this.getSiblingNodesByTagCriteria(
+                        child, criteria);
+
+                    if(matchNodes.length > 0){
+                        (nodes.length == 0) ? 
+                            nodes = matchNodes : nodes.push(matchNodes);
+                    }
+                }
+            }
+
+        }
+        return nodes;
+    },
+
+    /**
+     * Method: parseAttributes
+     *
+     * Parameters:
+     * node - {<DOMElement>}
+     *
+     * Returns:
+     * {Object} An attributes object.
+     * 
+     * Notes:
+     * Assumes that attributes are direct child xml nodes of the passed node
+     * and contain only a single text node. 
+     */    
+    parseAttributes: function(node){
+        var attributes = {};
+        if (node.nodeType == 1) {
+            var children = node.childNodes;
+            var n = children.length;
+            for (var i = 0; i < n; ++i) {
+                var child = children[i];
+                if (child.nodeType == 1) {
+                    var grandchildren = child.childNodes;
+                    if (grandchildren.length == 1) {
+                        var grandchild = grandchildren[0];
+                        if (grandchild.nodeType == 3 ||
+                            grandchild.nodeType == 4) {
+                            var name = (child.prefix) ? 
+                                child.nodeName.split(":")[1] : child.nodeName;
+                            var value = grandchild.nodeValue.replace(
+                                this.regExes.trimSpace, "");
+                            attributes[name] = value;
+                        }
+                    }
+                }
+            }
+        }
+        return attributes;
+    },
+
+    /**
+     * Method: parseGeometry
+     * Parse the geometry and the feature bounds out of the node using 
+     *     Format.GML
+     *
+     * Parameters:
+     * node - {<DOMElement>}
+     *
+     * Returns:
+     * {Object} An object containing the geometry and the feature bounds
+    */
+    parseGeometry: function(node) {
+        // we need to use the old Format.GML parser since we do not know the 
+        // geometry name
+        if (!this.gmlFormat) {
+            this.gmlFormat = new OpenLayers.Format.GML();
+        }
+        var feature = this.gmlFormat.parseFeature(node);
+        var geometry, bounds = null;
+        if (feature) {
+            geometry = feature.geometry && feature.geometry.clone();
+            bounds = feature.bounds && feature.bounds.clone();
+            feature.destroy();
+        }
+        return {geometry: geometry, bounds: bounds};
+    },
+
+    CLASS_NAME: "OpenLayers.Format.WMSGetFeatureInfo"
+    
+});
diff --git a/lib/OpenLayers/Format/WMTSCapabilities.js b/lib/OpenLayers/Format/WMTSCapabilities.js
new file mode 100644
index 0000000..2cee114
--- /dev/null
+++ b/lib/OpenLayers/Format/WMTSCapabilities.js
@@ -0,0 +1,162 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/XML.js
+ */
+ 
+/**
+ * Class: OpenLayers.Format.WMTSCapabilities
+ * Read WMTS Capabilities.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.XML>
+ */
+OpenLayers.Format.WMTSCapabilities = OpenLayers.Class(OpenLayers.Format.XML, {
+    
+    /**
+     * APIProperty: defaultVersion
+     * {String} Version number to assume if none found.  Default is "1.0.0".
+     */
+    defaultVersion: "1.0.0",
+    
+    /**
+     * APIProperty: version
+     * {String} Specify a version string if one is known.
+     */
+    version: null,
+
+    /**
+     * Property: parser
+     * {<OpenLayers.Format>} A cached versioned format used for reading.
+     */
+    parser: null,
+    
+    /**
+     * APIProperty: yx
+     * {Object} Members in the yx object are used to determine if a CRS URN
+     *     corresponds to a CRS with y,x axis order.  Member names are CRS URNs
+     *     and values are boolean.  By default, the following CRS URN are 
+     *     assumed to correspond to a CRS with y,x axis order:
+     *
+     * * urn:ogc:def:crs:EPSG::4326
+     */
+    yx: {
+        "urn:ogc:def:crs:EPSG::4326": true
+    },
+
+    /**
+     * Constructor: OpenLayers.Format.WMTSCapabilities
+     * Create a new parser for WMTS capabilities.
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.options = options;
+    },
+
+    /**
+     * APIMethod: read
+     * Read capabilities data from a string, and return information about
+     * the service (offering and observedProperty mostly).
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Object} Info about the WMTS Capabilities
+     */
+    read: function(data) {
+        if (typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        var root = data.documentElement;
+        var version = this.version || root.getAttribute("version") || this.defaultVersion;
+        if (!this.parser || this.parser.version !== version) {
+            var constr = OpenLayers.Format.WMTSCapabilities[
+                "v" + version.replace(/\./g, "_")
+            ];
+            if (!constr) {
+                throw new Error("Can't find a WMTS capabilities parser for version " + version);
+            }
+            this.parser = new constr(this.options);
+        }
+        return this.parser.read(data);
+    },
+
+    /**
+     * APIMethod: createLayer
+     * Create a WMTS layer given a capabilities object.
+     *
+     * Parameters:
+     * capabilities - {Object} The object returned from a <read> call to this 
+     *     format.
+     * config - {Object} Configuration properties for the layer.  Defaults for
+     *     the layer will apply if not provided.
+     *
+     * Required config properties:
+     * layer - {String} The layer identifier.
+     * matrixSet - {String} The matrix set identifier.
+     *
+     * Returns:
+     * {<OpenLayers.Layer.WMTS>} A properly configured WMTS layer.  Throws an
+     *     error if an incomplete config is provided.  Returns undefined if no
+     *     layer could be created with the provided config.
+     */ 
+    createLayer: function(capabilities, config) {
+        var layer;
+
+        // confirm required properties are supplied in config
+        var required = {
+            layer: true,
+            matrixSet: true
+        };
+        for (var prop in required) {
+            if (!(prop in config)) {
+                throw new Error("Missing property '" + prop + "' in layer configuration.");
+            }
+        }
+
+        var contents = capabilities.contents;
+        var matrixSet = contents.tileMatrixSets[config.matrixSet];
+
+        // find the layer definition with the given identifier
+        var layers = contents.layers;
+        var layerDef;
+        for (var i=0, ii=contents.layers.length; i<ii; ++i) {
+            if (contents.layers[i].identifier === config.layer) {
+                layerDef = contents.layers[i];
+                break;
+            }
+        }
+        
+        if (layerDef && matrixSet) {
+            // get the default style for the layer
+            var style;
+            for (var i=0, ii=layerDef.styles.length; i<ii; ++i) {
+                style = layerDef.styles[i];
+                if (style.isDefault) {
+                    break;
+                }
+            }
+            
+            layer = new OpenLayers.Layer.WMTS(
+                OpenLayers.Util.applyDefaults(config, {
+                    url: capabilities.operationsMetadata.GetTile.dcp.http.get,
+                    name: layerDef.title,
+                    style: style,
+                    matrixIds: matrixSet.matrixIds
+                })
+            );
+        }
+        return layer;
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.WMTSCapabilities" 
+
+});
diff --git a/lib/OpenLayers/Format/WMTSCapabilities/v1_0_0.js b/lib/OpenLayers/Format/WMTSCapabilities/v1_0_0.js
new file mode 100644
index 0000000..a71517d
--- /dev/null
+++ b/lib/OpenLayers/Format/WMTSCapabilities/v1_0_0.js
@@ -0,0 +1,221 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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/WMTSCapabilities.js
+ * @requires OpenLayers/Format/OWSCommon/v1_1_0.js
+ */
+
+/**
+ * Class: OpenLayers.Format.WMTSCapabilities.v1_0_0
+ * Read WMTS Capabilities version 1.0.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Format.WMTSCapabilities>
+ */
+OpenLayers.Format.WMTSCapabilities.v1_0_0 = OpenLayers.Class(
+    OpenLayers.Format.OWSCommon.v1_1_0, {
+        
+    /**
+     * Property: version
+     * {String} The parser version ("1.0.0").
+     */
+    version: "1.0.0",
+
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.
+     */
+    namespaces: {
+        ows: "http://www.opengis.net/ows/1.1",
+        wmts: "http://www.opengis.net/wmts/1.0",
+        xlink: "http://www.w3.org/1999/xlink"
+    },    
+    
+    /**
+     * Property: yx
+     * {Object} Members in the yx object are used to determine if a CRS URN
+     *     corresponds to a CRS with y,x axis order.  Member names are CRS URNs
+     *     and values are boolean.  Defaults come from the 
+     *     <OpenLayers.Format.WMTSCapabilities> prototype.
+     */
+    yx: null,
+
+    /**
+     * Property: defaultPrefix
+     * {String} The default namespace alias for creating element nodes.
+     */
+    defaultPrefix: "wmts",
+
+    /**
+     * Constructor: OpenLayers.Format.WMTSCapabilities.v1_0_0
+     * Create a new parser for WMTS capabilities version 1.0.0. 
+     *
+     * Parameters:
+     * options - {Object} An optional object whose properties will be set on
+     *     this instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Format.XML.prototype.initialize.apply(this, [options]);
+        this.options = options;
+        var yx = OpenLayers.Util.extend(
+            {}, OpenLayers.Format.WMTSCapabilities.prototype.yx
+        );
+        this.yx = OpenLayers.Util.extend(yx, this.yx);
+    },
+
+    /**
+     * APIMethod: read
+     * Read capabilities data from a string, and return info about the WMTS.
+     * 
+     * Parameters: 
+     * data - {String} or {DOMElement} data to read/parse.
+     *
+     * Returns:
+     * {Object} Information about the SOS service.
+     */
+    read: function(data) {
+        if(typeof data == "string") {
+            data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
+        }
+        if(data && data.nodeType == 9) {
+            data = data.documentElement;
+        }
+        var capabilities = {};
+        this.readNode(data, capabilities);
+        capabilities.version = this.version;
+        return capabilities;
+    },
+
+    /**
+     * Property: readers
+     * Contains public functions, grouped by namespace prefix, that will
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {        
+        "wmts": {
+            "Capabilities": function(node, obj) {
+                this.readChildNodes(node, obj);
+            },
+            "Contents": function(node, obj) {
+                obj.contents = {};                
+                obj.contents.layers = [];
+                obj.contents.tileMatrixSets = {};                
+                this.readChildNodes(node, obj.contents);
+            },
+            "Layer": function(node, obj) {
+                var layer = {
+                    styles: [],
+                    formats: [],
+                    tileMatrixSetLinks: []
+                };
+                layer.layers = [];
+                this.readChildNodes(node, layer);
+                obj.layers.push(layer);
+            },
+            "Style": function(node, obj) {
+                var style = {};
+                style.isDefault = (node.getAttribute("isDefault") === "true");
+                this.readChildNodes(node, style);
+                obj.styles.push(style);
+            },
+            "Format": function(node, obj) {
+                obj.formats.push(this.getChildValue(node)); 
+            },
+            "TileMatrixSetLink": function(node, obj) {
+                var tileMatrixSetLink = {};
+                this.readChildNodes(node, tileMatrixSetLink);
+                obj.tileMatrixSetLinks.push(tileMatrixSetLink);
+            },
+            "TileMatrixSet": function(node, obj) {
+                // node could be child of wmts:Contents or wmts:TileMatrixSetLink
+                // duck type wmts:Contents by looking for layers
+                if (obj.layers) {
+                    // TileMatrixSet as object type in schema
+                    var tileMatrixSet = {
+                        matrixIds: []
+                    };
+                    this.readChildNodes(node, tileMatrixSet);
+                    obj.tileMatrixSets[tileMatrixSet.identifier] = tileMatrixSet;
+                } else {
+                    // TileMatrixSet as string type in schema
+                    obj.tileMatrixSet = this.getChildValue(node);
+                }
+            },
+            "TileMatrix": function(node, obj) {
+                var tileMatrix = {
+                    supportedCRS: obj.supportedCRS
+                };
+                this.readChildNodes(node, tileMatrix);
+                obj.matrixIds.push(tileMatrix);
+            },
+            "ScaleDenominator": function(node, obj) {
+                obj.scaleDenominator = parseFloat(this.getChildValue(node)); 
+            },
+            "TopLeftCorner": function(node, obj) {                
+                var topLeftCorner = this.getChildValue(node);
+                var coords = topLeftCorner.split(" ");
+                // decide on axis order for the given CRS
+                var yx;
+                if (obj.supportedCRS) {
+                    // extract out version from URN
+                    var crs = obj.supportedCRS.replace(
+                        /urn:ogc:def:crs:(\w+):.+:(\w+)$/, 
+                        "urn:ogc:def:crs:$1::$2"
+                    );
+                    yx = !!this.yx[crs];
+                }
+                if (yx) {
+                    obj.topLeftCorner = new OpenLayers.LonLat(
+                        coords[1], coords[0]
+                    );
+                } else {
+                    obj.topLeftCorner = new OpenLayers.LonLat(
+                        coords[0], coords[1]
+                    );
+                }
+            },
+            "TileWidth": function(node, obj) {
+                obj.tileWidth = parseInt(this.getChildValue(node)); 
+            },
+            "TileHeight": function(node, obj) {
+                obj.tileHeight = parseInt(this.getChildValue(node)); 
+            },
+            "MatrixWidth": function(node, obj) {
+                obj.matrixWidth = parseInt(this.getChildValue(node)); 
+            },
+            "MatrixHeight": function(node, obj) {
+                obj.matrixHeight = parseInt(this.getChildValue(node)); 
+            },        
+            // not used for now, can be added in the future though
+            /*"Themes": function(node, obj) {
+                obj.themes = [];
+                this.readChildNodes(node, obj.themes);
+            },
+            "Theme": function(node, obj) {
+                var theme = {};                
+                this.readChildNodes(node, theme);
+                obj.push(theme);
+            },*/
+            "WSDL": function(node, obj) {
+                obj.wsdl = {};
+                obj.wsdl.href = node.getAttribute("xlink:href");
+                // TODO: other attributes of <WSDL> element                
+            },
+            "ServiceMetadataURL": function(node, obj) {
+                obj.serviceMetadataUrl = {};
+                obj.serviceMetadataUrl.href = node.getAttribute("xlink:href");
+                // TODO: other attributes of <ServiceMetadataURL> element                
+            }            
+        },
+        "ows": OpenLayers.Format.OWSCommon.v1_1_0.prototype.readers["ows"]
+    },    
+    
+    CLASS_NAME: "OpenLayers.Format.WMTSCapabilities.v1_0_0" 
+
+});
diff --git a/lib/OpenLayers/Format/XML.js b/lib/OpenLayers/Format/XML.js
new file mode 100644
index 0000000..b83b6c8
--- /dev/null
+++ b/lib/OpenLayers/Format/XML.js
@@ -0,0 +1,881 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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.js
+ */
+
+/**
+ * Class: OpenLayers.Format.XML
+ * Read and write XML.  For cross-browser XML generation, use methods on an
+ *     instance of the XML format class instead of on <code>document<end>.
+ *     The DOM creation and traversing methods exposed here all mimic the
+ *     W3C XML DOM methods.  Create a new parser with the
+ *     <OpenLayers.Format.XML> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Format>
+ */
+OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
+    
+    /**
+     * Property: namespaces
+     * {Object} Mapping of namespace aliases to namespace URIs.  Properties
+     *     of this object should not be set individually.  Read-only.  All
+     *     XML subclasses should have their own namespaces object.  Use
+     *     <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
+     *     be applied when a namespaced node is found matching the function
+     *     name.  The function will be applied in the scope of this parser
+     *     with two arguments: the node being read and a context object passed
+     *     from the parent.
+     */
+    readers: {},
+    
+    /**
+     * Property: writers
+     * As a compliment to the <readers> property, this structure contains public
+     *     writing functions grouped by namespace alias and named like the
+     *     node names they produce.
+     */
+    writers: {},
+
+    /**
+     * Property: xmldom
+     * {XMLDom} If this browser uses ActiveX, this will be set to a XMLDOM
+     *     object.  It is not intended to be a browser sniffing property.
+     *     Instead, the xmldom property is used instead of <code>document<end>
+     *     where namespaced node creation methods are not supported. In all
+     *     other browsers, this remains null.
+     */
+    xmldom: null,
+
+    /**
+     * Constructor: OpenLayers.Format.XML
+     * Construct an XML parser.  The parser is used to read and write XML.
+     *     Reading XML from a string returns a DOM element.  Writing XML from
+     *     a DOM element returns a string.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on
+     *     the object.
+     */
+    initialize: function(options) {
+        if(window.ActiveXObject) {
+            this.xmldom = new ActiveXObject("Microsoft.XMLDOM");
+        }
+        OpenLayers.Format.prototype.initialize.apply(this, [options]);
+        // clone the namespace object and set all namespace aliases
+        this.namespaces = OpenLayers.Util.extend({}, this.namespaces);
+        this.namespaceAlias = {};
+        for(var alias in this.namespaces) {
+            this.namespaceAlias[this.namespaces[alias]] = alias;
+        }
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Clean up.
+     */
+    destroy: function() {
+        this.xmldom = null;
+        OpenLayers.Format.prototype.destroy.apply(this, arguments);
+    },
+    
+    /**
+     * Method: setNamespace
+     * Set a namespace alias and URI for the format.
+     *
+     * Parameters:
+     * alias - {String} The namespace alias (prefix).
+     * uri - {String} The namespace URI.
+     */
+    setNamespace: function(alias, uri) {
+        this.namespaces[alias] = uri;
+        this.namespaceAlias[uri] = alias;
+    },
+
+    /**
+     * APIMethod: read
+     * Deserialize a XML string and return a DOM node.
+     *
+     * Parameters:
+     * text - {String} A XML string
+     
+     * Returns:
+     * {DOMElement} A DOM node
+     */
+    read: function(text) {
+        var index = text.indexOf('<');
+        if(index > 0) {
+            text = text.substring(index);
+        }
+        var node = OpenLayers.Util.Try(
+            OpenLayers.Function.bind((
+                function() {
+                    var xmldom;
+                    /**
+                     * Since we want to be able to call this method on the prototype
+                     * itself, this.xmldom may not exist even if in IE.
+                     */
+                    if(window.ActiveXObject && !this.xmldom) {
+                        xmldom = new ActiveXObject("Microsoft.XMLDOM");
+                    } else {
+                        xmldom = this.xmldom;
+                        
+                    }
+                    xmldom.loadXML(text);
+                    return xmldom;
+                }
+            ), this),
+            function() {
+                return new DOMParser().parseFromString(text, 'text/xml');
+            },
+            function() {
+                var req = new XMLHttpRequest();
+                req.open("GET", "data:" + "text/xml" +
+                         ";charset=utf-8," + encodeURIComponent(text), false);
+                if(req.overrideMimeType) {
+                    req.overrideMimeType("text/xml");
+                }
+                req.send(null);
+                return req.responseXML;
+            }
+        );
+
+        if(this.keepData) {
+            this.data = node;
+        }
+
+        return node;
+    },
+
+    /**
+     * APIMethod: write
+     * Serialize a DOM node into a XML string.
+     * 
+     * Parameters:
+     * node - {DOMElement} A DOM node.
+     *
+     * Returns:
+     * {String} The XML string representation of the input node.
+     */
+    write: function(node) {
+        var data;
+        if(this.xmldom) {
+            data = node.xml;
+        } else {
+            var serializer = new XMLSerializer();
+            if (node.nodeType == 1) {
+                // Add nodes to a document before serializing. Everything else
+                // is serialized as is. This may need more work. See #1218 .
+                var doc = document.implementation.createDocument("", "", null);
+                if (doc.importNode) {
+                    node = doc.importNode(node, true);
+                }
+                doc.appendChild(node);
+                data = serializer.serializeToString(doc);
+            } else {
+                data = serializer.serializeToString(node);
+            }
+        }
+        return data;
+    },
+
+    /**
+     * APIMethod: createElementNS
+     * Create a new element with namespace.  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.createElementNS.
+     *
+     * 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.
+     */
+    createElementNS: function(uri, name) {
+        var element;
+        if(this.xmldom) {
+            if(typeof uri == "string") {
+                element = this.xmldom.createNode(1, name, uri);
+            } else {
+                element = this.xmldom.createNode(1, name, "");
+            }
+        } else {
+            element = document.createElementNS(uri, name);
+        }
+        return element;
+    },
+
+    /**
+     * APIMethod: createTextNode
+     * 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: 
+     * {DOMElement} A DOM text node.
+     */
+    createTextNode: function(text) {
+        var node;
+        if (typeof text !== "string") {
+            text = String(text);
+        }
+        if(this.xmldom) {
+            node = this.xmldom.createTextNode(text);
+        } else {
+            node = document.createTextNode(text);
+        }
+        return node;
+    },
+
+    /**
+     * APIMethod: getElementsByTagNameNS
+     * Get a list of elements on a node given the namespace URI and local name.
+     *     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.
+     */
+    getElementsByTagNameNS: function(node, uri, name) {
+        var elements = [];
+        if(node.getElementsByTagNameNS) {
+            elements = node.getElementsByTagNameNS(uri, name);
+        } else {
+            // brute force method
+            var allNodes = node.getElementsByTagName("*");
+            var potentialNode, fullName;
+            for(var i=0, len=allNodes.length; i<len; ++i) {
+                potentialNode = allNodes[i];
+                fullName = (potentialNode.prefix) ?
+                           (potentialNode.prefix + ":" + name) : name;
+                if((name == "*") || (fullName == potentialNode.nodeName)) {
+                    if((uri == "*") || (uri == potentialNode.namespaceURI)) {
+                        elements.push(potentialNode);
+                    }
+                }
+            }
+        }
+        return elements;
+    },
+
+    /**
+     * 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.
+     */
+    getAttributeNodeNS: function(node, uri, name) {
+        var attributeNode = null;
+        if(node.getAttributeNodeNS) {
+            attributeNode = node.getAttributeNodeNS(uri, name);
+        } else {
+            var attributes = node.attributes;
+            var potentialNode, fullName;
+            for(var i=0, len=attributes.length; i<len; ++i) {
+                potentialNode = attributes[i];
+                if(potentialNode.namespaceURI == uri) {
+                    fullName = (potentialNode.prefix) ?
+                               (potentialNode.prefix + ":" + name) : name;
+                    if(fullName == potentialNode.nodeName) {
+                        attributeNode = potentialNode;
+                        break;
+                    }
+                }
+            }
+        }
+        return attributeNode;
+    },
+
+    /**
+     * 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.
+     */
+    getAttributeNS: function(node, uri, name) {
+        var attributeValue = "";
+        if(node.getAttributeNS) {
+            attributeValue = node.getAttributeNS(uri, name) || "";
+        } else {
+            var attributeNode = this.getAttributeNodeNS(node, uri, name);
+            if(attributeNode) {
+                attributeValue = attributeNode.nodeValue;
+            }
+        }
+        return attributeValue;
+    },
+    
+    /**
+     * APIMethod: getChildValue
+     * Get the textual value of the node if it exists, or return an
+     *     optional default string.  Returns an empty string if no first child
+     *     exists and no default value is supplied.
+     *
+     * Parameters:
+     * node - {DOMElement} The element used to look for a first child value.
+     * def - {String} Optional string to return in the event that no
+     *     first child value exists.
+     *
+     * Returns:
+     * {String} The value of the first child of the given node.
+     */
+    getChildValue: function(node, def) {
+        var value = def || "";
+        if(node) {
+            for(var child=node.firstChild; child; child=child.nextSibling) {
+                switch(child.nodeType) {
+                    case 3: // text node
+                    case 4: // cdata section
+                        value += child.nodeValue;
+                }
+            }
+        }
+        return value;
+    },
+
+    /**
+     * APIMethod: concatChildValues
+     * *Deprecated*. Use <getChildValue> instead.
+     *
+     * Concatenate the value of all child nodes if any exist, or return an
+     *     optional default string.  Returns an empty string if no children
+     *     exist and no default value is supplied.  Not optimized for large
+     *     numbers of child nodes.
+     *
+     * Parameters:
+     * node - {DOMElement} The element used to look for child values.
+     * def - {String} Optional string to return in the event that no
+     *     child exist.
+     *
+     * Returns:
+     * {String} The concatenated value of all child nodes of the given node.
+     */
+    concatChildValues: function(node, def) {
+        var value = "";
+        var child = node.firstChild;
+        var childValue;
+        while(child) {
+            childValue = child.nodeValue;
+            if(childValue) {
+                value += childValue;
+            }
+            child = child.nextSibling;
+        }
+        if(value == "" && def != undefined) {
+            value = def;
+        }
+        return value;
+    },
+    
+    /**
+     * APIMethod: isSimpleContent
+     * Test if the given node has only simple content (i.e. no child element
+     *     nodes).
+     *
+     * Parameters:
+     * node - {DOMElement} An element node.
+     *
+     * Returns:
+     * {Boolean} The node has no child element nodes (nodes of type 1). 
+     */
+    isSimpleContent: function(node) {
+        var simple = true;
+        for(var child=node.firstChild; child; child=child.nextSibling) {
+            if(child.nodeType === 1) {
+                simple = false;
+                break;
+            }
+        }
+        return simple;
+    },
+    
+    /**
+     * APIMethod: contentType
+     * Determine the content type for a given node.
+     *
+     * Parameters:
+     * node - {DOMElement}
+     *
+     * Returns:
+     * {Integer} One of OpenLayers.Format.XML.CONTENT_TYPE.{EMPTY,SIMPLE,COMPLEX,MIXED}
+     *     if the node has no, simple, complex, or mixed content.
+     */
+    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) {
+            switch(child.nodeType) {
+                case 1: // element
+                    complex = true;
+                    break;
+                case 8: // comment
+                    break;
+                default:
+                    simple = true;
+            }
+            if(complex && simple) {
+                break;
+            }
+        }
+        
+        if(complex && simple) {
+            type = OpenLayers.Format.XML.CONTENT_TYPE.MIXED;
+        } else if(complex) {
+            return OpenLayers.Format.XML.CONTENT_TYPE.COMPLEX;
+        } else if(simple) {
+            return OpenLayers.Format.XML.CONTENT_TYPE.SIMPLE;
+        }
+        return type;
+    },
+
+    /**
+     * 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.
+     */
+    hasAttributeNS: function(node, uri, name) {
+        var found = false;
+        if(node.hasAttributeNS) {
+            found = node.hasAttributeNS(uri, name);
+        } else {
+            found = !!this.getAttributeNodeNS(node, uri, name);
+        }
+        return found;
+    },
+    
+    /**
+     * APIMethod: setAttributeNS
+     * Adds a new attribute or changes the value of an attribute with the given
+     *     namespace and name.
+     *
+     * Parameters:
+     * node - {Element} Element node on which to set the attribute.
+     * uri - {String} Namespace URI for the attribute.
+     * name - {String} Qualified name (prefix:localname) for the attribute.
+     * value - {String} Attribute value.
+     */
+    setAttributeNS: function(node, uri, name, value) {
+        if(node.setAttributeNS) {
+            node.setAttributeNS(uri, name, value);
+        } else {
+            if(this.xmldom) {
+                if(uri) {
+                    var attribute = node.ownerDocument.createNode(
+                        2, name, uri
+                    );
+                    attribute.nodeValue = value;
+                    node.setAttributeNode(attribute);
+                } else {
+                    node.setAttribute(name, value);
+                }
+            } else {
+                throw "setAttributeNS not implemented";
+            }
+        }
+    },
+
+    /**
+     * Method: createElementNSPlus
+     * Shorthand for creating namespaced elements with optional attributes and
+     *     child text nodes.
+     *
+     * Parameters:
+     * name - {String} The qualified node name.
+     * options - {Object} Optional object for node configuration.
+     *
+     * Valid options:
+     * uri - {String} Optional namespace uri for the element - supply a prefix
+     *     instead if the namespace uri is a property of the format's namespace
+     *     object.
+     * attributes - {Object} Optional attributes to be set using the
+     *     <setAttributes> method.
+     * value - {String} Optional text to be appended as a text node.
+     *
+     * Returns:
+     * {Element} An element node.
+     */
+    createElementNSPlus: function(name, options) {
+        options = options || {};
+        // order of prefix preference
+        // 1. in the uri option
+        // 2. in the prefix option
+        // 3. in the qualified name
+        // 4. from the defaultPrefix
+        var uri = options.uri || this.namespaces[options.prefix];
+        if(!uri) {
+            var loc = name.indexOf(":");
+            uri = this.namespaces[name.substring(0, loc)];
+        }
+        if(!uri) {
+            uri = this.namespaces[this.defaultPrefix];
+        }
+        var node = this.createElementNS(uri, name);
+        if(options.attributes) {
+            this.setAttributes(node, options.attributes);
+        }
+        var value = options.value;
+        if(value != null) {
+            node.appendChild(this.createTextNode(value));
+        }
+        return node;
+    },
+    
+    /**
+     * Method: setAttributes
+     * Set multiple attributes given key value pairs from an object.
+     *
+     * Parameters:
+     * node - {Element} An element node.
+     * obj - {Object || Array} An object whose properties represent attribute
+     *     names and values represent attribute values.  If an attribute name
+     *     is a qualified name ("prefix:local"), the prefix will be looked up
+     *     in the parsers {namespaces} object.  If the prefix is found,
+     *     setAttributeNS will be used instead of setAttribute.
+     */
+    setAttributes: function(node, obj) {
+        var value, uri;
+        for(var name in obj) {
+            if(obj[name] != null && obj[name].toString) {
+                value = obj[name].toString();
+                // check for qualified attribute name ("prefix:local")
+                uri = this.namespaces[name.substring(0, name.indexOf(":"))] || null;
+                this.setAttributeNS(node, uri, name, value);
+            }
+        }
+    },
+
+    /**
+     * Method: readNode
+     * Shorthand for applying one of the named readers given the node
+     *     namespace and local name.  Readers take two args (node, obj) and
+     *     generally extend or modify the second.
+     *
+     * Parameters:
+     * node - {DOMElement} The node to be read (required).
+     * obj - {Object} The object to be modified (optional).
+     *
+     * Returns:
+     * {Object} The input object, modified (or a new one if none was provided).
+     */
+    readNode: function(node, obj) {
+        if(!obj) {
+            obj = {};
+        }
+        var group = this.readers[node.namespaceURI ? this.namespaceAlias[node.namespaceURI]: this.defaultPrefix];
+        if(group) {
+            var local = node.localName || node.nodeName.split(":").pop();
+            var reader = group[local] || group["*"];
+            if(reader) {
+                reader.apply(this, [node, obj]);
+            }
+        }
+        return obj;
+    },
+
+    /**
+     * Method: readChildNodes
+     * Shorthand for applying the named readers to all children of a node.
+     *     For each child of type 1 (element), <readSelf> is called.
+     *
+     * Parameters:
+     * node - {DOMElement} The node to be read (required).
+     * obj - {Object} The object to be modified (optional).
+     *
+     * Returns:
+     * {Object} The input object, modified.
+     */
+    readChildNodes: function(node, obj) {
+        if(!obj) {
+            obj = {};
+        }
+        var children = node.childNodes;
+        var child;
+        for(var i=0, len=children.length; i<len; ++i) {
+            child = children[i];
+            if(child.nodeType == 1) {
+                this.readNode(child, obj);
+            }
+        }
+        return obj;
+    },
+
+    /**
+     * Method: writeNode
+     * Shorthand for applying one of the named writers and appending the
+     *     results to a node.  If a qualified name is not provided for the
+     *     second argument (and a local name is used instead), the namespace
+     *     of the parent node will be assumed.
+     *
+     * Parameters:
+     * name - {String} The name of a node to generate.  If a qualified name
+     *     (e.g. "pre:Name") is used, the namespace prefix is assumed to be
+     *     in the <writers> group.  If a local name is used (e.g. "Name") then
+     *     the namespace of the parent is assumed.  If a local name is used
+     *     and no parent is supplied, then the default namespace is assumed.
+     * obj - {Object} Structure containing data for the writer.
+     * parent - {DOMElement} Result will be appended to this node.  If no parent
+     *     is supplied, the node will not be appended to anything.
+     *
+     * Returns:
+     * {DOMElement} The child node.
+     */
+    writeNode: function(name, obj, parent) {
+        var prefix, local;
+        var split = name.indexOf(":");
+        if(split > 0) {
+            prefix = name.substring(0, split);
+            local = name.substring(split + 1);
+        } else {
+            if(parent) {
+                prefix = this.namespaceAlias[parent.namespaceURI];
+            } else {
+                prefix = this.defaultPrefix;
+            }
+            local = name;
+        }
+        var child = this.writers[prefix][local].apply(this, [obj]);
+        if(parent) {
+            parent.appendChild(child);
+        }
+        return child;
+    },
+
+    /**
+     * APIMethod: getChildEl
+     * Get the first child element.  Optionally only return the first child
+     *     if it matches the given name and namespace URI.
+     *
+     * Parameters:
+     * node - {DOMElement} The parent node.
+     * name - {String} Optional node name (local) to search for.
+     * uri - {String} Optional namespace URI to search for.
+     *
+     * Returns:
+     * {DOMElement} The first child.  Returns null if no element is found, if
+     *     something significant besides an element is found, or if the element
+     *     found does not match the optional name and uri.
+     */
+    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
+     *     if it matches the given local name and namespace URI.
+     *
+     * Parameters:
+     * node - {DOMElement} The node.
+     * name - {String} Optional local name of the sibling to search for.
+     * uri - {String} Optional namespace URI of the sibling to search for.
+     *
+     * Returns:
+     * {DOMElement} The next sibling element.  Returns null if no element is
+     *     found, something significant besides an element is found, or the
+     *     found element does not match the optional name and uri.
+     */
+    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
+     *     sibling with the given local name or namespace URI.
+     *
+     * Parameters:
+     * node - {DOMElement} The node.
+     * name - {String} Optional local name of the sibling to search for.
+     * uri - {String} Optional namespace URI of the sibling to search for.
+     *
+     * Returns:
+     * {DOMElement} The next sibling element.  Returns null if no element is
+     *     found, something significant besides an element is found, or the
+     *     found element does not match the query.
+     */
+    getThisOrNextEl: function(node, name, uri) {
+        outer: for(var sibling=node; sibling; sibling=sibling.nextSibling) {
+            switch(sibling.nodeType) {
+                case 1: // Element
+                    if((!name || name === (sibling.localName || sibling.nodeName.split(":").pop())) &&
+                       (!uri || uri === sibling.namespaceURI)) {
+                        // matches
+                        break outer;
+                    }
+                    sibling = null;
+                    break outer;
+                case 3: // Text
+                    if(/^\s*$/.test(sibling.nodeValue)) {
+                        break;
+                    }
+                case 4: // CDATA
+                case 6: // ENTITY_NODE
+                case 12: // NOTATION_NODE
+                case 10: // DOCUMENT_TYPE_NODE
+                case 11: // DOCUMENT_FRAGMENT_NODE
+                    sibling = null;
+                    break outer;
+            } // ignore comments and processing instructions
+        }
+        return sibling || null;
+    },
+    
+    /**
+     * APIMethod: lookupNamespaceURI
+     * Takes a prefix and returns the namespace URI associated with it on the given
+     *     node if found (and null if not). Supplying null for the prefix will
+     *     return the default namespace.
+     *
+     * For browsers that support it, this calls the native lookupNamesapceURI
+     *     function.  In other browsers, this is an implementation of
+     *     http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI.
+     *
+     * 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.
+     */
+    lookupNamespaceURI: function(node, prefix) {
+        var uri = null;
+        if(node) {
+            if(node.lookupNamespaceURI) {
+                uri = node.lookupNamespaceURI(prefix);
+            } else {
+                outer: switch(node.nodeType) {
+                    case 1: // ELEMENT_NODE
+                        if(node.namespaceURI !== null && node.prefix === prefix) {
+                            uri = node.namespaceURI;
+                            break outer;
+                        }
+                        var len = node.attributes.length;
+                        if(len) {
+                            var attr;
+                            for(var i=0; i<len; ++i) {
+                                attr = node.attributes[i];
+                                if(attr.prefix === "xmlns" && attr.name === "xmlns:" + prefix) {
+                                    uri = attr.value || null;
+                                    break outer;
+                                } else if(attr.name === "xmlns" && prefix === null) {
+                                    uri = attr.value || null;
+                                    break outer;
+                                }
+                            }
+                        }
+                        uri = this.lookupNamespaceURI(node.parentNode, prefix);
+                        break outer;
+                    case 2: // ATTRIBUTE_NODE
+                        uri = this.lookupNamespaceURI(node.ownerElement, prefix);
+                        break outer;
+                    case 9: // DOCUMENT_NODE
+                        uri = this.lookupNamespaceURI(node.documentElement, prefix);
+                        break outer;
+                    case 6: // ENTITY_NODE
+                    case 12: // NOTATION_NODE
+                    case 10: // DOCUMENT_TYPE_NODE
+                    case 11: // DOCUMENT_FRAGMENT_NODE
+                        break outer;
+                    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);
+                        break outer;
+                }
+            }
+        }
+        return uri;
+    },
+    
+    CLASS_NAME: "OpenLayers.Format.XML" 
+
+});     
+
+OpenLayers.Format.XML.CONTENT_TYPE = {EMPTY: 0, SIMPLE: 1, COMPLEX: 2, MIXED: 3};
+
+/**
+ * APIFunction: OpenLayers.Format.XML.lookupNamespaceURI
+ * Takes a prefix and returns the namespace URI associated with it on the given
+ *     node if found (and null if not). Supplying null for the prefix will
+ *     return the default namespace.
+ *
+ * For browsers that support it, this calls the native lookupNamesapceURI
+ *     function.  In other browsers, this is an implementation of
+ *     http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespaceURI.
+ *
+ * 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.
+ */
+OpenLayers.Format.XML.lookupNamespaceURI = OpenLayers.Function.bind(
+    OpenLayers.Format.XML.prototype.lookupNamespaceURI,
+    OpenLayers.Format.XML.prototype
+);
diff --git a/lib/OpenLayers/Geometry.js b/lib/OpenLayers/Geometry.js
new file mode 100644
index 0000000..53e321a
--- /dev/null
+++ b/lib/OpenLayers/Geometry.js
@@ -0,0 +1,456 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). 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
+ */
+
+/**
+ * Class: OpenLayers.Geometry
+ * A Geometry is a description of a geographic object.  Create an instance of
+ * this class with the <OpenLayers.Geometry> constructor.  This is a base class,
+ * typical geometry types are described by subclasses of this class.
+ */
+OpenLayers.Geometry = OpenLayers.Class({
+
+    /**
+     * Property: id
+     * {String} A unique identifier for this geometry.
+     */
+    id: null,
+
+    /**
+     * Property: parent
+     * {<OpenLayers.Geometry>}This is set when a Geometry is added as component
+     * of another geometry
+     */
+    parent: null,
+
+    /**
+     * Property: bounds 
+     * {<OpenLayers.Bounds>} The bounds of this geometry
+     */
+    bounds: null,
+
+    /**
+     * Constructor: OpenLayers.Geometry
+     * Creates a geometry object.  
+     */
+    initialize: function() {
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME+ "_");
+    },
+    
+    /**
+     * Method: destroy
+     * Destroy this geometry.
+     */
+    destroy: function() {
+        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>} 
+     */
+    setBounds: function(bounds) {
+        if (bounds) {
+            this.bounds = bounds.clone();
+        }
+    },
+    
+    /**
+     * Method: clearBounds
+     * Nullify this components bounds and that of its parent as well.
+     */
+    clearBounds: function() {
+        this.bounds = null;
+        if (this.parent) {
+            this.parent.clearBounds();
+        }    
+    },
+    
+    /**
+     * Method: extendBounds
+     * 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>} 
+     */
+    extendBounds: function(newBounds){
+        var bounds = this.getBounds();
+        if (!bounds) {
+            this.setBounds(newBounds);
+        } else {
+            this.bounds.extend(newBounds);
+        }
+    },
+    
+    /**
+     * APIMethod: getBounds
+     * Get the bounds for this Geometry. If bounds is not set, it 
+     * is calculated again, this makes queries faster.
+     * 
+     * Returns:
+     * {<OpenLayers.Bounds>}
+     */
+    getBounds: function() {
+        if (this.bounds == null) {
+            this.calculateBounds();
+        }
+        return this.bounds;
+    },
+    
+    /** 
+     * APIMethod: calculateBounds
+     * 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).
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} The target geometry.
+     * options - {Object} Optional properties for configuring the distance
+     *     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,
+     *     x0, y0, x1, and x2 properties.  The x0 and y0 properties represent
+     *     the coordinates of the closest point on this geometry. The x1 and y1
+     *     properties represent the coordinates of the closest point on the
+     *     target geometry.
+     */
+    distanceTo: function(geometry, options) {
+    },
+    
+    /**
+     * APIMethod: getVertices
+     * Return a list of all points in this geometry.
+     *
+     * Parameters:
+     * nodes - {Boolean} For lines, only return vertices that are
+     *     endpoints.  If false, for lines, only vertices that are not
+     *     endpoints will be returned.  If not provided, all vertices will
+     *     be returned.
+     *
+     * Returns:
+     * {Array} A list of all vertices in the geometry.
+     */
+    getVertices: function(nodes) {
+    },
+
+    /**
+     * Method: atPoint
+     * Note - This is only an approximation based on the bounds of the 
+     * geometry.
+     * 
+     * Parameters:
+     * 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
+     */
+    atPoint: function(lonlat, toleranceLon, toleranceLat) {
+        var atPoint = false;
+        var bounds = this.getBounds();
+        if ((bounds != null) && (lonlat != null)) {
+
+            var dX = (toleranceLon != null) ? toleranceLon : 0;
+            var dY = (toleranceLat != null) ? toleranceLat : 0;
+    
+            var toleranceBounds = 
+                new OpenLayers.Bounds(this.bounds.left - dX,
+                                      this.bounds.bottom - dY,
+                                      this.bounds.right + dX,
+                                      this.bounds.top + dY);
+
+            atPoint = toleranceBounds.containsLonLat(lonlat);
+        }
+        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
+     */
+    getLength: function() {
+        //to be overridden by geometries that actually have a length
+        //
+        return 0.0;
+    },
+
+    /**
+     * 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
+     */
+    getArea: function() {
+        //to be overridden by geometries that actually have an area
+        //
+        return 0.0;
+    },
+    
+    /**
+     * APIMethod: getCentroid
+     * Calculate the centroid of this geometry. This method is defined in subclasses.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Point>} The centroid of the collection
+     */
+    getCentroid: function() {
+        return null;
+    },
+
+    /**
+     * Method: toString
+     * Returns the Well-Known Text representation of a geometry
+     *
+     * Returns:
+     * {String} Well-Known Text
+     */
+    toString: function() {
+        return OpenLayers.Format.WKT.prototype.write(
+            new OpenLayers.Feature.Vector(this)
+        );
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry"
+});
+
+/**
+ * Function: OpenLayers.Geometry.fromWKT
+ * Generate a geometry given a Well-Known Text string.
+ *
+ * Parameters:
+ * wkt - {String} A string representing the geometry in Well-Known Text.
+ *
+ * Returns:
+ * {<OpenLayers.Geometry>} A geometry of the appropriate class.
+ */
+OpenLayers.Geometry.fromWKT = function(wkt) {
+    var format = arguments.callee.format;
+    if(!format) {
+        format = new OpenLayers.Format.WKT();
+        arguments.callee.format = format;
+    }
+    var geom;
+    var result = format.read(wkt);
+    if(result instanceof OpenLayers.Feature.Vector) {
+        geom = result.geometry;
+    } else if(result instanceof Array) {
+        var len = result.length;
+        var components = new Array(len);
+        for(var i=0; i<len; ++i) {
+            components[i] = result[i].geometry;
+        }
+        geom = new OpenLayers.Geometry.Collection(components);
+    }
+    return geom;
+};
+    
+/**
+ * Method: OpenLayers.Geometry.segmentsIntersect
+ * Determine whether two line segments intersect.  Optionally calculates
+ *     and returns the intersection point.  This function is optimized for
+ *     cases where seg1.x2 >= seg2.x1 || seg2.x2 >= seg1.x1.  In those
+ *     obvious cases where there is no intersection, the function should
+ *     not be called.
+ *
+ * Parameters:
+ * seg1 - {Object} Object representing a segment with properties x1, y1, x2,
+ *     and y2.  The start point is represented by x1 and y1.  The end point
+ *     is represented by x2 and y2.  Start and end are ordered so that x1 < x2.
+ * seg2 - {Object} Object representing a segment with properties x1, y1, x2,
+ *     and y2.  The start point is represented by x1 and y1.  The end point
+ *     is represented by x2 and y2.  Start and end are ordered so that x1 < x2.
+ * options - {Object} Optional properties for calculating the intersection.
+ *
+ * Valid options:
+ * point - {Boolean} Return the intersection point.  If false, the actual
+ *     intersection point will not be calculated.  If true and the segments
+ *     intersect, the intersection point will be returned.  If true and
+ *     the segments do not intersect, false will be returned.  If true and
+ *     the segments are coincident, true will be returned.
+ * tolerance - {Number} If a non-null value is provided, if the segments are
+ *     within the tolerance distance, this will be considered an intersection.
+ *     In addition, if the point option is true and the calculated intersection
+ *     is within the tolerance distance of an end point, the endpoint will be
+ *     returned instead of the calculated intersection.  Further, if the
+ *     intersection is within the tolerance of endpoints on both segments, or
+ *     if two segment endpoints are within the tolerance distance of eachother
+ *     (but no intersection is otherwise calculated), an endpoint on the
+ *     first segment provided will be returned.
+ *
+ * Returns:
+ * {Boolean | <OpenLayers.Geometry.Point>}  The two segments intersect.
+ *     If the point argument is true, the return will be the intersection
+ *     point or false if none exists.  If point is true and the segments
+ *     are coincident, return will be true (and the instersection is equal
+ *     to the shorter segment).
+ */
+OpenLayers.Geometry.segmentsIntersect = function(seg1, seg2, options) {
+    var point = options && options.point;
+    var tolerance = options && options.tolerance;
+    var intersection = false;
+    var x11_21 = seg1.x1 - seg2.x1;
+    var y11_21 = seg1.y1 - seg2.y1;
+    var x12_11 = seg1.x2 - seg1.x1;
+    var y12_11 = seg1.y2 - seg1.y1;
+    var y22_21 = seg2.y2 - seg2.y1;
+    var x22_21 = seg2.x2 - seg2.x1;
+    var d = (y22_21 * x12_11) - (x22_21 * y12_11);
+    var n1 = (x22_21 * y11_21) - (y22_21 * x11_21);
+    var n2 = (x12_11 * y11_21) - (y12_11 * x11_21);
+    if(d == 0) {
+        // parallel
+        if(n1 == 0 && n2 == 0) {
+            // coincident
+            intersection = true;
+        }
+    } else {
+        var along1 = n1 / d;
+        var along2 = n2 / d;
+        if(along1 >= 0 && along1 <= 1 && along2 >=0 && along2 <= 1) {
+            // intersect
+            if(!point) {
+                intersection = true;
+            } else {
+                // calculate the intersection point
+                var x = seg1.x1 + (along1 * x12_11);
+                var y = seg1.y1 + (along1 * y12_11);
+                intersection = new OpenLayers.Geometry.Point(x, y);
+            }
+        }
+    }
+    if(tolerance) {
+        var dist;
+        if(intersection) {
+            if(point) {
+                var segs = [seg1, seg2];
+                var seg, x, y;
+                // check segment endpoints for proximity to intersection
+                // set intersection to first endpoint within the tolerance
+                outer: for(var i=0; i<2; ++i) {
+                    seg = segs[i];
+                    for(var j=1; j<3; ++j) {
+                        x = seg["x" + j];
+                        y = seg["y" + j];
+                        dist = Math.sqrt(
+                            Math.pow(x - intersection.x, 2) +
+                            Math.pow(y - intersection.y, 2)
+                        );
+                        if(dist < tolerance) {
+                            intersection.x = x;
+                            intersection.y = y;
+                            break outer;
+                        }
+                    }
+                }
+                
+            }
+        } else {
+            // no calculated intersection, but segments could be within
+            // the tolerance of one another
+            var segs = [seg1, seg2];
+            var source, target, x, y, p, result;
+            // check segment endpoints for proximity to intersection
+            // set intersection to first endpoint within the tolerance
+            outer: for(var i=0; i<2; ++i) {
+                source = segs[i];
+                target = segs[(i+1)%2];
+                for(var j=1; j<3; ++j) {
+                    p = {x: source["x"+j], y: source["y"+j]};
+                    result = OpenLayers.Geometry.distanceToSegment(p, target);
+                    if(result.distance < tolerance) {
+                        if(point) {
+                            intersection = new OpenLayers.Geometry.Point(p.x, p.y);
+                        } else {
+                            intersection = true;
+                        }
+                        break outer;
+                    }
+                }
+            }
+        }
+    }
+    return intersection;
+};
+
+/**
+ * Function: OpenLayers.Geometry.distanceToSegment
+ *
+ * Parameters:
+ * point - {Object} An object with x and y properties representing the
+ *     point coordinates.
+ * segment - {Object} An object with x1, y1, x2, and y2 properties
+ *     representing endpoint coordinates.
+ *
+ * Returns:
+ * {Object} An object with distance, x, and y properties.  The distance
+ *     will be the shortest distance between the input point and segment.
+ *     The x and y properties represent the coordinates along the segment
+ *     where the shortest distance meets the segment.
+ */
+OpenLayers.Geometry.distanceToSegment = function(point, segment) {
+    var x0 = point.x;
+    var y0 = point.y;
+    var x1 = segment.x1;
+    var y1 = segment.y1;
+    var x2 = segment.x2;
+    var y2 = segment.y2;
+    var dx = x2 - x1;
+    var dy = y2 - y1;
+    var along = ((dx * (x0 - x1)) + (dy * (y0 - y1))) /
+                (Math.pow(dx, 2) + Math.pow(dy, 2));
+    var x, y;
+    if(along <= 0.0) {
+        x = x1;
+        y = y1;
+    } else if(along >= 1.0) {
+        x = x2;
+        y = y2;
+    } else {
+        x = x1 + along * dx;
+        y = y1 + along * dy;
+    }
+    return {
+        distance: Math.sqrt(Math.pow(x - x0, 2) + Math.pow(y - y0, 2)),
+        x: x, y: y
+    };
+};
diff --git a/lib/OpenLayers/Geometry/Collection.js b/lib/OpenLayers/Geometry/Collection.js
new file mode 100644
index 0000000..39be8d7
--- /dev/null
+++ b/lib/OpenLayers/Geometry/Collection.js
@@ -0,0 +1,546 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.Collection
+ * 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 
+ * 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.Collection = OpenLayers.Class(OpenLayers.Geometry, {
+
+    /**
+     * APIProperty: components
+     * {Array(<OpenLayers.Geometry>)} The component parts of this geometry
+     */
+    components: null,
+    
+    /**
+     * Property: componentTypes
+     * {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: null,
+
+    /**
+     * Constructor: OpenLayers.Geometry.Collection
+     * Creates a Geometry Collection -- a list of geoms.
+     *
+     * Parameters: 
+     * components - {Array(<OpenLayers.Geometry>)} Optional array of geometries
+     *
+     */
+    initialize: function (components) {
+        OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
+        this.components = [];
+        if (components != null) {
+            this.addComponents(components);
+        }
+    },
+
+    /**
+     * APIMethod: destroy
+     * Destroy this geometry.
+     */
+    destroy: function () {
+        this.components.length = 0;
+        this.components = null;
+        OpenLayers.Geometry.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: clone
+     * Clone this geometry.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Collection>} An exact clone of this collection
+     */
+    clone: function() {
+        var geometry = eval("new " + this.CLASS_NAME + "()");
+        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()); 
+        }
+        return strings.join(",");
+    },
+
+    /**
+     * APIMethod: calculateBounds
+     * Recalculate the bounds by iterating through the components and 
+     * calling calling extendBounds() on each item.
+     */
+    calculateBounds: function() {
+        this.bounds = null;
+        if ( this.components && this.components.length > 0) {
+            this.setBounds(this.components[0].getBounds());
+            for (var i=1, len=this.components.length; i<len; i++) {
+                this.extendBounds(this.components[i].getBounds());
+            }
+        }
+    },
+
+    /**
+     * APIMethod: addComponents
+     * Add components to this geometry.
+     *
+     * Parameters:
+     * components - {Array(<OpenLayers.Geometry>)} An array of geometries to add
+     */
+    addComponents: function(components){
+        if(!(components instanceof Array)) {
+            components = [components];
+        }
+        for(var i=0, len=components.length; i<len; i++) {
+            this.addComponent(components[i]);
+        }
+    },
+
+    /**
+     * Method: addComponent
+     * Add a new component (geometry) to the collection.  If this.componentTypes
+     * 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) {
+            if(this.componentTypes == null ||
+               (OpenLayers.Util.indexOf(this.componentTypes,
+                                        component.CLASS_NAME) > -1)) {
+
+                if(index != null && (index < this.components.length)) {
+                    var components1 = this.components.slice(0, index);
+                    var components2 = this.components.slice(index, 
+                                                           this.components.length);
+                    components1.push(component);
+                    this.components = components1.concat(components2);
+                } else {
+                    this.components.push(component);
+                }
+                component.parent = this;
+                this.clearBounds();
+                added = true;
+            }
+        }
+        return added;
+    },
+    
+    /**
+     * APIMethod: removeComponents
+     * Remove components from this geometry.
+     *
+     * Parameters:
+     * components - {Array(<OpenLayers.Geometry>)} The components to be removed
+     */
+    removeComponents: function(components) {
+        if(!(components instanceof Array)) {
+            components = [components];
+        }
+        for(var i=components.length-1; i>=0; --i) {
+            this.removeComponent(components[i]);
+        }
+    },
+    
+    /**
+     * Method: removeComponent
+     * Remove a component from this geometry.
+     *
+     * Parameters:
+     * 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();
+    },
+
+    /**
+     * APIMethod: getLength
+     * Calculate the length of this geometry
+     *
+     * Returns:
+     * {Float} The length of the geometry
+     */
+    getLength: function() {
+        var length = 0.0;
+        for (var i=0, len=this.components.length; i<len; i++) {
+            length += this.components[i].getLength();
+        }
+        return length;
+    },
+    
+    /**
+     * APIMethod: getArea
+     * Calculate the area of this geometry. Note how this function is overridden
+     * in <OpenLayers.Geometry.Polygon>.
+     *
+     * Returns:
+     * {Float} The area of the collection by summing its parts
+     */
+    getArea: function() {
+        var area = 0.0;
+        for (var i=0, len=this.components.length; i<len; i++) {
+            area += this.components[i].getArea();
+        }
+        return area;
+    },
+
+    /** 
+     * APIMethod: getGeodesicArea
+     * Calculate the approximate area of the polygon were it projected onto
+     *     the earth.
+     *
+     * Parameters:
+     * 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
+     *     Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
+     *
+     * Returns:
+     * {float} The approximate geodesic area of the geometry in square meters.
+     */
+    getGeodesicArea: function(projection) {
+        var area = 0.0;
+        for(var i=0, len=this.components.length; i<len; i++) {
+            area += this.components[i].getGeodesicArea(projection);
+        }
+        return area;
+    },
+    
+    /**
+     * APIMethod: getCentroid
+     *
+     * Compute the centroid for this geometry collection.
+     *
+     * Parameters:
+     * weighted - {Boolean} Perform the getCentroid computation recursively,
+     * returning an area weighted average of all geometries in this collection.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Point>} The centroid of the collection
+     */
+    getCentroid: function(weighted) {
+        if (!weighted) {
+            return this.components.length && this.components[0].getCentroid();
+        }
+        var len = this.components.length;
+        if (!len) {
+            return false;
+        }
+        
+        var areas = [];
+        var centroids = [];
+        var areaSum = 0;
+        var minArea = Number.MAX_VALUE;
+        var component;
+        for (var i=0; i<len; ++i) {
+            component = this.components[i];
+            var area = component.getArea();
+            var centroid = component.getCentroid(true);
+            if (isNaN(area) || isNaN(centroid.x) || isNaN(centroid.y)) {
+                continue;
+            }
+            areas.push(area);
+            areaSum += area;
+            minArea = (area < minArea && area > 0) ? area : minArea;
+            centroids.push(centroid);
+        }
+        len = areas.length;
+        if (areaSum === 0) {
+            // all the components in this collection have 0 area
+            // probably a collection of points -- weight all the points the same
+            for (var i=0; i<len; ++i) {
+                areas[i] = 1;
+            }
+            areaSum = areas.length;
+        } else {
+            // normalize all the areas where the smallest area will get
+            // a value of 1
+            for (var i=0; i<len; ++i) {
+                areas[i] /= minArea;
+            }
+            areaSum /= minArea;
+        }
+        
+        var xSum = 0, ySum = 0, centroid, area;
+        for (var i=0; i<len; ++i) {
+            centroid = centroids[i];
+            area = areas[i];
+            xSum += centroid.x * area;
+            ySum += centroid.y * area;
+        }
+        
+        return new OpenLayers.Geometry.Point(xSum/areaSum, ySum/areaSum);
+    },
+
+    /**
+     * APIMethod: getGeodesicLength
+     * Calculate the approximate length of the geometry were it projected onto
+     *     the earth.
+     *
+     * 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.
+     */
+    getGeodesicLength: function(projection) {
+        var length = 0.0;
+        for(var i=0, len=this.components.length; i<len; i++) {
+            length += this.components[i].getGeodesicLength(projection);
+        }
+        return length;
+    },
+
+    /**
+     * APIMethod: move
+     * Moves a geometry by the given displacement along positive x and y axes.
+     *     This modifies the position of the geometry and clears the cached
+     *     bounds.
+     *
+     * Parameters:
+     * x - {Float} Distance to move geometry in positive x direction. 
+     * y - {Float} Distance to move geometry in positive y direction.
+     */
+    move: function(x, y) {
+        for(var i=0, len=this.components.length; i<len; i++) {
+            this.components[i].move(x, y);
+        }
+    },
+
+    /**
+     * APIMethod: rotate
+     * Rotate a geometry around some origin
+     *
+     * Parameters:
+     * angle - {Float} Rotation angle in degrees (measured counterclockwise
+     *                 from the positive x-axis)
+     * origin - {<OpenLayers.Geometry.Point>} Center point for the rotation
+     */
+    rotate: function(angle, origin) {
+        for(var i=0, len=this.components.length; i<len; ++i) {
+            this.components[i].rotate(angle, origin);
+        }
+    },
+
+    /**
+     * APIMethod: resize
+     * Resize a geometry relative to some origin.  Use this method to apply
+     *     a uniform scaling to a geometry.
+     *
+     * Parameters:
+     * scale - {Float} Factor by which to scale the geometry.  A scale of 2
+     *                 doubles the size of the geometry in each dimension
+     *                 (lines, for example, will be twice as long, and polygons
+     *                 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. 
+     */
+    resize: function(scale, origin, ratio) {
+        for(var i=0; i<this.components.length; ++i) {
+            this.components[i].resize(scale, origin, ratio);
+        }
+        return this;
+    },
+
+    /**
+     * APIMethod: distanceTo
+     * Calculate the closest distance between two geometries (on the x-y plane).
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} The target geometry.
+     * options - {Object} Optional properties for configuring the distance
+     *     calculation.
+     *
+     * Valid options:
+     * details - {Boolean} Return details from the distance calculation.
+     *     Default is false.
+     * edge - {Boolean} Calculate the distance from this geometry to the
+     *     nearest edge of the target geometry.  Default is true.  If true,
+     *     calling distanceTo from a geometry that is wholly contained within
+     *     the target will result in a non-zero distance.  If false, whenever
+     *     geometries intersect, calling distanceTo will return 0.  If false,
+     *     details cannot be returned.
+     *
+     * Returns:
+     * {Number | Object} The distance between this geometry and the target.
+     *     If details is true, the return will be an object with distance,
+     *     x0, y0, x1, and y1 properties.  The x0 and y0 properties represent
+     *     the coordinates of the closest point on this geometry. The x1 and y1
+     *     properties represent the coordinates of the closest point on the
+     *     target geometry.
+     */
+    distanceTo: function(geometry, options) {
+        var edge = !(options && options.edge === false);
+        var details = edge && options && options.details;
+        var result, best, distance;
+        var min = Number.POSITIVE_INFINITY;
+        for(var i=0, len=this.components.length; i<len; ++i) {
+            result = this.components[i].distanceTo(geometry, options);
+            distance = details ? result.distance : result;
+            if(distance < min) {
+                min = distance;
+                best = result;
+                if(min == 0) {
+                    break;
+                }
+            }
+        }
+        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. 
+     *
+     * Returns:
+     * {Boolean} The supplied geometry is equivalent to this geometry.
+     */
+    equals: function(geometry) {
+        var equivalent = true;
+        if(!geometry || !geometry.CLASS_NAME ||
+           (this.CLASS_NAME != geometry.CLASS_NAME)) {
+            equivalent = false;
+        } else if(!(geometry.components instanceof Array) ||
+                  (geometry.components.length != this.components.length)) {
+            equivalent = false;
+        } else {
+            for(var i=0, len=this.components.length; i<len; ++i) {
+                if(!this.components[i].equals(geometry.components[i])) {
+                    equivalent = false;
+                    break;
+                }
+            }
+        }
+        return equivalent;
+    },
+
+    /**
+     * APIMethod: transform
+     * Reproject the components geometry from source to dest.
+     * 
+     * Parameters:
+     * source - {<OpenLayers.Projection>} 
+     * dest - {<OpenLayers.Projection>}
+     * 
+     * Returns:
+     * {<OpenLayers.Geometry>} 
+     */
+    transform: function(source, dest) {
+        if (source && dest) {
+            for (var i=0, len=this.components.length; i<len; i++) {  
+                var component = this.components[i];
+                component.transform(source, dest);
+            }
+            this.bounds = null;
+        }
+        return this;
+    },
+
+    /**
+     * APIMethod: intersects
+     * Determine if the input geometry intersects this one.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} Any type of geometry.
+     *
+     * Returns:
+     * {Boolean} The input geometry intersects this one.
+     */
+    intersects: function(geometry) {
+        var intersect = false;
+        for(var i=0, len=this.components.length; i<len; ++ i) {
+            intersect = geometry.intersects(this.components[i]);
+            if(intersect) {
+                break;
+            }
+        }
+        return intersect;
+    },
+
+    /**
+     * APIMethod: getVertices
+     * Return a list of all points in this geometry.
+     *
+     * Parameters:
+     * nodes - {Boolean} For lines, only return vertices that are
+     *     endpoints.  If false, for lines, only vertices that are not
+     *     endpoints will be returned.  If not provided, all vertices will
+     *     be returned.
+     *
+     * Returns:
+     * {Array} A list of all vertices in the geometry.
+     */
+    getVertices: function(nodes) {
+        var vertices = [];
+        for(var i=0, len=this.components.length; i<len; ++i) {
+            Array.prototype.push.apply(
+                vertices, this.components[i].getVertices(nodes)
+            );
+        }
+        return vertices;
+    },
+
+
+    CLASS_NAME: "OpenLayers.Geometry.Collection"
+});
diff --git a/lib/OpenLayers/Geometry/Curve.js b/lib/OpenLayers/Geometry/Curve.js
new file mode 100644
index 0000000..019e571
--- /dev/null
+++ b/lib/OpenLayers/Geometry/Curve.js
@@ -0,0 +1,93 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry/MultiPoint.js
+ */
+
+/**
+ * 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: 
+ *  - <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 
+     *                 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, 
+                                                                  arguments);
+    },
+    
+    /**
+     * APIMethod: getLength
+     * 
+     * Returns:
+     * {Float} The length of the curve
+     */
+    getLength: function() {
+        var length = 0.0;
+        if ( this.components && (this.components.length > 1)) {
+            for(var i=1, len=this.components.length; i<len; i++) {
+                length += this.components[i-1].distanceTo(this.components[i]);
+            }
+        }
+        return length;
+    },
+
+    /**
+     * APIMethod: getGeodesicLength
+     * Calculate the approximate length of the geometry were it projected onto
+     *     the earth.
+     *
+     * 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.
+     */
+    getGeodesicLength: function(projection) {
+        var geom = this;  // so we can work with a clone if needed
+        if(projection) {
+            var gg = new OpenLayers.Projection("EPSG:4326");
+            if(!gg.equals(projection)) {
+                geom = this.clone().transform(projection, gg);
+            }
+        }
+        var length = 0.0;
+        if(geom.components && (geom.components.length > 1)) {
+            var p1, p2;
+            for(var i=1, len=geom.components.length; i<len; i++) {
+                p1 = geom.components[i-1];
+                p2 = geom.components[i];
+                // this returns km and requires lon/lat properties
+                length += OpenLayers.Util.distVincenty(
+                    {lon: p1.x, lat: p1.y}, {lon: p2.x, lat: p2.y}
+                );
+            }
+        }
+        // convert to m
+        return length * 1000;
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.Curve"
+});
diff --git a/lib/OpenLayers/Geometry/LineString.js b/lib/OpenLayers/Geometry/LineString.js
new file mode 100644
index 0000000..02484af
--- /dev/null
+++ b/lib/OpenLayers/Geometry/LineString.js
@@ -0,0 +1,552 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry/Curve.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.LineString
+ * 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>
+ */
+OpenLayers.Geometry.LineString = OpenLayers.Class(OpenLayers.Geometry.Curve, {
+
+    /**
+     * Constructor: OpenLayers.Geometry.LineString
+     * Create a new LineString geometry
+     *
+     * Parameters:
+     * points - {Array(<OpenLayers.Geometry.Point>)} An array of points used to
+     *          generate the linestring
+     *
+     */
+    initialize: function(points) {
+        OpenLayers.Geometry.Curve.prototype.initialize.apply(this, arguments);        
+    },
+
+    /**
+     * APIMethod: removeComponent
+     * 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: 
+     * 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, 
+                                                                  arguments);
+        }
+    },
+    
+    /**
+     * APIMethod: intersects
+     * Test for instersection between two geometries.  This is a cheapo
+     *     implementation of the Bently-Ottmann algorigithm.  It doesn't
+     *     really keep track of a sweep line data structure.  It is closer
+     *     to the brute force method, except that segments are sorted and
+     *     potential intersections are only calculated when bounding boxes
+     *     intersect.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     *
+     * Returns:
+     * {Boolean} The input geometry intersects this geometry.
+     */
+    intersects: function(geometry) {
+        var intersect = false;
+        var type = geometry.CLASS_NAME;
+        if(type == "OpenLayers.Geometry.LineString" ||
+           type == "OpenLayers.Geometry.LinearRing" ||
+           type == "OpenLayers.Geometry.Point") {
+            var segs1 = this.getSortedSegments();
+            var segs2;
+            if(type == "OpenLayers.Geometry.Point") {
+                segs2 = [{
+                    x1: geometry.x, y1: geometry.y,
+                    x2: geometry.x, y2: geometry.y
+                }];
+            } else {
+                segs2 = geometry.getSortedSegments();
+            }
+            var seg1, seg1x1, seg1x2, seg1y1, seg1y2,
+                seg2, seg2y1, seg2y2;
+            // sweep right
+            outer: for(var i=0, len=segs1.length; i<len; ++i) {
+                seg1 = segs1[i];
+                seg1x1 = seg1.x1;
+                seg1x2 = seg1.x2;
+                seg1y1 = seg1.y1;
+                seg1y2 = seg1.y2;
+                inner: for(var j=0, jlen=segs2.length; j<jlen; ++j) {
+                    seg2 = segs2[j];
+                    if(seg2.x1 > seg1x2) {
+                        // seg1 still left of seg2
+                        break;
+                    }
+                    if(seg2.x2 < seg1x1) {
+                        // seg2 still left of seg1
+                        continue;
+                    }
+                    seg2y1 = seg2.y1;
+                    seg2y2 = seg2.y2;
+                    if(Math.min(seg2y1, seg2y2) > Math.max(seg1y1, seg1y2)) {
+                        // seg2 above seg1
+                        continue;
+                    }
+                    if(Math.max(seg2y1, seg2y2) < Math.min(seg1y1, seg1y2)) {
+                        // seg2 below seg1
+                        continue;
+                    }
+                    if(OpenLayers.Geometry.segmentsIntersect(seg1, seg2)) {
+                        intersect = true;
+                        break outer;
+                    }
+                }
+            }
+        } else {
+            intersect = geometry.intersects(this);
+        }
+        return intersect;
+    },
+    
+    /**
+     * Method: getSortedSegments
+     *
+     * Returns:
+     * {Array} An array of segment objects.  Segment objects have properties
+     *     x1, y1, x2, and y2.  The start point is represented by x1 and y1.
+     *     The end point is represented by x2 and y2.  Start and end are
+     *     ordered so that x1 < x2.
+     */
+    getSortedSegments: function() {
+        var numSeg = this.components.length - 1;
+        var segments = new Array(numSeg), point1, point2;
+        for(var i=0; i<numSeg; ++i) {
+            point1 = this.components[i];
+            point2 = this.components[i + 1];
+            if(point1.x < point2.x) {
+                segments[i] = {
+                    x1: point1.x,
+                    y1: point1.y,
+                    x2: point2.x,
+                    y2: point2.y
+                };
+            } else {
+                segments[i] = {
+                    x1: point2.x,
+                    y1: point2.y,
+                    x2: point1.x,
+                    y2: point1.y
+                };
+            }
+        }
+        // more efficient to define this somewhere static
+        function byX1(seg1, seg2) {
+            return seg1.x1 - seg2.x1;
+        }
+        return segments.sort(byX1);
+    },
+    
+    /**
+     * Method: splitWithSegment
+     * Split this geometry with the given segment.
+     *
+     * Parameters:
+     * seg - {Object} An object with x1, y1, x2, and y2 properties referencing
+     *     segment endpoint coordinates.
+     * options - {Object} Properties of this object will be used to determine
+     *     how the split is conducted.
+     *
+     * Valid options:
+     * edge - {Boolean} Allow splitting when only edges intersect.  Default is
+     *     true.  If false, a vertex on the source segment must be within the
+     *     tolerance distance of the intersection to be considered a split.
+     * tolerance - {Number} If a non-null value is provided, intersections
+     *     within the tolerance distance of one of the source segment's
+     *     endpoints will be assumed to occur at the endpoint.
+     *
+     * Returns:
+     * {Object} An object with *lines* and *points* properties.  If the given
+     *     segment intersects this linestring, the lines array will reference
+     *     geometries that result from the split.  The points array will contain
+     *     all intersection points.  Intersection points are sorted along the
+     *     segment (in order from x1,y1 to x2,y2).
+     */
+    splitWithSegment: function(seg, options) {
+        var edge = !(options && options.edge === false);
+        var tolerance = options && options.tolerance;
+        var lines = [];
+        var verts = this.getVertices();
+        var points = [];
+        var intersections = [];
+        var split = false;
+        var vert1, vert2, point;
+        var node, vertex, target;
+        var interOptions = {point: true, tolerance: tolerance};
+        var result = null;
+        for(var i=0, stop=verts.length-2; i<=stop; ++i) {
+            vert1 = verts[i];
+            points.push(vert1.clone());
+            vert2 = verts[i+1];
+            target = {x1: vert1.x, y1: vert1.y, x2: vert2.x, y2: vert2.y};
+            point = OpenLayers.Geometry.segmentsIntersect(
+                seg, target, interOptions
+            );
+            if(point instanceof OpenLayers.Geometry.Point) {
+                if((point.x === seg.x1 && point.y === seg.y1) ||
+                   (point.x === seg.x2 && point.y === seg.y2) ||
+                   point.equals(vert1) || point.equals(vert2)) {
+                    vertex = true;
+                } else {
+                    vertex = false;
+                }
+                if(vertex || edge) {
+                    // push intersections different than the previous
+                    if(!point.equals(intersections[intersections.length-1])) {
+                        intersections.push(point.clone());
+                    }
+                    if(i === 0) {
+                        if(point.equals(vert1)) {
+                            continue;
+                        }
+                    }
+                    if(point.equals(vert2)) {
+                        continue;
+                    }
+                    split = true;
+                    if(!point.equals(vert1)) {
+                        points.push(point);
+                    }
+                    lines.push(new OpenLayers.Geometry.LineString(points));
+                    points = [point.clone()];
+                }
+            }
+        }
+        if(split) {
+            points.push(vert2.clone());
+            lines.push(new OpenLayers.Geometry.LineString(points));
+        }
+        if(intersections.length > 0) {
+            // sort intersections along segment
+            var xDir = seg.x1 < seg.x2 ? 1 : -1;
+            var yDir = seg.y1 < seg.y2 ? 1 : -1;
+            result = {
+                lines: lines,
+                points: intersections.sort(function(p1, p2) {
+                    return (xDir * p1.x - xDir * p2.x) || (yDir * p1.y - yDir * p2.y);
+                })
+            };
+        }
+        return result;
+    },
+
+    /**
+     * 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
+     *     how the split is conducted.
+     *
+     * Valid options:
+     * mutual - {Boolean} Split the source geometry in addition to the target
+     *     geometry.  Default is false.
+     * edge - {Boolean} Allow splitting when only edges intersect.  Default is
+     *     true.  If false, a vertex on the source must be within the tolerance
+     *     distance of the intersection to be considered a split.
+     * 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
+     *     source and target geometry will remain unmodified.  If no split
+     *     results, null will be returned.  If mutual is true and a split
+     *     results, return will be an array of two arrays - the first will be
+     *     all geometries that result from splitting the source geometry and
+     *     the second will be all geometries that result from splitting the
+     *     target geometry.
+     */
+    split: function(target, options) {
+        var results = null;
+        var mutual = options && options.mutual;
+        var sourceSplit, targetSplit, sourceParts, targetParts;
+        if(target instanceof OpenLayers.Geometry.LineString) {
+            var verts = this.getVertices();
+            var vert1, vert2, seg, splits, lines, point;
+            var points = [];
+            sourceParts = [];
+            for(var i=0, stop=verts.length-2; i<=stop; ++i) {
+                vert1 = verts[i];
+                vert2 = verts[i+1];
+                seg = {
+                    x1: vert1.x, y1: vert1.y,
+                    x2: vert2.x, y2: vert2.y
+                };
+                targetParts = targetParts || [target];
+                if(mutual) {
+                    points.push(vert1.clone());
+                }
+                for(var j=0; j<targetParts.length; ++j) {
+                    splits = targetParts[j].splitWithSegment(seg, options);
+                    if(splits) {
+                        // splice in new features
+                        lines = splits.lines;
+                        if(lines.length > 0) {
+                            lines.unshift(j, 1);
+                            Array.prototype.splice.apply(targetParts, lines);
+                            j += lines.length - 2;
+                        }
+                        if(mutual) {
+                            for(var k=0, len=splits.points.length; k<len; ++k) {
+                                point = splits.points[k];
+                                if(!point.equals(vert1)) {
+                                    points.push(point);
+                                    sourceParts.push(new OpenLayers.Geometry.LineString(points));
+                                    if(point.equals(vert2)) {
+                                        points = [];
+                                    } else {
+                                        points = [point.clone()];
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            if(mutual && sourceParts.length > 0 && points.length > 0) {
+                points.push(vert2.clone());
+                sourceParts.push(new OpenLayers.Geometry.LineString(points));
+            }
+        } else {
+            results = target.splitWith(this, options);
+        }
+        if(targetParts && targetParts.length > 1) {
+            targetSplit = true;
+        } else {
+            targetParts = [];
+        }
+        if(sourceParts && sourceParts.length > 1) {
+            sourceSplit = true;
+        } else {
+            sourceParts = [];
+        }
+        if(targetSplit || sourceSplit) {
+            if(mutual) {
+                results = [sourceParts, targetParts];
+            } else {
+                results = targetParts;
+            }
+        }
+        return results;
+    },
+
+    /**
+     * Method: splitWith
+     * Split this geometry (the target) with the given geometry (the source).
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} A geometry used to split this
+     *     geometry (the source).
+     * options - {Object} Properties of this object will be used to determine
+     *     how the split is conducted.
+     *
+     * Valid options:
+     * mutual - {Boolean} Split the source geometry in addition to the target
+     *     geometry.  Default is false.
+     * edge - {Boolean} Allow splitting when only edges intersect.  Default is
+     *     true.  If false, a vertex on the source must be within the tolerance
+     *     distance of the intersection to be considered a split.
+     * 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
+     *     source and target geometry will remain unmodified.  If no split
+     *     results, null will be returned.  If mutual is true and a split
+     *     results, return will be an array of two arrays - the first will be
+     *     all geometries that result from splitting the source geometry and
+     *     the second will be all geometries that result from splitting the
+     *     target geometry.
+     */
+    splitWith: function(geometry, options) {
+        return geometry.split(this, options);
+
+    },
+
+    /**
+     * APIMethod: getVertices
+     * Return a list of all points in this geometry.
+     *
+     * Parameters:
+     * nodes - {Boolean} For lines, only return vertices that are
+     *     endpoints.  If false, for lines, only vertices that are not
+     *     endpoints will be returned.  If not provided, all vertices will
+     *     be returned.
+     *
+     * Returns:
+     * {Array} A list of all vertices in the geometry.
+     */
+    getVertices: function(nodes) {
+        var vertices;
+        if(nodes === true) {
+            vertices = [
+                this.components[0],
+                this.components[this.components.length-1]
+            ];
+        } else if (nodes === false) {
+            vertices = this.components.slice(1, this.components.length-1);
+        } else {
+            vertices = this.components.slice();
+        }
+        return vertices;
+    },
+
+    /**
+     * APIMethod: distanceTo
+     * Calculate the closest distance between two geometries (on the x-y plane).
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} The target geometry.
+     * options - {Object} Optional properties for configuring the distance
+     *     calculation.
+     *
+     * Valid options:
+     * details - {Boolean} Return details from the distance calculation.
+     *     Default is false.
+     * edge - {Boolean} Calculate the distance from this geometry to the
+     *     nearest edge of the target geometry.  Default is true.  If true,
+     *     calling distanceTo from a geometry that is wholly contained within
+     *     the target will result in a non-zero distance.  If false, whenever
+     *     geometries intersect, calling distanceTo will return 0.  If false,
+     *     details cannot be returned.
+     *
+     * Returns:
+     * {Number | Object} The distance between this geometry and the target.
+     *     If details is true, the return will be an object with distance,
+     *     x0, y0, x1, and x2 properties.  The x0 and y0 properties represent
+     *     the coordinates of the closest point on this geometry. The x1 and y1
+     *     properties represent the coordinates of the closest point on the
+     *     target geometry.
+     */
+    distanceTo: function(geometry, options) {
+        var edge = !(options && options.edge === false);
+        var details = edge && options && options.details;
+        var result, best = {};
+        var min = Number.POSITIVE_INFINITY;
+        if(geometry instanceof OpenLayers.Geometry.Point) {
+            var segs = this.getSortedSegments();
+            var x = geometry.x;
+            var y = geometry.y;
+            var seg;
+            for(var i=0, len=segs.length; i<len; ++i) {
+                seg = segs[i];
+                result = OpenLayers.Geometry.distanceToSegment(geometry, seg);
+                if(result.distance < min) {
+                    min = result.distance;
+                    best = result;
+                    if(min === 0) {
+                        break;
+                    }
+                } else {
+                    // if distance increases and we cross y0 to the right of x0, no need to keep looking.
+                    if(seg.x2 > x && ((y > seg.y1 && y < seg.y2) || (y < seg.y1 && y > seg.y2))) {
+                        break;
+                    }
+                }
+            }
+            if(details) {
+                best = {
+                    distance: best.distance,
+                    x0: best.x, y0: best.y,
+                    x1: x, y1: y
+                };
+            } else {
+                best = best.distance;
+            }
+        } else if(geometry instanceof OpenLayers.Geometry.LineString) { 
+            var segs0 = this.getSortedSegments();
+            var segs1 = geometry.getSortedSegments();
+            var seg0, seg1, intersection, x0, y0;
+            var len1 = segs1.length;
+            var interOptions = {point: true};
+            outer: for(var i=0, len=segs0.length; i<len; ++i) {
+                seg0 = segs0[i];
+                x0 = seg0.x1;
+                y0 = seg0.y1;
+                for(var j=0; j<len1; ++j) {
+                    seg1 = segs1[j];
+                    intersection = OpenLayers.Geometry.segmentsIntersect(seg0, seg1, interOptions);
+                    if(intersection) {
+                        min = 0;
+                        best = {
+                            distance: 0,
+                            x0: intersection.x, y0: intersection.y,
+                            x1: intersection.x, y1: intersection.y
+                        };
+                        break outer;
+                    } else {
+                        result = OpenLayers.Geometry.distanceToSegment({x: x0, y: y0}, seg1);
+                        if(result.distance < min) {
+                            min = result.distance;
+                            best = {
+                                distance: min,
+                                x0: x0, y0: y0,
+                                x1: result.x, y1: result.y
+                            };
+                        }
+                    }
+                }
+            }
+            if(!details) {
+                best = best.distance;
+            }
+            if(min !== 0) {
+                // check the final vertex in this line's sorted segments
+                if(seg0) {
+                    result = geometry.distanceTo(
+                        new OpenLayers.Geometry.Point(seg0.x2, seg0.y2),
+                        options
+                    );
+                    var dist = details ? result.distance : result;
+                    if(dist < min) {
+                        if(details) {
+                            best = {
+                                distance: min,
+                                x0: result.x1, y0: result.y1,
+                                x1: result.x0, y1: result.y0
+                            };
+                        } else {
+                            best = dist;
+                        }
+                    }
+                }
+            }
+        } else {
+            best = geometry.distanceTo(this, options);
+            // swap since target comes from this line
+            if(details) {
+                best = {
+                    distance: best.distance,
+                    x0: best.x1, y0: best.y1,
+                    x1: best.x0, y1: best.y0
+                };
+            }
+        }
+        return best;
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.LineString"
+});
diff --git a/lib/OpenLayers/Geometry/LinearRing.js b/lib/OpenLayers/Geometry/LinearRing.js
new file mode 100644
index 0000000..3ac465a
--- /dev/null
+++ b/lib/OpenLayers/Geometry/LinearRing.js
@@ -0,0 +1,417 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry/LineString.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.LinearRing
+ * 
+ * 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. 
+ * 
+ * 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>
+ */
+OpenLayers.Geometry.LinearRing = OpenLayers.Class(
+  OpenLayers.Geometry.LineString, {
+
+    /**
+     * Property: componentTypes
+     * {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.LinearRing
+     * Linear rings are constructed with an array of points.  This array
+     *     can represent a closed or open ring.  If the ring is open (the last
+     *     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, 
+                                                                  arguments);
+    },
+
+    /**
+     * 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 
+     *     second argument.
+     *
+     * Parameter:
+     * point - {<OpenLayers.Geometry.Point>}
+     * index - {Integer} Index into the array to insert the component
+     * 
+     * Returns:
+     * {Boolean} Was the Point successfully added?
+     */
+    addComponent: function(point, index) {
+        var added = false;
+
+        //remove last point
+        var lastPoint = this.components.pop();
+
+        // 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, 
+                                                                    arguments);
+        }
+
+        //append copy of first point
+        var firstPoint = this.components[0];
+        OpenLayers.Geometry.Collection.prototype.addComponent.apply(this, 
+                                                                [firstPoint]);
+        
+        return added;
+    },
+    
+    /**
+     * APIMethod: removeComponent
+     * Removes a point from geometry components.
+     *
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point>}
+     */
+    removeComponent: function(point) {
+        if (this.components.length > 4) {
+
+            //remove last point
+            this.components.pop();
+            
+            //remove our point
+            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, 
+                                                                [firstPoint]);
+        }
+    },
+    
+    /**
+     * APIMethod: move
+     * Moves a geometry by the given displacement along positive x and y axes.
+     *     This modifies the position of the geometry and clears the cached
+     *     bounds.
+     *
+     * Parameters:
+     * x - {Float} Distance to move geometry in positive x direction. 
+     * y - {Float} Distance to move geometry in positive y direction.
+     */
+    move: function(x, y) {
+        for(var i = 0, len=this.components.length; i<len - 1; i++) {
+            this.components[i].move(x, y);
+        }
+    },
+
+    /**
+     * APIMethod: rotate
+     * Rotate a geometry around some origin
+     *
+     * Parameters:
+     * angle - {Float} Rotation angle in degrees (measured counterclockwise
+     *                 from the positive x-axis)
+     * origin - {<OpenLayers.Geometry.Point>} Center point for the rotation
+     */
+    rotate: function(angle, origin) {
+        for(var i=0, len=this.components.length; i<len - 1; ++i) {
+            this.components[i].rotate(angle, origin);
+        }
+    },
+
+    /**
+     * APIMethod: resize
+     * Resize a geometry relative to some origin.  Use this method to apply
+     *     a uniform scaling to a geometry.
+     *
+     * Parameters:
+     * scale - {Float} Factor by which to scale the geometry.  A scale of 2
+     *                 doubles the size of the geometry in each dimension
+     *                 (lines, for example, will be twice as long, and polygons
+     *                 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. 
+     */
+    resize: function(scale, origin, ratio) {
+        for(var i=0, len=this.components.length; i<len - 1; ++i) {
+            this.components[i].resize(scale, origin, ratio);
+        }
+        return this;
+    },
+    
+    /**
+     * APIMethod: transform
+     * Reproject the components geometry from source to dest.
+     *
+     * Parameters:
+     * source - {<OpenLayers.Projection>}
+     * dest - {<OpenLayers.Projection>}
+     * 
+     * Returns:
+     * {<OpenLayers.Geometry>} 
+     */
+    transform: function(source, dest) {
+        if (source && dest) {
+            for (var i=0, len=this.components.length; i<len - 1; i++) {
+                var component = this.components[i];
+                component.transform(source, dest);
+            }
+            this.bounds = null;
+        }
+        return this;
+    },
+    
+    /**
+     * APIMethod: getCentroid
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Point>} The centroid of the collection
+     */
+    getCentroid: function() {
+        if (this.components && (this.components.length > 2)) {
+            var sumX = 0.0;
+            var sumY = 0.0;
+            for (var i = 0; i < this.components.length - 1; i++) {
+                var b = this.components[i];
+                var c = this.components[i+1];
+                sumX += (b.x + c.x) * (b.x * c.y - c.x * b.y);
+                sumY += (b.y + c.y) * (b.x * c.y - c.x * b.y);
+            }
+            var area = -1 * this.getArea();
+            var x = sumX / (6 * area);
+            var y = sumY / (6 * area);
+            return new OpenLayers.Geometry.Point(x, y);
+        } else {
+            return null;
+        }
+    },
+
+    /**
+     * 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.
+     */
+    getArea: function() {
+        var area = 0.0;
+        if ( this.components && (this.components.length > 2)) {
+            var sum = 0.0;
+            for (var i=0, len=this.components.length; i<len - 1; i++) {
+                var b = this.components[i];
+                var c = this.components[i+1];
+                sum += (b.x + c.x) * (c.y - b.y);
+            }
+            area = - sum / 2.0;
+        }
+        return area;
+    },
+    
+    /**
+     * APIMethod: getGeodesicArea
+     * Calculate the approximate area of the polygon were it projected onto
+     *     the earth.  Note that this area will be positive if ring is oriented
+     *     clockwise, otherwise it will be negative.
+     *
+     * Parameters:
+     * 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
+     *     Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
+     *
+     * Returns:
+     * {float} The approximate signed geodesic area of the polygon in square
+     *     meters.
+     */
+    getGeodesicArea: function(projection) {
+        var ring = this;  // so we can work with a clone if needed
+        if(projection) {
+            var gg = new OpenLayers.Projection("EPSG:4326");
+            if(!gg.equals(projection)) {
+                ring = this.clone().transform(projection, gg);
+            }
+        }
+        var area = 0.0;
+        var len = ring.components && ring.components.length;
+        if(len > 2) {
+            var p1, p2;
+            for(var i=0; i<len-1; i++) {
+                p1 = ring.components[i];
+                p2 = ring.components[i+1];
+                area += OpenLayers.Util.rad(p2.x - p1.x) *
+                        (2 + Math.sin(OpenLayers.Util.rad(p1.y)) +
+                        Math.sin(OpenLayers.Util.rad(p2.y)));
+            }
+            area = area * 6378137.0 * 6378137.0 / 2.0;
+        }
+        return area;
+    },
+    
+    /**
+     * Method: containsPoint
+     * Test if a point is inside a linear ring.  For the case where a point
+     *     is coincident with a linear ring edge, returns 1.  Otherwise,
+     *     returns boolean.
+     *
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point>}
+     *
+     * Returns:
+     * {Boolean | Number} The point is inside the linear ring.  Returns 1 if
+     *     the point is coincident with an edge.  Returns boolean otherwise.
+     */
+    containsPoint: function(point) {
+        var approx = OpenLayers.Number.limitSigDigs;
+        var digs = 14;
+        var px = approx(point.x, digs);
+        var py = approx(point.y, digs);
+        function getX(y, x1, y1, x2, y2) {
+            return (((x1 - x2) * y) + ((x2 * y1) - (x1 * y2))) / (y1 - y2);
+        }
+        var numSeg = this.components.length - 1;
+        var start, end, x1, y1, x2, y2, cx, cy;
+        var crosses = 0;
+        for(var i=0; i<numSeg; ++i) {
+            start = this.components[i];
+            x1 = approx(start.x, digs);
+            y1 = approx(start.y, digs);
+            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;
+             *    2. an upward edge includes its starting endpoint, and
+             *    excludes its final endpoint;
+             *    3. a downward edge excludes its starting endpoint, and
+             *    includes its final endpoint;
+             *    4. horizontal edges are excluded; and
+             *    5. the edge-ray intersection point must be strictly right
+             *    of the point P.
+             */
+            if(y1 == y2) {
+                // horizontal edge
+                if(py == y1) {
+                    // point on horizontal line
+                    if(x1 <= x2 && (px >= x1 && px <= x2) || // right or vert
+                       x1 >= x2 && (px <= x1 && px >= x2)) { // left or vert
+                        // point on edge
+                        crosses = -1;
+                        break;
+                    }
+                }
+                // ignore other horizontal edges
+                continue;
+            }
+            cx = approx(getX(py, x1, y1, x2, y2), digs);
+            if(cx == px) {
+                // point on line
+                if(y1 < y2 && (py >= y1 && py <= y2) || // upward
+                   y1 > y2 && (py <= y1 && py >= y2)) { // downward
+                    // point on edge
+                    crosses = -1;
+                    break;
+                }
+            }
+            if(cx <= px) {
+                // no crossing to the right
+                continue;
+            }
+            if(x1 != x2 && (cx < Math.min(x1, x2) || cx > Math.max(x1, x2))) {
+                // no crossing
+                continue;
+            }
+            if(y1 < y2 && (py >= y1 && py < y2) || // upward
+               y1 > y2 && (py < y1 && py >= y2)) { // downward
+                ++crosses;
+            }
+        }
+        var contained = (crosses == -1) ?
+            // on edge
+            1 :
+            // even (out) or odd (in)
+            !!(crosses & 1);
+
+        return contained;
+    },
+
+    /**
+     * APIMethod: intersects
+     * Determine if the input geometry intersects this one.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} Any type of geometry.
+     *
+     * Returns:
+     * {Boolean} The input geometry intersects this one.
+     */
+    intersects: function(geometry) {
+        var intersect = false;
+        if(geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+            intersect = this.containsPoint(geometry);
+        } else if(geometry.CLASS_NAME == "OpenLayers.Geometry.LineString") {
+            intersect = geometry.intersects(this);
+        } else if(geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing") {
+            intersect = OpenLayers.Geometry.LineString.prototype.intersects.apply(
+                this, [geometry]
+            );
+        } else {
+            // check for component intersections
+            for(var i=0, len=geometry.components.length; i<len; ++ i) {
+                intersect = geometry.components[i].intersects(this);
+                if(intersect) {
+                    break;
+                }
+            }
+        }
+        return intersect;
+    },
+
+    /**
+     * APIMethod: getVertices
+     * Return a list of all points in this geometry.
+     *
+     * Parameters:
+     * nodes - {Boolean} For lines, only return vertices that are
+     *     endpoints.  If false, for lines, only vertices that are not
+     *     endpoints will be returned.  If not provided, all vertices will
+     *     be returned.
+     *
+     * Returns:
+     * {Array} A list of all vertices in the geometry.
+     */
+    getVertices: function(nodes) {
+        return (nodes === true) ? [] : this.components.slice(0, this.components.length-1);
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.LinearRing"
+});
diff --git a/lib/OpenLayers/Geometry/MultiLineString.js b/lib/OpenLayers/Geometry/MultiLineString.js
new file mode 100644
index 0000000..670121a
--- /dev/null
+++ b/lib/OpenLayers/Geometry/MultiLineString.js
@@ -0,0 +1,262 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry/Collection.js
+ * @requires OpenLayers/Geometry/LineString.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.MultiLineString
+ * A MultiLineString is a geometry with multiple <OpenLayers.Geometry.LineString>
+ * components.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Geometry.Collection>
+ *  - <OpenLayers.Geometry> 
+ */
+OpenLayers.Geometry.MultiLineString = OpenLayers.Class(
+  OpenLayers.Geometry.Collection, {
+
+    /**
+     * Property: componentTypes
+     * {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.LineString"],
+
+    /**
+     * Constructor: OpenLayers.Geometry.MultiLineString
+     * Constructor for a MultiLineString Geometry.
+     *
+     * Parameters: 
+     * components - {Array(<OpenLayers.Geometry.LineString>)} 
+     *
+     */
+    initialize: function(components) {
+        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
+     *     how the split is conducted.
+     *
+     * Valid options:
+     * mutual - {Boolean} Split the source geometry in addition to the target
+     *     geometry.  Default is false.
+     * edge - {Boolean} Allow splitting when only edges intersect.  Default is
+     *     true.  If false, a vertex on the source must be within the tolerance
+     *     distance of the intersection to be considered a split.
+     * 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
+     *     source and target geometry will remain unmodified.  If no split
+     *     results, null will be returned.  If mutual is true and a split
+     *     results, return will be an array of two arrays - the first will be
+     *     all geometries that result from splitting the source geometry and
+     *     the second will be all geometries that result from splitting the
+     *     target geometry.
+     */
+    split: function(geometry, options) {
+        var results = null;
+        var mutual = options && options.mutual;
+        var splits, sourceLine, sourceLines, sourceSplit, targetSplit;
+        var sourceParts = [];
+        var targetParts = [geometry];
+        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) { 
+                splits = sourceLine.split(targetParts[j], options);
+                if(splits) {
+                    if(mutual) {
+                        sourceLines = splits[0];
+                        for(var k=0, klen=sourceLines.length; k<klen; ++k) {
+                            if(k===0 && sourceParts.length) {
+                                sourceParts[sourceParts.length-1].addComponent(
+                                    sourceLines[k]
+                                );
+                            } else {
+                                sourceParts.push(
+                                    new OpenLayers.Geometry.MultiLineString([
+                                        sourceLines[k]
+                                    ])
+                                );
+                            }
+                        }
+                        sourceSplit = true;
+                        splits = splits[1];
+                    }
+                    if(splits.length) {
+                        // splice in new target parts
+                        splits.unshift(j, 1);
+                        Array.prototype.splice.apply(targetParts, splits);
+                        break;
+                    }
+                }
+            }
+            if(!sourceSplit) {
+                // source line was not hit
+                if(sourceParts.length) {
+                    // add line to existing multi
+                    sourceParts[sourceParts.length-1].addComponent(
+                        sourceLine.clone()
+                    );
+                } else {
+                    // create a fresh multi
+                    sourceParts = [
+                        new OpenLayers.Geometry.MultiLineString(
+                            sourceLine.clone()
+                        )
+                    ];
+                }
+            }
+        }
+        if(sourceParts && sourceParts.length > 1) {
+            sourceSplit = true;
+        } else {
+            sourceParts = [];
+        }
+        if(targetParts && targetParts.length > 1) {
+            targetSplit = true;
+        } else {
+            targetParts = [];
+        }
+        if(sourceSplit || targetSplit) {
+            if(mutual) {
+                results = [sourceParts, targetParts];
+            } else {
+                results = targetParts;
+            }
+        }
+        return results;
+    },
+    
+    /**
+     * Method: splitWith
+     * Split this geometry (the target) with the given geometry (the source).
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} A geometry used to split this
+     *     geometry (the source).
+     * options - {Object} Properties of this object will be used to determine
+     *     how the split is conducted.
+     *
+     * Valid options:
+     * mutual - {Boolean} Split the source geometry in addition to the target
+     *     geometry.  Default is false.
+     * edge - {Boolean} Allow splitting when only edges intersect.  Default is
+     *     true.  If false, a vertex on the source must be within the tolerance
+     *     distance of the intersection to be considered a split.
+     * 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
+     *     source and target geometry will remain unmodified.  If no split
+     *     results, null will be returned.  If mutual is true and a split
+     *     results, return will be an array of two arrays - the first will be
+     *     all geometries that result from splitting the source geometry and
+     *     the second will be all geometries that result from splitting the
+     *     target geometry.
+     */
+    splitWith: function(geometry, options) {
+        var results = null;
+        var mutual = options && options.mutual;
+        var splits, targetLine, sourceLines, sourceSplit, targetSplit, sourceParts, targetParts;
+        if(geometry instanceof OpenLayers.Geometry.LineString) {
+            targetParts = [];
+            sourceParts = [geometry];
+            for(var i=0, len=this.components.length; i<len; ++i) {
+                targetSplit = false;
+                targetLine = this.components[i];
+                for(var j=0; j<sourceParts.length; ++j) {
+                    splits = sourceParts[j].split(targetLine, options);
+                    if(splits) {
+                        if(mutual) {
+                            sourceLines = splits[0];
+                            if(sourceLines.length) {
+                                // splice in new source parts
+                                sourceLines.unshift(j, 1);
+                                Array.prototype.splice.apply(sourceParts, sourceLines);
+                                j += sourceLines.length - 2;
+                            }
+                            splits = splits[1];
+                            if(splits.length === 0) {
+                                splits = [targetLine.clone()];
+                            }
+                        }
+                        for(var k=0, klen=splits.length; k<klen; ++k) {
+                            if(k===0 && targetParts.length) {
+                                targetParts[targetParts.length-1].addComponent(
+                                    splits[k]
+                                );
+                            } else {
+                                targetParts.push(
+                                    new OpenLayers.Geometry.MultiLineString([
+                                        splits[k]
+                                    ])
+                                );
+                            }
+                        }
+                        targetSplit = true;                    
+                    }
+                }
+                if(!targetSplit) {
+                    // target component was not hit
+                    if(targetParts.length) {
+                        // add it to any existing multi-line
+                        targetParts[targetParts.length-1].addComponent(
+                            targetLine.clone()
+                        );
+                    } else {
+                        // or start with a fresh multi-line
+                        targetParts = [
+                            new OpenLayers.Geometry.MultiLineString([
+                                targetLine.clone()
+                            ])
+                        ];
+                    }
+                    
+                }
+            }
+        } else {
+            results = geometry.split(this);
+        }
+        if(sourceParts && sourceParts.length > 1) {
+            sourceSplit = true;
+        } else {
+            sourceParts = [];
+        }
+        if(targetParts && targetParts.length > 1) {
+            targetSplit = true;
+        } else {
+            targetParts = [];
+        }
+        if(sourceSplit || targetSplit) {
+            if(mutual) {
+                results = [sourceParts, targetParts];
+            } else {
+                results = targetParts;
+            }
+        }
+        return results;
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.MultiLineString"
+});
diff --git a/lib/OpenLayers/Geometry/MultiPoint.js b/lib/OpenLayers/Geometry/MultiPoint.js
new file mode 100644
index 0000000..829bfdb
--- /dev/null
+++ b/lib/OpenLayers/Geometry/MultiPoint.js
@@ -0,0 +1,70 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry/Collection.js
+ * @requires OpenLayers/Geometry/Point.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.MultiPoint
+ * MultiPoint is a collection of Points.  Create a new instance with the
+ * <OpenLayers.Geometry.MultiPoint> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Geometry.Collection>
+ *  - <OpenLayers.Geometry>
+ */
+OpenLayers.Geometry.MultiPoint = OpenLayers.Class(
+  OpenLayers.Geometry.Collection, {
+
+    /**
+     * Property: componentTypes
+     * {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.MultiPoint
+     * Create a new MultiPoint Geometry
+     *
+     * Parameters:
+     * components - {Array(<OpenLayers.Geometry.Point>)} 
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.MultiPoint>}
+     */
+    initialize: function(components) {
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+                                                                  arguments);
+    },
+
+    /**
+     * APIMethod: addPoint
+     * Wrapper for <OpenLayers.Geometry.Collection.addComponent>
+     *
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point>} Point to be added
+     * index - {Integer} Optional index
+     */
+    addPoint: function(point, index) {
+        this.addComponent(point, index);
+    },
+    
+    /**
+     * APIMethod: removePoint
+     * Wrapper for <OpenLayers.Geometry.Collection.removeComponent>
+     *
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point>} Point to be removed
+     */
+    removePoint: function(point){
+        this.removeComponent(point);
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.MultiPoint"
+});
diff --git a/lib/OpenLayers/Geometry/MultiPolygon.js b/lib/OpenLayers/Geometry/MultiPolygon.js
new file mode 100644
index 0000000..4c83c6a
--- /dev/null
+++ b/lib/OpenLayers/Geometry/MultiPolygon.js
@@ -0,0 +1,46 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry/Collection.js
+ * @requires OpenLayers/Geometry/Polygon.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.MultiPolygon
+ * 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>
+ */
+OpenLayers.Geometry.MultiPolygon = OpenLayers.Class(
+  OpenLayers.Geometry.Collection, {
+
+    /**
+     * Property: componentTypes
+     * {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.Polygon"],
+
+    /**
+     * Constructor: OpenLayers.Geometry.MultiPolygon
+     * Create a new MultiPolygon geometry
+     *
+     * Parameters:
+     * components - {Array(<OpenLayers.Geometry.Polygon>)} An array of polygons
+     *              used to generate the MultiPolygon
+     *
+     */
+    initialize: function(components) {
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+                                                                  arguments);
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.MultiPolygon"
+});
diff --git a/lib/OpenLayers/Geometry/Point.js b/lib/OpenLayers/Geometry/Point.js
new file mode 100644
index 0000000..869a638
--- /dev/null
+++ b/lib/OpenLayers/Geometry/Point.js
@@ -0,0 +1,283 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.Point
+ * Point geometry class. 
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Geometry> 
+ */
+OpenLayers.Geometry.Point = OpenLayers.Class(OpenLayers.Geometry, {
+
+    /** 
+     * APIProperty: x 
+     * {float} 
+     */
+    x: null,
+
+    /** 
+     * APIProperty: y 
+     * {float} 
+     */
+    y: null,
+
+    /**
+     * Constructor: OpenLayers.Geometry.Point
+     * Construct a point geometry.
+     *
+     * Parameters:
+     * 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
+     */
+    clone: function(obj) {
+        if (obj == null) {
+            obj = new OpenLayers.Geometry.Point(this.x, this.y);
+        }
+
+        // catch any randomly tagged-on properties
+        OpenLayers.Util.applyDefaults(obj, this);
+
+        return obj;
+    },
+
+    /** 
+     * Method: calculateBounds
+     * Create a new Bounds based on the lon/lat
+     */
+    calculateBounds: function () {
+        this.bounds = new OpenLayers.Bounds(this.x, this.y,
+                                            this.x, this.y);
+    },
+
+    /**
+     * APIMethod: distanceTo
+     * Calculate the closest distance between two geometries (on the x-y plane).
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} The target geometry.
+     * options - {Object} Optional properties for configuring the distance
+     *     calculation.
+     *
+     * Valid options:
+     * details - {Boolean} Return details from the distance calculation.
+     *     Default is false.
+     * edge - {Boolean} Calculate the distance from this geometry to the
+     *     nearest edge of the target geometry.  Default is true.  If true,
+     *     calling distanceTo from a geometry that is wholly contained within
+     *     the target will result in a non-zero distance.  If false, whenever
+     *     geometries intersect, calling distanceTo will return 0.  If false,
+     *     details cannot be returned.
+     *
+     * Returns:
+     * {Number | Object} The distance between this geometry and the target.
+     *     If details is true, the return will be an object with distance,
+     *     x0, y0, x1, and x2 properties.  The x0 and y0 properties represent
+     *     the coordinates of the closest point on this geometry. The x1 and y1
+     *     properties represent the coordinates of the closest point on the
+     *     target geometry.
+     */
+    distanceTo: function(geometry, options) {
+        var edge = !(options && options.edge === false);
+        var details = edge && options && options.details;
+        var distance, x0, y0, x1, y1, result;
+        if(geometry instanceof OpenLayers.Geometry.Point) {
+            x0 = this.x;
+            y0 = this.y;
+            x1 = geometry.x;
+            y1 = geometry.y;
+            distance = Math.sqrt(Math.pow(x0 - x1, 2) + Math.pow(y0 - y1, 2));
+            result = !details ?
+                distance : {x0: x0, y0: y0, x1: x1, y1: y1, distance: distance};
+        } else {
+            result = geometry.distanceTo(this, options);
+            if(details) {
+                // switch coord order since this geom is target
+                result = {
+                    x0: result.x1, y0: result.y1,
+                    x1: result.x0, y1: result.y0,
+                    distance: result.distance
+                };
+            }
+        }
+        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. 
+     *
+     * Returns:
+     * {Boolean} The supplied geometry is equivalent to this geometry.
+     */
+    equals: function(geom) {
+        var equals = false;
+        if (geom != null) {
+            equals = ((this.x == geom.x && this.y == geom.y) ||
+                      (isNaN(this.x) && isNaN(this.y) && isNaN(geom.x) && isNaN(geom.y)));
+        }
+        return equals;
+    },
+    
+    /**
+     * Method: toShortString
+     *
+     * Returns:
+     * {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.
+     *     This modifies the position of the geometry and clears the cached
+     *     bounds.
+     *
+     * Parameters:
+     * x - {Float} Distance to move geometry in positive x direction. 
+     * y - {Float} Distance to move geometry in positive y direction.
+     */
+    move: function(x, y) {
+        this.x = this.x + x;
+        this.y = this.y + y;
+        this.clearBounds();
+    },
+
+    /**
+     * APIMethod: rotate
+     * Rotate a point around another.
+     *
+     * Parameters:
+     * angle - {Float} Rotation angle in degrees (measured counterclockwise
+     *                 from the positive x-axis)
+     * origin - {<OpenLayers.Geometry.Point>} Center point for the rotation
+     */
+    rotate: function(angle, origin) {
+        angle *= Math.PI / 180;
+        var radius = this.distanceTo(origin);
+        var theta = angle + Math.atan2(this.y - origin.y, this.x - origin.x);
+        this.x = origin.x + (radius * Math.cos(theta));
+        this.y = origin.y + (radius * Math.sin(theta));
+        this.clearBounds();
+    },
+    
+    /**
+     * APIMethod: getCentroid
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Point>} The centroid of the collection
+     */
+    getCentroid: function() {
+        return new OpenLayers.Geometry.Point(this.x, this.y);
+    },
+
+    /**
+     * APIMethod: resize
+     * Resize a point relative to some origin.  For points, this has the effect
+     *     of scaling a vector (from the origin to the point).  This method is
+     *     more useful on geometry collection subclasses.
+     *
+     * Parameters:
+     * scale - {Float} Ratio of the new distance from the origin to the old
+     *                 distance from the origin.  A scale of 2 doubles the
+     *                 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. 
+     */
+    resize: function(scale, origin, ratio) {
+        ratio = (ratio == undefined) ? 1 : ratio;
+        this.x = origin.x + (scale * ratio * (this.x - origin.x));
+        this.y = origin.y + (scale * (this.y - origin.y));
+        this.clearBounds();
+        return this;
+    },
+    
+    /**
+     * APIMethod: intersects
+     * Determine if the input geometry intersects this one.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} Any type of geometry.
+     *
+     * Returns:
+     * {Boolean} The input geometry intersects this one.
+     */
+    intersects: function(geometry) {
+        var intersect = false;
+        if(geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+            intersect = this.equals(geometry);
+        } else {
+            intersect = geometry.intersects(this);
+        }
+        return intersect;
+    },
+    
+    /**
+     * APIMethod: transform
+     * Translate the x,y properties of the point from source to dest.
+     * 
+     * Parameters:
+     * source - {<OpenLayers.Projection>} 
+     * dest - {<OpenLayers.Projection>}
+     * 
+     * Returns:
+     * {<OpenLayers.Geometry>} 
+     */
+    transform: function(source, dest) {
+        if ((source && dest)) {
+            OpenLayers.Projection.transform(
+                this, source, dest); 
+            this.bounds = null;
+        }       
+        return this;
+    },
+
+    /**
+     * APIMethod: getVertices
+     * Return a list of all points in this geometry.
+     *
+     * Parameters:
+     * nodes - {Boolean} For lines, only return vertices that are
+     *     endpoints.  If false, for lines, only vertices that are not
+     *     endpoints will be returned.  If not provided, all vertices will
+     *     be returned.
+     *
+     * Returns:
+     * {Array} A list of all vertices in the geometry.
+     */
+    getVertices: function(nodes) {
+        return [this];
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.Point"
+});
diff --git a/lib/OpenLayers/Geometry/Polygon.js b/lib/OpenLayers/Geometry/Polygon.js
new file mode 100644
index 0000000..e7862bb
--- /dev/null
+++ b/lib/OpenLayers/Geometry/Polygon.js
@@ -0,0 +1,259 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry/Collection.js
+ * @requires OpenLayers/Geometry/LinearRing.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.Polygon 
+ * Polygon is a collection of Geometry.LinearRings. 
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Geometry.Collection> 
+ *  - <OpenLayers.Geometry> 
+ */
+OpenLayers.Geometry.Polygon = OpenLayers.Class(
+  OpenLayers.Geometry.Collection, {
+
+    /**
+     * Property: componentTypes
+     * {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.LinearRing"],
+
+    /**
+     * Constructor: OpenLayers.Geometry.Polygon
+     * 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>)} 
+     */
+    initialize: function(components) {
+        OpenLayers.Geometry.Collection.prototype.initialize.apply(this, 
+                                                                  arguments);
+    },
+    
+    /** 
+     * APIMethod: getArea
+     * Calculated by subtracting the areas of the internal holes from the 
+     *   area of the outer hole.
+     * 
+     * Returns:
+     * {float} The area of the geometry
+     */
+    getArea: function() {
+        var area = 0.0;
+        if ( this.components && (this.components.length > 0)) {
+            area += Math.abs(this.components[0].getArea());
+            for (var i=1, len=this.components.length; i<len; i++) {
+                area -= Math.abs(this.components[i].getArea());
+            }
+        }
+        return area;
+    },
+
+    /** 
+     * APIMethod: getGeodesicArea
+     * Calculate the approximate area of the polygon were it projected onto
+     *     the earth.
+     *
+     * Parameters:
+     * 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
+     *     Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409
+     *
+     * Returns:
+     * {float} The approximate geodesic area of the polygon in square meters.
+     */
+    getGeodesicArea: function(projection) {
+        var area = 0.0;
+        if(this.components && (this.components.length > 0)) {
+            area += Math.abs(this.components[0].getGeodesicArea(projection));
+            for(var i=1, len=this.components.length; i<len; i++) {
+                area -= Math.abs(this.components[i].getGeodesicArea(projection));
+            }
+        }
+        return area;
+    },
+
+    /**
+     * Method: containsPoint
+     * Test if a point is inside a polygon.  Points on a polygon edge are
+     *     considered inside.
+     *
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point>}
+     *
+     * Returns:
+     * {Boolean | Number} The point is inside the polygon.  Returns 1 if the
+     *     point is on an edge.  Returns boolean otherwise.
+     */
+    containsPoint: function(point) {
+        var numRings = this.components.length;
+        var contained = false;
+        if(numRings > 0) {
+            // check exterior ring - 1 means on edge, boolean otherwise
+            contained = this.components[0].containsPoint(point);
+            if(contained !== 1) {
+                if(contained && numRings > 1) {
+                    // check interior rings
+                    var hole;
+                    for(var i=1; i<numRings; ++i) {
+                        hole = this.components[i].containsPoint(point);
+                        if(hole) {
+                            if(hole === 1) {
+                                // on edge
+                                contained = 1;
+                            } else {
+                                // in hole
+                                contained = false;
+                            }                            
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        return contained;
+    },
+
+    /**
+     * APIMethod: intersects
+     * Determine if the input geometry intersects this one.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} Any type of geometry.
+     *
+     * Returns:
+     * {Boolean} The input geometry intersects this one.
+     */
+    intersects: function(geometry) {
+        var intersect = false;
+        var i, len;
+        if(geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
+            intersect = this.containsPoint(geometry);
+        } else if(geometry.CLASS_NAME == "OpenLayers.Geometry.LineString" ||
+                  geometry.CLASS_NAME == "OpenLayers.Geometry.LinearRing") {
+            // check if rings/linestrings intersect
+            for(i=0, len=this.components.length; i<len; ++i) {
+                intersect = geometry.intersects(this.components[i]);
+                if(intersect) {
+                    break;
+                }
+            }
+            if(!intersect) {
+                // check if this poly contains points of the ring/linestring
+                for(i=0, len=geometry.components.length; i<len; ++i) {
+                    intersect = this.containsPoint(geometry.components[i]);
+                    if(intersect) {
+                        break;
+                    }
+                }
+            }
+        } else {
+            for(i=0, len=geometry.components.length; i<len; ++ i) {
+                intersect = this.intersects(geometry.components[i]);
+                if(intersect) {
+                    break;
+                }
+            }
+        }
+        // check case where this poly is wholly contained by another
+        if(!intersect && geometry.CLASS_NAME == "OpenLayers.Geometry.Polygon") {
+            // exterior ring points will be contained in the other geometry
+            var ring = this.components[0];
+            for(i=0, len=ring.components.length; i<len; ++i) {
+                intersect = geometry.containsPoint(ring.components[i]);
+                if(intersect) {
+                    break;
+                }
+            }
+        }
+        return intersect;
+    },
+
+    /**
+     * APIMethod: distanceTo
+     * Calculate the closest distance between two geometries (on the x-y plane).
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} The target geometry.
+     * options - {Object} Optional properties for configuring the distance
+     *     calculation.
+     *
+     * Valid options:
+     * details - {Boolean} Return details from the distance calculation.
+     *     Default is false.
+     * edge - {Boolean} Calculate the distance from this geometry to the
+     *     nearest edge of the target geometry.  Default is true.  If true,
+     *     calling distanceTo from a geometry that is wholly contained within
+     *     the target will result in a non-zero distance.  If false, whenever
+     *     geometries intersect, calling distanceTo will return 0.  If false,
+     *     details cannot be returned.
+     *
+     * Returns:
+     * {Number | Object} The distance between this geometry and the target.
+     *     If details is true, the return will be an object with distance,
+     *     x0, y0, x1, and y1 properties.  The x0 and y0 properties represent
+     *     the coordinates of the closest point on this geometry. The x1 and y1
+     *     properties represent the coordinates of the closest point on the
+     *     target geometry.
+     */
+    distanceTo: function(geometry, options) {
+        var edge = !(options && options.edge === false);
+        var result;
+        // this is the case where we might not be looking for distance to edge
+        if(!edge && this.intersects(geometry)) {
+            result = 0;
+        } else {
+            result = OpenLayers.Geometry.Collection.prototype.distanceTo.apply(
+                this, [geometry, options]
+            );
+        }
+        return result;
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.Polygon"
+});
+
+/**
+ * APIMethod: createRegularPolygon
+ * Create a regular polygon around a radius. Useful for creating circles 
+ * and the like.
+ *
+ * Parameters:
+ * origin - {<OpenLayers.Geometry.Point>} center of polygon.
+ * radius - {Float} distance to vertex, in map units.
+ * 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) {  
+    var angle = Math.PI * ((1/sides) - (1/2));
+    if(rotation) {
+        angle += (rotation / 180) * Math.PI;
+    }
+    var rotatedAngle, x, y;
+    var points = [];
+    for(var i=0; i<sides; ++i) {
+        rotatedAngle = angle + (i * 2 * Math.PI / sides);
+        x = origin.x + (radius * Math.cos(rotatedAngle));
+        y = origin.y + (radius * Math.sin(rotatedAngle));
+        points.push(new OpenLayers.Geometry.Point(x, y));
+    }
+    var ring = new OpenLayers.Geometry.LinearRing(points);
+    return new OpenLayers.Geometry.Polygon([ring]);
+};
diff --git a/lib/OpenLayers/Geometry/Rectangle.js b/lib/OpenLayers/Geometry/Rectangle.js
new file mode 100644
index 0000000..1a59a7e
--- /dev/null
+++ b/lib/OpenLayers/Geometry/Rectangle.js
@@ -0,0 +1,99 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry.js
+ */
+
+/**
+ * Class: OpenLayers.Geometry.Rectangle
+ * This class is *not supported*, and probably isn't what you're looking for.
+ *     Instead, most users probably want something like:
+ *     (code)
+ *     var poly = new OpenLayers.Bounds(0,0,10,10).toGeometry();
+ *     (end)
+ *     This will create a rectangular Polygon geometry. 
+ * 
+ * Inherits:
+ *  - <OpenLayers.Geometry>
+ */
+
+OpenLayers.Geometry.Rectangle = OpenLayers.Class(OpenLayers.Geometry, {
+
+    /** 
+     * Property: x
+     * {Float}
+     */
+    x: null,
+
+    /** 
+     * Property: y
+     * {Float}
+     */
+    y: null,
+
+    /** 
+     * Property: width
+     * {Float}
+     */
+    width: null,
+
+    /** 
+     * Property: height
+     * {Float}
+     */
+    height: null,
+
+    /**
+     * Constructor: OpenLayers.Geometry.Rectangle
+     * 
+     * Parameters:
+     * points - {Array(<OpenLayers.Geometry.Point>}
+     */
+    initialize: function(x, y, width, height) {
+        OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
+        
+        this.x = x;
+        this.y = y;
+
+        this.width = width;
+        this.height = height;
+    },
+    
+    /**
+     * Method: calculateBounds
+     * Recalculate the bounds for the geometry.
+     */
+    calculateBounds: function() {
+        this.bounds = new OpenLayers.Bounds(this.x, this.y,
+                                            this.x + this.width, 
+                                            this.y + this.height);
+    },
+    
+    
+    /**
+     * APIMethod: getLength
+     * 
+     * Returns:
+     * {Float} The length of the geometry
+     */
+    getLength: function() {
+        var length = (2 * this.width) + (2 * this.height);
+        return length;
+    },
+
+    /**
+     * APIMethod: getArea
+     * 
+     * Returns:
+     * {Float} The area of the geometry
+     */
+    getArea: function() {
+        var area = this.width * this.height;
+        return area;
+    },    
+
+    CLASS_NAME: "OpenLayers.Geometry.Rectangle"
+});
diff --git a/lib/OpenLayers/Geometry/Surface.js b/lib/OpenLayers/Geometry/Surface.js
new file mode 100644
index 0000000..1662171
--- /dev/null
+++ b/lib/OpenLayers/Geometry/Surface.js
@@ -0,0 +1,17 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Geometry.js
+ */
+
+OpenLayers.Geometry.Surface = OpenLayers.Class(OpenLayers.Geometry, {
+
+    initialize: function() {
+        OpenLayers.Geometry.prototype.initialize.apply(this, arguments);
+    },
+
+    CLASS_NAME: "OpenLayers.Geometry.Surface"
+});
diff --git a/lib/OpenLayers/Handler.js b/lib/OpenLayers/Handler.js
new file mode 100644
index 0000000..dddc818
--- /dev/null
+++ b/lib/OpenLayers/Handler.js
@@ -0,0 +1,287 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Events.js
+ */
+
+/**
+ * Class: OpenLayers.Handler
+ * Base class to construct a higher-level handler for event sequences.  All
+ *     handlers have activate and deactivate methods.  In addition, they have
+ *     methods named like browser events.  When a handler is activated, any
+ *     additional methods named like a browser event is registered as a
+ *     listener for the corresponding event.  When a handler is deactivated,
+ *     those same methods are unregistered as event listeners.
+ *
+ * Handlers also typically have a callbacks object with keys named like
+ *     the abstracted events or event sequences that they are in charge of
+ *     handling.  The controls that wrap handlers define the methods that
+ *     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
+ *     return the application in the same state that they found it.
+ */
+OpenLayers.Handler = OpenLayers.Class({
+
+    /**
+     * Property: id
+     * {String}
+     */
+    id: null,
+        
+    /**
+     * APIProperty: control
+     * {<OpenLayers.Control>}. The control that initialized this handler.  The
+     *     control is assumed to have a valid map property - that map is used
+     *     in the handler's own setMap method.
+     */
+    control: null,
+
+    /**
+     * Property: map
+     * {<OpenLayers.Map>}
+     */
+    map: null,
+
+    /**
+     * APIProperty: keyMask
+     * {Integer} Use bitwise operators and one or more of the OpenLayers.Handler
+     *     constants to construct a keyMask.  The keyMask is used by
+     *     <checkModifiers>.  If the keyMask matches the combination of keys
+     *     down on an event, checkModifiers returns true.
+     *
+     * Example:
+     * (code)
+     *     // handler only responds if the Shift key is down
+     *     handler.keyMask = OpenLayers.Handler.MOD_SHIFT;
+     *
+     *     // handler only responds if Ctrl-Shift is down
+     *     handler.keyMask = OpenLayers.Handler.MOD_SHIFT |
+     *                       OpenLayers.Handler.MOD_CTRL;
+     * (end)
+     */
+    keyMask: null,
+
+    /**
+     * Property: active
+     * {Boolean}
+     */
+    active: false,
+    
+    /**
+     * Property: evt
+     * {Event} This property references the last event handled by the handler.
+     *     Note that this property is not part of the stable API.  Use of the
+     *     evt property should be restricted to controls in the library
+     *     or other applications that are willing to update with changes to
+     *     the OpenLayers code.
+     */
+    evt: null,
+
+    /**
+     * Constructor: OpenLayers.Handler
+     * Construct a handler.
+     *
+     * Parameters:
+     * control - {<OpenLayers.Control>} The control that initialized this
+     *     handler.  The control is assumed to have a valid map property; that
+     *     map is used in the handler's own setMap method.  If a map property
+     *     is present in the options argument it will be used instead.
+     * callbacks - {Object} An object whose properties correspond to abstracted
+     *     events or sequences of browser events.  The values for these
+     *     properties are functions defined by the control that get called by
+     *     the handler.
+     * options - {Object} An optional object whose properties will be set on
+     *     the handler.
+     */
+    initialize: function(control, callbacks, options) {
+        OpenLayers.Util.extend(this, options);
+        this.control = control;
+        this.callbacks = callbacks;
+
+        var map = this.map || control.map;
+        if (map) {
+            this.setMap(map); 
+        }
+        
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
+    },
+    
+    /**
+     * Method: setMap
+     */
+    setMap: function (map) {
+        this.map = map;
+    },
+
+    /**
+     * Method: checkModifiers
+     * Check the keyMask on the handler.  If no <keyMask> is set, this always
+     *     returns true.  If a <keyMask> is set and it matches the combination
+     *     of keys down on an event, this returns true.
+     *
+     * Returns:
+     * {Boolean} The keyMask matches the keys down on an event.
+     */
+    checkModifiers: function (evt) {
+        if(this.keyMask == null) {
+            return true;
+        }
+        /* calculate the keyboard modifier mask for this event */
+        var keyModifiers =
+            (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);
+    },
+
+    /**
+     * APIMethod: activate
+     * Turn on the handler.  Returns false if the handler was already active.
+     * 
+     * Returns: 
+     * {Boolean} The handler was activated.
+     */
+    activate: function() {
+        if(this.active) {
+            return false;
+        }
+        // register for event handlers defined on this class.
+        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.active = true;
+        return true;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Turn off the handler.  Returns false if the handler was already inactive.
+     * 
+     * Returns:
+     * {Boolean} The handler was deactivated.
+     */
+    deactivate: function() {
+        if(!this.active) {
+            return false;
+        }
+        // unregister event handlers defined on this class.
+        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.active = false;
+        return true;
+    },
+
+    /**
+    * Method: callback
+    * Trigger the control's named callback with the given arguments
+    *
+    * 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 
+    *     the callback (defined by the control).
+    */
+    callback: function (name, args) {
+        if (name && this.callbacks[name]) {
+            this.callbacks[name].apply(this.control, args);
+        }
+    },
+
+    /**
+    * Method: register
+    * register an event on the map
+    */
+    register: function (name, method) {
+        // TODO: deal with registerPriority in 3.0
+        this.map.events.registerPriority(name, this, method);
+        this.map.events.registerPriority(name, this, this.setEvent);
+    },
+
+    /**
+    * Method: unregister
+    * unregister an event from the map
+    */
+    unregister: function (name, 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
+     *     property.  This property can be accessed by controls if needed
+     *     to get more information about the event that the handler is
+     *     processing.
+     *
+     * This allows modifier keys on the event to be checked (alt, shift,
+     *     and ctrl cannot be checked with the keyboard handler).  For a
+     *     control to determine which modifier keys are associated with the
+     *     event that a handler is currently processing, it should access
+     *     (code)handler.evt.altKey || handler.evt.shiftKey ||
+     *     handler.evt.ctrlKey(end).
+     *
+     * Parameters:
+     * evt - {Event} The browser event.
+     */
+    setEvent: function(evt) {
+        this.evt = evt;
+        return true;
+    },
+
+    /**
+     * Method: destroy
+     * Deconstruct the handler.
+     */
+    destroy: function () {
+        // unregister event listeners
+        this.deactivate();
+        // eliminate circular references
+        this.control = this.map = null;        
+    },
+
+    CLASS_NAME: "OpenLayers.Handler"
+});
+
+/**
+ * Constant: OpenLayers.Handler.MOD_NONE
+ * If set as the <keyMask>, <checkModifiers> returns false if any key is down.
+ */
+OpenLayers.Handler.MOD_NONE  = 0;
+
+/**
+ * Constant: OpenLayers.Handler.MOD_SHIFT
+ * If set as the <keyMask>, <checkModifiers> returns false if Shift is down.
+ */
+OpenLayers.Handler.MOD_SHIFT = 1;
+
+/**
+ * Constant: OpenLayers.Handler.MOD_CTRL
+ * If set as the <keyMask>, <checkModifiers> returns false if Ctrl is down.
+ */
+OpenLayers.Handler.MOD_CTRL  = 2;
+
+/**
+ * Constant: OpenLayers.Handler.MOD_ALT
+ * If set as the <keyMask>, <checkModifiers> returns false if Alt is down.
+ */
+OpenLayers.Handler.MOD_ALT   = 4;
+
+
diff --git a/lib/OpenLayers/Handler/Box.js b/lib/OpenLayers/Handler/Box.js
new file mode 100644
index 0000000..1ff62d7
--- /dev/null
+++ b/lib/OpenLayers/Handler/Box.js
@@ -0,0 +1,221 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Handler.js
+ * @requires OpenLayers/Handler/Drag.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.Box
+ * 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.Box = OpenLayers.Class(OpenLayers.Handler, {
+
+    /** 
+     * Property: dragHandler 
+     * {<OpenLayers.Handler.Drag>} 
+     */
+    dragHandler: null,
+
+    /**
+     * APIProperty: boxDivClassName
+     * {String} The CSS class to use for drawing the box. Default is
+     *     olHandlerBoxZoomBox
+     */
+    boxDivClassName: 'olHandlerBoxZoomBox',
+    
+    /**
+     * Property: boxCharacteristics
+     * {Object} Caches some box characteristics from css. This is used
+     *     by the getBoxCharacteristics method.
+     */
+    boxCharacteristics: null,
+
+    /**
+     * Constructor: OpenLayers.Handler.Box
+     *
+     * Parameters:
+     * 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} 
+     */
+    initialize: function(control, callbacks, options) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+        var callbacks = {
+            "down": this.startBox, 
+            "move": this.moveBox, 
+            "out":  this.removeBox,
+            "up":   this.endBox
+        };
+        this.dragHandler = new OpenLayers.Handler.Drag(
+                                this, callbacks, {keyMask: this.keyMask});
+    },
+
+    /**
+     * Method: destroy
+     */
+    destroy: function() {
+        if (this.dragHandler) {
+            this.dragHandler.destroy();
+            this.dragHandler = null;
+        }            
+        OpenLayers.Handler.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * Method: setMap
+     */
+    setMap: function (map) {
+        OpenLayers.Handler.prototype.setMap.apply(this, arguments);
+        if (this.dragHandler) {
+            this.dragHandler.setMap(map);
+        }
+    },
+
+    /**
+    * Method: startBox
+    *
+    * Parameters:
+    * evt - {Event} 
+    */
+    startBox: function (xy) {
+        this.zoomBox = OpenLayers.Util.createDiv('zoomBox',
+                                                 this.dragHandler.start);
+        this.zoomBox.className = this.boxDivClassName;                                         
+        this.zoomBox.style.zIndex = this.map.Z_INDEX_BASE["Popup"] - 1;
+        this.map.viewPortDiv.appendChild(this.zoomBox);
+
+        OpenLayers.Element.addClass(
+            this.map.viewPortDiv, "olDrawBox"
+        );
+    },
+
+    /**
+    * Method: moveBox
+    */
+    moveBox: function (xy) {
+        var startX = this.dragHandler.start.x;
+        var startY = this.dragHandler.start.y;
+        var deltaX = Math.abs(startX - xy.x);
+        var deltaY = Math.abs(startY - xy.y);
+        this.zoomBox.style.width = Math.max(1, deltaX) + "px";
+        this.zoomBox.style.height = Math.max(1, deltaY) + "px";
+        this.zoomBox.style.left = xy.x < startX ? xy.x+"px" : startX+"px";
+        this.zoomBox.style.top = xy.y < startY ? xy.y+"px" : startY+"px";
+
+        // depending on the box model, modify width and height to take borders
+        // of the box into account
+        var box = this.getBoxCharacteristics();
+        if (box.newBoxModel) {
+            if (xy.x > startX) {
+                this.zoomBox.style.width =
+                    Math.max(1, deltaX - box.xOffset) + "px";
+            }
+            if (xy.y > startY) {
+                this.zoomBox.style.height =
+                    Math.max(1, deltaY - box.yOffset) + "px";
+            }
+        }
+    },
+
+    /**
+    * Method: endBox
+    */
+    endBox: function(end) {
+        var result;
+        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);
+            var left = Math.min(start.x, end.x);
+            var right = Math.max(start.x, end.x);
+            result = new OpenLayers.Bounds(left, bottom, right, top);
+        } else {
+            result = this.dragHandler.start.clone(); // i.e. OL.Pixel
+        } 
+        this.removeBox();
+
+        this.callback("done", [result]);
+    },
+
+    /**
+     * Method: removeBox
+     * Remove the zoombox from the screen and nullify our reference to it.
+     */
+    removeBox: function() {
+        this.map.viewPortDiv.removeChild(this.zoomBox);
+        this.zoomBox = null;
+        this.boxCharacteristics = null;
+        OpenLayers.Element.removeClass(
+            this.map.viewPortDiv, "olDrawBox"
+        );
+
+    },
+
+    /**
+     * Method: activate
+     */
+    activate: function () {
+        if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
+            this.dragHandler.activate();
+            return true;
+        } else {
+            return false;
+        }
+    },
+
+    /**
+     * Method: deactivate
+     */
+    deactivate: function () {
+        if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            this.dragHandler.deactivate();
+            return true;
+        } else {
+            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
+     *     - yOffset - Corner offset in y-direction
+     *     - newBoxModel - true for all browsers except IE in quirks mode
+     */
+    getBoxCharacteristics: function() {
+        if (!this.boxCharacteristics) {
+            var xOffset = parseInt(OpenLayers.Element.getStyle(this.zoomBox,
+                "border-left-width")) + parseInt(OpenLayers.Element.getStyle(
+                this.zoomBox, "border-right-width")) + 1;
+            var yOffset = parseInt(OpenLayers.Element.getStyle(this.zoomBox,
+                "border-top-width")) + parseInt(OpenLayers.Element.getStyle(
+                this.zoomBox, "border-bottom-width")) + 1;
+            // all browsers use the new box model, except IE in quirks mode
+            var newBoxModel = OpenLayers.Util.getBrowserName() == "msie" ?
+                document.compatMode != "BackCompat" : true;
+            this.boxCharacteristics = {
+                xOffset: xOffset,
+                yOffset: yOffset,
+                newBoxModel: newBoxModel
+            };
+        }
+        return this.boxCharacteristics;
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Box"
+});
diff --git a/lib/OpenLayers/Handler/Click.js b/lib/OpenLayers/Handler/Click.js
new file mode 100644
index 0000000..a47fe67
--- /dev/null
+++ b/lib/OpenLayers/Handler/Click.js
@@ -0,0 +1,325 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Handler.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.Click
+ * A handler for mouse clicks.  The intention of this handler is to give
+ *     controls more flexibility with handling clicks.  Browsers trigger
+ *     click events twice for a double-click.  In addition, the mousedown,
+ *     mousemove, mouseup sequence fires a click event.  With this handler,
+ *     controls can decide whether to ignore clicks associated with a double
+ *     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.Click = OpenLayers.Class(OpenLayers.Handler, {
+
+    /**
+     * APIProperty: delay
+     * {Number} Number of milliseconds between clicks before the event is
+     *     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
+     *     event to be considered a click.  Default is 0.  If set to an
+     *     integer value, clicks with a drag greater than the value will be
+     *     ignored.  This property can only be set when the handler is
+     *     constructed.
+     */
+    pixelTolerance: 0,
+    
+    /**
+     * APIProperty: stopSingle
+     * {Boolean} Stop other listeners from being notified of clicks.  Default
+     *     is false.  If true, any click listeners registered before this one
+     *     will not be notified of *any* click event (associated with double
+     *     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
+     *     uniform cross-browser performance.  Since IE triggers one click
+     *     with a dblclick and FF triggers two, if a stopSingle handler is
+     *     activated first, all it gets in IE is a single click when the
+     *     second handler stops propagation on the dblclick.
+     */
+    stopDouble: false,
+
+    /**
+     * Property: timerId
+     * {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 
+     *     <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
+     *     handler's setMap method must be overridden to deal properly with
+     *     the map.
+     * callbacks - {Object} An object with keys corresponding to callbacks
+     *     that will be called by the handler. The callbacks should
+     *     expect to recieve a single argument, the click event.
+     *     Callbacks for 'click' and 'dblclick' are supported.
+     * options - {Object} Optional object whose properties will be set on the
+     *     handler.
+     */
+    initialize: function(control, callbacks, options) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+        // optionally register for mouseup and mousedown
+        if(this.pixelTolerance != null) {
+            this.mousedown = function(evt) {
+                this.down = evt.xy;
+                return true;
+            };
+        }
+    },
+    
+    /**
+     * Method: mousedown
+     * Handle mousedown.  Only registered as a listener if pixelTolerance is
+     *     a non-zero value at construction.
+     *
+     * Returns:
+     * {Boolean} Continue propagating this event.
+     */
+    mousedown: null,
+
+    /**
+     * Method: mouseup
+     * Handle mouseup.  Installed to support collection of right mouse events.
+     * 
+     * Returns:
+     * {Boolean} Continue propagating this event.
+     */
+    mouseup:  function (evt) {
+        var propagate = true;
+
+        // 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 && 
+            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 
+     *     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 
+                // a double click
+                this.clearTimer();      
+                this.callback('dblrightclick', [evt]);
+                return !this.stopDouble;
+            } else { 
+                //Set the rightclickTimerId, send evt only if double is 
+                // true else trigger single
+                var clickEvent = this['double'] ?
+                    OpenLayers.Util.extend({}, evt) : 
+                    this.callback('rightclick', [evt]);
+
+                var delayedRightCall = OpenLayers.Function.bind(
+                    this.delayedRightCall, 
+                    this, 
+                    clickEvent
+                );
+                this.rightclickTimerId = window.setTimeout(
+                    delayedRightCall, this.delay
+                );
+            } 
+        }
+        return !this.stopSingle;
+    },
+    
+    /**
+     * Method: delayedRightCall
+     * Sets <rightclickTimerId> to null.  And optionally triggers the 
+     *     rightclick callback if evt is set.
+     */
+    delayedRightCall: function(evt) {
+        this.rightclickTimerId = null;
+        if (evt) {
+           this.callback('rightclick', [evt]);
+        }
+        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.
+     */
+    dblclick: function(evt) {
+        if(this.passesTolerance(evt)) {
+            if(this["double"]) {
+                this.callback('dblclick', [evt]);
+            }
+            this.clearTimer();
+        }
+        return !this.stopDouble;
+    },
+    
+    /**
+     * Method: click
+     * Handle click.
+     *
+     * Returns:
+     * {Boolean} Continue propagating this event.
+     */
+    click: function(evt) {
+        if(this.passesTolerance(evt)) {
+            if(this.timerId != null) {
+                // already received a click
+                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 
+                //be a valid event object in IE in the timer callback
+                var clickEvent = this.single ?
+                    OpenLayers.Util.extend({}, evt) : null;
+                this.timerId = window.setTimeout(
+                    OpenLayers.Function.bind(this.delayedCall, this, clickEvent),
+                    this.delay
+                );
+            }
+        }
+        return !this.stopSingle;
+    },
+    
+    /**
+     * Method: passesTolerance
+     * Determine whether the event is within the optional pixel tolerance.  Note
+     *     that the pixel tolerance check only works if mousedown events get to
+     *     the listeners registered here.  If they are stopped by other elements,
+     *     the <pixelTolerance> will have no effect here (this method will always
+     *     return true).
+     *
+     * Returns:
+     * {Boolean} The click is within the pixel tolerance (if specified).
+     */
+    passesTolerance: function(evt) {
+        var passes = true;
+        if(this.pixelTolerance != null && this.down) {
+            var dpx = Math.sqrt(
+                Math.pow(this.down.x - evt.xy.x, 2) +
+                Math.pow(this.down.y - evt.xy.y, 2)
+            );
+            if(dpx > this.pixelTolerance) {
+                passes = false;
+            }
+        }
+        return passes;
+    },
+
+    /**
+     * Method: clearTimer
+     * Clear the timer and set <timerId> to null.
+     */
+    clearTimer: function() {
+        if(this.timerId != null) {
+            window.clearTimeout(this.timerId);
+            this.timerId = null;
+        }
+        if(this.rightclickTimerId != null) {
+            window.clearTimeout(this.rightclickTimerId);
+            this.rightclickTimerId = null;
+        }
+    },
+    
+    /**
+     * Method: delayedCall
+     * Sets <timerId> to null.  And optionally triggers the click callback if
+     *     evt is set.
+     */
+    delayedCall: function(evt) {
+        this.timerId = null;
+        if(evt) {
+            this.callback('click', [evt]);
+        }
+    },
+
+    /**
+     * APIMethod: deactivate
+     * Deactivate the handler.
+     *
+     * Returns:
+     * {Boolean} The handler was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = false;
+        if(OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            this.clearTimer();
+            this.down = null;
+            deactivated = true;
+        }
+        return deactivated;
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Click"
+});
diff --git a/lib/OpenLayers/Handler/Drag.js b/lib/OpenLayers/Handler/Drag.js
new file mode 100644
index 0000000..562d2ae
--- /dev/null
+++ b/lib/OpenLayers/Handler/Drag.js
@@ -0,0 +1,420 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Handler.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.Drag
+ * The drag handler is used to deal with sequences of browser events related
+ *     to dragging.  The handler is used by controls that want to know when
+ *     a drag sequence begins, when a drag is happening, and when it has
+ *     finished.
+ *
+ * Controls that use the drag handler typically construct it with callbacks
+ *     for 'down', 'move', and 'done'.  Callbacks for these keys are called
+ *     when the drag begins, with each move, and when the drag is done.  In
+ *     addition, controls can have callbacks keyed to 'up' and 'out' if they
+ *     care to differentiate between the types of events that correspond with
+ *     the end of a drag sequence.  If no drag actually occurs (no mouse move)
+ *     the 'down' and 'up' callbacks will be called, but not the 'done'
+ *     callback.
+ *
+ * Create a new drag handler with the <OpenLayers.Handler.Drag> constructor.
+ *
+ * Inherits from:
+ *  - <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. 
+     */
+    started: false,
+    
+    /**
+     * Property: stopDown
+     * {Boolean} Stop propagation of mousedown events from getting to listeners
+     *     on the same element.  Default is true.
+     */
+    stopDown: true,
+
+    /** 
+     * 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.
+     */
+    start: null,
+
+    /**
+     * Property: oldOnselectstart
+     * {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. 
+     */
+    interval: 0,
+    
+    /**
+     * Property: timeoutId
+     * {String} The id of the timeout used for the mousedown interval.
+     *     This is "private", and should be left alone.
+     */
+    timeoutId: null,
+    
+    /**
+     * APIProperty: documentDrag
+     * {Boolean} If set to true, the handler will also handle mouse moves when
+     *     the cursor has moved out of the map viewport. Default is false.
+     */
+    documentDrag: false,
+    
+    /**
+     * Property: documentEvents
+     * {<OpenLayers.Events>} Event instance for observing document events. Will
+     *     be set on mouseout if documentDrag is set to true.
+     */
+    documentEvents: null,
+
+    /**
+     * 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
+     *     handlers setMap method must be overridden to deal properly with
+     *     the map.
+     * 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 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} 
+     */
+    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.
+     *     Subclasses can do their own processing here.
+     *
+     * Parameters:
+     * evt - {Event} The mouse down event
+     */
+    down: function(evt) {
+    },
+    
+    /**
+     * Method: move
+     * This method is called during the handling of the mouse move event.
+     *     Subclasses can do their own processing here.
+     *
+     * Parameters:
+     * evt - {Event} The mouse move event
+     *
+     */
+    move: function(evt) {
+    },
+
+    /**
+     * Method: up
+     * This method is called during the handling of the mouse up event.
+     *     Subclasses can do their own processing here.
+     *
+     * Parameters:
+     * evt - {Event} The mouse up event
+     */
+    up: function(evt) {
+    },
+
+    /**
+     * Method: out
+     * This method is called during the handling of the mouse out event.
+     *     Subclasses can do their own processing here.
+     *
+     * Parameters:
+     * evt - {Event} The mouse out event
+     */
+    out: function(evt) {
+    },
+
+    /**
+     * The methods below are part of the magic of event handling.  Because
+     *     they are named like browser events, they are registered as listeners
+     *     for the events they represent.
+     */
+
+    /**
+     * Method: mousedown
+     * Handle mousedown events
+     *
+     * Parameters:
+     * evt - {Event} 
+     *
+     * Returns:
+     * {Boolean} Let the event propagate.
+     */
+    mousedown: function (evt) {
+        var propagate = true;
+        this.dragging = false;
+        if (this.checkModifiers(evt) && OpenLayers.Event.isLeftClick(evt)) {
+            this.started = true;
+            this.start = evt.xy;
+            this.last = evt.xy;
+            OpenLayers.Element.addClass(
+                this.map.viewPortDiv, "olDragDown"
+            );
+            this.down(evt);
+            this.callback("down", [evt.xy]);
+            OpenLayers.Event.stop(evt);
+            
+            if(!this.oldOnselectstart) {
+                this.oldOnselectstart = (document.onselectstart) ? document.onselectstart : OpenLayers.Function.True;
+            }
+            document.onselectstart = OpenLayers.Function.False;
+            
+            propagate = !this.stopDown;
+        } else {
+            this.started = false;
+            this.start = null;
+            this.last = null;
+        }
+        return propagate;
+    },
+
+    /**
+     * Method: mousemove
+     * Handle mousemove events
+     *
+     * Parameters:
+     * evt - {Event} 
+     *
+     * Returns:
+     * {Boolean} Let the event propagate.
+     */
+    mousemove: function (evt) {
+        if (this.started && !this.timeoutId && (evt.xy.x != this.last.x || evt.xy.y != this.last.y)) {
+            if(this.documentDrag === true && this.documentEvents) {
+                if(evt.element === document) {
+                    this.adjustXY(evt);
+                    // do setEvent manually because the documentEvents are not
+                    // registered with the map
+                    this.setEvent(evt);
+                } else {
+                    this.destroyDocumentEvents();
+                }
+            }
+            if (this.interval > 0) {
+                this.timeoutId = setTimeout(OpenLayers.Function.bind(this.removeTimeout, this), this.interval);
+            }
+            this.dragging = true;
+            this.move(evt);
+            this.callback("move", [evt.xy]);
+            if(!this.oldOnselectstart) {
+                this.oldOnselectstart = document.onselectstart;
+                document.onselectstart = OpenLayers.Function.False;
+            }
+            this.last = this.evt.xy;
+        }
+        return true;
+    },
+    
+    /**
+     * Method: removeTimeout
+     * Private. Called by mousemove() to remove the drag timeout.
+     */
+    removeTimeout: function() {
+        this.timeoutId = null;
+    },
+
+    /**
+     * Method: mouseup
+     * Handle mouseup events
+     *
+     * Parameters:
+     * evt - {Event} 
+     *
+     * Returns:
+     * {Boolean} Let the event propagate.
+     */
+    mouseup: function (evt) {
+        if (this.started) {
+            if(this.documentDrag === true && this.documentEvents) {
+                this.adjustXY(evt);
+                this.destroyDocumentEvents();
+            }
+            var dragged = (this.start != this.last);
+            this.started = false;
+            this.dragging = false;
+            OpenLayers.Element.removeClass(
+                this.map.viewPortDiv, "olDragDown"
+            );
+            this.up(evt);
+            this.callback("up", [evt.xy]);
+            if(dragged) {
+                this.callback("done", [evt.xy]);
+            }
+            document.onselectstart = this.oldOnselectstart;
+        }
+        return true;
+    },
+
+    /**
+     * Method: mouseout
+     * Handle mouseout events
+     *
+     * Parameters:
+     * evt - {Event} 
+     *
+     * Returns:
+     * {Boolean} Let the event propagate.
+     */
+    mouseout: function (evt) {
+        if (this.started && OpenLayers.Util.mouseLeft(evt, this.map.div)) {
+            if(this.documentDrag === true) {
+                this.documentEvents = new OpenLayers.Events(this, document,
+                                            null, null, {includeXY: true});
+                this.documentEvents.on({
+                    mousemove: this.mousemove,
+                    mouseup: this.mouseup
+                });
+                OpenLayers.Element.addClass(
+                    document.body, "olDragDown"
+                );
+            } else {
+                var dragged = (this.start != this.last);
+                this.started = false; 
+                this.dragging = false;
+                OpenLayers.Element.removeClass(
+                    this.map.viewPortDiv, "olDragDown"
+                );
+                this.out(evt);
+                this.callback("out", []);
+                if(dragged) {
+                    this.callback("done", [evt.xy]);
+                }
+                if(document.onselectstart) {
+                    document.onselectstart = this.oldOnselectstart;
+                }
+            }
+        }
+        return true;
+    },
+
+    /**
+     * 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 
+     *     after a drag.
+     * 
+     * Parameters: 
+     * evt - {Event} 
+     * 
+     * Returns:
+     * {Boolean} Let the event propagate.
+     */
+    click: function (evt) {
+        // let the click event propagate only if the mouse moved
+        return (this.start == this.last);
+    },
+
+    /**
+     * Method: activate
+     * Activate the handler.
+     * 
+     * Returns:
+     * {Boolean} The handler was successfully activated.
+     */
+    activate: function() {
+        var activated = false;
+        if(OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
+            this.dragging = false;
+            activated = true;
+        }
+        return activated;
+    },
+
+    /**
+     * Method: deactivate 
+     * Deactivate the handler.
+     * 
+     * Returns:
+     * {Boolean} The handler was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = false;
+        if(OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            this.started = false;
+            this.dragging = false;
+            this.start = null;
+            this.last = null;
+            deactivated = true;
+            OpenLayers.Element.removeClass(
+                this.map.viewPortDiv, "olDragDown"
+            );
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: adjustXY
+     * Converts event coordinates that are relative to the document body to
+     * ones that are relative to the map viewport. The latter is the default in
+     * OpenLayers.
+     * 
+     * Parameters:
+     * evt - {Object}
+     */
+    adjustXY: function(evt) {
+        var pos = OpenLayers.Util.pagePosition(this.map.div);
+        evt.xy.x -= pos[0];
+        evt.xy.y -= pos[1];
+    },
+    
+    /**
+     * Method: destroyDocumentEvents
+     * Destroys the events instance that gets added to the document body when
+     * documentDrag is true and the mouse cursor leaves the map viewport while
+     * dragging.
+     */
+    destroyDocumentEvents: function() {
+        OpenLayers.Element.removeClass(
+            document.body, "olDragDown"
+        );
+        this.documentEvents.destroy();
+        this.documentEvents = null;
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Drag"
+});
diff --git a/lib/OpenLayers/Handler/Feature.js b/lib/OpenLayers/Handler/Feature.js
new file mode 100644
index 0000000..0f99cf4
--- /dev/null
+++ b/lib/OpenLayers/Handler/Feature.js
@@ -0,0 +1,388 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Handler.js
+ */
+
+/**
+ * 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.
+ *
+ * This handler stops event propagation for mousedown and mouseup if those
+ *     browser events target features that can be selected.
+ */
+OpenLayers.Handler.Feature = OpenLayers.Class(OpenLayers.Handler, {
+
+    /**
+     * Property: EVENTMAP
+     * {Object} A object mapping the browser events to objects with callback
+     *     keys for in and out.
+     */
+    EVENTMAP: {
+        'click': {'in': 'click', 'out': 'clickout'},
+        'mousemove': {'in': 'over', 'out': 'out'},
+        'dblclick': {'in': 'dblclick', 'out': null},
+        'mousedown': {'in': null, 'out': null},
+        'mouseup': {'in': null, 'out': null}
+    },
+
+    /**
+     * Property: feature
+     * {<OpenLayers.Feature.Vector>} The last feature that was hovered.
+     */
+    feature: null,
+
+    /**
+     * Property: lastFeature
+     * {<OpenLayers.Feature.Vector>} The last feature that was handled.
+     */
+    lastFeature: null,
+
+    /**
+     * Property: down
+     * {<OpenLayers.Pixel>} The location of the last mousedown.
+     */
+    down: null,
+
+    /**
+     * Property: up
+     * {<OpenLayers.Pixel>} The location of the last mouseup.
+     */
+    up: null,
+    
+    /**
+     * Property: clickTolerance
+     * {Number} The number of pixels the mouse can move between mousedown
+     *     and mouseup for the event to still be considered a click.
+     *     Dragging the map should not trigger the click and clickout callbacks
+     *     unless the map is moved by less than this tolerance. Defaults to 4.
+     */
+    clickTolerance: 4,
+
+    /**
+     * 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,
+
+    /**
+     * Property: stopClick
+     * {Boolean} If stopClick is set to true, handled clicks do not
+     *      propagate to other click listeners. Otherwise, handled clicks
+     *      do propagate. Unhandled clicks always propagate, whatever the
+     *      value of stopClick. Defaults to true.
+     */
+    stopClick: true,
+
+    /**
+     * Property: stopDown
+     * {Boolean} If stopDown is set to true, handled mousedowns do not
+     *      propagate to other mousedown listeners. Otherwise, handled
+     *      mousedowns do propagate. Unhandled mousedowns always propagate,
+     *      whatever the value of stopDown. Defaults to true.
+     */
+    stopDown: true,
+
+    /**
+     * Property: stopUp
+     * {Boolean} If stopUp is set to true, handled mouseups do not
+     *      propagate to other mouseup listeners. Otherwise, handled mouseups
+     *      do propagate. Unhandled mouseups always propagate, whatever the
+     *      value of stopUp. Defaults to false.
+     */
+    stopUp: false,
+    
+    /**
+     * Constructor: OpenLayers.Handler.Feature
+     *
+     * Parameters:
+     * 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 
+     *     callback should expect to recieve a single argument, the feature.
+     * options - {Object} 
+     */
+    initialize: function(control, layer, callbacks, options) {
+        OpenLayers.Handler.prototype.initialize.apply(this, [control, callbacks, options]);
+        this.layer = layer;
+    },
+
+
+    /**
+     * Method: mousedown
+     * Handle mouse down.  Stop propagation if a feature is targeted by this
+     *     event (stops map dragging during feature selection).
+     * 
+     * Parameters:
+     * 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} 
+     */
+    mouseup: function(evt) {
+        this.up = evt.xy;
+        return this.handle(evt) ? !this.stopUp : true;
+    },
+
+    /**
+     * 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} 
+     *
+     * Returns:
+     * {Boolean}
+     */
+    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} 
+     *
+     * Returns:
+     * {Boolean}
+     */
+    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} 
+     *
+     * Returns:
+     * {Boolean}
+     */
+    dblclick: function(evt) {
+        return !this.handle(evt);
+    },
+
+    /**
+     * Method: geometryTypeMatches
+     * Return true if the geometry type of the passed feature matches
+     *     one of the geometry types in the geometryTypes array.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Vector.Feature>}
+     *
+     * Returns:
+     * {Boolean}
+     */
+    geometryTypeMatches: function(feature) {
+        return this.geometryTypes == null ||
+            OpenLayers.Util.indexOf(this.geometryTypes,
+                                    feature.geometry.CLASS_NAME) > -1;
+    },
+
+    /**
+     * Method: handle
+     *
+     * Parameters:
+     * evt - {Event}
+     *
+     * Returns:
+     * {Boolean} The event occurred over a relevant feature.
+     */
+    handle: function(evt) {
+        if(this.feature && !this.feature.layer) {
+            // feature has been destroyed
+            this.feature = null;
+        }
+        var type = evt.type;
+        var handled = false;
+        var previouslyIn = !!(this.feature); // previously in a feature
+        var click = (type == "click" || type == "dblclick");
+        this.feature = this.layer.getFeatureFromEvent(evt);
+        if(this.feature && !this.feature.layer) {
+            // feature has been destroyed
+            this.feature = null;
+        }
+        if(this.lastFeature && !this.lastFeature.layer) {
+            // last feature has been destroyed
+            this.lastFeature = null;
+        }
+        if(this.feature) {
+            var inNew = (this.feature != this.lastFeature);
+            if(this.geometryTypeMatches(this.feature)) {
+                // in to a feature
+                if(previouslyIn && inNew) {
+                    // out of last feature and in to another
+                    if(this.lastFeature) {
+                        this.triggerCallback(type, 'out', [this.lastFeature]);
+                    }
+                    this.triggerCallback(type, 'in', [this.feature]);
+                } else if(!previouslyIn || click) {
+                    // in feature for the first time
+                    this.triggerCallback(type, 'in', [this.feature]);
+                }
+                this.lastFeature = this.feature;
+                handled = true;
+            } else {
+                // not in to a feature
+                if(this.lastFeature && (previouslyIn && inNew || click)) {
+                    // out of last feature for the first time
+                    this.triggerCallback(type, 'out', [this.lastFeature]);
+                }
+                // next time the mouse goes in a feature whose geometry type
+                // doesn't match we don't want to call the 'out' callback
+                // again, so let's set this.feature to null so that
+                // previouslyIn will evaluate to false the next time
+                // we enter handle. Yes, a bit hackish...
+                this.feature = null;
+            }
+        } else {
+            if(this.lastFeature && (previouslyIn || click)) {
+                this.triggerCallback(type, 'out', [this.lastFeature]);
+            }
+        }
+        return handled;
+    },
+    
+    /**
+     * Method: triggerCallback
+     * Call the callback keyed in the event map with the supplied arguments.
+     *     For click and clickout, the <clickTolerance> is checked first.
+     *
+     * Parameters:
+     * type - {String}
+     */
+    triggerCallback: function(type, mode, args) {
+        var key = this.EVENTMAP[type][mode];
+        if(key) {
+            if(type == 'click' && this.up && this.down) {
+                // for click/clickout, only trigger callback if tolerance is met
+                var dpx = Math.sqrt(
+                    Math.pow(this.up.x - this.down.x, 2) +
+                    Math.pow(this.up.y - this.down.y, 2)
+                );
+                if(dpx <= this.clickTolerance) {
+                    this.callback(key, args);
+                }
+            } else {
+                this.callback(key, args);
+            }
+        }
+    },
+
+    /**
+     * Method: activate 
+     * Turn on the handler.  Returns false if the handler was already active.
+     *
+     * Returns:
+     * {Boolean}
+     */
+    activate: function() {
+        var activated = false;
+        if(OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
+            this.moveLayerToTop();
+            this.map.events.on({
+                "removelayer": this.handleMapEvents,
+                "changelayer": this.handleMapEvents,
+                scope: this
+            });
+            activated = true;
+        }
+        return activated;
+    },
+    
+    /**
+     * Method: deactivate 
+     * Turn off the handler.  Returns false if the handler was already active.
+     *
+     * Returns: 
+     * {Boolean}
+     */
+    deactivate: function() {
+        var deactivated = false;
+        if(OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            this.moveLayerBack();
+            this.feature = null;
+            this.lastFeature = null;
+            this.down = null;
+            this.up = null;
+            this.map.events.un({
+                "removelayer": this.handleMapEvents,
+                "changelayer": this.handleMapEvents,
+                scope: this
+            });
+            deactivated = true;
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method handleMapEvents
+     * 
+     * Parameters:
+     * evt - {Object}
+     */
+    handleMapEvents: function(evt) {
+        if (!evt.property || evt.property == "order") {
+            this.moveLayerToTop();
+        }
+    },
+    
+    /**
+     * Method: moveLayerToTop
+     * Moves the layer for this handler to the top, so mouse events can reach
+     * it.
+     */
+    moveLayerToTop: function() {
+        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
+     * array.
+     */
+    moveLayerBack: function() {
+        var index = this.layer.getZIndex() - 1;
+        if (index >= this.map.Z_INDEX_BASE['Feature']) {
+            this.layer.setZIndex(index);
+        } else {
+            this.map.setLayerZIndex(this.layer,
+                this.map.getLayerIndex(this.layer));
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Feature"
+});
diff --git a/lib/OpenLayers/Handler/Hover.js b/lib/OpenLayers/Handler/Hover.js
new file mode 100644
index 0000000..6f3c98a
--- /dev/null
+++ b/lib/OpenLayers/Handler/Hover.js
@@ -0,0 +1,183 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Handler.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.Hover
+ * The hover handler is to be used to emulate mouseovers on objects
+ *      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.Hover = OpenLayers.Class(OpenLayers.Handler, {
+
+    /**
+     * APIProperty: delay
+     * {Integer} - Number of milliseconds between mousemoves before
+     *      the event is considered a hover. Default is 500.
+     */
+    delay: 500,
+    
+    /**
+     * APIProperty: pixelTolerance
+     * {Integer} - Maximum number of pixels between mousemoves for
+     *      an event to be considered a hover. Default is null.
+     */
+    pixelTolerance: null,
+
+    /**
+     * APIProperty: stopMove
+     * {Boolean} - Stop other listeners from being notified on mousemoves.
+     *      Default is false.
+     */
+    stopMove: false,
+
+    /**
+     * Property: px
+     * {<OpenLayers.Pixel>} - The location of the last mousemove, expressed
+     *      in pixels.
+     */
+    px: null,
+
+    /**
+     * Property: timerId
+     * {Number} - The id of the timer.
+     */
+    timerId: null,
+ 
+    /**
+     * Constructor: OpenLayers.Handler.Hover
+     * Construct a hover handler.
+     *
+     * Parameters:
+     * control - {<OpenLayers.Control>} The control that initialized this
+     *     handler.  The control is assumed to have a valid map property; that
+     *     map is used in the handler's own setMap method.
+     * callbacks - {Object} An object with keys corresponding to callbacks
+     *     that will be called by the handler. The callbacks should
+     *     expect to receive a single argument, the event. Callbacks for
+     *     'move', the mouse is moving, and 'pause', the mouse is pausing,
+     *     are supported.
+     * options - {Object} An optional object whose properties will be set on
+     *     the handler.
+     */
+    initialize: function(control, callbacks, options) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+    },
+
+    /**
+     * Method: mousemove
+     * Called when the mouse moves on the map.
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>}
+     *
+     * Returns:
+     * {Boolean} Continue propagating this event.
+     */
+    mousemove: function(evt) {
+        if(this.passesTolerance(evt.xy)) {
+            this.clearTimer();
+            this.callback('move', [evt]);
+            this.px = evt.xy;
+            // clone the evt so original properties can be accessed even
+            // if the browser deletes them during the delay
+            evt = OpenLayers.Util.extend({}, evt);
+            this.timerId = window.setTimeout(
+                OpenLayers.Function.bind(this.delayedCall, this, evt),
+                this.delay
+            );
+        }
+        return !this.stopMove;
+    },
+
+    /**
+     * Method: mouseout
+     * Called when the mouse goes out of the map.
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>}
+     *
+     * Returns:
+     * {Boolean} Continue propagating this event.
+     */
+    mouseout: function(evt) {
+        if (OpenLayers.Util.mouseLeft(evt, this.map.div)) {
+            this.clearTimer();
+            this.callback('move', [evt]);
+        }
+        return true;
+    },
+
+    /**
+     * Method: passesTolerance
+     * Determine whether the mouse move is within the optional pixel tolerance.
+     *
+     * Parameters:
+     * px - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {Boolean} The mouse move is within the pixel tolerance.
+     */
+    passesTolerance: function(px) {
+        var passes = true;
+        if(this.pixelTolerance && this.px) {
+            var dpx = Math.sqrt(
+                Math.pow(this.px.x - px.x, 2) +
+                Math.pow(this.px.y - px.y, 2)
+            );
+            if(dpx < this.pixelTolerance) {
+                passes = false;
+            }
+        }
+        return passes;
+    },
+
+    /**
+     * Method: clearTimer
+     * Clear the timer and set <timerId> to null.
+     */
+    clearTimer: function() {
+        if(this.timerId != null) {
+            window.clearTimeout(this.timerId);
+            this.timerId = null;
+        }
+    },
+
+    /**
+     * Method: delayedCall
+     * Triggers pause callback.
+     *
+     * Parameters:
+     * evt - {<OpenLayers.Event>}
+     */
+    delayedCall: function(evt) {
+        this.callback('pause', [evt]);
+    },
+
+    /**
+     * APIMethod: deactivate
+     * Deactivate the handler.
+     *
+     * Returns:
+     * {Boolean} The handler was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = false;
+        if(OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            this.clearTimer();
+            deactivated = true;
+        }
+        return deactivated;
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Hover"
+});
diff --git a/lib/OpenLayers/Handler/Keyboard.js b/lib/OpenLayers/Handler/Keyboard.js
new file mode 100644
index 0000000..5171915
--- /dev/null
+++ b/lib/OpenLayers/Handler/Keyboard.js
@@ -0,0 +1,109 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Handler.js
+ * @requires OpenLayers/Events.js
+ */
+
+/**
+ * Class: OpenLayers.handler.Keyboard
+ * A handler for keyboard events.  Create a new instance with the
+ *     <OpenLayers.Handler.Keyboard> constructor.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Handler> 
+ */
+OpenLayers.Handler.Keyboard = OpenLayers.Class(OpenLayers.Handler, {
+
+    /* http://www.quirksmode.org/js/keys.html explains key x-browser
+        key handling quirks in pretty nice detail */
+
+    /** 
+     * Constant: KEY_EVENTS
+     * keydown, keypress, keyup
+     */
+    KEY_EVENTS: ["keydown", "keyup"],
+
+    /** 
+    * Property: eventListener
+    * {Function}
+    */
+    eventListener: null,
+
+    /**
+     * Constructor: OpenLayers.Handler.Keyboard
+     * Returns a new keyboard handler.
+     * 
+     * Parameters:
+     * control - {<OpenLayers.Control>} The control that is making use of
+     *     this handler.  If a handler is being used without a control, the
+     *     handlers setMap method must be overridden to deal properly with
+     *     the map.
+     * 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 pixel location of the event.
+     *     Callbacks for 'keydown', 'keypress', and 'keyup' are supported.
+     * options - {Object} Optional object whose properties will be set on the
+     *     handler.
+     */
+    initialize: function(control, callbacks, options) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+        // cache the bound event listener method so it can be unobserved later
+        this.eventListener = OpenLayers.Function.bindAsEventListener(
+            this.handleKeyEvent, this
+        );
+    },
+    
+    /**
+     * Method: destroy
+     */
+    destroy: function() {
+        this.deactivate();
+        this.eventListener = null;
+        OpenLayers.Handler.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * Method: activate
+     */
+    activate: function() {
+        if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
+            for (var i=0, len=this.KEY_EVENTS.length; i<len; i++) {
+                OpenLayers.Event.observe(
+                    document, this.KEY_EVENTS[i], this.eventListener);
+            }
+            return true;
+        } else {
+            return false;
+        }
+    },
+
+    /**
+     * Method: deactivate
+     */
+    deactivate: function() {
+        var deactivated = false;
+        if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            for (var i=0, len=this.KEY_EVENTS.length; i<len; i++) {
+                OpenLayers.Event.stopObserving(
+                    document, this.KEY_EVENTS[i], this.eventListener);
+            }
+            deactivated = true;
+        }
+        return deactivated;
+    },
+
+    /**
+     * Method: handleKeyEvent 
+     */
+    handleKeyEvent: function (evt) {
+        if (this.checkModifiers(evt)) {
+            this.callback(evt.type, [evt]);
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Keyboard"
+});
diff --git a/lib/OpenLayers/Handler/MouseWheel.js b/lib/OpenLayers/Handler/MouseWheel.js
new file mode 100644
index 0000000..c16df50
--- /dev/null
+++ b/lib/OpenLayers/Handler/MouseWheel.js
@@ -0,0 +1,283 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Handler.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.MouseWheel
+ * Handler for wheel up/down events.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Handler>
+ */
+OpenLayers.Handler.MouseWheel = OpenLayers.Class(OpenLayers.Handler, {
+    /** 
+     * 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
+     * value from the last mousemove.
+     */
+    mousePosition: null,
+
+    /**
+     * Property: interval
+     * {Integer} In order to increase server performance, an interval (in 
+     *     milliseconds) can be set to reduce the number of up/down events 
+     *     called. If set, a new up/down event will not be set until the 
+     *     interval has passed. 
+     *     Defaults to 0, meaning no interval. 
+     */
+    interval: 0,
+    
+    /**
+     * Property: delta
+     * {Integer} When interval is set, delta collects the mousewheel z-deltas
+     *     of the events that occur within the interval.
+     *      See also the cumulative option
+     */
+    delta: 0,
+    
+    /**
+     * Property: cumulative
+     * {Boolean} When interval is set: true to collect all the mousewheel 
+     *     z-deltas, false to only record the delta direction (positive or
+     *     negative)
+     */
+    cumulative: true,
+
+    /**
+     * Constructor: OpenLayers.Handler.MouseWheel
+     *
+     * Parameters:
+     * 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} 
+     */
+    initialize: function(control, callbacks, options) {
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+        this.wheelListener = OpenLayers.Function.bindAsEventListener(
+            this.onWheelEvent, this
+        );
+    },
+
+    /**
+     * Method: destroy
+     */    
+    destroy: function() {
+        OpenLayers.Handler.prototype.destroy.apply(this, arguments);
+        this.wheelListener = null;
+    },
+
+    /**
+     *  Mouse ScrollWheel code thanks to http://adomas.org/javascript-mouse-wheel/
+     */
+
+    /** 
+     * Method: onWheelEvent
+     * Catch the wheel event and handle it xbrowserly
+     * 
+     * Parameters:
+     * 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: 
+        //   * specifically marked as scrollable
+        //   * one of our layer divs
+        //   * the map div
+        //
+        var overScrollableDiv = false;
+        var overLayerDiv = false;
+        var overMapDiv = false;
+        
+        var elem = OpenLayers.Event.element(e);
+        while((elem != null) && !overMapDiv && !overScrollableDiv) {
+
+            if (!overScrollableDiv) {
+                try {
+                    if (elem.currentStyle) {
+                        overflow = elem.currentStyle["overflow"];
+                    } else {
+                        var style = 
+                            document.defaultView.getComputedStyle(elem, null);
+                        var overflow = style.getPropertyValue("overflow");
+                    }
+                    overScrollableDiv = ( overflow && 
+                        (overflow == "auto") || (overflow == "scroll") );
+                } catch(err) {
+                    //sometimes when scrolling in a popup, this causes 
+                    // obscure browser error
+                }
+            }
+
+            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 
+                    // pane above the layer (layer.pane)
+                    if (elem == this.map.layers[i].div 
+                        || elem == this.map.layers[i].pane) { 
+                        overLayerDiv = true;
+                        break;
+                    }
+                }
+            }
+            overMapDiv = (elem == this.map.div);
+
+            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: 
+        //     * 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 
+        //        layerswitcher or the pan/zoom control)
+        //
+        if (!overScrollableDiv && overMapDiv) {
+            if (overLayerDiv) {
+                var delta = 0;
+                if (!e) {
+                    e = window.event;
+                }
+                if (e.wheelDelta) {
+                    delta = e.wheelDelta/120; 
+                    if (window.opera && window.opera.version() < 9.2) {
+                        delta = -delta;
+                    }
+                } else if (e.detail) {
+                    delta = -e.detail / 3;
+                }
+                this.delta = this.delta + delta;
+
+                if(this.interval) {
+                    window.clearTimeout(this._timeoutId);
+                    this._timeoutId = window.setTimeout(
+                        OpenLayers.Function.bind(function(){
+                            this.wheelZoom(e);
+                        }, this),
+                        this.interval
+                    );
+                } else {
+                    this.wheelZoom(e);
+                }
+            }
+            OpenLayers.Event.stop(e);
+        }
+    },
+
+    /**
+     * 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 = this.delta;
+        this.delta = 0;
+        
+        if (delta) {
+            // 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 
+                // this.map is ensured to be true above.
+                e.xy = this.map.getPixelFromLonLat(
+                    this.map.getCenter()
+                );
+            }
+            if (delta < 0) {
+                this.callback("down", [e, this.cumulative ? delta : -1]);
+            } else {
+                this.callback("up", [e, this.cumulative ? delta : 1]);
+            }
+        }
+    },
+    
+    /**
+     * Method: mousemove
+     * Update the stored mousePosition on every move.
+     * 
+     * Parameters:
+     * evt - {Event} The browser event
+     *
+     * Returns: 
+     * {Boolean} Allow event propagation
+     */
+    mousemove: function (evt) {
+        this.mousePosition = evt.xy;
+    },
+
+    /**
+     * Method: activate 
+     */
+    activate: function (evt) {
+        if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
+            //register mousewheel events specifically on the window and document
+            var wheelListener = this.wheelListener;
+            OpenLayers.Event.observe(window, "DOMMouseScroll", wheelListener);
+            OpenLayers.Event.observe(window, "mousewheel", wheelListener);
+            OpenLayers.Event.observe(document, "mousewheel", wheelListener);
+            return true;
+        } else {
+            return false;
+        }
+    },
+
+    /**
+     * Method: deactivate 
+     */
+    deactivate: function (evt) {
+        if (OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            // unregister mousewheel events specifically on the window and document
+            var wheelListener = this.wheelListener;
+            OpenLayers.Event.stopObserving(window, "DOMMouseScroll", wheelListener);
+            OpenLayers.Event.stopObserving(window, "mousewheel", wheelListener);
+            OpenLayers.Event.stopObserving(document, "mousewheel", wheelListener);
+            return true;
+        } else {
+            return false;
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.MouseWheel"
+});
diff --git a/lib/OpenLayers/Handler/Path.js b/lib/OpenLayers/Handler/Path.js
new file mode 100644
index 0000000..689ef3b
--- /dev/null
+++ b/lib/OpenLayers/Handler/Path.js
@@ -0,0 +1,302 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Handler/Point.js
+ * @requires OpenLayers/Geometry/Point.js
+ * @requires OpenLayers/Geometry/LineString.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.Path
+ * Handler to draw a path on the map.  Path is displayed on mouse down,
+ * moves on mouse move, and is finished on mouse up.
+ *
+ * Inherits from:
+ *  - <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,
+     * adds a point for every mouse move, and finishes the path on mouse up.
+     * Outside of freehand mode, a point is added to the path on every mouse
+     * click and double-click finishes the path.
+     */
+    freehand: false,
+    
+    /**
+     * Property: freehandToggle
+     * {String} If set, freehandToggle is checked on mouse events and will set
+     * the freehand mode to the opposite of this.freehand.  To disallow
+     * toggling between freehand and non-freehand mode, set freehandToggle to
+     * null.  Acceptable toggle values are 'shiftKey', 'ctrlKey', and 'altKey'.
+     */
+    freehandToggle: 'shiftKey',
+
+    /**
+     * Constructor: OpenLayers.Handler.Path
+     * Create a new path hander
+     *
+     * Parameters:
+     * control - {<OpenLayers.Control>} The control that owns this handler
+     * callbacks - {Object} An object with a properties whose values are
+     *     functions.  Various callbacks described below.
+     * options - {Object} An optional object with properties to be set on the
+     *           handler
+     *
+     * Named callbacks:
+     * create - Called when a sketch is first created.  Callback called with
+     *     the creation point geometry and sketch feature.
+     * modify - Called with each move of a vertex with the vertex (point)
+     *     geometry and the sketch feature.
+     * point - Called as each point is added.  Receives the new point geometry.
+     * done - Called when the point drawing is finished.  The callback will
+     *     recieve a single argument, the linestring geometry.
+     * cancel - Called when the handler is deactivated while drawing.  The
+     *     cancel callback will receive a geometry.
+     */
+    initialize: function(control, callbacks, options) {
+        OpenLayers.Handler.Point.prototype.initialize.apply(this, arguments);
+    },
+        
+    /**
+     * Method: createFeature
+     * Add temporary geometries
+     *
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} The initial pixel location for the new
+     *     feature.
+     */
+    createFeature: function(pixel) {
+        var lonlat = this.control.map.getLonLatFromPixel(pixel);
+        this.point = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat)
+        );
+        this.line = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.LineString([this.point.geometry])
+        );
+        this.callback("create", [this.point.geometry, this.getSketch()]);
+        this.point.geometry.clearBounds();
+        this.layer.addFeatures([this.line, this.point], {silent: true});
+    },
+        
+    /**
+     * Method: destroyFeature
+     * Destroy temporary geometries
+     */
+    destroyFeature: function() {
+        OpenLayers.Handler.Point.prototype.destroyFeature.apply(this);
+        this.line = null;
+    },
+
+    /**
+     * Method: removePoint
+     * Destroy the temporary point.
+     */
+    removePoint: function() {
+        if(this.point) {
+            this.layer.removeFeatures([this.point]);
+        }
+    },
+    
+    /**
+     * Method: addPoint
+     * Add point to geometry.  Send the point index to override
+     * the behavior of LinearRing that disregards adding duplicate points.
+     *
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} The pixel location for the new point.
+     */
+    addPoint: function(pixel) {
+        this.layer.removeFeatures([this.point]);
+        var lonlat = this.control.map.getLonLatFromPixel(pixel);
+        this.point = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat)
+        );
+        this.line.geometry.addComponent(
+            this.point.geometry, this.line.geometry.components.length
+        );
+        this.callback("point", [this.point.geometry, this.getGeometry()]);
+        this.callback("modify", [this.point.geometry, this.getSketch()]);
+        this.drawFeature();
+    },
+    
+    /**
+     * Method: freehandMode
+     * Determine whether to behave in freehand mode or not.
+     *
+     * Returns:
+     * {Boolean}
+     */
+    freehandMode: function(evt) {
+        return (this.freehandToggle && evt[this.freehandToggle]) ?
+                    !this.freehand : this.freehand;
+    },
+
+    /**
+     * Method: modifyFeature
+     * Modify the existing geometry given the new point
+     *
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} The updated pixel location for the latest
+     *     point.
+     */
+    modifyFeature: function(pixel) {
+        var lonlat = this.control.map.getLonLatFromPixel(pixel);
+        this.point.geometry.x = lonlat.lon;
+        this.point.geometry.y = lonlat.lat;
+        this.callback("modify", [this.point.geometry, this.getSketch()]);
+        this.point.geometry.clearBounds();
+        this.drawFeature();
+    },
+
+    /**
+     * Method: drawFeature
+     * Render geometries on the temporary layer.
+     */
+    drawFeature: function() {
+        this.layer.drawFeature(this.line, this.style);
+        this.layer.drawFeature(this.point, this.style);
+    },
+
+    /**
+     * Method: getSketch
+     * Return the sketch feature.
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>}
+     */
+    getSketch: function() {
+        return this.line;
+    },
+
+    /**
+     * Method: getGeometry
+     * Return the sketch geometry.  If <multi> is true, this will return
+     *     a multi-part geometry.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.LineString>}
+     */
+    getGeometry: function() {
+        var geometry = this.line && this.line.geometry;
+        if(geometry && this.multi) {
+            geometry = new OpenLayers.Geometry.MultiLineString([geometry]);
+        }
+        return geometry;
+    },
+
+    /**
+     * 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: 
+     * {Boolean} Allow event propagation
+     */
+    mousedown: function(evt) {
+        // ignore double-clicks
+        if (this.lastDown && this.lastDown.equals(evt.xy)) {
+            return false;
+        }
+        if(this.lastDown == null) {
+            if(this.persist) {
+                this.destroyFeature();
+            }
+            this.createFeature(evt.xy);
+        } else if((this.lastUp == null) || !this.lastUp.equals(evt.xy)) {
+            this.addPoint(evt.xy);
+        }
+        this.mouseDown = true;
+        this.lastDown = evt.xy;
+        this.drawing = true;
+        return false;
+    },
+
+    /**
+     * 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: 
+     * {Boolean} Allow event propagation
+     */
+    mousemove: function (evt) {
+        if(this.drawing) { 
+            if(this.mouseDown && this.freehandMode(evt)) {
+                this.addPoint(evt.xy);
+            } else {
+                this.modifyFeature(evt.xy);
+            }
+        }
+        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: 
+     * {Boolean} Allow event propagation
+     */
+    mouseup: function (evt) {
+        this.mouseDown = false;
+        if(this.drawing) {
+            if(this.freehandMode(evt)) {
+                this.removePoint();
+                this.finalize();
+            } else {
+                if(this.lastUp == null) {
+                   this.addPoint(evt.xy);
+                }
+                this.lastUp = evt.xy;
+            }
+            return false;
+        }
+        return true;
+    },
+  
+    /**
+     * Method: dblclick 
+     * Handle double-clicks.  Finish the geometry and send it back
+     * to the control.
+     * 
+     * Parameters:
+     * evt - {Event} The browser event
+     *
+     * Returns: 
+     * {Boolean} Allow event propagation
+     */
+    dblclick: function(evt) {
+        if(!this.freehandMode(evt)) {
+            var index = this.line.geometry.components.length - 1;
+            this.line.geometry.removeComponent(this.line.geometry.components[index]);
+            this.removePoint();
+            this.finalize();
+        }
+        return false;
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Path"
+});
diff --git a/lib/OpenLayers/Handler/Point.js b/lib/OpenLayers/Handler/Point.js
new file mode 100644
index 0000000..ed2e2e8
--- /dev/null
+++ b/lib/OpenLayers/Handler/Point.js
@@ -0,0 +1,373 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Handler.js
+ * @requires OpenLayers/Geometry/Point.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.Point
+ * Handler to draw a point on the map.  Point is displayed on mouse down,
+ *     moves on mouse move, and is finished on mouse up.  The handler triggers
+ *     callbacks for 'done', 'cancel', and 'modify'.  The modify callback is
+ *     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
+     */
+    point: null,
+
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer.Vector>} The temporary drawing layer
+     */
+    layer: null,
+    
+    /**
+     * APIProperty: multi
+     * {Boolean} Cast features to multi-part geometries before passing to the
+     *     layer.  Default is false.
+     */
+    multi: false,
+    
+    /**
+     * Property: drawing 
+     * {Boolean} A point is being drawn
+     */
+    drawing: false,
+    
+    /**
+     * Property: mouseDown
+     * {Boolean} The mouse is down
+     */
+    mouseDown: false,
+
+    /**
+     * Property: lastDown
+     * {<OpenLayers.Pixel>} Location of the last mouse down
+     */
+    lastDown: null,
+
+    /**
+     * Property: lastUp
+     * {<OpenLayers.Pixel>}
+     */
+    lastUp: null,
+
+    /**
+     * APIProperty: persist
+     * {Boolean} Leave the feature rendered until destroyFeature is called.
+     *     Default is false.  If set to true, the feature remains rendered until
+     *     destroyFeature is called, typically by deactivating the handler or
+     *     starting another drawing.
+     */
+    persist: false,
+
+    /**
+     * Property: layerOptions
+     * {Object} Any optional properties to be set on the sketch layer.
+     */
+    layerOptions: null,
+
+    /**
+     * Constructor: OpenLayers.Handler.Point
+     * Create a new point handler.
+     *
+     * Parameters:
+     * control - {<OpenLayers.Control>} The control that owns this handler
+     * callbacks - {Object} An object with a properties whose values are
+     *     functions.  Various callbacks described below.
+     * options - {Object} An optional object with properties to be set on the
+     *           handler
+     *
+     * Named callbacks:
+     * create - Called when a sketch is first created.  Callback called with
+     *     the creation point geometry and sketch feature.
+     * modify - Called with each move of a vertex with the vertex (point)
+     *     geometry and the sketch feature.
+     * done - Called when the point drawing is finished.  The callback will
+     *     recieve a single argument, the point geometry.
+     * cancel - Called when the handler is deactivated while drawing.  The
+     *     cancel callback will receive a geometry.
+     */
+    initialize: function(control, callbacks, options) {
+        if(!(options && options.layerOptions && options.layerOptions.styleMap)) {
+            this.style = OpenLayers.Util.extend(OpenLayers.Feature.Vector.style['default'], {});
+        }
+
+        OpenLayers.Handler.prototype.initialize.apply(this, arguments);
+    },
+    
+    /**
+     * APIMethod: activate
+     * turn on the handler
+     */
+    activate: function() {
+        if(!OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
+            return false;
+        }
+        // create temporary vector layer for rendering geometry sketch
+        // TBD: this could be moved to initialize/destroy - setting visibility here
+        var options = OpenLayers.Util.extend({
+            displayInLayerSwitcher: false,
+            // indicate that the temp vector layer will never be out of range
+            // without this, resolution properties must be specified at the
+            // map-level for this temporary layer to init its resolutions
+            // correctly
+            calculateInRange: OpenLayers.Function.True
+        }, this.layerOptions);
+        this.layer = new OpenLayers.Layer.Vector(this.CLASS_NAME, options);
+        this.map.addLayer(this.layer);
+        return true;
+    },
+    
+    /**
+     * Method: createFeature
+     * Add temporary features
+     *
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} A pixel location on the map.
+     */
+    createFeature: function(pixel) {
+        var lonlat = this.map.getLonLatFromPixel(pixel);
+        this.point = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat)
+        );
+        this.callback("create", [this.point.geometry, this.point]);
+        this.point.geometry.clearBounds();
+        this.layer.addFeatures([this.point], {silent: true});
+    },
+
+    /**
+     * APIMethod: deactivate
+     * turn off the handler
+     */
+    deactivate: function() {
+        if(!OpenLayers.Handler.prototype.deactivate.apply(this, arguments)) {
+            return false;
+        }
+        // call the cancel callback if mid-drawing
+        if(this.drawing) {
+            this.cancel();
+        }
+        this.destroyFeature();
+        // If a layer's map property is set to null, it means that that layer
+        // isn't added to the map. Since we ourself added the layer to the map
+        // in activate(), we can assume that if this.layer.map is null it means
+        // that the layer has been destroyed (as a result of map.destroy() for
+        // example.
+        if (this.layer.map != null) {
+            this.layer.destroy(false);
+        }
+        this.layer = null;
+        return true;
+    },
+    
+    /**
+     * Method: destroyFeature
+     * Destroy the temporary geometries
+     */
+    destroyFeature: function() {
+        if(this.layer) {
+            this.layer.destroyFeatures();
+        }
+        this.point = null;
+    },
+
+    /**
+     * Method: finalize
+     * Finish the geometry and call the "done" callback.
+     *
+     * Parameters:
+     * cancel - {Boolean} Call cancel instead of done callback.  Default is
+     *     false.
+     */
+    finalize: function(cancel) {
+        var key = cancel ? "cancel" : "done";
+        this.drawing = false;
+        this.mouseDown = false;
+        this.lastDown = null;
+        this.lastUp = null;
+        this.callback(key, [this.geometryClone()]);
+        if(cancel || !this.persist) {
+            this.destroyFeature();
+        }
+    },
+
+    /**
+     * APIMethod: cancel
+     * Finish the geometry and call the "cancel" callback.
+     */
+    cancel: function() {
+        this.finalize(true);
+    },
+
+    /**
+     * 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: 
+     * {Boolean} Allow event propagation
+     */
+    click: function(evt) {
+        OpenLayers.Event.stop(evt);
+        return false;
+    },
+
+    /**
+     * 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: 
+     * {Boolean} Allow event propagation
+     */
+    dblclick: function(evt) {
+        OpenLayers.Event.stop(evt);
+        return false;
+    },
+    
+    /**
+     * Method: modifyFeature
+     * Modify the existing geometry given a pixel location.
+     *
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} A pixel location on the map.
+     */
+    modifyFeature: function(pixel) {
+        var lonlat = this.map.getLonLatFromPixel(pixel);
+        this.point.geometry.x = lonlat.lon;
+        this.point.geometry.y = lonlat.lat;
+        this.callback("modify", [this.point.geometry, this.point]);
+        this.point.geometry.clearBounds();
+        this.drawFeature();
+    },
+
+    /**
+     * Method: drawFeature
+     * Render features on the temporary layer.
+     */
+    drawFeature: function() {
+        this.layer.drawFeature(this.point, this.style);
+    },
+    
+    /**
+     * Method: getGeometry
+     * Return the sketch geometry.  If <multi> is true, this will return
+     *     a multi-part geometry.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Point>}
+     */
+    getGeometry: function() {
+        var geometry = this.point && this.point.geometry;
+        if(geometry && this.multi) {
+            geometry = new OpenLayers.Geometry.MultiPoint([geometry]);
+        }
+        return geometry;
+    },
+
+    /**
+     * Method: geometryClone
+     * Return a clone of the relevant geometry.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry>}
+     */
+    geometryClone: function() {
+        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: 
+     * {Boolean} Allow event propagation
+     */
+    mousedown: function(evt) {
+        // check keyboard modifiers
+        if(!this.checkModifiers(evt)) {
+            return true;
+        }
+        // ignore double-clicks
+        if(this.lastDown && this.lastDown.equals(evt.xy)) {
+            return true;
+        }
+        this.drawing = true;
+        if(this.lastDown == null) {
+            if(this.persist) {
+                this.destroyFeature();
+            }
+            this.createFeature(evt.xy);
+        } else {
+            this.modifyFeature(evt.xy);
+        }
+        this.lastDown = evt.xy;
+        return false;
+    },
+
+    /**
+     * 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: 
+     * {Boolean} Allow event propagation
+     */
+    mousemove: function (evt) {
+        if(this.drawing) {
+            this.modifyFeature(evt.xy);
+        }
+        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: 
+     * {Boolean} Allow event propagation
+     */
+    mouseup: function (evt) {
+        if(this.drawing) {
+            this.finalize();
+            return false;
+        } else {
+            return true;
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Point"
+});
diff --git a/lib/OpenLayers/Handler/Polygon.js b/lib/OpenLayers/Handler/Polygon.js
new file mode 100644
index 0000000..1c4abde
--- /dev/null
+++ b/lib/OpenLayers/Handler/Polygon.js
@@ -0,0 +1,144 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Handler/Path.js
+ * @requires OpenLayers/Geometry/Polygon.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.Polygon
+ * Handler to draw a polygon on the map.  Polygon is displayed on mouse down,
+ * moves on mouse move, and is finished on mouse up.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Handler.Path>
+ *  - <OpenLayers.Handler>
+ */
+OpenLayers.Handler.Polygon = OpenLayers.Class(OpenLayers.Handler.Path, {
+    
+    /**
+     * Parameter: polygon
+     * {<OpenLayers.Feature.Vector>}
+     */
+    polygon: null,
+
+    /**
+     * Constructor: OpenLayers.Handler.Polygon
+     * Create a Polygon Handler.
+     *
+     * Parameters:
+     * control - {<OpenLayers.Control>} The control that owns this handler
+     * callbacks - {Object} An object with a properties whose values are
+     *     functions.  Various callbacks described below.
+     * options - {Object} An optional object with properties to be set on the
+     *           handler
+     *
+     * Named callbacks:
+     * create - Called when a sketch is first created.  Callback called with
+     *     the creation point geometry and sketch feature.
+     * modify - Called with each move of a vertex with the vertex (point)
+     *     geometry and the sketch feature.
+     * point - Called as each point is added.  Receives the new point geometry.
+     * done - Called when the point drawing is finished.  The callback will
+     *     recieve a single argument, the polygon geometry.
+     * cancel - Called when the handler is deactivated while drawing.  The
+     *     cancel callback will receive a geometry.
+     */
+    initialize: function(control, callbacks, options) {
+        OpenLayers.Handler.Path.prototype.initialize.apply(this, arguments);
+    },
+    
+    /**
+     * Method: createFeature
+     * Add temporary geometries
+     *
+     * Parameters:
+     * pixel - {<OpenLayers.Pixel>} The initial pixel location for the new
+     *     feature.
+     */
+    createFeature: function(pixel) {
+        var lonlat = this.control.map.getLonLatFromPixel(pixel);
+        this.point = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat)
+        );
+        this.line = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.LinearRing([this.point.geometry])
+        );
+        this.polygon = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Polygon([this.line.geometry])
+        );
+        this.callback("create", [this.point.geometry, this.getSketch()]);
+        this.point.geometry.clearBounds();
+        this.layer.addFeatures([this.polygon, this.point], {silent: true});
+    },
+
+    /**
+     * Method: destroyFeature
+     * Destroy temporary geometries
+     */
+    destroyFeature: function() {
+        OpenLayers.Handler.Path.prototype.destroyFeature.apply(this);
+        this.polygon = null;
+    },
+
+    /**
+     * Method: drawFeature
+     * Render geometries on the temporary layer.
+     */
+    drawFeature: function() {
+        this.layer.drawFeature(this.polygon, this.style);
+        this.layer.drawFeature(this.point, this.style);
+    },
+    
+    /**
+     * Method: getSketch
+     * Return the sketch feature.
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>}
+     */
+    getSketch: function() {
+        return this.polygon;
+    },
+
+    /**
+     * Method: getGeometry
+     * Return the sketch geometry.  If <multi> is true, this will return
+     *     a multi-part geometry.
+     *
+     * Returns:
+     * {<OpenLayers.Geometry.Polygon>}
+     */
+    getGeometry: function() {
+        var geometry = this.polygon && this.polygon.geometry;
+        if(geometry && this.multi) {
+            geometry = new OpenLayers.Geometry.MultiPolygon([geometry]);
+        }
+        return geometry;
+    },
+
+    /**
+     * Method: dblclick
+     * Handle double-clicks.  Finish the geometry and send it back
+     * to the control.
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    dblclick: function(evt) {
+        if(!this.freehandMode(evt)) {
+            // remove the penultimate point
+            var index = this.line.geometry.components.length - 2;
+            this.line.geometry.removeComponent(this.line.geometry.components[index]);
+            this.removePoint();
+            this.finalize();
+        }
+        return false;
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.Polygon"
+});
diff --git a/lib/OpenLayers/Handler/RegularPolygon.js b/lib/OpenLayers/Handler/RegularPolygon.js
new file mode 100644
index 0000000..e5b248a
--- /dev/null
+++ b/lib/OpenLayers/Handler/RegularPolygon.js
@@ -0,0 +1,421 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Handler/Drag.js
+ */
+
+/**
+ * Class: OpenLayers.Handler.RegularPolygon
+ * Handler to draw a regular polygon on the map.  Polygon is displayed on mouse
+ *     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
+     *     than 2.  Defaults to 4.
+     */
+    sides: 4,
+
+    /**
+     * APIProperty: radius
+     * {Float} Optional radius in map units of the regular polygon.  If this is
+     *     set to some non-zero value, a polygon with a fixed radius will be
+     *     drawn and dragged with mose movements.  If this property is not
+     *     set, dragging changes the radius of the polygon.  Set to null by
+     *     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.  
+     */
+    snapAngle: null,
+    
+    /**
+     * APIProperty: snapToggle
+     * {String} If set, snapToggle is checked on mouse events and will set
+     *     the snap mode to the opposite of what it currently is.  To disallow
+     *     toggling between snap and non-snap mode, set freehandToggle to
+     *     null.  Acceptable toggle values are 'shiftKey', 'ctrlKey', and
+     *     'altKey'. Snap mode is only possible if this.snapAngle is set to a
+     *     non-zero value.
+     */
+    snapToggle: 'shiftKey',
+    
+    /**
+     * Property: layerOptions
+     * {Object} Any optional properties to be set on the sketch layer.
+     */
+    layerOptions: null,
+
+    /**
+     * APIProperty: persist
+     * {Boolean} Leave the feature rendered until clear is called.  Default
+     *     is false.  If set to true, the feature remains rendered until
+     *     clear is called, typically by deactivating the handler or starting
+     *     another drawing.
+     */
+    persist: false,
+
+    /**
+     * APIProperty: irregular
+     * {Boolean} Draw an irregular polygon instead of a regular polygon.
+     *     Default is false.  If true, the initial mouse down will represent
+     *     one corner of the polygon bounds and with each mouse movement, the
+     *     polygon will be stretched so the opposite corner of its bounds
+     *     follows the mouse position.  This property takes precedence over
+     *     the radius property.  If set to true, the radius property will
+     *     be ignored.
+     */
+    irregular: false,
+
+    /**
+     * Property: angle
+     * {Float} The angle from the origin (mouse down) to the current mouse
+     *     position, in radians.  This is measured counterclockwise from the
+     *     positive x-axis.
+     */
+    angle: null,
+
+    /**
+     * Property: fixedRadius
+     * {Boolean} The polygon has a fixed radius.  True if a radius is set before
+     *     drawing begins.  False otherwise.
+     */
+    fixedRadius: false,
+
+    /**
+     * Property: feature
+     * {<OpenLayers.Feature.Vector>} The currently drawn polygon feature
+     */
+    feature: null,
+
+    /**
+     * Property: layer
+     * {<OpenLayers.Layer.Vector>} The temporary drawing layer
+     */
+    layer: null,
+
+    /**
+     * Property: origin
+     * {<OpenLayers.Geometry.Point>} Location of the first mouse down
+     */
+    origin: null,
+
+    /**
+     * Constructor: OpenLayers.Handler.RegularPolygon
+     * Create a new regular polygon handler.
+     *
+     * Parameters:
+     * control - {<OpenLayers.Control>} The control that owns this handler
+     * callbacks - {Object} An object with a properties whose values are
+     *     functions.  Various callbacks described below.
+     * options - {Object} An object with properties to be set on the handler.
+     *     If the options.sides property is not specified, the number of sides
+     *     will default to 4.
+     *
+     * Named callbacks:
+     * create - Called when a sketch is first created.  Callback called with
+     *     the creation point geometry and sketch feature.
+     * done - Called when the sketch drawing is finished.  The callback will
+     *     recieve a single argument, the sketch geometry.
+     * cancel - Called when the handler is deactivated while drawing.  The
+     *     cancel callback will receive a geometry.
+     */
+    initialize: function(control, callbacks, options) {
+        if(!(options && options.layerOptions && options.layerOptions.styleMap)) {
+            this.style = OpenLayers.Util.extend(OpenLayers.Feature.Vector.style['default'], {});
+        }
+
+        OpenLayers.Handler.prototype.initialize.apply(this,
+                                                [control, callbacks, options]);
+        this.options = (options) ? options : {};
+    },
+    
+    /**
+     * APIMethod: setOptions
+     * 
+     * Parameters:
+     * newOptions - {Object} 
+     */
+    setOptions: function (newOptions) {
+        OpenLayers.Util.extend(this.options, newOptions);
+        OpenLayers.Util.extend(this, newOptions);
+    },
+    
+    /**
+     * APIMethod: activate
+     * Turn on the handler.
+     *
+     * Return:
+     * {Boolean} The handler was successfully activated
+     */
+    activate: function() {
+        var activated = false;
+        if(OpenLayers.Handler.prototype.activate.apply(this, arguments)) {
+            // create temporary vector layer for rendering geometry sketch
+            var options = OpenLayers.Util.extend({
+                displayInLayerSwitcher: false,
+                // indicate that the temp vector layer will never be out of range
+                // without this, resolution properties must be specified at the
+                // map-level for this temporary layer to init its resolutions
+                // correctly
+                calculateInRange: OpenLayers.Function.True
+            }, this.layerOptions);
+            this.layer = new OpenLayers.Layer.Vector(this.CLASS_NAME, options);
+            this.map.addLayer(this.layer);
+            activated = true;
+        }
+        return activated;
+    },
+
+    /**
+     * APIMethod: deactivate
+     * Turn off the handler.
+     *
+     * Return:
+     * {Boolean} The handler was successfully deactivated
+     */
+    deactivate: function() {
+        var deactivated = false;
+        if(OpenLayers.Handler.Drag.prototype.deactivate.apply(this, arguments)) {
+            // call the cancel callback if mid-drawing
+            if(this.dragging) {
+                this.cancel();
+            }
+            // If a layer's map property is set to null, it means that that
+            // layer isn't added to the map. Since we ourself added the layer
+            // to the map in activate(), we can assume that if this.layer.map
+            // is null it means that the layer has been destroyed (as a result
+            // of map.destroy() for example.
+            if (this.layer.map != null) {
+                this.layer.destroy(false);
+                if (this.feature) {
+                    this.feature.destroy();
+                }
+            }
+            this.layer = null;
+            this.feature = null;
+            deactivated = true;
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: down
+     * Start drawing a new feature
+     *
+     * Parameters:
+     * evt - {Event} The drag start event
+     */
+    down: function(evt) {
+        this.fixedRadius = !!(this.radius);
+        var maploc = this.map.getLonLatFromPixel(evt.xy);
+        this.origin = new OpenLayers.Geometry.Point(maploc.lon, maploc.lat);
+        // create the new polygon
+        if(!this.fixedRadius || this.irregular) {
+            // smallest radius should not be less one pixel in map units
+            // VML doesn't behave well with smaller
+            this.radius = this.map.getResolution();
+        }
+        if(this.persist) {
+            this.clear();
+        }
+        this.feature = new OpenLayers.Feature.Vector();
+        this.createGeometry();
+        this.callback("create", [this.origin, this.feature]);
+        this.layer.addFeatures([this.feature], {silent: true});
+        this.layer.drawFeature(this.feature, this.style);
+    },
+    
+    /**
+     * Method: move
+     * Respond to drag move events
+     *
+     * Parameters:
+     * evt - {Evt} The move event
+     */
+    move: function(evt) {
+        var maploc = this.map.getLonLatFromPixel(evt.xy);
+        var point = new OpenLayers.Geometry.Point(maploc.lon, maploc.lat);
+        if(this.irregular) {
+            var ry = Math.sqrt(2) * Math.abs(point.y - this.origin.y) / 2;
+            this.radius = Math.max(this.map.getResolution() / 2, ry);
+        } else if(this.fixedRadius) {
+            this.origin = point;
+        } else {
+            this.calculateAngle(point, evt);
+            this.radius = Math.max(this.map.getResolution() / 2,
+                                   point.distanceTo(this.origin));
+        }
+        this.modifyGeometry();
+        if(this.irregular) {
+            var dx = point.x - this.origin.x;
+            var dy = point.y - this.origin.y;
+            var ratio;
+            if(dy == 0) {
+                ratio = dx / (this.radius * Math.sqrt(2));
+            } else {
+                ratio = dx / dy;
+            }
+            this.feature.geometry.resize(1, this.origin, ratio);
+            this.feature.geometry.move(dx / 2, dy / 2);
+        }
+        this.layer.drawFeature(this.feature, this.style);
+    },
+
+    /**
+     * Method: up
+     * Finish drawing the feature
+     *
+     * Parameters:
+     * evt - {Event} The mouse up event
+     */
+    up: function(evt) {
+        this.finalize();
+        // the mouseup method of superclass doesn't call the
+        // "done" callback if there's been no move between
+        // down and up
+        if (this.start == this.last) {
+            this.callback("done", [evt.xy]);
+        }
+    },
+
+    /**
+     * Method: out
+     * Finish drawing the feature.
+     *
+     * Parameters:
+     * evt - {Event} The mouse out event
+     */
+    out: function(evt) {
+        this.finalize();
+    },
+
+    /**
+     * Method: createGeometry
+     * Create the new polygon geometry.  This is called at the start of the
+     *     drag and at any point during the drag if the number of sides
+     *     changes.
+     */
+    createGeometry: function() {
+        this.angle = Math.PI * ((1/this.sides) - (1/2));
+        if(this.snapAngle) {
+            this.angle += this.snapAngle * (Math.PI / 180);
+        }
+        this.feature.geometry = OpenLayers.Geometry.Polygon.createRegularPolygon(
+            this.origin, this.radius, this.sides, this.snapAngle
+        );
+    },
+    
+    /**
+     * Method: modifyGeometry
+     * Modify the polygon geometry in place.
+     */
+    modifyGeometry: function() {
+        var angle, point;
+        var ring = this.feature.geometry.components[0];
+        // if the number of sides ever changes, create a new geometry
+        if(ring.components.length != (this.sides + 1)) {
+            this.createGeometry();
+            ring = this.feature.geometry.components[0];
+        }
+        for(var i=0; i<this.sides; ++i) {
+            point = ring.components[i];
+            angle = this.angle + (i * 2 * Math.PI / this.sides);
+            point.x = this.origin.x + (this.radius * Math.cos(angle));
+            point.y = this.origin.y + (this.radius * Math.sin(angle));
+            point.clearBounds();
+        }
+    },
+    
+    /**
+     * Method: calculateAngle
+     * Calculate the angle based on settings.
+     *
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point>}
+     * evt - {Event}
+     */
+    calculateAngle: function(point, evt) {
+        var alpha = Math.atan2(point.y - this.origin.y,
+                               point.x - this.origin.x);
+        if(this.snapAngle && (this.snapToggle && !evt[this.snapToggle])) {
+            var snapAngleRad = (Math.PI / 180) * this.snapAngle;
+            this.angle = Math.round(alpha / snapAngleRad) * snapAngleRad;
+        } else {
+            this.angle = alpha;
+        }
+    },
+
+    /**
+     * APIMethod: cancel
+     * Finish the geometry and call the "cancel" callback.
+     */
+    cancel: function() {
+        // the polygon geometry gets cloned in the callback method
+        this.callback("cancel", null);
+        this.finalize();
+    },
+
+    /**
+     * Method: finalize
+     * Finish the geometry and call the "done" callback.
+     */
+    finalize: function() {
+        this.origin = null;
+        this.radius = this.options.radius;
+    },
+
+    /**
+     * APIMethod: clear
+     * Clear any rendered features on the temporary layer.  This is called
+     *     when the handler is deactivated, canceled, or done (unless persist
+     *     is true).
+     */
+    clear: function() {
+        if (this.layer) {
+            this.layer.renderer.clear();
+            this.layer.destroyFeatures();
+        }
+    },
+    
+    /**
+     * Method: callback
+     * Trigger the control's named callback with the given arguments
+     *
+     * 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 with which to call the callback
+     *     (defined by the control).
+     */
+    callback: function (name, args) {
+        // override the callback method to always send the polygon geometry
+        if (this.callbacks[name]) {
+            this.callbacks[name].apply(this.control,
+                                       [this.feature.geometry.clone()]);
+        }
+        // since sketch features are added to the temporary layer
+        // they must be cleared here if done or cancel
+        if(!this.persist && (name == "done" || name == "cancel")) {
+            this.clear();
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Handler.RegularPolygon"
+});
diff --git a/lib/OpenLayers/Icon.js b/lib/OpenLayers/Icon.js
new file mode 100644
index 0000000..0977ba6
--- /dev/null
+++ b/lib/OpenLayers/Icon.js
@@ -0,0 +1,227 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * 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 
+ * 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. 
+ * 
+ */
+OpenLayers.Icon = OpenLayers.Class({
+    
+    /** 
+     * Property: url 
+     * {String}  image url
+     */
+    url: null,
+    
+    /** 
+     * Property: size 
+     * {<OpenLayers.Size>} 
+     */
+    size: null,
+
+    /** 
+     * 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) 
+     */
+    calculateOffset: null,    
+    
+    /** 
+     * Property: imageDiv 
+     * {DOMElement} 
+     */
+    imageDiv: null,
+
+    /** 
+     * Property: px 
+     * {<OpenLayers.Pixel>} 
+     */
+    px: null,
+    
+    /** 
+     * Constructor: OpenLayers.Icon
+     * Creates an icon, which is an image tag in a div.  
+     *
+     * url - {String} 
+     * size - {<OpenLayers.Size>} 
+     * offset - {<OpenLayers.Pixel>}
+     * calculateOffset - {Function} 
+     */
+    initialize: function(url, size, offset, calculateOffset) {
+        this.url = url;
+        this.size = (size) ? size : new OpenLayers.Size(20,20);
+        this.offset = offset ? offset : new OpenLayers.Pixel(-(this.size.w/2), -(this.size.h/2));
+        this.calculateOffset = calculateOffset;
+
+        var id = OpenLayers.Util.createUniqueID("OL_Icon_");
+        this.imageDiv = OpenLayers.Util.createAlphaImageDiv(id);
+    },
+    
+    /** 
+     * Method: destroy
+     * 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); 
+        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, 
+                                   this.calculateOffset);
+    },
+    
+    /**
+     * Method: setSize
+     * 
+     * Parameters:
+     * size - {<OpenLayers.Size>} 
+     */
+    setSize: function(size) {
+        if (size != null) {
+            this.size = size;
+        }
+        this.draw();
+    },
+    
+    /**
+     * Method: setUrl
+     * 
+     * Parameters:
+     * url - {String} 
+     */
+    setUrl: function(url) {
+        if (url != null) {
+            this.url = url;
+        }
+        this.draw();
+    },
+
+    /** 
+     * Method: draw
+     * Move the div to the given pixel.
+     * 
+     * Parameters:
+     * 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, 
+                                            "absolute");
+        this.moveTo(px);
+        return this.imageDiv;
+    }, 
+
+    /** 
+     * Method: erase
+     * Erase the underlying image element.
+     *
+     */
+    erase: function() {
+        if (this.imageDiv != null && this.imageDiv.parentNode != null) {
+            OpenLayers.Element.remove(this.imageDiv);
+        }
+    }, 
+    
+    /** 
+     * Method: setOpacity
+     * Change the icon's opacity
+     *
+     * Parameters:
+     * opacity - {float} 
+     */
+    setOpacity: function(opacity) {
+        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>} 
+     */
+    moveTo: function (px) {
+        //if no px passed in, use stored location
+        if (px != null) {
+            this.px = px;
+        }
+
+        if (this.imageDiv != null) {
+            if (this.px == null) {
+                this.display(false);
+            } else {
+                if (this.calculateOffset) {
+                    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: function(display) {
+        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));    
+
+        return isDrawn;   
+    },
+
+    CLASS_NAME: "OpenLayers.Icon"
+});
diff --git a/lib/OpenLayers/Lang.js b/lib/OpenLayers/Lang.js
new file mode 100644
index 0000000..03738bb
--- /dev/null
+++ b/lib/OpenLayers/Lang.js
@@ -0,0 +1,133 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang
+ * Internationalization namespace.  Contains dictionaries in various languages
+ *     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
+     *     retrieve it.
+     */
+    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.
+     *
+     * Returns:
+     * The current language code.
+     */
+    getCode: function() {
+        if(!OpenLayers.Lang.code) {
+            OpenLayers.Lang.setCode();
+        }
+        return OpenLayers.Lang.code;
+    },
+    
+    /**
+     * APIFunction: setCode
+     * Set the language code for string translation.  This code is used by
+     *     the <OpenLayers.Lang.translate> method.
+     *
+     * Parameters-
+     * code - {String} These codes follow the IETF recommendations at
+     *     http://www.ietf.org/rfc/rfc3066.txt.  If no value is set, the
+     *     browser's language setting will be tested.  If no <OpenLayers.Lang>
+     *     dictionary exists for the code, the <OpenLayers.String.defaultLang>
+     *     will be used.
+     */
+    setCode: function(code) {
+        var lang;
+        if(!code) {
+            code = (OpenLayers.Util.getBrowserName() == "msie") ?
+                navigator.userLanguage : navigator.language;
+        }
+        var parts = code.split('-');
+        parts[0] = parts[0].toLowerCase();
+        if(typeof OpenLayers.Lang[parts[0]] == "object") {
+            lang = parts[0];
+        }
+
+        // check for regional extensions
+        if(parts[1]) {
+            var testLang = parts[0] + '-' + parts[1].toUpperCase();
+            if(typeof OpenLayers.Lang[testLang] == "object") {
+                lang = testLang;
+            }
+        }
+        if(!lang) {
+            OpenLayers.Console.warn(
+                'Failed to find OpenLayers.Lang.' + parts.join("-") +
+                ' dictionary, falling back to default language'
+            );
+            lang = OpenLayers.Lang.defaultCode;
+        }
+        
+        OpenLayers.Lang.code = lang;
+    },
+
+    /**
+     * APIMethod: translate
+     * Looks up a key from a dictionary based on the current language string.
+     *     The value of <getCode> will be used to determine the appropriate
+     *     dictionary.  Dictionaries are stored in <OpenLayers.Lang>.
+     *
+     * Parameters:
+     * 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.
+     */
+    translate: function(key, context) {
+        var dictionary = OpenLayers.Lang[OpenLayers.Lang.getCode()];
+        var message = dictionary[key];
+        if(!message) {
+            // Message not found, fall back to message key
+            message = key;
+        }
+        if(context) {
+            message = OpenLayers.String.format(message, context);
+        }
+        return message;
+    }
+    
+};
+
+
+/**
+ * APIMethod: OpenLayers.i18n
+ * Alias for <OpenLayers.Lang.translate>.  Looks up a key from a dictionary
+ *     based on the current language string. The value of
+ *     <OpenLayers.Lang.getCode> will be used to determine the appropriate
+ *     dictionary.  Dictionaries are stored in <OpenLayers.Lang>.
+ *
+ * Parameters:
+ * 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.
+ */
+OpenLayers.i18n = OpenLayers.Lang.translate;
diff --git a/lib/OpenLayers/Lang/ar.js b/lib/OpenLayers/Lang/ar.js
new file mode 100644
index 0000000..17d9bef
--- /dev/null
+++ b/lib/OpenLayers/Lang/ar.js
@@ -0,0 +1,38 @@
+/* Translators (2009 onwards):
+ *  - Meno25
+ *  - Mutarjem horr
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["ar"]
+ * Dictionary for العربية.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["ar"] = OpenLayers.Util.applyDefaults({
+
+    'permalink': "وصلة دائمة",
+
+    'baseLayer': "الطبقة الاساسية",
+
+    'readNotImplemented': "القراءة غير محققة.",
+
+    'writeNotImplemented': "الكتابة غير محققة",
+
+    'errorLoadingGML': "خطأ عند تحميل الملف جي ام ال ${url}",
+
+    'scale': "النسبة = 1 : ${scaleDenom}",
+
+    'W': "غ",
+
+    'E': "شر",
+
+    'N': "شم",
+
+    'S': "ج"
+
+});
diff --git a/lib/OpenLayers/Lang/be-tarask.js b/lib/OpenLayers/Lang/be-tarask.js
new file mode 100644
index 0000000..f0db8a0
--- /dev/null
+++ b/lib/OpenLayers/Lang/be-tarask.js
@@ -0,0 +1,80 @@
+/* Translators (2009 onwards):
+ *  - EugeneZelenko
+ *  - Jim-by
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["be-tarask"]
+ * Dictionary for Беларуская (тарашкевіца).  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["be-tarask"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Неапрацаваны вынік запыту ${statusText}",
+
+    'permalink': "Сталая спасылка",
+
+    'overlays': "Слаі",
+
+    'baseLayer': "Базавы слой",
+
+    'sameProjection': "Аглядная мапа працуе толькі калі яна мае тую ж праекцыю, што і асноўная мапа",
+
+    'readNotImplemented': "Функцыянальнасьць чытаньня ня створаная.",
+
+    'writeNotImplemented': "Функцыянальнасьць запісу ня створаная.",
+
+    'noFID': "Немагчыма абнавіць магчымасьць, для якога не існуе FID.",
+
+    'errorLoadingGML': "Памылка загрузкі файла GML ${url}",
+
+    'browserNotSupported': "Ваш браўзэр не падтрымлівае вэктарную графіку. У цяперашні момант падтрымліваюцца: ${renderers}",
+
+    'componentShouldBe': "addFeatures : кампанэнт павінен быць ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent выкліканы для слоя бяз рэндэру. Звычайна гэта азначае, што Вы зьнішчылі слой, але пакінулі зьвязаны зь ім апрацоўшчык.",
+
+    'minZoomLevelError': "Уласьцівасьць minZoomLevel прызначана толькі для выкарыстаньня са слаямі вытворнымі ад FixedZoomLevels. Тое, што  гэты wfs-слой правяраецца на minZoomLevel — рэха прошлага. Але мы ня можам выдаліць гэтую магчымасьць, таму што ад яе залежаць некаторыя заснаваныя на OL дастасаваньні. Тым ня менш, праверка minZoomLevel будзе выдаленая ў вэрсіі 3.0. Калі ласка, выкарыстоўваеце замест яе ўстаноўкі мінімальнага/максымальнага памераў, як апісана тут: http://trac.openla [...]
+
+    'commitSuccess': "WFS-транзакцыя: ПОСЬПЕХ ${response}",
+
+    'commitFailed': "WFS-транзакцыя: ПАМЫЛКА ${response}",
+
+    'googleWarning': "Не атрымалася загрузіць слой Google. \x3cbr\x3e\x3cbr\x3eКаб пазбавіцца гэтага паведамленьня, выберыце новы базавы слой у сьпісе ў верхнім правым куце.\x3cbr\x3e\x3cbr\x3e Хутчэй за ўсё, прычына ў тым, што скрыпт бібліятэкі Google Maps ня быў уключаныя альбо не ўтрымлівае слушны API-ключ для Вашага сайта.\x3cbr\x3e\x3cbr\x3eРаспрацоўшчыкам: Для таго, каб даведацца як зрабіць так, каб усё працавала, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blan [...]
+
+    'getLayerWarning': "Немагчыма загрузіць слой ${layerType}.\x3cbr\x3e\x3cbr\x3eКаб пазбавіцца гэтага паведамленьня, выберыце новы базавы слой у сьпісе ў верхнім правым куце.\x3cbr\x3e\x3cbr\x3eХутчэй за ўсё, прычына ў тым, што скрыпт бібліятэкі ${layerLib} ня быў слушна ўключаны.\x3cbr\x3e\x3cbr\x3eРаспрацоўшчыкам: Для таго, каб даведацца як зрабіць так, каб усё працавала, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eнацісьніце тут\x3c/a\x3e",
+
+    'scale': "Маштаб = 1 : ${scaleDenom}",
+
+    'W': "З",
+
+    'E': "У",
+
+    'N': "Пн",
+
+    'S': "Пд",
+
+    'layerAlreadyAdded': "Вы паспрабавалі дадаць слой ${layerName} на мапу, але ён ужо дададзены",
+
+    'reprojectDeprecated': "Вы выкарыстоўваеце ўстаноўку \'reproject\' для слоя ${layerName}. Гэтая ўстаноўка зьяўляецца састарэлай: яна выкарыстоўвалася для падтрымкі паказу зьвестак на камэрцыйных базавых мапах, але гэта функцыя цяпер рэалізаваная ў убудаванай падтрымцы сфэрычнай праекцыі Мэркатара. Дадатковая інфармацыя ёсьць на http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Гэты мэтад састарэлы і будзе выдалены ў вэрсіі 3.0. Калі ласка, замест яго выкарыстоўвайце ${newMethod}.",
+
+    'boundsAddError': "Вам неабходна падаць абодва значэньні x і y для функцыі складаньня.",
+
+    'lonlatAddError': "Вам неабходна падаць абодва значэньні lon і lat для функцыі складаньня.",
+
+    'pixelAddError': "Вам неабходна падаць абодва значэньні x і y для функцыі складаньня.",
+
+    'unsupportedGeometryType': "Тып геамэтрыі не падтрымліваецца: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition failed: верагодна элемэнт з ідэнтыфікатарам ${elemId} займае няслушнае месца.",
+
+    'filterEvaluateNotImplemented': "evaluate не рэалізаваны для гэтага тыпу фільтру."
+
+});
diff --git a/lib/OpenLayers/Lang/bg.js b/lib/OpenLayers/Lang/bg.js
new file mode 100644
index 0000000..97a1ae6
--- /dev/null
+++ b/lib/OpenLayers/Lang/bg.js
@@ -0,0 +1,29 @@
+/* Translators (2009 onwards):
+ *  - DCLXVI
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["bg"]
+ * Dictionary for Български.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["bg"] = OpenLayers.Util.applyDefaults({
+
+    'permalink': "Постоянна препратка",
+
+    'baseLayer': "Основен слой",
+
+    'errorLoadingGML': "Грешка при зареждане на GML файл ${url}",
+
+    'scale': "Мащаб = 1 : ${scaleDenom}",
+
+    'layerAlreadyAdded': "Опитахте да добавите слой ${layerName} в картата, но той вече е добавен",
+
+    'methodDeprecated': "Този метод е остарял и ще бъде премахват в 3.0. Вместо него използвайте ${newMethod}."
+
+});
diff --git a/lib/OpenLayers/Lang/br.js b/lib/OpenLayers/Lang/br.js
new file mode 100644
index 0000000..59feb34
--- /dev/null
+++ b/lib/OpenLayers/Lang/br.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - Fulup
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["br"]
+ * Dictionary for Brezhoneg.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["br"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Distro evel reked anveret ${statusText}",
+
+    'permalink': "Peurliamm",
+
+    'overlays': "Gwiskadoù",
+
+    'baseLayer': "Gwiskad diazez",
+
+    'sameProjection': "Ne\'z ar gartenn lec\'hiañ en-dro nemet pa vez heñvel ar banndres anezhi ha hini ar gartenn bennañ",
+
+    'readNotImplemented': "N\'eo ket emplementet al lenn.",
+
+    'writeNotImplemented': "N\'eo ket emplementet ar skrivañ.",
+
+    'noFID': "N\'haller ket hizivaat un elfenn ma n\'eus ket a niverenn-anaout (FID) eviti.",
+
+    'errorLoadingGML': "Fazi e-ser kargañ ar restr GML ${url}",
+
+    'browserNotSupported': "N\'eo ket skoret an daskor vektorel gant ho merdeer. Setu aze an daskorerioù skoret evit ar poent :\n${renderers}",
+
+    'componentShouldBe': "addFeatures : bez\' e tlefe ar parzh besañ eus ar seurt ${geomType}",
+
+    'getFeatureError': "Galvet eo bet getFeatureFromEvent called war ur gwiskad hep daskorer. Kement-se a dalvez ez eus bet freuzet ur gwiskad hag hoc\'h eus miret un embreger bennak stag outañ.",
+
+    'minZoomLevelError': "Ne zleer implijout ar perzh minZoomLevel nemet evit gwiskadoù FixedZoomLevels-descendent. Ar fed ma wiria ar gwiskad WHS-se hag-eñ ez eus eus minZoomLevel zo un aspadenn gozh. Koulskoude n\'omp ket evit e ziverkañ kuit da derriñ arloadoù diazezet war OL a c\'hallfe bezañ stag outañ. Setu perak eo dispredet -- Lamet kuit e vo ar gwiriañ minZoomLevel a-is er stumm 3.0. Ober gant an arventennoù bihanañ/brasañ evel deskrivet amañ e plas : http://trac.openlayers.org/ [...]
+
+    'commitSuccess': "Treuzgread WFS : MAT EO ${response}",
+
+    'commitFailed': "Treuzgread WFS Transaction: C\'HWITET ${response}",
+
+    'googleWarning': "N\'eus ket bet gallet kargañ ar gwiskad Google ent reizh.\x3cbr\x3e\x3cbr\x3eEvit en em zizober eus ar c\'hemenn-mañ, dibabit ur BaseLayer nevez en diuzer gwiskadoù er c\'horn dehoù el laez.\x3cbr\x3e\x3cbr\x3eSur a-walc\'h eo peogwir n\'eo ket bet ensoc\'het levraoueg Google Maps pe neuze ne glot ket an alc\'hwez API gant ho lec\'hienn.\x3cbr\x3e\x3cbr\x3eDiorroerien : Evit reizhañ an dra-se, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x [...]
+
+    'getLayerWarning': "N\'haller ket kargañ ar gwiskad ${layerType} ent reizh.\x3cbr\x3e\x3cbr\x3eEvit en em zizober eus ar c\'hemenn-mañ, dibabit ur BaseLayer nevez en diuzer gwiskadoù er c\'horn dehoù el laez.\x3cbr\x3e\x3cbr\x3eSur a-walc\'h eo peogwir n\'eo ket bet ensoc\'het mat al levraoueg ${layerLib}.\x3cbr\x3e\x3cbr\x3eDiorroerien : Evit gouzout penaos reizhañ an dra-se, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclick here\x3c/a\x3e",
+
+    'scale': "Skeul = 1 : ${scaleDenom}",
+
+    'W': "K",
+
+    'E': "R",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Klasket hoc\'h eus ouzhpennañ ar gwiskad : ${layerName} d\'ar gartenn, met ouzhpennet e oa bet c\'hoazh",
+
+    'reprojectDeprecated': "Emaoc\'h oc\'h implijout an dibarzh \'reproject\' war ar gwiskad ${layerName}. Dispredet eo an dibarzh-mañ : bet eo hag e talveze da ziskwel roadennoù war-c\'horre kartennoù diazez kenwerzhel, un dra hag a c\'haller ober bremañ gant an arc\'hwel dre skor banndres boullek Mercator. Muioc\'h a ditouroù a c\'haller da gaout war http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Dispredet eo an daore-se ha tennet e vo kuit eus ar stumm 3.0. Grit gant ${newMethod} e plas.",
+
+    'boundsAddError': "Rekis eo tremen an div dalvoudenn x ha y d\'an arc\'hwel add.",
+
+    'lonlatAddError': "Rekis eo tremen an div dalvoudenn hedred ha ledred d\'an arc\'hwel add.",
+
+    'pixelAddError': "Rekis eo tremen an div dalvoudenn x ha y d\'an arc\'hwel add.",
+
+    'unsupportedGeometryType': "Seurt mentoniezh anskoret : ${geomType}",
+
+    'pagePositionFailed': "C\'hwitet eo OpenLayers.Util.pagePosition : marteze emañ lec\'hiet fall an elfenn id ${elemId}.",
+
+    'filterEvaluateNotImplemented': "N\'eo ket bet emplementet ar priziañ evit seurt siloù c\'hoazh."
+
+});
diff --git a/lib/OpenLayers/Lang/ca.js b/lib/OpenLayers/Lang/ca.js
new file mode 100644
index 0000000..96a4794
--- /dev/null
+++ b/lib/OpenLayers/Lang/ca.js
@@ -0,0 +1,128 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["ca"]
+ * Dictionary for Catalan, UTF8 encoding. Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang.ca = {
+
+    'unhandledRequest': "Resposta a petició no gestionada ${statusText}",
+
+    'permalink': "Enllaç permanent",
+
+    'overlays': "Capes addicionals",
+
+    'baseLayer': "Capa Base",
+
+    'sameProjection':
+        "El mapa de referència només funciona si té la mateixa projecció que el mapa principal",
+
+    'readNotImplemented': "Lectura no implementada.",
+
+    'writeNotImplemented': "Escriptura no implementada.",
+
+    'noFID': "No es pot actualitzar un element per al que no existeix FID.",
+
+    'errorLoadingGML': "Error carregant el fitxer GML ${url}",
+
+    'browserNotSupported':
+        "El seu navegador no suporta renderització vectorial. Els renderitzadors suportats actualment són:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : el component ha de ser de tipus ${geomType}",
+
+    // console message
+    'getFeatureError':
+        "getFeatureFromEvent ha estat cridat des d'una capa sense renderizador. Això normalment vol dir que " +
+        "s'ha eliminat una capa, però no el handler associat a ella.",
+
+    // console message
+    'minZoomLevelError':
+        "La propietat minZoomLevel s'ha d'utilitzar només " +
+        "amb les capes que tenen FixedZoomLevels. El fet que " +
+        "una capa wfs comprovi minZoomLevel és una relíquia del " +
+        "passat. No podem, però, eliminar-la sense trencar " +
+        "les aplicacions d'OpenLayers que en puguin dependre. " +
+        "Així doncs estem fent-la obsoleta -- la comprovació " +
+        "minZoomLevel s'eliminarà a la versió 3.0. Feu servir " +
+        "els paràmetres min/max resolution en substitució, tal com es descriu aquí: " +
+        "http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "Transacció WFS: CORRECTA ${response}",
+
+    'commitFailed': "Transacció WFS: HA FALLAT ${response}",
+
+    'googleWarning':
+        "La capa Google no s'ha pogut carregar correctament.<br><br>" +
+        "Per evitar aquest missatge, seleccioneu una nova Capa Base " +
+        "al gestor de capes de la cantonada superior dreta.<br><br>" +
+        "Probablement això és degut a que l'script de la biblioteca de " +
+    "Google Maps no ha estat inclòs a la vostra pàgina, o no " +
+    "conté la clau de l'API correcta per a la vostra adreça.<br><br>" +
+        "Desenvolupadors: Per obtenir consells sobre com fer anar això, " +
+        "<a href='http://trac.openlayers.org/wiki/Google' " +
+        "target='_blank'>féu clic aquí</a>",
+
+    'getLayerWarning':
+        "Per evitar aquest missatge, seleccioneu una nova Capa Base " +
+        "al gestor de capes de la cantonada superior dreta.<br><br>" +
+        "Probablement això és degut a que l'script de la biblioteca " +
+        "${layerLib} " +
+        "no ha estat inclòs a la vostra pàgina.<br><br>" +
+        "Desenvolupadors: Per obtenir consells sobre com fer anar això, " +
+        "<a href='http://trac.openlayers.org/wiki/${layerLib}' " +
+        "target='_blank'>féu clic aquí</a>",
+
+    'scale': "Escala = 1 : ${scaleDenom}",
+
+    //labels for the graticule control
+    'W': 'O',
+    'E': 'E',
+    'N': 'N',
+    'S': 'S',
+    'graticule': 'Retícula',    
+        
+    // console message
+    'layerAlreadyAdded':
+        "Heu intentat afegir la capa: ${layerName} al mapa, però ja ha estat afegida anteriorment",
+
+    // console message
+    'reprojectDeprecated':
+        "Esteu fent servir l'opció 'reproject' a la capa " +
+        "${layerName}. Aquesta opció és obsoleta: el seu ús fou concebut " +
+        "per suportar la visualització de dades sobre mapes base comercials, " + 
+        "però ara aquesta funcionalitat s'hauria d'assolir mitjançant el suport " +
+        "de la projecció Spherical Mercator. Més informació disponible a " +
+        "http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    // console message
+    'methodDeprecated':
+        "Aquest mètode és obsolet i s'eliminarà a la versió 3.0. " +
+        "Si us plau feu servir em mètode alternatiu ${newMethod}.",
+
+    // console message
+    'boundsAddError': "Ha de proporcionar els valors x i y a la funció add.",
+
+    // console message
+    'lonlatAddError': "Ha de proporcionar els valors lon i lat a la funció add.",
+
+    // console message
+    'pixelAddError': "Ha de proporcionar els valors x i y a la funció add.",
+
+    // console message
+    'unsupportedGeometryType': "Tipus de geometria no suportada: ${geomType}",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition ha fallat: l'element amb id ${elemId} pot estar fora de lloc.",
+                    
+    // console message
+    'filterEvaluateNotImplemented': "evaluate no està implementat per aquest tipus de filtre.",
+
+    // **** end ****
+    'end': ''
+
+};
diff --git a/lib/OpenLayers/Lang/cs-CZ.js b/lib/OpenLayers/Lang/cs-CZ.js
new file mode 100644
index 0000000..945e24c
--- /dev/null
+++ b/lib/OpenLayers/Lang/cs-CZ.js
@@ -0,0 +1,69 @@
+/* Translators (2009 onwards):
+ *  - Mormegil
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["cs-CZ"]
+ * Dictionary for Česky.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["cs-CZ"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Nezpracovaná návratová hodnota ${statusText}",
+
+    'permalink': "Trvalý odkaz",
+
+    'overlays': "Překryvné vrstvy",
+
+    'baseLayer': "Podkladové vrstvy",
+
+    'sameProjection': "Přehledka pracuje správně pouze tehdy, pokud je ve stejné projekci jako hlavní mapa",
+
+    'readNotImplemented': "Read není implementováno.",
+
+    'writeNotImplemented': "Write není implementováno.",
+
+    'noFID': "Nelze aktualizovat prvek, pro který neexistuje FID.",
+
+    'errorLoadingGML': "Chyba při načítání souboru GML ${url}",
+
+    'browserNotSupported': "Váš prohlížeč nepodporuje vykreslování vektorů. Momentálně podporované nástroje jsou::\n${renderers}",
+
+    'componentShouldBe': "addFeatures : komponenta by měla být ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent bylo zavoláno na vrstvě, která nemá vykreslovač. To obyčejně znamená, že jste odstranil vrstvu, ale ne rutinu s ní asociovanou.",
+
+    'minZoomLevelError': "Vlastnost minZoomLevel by se měla používat pouze s potomky FixedZoomLevels vrstvami. To znamená, že vrstva wfs kontroluje, zda-li minZoomLevel není zbytek z minulosti.Nelze to ovšem vyjmout bez možnosti, že bychom rozbili aplikace postavené na OL, které by na tom mohly záviset. Proto tuto vlastnost nedoporučujeme používat --  kontrola minZoomLevel bude odstraněna ve verzi 3.0. Použijte prosím raději nastavení min/max podle příkaldu popsaného na: http://trac.open [...]
+
+    'commitSuccess': "WFS Transaction: ÚSPĚCH ${response}",
+
+    'commitFailed': "WFS Transaction: CHYBA ${response}",
+
+    'googleWarning': "Nepodařilo se správně načíst vrstvu Google.\x3cbr\x3e\x3cbr\x3eAbyste se zbavili této zprávy, zvolte jinou základní vrstvu v přepínači vrstev.\x3cbr\x3e\x3cbr\x3eTo se většinou stává, pokud nebyl načten skript, nebo neobsahuje správný klíč pro API pro tuto stránku.\x3cbr\x3e\x3cbr\x3eVývojáři: Pro pomoc, aby tohle fungovalo , \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklikněte sem\x3c/a\x3e",
+
+    'getLayerWarning': "The ${layerType} Layer was unable to load correctly.\x3cbr\x3e\x3cbr\x3eTo get rid of this message, select a new BaseLayer in the layer switcher in the upper-right corner.\x3cbr\x3e\x3cbr\x3eMost likely, this is because the ${layerLib} library script was either not correctly included.\x3cbr\x3e\x3cbr\x3eDevelopers: For help getting this working correctly, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclick here\x3c/a\x3e",
+
+    'scale': "Měřítko = 1 : ${scaleDenom}",
+
+    'layerAlreadyAdded': "Pokusili jste se přidat vrstvu: ${layerName} do mapy, ale tato vrstva je již v mapě přítomna.",
+
+    'reprojectDeprecated': "Použil jste volbu \'reproject\' ve vrstvě ${layerName}. Tato volba není doporučená: byla zde proto, aby bylo možno zobrazovat data z okomerčních serverů, ale tato funkce je nyní zajištěna pomocí podpory Spherical Mercator. Více informací naleznete na http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Tato metoda je zavržená a bude ve verzi 3.0 odstraněna. Prosím, použijte raději ${newMethod}.",
+
+    'boundsAddError': "Pro přídavnou funkci musíte zadat obě souřadnice x a y.",
+
+    'lonlatAddError': "Pro přídavnou funkci musíte zadat obě souřadnice lon a lat.",
+
+    'pixelAddError': "Pro přídavnou funkci musíte zadat obě souřadnice x a y.",
+
+    'unsupportedGeometryType': "Nepodporovaný typ geometrie: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition selhalo: element s  id ${elemId} je asi umístěn chybně."
+
+});
diff --git a/lib/OpenLayers/Lang/da-DK.js b/lib/OpenLayers/Lang/da-DK.js
new file mode 100644
index 0000000..680c212
--- /dev/null
+++ b/lib/OpenLayers/Lang/da-DK.js
@@ -0,0 +1,119 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["da-DK"]
+ * Dictionary for Danish.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang['da-DK'] = {
+
+    'unhandledRequest': "En ikke håndteret forespørgsel returnerede ${statusText}",
+
+    'permalink': "Permalink",
+
+    'overlays': "Kortlag",
+
+    'baseLayer': "Baggrundslag",
+
+    'sameProjection':
+        "Oversigtskortet fungerer kun når det har samme projektion som hovedkortet",
+
+    'readNotImplemented': "Læsning er ikke implementeret.",
+
+    'writeNotImplemented': "Skrivning er ikke implementeret.",
+
+    'noFID': "Kan ikke opdateret en feature (et objekt) der ikke har et FID.",
+
+    'errorLoadingGML': "Fejlede under indlæsning af GML fil ${url}",
+
+    'browserNotSupported':
+        "Din browser understøtter ikke vektor visning. Følgende vektor visninger understøttes:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : komponenten skal være en ${geomType}",
+
+    // console message
+    'getFeatureError':
+        "getFeatureFromEvent blev kaldt på et lag uden en visning. Dette betyder som regel at du " +
+        "har destrueret et lag, men ikke de håndteringer der var tilknyttet.",
+
+    // console message
+    'minZoomLevelError':
+        "Egenskaben minZoomLevel er kun beregnet til brug " +
+        "med FixedZoomLevels. At dette WFS lag kontrollerer " +
+        "minZoomLevel egenskaben, er et levn fra en tidligere " +
+        "version. Vi kan desværre ikke fjerne dette uden at risikere " +
+        "at ødelægge eksisterende OL baserede programmer der " +
+        " benytter denne funktionalitet. " +
+        "Egenskaben bør derfor ikke anvendes, og minZoomLevel " +
+        "kontrollen herunder vil blive fjernet i version 3.0. " +
+        "Benyt istedet min/max opløsnings indstillingerne, som " +
+        "er beskrevet her: " +
+        "http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "WFS transaktion: LYKKEDES ${response}",
+
+    'commitFailed': "WFS transaktion: MISLYKKEDES ${response}",
+
+    'googleWarning':
+        "Google laget kunne ikke indlæses.<br><br>" +
+        "For at fjerne denne besked, vælg et nyt bagrundskort i " +
+        "lagskifteren i øverste højre hjørne.<br><br>" +
+        "Fejlen skyldes formentlig at Google Maps bibliotekts " +
+        "scriptet ikke er inkluderet, eller ikke indeholder den " +
+        "korrkte API nøgle for dit site.<br><br>" +
+        "Udviklere: For hjælp til at få dette til at fungere, " +
+        "<a href='http://trac.openlayers.org/wiki/Google' " +
+        "target='_blank'>klik her</a>",
+
+    'getLayerWarning':
+        "${layerType}-laget kunne ikke indlæses.<br><br>" +
+        "For at fjerne denne besked, vælg et nyt bagrundskort i " +
+        "lagskifteren i øverste højre hjørne.<br><br>" +
+        "Fejlen skyldes formentlig at ${layerLib} bibliotekts " +
+        "scriptet ikke er inkluderet.<br><br>" +
+        "Udviklere: For hjælp til at få dette til at fungere, " +
+        "<a href='http://trac.openlayers.org/wiki/${layerLib}' " +
+        "target='_blank'>klik her</a>",
+
+    'scale': "Målforhold = 1 : ${scaleDenom}",
+
+    // console message
+    'layerAlreadyAdded':
+        "Du har forsøgt at tilføje laget: ${layerName} til kortet, men det er allerede tilføjet",
+
+    // console message
+    'reprojectDeprecated':
+        "Du anvender indstillingen 'reproject' på laget ${layerName}." + 
+        "Denne indstilling bør ikke længere anvendes. Den var beregnet " +
+        "til at vise data ovenpå kommercielle grundkort, men den funktionalitet " +
+        "bør nu opnås ved at anvende Spherical Mercator understøttelsen. " +
+        "Mere information er tilgængelig her: " +
+        "http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    // console message
+    'methodDeprecated':
+        "Denne funktion bør ikke længere anvendes, og vil blive fjernet i version 3.0. " +
+        "Anvend venligst funktionen ${newMethod} istedet.",
+
+    // console message
+    'boundsAddError': "Du skal angive både x og y værdier i kaldet til add funktionen.",
+
+    // console message
+    'lonlatAddError': "Du skal angive både lon og lat værdier i kaldet til add funktionen.",
+
+    // console message
+    'pixelAddError': "Du skal angive både x og y værdier i kaldet til add funktionen.",
+
+    // console message
+    'unsupportedGeometryType': "Geometri typen: ${geomType} er ikke understøttet.",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition fejlede: elementet med id ${elemId} er måske placeret forkert.",
+
+    // console message
+    'filterEvaluateNotImplemented': "evaluering er ikke implementeret for denne filter type."
+};
diff --git a/lib/OpenLayers/Lang/de.js b/lib/OpenLayers/Lang/de.js
new file mode 100644
index 0000000..dc81557
--- /dev/null
+++ b/lib/OpenLayers/Lang/de.js
@@ -0,0 +1,81 @@
+/* Translators (2009 onwards):
+ *  - Grille chompa
+ *  - Nikiwaibel
+ *  - Umherirrender
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["de"]
+ * Dictionary for Deutsch.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["de"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Unbehandelte Anfragerückmeldung ${statusText}",
+
+    'permalink': "Permalink",
+
+    'overlays': "Overlays",
+
+    'baseLayer': "Grundkarte",
+
+    'sameProjection': "Die Übersichtskarte funktioniert nur, wenn sie dieselbe Projektion wie die Hauptkarte verwendet",
+
+    'readNotImplemented': "Lesen nicht implementiert.",
+
+    'writeNotImplemented': "Schreiben nicht implementiert.",
+
+    'noFID': "Ein Feature, für das keine FID existiert, kann nicht aktualisiert werden.",
+
+    'errorLoadingGML': "Fehler beim Laden der GML-Datei ${url}",
+
+    'browserNotSupported': "Ihr Browser unterstützt keine Vektordarstellung. Aktuell unterstützte Renderer:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: Komponente muss vom Typ ${geomType} sein",
+
+    'getFeatureError': "getFeatureFromEvent wurde vom einem Layer ohne Renderer aufgerufen. Dies bedeutet normalerweise, dass ein Layer entfernt wurde, aber nicht Handler, die auf ihn verweisen.",
+
+    'minZoomLevelError': "Die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Eigenschaft ist nur für die Verwendung mit \x3ccode\x3eFixedZoomLevels\x3c/code\x3e-untergeordneten Layers vorgesehen. Das dieser \x3ctt\x3ewfs\x3c/tt\x3e-Layer die \x3ccode\x3eminZoomLevel\x3c/code\x3e-Eigenschaft überprüft ist ein Relikt der Vergangenheit. Wir können diese Überprüfung nicht entfernen, ohne das OL basierende Applikationen nicht mehr funktionieren. Daher markieren wir es als veraltet - die \x3ccode\x3emi [...]
+
+    'commitSuccess': "WFS-Transaktion: Erfolgreich ${response}",
+
+    'commitFailed': "WFS-Transaktion: Fehlgeschlagen ${response}",
+
+    'googleWarning': "Der Google-Layer konnte nicht korrekt geladen werden.\x3cbr\x3e\x3cbr\x3eUm diese Meldung nicht mehr zu erhalten, wählen Sie einen anderen Hintergrundlayer aus dem LayerSwitcher in der rechten oberen Ecke.\x3cbr\x3e\x3cbr\x3eSehr wahrscheinlich tritt dieser Fehler auf, weil das Skript der Google-Maps-Bibliothek nicht eingebunden wurde oder keinen gültigen API-Schlüssel für Ihre URL enthält.\x3cbr\x3e\x3cbr\x3eEntwickler: Besuche \x3ca href=\'http://trac.openlayers.o [...]
+
+    'getLayerWarning': "Der ${layerType}-Layer konnte nicht korrekt geladen werden.\x3cbr\x3e\x3cbr\x3eUm diese Meldung nicht mehr zu erhalten, wählen Sie einen anderen Hintergrundlayer aus dem LayerSwitcher in der rechten oberen Ecke.\x3cbr\x3e\x3cbr\x3eSehr wahrscheinlich tritt dieser Fehler auf, weil das Skript der \'${layerLib}\'-Bibliothek nicht eingebunden wurde.\x3cbr\x3e\x3cbr\x3eEntwickler: Besuche \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3ed [...]
+
+    'scale': "Maßstab = 1 : ${scaleDenom}",
+
+    'W': "W",
+
+    'E': "O",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Sie versuchen den Layer „${layerName}“ zur Karte hinzuzufügen, er wurde aber bereits hinzugefügt",
+
+    'reprojectDeprecated': "Sie verwenden die „Reproject“-Option des Layers ${layerName}. Diese Option ist veraltet: Sie wurde entwickelt um die Anzeige von Daten auf kommerziellen Basiskarten zu unterstützen, aber diese Funktion sollte jetzt durch Unterstützung der „Spherical Mercator“ erreicht werden. Weitere Informationen sind unter http://trac.openlayers.org/wiki/SphericalMercator verfügbar.",
+
+    'methodDeprecated': "Die Methode ist veraltet und wird in 3.0 entfernt. Bitte verwende stattdessen ${newMethod}.",
+
+    'boundsAddError': "Beide Werte (x und y) müssen der add-Funktion übergeben werden.",
+
+    'lonlatAddError': "Beide Werte (lon und lat) müssen der add-Funktion übergeben werden.",
+
+    'pixelAddError': "Beide Werte (x und y) müssen der add-Funktion übergeben werden.",
+
+    'unsupportedGeometryType': "Nicht unterstützter Geometrie-Typ: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition fehlgeschlagen: Element mit Id ${elemId} möglicherweise falsch platziert.",
+
+    'filterEvaluateNotImplemented': "„evaluate“ ist für diesen Filter-Typ nicht implementiert."
+
+});
diff --git a/lib/OpenLayers/Lang/el.js b/lib/OpenLayers/Lang/el.js
new file mode 100644
index 0000000..deedf7f
--- /dev/null
+++ b/lib/OpenLayers/Lang/el.js
@@ -0,0 +1,19 @@
+/* Translators (2009 onwards):
+ *  - Omnipaedista
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["el"]
+ * Dictionary for Ελληνικά.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["el"] = OpenLayers.Util.applyDefaults({
+
+    'scale': "Κλίμακα ~ 1 : ${scaleDenom}"
+
+});
diff --git a/lib/OpenLayers/Lang/en-CA.js b/lib/OpenLayers/Lang/en-CA.js
new file mode 100644
index 0000000..5939333
--- /dev/null
+++ b/lib/OpenLayers/Lang/en-CA.js
@@ -0,0 +1,21 @@
+/**
+ * @requires OpenLayers/Lang/en.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["en-CA"]
+ * Dictionary for English-CA.  This dictionary inherits from the standard
+ *     English dictionary.  Override only those entries with language specific
+ *     to the CA region.
+ *     
+ * Keys for entries are used in calls to <OpenLayers.Lang.translate>.  Entry
+ *     bodies are normal strings or strings formatted for use with
+ *     <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang['en-CA'] = OpenLayers.Util.applyDefaults({
+
+    // add any entries specific for this region here
+    // e.g.
+    // "someKey": "Some regionally specific value"
+    
+}, OpenLayers.Lang["en"]);
diff --git a/lib/OpenLayers/Lang/en.js b/lib/OpenLayers/Lang/en.js
new file mode 100644
index 0000000..f687d2e
--- /dev/null
+++ b/lib/OpenLayers/Lang/en.js
@@ -0,0 +1,128 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["en"]
+ * Dictionary for English.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang.en = {
+
+    'unhandledRequest': "Unhandled request return ${statusText}",
+
+    'permalink': "Permalink",
+
+    'overlays': "Overlays",
+
+    'baseLayer': "Base Layer",
+
+    'sameProjection':
+        "The overview map only works when it is in the same projection as the main map",
+
+    'readNotImplemented': "Read not implemented.",
+
+    'writeNotImplemented': "Write not implemented.",
+
+    'noFID': "Can't update a feature for which there is no FID.",
+
+    'errorLoadingGML': "Error in loading GML file ${url}",
+
+    'browserNotSupported':
+        "Your browser does not support vector rendering. Currently supported renderers are:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : component should be an ${geomType}",
+
+    // console message
+    'getFeatureError':
+        "getFeatureFromEvent called on layer with no renderer. This usually means you " +
+        "destroyed a layer, but not some handler which is associated with it.",
+
+    // console message
+    'minZoomLevelError':
+        "The minZoomLevel property is only intended for use " +
+        "with the FixedZoomLevels-descendent layers. That this " +
+        "wfs layer checks for minZoomLevel is a relic of the" +
+        "past. We cannot, however, remove it without possibly " +
+        "breaking OL based applications that may depend on it." +
+        " Therefore we are deprecating it -- the minZoomLevel " +
+        "check below will be removed at 3.0. Please instead " +
+        "use min/max resolution setting as described here: " +
+        "http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "WFS Transaction: SUCCESS ${response}",
+
+    'commitFailed': "WFS Transaction: FAILED ${response}",
+
+    'googleWarning':
+        "The Google Layer was unable to load correctly.<br><br>" +
+        "To get rid of this message, select a new BaseLayer " +
+        "in the layer switcher in the upper-right corner.<br><br>" +
+        "Most likely, this is because the Google Maps library " +
+        "script was either not included, or does not contain the " +
+        "correct API key for your site.<br><br>" +
+        "Developers: For help getting this working correctly, " +
+        "<a href='http://trac.openlayers.org/wiki/Google' " +
+        "target='_blank'>click here</a>",
+
+    'getLayerWarning':
+        "The ${layerType} Layer was unable to load correctly.<br><br>" +
+        "To get rid of this message, select a new BaseLayer " +
+        "in the layer switcher in the upper-right corner.<br><br>" +
+        "Most likely, this is because the ${layerLib} library " +
+        "script was not correctly included.<br><br>" +
+        "Developers: For help getting this working correctly, " +
+        "<a href='http://trac.openlayers.org/wiki/${layerLib}' " +
+        "target='_blank'>click here</a>",
+
+    'scale': "Scale = 1 : ${scaleDenom}",
+    
+    //labels for the graticule control
+    'W': 'W',
+    'E': 'E',
+    'N': 'N',
+    'S': 'S',
+    'graticule': 'Graticule',
+
+    // console message
+    'layerAlreadyAdded':
+        "You tried to add the layer: ${layerName} to the map, but it has already been added",
+
+    // console message
+    '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 " + 
+        "basemaps, but that functionality should now be achieved by using " +
+        "Spherical Mercator support. More information is available from " +
+        "http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    // console message
+    'methodDeprecated':
+        "This method has been deprecated and will be removed in 3.0. " +
+        "Please use ${newMethod} instead.",
+
+    // console message
+    'boundsAddError': "You must pass both x and y values to the add function.",
+
+    // console message
+    'lonlatAddError': "You must pass both lon and lat values to the add function.",
+
+    // console message
+    'pixelAddError': "You must pass both x and y values to the add function.",
+
+    // console message
+    'unsupportedGeometryType': "Unsupported geometry type: ${geomType}",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition failed: element with id ${elemId} may be misplaced.",
+
+    // console message
+    'filterEvaluateNotImplemented': "evaluate is not implemented for this filter type.",
+
+    // **** end ****
+    'end': ''
+    
+};
diff --git a/lib/OpenLayers/Lang/es.js b/lib/OpenLayers/Lang/es.js
new file mode 100644
index 0000000..ff6d3dc
--- /dev/null
+++ b/lib/OpenLayers/Lang/es.js
@@ -0,0 +1,129 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["es"]
+ * Dictionary for Spanish, UTF8 encoding. Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang.es = {
+
+    'unhandledRequest': "Respuesta a petición no gestionada ${statusText}",
+
+    'permalink': "Enlace permanente",
+
+    'overlays': "Capas superpuestas",
+
+    'baseLayer': "Capa Base",
+
+    'sameProjection':
+        "El mapa de vista general sólo funciona si está en la misma proyección que el mapa principal",
+
+    'readNotImplemented': "Lectura no implementada.",
+
+    'writeNotImplemented': "Escritura no implementada.",
+
+    'noFID': "No se puede actualizar un elemento para el que no existe FID.",
+
+    'errorLoadingGML': "Error cargando el fichero GML ${url}",
+
+    'browserNotSupported':
+        "Su navegador no soporta renderización vectorial. Los renderizadores soportados actualmente son:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : el componente debe ser del tipo ${geomType}",
+
+    // console message
+    'getFeatureError':
+        "getFeatureFromEvent se ha llamado desde una capa sin renderizador. Esto normalmente quiere decir que " +
+        "se ha destruido una capa, pero no el manejador asociado a ella.",
+
+    // console message
+    'minZoomLevelError':
+        "La propiedad minZoomLevel debe sólo utilizarse " +
+        "con las capas que tienen FixedZoomLevels. El hecho de que " +
+        "una capa wfs compruebe minZoomLevel es una reliquia del " +
+        "pasado. Sin embargo, no podemos eliminarla sin discontinuar " +
+        "probablemente las aplicaciones OL que puedan depender de ello. " +
+        "Así pues estamos haciéndolo obsoleto --la comprobación " +
+        "minZoomLevel se eliminará en la versión 3.0. Utilice el ajuste " +
+        "de resolution min/max en su lugar, tal como se describe aquí: " +
+        "http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "Transacción WFS: ÉXITO ${response}",
+
+    'commitFailed': "Transacción WFS: FALLÓ ${response}",
+
+    'googleWarning':
+        "La capa Google no pudo ser cargada correctamente.<br><br>" +
+        "Para evitar este mensaje, seleccione una nueva Capa Base " +
+        "en el selector de capas en la esquina superior derecha.<br><br>" +
+        "Probablemente, esto se debe a que el script de la biblioteca de " +
+	"Google Maps no fue correctamente incluido en su página, o no " +
+	"contiene la clave del API correcta para su sitio.<br><br>" +
+        "Desarrolladores: Para ayudar a hacer funcionar esto correctamente, " +
+        "<a href='http://trac.openlayers.org/wiki/Google' " +
+        "target='_blank'>haga clic aquí</a>",
+
+    'getLayerWarning':
+        "La capa ${layerType} no pudo ser cargada correctamente.<br><br>" +
+        "Para evitar este mensaje, seleccione una nueva Capa Base " +
+        "en el selector de capas en la esquina superior derecha.<br><br>" +
+        "Probablemente, esto se debe a que el script de " +
+	"la biblioteca ${layerLib} " +
+        "no fue correctamente incluido en su página.<br><br>" +
+        "Desarrolladores: Para ayudar a hacer funcionar esto correctamente, " +
+        "<a href='http://trac.openlayers.org/wiki/${layerLib}' " +
+        "target='_blank'>haga clic aquí</a>",
+
+    'scale': "Escala = 1 : ${scaleDenom}",
+
+    //labels for the graticule control
+    'W': 'O',
+    'E': 'E',
+    'N': 'N',
+    'S': 'S',
+    'graticule': 'Retícula',
+    
+    // console message
+    'layerAlreadyAdded':
+        "Intentó añadir la capa: ${layerName} al mapa, pero ya había sido añadida previamente",
+
+    // console message
+    'reprojectDeprecated':
+        "Está usando la opción 'reproject' en la capa " +
+        "${layerName}. Esta opción es obsoleta: su uso fue diseñado " +
+        "para soportar la visualización de datos sobre mapas base comerciales, " + 
+        "pero ahora esa funcionalidad debería conseguirse mediante el soporte " +
+        "de la proyección Spherical Mercator. Más información disponible en " +
+        "http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    // console message
+    'methodDeprecated':
+        "Este método es obsoleto y se eliminará en la versión 3.0. " +
+        "Por favor utilice el método ${newMethod} en su lugar.",
+
+    // console message
+    'boundsAddError': "Debe proporcionar los valores x e y a la función add.",
+
+    // console message
+    'lonlatAddError': "Debe proporcionar los valores lon y lat a la función add.",
+
+    // console message
+    'pixelAddError': "Debe proporcionar los valores x e y a la función add.",
+
+    // console message
+    'unsupportedGeometryType': "Tipo de geometría no soportada: ${geomType}",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition falló: el elemento con id ${elemId} puede haberse colocado de manera errónea.",
+                    
+    // console message
+    'filterEvaluateNotImplemented': "evaluate no está implementado para este tipo de filtro.",
+
+    // **** end ****
+    'end': ''
+
+};
diff --git a/lib/OpenLayers/Lang/fi.js b/lib/OpenLayers/Lang/fi.js
new file mode 100644
index 0000000..1cfd626
--- /dev/null
+++ b/lib/OpenLayers/Lang/fi.js
@@ -0,0 +1,34 @@
+/* Translators (2009 onwards):
+ *  - Nike
+ *  - Str4nd
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["fi"]
+ * Dictionary for Suomi.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["fi"] = OpenLayers.Util.applyDefaults({
+
+    'permalink': "Ikilinkki",
+
+    'overlays': "Kerrokset",
+
+    'baseLayer': "Peruskerros",
+
+    'sameProjection': "Yleiskuvakarttaa voi käyttää vain, kun sillä on sama projektio kuin pääkartalla.",
+
+    'W': "L",
+
+    'E': "I",
+
+    'N': "P",
+
+    'S': "E"
+
+});
diff --git a/lib/OpenLayers/Lang/fr.js b/lib/OpenLayers/Lang/fr.js
new file mode 100644
index 0000000..a3a66cc
--- /dev/null
+++ b/lib/OpenLayers/Lang/fr.js
@@ -0,0 +1,80 @@
+/* Translators (2009 onwards):
+ *  - Damouns
+ *  - IAlex
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["fr"]
+ * Dictionary for Français.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["fr"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Requête non gérée, retournant ${statusText}",
+
+    'permalink': "Permalien",
+
+    'overlays': "Calques",
+
+    'baseLayer': "Calque de base",
+
+    'sameProjection': "La carte de situation ne fonctionne que lorsque sa projection est la même que celle de la carte principale",
+
+    'readNotImplemented': "Lecture non implémentée.",
+
+    'writeNotImplemented': "Ecriture non implémentée.",
+
+    'noFID': "Impossible de mettre à jour un objet sans identifiant (fid).",
+
+    'errorLoadingGML': "Erreur au chargement du fichier GML ${url}",
+
+    'browserNotSupported': "Votre navigateur ne supporte pas le rendu vectoriel. Les renderers actuellement supportés sont : \n${renderers}",
+
+    'componentShouldBe': "addFeatures : le composant devrait être de type ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent a été appelé sur un calque sans renderer. Cela signifie généralement que vous avez détruit cette couche, mais que vous avez conservé un handler qui lui était associé.",
+
+    'minZoomLevelError': "La propriété minZoomLevel doit seulement être utilisée pour des couches FixedZoomLevels-descendent. Le fait que cette couche WFS vérifie la présence de minZoomLevel est une relique du passé. Nous ne pouvons toutefois la supprimer sans casser des applications qui pourraient en dépendre. C\'est pourquoi nous la déprécions -- la vérification du minZoomLevel sera supprimée en version 3.0. A la place, merci d\'utiliser les paramètres de résolutions min/max tel que dé [...]
+
+    'commitSuccess': "Transaction WFS : SUCCES ${response}",
+
+    'commitFailed': "Transaction WFS : ECHEC ${response}",
+
+    'googleWarning': "La couche Google n\'a pas été en mesure de se charger correctement.\x3cbr\x3e\x3cbr\x3ePour supprimer ce message, choisissez une nouvelle BaseLayer dans le sélecteur de couche en haut à droite.\x3cbr\x3e\x3cbr\x3eCela est possiblement causé par la non-inclusion de la librairie Google Maps, ou alors parce que la clé de l\'API ne correspond pas à votre site.\x3cbr\x3e\x3cbr\x3eDéveloppeurs : pour savoir comment corriger ceci, \x3ca href=\'http://trac.openlayers.org/wi [...]
+
+    'getLayerWarning': "La couche ${layerType} n\'est pas en mesure de se charger correctement.\x3cbr\x3e\x3cbr\x3ePour supprimer ce message, choisissez une nouvelle BaseLayer dans le sélecteur de couche en haut à droite.\x3cbr\x3e\x3cbr\x3eCela est possiblement causé par la non-inclusion de la librairie ${layerLib}.\x3cbr\x3e\x3cbr\x3eDéveloppeurs : pour savoir comment corriger ceci, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3ecliquez ici\x3c/a\x3e",
+
+    'scale': "Echelle ~ 1 : ${scaleDenom}",
+
+    'W': "O",
+
+    'E': "E",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Vous avez essayé d\'ajouter à la carte le calque : ${layerName}, mais il est déjà présent",
+
+    'reprojectDeprecated': "Vous utilisez l\'option \'reproject\' sur la couche ${layerName}. Cette option est dépréciée : Son usage permettait d\'afficher des données au dessus de couches raster commerciales.Cette fonctionalité est maintenant supportée en utilisant le support de la projection Mercator Sphérique. Plus d\'information est disponible sur http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Cette méthode est dépréciée, et sera supprimée à la version 3.0. Merci d\'utiliser ${newMethod} à la place.",
+
+    'boundsAddError': "Vous devez passer les deux valeurs x et y à la fonction add.",
+
+    'lonlatAddError': "Vous devez passer les deux valeurs lon et lat à la fonction add.",
+
+    'pixelAddError': "Vous devez passer les deux valeurs x et y à la fonction add.",
+
+    'unsupportedGeometryType': "Type de géométrie non supporté : ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition a échoué: l\'élément d\'id ${elemId} pourrait être mal positionné.",
+
+    'filterEvaluateNotImplemented': "évaluer n\'a pas encore été implémenté pour ce type de filtre."
+
+});
diff --git a/lib/OpenLayers/Lang/fur.js b/lib/OpenLayers/Lang/fur.js
new file mode 100644
index 0000000..b274986
--- /dev/null
+++ b/lib/OpenLayers/Lang/fur.js
@@ -0,0 +1,35 @@
+/* Translators (2009 onwards):
+ *  - Klenje
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["fur"]
+ * Dictionary for Furlan.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["fur"] = OpenLayers.Util.applyDefaults({
+
+    'permalink': "Leam Permanent",
+
+    'overlays': "Livei parsore",
+
+    'baseLayer': "Livel di base",
+
+    'browserNotSupported': "Il to sgarfadôr nol supuarte la renderizazion vetoriâl. Al moment a son supuartâts:\n${renderers}",
+
+    'scale': "Scjale = 1 : ${scaleDenom}",
+
+    'W': "O",
+
+    'E': "E",
+
+    'N': "N",
+
+    'S': "S"
+
+});
diff --git a/lib/OpenLayers/Lang/gl.js b/lib/OpenLayers/Lang/gl.js
new file mode 100644
index 0000000..4d6ab29
--- /dev/null
+++ b/lib/OpenLayers/Lang/gl.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - Toliño
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["gl"]
+ * Dictionary for Galego.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["gl"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Solicitude non xerada; a resposta foi: ${statusText}",
+
+    'permalink': "Ligazón permanente",
+
+    'overlays': "Capas superpostas",
+
+    'baseLayer': "Capa base",
+
+    'sameProjection': "A vista xeral do mapa só funciona cando está na mesma proxección có mapa principal",
+
+    'readNotImplemented': "Lectura non implementada.",
+
+    'writeNotImplemented': "Escritura non implementada.",
+
+    'noFID': "Non se pode actualizar a funcionalidade para a que non hai FID.",
+
+    'errorLoadingGML': "Erro ao cargar o ficheiro GML ${url}",
+
+    'browserNotSupported': "O seu navegador non soporta a renderización de vectores. Os renderizadores soportados actualmente son:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: o compoñente debera ser de tipo ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent ten sido chamado a unha capa sen renderizador. Isto normalmente significa que destruíu unha capa, mais non o executador que está asociado con ela.",
+
+    'minZoomLevelError': "A propiedade minZoomLevel é só para uso conxuntamente coas capas FixedZoomLevels-descendent. O feito de que esa capa wfs verifique o minZoomLevel é unha reliquia do pasado. Non podemos, con todo, eliminala sen a posibilidade de non romper as aplicacións baseadas en OL que poidan depender dela. Por iso a estamos deixando obsoleta (a comprobación minZoomLevel de embaixo será eliminada na versión 3.0). Por favor, no canto diso use o axuste de resolución mín/máx tal [...]
+
+    'commitSuccess': "Transacción WFS: ÉXITO ${response}",
+
+    'commitFailed': "Transacción WFS: FALLIDA ${response}",
+
+    'googleWarning': "A capa do Google non puido cargarse correctamente.\x3cbr\x3e\x3cbr\x3ePara evitar esta mensaxe, escolla unha nova capa base no seleccionador de capas na marxe superior dereita.\x3cbr\x3e\x3cbr\x3eProbablemente, isto acontece porque a escritura da libraría do Google Maps ou ben non foi incluída ou ben non contén a clave API correcta para o seu sitio.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: para axudar a facer funcionar isto correctamente, \x3ca href=\'http://trac.openlay [...]
+
+    'getLayerWarning': "A capa ${layerType} foi incapaz de cargarse correctamente.\x3cbr\x3e\x3cbr\x3ePara evitar esta mensaxe, escolla unha nova capa base no seleccionador de capas na marxe superior dereita.\x3cbr\x3e\x3cbr\x3eProbablemente, isto acontece porque a escritura da libraría ${layerLib} non foi ben incluída.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: para axudar a facer funcionar isto correctamente, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eprem [...]
+
+    'scale': "Escala = 1 : ${scaleDenom}",
+
+    'W': "O",
+
+    'E': "L",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Intentou engadir a capa: ${layerName} ao mapa, pero xa fora engadida",
+
+    'reprojectDeprecated': "Está usando a opción \"reproject\" na capa ${layerName}. Esta opción está obsoleta: o seu uso foi deseñado para a visualización de datos sobre mapas base comerciais, pero esta funcionalidade debera agora ser obtida utilizando a proxección Spherical Mercator. Hai dispoñible máis información en http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Este método está obsoleto e será eliminado na versión 3.0. Por favor, no canto deste use ${newMethod}.",
+
+    'boundsAddError': "Debe achegar os valores x e y á función add.",
+
+    'lonlatAddError': "Debe achegar tanto o valor lon coma o lat á función add.",
+
+    'pixelAddError': "Debe achegar os valores x e y á función add.",
+
+    'unsupportedGeometryType': "Tipo xeométrico non soportado: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition fallou: o elemento con id ${elemId} pode non estar na súa posición.",
+
+    'filterEvaluateNotImplemented': "avaliar non está implementado para este tipo de filtro."
+
+});
diff --git a/lib/OpenLayers/Lang/gsw.js b/lib/OpenLayers/Lang/gsw.js
new file mode 100644
index 0000000..68c052b
--- /dev/null
+++ b/lib/OpenLayers/Lang/gsw.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - Als-Holder
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["gsw"]
+ * Dictionary for Alemannisch.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["gsw"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Nit behandleti Aafrogsruckmäldig ${statusText}",
+
+    'permalink': "Permalink",
+
+    'overlays': "Iberlagerige",
+
+    'baseLayer': "Grundcharte",
+
+    'sameProjection': "D Ibersichts-Charte funktioniert nume, wänn si di glych Projäktion brucht wie d Hauptcharte",
+
+    'readNotImplemented': "Läse nit implementiert.",
+
+    'writeNotImplemented': "Schrybe nit implementiert.",
+
+    'noFID': "E Feature, wu s kei FID derfir git, cha nit aktualisiert wäre.",
+
+    'errorLoadingGML': "Fähler bim Lade vu dr GML-Datei ${url}",
+
+    'browserNotSupported': "Dyy Browser unterstitzt kei Vektordarstellig. Aktuäll unterstitzti Renderer:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : Komponänt sott dr Typ ${geomType} syy",
+
+    'getFeatureError': "getFeatureFromEvent isch uf eme Layer ohni Renderer ufgruefe wore. Des heisst normalerwys, ass Du e Layer kaputt gmacht hesch, aber nit dr Handler, wu derzue ghert.",
+
+    'minZoomLevelError': "D minZoomLevel-Eigeschaft isch nume dänk fir d Layer, wu vu dr FixedZoomLevels abstamme. Ass dää wfs-Layer minZoomLevel prieft, scih e Relikt us dr Vergangeheit. Mir chenne s aber nit ändere ohni OL_basierti Aawändige villicht kaputt gehn, wu dervu abhänge.  Us däm Grund het die Funktion d Eigeschaft \'deprecated\' iberchuu. D minZoomLevel-Priefig unte wird in dr Version 3.0 usegnuu. Bitte verwänd statt däm e min/max-Uflesig wie s do bschriben isch: http://trac. [...]
+
+    'commitSuccess': "WFS-Transaktion: ERFOLGRYCH ${response}",
+
+    'commitFailed': "WFS-Transaktion: FÄHLGSCHLAA ${response}",
+
+    'googleWarning': "Dr Google-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr Google-Maps-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vum Google-Layer \x3ca href=\'http://trac.openlayers.org/wiki/Goog [...]
+
+    'getLayerWarning': "Dr ${layerType}-Layer het nit korräkt chenne glade wäre.\x3cbr\x3e\x3cbr\x3eGo die Mäldig nimi z kriege, wehl e andere Hintergrundlayer us em LayerSwitcher im rächte obere Ecke.\x3cbr\x3e\x3cbr\x3eDää Fähler git s seli hyfig, wel s Skript vu dr \'${layerLib}\'-Bibliothek nit yybunde woren isch oder wel s kei giltige API-Schlissel fir Dyy URL din het.\x3cbr\x3e\x3cbr\x3eEntwickler: Fir Hilf zum korräkte Yybinde vu Layer \x3ca href=\'http://trac.openlayers.org/wiki/ [...]
+
+    'scale': "Maßstab = 1 : ${scaleDenom}",
+
+    'W': "W",
+
+    'E': "O",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Du hesch versuecht dää Layer in d Charte yyzfiege: ${layerName}, aber är isch schoi yygfiegt",
+
+    'reprojectDeprecated': "Du bruchsch d \'reproject\'-Option bim ${layerName}-Layer. Die Option isch nimi giltig: si isch aagleit wore go   Date iber kommerziälli Grundcharte lege, aber des sott mer jetz mache mit dr Unterstitzig vu Spherical Mercator. Meh Informatione git s uf http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Die Methode isch veraltet un wird us dr Version 3.0 usegnuu. Bitte verwäbnd statt däm ${newMethod}.",
+
+    'boundsAddError': "Du muesch e x-Wärt un e y-Wärt yygee bi dr Zuefieg-Funktion",
+
+    'lonlatAddError': "Du meusch e Lengi- un e Breiti-Grad yygee bi dr Zuefieg-Funktion.",
+
+    'pixelAddError': "Du muesch x- un y-Wärt aagee bi dr Zuefieg-Funktion.",
+
+    'unsupportedGeometryType': "Nit unterstitze Geometrii-Typ: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition fählgschlaa: Elemänt mit ID ${elemId} isch villicht falsch gsetzt.",
+
+    'filterEvaluateNotImplemented': "evaluiere isch nit implemäntiert in däm Filtertyp."
+
+});
diff --git a/lib/OpenLayers/Lang/hr.js b/lib/OpenLayers/Lang/hr.js
new file mode 100644
index 0000000..c3f2bd8
--- /dev/null
+++ b/lib/OpenLayers/Lang/hr.js
@@ -0,0 +1,61 @@
+/* Translators (2009 onwards):
+ *  - Mvrban
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["hr"]
+ * Dictionary for Hrvatski.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["hr"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Nepodržani zahtjev ${statusText}",
+
+    'permalink': "Permalink",
+
+    'overlays': "Overlays",
+
+    'baseLayer': "Osnovna karta",
+
+    'sameProjection': "Pregledna karta radi jedino kao je u istoj projekciji kao i glava karta",
+
+    'readNotImplemented': "Čitanje nije implementirano.",
+
+    'writeNotImplemented': "Pisanje nije implementirano.",
+
+    'noFID': "Ne mogu ažurirati značajku za koju ne postoji FID.",
+
+    'errorLoadingGML': "Greška u učitavanju GML datoteke ${url}",
+
+    'browserNotSupported': "Vaš preglednik ne podržava vektorsko renderiranje. Trenutno podržani rendereri su: ${renderers}",
+
+    'componentShouldBe': "addFeatures : komponenta bi trebala biti ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent je pozvao Layer bez renderera. Ovo obično znači da ste uništiili Layer, a ne neki Handler koji je povezan s njim.",
+
+    'commitSuccess': "WFS Transakcija: USPJEŠNA ${response}",
+
+    'commitFailed': "WFS Transakcija: NEUSPJEŠNA ${response}",
+
+    'scale': "Mjerilo = 1 : ${scaleDenom}",
+
+    'layerAlreadyAdded': "Pokušali ste dodati layer:  ${layerName} na kartu, ali je već dodan",
+
+    'methodDeprecated': "Ova metoda nije odobrena i biti će maknuta u 3.0. Koristite ${newMethod}.",
+
+    'boundsAddError': "Morate dati obje vrijednosti ,  x i y  da bi dodali funkciju.",
+
+    'lonlatAddError': "Morate dati obje vrijednosti , (lon i lat) da bi dodali funkciju.",
+
+    'pixelAddError': "Morate dati obje vrijednosti ,  x i y  da bi dodali funkciju.",
+
+    'unsupportedGeometryType': "Nepodržani tip geometrije: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition nije uspjelo: element sa id ${elemId} može biti krivo smješten."
+
+});
diff --git a/lib/OpenLayers/Lang/hsb.js b/lib/OpenLayers/Lang/hsb.js
new file mode 100644
index 0000000..5cbf48e
--- /dev/null
+++ b/lib/OpenLayers/Lang/hsb.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - Michawiki
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["hsb"]
+ * Dictionary for Hornjoserbsce.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["hsb"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Wotmołwa njewobdźěłaneho naprašowanja ${statusText}",
+
+    'permalink': "Trajny wotkaz",
+
+    'overlays': "Naworštowanja",
+
+    'baseLayer': "Zakładna runina",
+
+    'sameProjection': "Přehladowa karta jenož funguje, hdyž je w samsnej projekciji kaž hłowna karta",
+
+    'readNotImplemented': "Čitanje njeimplementowane.",
+
+    'writeNotImplemented': "Pisanje njeimplementowane.",
+
+    'noFID': "Funkcija, za kotruž FID njeje, njeda so aktualizować.",
+
+    'errorLoadingGML': "Zmylk při začitowanju dataje ${url}",
+
+    'browserNotSupported': "Twój wobhladowak wektorowe rysowanje njepodpěruje. Tuchwilu podpěrowane rysowaki su:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: komponenta měła ${geomType} być",
+
+    'getFeatureError': "getFeatureFromEvent bu na woršće bjez rysowak zawołany. To zwjetša woznamjenja, zo sy worštu zničił, ale nic wobdźěłak, kotryž je z njej zwjazany.",
+
+    'minZoomLevelError': "Kajkosć minZoomLevel je jenož za wužiwanje z worštami myslena, kotrež wot FixedZoomLevels pochadźeja. Zo tuta woršta wfs za minZoomLevel přepruwuje, je relikt zańdźenosće. Njemóžemy wšak ju wotstronić, bjeztoho zo aplikacije, kotrež na OpenLayers bazěruja a snano tutu kajkosć wužiwaja, hižo njefunguja. Tohodla smy ju jako zestarjenu woznamjenili -- přepruwowanje za minZoomLevel budu so we wersiji 3.0 wotstronjeć. Prošu wužij město toho nastajenje min/max, kaž je [...]
+
+    'commitSuccess': "WFS-Transakcija: WUSPĚŠNA ${response}",
+
+    'commitFailed': "WFS-Transakcija: NJEPORADŹENA ${response}",
+
+    'googleWarning': "Woršta Google njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki Google Maps pak njebu zapřijaty pak njewobsahuje korektny kluč API za twoje sydło.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",
+
+    'getLayerWarning': "Woršta ${layerType} njemóžeše so korektnje začitać.\x3cbr\x3e\x3cbr\x3eZo by tutu zdźělenku wotbył, wubjer nowy BaseLayer z wuběra worštow horjeka naprawo.\x3cbr\x3e\x3cbr\x3eNajskerje so to stawa, dokelž skript biblioteki ${layerLib} njebu korektnje zapřijaty.\x3cbr\x3e\x3cbr\x3eWuwiwarjo: Za pomoc ke korektnemu fungowanju worštow\n\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3etu kliknyć\x3c/a\x3e",
+
+    'scale': "Měritko = 1 : ${scaleDenom}",
+
+    'W': "Z",
+
+    'E': "W",
+
+    'N': "S",
+
+    'S': "J",
+
+    'layerAlreadyAdded': "Sy spytał runinu ${layerName} karće dodać, ale je so hižo dodała",
+
+    'reprojectDeprecated': "Wužiwaš opciju \"reproject\" wořšty ${layerName}. Tuta opcija je zestarjena: jeje wužiwanje bě myslene, zo by zwobraznjenje datow nad komercielnymi bazowymi kartami podpěrało, ale funkcionalnosć měła so nětko z pomocu Sperical Mercator docpěć. Dalše informacije steja na http://trac.openlayers.org/wiki/SphericalMercator k dispoziciji.",
+
+    'methodDeprecated': "Tuta metoda je so njeschwaliła a budźe so w 3.0 wotstronjeć. Prošu wužij ${newMethod} město toho.",
+
+    'boundsAddError': "Dyrbiš hódnotu x kaž tež y funkciji \"add\" přepodać.",
+
+    'lonlatAddError': "Dyrbiš hódnotu lon kaž tež lat funkciji \"add\" přepodać.",
+
+    'pixelAddError': "Dyrbiš hódnotu x kaž tež y funkciji \"add\" přepodać.",
+
+    'unsupportedGeometryType': "Njepodpěrowany geometrijowy typ: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition je so njeporadźił: element z id ${elemId} bu snano wopak zaměstnjeny.",
+
+    'filterEvaluateNotImplemented': "wuhódnoćenje njeje za tutón filtrowy typ implementowany."
+
+});
diff --git a/lib/OpenLayers/Lang/hu.js b/lib/OpenLayers/Lang/hu.js
new file mode 100644
index 0000000..d7278a8
--- /dev/null
+++ b/lib/OpenLayers/Lang/hu.js
@@ -0,0 +1,80 @@
+/* Translators (2009 onwards):
+ *  - City-busz
+ *  - Glanthor Reviol
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["hu"]
+ * Dictionary for Magyar.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["hu"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Nem kezelt kérés visszatérése ${statusText}",
+
+    'permalink': "Permalink",
+
+    'overlays': "Rávetítések",
+
+    'baseLayer': "Alapréteg",
+
+    'sameProjection': "Az áttekintő térkép csak abban az esetben működik, ha ugyanazon a vetületen van, mint a fő térkép.",
+
+    'readNotImplemented': "Olvasás nincs végrehajtva.",
+
+    'writeNotImplemented': "Írás nincs végrehajtva.",
+
+    'noFID': "Nem frissíthető olyan jellemző, amely nem rendelkezik FID-del.",
+
+    'errorLoadingGML': "Hiba GML-fájl betöltésekor ${url}",
+
+    'browserNotSupported': "A böngészője nem támogatja a vektoros renderelést. A jelenleg támogatott renderelők:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : az összetevőnek ilyen típusúnak kell lennie: ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent réteget hívott meg renderelő nélkül. Ez rendszerint azt jelenti, hogy megsemmisített egy fóliát, de néhány ahhoz társított kezelőt nem.",
+
+    'minZoomLevelError': "A minZoomLevel tulajdonságot csak a következővel való használatra szánták: FixedZoomLevels-leszármazott fóliák. Ez azt jelenti, hogy a minZoomLevel wfs fólia jelölőnégyzetei már a múlté. Mi azonban nem távolíthatjuk el annak a veszélye nélkül, hogy az esetlegesen ettől függő OL alapú alkalmazásokat tönkretennénk. Ezért ezt érvénytelenítjük -- a minZoomLevel az alul levő jelölőnégyzet a 3.0-s verzióból el lesz távolítva. Kérjük, helyette használja a  min/max felb [...]
+
+    'commitSuccess': "WFS tranzakció: SIKERES ${response}",
+
+    'commitFailed': "WFS tranzakció: SIKERTELEN ${response}",
+
+    'googleWarning': "A Google fólia betöltése sikertelen.\x3cbr\x3e\x3cbr\x3eAhhoz, hogy ez az üzenet eltűnjön, válasszon egy új BaseLayer fóliát a jobb felső sarokban található fóliakapcsoló segítségével.\x3cbr\x3e\x3cbr\x3eNagy valószínűséggel ez azért van, mert a Google Maps könyvtár parancsfájlja nem található, vagy nem tartalmazza az Ön oldalához tartozó megfelelő API-kulcsot.\x3cbr\x3e\x3cbr\x3eFejlesztőknek: A helyes működtetésre vonatkozó segítség az alábbi helyen érhető el, \x3 [...]
+
+    'getLayerWarning': "A(z) ${layerType} fólia nem töltődött be helyesen.\x3cbr\x3e\x3cbr\x3eAhhoz, hogy ez az üzenet eltűnjön, válasszon egy új BaseLayer fóliát a jobb felső sarokban található fóliakapcsoló segítségével.\x3cbr\x3e\x3cbr\x3eNagy valószínűséggel ez azért van, mert a(z) ${layerLib} könyvtár parancsfájlja helytelen.\x3cbr\x3e\x3cbr\x3eFejlesztőknek: A helyes működtetésre vonatkozó segítség az alábbi helyen érhető el, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib} [...]
+
+    'scale': "Lépték = 1 : ${scaleDenom}",
+
+    'W': "Ny",
+
+    'E': "K",
+
+    'N': "É",
+
+    'S': "D",
+
+    'layerAlreadyAdded': "Megpróbálta hozzáadni a(z) ${layerName} fóliát a térképhez, de az már hozzá van adva",
+
+    'reprojectDeprecated': "Ön a \'reproject\' beállítást használja a(z) ${layerName} fólián. Ez a beállítás érvénytelen: használata az üzleti alaptérképek fölötti adatok megjelenítésének támogatására szolgált, de ezt a funkció ezentúl a Gömbi Mercator használatával érhető el. További információ az alábbi helyen érhető el: http://trac.openlayers.org/wiki/SphericalMercator",
+
+    'methodDeprecated': "Ez a módszer érvénytelenítve lett és a 3.0-s verzióból el lesz távolítva. Használja a(z) ${newMethod} módszert helyette.",
+
+    'boundsAddError': "Az x és y értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",
+
+    'lonlatAddError': "A hossz. és szél. értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",
+
+    'pixelAddError': "Az x és y értékeknek egyaránt meg kell felelnie, hogy a funkciót hozzáadhassa.",
+
+    'unsupportedGeometryType': "Nem támogatott geometriatípus: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition sikertelen: lehetséges, hogy a(z) ${elemId} azonosítójú elem téves helyre került.",
+
+    'filterEvaluateNotImplemented': "ennél a szűrőtípusnál kiértékelés nem hajtódik végre."
+
+});
diff --git a/lib/OpenLayers/Lang/ia.js b/lib/OpenLayers/Lang/ia.js
new file mode 100644
index 0000000..4fe9a03
--- /dev/null
+++ b/lib/OpenLayers/Lang/ia.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - McDutchie
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["ia"]
+ * Dictionary for Interlingua.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["ia"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Le responsa a un requesta non esseva maneate: ${statusText}",
+
+    'permalink': "Permaligamine",
+
+    'overlays': "Superpositiones",
+
+    'baseLayer': "Strato de base",
+
+    'sameProjection': "Le mini-carta functiona solmente si illo es in le mesme projection que le carta principal",
+
+    'readNotImplemented': "Lectura non implementate.",
+
+    'writeNotImplemented': "Scriptura non implementate.",
+
+    'noFID': "Non pote actualisar un elemento sin FID.",
+
+    'errorLoadingGML': "Error al cargamento del file GML ${url}",
+
+    'browserNotSupported': "Tu navigator non supporta le rendition de vectores. Le renditores actualmente supportate es:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: le componente debe esser del typo ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent ha essite appellate in un strato sin renditor. Isto significa generalmente que tu ha destruite un strato, ma lassava un gestor associate con illo.",
+
+    'minZoomLevelError': "Le proprietate minZoomLevel es solmente pro uso con le stratos descendente de FixedZoomLevels. Le facto que iste strato WFS verifica minZoomLevel es un reliquia del passato. Nonobstante, si nos lo remove immediatemente, nos pote rumper applicationes a base de OL que depende de illo. Ergo nos lo declara obsolete; le verification de minZoomLevel in basso essera removite in version 3.0. Per favor usa in su loco le configuration de resolutiones min/max como describi [...]
+
+    'commitSuccess': "Transaction WFS: SUCCESSO ${response}",
+
+    'commitFailed': "Transaction WFS: FALLEVA ${response}",
+
+    'googleWarning': "Le strato Google non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de Google Maps non esseva includite o non contine le clave API correcte pro tu sito.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_ [...]
+
+    'getLayerWarning': "Le strato ${layerType} non poteva esser cargate correctemente.\x3cbr\x3e\x3cbr\x3ePro disfacer te de iste message, selige un nove BaseLayer in le selector de strato in alto a dextra.\x3cbr\x3e\x3cbr\x3eMulto probabilemente, isto es proque le script del libreria de ${layerLib} non esseva correctemente includite.\x3cbr\x3e\x3cbr\x3eDisveloppatores: Pro adjuta de corriger isto, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicca hic [...]
+
+    'scale': "Scala = 1 : ${scaleDenom}",
+
+    'W': "W",
+
+    'E': "E",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Tu tentava adder le strato: ${layerName} al carta, ma illo es ja presente",
+
+    'reprojectDeprecated': "Tu usa le option \'reproject\' in le strato ${layerName} layer. Iste option es obsolescente: illo esseva pro poter monstrar datos super cartas de base commercial, ma iste functionalitate pote ora esser attingite con le uso de Spherical Mercator. Ulterior information es disponibile a http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Iste methodo ha essite declarate obsolescente e essera removite in version 3.0. Per favor usa ${newMethod} in su loco.",
+
+    'boundsAddError': "Tu debe passar le duo valores x e y al function add.",
+
+    'lonlatAddError': "Tu debe passar le duo valores lon e lat al function add.",
+
+    'pixelAddError': "Tu debe passar le duo valores x e y al function add.",
+
+    'unsupportedGeometryType': "Typo de geometria non supportate: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition falleva: le elemento con id ${elemId} pote esser mal placiate.",
+
+    'filterEvaluateNotImplemented': "\"evaluate\" non es implementate pro iste typo de filtro."
+
+});
diff --git a/lib/OpenLayers/Lang/id.js b/lib/OpenLayers/Lang/id.js
new file mode 100644
index 0000000..3d714c9
--- /dev/null
+++ b/lib/OpenLayers/Lang/id.js
@@ -0,0 +1,80 @@
+/* Translators (2009 onwards):
+ *  - Irwangatot
+ *  - IvanLanin
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["id"]
+ * Dictionary for Bahasa Indonesia.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["id"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Permintaan yang tak tertangani menghasilkan ${statusText}",
+
+    'permalink': "Pranala permanen",
+
+    'overlays': "Hamparan",
+
+    'baseLayer': "Lapisan Dasar",
+
+    'sameProjection': "Peta tinjauan hanya bekerja bila dalam proyeksi yang sama dengan peta utama",
+
+    'readNotImplemented': "Membaca tidak diterapkan.",
+
+    'writeNotImplemented': "Menyimpan tidak diterapkan.",
+
+    'noFID': "Tidak dapat memperbarui fitur yang tidak memiliki FID.",
+
+    'errorLoadingGML': "Kesalahan dalam memuat berkas GML ${url}",
+
+    'browserNotSupported': "Peramban Anda tidak mendukung penggambaran vektor. Penggambar yang didukung saat ini adalah:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : komponen harus berupa ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent diterapkan pada lapisan tanpa penggambar. Ini biasanya berarti Anda menghapus sebuah lapisan, tetapi tidak menghapus penangan yang terkait dengannya.",
+
+    'minZoomLevelError': "Properti minZoomLevel hanya ditujukan bekerja dengan lapisan FixedZoomLevels-descendent. Pengecekan minZoomLevel oleh lapisan wfs adalah peninggalan masa lalu. Kami tidak dapat menghapusnya tanpa kemungkinan merusak aplikasi berbasis OL yang mungkin bergantung padanya. Karenanya, kami menganggapnya tidak berlaku -- Cek minZoomLevel di bawah ini akan dihapus pada 3.0. Silakan gunakan penyetelan resolusi min/maks seperti dijabarkan di sini: http://trac.openlayers. [...]
+
+    'commitSuccess': "WFS Transaksi: BERHASIL ${respon}",
+
+    'commitFailed': "WFS Transaksi: GAGAL ${respon}",
+
+    'googleWarning': "Lapisan Google tidak dapat dimuat dengan benar.\x3cbr\x3e\x3cbr\x3eUntuk menghilangkan pesan ini, pilih suatu BaseLayer baru melalui penukar lapisan (layer switcher) di ujung kanan atas.\x3cbr\x3e\x3cbr\x3eKemungkinan besar ini karena pustaka skrip Google Maps tidak disertakan atau tidak mengandung kunci API yang tepat untuk situs Anda.\x3cbr\x3e\x3cbr\x3ePengembang: Untuk bantuan mengatasi masalah ini, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\' [...]
+
+    'getLayerWarning': "Lapisan ${layerType} tidak dapat dimuat dengan benar.\x3cbr\x3e\x3cbr\x3eUntuk menghilangkan pesan ini, pilih suatu BaseLayer baru melalui penukar lapisan (layer switcher) di ujung kanan atas.\x3cbr\x3e\x3cbr\x3eKemungkinan besar ini karena pustaka skrip Google Maps tidak disertakan dengan benar.\x3cbr\x3e\x3cbr\x3ePengembang: Untuk bantuan mengatasi masalah ini, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklik di sini\x3c/a\x3e",
+
+    'scale': "Sekala = 1 : ${scaleDenom}",
+
+    'W': "B",
+
+    'E': "T",
+
+    'N': "U",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Anda mencoba menambahkan lapisan: ${layerName} ke dalam peta, tapi lapisan itu telah ditambahkan",
+
+    'reprojectDeprecated': "Anda menggunakan opsi \'reproject\' pada lapisan ${layerName}. Opsi ini telah ditinggalkan: penggunaannya dirancang untuk mendukung tampilan data melalui peta dasar komersial, tapi fungsionalitas tersebut saat ini harus dilakukan dengan menggunakan dukungan Spherical Mercator. Informasi lebih lanjut tersedia di http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Metode ini telah usang dan akan dihapus di 3.0. Sebaliknya, harap gunakan ${newMethod}.",
+
+    'boundsAddError': "Anda harus memberikan kedua nilai x dan y ke fungsi penambah.",
+
+    'lonlatAddError': "Anda harus memberikan kedua nilai lon dan lat ke fungsi penambah.",
+
+    'pixelAddError': "Anda harus memberikan kedua nilai x dan y ke fungsi penambah.",
+
+    'unsupportedGeometryType': "Tipe geometri tak didukung: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition gagal: elemen dengan id ${elemId} mungkin salah tempat.",
+
+    'filterEvaluateNotImplemented': "evaluasi tidak tersedia untuk tipe filter ini."
+
+});
diff --git a/lib/OpenLayers/Lang/io.js b/lib/OpenLayers/Lang/io.js
new file mode 100644
index 0000000..773a52f
--- /dev/null
+++ b/lib/OpenLayers/Lang/io.js
@@ -0,0 +1,19 @@
+/* Translators (2009 onwards):
+ *  - Malafaya
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["io"]
+ * Dictionary for Ido.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["io"] = OpenLayers.Util.applyDefaults({
+
+    'scale': "Skalo = 1 : ${scaleDenom}"
+
+});
diff --git a/lib/OpenLayers/Lang/is.js b/lib/OpenLayers/Lang/is.js
new file mode 100644
index 0000000..6dffaea
--- /dev/null
+++ b/lib/OpenLayers/Lang/is.js
@@ -0,0 +1,37 @@
+/* Translators (2009 onwards):
+ *  - Ævar Arnfjörð Bjarmason
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["is"]
+ * Dictionary for Íslenska.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["is"] = OpenLayers.Util.applyDefaults({
+
+    'permalink': "Varanlegur tengill",
+
+    'overlays': "Þekjur",
+
+    'baseLayer': "Grunnlag",
+
+    'sameProjection': "Yfirlitskortið virkar aðeins ef það er í sömu vörpun og aðalkortið",
+
+    'readNotImplemented': "Skrifun er óútfærð.",
+
+    'writeNotImplemented': "Lestur er óútfærður.",
+
+    'errorLoadingGML': "Villa kom upp við að hlaða inn GML skránni ${url}",
+
+    'scale': "Skali = 1 : ${scaleDenom}",
+
+    'layerAlreadyAdded': "Þú reyndir að bæta laginu ${layerName} á kortið en það er þegar búið að bæta því við",
+
+    'methodDeprecated': "Þetta fall hefur verið úrelt og verður fjarlægt í 3.0. Notaðu ${newMethod} í staðin."
+
+});
diff --git a/lib/OpenLayers/Lang/it.js b/lib/OpenLayers/Lang/it.js
new file mode 100644
index 0000000..201d4e0
--- /dev/null
+++ b/lib/OpenLayers/Lang/it.js
@@ -0,0 +1,116 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["it"]
+ * Dictionary for Italian.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang.it = {
+
+    'unhandledRequest': "Codice di ritorno della richiesta ${statusText}",
+
+    'permalink': "Permalink",
+
+    'overlays': "Overlays",
+
+    'baseLayer': "Livello base",
+
+    'sameProjection':
+        "La mini mappa funziona solamente se ha la stessa proiezione della mappa principale",
+
+    'readNotImplemented': "Lettura non implementata.",
+
+    'writeNotImplemented': "Scrittura non implementata.",
+
+    'noFID': "Impossibile aggiornare un elemento grafico che non abbia il FID.",
+
+    'errorLoadingGML': "Errore nel caricamento del file GML ${url}",
+
+    'browserNotSupported':
+        "Il tuo browser non supporta il rendering vettoriale. I renderizzatore attualemnte supportati sono:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : il componente dovrebbe essere di tipo ${geomType}",
+
+    // console message
+    'getFeatureError':
+        "getFeatureFromEvent chiamata su di un livello senza renderizzatore. Ciò significa che " +
+        "il livello è stato cancellato, ma non i gestori associati ad esso.",
+
+    // console message
+    'minZoomLevelError':
+        "La proprietà minZoomLevel è da utilizzare solamente " +
+        "con livelli che abbiano FixedZoomLevels. Il fatto che " +
+        "questo livello wfs controlli la proprietà minZoomLevel è " +
+        "un retaggio del passato. Non possiamo comunque rimuoverla " +
+        "senza rompere le vecchie applicazioni che dipendono su di essa." +
+        "Quindi siamo costretti a deprecarla -- minZoomLevel " +
+        "e sarà rimossa dalla vesione 3.0. Si prega di utilizzare i " +
+        "settaggi di risoluzione min/max come descritto qui: " +
+        "http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "Transazione WFS: SUCCESS ${response}",
+
+    'commitFailed': "Transazione WFS: FAILED ${response}",
+
+    'googleWarning':
+        "Il livello Google non è riuscito a caricare correttamente.<br><br>" +
+        "Per evitare questo messaggio, seleziona un nuovo BaseLayer " +
+        "nel selettore di livelli nell'angolo in alto a destra.<br><br>" +
+        "Più precisamente, ciò accade perchè la libreria Google Maps " +
+        "non è stata inclusa nella pagina, oppure non contiene la " +
+        "corretta API key per il tuo sito.<br><br>" +
+        "Sviluppatori: Per aiuto su come farlo funzionare correttamente, " +
+        "<a href='http://trac.openlayers.org/wiki/Google' " +
+        "target='_blank'>clicca qui</a>",
+
+    'getLayerWarning':
+        "Il livello ${layerType} non è riuscito a caricare correttamente.<br><br>" +
+        "Per evitare questo messaggio, seleziona un nuovo BaseLayer " +
+        "nel selettore di livelli nell'angolo in alto a destra.<br><br>" +
+        "Più precisamente, ciò accade perchè la libreria ${layerLib} " +
+        "non è stata inclusa nella pagina.<br><br>" +
+        "Sviluppatori: Per aiuto su come farlo funzionare correttamente, " +
+        "<a href='http://trac.openlayers.org/wiki/${layerLib}' " +
+        "target='_blank'>clicca qui</a>",
+
+    'scale': "Scala = 1 : ${scaleDenom}",
+
+    // console message
+    'layerAlreadyAdded':
+        "Stai cercando di aggiungere il livello: ${layerName} alla mappa, ma tale livello è già stato aggiunto.",
+
+    // console message
+    'reprojectDeprecated':
+        "Stai utilizzando l'opzione 'reproject' sul livello ${layerName}. " +
+        "Questa opzione è deprecata: il suo utilizzo è stato introdotto per" +
+        "supportare il disegno dei dati sopra mappe commerciali, ma tale " + 
+        "funzionalità dovrebbe essere ottenuta tramite l'utilizzo della proiezione " +
+        "Spherical Mercator. Per maggiori informazioni consultare qui " +
+        "http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    // console message
+    'methodDeprecated':
+        "Questo metodo è stato deprecato e sarà rimosso dalla versione 3.0. " +
+        "Si prega di utilizzare il metodo ${newMethod} in alternativa.",
+
+    // console message
+    'boundsAddError': "Devi specificare i valori di x e y alla funzione add.",
+
+    // console message
+    'lonlatAddError': "Devi specificare i valori di lon e lat alla funzione add.",
+
+    // console message
+    'pixelAddError': "Devi specificare i valori di x e y alla funzione add.",
+
+    // console message
+    'unsupportedGeometryType': "Tipo di geometria non supportata: ${geomType}",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition fallita: l'elemento con id ${elemId} è posizionato in modo errato.",
+                    
+    'end': ''
+};
diff --git a/lib/OpenLayers/Lang/ja.js b/lib/OpenLayers/Lang/ja.js
new file mode 100644
index 0000000..590422a
--- /dev/null
+++ b/lib/OpenLayers/Lang/ja.js
@@ -0,0 +1,80 @@
+/* Translators (2009 onwards):
+ *  - Fryed-peach
+ *  - Mage Whopper
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["ja"]
+ * Dictionary for 日本語.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["ja"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "未処理の要求は ${statusText} を返します",
+
+    'permalink': "パーマリンク",
+
+    'overlays': "オーバーレイ",
+
+    'baseLayer': "基底レイヤー",
+
+    'sameProjection': "概観地図はメインの地図と同じ投影法をとる場合のみ機能します",
+
+    'readNotImplemented': "読み込みは実装されていません。",
+
+    'writeNotImplemented': "書き込みは実装されていません。",
+
+    'noFID': "FID のない地物は更新できません。",
+
+    'errorLoadingGML': "GML ファイル ${url} の読み込みエラー",
+
+    'browserNotSupported': "あなたのブラウザはベクターグラフィックスの描写に対応していません。現時点で対応しているソフトウェアは以下のものです。\n${renderers}",
+
+    'componentShouldBe': "addFeatures: 要素は ${geomType} であるべきです",
+
+    'getFeatureError': "getFeatureFromEvent がレンダラーのないレイヤーから呼ばれました。通常、これはあなたがレイヤーを、それに関連づけられたいくつかのハンドラを除いて、破壊してしまったことを意味します。",
+
+    'minZoomLevelError': "minZoomLevel プロパティは FixedZoomLevels を継承するレイヤーでの使用のみを想定しています。この minZoomLevel に対する WFS レイヤーの検査は歴史的なものです。しかしながら、この検査を除去するとそれに依存する OpenLayers ベースのアプリケーションを破壊してしまう可能性があります。よって廃止が予定されており、この minZoomLevel 検査はバージョン3.0で除去されます。代わりに、http://trac.openlayers.org/wiki/SettingZoomLevels で解説されている、最小および最大解像度設定を使用してください。",
+
+    'commitSuccess': "WFS トランザクション: 成功 ${response}",
+
+    'commitFailed': "WFS トランザクション: 失敗 ${response}",
+
+    'googleWarning': "Google レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは Google マップ用ライブラリのスクリプトが組み込まれていないか、あなたのサイトに対応する正しい API キーが設定されていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",
+
+    'getLayerWarning': "${layerType} レイヤーが正しく読み込みを行えませんでした。\x3cbr\x3e\x3cbr\x3eこのメッセージを消すには、右上の隅にあるレイヤー切り替え部分で新しい基底レイヤーを選んでください。\x3cbr\x3e\x3cbr\x3eおそらく、これは ${layerLib} ライブラリのスクリプトが正しく組み込まれていないためです。\x3cbr\x3e\x3cbr\x3e開発者の方へ: 正しい動作をさせるために\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eこちらのウィキ\x3c/a\x3eを参照してください。",
+
+    'scale': "縮尺 = 1 : ${scaleDenom}",
+
+    'W': "西",
+
+    'E': "東",
+
+    'N': "北",
+
+    'S': "南",
+
+    'layerAlreadyAdded': "あなたは「${layerName}」を地図に追加しようと試みましたが、そのレイヤーは既に追加されています",
+
+    'reprojectDeprecated': "あなたは「${layerName}」レイヤーで reproject オプションを使っています。このオプションは商用の基底地図上に情報を表示する目的で設計されましたが、現在ではその機能は Spherical Mercator サポートを利用して実現されており、このオプションの使用は非推奨です。追加の情報は http://trac.openlayers.org/wiki/SphericalMercator で入手できます。",
+
+    'methodDeprecated': "このメソッドは廃止が予定されており、バージョン3.0で除去されます。代わりに ${newMethod} を使用してください。",
+
+    'boundsAddError': "x と y 両方の値を add 関数に渡さなければなりません。",
+
+    'lonlatAddError': "lon と lat 両方の値を add 関数に渡さなければなりません。",
+
+    'pixelAddError': "x と y の値両方を add 関数に渡さなければなりません。",
+
+    'unsupportedGeometryType': "未対応の形状型: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition が失敗しました: id ${elemId} をもつ要素が誤った位置にある可能性があります。",
+
+    'filterEvaluateNotImplemented': "このフィルター型について evaluate は実装されていません。"
+
+});
diff --git a/lib/OpenLayers/Lang/km.js b/lib/OpenLayers/Lang/km.js
new file mode 100644
index 0000000..a8ebd0d
--- /dev/null
+++ b/lib/OpenLayers/Lang/km.js
@@ -0,0 +1,25 @@
+/* Translators (2009 onwards):
+ *  - វ័ណថារិទ្ធ
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["km"]
+ * Dictionary for ភាសាខ្មែរ.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["km"] = OpenLayers.Util.applyDefaults({
+
+    'permalink': "តំណភ្ជាប់អចិន្ត្រៃយ៍",
+
+    'baseLayer': "ស្រទាប់បាត​",
+
+    'errorLoadingGML': "កំហុសកំឡុងពេលផ្ទុកឯកសារ GML ${url}",
+
+    'scale': "មាត្រដ្ឋាន = ១ ៖ ${scaleDenom}"
+
+});
diff --git a/lib/OpenLayers/Lang/ksh.js b/lib/OpenLayers/Lang/ksh.js
new file mode 100644
index 0000000..45e504b
--- /dev/null
+++ b/lib/OpenLayers/Lang/ksh.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - Purodha
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["ksh"]
+ * Dictionary for Ripoarisch.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["ksh"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Met dä Antwoot op en Aanfrooch ham_mer nix aanjefange: ${statusText}",
+
+    'permalink': "Lengk op Duuer",
+
+    'overlays': "Drövver jelaat",
+
+    'baseLayer': "Jrund-Nivoh",
+
+    'sameProjection': "De Övverseeschs_Kaat deiht et bloß, wann se de sälve Projäxjuhn bruche deiht, wi de Houp_Kaat",
+
+    'readNotImplemented': "„\x3ccode lang=\"en\"\x3eread\x3c/code\x3e“ is em Projramm nit fürjesinn.",
+
+    'writeNotImplemented': "„\x3ccode lang=\"en\"\x3ewrite\x3c/code\x3e“ is em Projramm nit fürjesinn.",
+
+    'noFID': "En Saach, woh kein \x3ci lang=\"en\"\x3eFID\x3c/i\x3e för doh es, löht sesch nit ändere.",
+
+    'errorLoadingGML': "Fähler beim \x3ci lang=\"en\"\x3eGML\x3c/i\x3e-Datei-Laade vun \x3ccode\x3e${url}\x3c/code\x3e",
+
+    'browserNotSupported': "Dinge Brauser kann kein Väktore ußjävve. De Zoote Ußjaabe, di em Momang jon, sen:\n${renderers}",
+
+    'componentShouldBe': "\x3ccode lang=\"en\"\x3eaddFeatures\x3c/code\x3e: dä Aandeil sullt vun dä Zoot „\x3ccode lang=\"en\"\x3e${geomType}\x3c/code\x3e“ sin.",
+
+    'getFeatureError': "\x3ccode lang=\"en\"\x3egetFeatureFromEvent\x3c/code\x3e es vun enem Nivoh opjeroofe woode, woh et kei Projramm zom Ußjävve jit. Dat bedügg för jewöhnlesch, dat De e Nivoh kapott jemaat häs, ävver nit e Projramm för domet ömzejonn, wat domet verbonge es.",
+
+    'minZoomLevelError': "De Eijeschaff „\x3ccode lang=\"en\"\x3eminZoomLevel\x3c/code\x3e“ es bloß doför jedaach, dat mer se met dä Nivvohß bruch, di vun \x3ccode lang=\"en\"\x3eFixedZoomLevels\x3c/code\x3e affhange don. Dat dat \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Nivvoh övverhoup de Eijeschaff „\x3ccode lang=\"en\"\x3eminZoomLevel\x3c/code\x3e“ pröhfe deiht, es noch övveresch vun fröhjer. Mer künne dat ävver jez nit fott lohße, oohne dat mer Jevaa loufe, dat Aanwendunge vun OpenLayers n [...]
+
+    'commitSuccess': "Dä \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Vörjang es joot jeloufe: ${response}",
+
+    'commitFailed': "Dä \x3ci lang=\"en\"\x3eWFS\x3c/i\x3e-Vörjang es scheif jejange: ${response}",
+
+    'googleWarning': "Dat Nivvoh \x3ccode lang=\"en\"\x3eGoogle\x3c/code\x3e kunnt nit reschtesch jelaade wääde.\x3cbr /\x3e\x3cbr /\x3eÖm hee di Nohreesch loß ze krijje, donn en ander Jrund-Nivvoh ußsöhke, rähß bovve en de Äk.\x3cbr /\x3e\x3cbr /\x3eWascheinlesch es dat wiel dat \x3ci lang=\"en\"\x3eGoogle-Maps\x3c/i\x3e-Skrepp entweeder nit reschtesch enjebonge wood, udder nit dä reschtejje \x3ci lang=\"en\"\x3eAPI\x3c/i\x3e-Schlößel för Ding Web-ßait scheke deiht.\x3cbr /\x3e\x3cbr /\ [...]
+
+    'getLayerWarning': "Dat Nivvoh \x3ccode\x3e${layerType}\x3c/code\x3e kunnt nit reschtesch jelaade wääde.\x3cbr /\x3e\x3cbr /\x3eÖm hee di Nohreesch loß ze krijje, donn en ander Jrund-Nivvoh ußsöhkre, rähß bovve en de Äk.\x3cbr /\x3e\x3cbr /\x3eWascheinlesch es dat, wiel dat Skrepp \x3ccode\x3e${layerLib}\x3c/code\x3e nit reschtesch enjebonge wood.\x3cbr /\x3e\x3cbr /\x3eFör Projrammierer jidd_Et Hölp do_drövver, \x3ca href=\"http://trac.openlayers.org/wiki/${layerLib}\" target=\"_bla [...]
+
+    'scale': "Mohßshtaab = 1 : ${scaleDenom}",
+
+    'W': "W",
+
+    'E': "O",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Do häß versöhk, dat Nivvoh \x3ccode\x3e${layerName}\x3c/code\x3e en di Kaat eren ze bränge, et wohr ävver ald do dren.",
+
+    'reprojectDeprecated': "Do bruchs de Ußwahl \x3ccode\x3ereproject\x3c/code\x3e op däm Nivvoh \x3ccode\x3e${layerName}\x3c/code\x3e. Di Ußwahl es nit mieh jähn jesinn. Se wohr doför jedaach, öm Date op jeschääfsmäßesch eruß jejovve Kaate bovve drop ze moole, wat ävver enzwesche besser met dä Öngershtözung för de ßfääresche Mäkaator Beldscher jeiht. Doh kanns De mieh drövver fenge op dä Sigg: http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Hee di Metood es nim_mih aktoäll un et weed se en dä Version 3.0 nit mieh jävve. Nemm \x3ccode\x3e${newMethod}\x3c/code\x3e doföör.",
+
+    'boundsAddError': "Do moß beeds vun de \x3ccode\x3ex\x3c/code\x3e un \x3ccode\x3ey\x3c/code\x3e Wääte aan de Fungkßjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",
+
+    'lonlatAddError': "Do moß beeds \x3ccode\x3elon\x3c/code\x3e un \x3ccode\x3elat\x3c/code\x3e aan de Fungkßjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",
+
+    'pixelAddError': "Do moß beeds \x3ccode\x3ex\x3c/code\x3e un \x3ccode\x3ey\x3c/code\x3e aan de Fungkßjohn \x3ccode\x3eadd\x3c/code\x3e jävve.",
+
+    'unsupportedGeometryType': "De Zoot Jommetrii dom_mer nit ongershtöze: \x3ccode\x3e${geomType}\x3c/code\x3e",
+
+    'pagePositionFailed': "\x3ccode lang=\"en\"\x3eOpenLayers.Util.pagePosition\x3c/code\x3e es donevve jejange: dat Denge met dä Kännong \x3ccode\x3e${elemId}\x3c/code\x3e künnt am verkeehte Plaz sin.",
+
+    'filterEvaluateNotImplemented': "„\x3ccode lang=\"en\"\x3eevaluate\x3c/code\x3e“ es för di Zoot Fellter nit enjereschdt."
+
+});
diff --git a/lib/OpenLayers/Lang/nb.js b/lib/OpenLayers/Lang/nb.js
new file mode 100644
index 0000000..2e9d140
--- /dev/null
+++ b/lib/OpenLayers/Lang/nb.js
@@ -0,0 +1,118 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["nb"]
+ * Dictionary for norwegian bokmål (Norway). Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["nb"] = {
+
+    'unhandledRequest': "Ubehandlet forespørsel returnerte ${statusText}",
+
+    'permalink': "Kobling til denne siden",
+
+    'overlays': "Kartlag",
+
+    'baseLayer': "Bakgrunnskart",
+
+    'sameProjection':
+        "Oversiktskartet fungerer bare når det har samme projeksjon som hovedkartet",
+
+    'readNotImplemented': "Lesing er ikke implementert.",
+
+    'writeNotImplemented': "Skriving er ikke implementert.",
+
+    'noFID': "Kan ikke oppdatere et feature (et objekt) som ikke har FID.",
+
+    'errorLoadingGML': "Feil under lasting av GML-fil ${url}",
+
+    'browserNotSupported':
+        "Din nettleser støtter ikke vektortegning. Tegnemetodene som støttes er:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : komponenten må være en ${geomType}",
+
+    // console message
+    'getFeatureError':
+        "getFeatureFromEvent har blitt kjørt mot et lag uten noen tegnemetode. Dette betyr som regel at du " +
+        "fjernet et lag uten å fjerne alle håndterere tilknyttet laget.",
+
+    // console message
+    'minZoomLevelError':
+        "Egenskapen minZoomLevel er kun ment til bruk på lag " +
+        "basert på FixedZoomLevels. At dette wfs-laget sjekker " +
+        "minZoomLevel er en etterlevning fra tidligere versjoner. Det kan dog ikke " +
+        "tas bort uten å risikere at OL-baserte applikasjoner " +
+        "slutter å virke, så det er merket som foreldet: " +
+        "minZoomLevel i sjekken nedenfor vil fjernes i 3.0. " +
+        "Vennligst bruk innstillingene for min/maks oppløsning " +
+        "som er beskrevet her: "+
+        "http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "WFS-transaksjon: LYKTES ${response}",
+
+    'commitFailed': "WFS-transaksjon: MISLYKTES ${response}",
+
+    'googleWarning':
+        "Google-laget kunne ikke lastes.<br><br>" +
+        "Bytt til et annet bakgrunnslag i lagvelgeren i " +
+        "øvre høyre hjørne for å slippe denne meldingen.<br><br>" +
+        "Sannsynligvis forårsakes feilen av at Google Maps-biblioteket " +
+        "ikke er riktig inkludert på nettsiden, eller at det ikke er " +
+        "angitt riktig API-nøkkel for nettstedet.<br><br>" +
+        "Utviklere: For hjelp til å få dette til å virke se "+
+        "<a href='http://trac.openlayers.org/wiki/Google' " +
+        "target='_blank'>her</a>.",
+
+    'getLayerWarning':
+        "${layerType}-laget kunne ikke lastes.<br><br>" +
+        "Bytt til et annet bakgrunnslag i lagvelgeren i " +
+        "øvre høyre hjørne for å slippe denne meldingen.<br><br>" +
+        "Sannsynligvis forårsakes feilen av at " +
+        "${layerLib}-biblioteket ikke var riktig inkludert " +
+        "på nettsiden.<br><br>" +
+        "Utviklere: For hjelp til å få dette til å virke se " +
+        "<a href='http://trac.openlayers.org/wiki/${layerLib}' " +
+        "target='_blank'>her</a>.",
+
+    'scale': "<strong>Skala</strong> 1 : ${scaleDenom}",
+
+    // console message
+    'layerAlreadyAdded':
+        "Du forsøkte å legge til laget ${layerName} på kartet, men det er allerede lagt til",
+
+    // console message
+    'reprojectDeprecated':
+        "Du bruker innstillingen 'reproject' på laget ${layerName}. " +
+        "Denne innstillingen er foreldet, den var ment for å støtte " +
+        "visning av kartdata over kommersielle bakgrunnskart, men det " +
+        "bør nå gjøres med støtten for Spherical Mercator. Mer informasjon " +
+        "finnes på http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    // console message
+    'methodDeprecated':
+        "Denne metoden er markert som foreldet og vil bli fjernet i 3.0. " +
+        "Vennligst bruk ${newMethod} i stedet.",
+
+    // console message
+    'boundsAddError': "Du må gi både x- og y-verdier til funksjonen add.",
+
+    // console message
+    'lonlatAddError': "Du må gi både lon- og lat-verdier til funksjonen add.",
+
+    // console message
+    'pixelAddError': "Du må gi både x- og y-verdier til funksjonen add.",
+
+    // console message
+    'unsupportedGeometryType': "Geometritypen ${geomType} er ikke støttet",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition feilet: elementet med id ${elemId} kan være feilplassert.",
+                    
+    'end': ''
+};
+
+OpenLayers.Lang["no"] = OpenLayers.Lang["nb"];
diff --git a/lib/OpenLayers/Lang/nds.js b/lib/OpenLayers/Lang/nds.js
new file mode 100644
index 0000000..a28ce6f
--- /dev/null
+++ b/lib/OpenLayers/Lang/nds.js
@@ -0,0 +1,61 @@
+/* Translators (2009 onwards):
+ *  - Slomox
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["nds"]
+ * Dictionary for Plattdüütsch.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["nds"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Unbehannelt Trüchmellels för de Anfraag ${statusText}",
+
+    'permalink': "Permalink",
+
+    'overlays': "Overlays",
+
+    'baseLayer': "Achtergrundkoort",
+
+    'sameProjection': "De Översichtskoort geiht blot, wenn de sülve Projekschoon as bi de Hööftkoort bruukt warrt",
+
+    'readNotImplemented': "Lesen is nich inricht.",
+
+    'writeNotImplemented': "Schrieven is nich inricht.",
+
+    'noFID': "En Feature, dat keen FID hett, kann nich aktuell maakt warrn.",
+
+    'errorLoadingGML': "Fehler bi’t Laden vun de GML-Datei ${url}",
+
+    'browserNotSupported': "Dien Browser ünnerstütt keen Vektorbiller. Ünnerstütt Renderers:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : Kumponent schull man den Typ ${geomType} hebben",
+
+    'getFeatureError': "getFeatureFromEvent is von en Laag ahn Render opropen worrn. Dat bedüüdt normalerwies, dat en Laag wegmaakt worrn is, aver nich de Handler, de dor op verwiest.",
+
+    'commitSuccess': "WFS-Transakschoon: hett klappt ${response}",
+
+    'commitFailed': "WFS-Transakschoon: hett nich klappt ${response}",
+
+    'scale': "Skaal = 1 : ${scaleDenom}",
+
+    'layerAlreadyAdded': "Du versöchst de Laag „${layerName}“ to de Koort totofögen, man de is al toföögt",
+
+    'methodDeprecated': "Disse Methood is oold un schall dat in 3.0 nich mehr geven. Bruuk dor man beter ${newMethod} för.",
+
+    'boundsAddError': "De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",
+
+    'lonlatAddError': "De Weert lon un lat, de mööt all beid an de add-Funkschoon övergeven warrn.",
+
+    'pixelAddError': "De Weert x un y, de mööt all beid an de add-Funkschoon övergeven warrn.",
+
+    'unsupportedGeometryType': "Nich ünnerstütt Geometrie-Typ: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition güng nich: Element mit de Id ${elemId} is villicht an’n verkehrten Platz."
+
+});
diff --git a/lib/OpenLayers/Lang/nl.js b/lib/OpenLayers/Lang/nl.js
new file mode 100644
index 0000000..968a0fb
--- /dev/null
+++ b/lib/OpenLayers/Lang/nl.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - Siebrand
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["nl"]
+ * Dictionary for Nederlands.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["nl"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Het verzoek is niet afgehandeld met de volgende melding: ${statusText}",
+
+    'permalink': "Permanente verwijzing",
+
+    'overlays': "Overlays",
+
+    'baseLayer': "Achtergrondkaart",
+
+    'sameProjection': "De overzichtskaart werkt alleen als de projectie gelijk is aan de projectie van de hoofdkaart",
+
+    'readNotImplemented': "Lezen is niet geïmplementeerd.",
+
+    'writeNotImplemented': "Schrijven is niet geïmplementeerd.",
+
+    'noFID': "Een optie die geen FID heeft kan niet bijgewerkt worden.",
+
+    'errorLoadingGML': "Er is een fout opgetreden bij het laden van het GML bestand van ${url}",
+
+    'browserNotSupported': "Uw browser ondersteunt het weergeven van vectoren niet.\nMomenteel ondersteunde weergavemogelijkheden:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : component moet van het type ${geomType} zijn",
+
+    'getFeatureError': "getFeatureFromEvent is aangeroepen op een laag zonder rederer.\nDit betekent meestal dat u een laag hebt verwijderd, maar niet een handler die ermee geassocieerd was.",
+
+    'minZoomLevelError': "De eigenschap minZoomLevel is alleen bedoeld voor gebruik lagen met die afstammen van FixedZoomLevels-lagen.\nDat deze WFS-laag minZoomLevel controleert, is een overblijfsel uit het verleden.\nWe kunnen deze controle echter niet verwijderen zonder op OL gebaseerde applicaties die hervan afhankelijk zijn stuk te maken.\nDaarom heeft deze functionaliteit de eigenschap \'deprecated\' gekregen - de minZoomLevel wordt verwijderd in versie 3.0.\nGebruik in plaats van  [...]
+
+    'commitSuccess': "WFS-transactie: succesvol ${response}",
+
+    'commitFailed': "WFS-transactie: mislukt ${response}",
+
+    'googleWarning': "De Google-Layer kon niet correct geladen worden.\x3cbr /\x3e\x3cbr /\x3e\nOm deze melding niet meer te krijgen, moet u een andere achtergrondkaart kiezen in de laagwisselaar in de rechterbovenhoek.\x3cbr /\x3e\x3cbr /\x3e\nDit komt waarschijnlijk doordat de bibliotheek ${layerLib} niet correct ingevoegd is.\x3cbr /\x3e\x3cbr /\x3e\nOntwikkelaars: \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklik hier\x3c/a\x3e om dit werkend te krijgen.",
+
+    'getLayerWarning': "De laag ${layerType} kon niet goed geladen worden.\x3cbr /\x3e\x3cbr /\x3e\nOm deze melding niet meer te krijgen, moet u een andere achtergrondkaart kiezen in de laagwisselaar in de rechterbovenhoek.\x3cbr /\x3e\x3cbr /\x3e\nDit komt waarschijnlijk doordat de bibliotheek ${layerLib} niet correct is ingevoegd.\x3cbr /\x3e\x3cbr /\x3e\nOntwikkelaars: \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklik hier\x3c/a\x3e om dit werkend te [...]
+
+    'scale': "Schaal = 1 : ${scaleDenom}",
+
+    'W': "W",
+
+    'E': "O",
+
+    'N': "N",
+
+    'S': "Z",
+
+    'layerAlreadyAdded': "U hebt geprobeerd om de laag  ${layerName} aan de kaart toe te voegen, maar deze is al toegevoegd",
+
+    'reprojectDeprecated': "U gebruikt de optie \'reproject\' op de laag ${layerName}.\nDeze optie is vervallen: deze optie was ontwikkeld om gegevens over commerciële basiskaarten weer te geven, maar deze functionaliteit wordt nu bereikt door ondersteuning van Spherical Mercator.\nMeer informatie is beschikbaar op http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Deze methode is verouderd en wordt verwijderd in versie 3.0.\nGebruik ${newMethod}.",
+
+    'boundsAddError': "U moet zowel de x- als de y-waarde doorgeven aan de toevoegfunctie.",
+
+    'lonlatAddError': "U moet zowel de lengte- als de breedtewaarde doorgeven aan de toevoegfunctie.",
+
+    'pixelAddError': "U moet zowel de x- als de y-waarde doorgeven aan de toevoegfunctie.",
+
+    'unsupportedGeometryType': "Dit geometrietype wordt niet ondersteund: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition is mislukt: het element met id ${elemId} is wellicht onjuist geplaatst.",
+
+    'filterEvaluateNotImplemented': "evalueren is niet geïmplementeerd voor dit filtertype."
+
+});
diff --git a/lib/OpenLayers/Lang/nn.js b/lib/OpenLayers/Lang/nn.js
new file mode 100644
index 0000000..46c0be6
--- /dev/null
+++ b/lib/OpenLayers/Lang/nn.js
@@ -0,0 +1,27 @@
+/* Translators (2009 onwards):
+ *  - Harald Khan
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["nn"]
+ * Dictionary for ‪Norsk (nynorsk)‬.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["nn"] = OpenLayers.Util.applyDefaults({
+
+    'scale': "Skala = 1 : ${scaleDenom}",
+
+    'layerAlreadyAdded': "Du freista å leggja til laget «${layerName}» på kartet, men det har alt vorte lagt til.",
+
+    'boundsAddError': "Du er nøydd til å gje både ein x- og ein y-verdi til «add»-funksjonen.",
+
+    'lonlatAddError': "Du er nøydd til å gje både lon- og lat-verdiar til «add»-funksjonen.",
+
+    'pixelAddError': "Du er nøydd til å gje både ein x- og ein y-verdi til «add»-funksjonen."
+
+});
diff --git a/lib/OpenLayers/Lang/oc.js b/lib/OpenLayers/Lang/oc.js
new file mode 100644
index 0000000..4956fb5
--- /dev/null
+++ b/lib/OpenLayers/Lang/oc.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - Cedric31
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["oc"]
+ * Dictionary for Occitan.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["oc"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Requèsta pas gerida, retorna ${statusText}",
+
+    'permalink': "Permaligam",
+
+    'overlays': "Calques",
+
+    'baseLayer': "Calc de basa",
+
+    'sameProjection': "La carta de situacion fonciona pas que quora sa projeccion es la meteissa que la de la carta principala",
+
+    'readNotImplemented': "Lectura pas implementada.",
+
+    'writeNotImplemented': "Escritura pas implementada.",
+
+    'noFID': "Impossible de metre a jorn un objècte sens identificant (fid).",
+
+    'errorLoadingGML': "Error al cargament del fichièr GML ${url}",
+
+    'browserNotSupported': "Vòstre navegidor supòrta pas lo rendut vectorial. Los renderers actualament suportats son : \n${renderers}",
+
+    'componentShouldBe': "addFeatures : lo compausant deuriá èsser de tipe ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent es estat apelat sus un calc sens renderer. Aquò significa generalament qu\'avètz destruch aqueste jaç, mas qu\'avètz conservat un handler que li èra associat.",
+
+    'minZoomLevelError': "La proprietat minZoomLevel deu èsser utilizada solament per de jaces FixedZoomLevels-descendent. Lo fach qu\'aqueste jaç WFS verifique la preséncia de minZoomLevel es una relica del passat. Çaquelà, la podèm suprimir sens copar d\'aplicacions que ne poirián dependre. Es per aquò que la depreciam -- la verificacion del minZoomLevel serà suprimida en version 3.0. A la plaça, mercés d\'utilizar los paramètres de resolucions min/max tal coma descrich sus : http://tr [...]
+
+    'commitSuccess': "Transaccion WFS : SUCCES ${response}",
+
+    'commitFailed': "Transaccion WFS : FRACAS ${response}",
+
+    'googleWarning': "Lo jaç Google es pas estat en mesura de se cargar corrèctament.\x3cbr\x3e\x3cbr\x3ePer suprimir aqueste messatge, causissètz una BaseLayer novèla dins lo selector de jaç en naut a drecha.\x3cbr\x3e\x3cbr\x3eAquò es possiblament causat par la non-inclusion de la librariá Google Maps, o alara perque que la clau de l\'API correspond pas a vòstre site.\x3cbr\x3e\x3cbr\x3eDesvolopaires : per saber cossí corregir aquò, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' [...]
+
+    'getLayerWarning': "Lo jaç ${layerType} es pas en mesura de se cargar corrèctament.\x3cbr\x3e\x3cbr\x3ePer suprimir aqueste messatge, causissètz una  BaseLayer novèla dins lo selector de jaç en naut a drecha.\x3cbr\x3e\x3cbr\x3eAquò es possiblament causat per la non-inclusion de la librariá ${layerLib}.\x3cbr\x3e\x3cbr\x3eDesvolopaires : per saber cossí corregir aquí, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eclicatz aicí\x3c/a\x3e",
+
+    'scale': "Escala ~ 1 : ${scaleDenom}",
+
+    'W': "O",
+
+    'E': "È",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Avètz ensajat d\'apondre a la carta lo calc : ${layerName}, mas ja es present",
+
+    'reprojectDeprecated': "Utilizatz l\'opcion \'reproject\' sul jaç ${layerName}. Aquesta opcion es despreciada : Son usatge permetiá d\'afichar de donadas al dessús de jaces raster comercials. Aquesta foncionalitat ara es suportada en utilizant lo supòrt de la projeccion Mercator Esferica. Mai d\'informacion es disponibla sus http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Aqueste metòde es despreciada, e serà suprimida a la version 3.0. Mercés d\'utilizar ${newMethod} a la plaça.",
+
+    'boundsAddError': "Vos cal passar las doas valors x e y a la foncion add.",
+
+    'lonlatAddError': "Vos cal passar las doas valors lon e lat a la foncion add.",
+
+    'pixelAddError': "Vos cal passar las doas valors x e y a la foncion add.",
+
+    'unsupportedGeometryType': "Tipe de geometria pas suportat : ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition a fracassat : l\'element d\'id ${elemId} poiriá èsser mal posicionat.",
+
+    'filterEvaluateNotImplemented': "evaluar es pas encara estat implementat per aqueste tipe de filtre."
+
+});
diff --git a/lib/OpenLayers/Lang/pt-BR.js b/lib/OpenLayers/Lang/pt-BR.js
new file mode 100644
index 0000000..9f413ed
--- /dev/null
+++ b/lib/OpenLayers/Lang/pt-BR.js
@@ -0,0 +1,80 @@
+/* Translators (2009 onwards):
+ *  - Luckas Blade
+ *  - Rodrigo Avila
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["pt-br"]
+ * Dictionary for Português do Brasil.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["pt-br"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "A requisição retornou um erro não tratado: ${statusText}",
+
+    'permalink': "Link para essa página",
+
+    'overlays': "Camadas de Sobreposição",
+
+    'baseLayer': "Camada Base",
+
+    'sameProjection': "O mapa de referência só funciona quando ele está na mesma projeção do mapa principal",
+
+    'readNotImplemented': "Leitura não implementada.",
+
+    'writeNotImplemented': "Escrita não implementada.",
+
+    'noFID': "Não é possível atualizar uma feição que não tenha um FID.",
+
+    'errorLoadingGML': "Erro ao carregar o arquivo GML ${url}",
+
+    'browserNotSupported': "Seu navegador não suporta renderização de vetores. Os renderizadores suportados atualmente são:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: o componente deve ser do tipo ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent foi executado mas nenhum renderizador foi encontrado. Isso pode indicar que você destruiu uma camana, mas não o handler associado a ela.",
+
+    'minZoomLevelError': "A propriedade minZoomLevel é de uso restrito das camadas descendentes de FixedZoomLevels. A verificação dessa propriedade pelas camadas wfs é um resíduo do passado. Não podemos, entretanto não é possível removê-la sem possívelmente quebrar o funcionamento de aplicações OL que possuem depência com ela. Portanto estamos tornando seu uso obsoleto -- a verificação desse atributo será removida na versão 3.0. Ao invés, use as opções de resolução min/max como descrito  [...]
+
+    'commitSuccess': "Transação WFS : SUCESSO ${response}",
+
+    'commitFailed': "Transação WFS : ERRO ${response}",
+
+    'googleWarning': "Não foi possível carregar a camada Google corretamente.\x3cbr\x3e\x3cbr\x3ePara se livrar dessa mensagem, selecione uma nova Camada Base, na ferramenta de alternação de camadas localização do canto superior direito.\x3cbr\x3e\x3cbr\x3eMuito provavelmente, isso foi causado porque o script da biblioteca do Google Maps não foi incluído, ou porque ele não contém a chave correta da API para o seu site.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: Para obter ajuda em solucionar es [...]
+
+    'getLayerWarning': "Não foi possível carregar a camada ${layerType} corretamente.\x3cbr\x3e\x3cbr\x3ePara se livrar dessa mensagem, selecione uma nova Camada Base, na ferramenta de alternação de camadas localização do canto superior direito.\x3cbr\x3e\x3cbr\x3eMuito provavelmente, isso foi causado porque o script da biblioteca ${layerLib} não foi incluído corretamente.\x3cbr\x3e\x3cbr\x3eDesenvolvedores: Para obter ajuda em solucionar esse problema \x3ca href=\'http://trac.openlayers [...]
+
+    'scale': "Escala = 1 : ${scaleDenom}",
+
+    'W': "O",
+
+    'E': "L",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Você tentou adicionar a camada: ${layerName} ao mapa, mas ela já foi adicionada",
+
+    'reprojectDeprecated': "Você está usando a opção \'reproject\' na camada ${layerName}. Essa opção está obsoleta: seu uso foi projetado para suportar a visualização de dados sobre bases de mapas comerciais, entretanto essa funcionalidade deve agora ser alcançada usando o suporte à projeção Mercator. Mais informação está disponível em: http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Esse método está obsoleto e será removido na versão 3.0. Ao invés, por favor use ${newMethod}.",
+
+    'boundsAddError': "Você deve informar ambos os valores x e y para a função add.",
+
+    'lonlatAddError': "Você deve informar ambos os valores lon e lat para a função add.",
+
+    'pixelAddError': "Você deve informar ambos os valores x e y para a função add.",
+
+    'unsupportedGeometryType': "Tipo geométrico não suportado: ${geomType}.",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition falhou: o elemento de id ${elemId} deve estar fora do lugar.",
+
+    'filterEvaluateNotImplemented': "evaluete não está implementado para este tipo de filtro."
+
+});
diff --git a/lib/OpenLayers/Lang/pt.js b/lib/OpenLayers/Lang/pt.js
new file mode 100644
index 0000000..1548512
--- /dev/null
+++ b/lib/OpenLayers/Lang/pt.js
@@ -0,0 +1,81 @@
+/* Translators (2009 onwards):
+ *  - Hamilton Abreu
+ *  - Malafaya
+ *  - Waldir
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["pt"]
+ * Dictionary for Português.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["pt"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Servidor devolveu erro não contemplado ${statusText}",
+
+    'permalink': "Ligação permanente",
+
+    'overlays': "Sobreposições",
+
+    'baseLayer': "Camada Base",
+
+    'sameProjection': "O mapa panorâmico só funciona quando está na mesma projeção que o mapa principal",
+
+    'readNotImplemented': "Leitura não implementada.",
+
+    'writeNotImplemented': "Escrita não implementada.",
+
+    'noFID': "Não é possível atualizar um elemento para a qual não há FID.",
+
+    'errorLoadingGML': "Erro ao carregar ficheiro GML ${url}",
+
+    'browserNotSupported': "O seu navegador não suporta renderização vetorial. Actualmente os renderizadores suportados são:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: componente deve ser um(a) ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent foi chamado numa camada sem renderizador. Isto normalmente significa que destruiu uma camada, mas não um manipulador \'\'(handler)\'\' que lhe está associado.",
+
+    'minZoomLevelError': "A propriedade minZoomLevel só deve ser usada com as camadas descendentes da FixedZoomLevels. A verificação da propriedade por esta camada wfs é uma relíquia do passado. No entanto, não podemos removê-la sem correr o risco de afectar aplicações OL que dependam dela. Portanto, estamos a torná-la obsoleta -- a verificação minZoomLevel será removida na versão 3.0. Em vez dela, por favor, use as opções de resolução min/max descritas aqui: http://trac.openlayers.org/w [...]
+
+    'commitSuccess': "Transacção WFS: SUCESSO ${response}",
+
+    'commitFailed': "Transacção WFS: FALHOU ${response}",
+
+    'googleWarning': "A Camada Google não foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara deixar de receber esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca do Google Maps não foi incluído ou não contém a chave API correcta para o seu sítio.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac. [...]
+
+    'getLayerWarning': "A camada ${layerType} não foi correctamente carregada.\x3cbr\x3e\x3cbr\x3ePara desactivar esta mensagem, seleccione uma nova Camada-Base no \'\'switcher\'\' de camadas no canto superior direito.\x3cbr\x3e\x3cbr\x3eProvavelmente, isto acontece porque o \'\'script\'\' da biblioteca ${layerLib} não foi incluído correctamente.\x3cbr\x3e\x3cbr\x3eProgramadores: Para ajuda sobre como solucionar o problema \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target [...]
+
+    'scale': "Escala = 1 : ${scaleDenom}",
+
+    'W': "O",
+
+    'E': "E",
+
+    'N': "N",
+
+    'S': "S",
+
+    'layerAlreadyAdded': "Você tentou adicionar a camada: ${layerName} ao mapa, mas ela já tinha sido adicionada antes",
+
+    'reprojectDeprecated': "Está usando a opção \'reproject\' na camada ${layerName}. Esta opção é obsoleta: foi concebida para permitir a apresentação de dados sobre mapas-base comerciais, mas esta funcionalidade é agora suportada pelo Mercator Esférico. Mais informação está disponível em http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Este método foi declarado obsoleto e será removido na versão 3.0. Por favor, use ${newMethod} em vez disso.",
+
+    'boundsAddError': "Você deve passar tanto o valor x como o y à função de adição.",
+
+    'lonlatAddError': "Você deve passar tanto o valor lon como o lat à função de adição.",
+
+    'pixelAddError': "Você deve passar tanto o valor x como o y à função de adição.",
+
+    'unsupportedGeometryType': "Tipo de geometria não suportado: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition falhou: o elemento com o id ${elemId} poderá estar mal-posicionado.",
+
+    'filterEvaluateNotImplemented': "avaliar não está implementado para este tipo de filtro."
+
+});
diff --git a/lib/OpenLayers/Lang/ru.js b/lib/OpenLayers/Lang/ru.js
new file mode 100644
index 0000000..ace8151
--- /dev/null
+++ b/lib/OpenLayers/Lang/ru.js
@@ -0,0 +1,82 @@
+/* Translators (2009 onwards):
+ *  - Ferrer
+ *  - Komzpa
+ *  - Lockal
+ *  - Александр Сигачёв
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["ru"]
+ * Dictionary for Русский.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["ru"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Необработанный запрос вернул ${statusText}",
+
+    'permalink': "Постоянная ссылка",
+
+    'overlays': "Слои",
+
+    'baseLayer': "Основной слой",
+
+    'sameProjection': "Обзорная карта работает только тогда, когда имеет ту же проекцию, что и основная",
+
+    'readNotImplemented': "Чтение не реализовано.",
+
+    'writeNotImplemented': "Запись не реализована.",
+
+    'noFID': "Невозможно обновить объект, для которого нет FID.",
+
+    'errorLoadingGML': "Ошибка при загрузке файла GML ${url}",
+
+    'browserNotSupported': "Ваш браузер не поддерживает векторную графику. На данный момент поддерживаются:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: компонент должен быть ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent вызван для слоя без рендерера. Обычно это говорит о том, что вы уничтожили слой, но оставили связанный с ним обработчик.",
+
+    'minZoomLevelError': "Свойство minZoomLevel предназначено только для использования со слоями, являющимися потомками FixedZoomLevels. То, что этот WFS-слой проверяется на minZoomLevel — реликт прошлого. Однако мы не можем удалить эту функцию, так как, возможно, от неё зависят некоторые основанные на OpenLayers приложения. Функция объявлена устаревшей — проверка minZoomLevel будет удалена в 3.0. Пожалуйста, используйте вместо неё настройку мин/макс разрешения, описанную здесь: http://t [...]
+
+    'commitSuccess': "Транзакция WFS: УСПЕШНО ${response}",
+
+    'commitFailed': "Транзакция WFS: ОШИБКА ${response}",
+
+    'googleWarning': "Слой Google не удалось нормально загрузить.\x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека Google Maps не была включена или не содержит корректного API-ключа для вашего сайта.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\ [...]
+
+    'getLayerWarning': "Слой ${layerType} не удалось нормально загрузить. \x3cbr\x3e\x3cbr\x3eЧтобы избавиться от этого сообщения, выбите другой основной слой в переключателе в правом верхнем углу.\x3cbr\x3e\x3cbr\x3eСкорее всего, причина в том, что библиотека ${layerLib} не была включена или была включена некорректно.\x3cbr\x3e\x3cbr\x3eРазработчикам: чтобы узнать, как сделать, чтобы всё заработало, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eщёлкните [...]
+
+    'scale': "Масштаб = 1 : ${scaleDenom}",
+
+    'W': "З",
+
+    'E': "В",
+
+    'N': "С",
+
+    'S': "Ю",
+
+    'layerAlreadyAdded': "Вы попытались добавить слой «${layerName}» на карту, но он уже был добавлен",
+
+    'reprojectDeprecated': "Вы используете опцию \'reproject\' для слоя ${layerName}. Эта опция является устаревшей: ее использование предполагалось для поддержки показа данных поверх коммерческих базовых карт, но теперь этот функционал несёт встроенная поддержка сферической проекции Меркатора. Больше сведений доступно на http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Этот метод считается устаревшим и будет удалён в версии 3.0. Пожалуйста, пользуйтесь ${newMethod}.",
+
+    'boundsAddError': "Функции add надо передавать оба значения, x и y.",
+
+    'lonlatAddError': "Функции add надо передавать оба значения, lon и lat.",
+
+    'pixelAddError': "Функции add надо передавать оба значения, x и y.",
+
+    'unsupportedGeometryType': "Неподдерживаемый тип геометрии: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition failed: элемент с id ${elemId} может находиться не в нужном месте.",
+
+    'filterEvaluateNotImplemented': "evaluate не реализовано для фильтра данного типа."
+
+});
diff --git a/lib/OpenLayers/Lang/sk.js b/lib/OpenLayers/Lang/sk.js
new file mode 100644
index 0000000..6d82d99
--- /dev/null
+++ b/lib/OpenLayers/Lang/sk.js
@@ -0,0 +1,71 @@
+/* Translators (2009 onwards):
+ *  - Helix84
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["sk"]
+ * Dictionary for Slovenčina.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["sk"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Neobslúžené požiadavky vracajú ${statusText}",
+
+    'permalink': "Trvalý odkaz",
+
+    'overlays': "Prekrytia",
+
+    'baseLayer': "Základná vrstva",
+
+    'sameProjection': "Prehľadová mapka funguje iba vtedy, keď je v rovnakej projekcii ako hlavná mapa",
+
+    'readNotImplemented': "Čítanie nie je implementované.",
+
+    'writeNotImplemented': "Zápis nie je implementovaný.",
+
+    'noFID': "Nie je možné aktualizovať vlastnosť, pre ktorú neexistuje FID.",
+
+    'errorLoadingGML': "Chyba pri načítaní súboru GML ${url}",
+
+    'browserNotSupported': "Váš prehliadač nepodporuje vykresľovanie vektorov. Momentálne podporované vykresľovače sú:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: komponent by mal byť ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent bola zavolaná na vrstve bez vykresľovača. To zvyčajne znamená, že ste odstránili vrstvu, ale nie niektorú z obslúh, ktorá je s ňou asociovaná.",
+
+    'minZoomLevelError': "Vlastnosť minZoomLevel je určený iba na použitie s vrstvami odvodenými od FixedZoomLevels. To, že táto wfs vrstva kontroluje minZoomLevel je pozostatok z minulosti. Nemôžeme ho však odstrániť, aby sme sa vyhli možnému porušeniu aplikácií založených na Open Layers, ktoré na tomto môže závisieť. Preto ho označujeme ako zavrhovaný - dolu uvedená kontrola minZoomLevel bude odstránená vo verzii 3.0. Použite prosím namiesto toho kontrolu min./max. rozlíšenia podľa tu  [...]
+
+    'commitSuccess': "Transakcia WFS: ÚSPEŠNÁ ${response}",
+
+    'commitFailed': "Transakcia WFS: ZLYHALA ${response}",
+
+    'googleWarning': "Vrstvu Google nebolo možné správne načítať.\x3cbr\x3e\x3cbr\x3eAby ste sa tejto správy zbavili vyberte novú BaseLayer v prepínači vrstiev v pravom hornom rohu.\x3cbr\x3e\x3cbr\x3eToto sa stalo pravdepodobne preto, že skript knižnice Google Maps buď nebol načítaný alebo neobsahuje správny kľúč API pre vašu lokalitu.\x3cbr\x3e\x3cbr\x3eVývojári: Tu môžete získať \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3epomoc so sfunkčnením\x3c/a\x3e",
+
+    'getLayerWarning': "Vrstvu ${layerType} nebolo možné správne načítať.\x3cbr\x3e\x3cbr\x3eAby ste sa tejto správy zbavili vyberte novú BaseLayer v prepínači vrstiev v pravom hornom rohu.\x3cbr\x3e\x3cbr\x3eToto sa stalo pravdepodobne preto, že skript knižnice ${layerType} buď nebol načítaný alebo neobsahuje správny kľúč API pre vašu lokalitu.\x3cbr\x3e\x3cbr\x3eVývojári: Tu môžete získať \x3ca href=\'http://trac.openlayers.org/wiki/${layerType}\' target=\'_blank\'\x3epomoc so sfunkčne [...]
+
+    'scale': "Mierka = 1 : ${scaleDenom}",
+
+    'layerAlreadyAdded': "Pokúsili ste sa do mapy pridať vrstvu ${layerName}, ale tá už bola pridaná",
+
+    'reprojectDeprecated': "Používate voľby „reproject“ vrstvy ${layerType}. Táto voľba je zzavrhovaná: jej použitie bolo navrhnuté na podporu zobrazovania údajov nad komerčnými základovými mapami, ale túto funkcionalitu je teraz možné dosiahnuť pomocou Spherical Mercator. Ďalšie informácie získate na stránke http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Táto metóda je zavrhovaná a bude odstránená vo verzii 3.0. Použite prosím namiesto nej metódu ${newMethod}.",
+
+    'boundsAddError': "Sčítacej funkcii musíte dať hodnoty x aj y.",
+
+    'lonlatAddError': "Sčítacej funkcii musíte dať hodnoty lon (zem. dĺžka) aj lat (zem. šírka).",
+
+    'pixelAddError': "Sčítacej funkcii musíte dať hodnoty x aj y.",
+
+    'unsupportedGeometryType': "Nepodporovaný typ geometrie: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition zlyhalo: prvok s id ${elemId} môže byť zle umiestnený.",
+
+    'filterEvaluateNotImplemented': "evaluate nie je implementovaný pre tento typ filtra"
+
+});
diff --git a/lib/OpenLayers/Lang/sv-SE.js b/lib/OpenLayers/Lang/sv-SE.js
new file mode 100644
index 0000000..0b70e80
--- /dev/null
+++ b/lib/OpenLayers/Lang/sv-SE.js
@@ -0,0 +1,71 @@
+/* Translators (2009 onwards):
+ *  - Sannab
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["sv"]
+ * Dictionary for Svenska.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["sv"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Ej hanterad fråga retur ${statusText}",
+
+    'permalink': "Permalänk",
+
+    'overlays': "Kartlager",
+
+    'baseLayer': "Bakgrundskarta",
+
+    'sameProjection': "Översiktskartan fungerar endast när den har samma projektion som huvudkartan",
+
+    'readNotImplemented': "Läsning ej implementerad.",
+
+    'writeNotImplemented': "Skrivning ej implementerad.",
+
+    'noFID': "Kan ej uppdatera feature (objekt) för vilket FID saknas.",
+
+    'errorLoadingGML': "Fel i laddning av GML-fil ${url}",
+
+    'browserNotSupported': "Din webbläsare stöder inte vektorvisning. För närvarande stöds följande visning:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : komponenten skall vara en ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent anropad för lager utan utritning. Detta betyder oftast att man raderat ett lager, men inte en hanterare som är knuten till lagret.",
+
+    'minZoomLevelError': "Egenskapen minZoomLevel är endast avsedd att användas med lager med FixedZoomLevels. Att detta WFS-lager kontrollerar minZoomLevel är en relik från äldre versioner. Vi kan dock inte ta bort det utan att riskera att OL-baserade tillämpningar som använder detta slutar fungera. Därför är det satt som deprecated, minZoomLevel kommer att tas bort i version 3.0. Använd i stället inställning av min/max resolution som beskrivs här: http://trac.openlayers.org/wiki/Settin [...]
+
+    'commitSuccess': "WFS-transaktion: LYCKADES ${response}",
+
+    'commitFailed': "WFS-transaktion: MISSLYCKADES ${response}",
+
+    'googleWarning': "Google-lagret kunde inte laddas korrekt.\x3cbr\x3e\x3cbr\x3eFör att slippa detta meddelande, välj en annan bakgrundskarta i lagerväljaren i övre högra hörnet.\x3cbr\x3e\x3cbr\x3eSannolikt beror felet på att Google Maps-biblioteket inte är inkluderat på webbsidan eller på att sidan inte anger korrekt API-nyckel för webbplatsen.\x3cbr\x3e\x3cbr\x3eUtvecklare: hjälp för att åtgärda detta, \x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eklicka [...]
+
+    'getLayerWarning': "${layerType}-lagret kunde inte laddas korrekt.\x3cbr\x3e\x3cbr\x3eFör att slippa detta meddelande, välj en annan bakgrundskarta i lagerväljaren i övre högra hörnet.\x3cbr\x3e\x3cbr\x3eSannolikt beror felet på att ${layerLib}-biblioteket inte är inkluderat på webbsidan.\x3cbr\x3e\x3cbr\x3eUtvecklare: hjälp för att åtgärda detta, \x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eklicka här\x3c/a\x3e.",
+
+    'scale': "\x3cstrong\x3eSkala\x3c/strong\x3e 1 : ${scaleDenom}",
+
+    'layerAlreadyAdded': "Du försökte lägga till lagret: ${layerName} på kartan, men det har lagts till tidigare",
+
+    'reprojectDeprecated': "Du använder inställningen \'reproject\' på lagret ${layerName}. Denna inställning markerad som deprecated: den var avsedd att användas för att stödja visning av kartdata på kommersiella bakgrundskartor, men nu bör man i stället använda Spherical Mercator-stöd för den funktionaliteten. Mer information finns på http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    'methodDeprecated': "Denna metod är markerad som deprecated och kommer att tas bort i 3.0. Använd ${newMethod} i stället.",
+
+    'boundsAddError': "Du måste skicka både x- och y-värde till funktionen add.",
+
+    'lonlatAddError': "Du måste skicka både lon- och lat-värde till funktionen add.",
+
+    'pixelAddError': "Du måste skicka både x- och y-värde till funktionen add.",
+
+    'unsupportedGeometryType': "Stöd saknas för geometritypen: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition misslyckades: elementet med id ${elemId} kan placeras fel.",
+
+    'filterEvaluateNotImplemented': "evaluering har ej implementerats för denna typ av filter."
+
+});
diff --git a/lib/OpenLayers/Lang/te.js b/lib/OpenLayers/Lang/te.js
new file mode 100644
index 0000000..6594927
--- /dev/null
+++ b/lib/OpenLayers/Lang/te.js
@@ -0,0 +1,27 @@
+/* Translators (2009 onwards):
+ *  - Veeven
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["te"]
+ * Dictionary for తెలుగు.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["te"] = OpenLayers.Util.applyDefaults({
+
+    'permalink': "స్థిరలింకు",
+
+    'W': "ప",
+
+    'E': "తూ",
+
+    'N': "ఉ",
+
+    'S': "ద"
+
+});
diff --git a/lib/OpenLayers/Lang/vi.js b/lib/OpenLayers/Lang/vi.js
new file mode 100644
index 0000000..5452700
--- /dev/null
+++ b/lib/OpenLayers/Lang/vi.js
@@ -0,0 +1,79 @@
+/* Translators (2009 onwards):
+ *  - Minh Nguyen
+ */
+
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["vi"]
+ * Dictionary for Tiếng Việt.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["vi"] = OpenLayers.Util.applyDefaults({
+
+    'unhandledRequest': "Không xử lý được phản hồi ${statusText} cho yêu cầu",
+
+    'permalink': "Liên kết thường trực",
+
+    'overlays': "Lấp bản đồ",
+
+    'baseLayer': "Lớp nền",
+
+    'sameProjection': "Bản đồ toàn cảnh chỉ hoạt động khi cùng phép chiếu với bản đồ chính",
+
+    'readNotImplemented': "Chưa hỗ trợ chức năng đọc.",
+
+    'writeNotImplemented': "Chưa hỗ trợ chức năng viết.",
+
+    'noFID': "Không thể cập nhật tính năng thiếu FID.",
+
+    'errorLoadingGML': "Lỗi tải tập tin GML tại ${url}",
+
+    'browserNotSupported': "Trình duyệt của bạn không hỗ trợ chức năng vẽ bằng vectơ. Hiện hỗ trợ các bộ kết xuất:\n${renderers}",
+
+    'componentShouldBe': "addFeatures: bộ phận cần phải là ${geomType}",
+
+    'getFeatureError': "getFeatureFromEvent được gọi từ lớp không có bộ kết xuất. Thường thì có lẽ lớp bị xóa nhưng một phần xử lý của nó vẫn còn.",
+
+    'minZoomLevelError': "Chỉ nên sử dụng thuộc tính minZoomLevel với các lớp FixedZoomLevels-descendent. Việc lớp wfs này tìm cho minZoomLevel là di tích còn lại từ xưa. Tuy nhiên, nếu chúng tôi dời nó thì sẽ vỡ các chương trình OpenLayers mà dựa trên nó. Bởi vậy chúng tôi phản đối sử dụng nó\x26nbsp;– bước tìm cho minZoomLevel sẽ được dời vào phiên bản 3.0. Xin sử dụng thiết lập độ phân tích tối thiểu / tối đa thay thế, theo hướng dẫn này: http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "Giao dịch WFS: THÀNH CÔNG ${response}",
+
+    'commitFailed': "Giao dịch WFS: THẤT BẠI ${response}",
+
+    'googleWarning': "Không thể tải lớp Google đúng đắn.\x3cbr\x3e\x3cbr\x3eĐể tránh thông báo này lần sau, hãy chọn BaseLayer mới dùng điều khiển chọn lớp ở góc trên phải.\x3cbr\x3e\x3cbr\x3eChắc script thư viện Google Maps hoặc không được bao gồm hoặc không chứa khóa API hợp với website của bạn.\x3cbr\x3e\x3cbr\x3e\x3ca href=\'http://trac.openlayers.org/wiki/Google\' target=\'_blank\'\x3eTrợ giúp về tính năng này\x3c/a\x3e cho người phát triển.",
+
+    'getLayerWarning': "Không thể tải lớp ${layerType} đúng đắn.\x3cbr\x3e\x3cbr\x3eĐể tránh thông báo này lần sau, hãy chọn BaseLayer mới dùng điều khiển chọn lớp ở góc trên phải.\x3cbr\x3e\x3cbr\x3eChắc script thư viện ${layerLib} không được bao gồm đúng kiểu.\x3cbr\x3e\x3cbr\x3e\x3ca href=\'http://trac.openlayers.org/wiki/${layerLib}\' target=\'_blank\'\x3eTrợ giúp về tính năng này\x3c/a\x3e cho người phát triển.",
+
+    'scale': "Tỷ lệ = 1 : ${scaleDenom}",
+
+    'W': "T",
+
+    'E': "Đ",
+
+    'N': "B",
+
+    'S': "N",
+
+    'layerAlreadyAdded': "Bạn muốn thêm lớp ${layerName} vào bản đồ, nhưng lớp này đã được thêm",
+
+    'reprojectDeprecated': "Bạn đang áp dụng chế độ “reproject” vào lớp ${layerName}. Chế độ này đã bị phản đối: nó có mục đích hỗ trợ lấp dữ liệu trên các nền bản đồ thương mại; nên thực hiện hiệu ứng đó dùng tính năng Mercator Hình cầu. Có sẵn thêm chi tiết tại http://trac.openlayers.org/wiki/SphericalMercator .",
+
+    'methodDeprecated': "Phương thức này đã bị phản đối và sẽ bị dời vào phiên bản 3.0. Xin hãy sử dụng ${newMethod} thay thế.",
+
+    'boundsAddError': "Cần phải cho cả giá trị x và y vào hàm add.",
+
+    'lonlatAddError': "Cần phải cho cả giá trị lon và lat vào hàm add.",
+
+    'pixelAddError': "Cần phải cho cả giá trị x và y vào hàm add.",
+
+    'unsupportedGeometryType': "Không hỗ trợ kiểu địa lý: ${geomType}",
+
+    'pagePositionFailed': "OpenLayers.Util.pagePosition bị thất bại: nguyên tố với ID ${elemId} có thể ở chỗ sai.",
+
+    'filterEvaluateNotImplemented': "chưa hỗ trợ evaluate cho loại bộ lọc này."
+
+});
diff --git a/lib/OpenLayers/Lang/zh-CN.js b/lib/OpenLayers/Lang/zh-CN.js
new file mode 100644
index 0000000..67c084a
--- /dev/null
+++ b/lib/OpenLayers/Lang/zh-CN.js
@@ -0,0 +1,116 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["zh-CN"]
+ * Dictionary for Simplified Chinese.  Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["zh-CN"] = {
+
+    'unhandledRequest': "未处理的请求,返回值为 ${statusText}",
+
+    'permalink': "永久链接",
+
+    'overlays': "叠加层",
+
+    'baseLayer': "基础图层",
+
+    'sameProjection':
+        "鹰眼地图只有在和主地图使用相同的投影的时候才能正常共工作",
+
+    'readNotImplemented': "读取功能没有实现。",
+
+    'writeNotImplemented': "写入功能没有实现。",
+
+    'noFID': "无法更新feature,缺少FID。",
+
+    'errorLoadingGML': "加载GML文件 ${url} 出现错误。",
+
+    'browserNotSupported':
+        "你使用的浏览器不支持矢量渲染。当前支持的渲染方式包括:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : 组件类型应该是 ${geomType}",
+
+    // console message
+    'getFeatureError':
+        "getFeatureFromEvent方法在一个没有渲染器的图层上被调用。 这通常意味着您" +
+        "销毁了一个图层,但并未销毁其关联的handler。",
+
+    // console message
+    'minZoomLevelError':
+        "minZoomLevel属性仅适合用于" +
+        "使用了固定缩放级别的图层。这个 " +
+        "wfs 图层检查 minZoomLevel 是过去遗留下来的。" +
+        "然而,我们不能移除它," +
+        "而破坏依赖于它的基于OL的应用程序。" +
+        "因此,我们废除了它 -- minZoomLevel " +
+        "将会在3.0中被移除。请改用 " +
+        "min/max resolution 设置,参考:" +
+        "http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "WFS Transaction: 成功。 ${response}",
+
+    'commitFailed': "WFS Transaction: 失败。 ${response}",
+
+    'googleWarning':
+        "Google图层不能正确加载。<br><br>" +
+        "要消除这个信息,请在右上角的" +
+        "图层控制面板中选择其他的基础图层。<br><br>" +
+        "这种情况很可能是没有正确的包含Google地图脚本库," +
+        "或者是没有包含在你的站点上" +
+        "使用的正确的Google Maps API密匙。<br><br>" +
+        "开发者:获取使其正确工作的帮助信息," +
+        "<a href='http://trac.openlayers.org/wiki/Google' " +
+        "target='_blank'>点击这里</a>",
+
+    'getLayerWarning':
+        "${layerType} 图层不能正确加载。<br><br>" +
+        "要消除这个信息,请在右上角的" +
+        "图层控制面板中选择其他的基础图层。<br><br>" +
+        "这种情况很可能是没有正确的包含" +
+        "${layerLib} 脚本库。<br><br>" +
+        "开发者:获取使其正确工作的帮助信息," +
+        "<a href='http://trac.openlayers.org/wiki/${layerLib}' " +
+        "target='_blank'>点击这里</a>",
+
+    'scale': "比例尺 = 1 : ${scaleDenom}",
+
+    // console message
+    'layerAlreadyAdded':
+        "你尝试添加图层: ${layerName} 到地图中,但是它之前就已经被添加。",
+
+    // console message
+    'reprojectDeprecated':
+        "你正在使用 ${layerName} 图层上的'reproject'选项。" +
+        "这个选项已经不再使用:" +
+        "它是被设计用来支持显示商业的地图数据," + 
+        "不过现在该功能可以通过使用Spherical Mercator来实现。" +
+        "更多信息可以参阅" +
+        "http://trac.openlayers.org/wiki/SphericalMercator.",
+
+    // console message
+    'methodDeprecated':
+        "该方法已经不再被支持,并且将在3.0中被移除。" +
+        "请使用 ${newMethod} 方法来替代。",
+
+    // console message
+    'boundsAddError': "您必须传递 x 和 y 两个参数值到 add 方法。",
+
+    // console message
+    'lonlatAddError': "您必须传递 lon 和 lat 两个参数值到 add 方法。",
+
+    // console message
+    'pixelAddError': "您必须传递 x and y 两个参数值到 add 方法。",
+
+    // console message
+    'unsupportedGeometryType': "不支持的几何体类型: ${geomType}",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition 失败:id 为 ${elemId} 的元素可能被错置。",
+                    
+    'end': ''
+};
diff --git a/lib/OpenLayers/Lang/zh-TW.js b/lib/OpenLayers/Lang/zh-TW.js
new file mode 100644
index 0000000..67eea71
--- /dev/null
+++ b/lib/OpenLayers/Lang/zh-TW.js
@@ -0,0 +1,117 @@
+/**
+ * @requires OpenLayers/Lang.js
+ */
+
+/**
+ * Namespace: OpenLayers.Lang["zh-TW"]
+ * Dictionary for Traditional Chinese. (Used Mainly in Taiwan) 
+ * Keys for entries are used in calls to
+ *     <OpenLayers.Lang.translate>.  Entry bodies are normal strings or
+ *     strings formatted for use with <OpenLayers.String.format> calls.
+ */
+OpenLayers.Lang["zh-TW"] = {
+
+    'unhandledRequest': "未處理的請求,傳回值為 ${statusText}。",
+
+    'permalink': "永久連結",
+
+    'overlays': "額外圖層",
+
+    'baseLayer': "基礎圖層",
+
+    'sameProjection':
+        "地圖縮覽(OverviewMap)只能在跟主地圖相同投影時起作用。",
+
+    'readNotImplemented': "沒有實作讀取的功能。",
+
+    'writeNotImplemented': "沒有實作寫入的功能。",
+
+    'noFID': "因為沒有 FID 所以無法更新 feature。",
+
+    'errorLoadingGML': "讀取GML檔案 ${url} 錯誤。",
+
+    'browserNotSupported':
+        "您的瀏覽器未支援向量渲染. 目前支援的渲染方式是:\n${renderers}",
+
+    'componentShouldBe': "addFeatures : 元件應該為 ${geomType}",
+
+    // console message
+    'getFeatureError':
+        "getFeatureFromEvent 在一個沒有被渲染的圖層裡被呼叫。這通常意味著您 " +
+        "摧毀了一個圖層,但並未摧毀相關的handler。",
+
+    // console message
+    'minZoomLevelError':
+        "minZoomLevel 屬性僅適合用在 " +
+        "FixedZoomLevels-descendent 類型的圖層. 這個" +
+        "wfs layer 的 minZoomLevel 是過去所遺留下來的," +
+        "然而我們不能移除它而不讓它將" +
+        "過去的程式相容性給破壞掉。" +
+        "因此我們將會迴避使用它 -- minZoomLevel " +
+        "會在3.0被移除,請改" +
+        "用在這邊描述的 min/max resolution 設定: " +
+        "http://trac.openlayers.org/wiki/SettingZoomLevels",
+
+    'commitSuccess': "WFS Transaction: 成功 ${response}",
+
+    'commitFailed': "WFS Transaction: 失敗 ${response}",
+
+    'googleWarning':
+        "The Google Layer 圖層無法被正確的載入。<br><br>" +
+        "要迴避這個訊息, 請在右上角的圖層改變器裡," +
+        "選一個新的基礎圖層。<br><br>" +
+        "很有可能是因為 Google Maps 的函式庫" +
+        "腳本沒有被正確的置入,或沒有包含 " +
+        "您網站上正確的 API key <br><br>" +
+        "開發者: 要幫助這個行為正確完成," +
+        "<a href='http://trac.openlayers.org/wiki/Google' " +
+        "target='_blank'>請按這裡</a>",
+
+    'getLayerWarning':
+        "${layerType} 圖層無法被正確的載入。<br><br>" +
+        "要迴避這個訊息, 請在右上角的圖層改變器裡," +
+        "選一個新的基礎圖層。<br><br>" +
+        "很有可能是因為 ${layerLib} 的函式庫" +
+        "腳本沒有被正確的置入。<br><br>" +
+        "開發者: 要幫助這個行為正確完成," +
+        "<a href='http://trac.openlayers.org/wiki/${layerLib}' " +
+        "target='_blank'>請按這裡</a>",
+
+    'scale': "Scale = 1 : ${scaleDenom}",
+
+    // console message
+    'layerAlreadyAdded':
+        "你試著新增圖層: ${layerName} 到地圖上,但圖層之前就已經被新增了。",
+
+    // console message
+    'reprojectDeprecated':
+        "你正使用 'reproject' 這個選項 " +
+        "在 ${layerName} 層。這個選項已經不再使用:" +
+        "它的使用原本是設計用來支援在商業地圖上秀出資料," + 
+        "但這個功能已經被" +
+        "Spherical Mercator所取代。更多的資訊可以在 " +
+        "http://trac.openlayers.org/wiki/SphericalMercator 找到。",
+
+    // console message
+    'methodDeprecated':
+        "這個方法已經不再使用且在3.0將會被移除," +
+        "請使用 ${newMethod} 來代替。",
+
+    // console message
+    'boundsAddError': "您必須傳入 x 跟 y 兩者的值進 add 函數。",
+
+    // console message
+    'lonlatAddError': "您必須傳入 lon 跟 lat 兩者的值進 add 函數。",
+
+    // console message
+    'pixelAddError': "您必須傳入 x 跟 y 兩者的值進 add 函數。",
+
+    // console message
+    'unsupportedGeometryType': "未支援的幾何型別: ${geomType}。",
+
+    // console message
+    'pagePositionFailed':
+        "OpenLayers.Util.pagePosition 失敗: id ${elemId} 的 element 可能被錯置。",
+                    
+    'end': ''
+};
diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js
new file mode 100644
index 0000000..fc3635e
--- /dev/null
+++ b/lib/OpenLayers/Layer.js
@@ -0,0 +1,1304 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Map.js
+ * @requires OpenLayers/Projection.js
+ */
+
+/**
+ * Class: OpenLayers.Layer
+ */
+OpenLayers.Layer = OpenLayers.Class({
+
+    /**
+     * APIProperty: id
+     * {String}
+     */
+    id: null,
+
+    /** 
+     * APIProperty: name
+     * {String}
+     */
+    name: null,
+
+    /** 
+     * APIProperty: div
+     * {DOMElement}
+     */
+    div: null,
+
+    /**
+     * Property: opacity
+     * {Float} The layer's opacity. Float number between 0.0 and 1.0.
+     */
+    opacity: null,
+
+    /**
+     * 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 
+     *     assume that it should always be in range.
+     * 
+     *     See #987 for more info.
+     */
+    alwaysInRange: null,   
+
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * layer.events.register(type, obj, listener);
+     * (end)
+     *
+     * Listeners will be called with a reference to an event object.  The
+     *     properties of this event depends on exactly what happened.
+     *
+     * All event objects have at least the following properties:
+     * object - {Object} A reference to layer.events.object.
+     * element - {DOMElement} A reference to layer.events.element.
+     *
+     * Supported map event types:
+     * loadstart - Triggered when layer loading starts.
+     * loadend - Triggered when layer loading ends.
+     * loadcancel - Triggered when layer loading is canceled.
+     * visibilitychanged - Triggered when layer visibility is changed.
+     * move - Triggered when layer moves (triggered with every mousemove
+     *     during a drag).
+     * moveend - Triggered when layer is done moving, object passed as
+     *     argument has a zoomChanged boolean property which tells that the
+     *     zoom has changed.
+     */
+    EVENT_TYPES: ["loadstart", "loadend", "loadcancel", "visibilitychanged",
+                  "move", "moveend"],
+
+    /**
+     * Constant: RESOLUTION_PROPERTIES
+     * {Array} The properties that are used for calculating resolutions
+     *     information.
+     */
+    RESOLUTION_PROPERTIES: [
+        'scales', 'resolutions',
+        'maxScale', 'minScale',
+        'maxResolution', 'minResolution',
+        'numZoomLevels', 'maxZoomLevel'
+    ],
+
+    /**
+     * APIProperty: events
+     * {<OpenLayers.Events>}
+     */
+    events: null,
+
+    /**
+     * APIProperty: map
+     * {<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 
+     *     individually by all subclasses. Default is false
+     */
+    isBaseLayer: false,
+ 
+    /**
+     * Property: alpha
+     * {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.
+     */
+    displayInLayerSwitcher: true,
+
+    /**
+     * APIProperty: visibility
+     * {Boolean} The layer should be displayed in the map.  Default is true.
+     */
+    visibility: true,
+
+    /**
+     * APIProperty: attribution
+     * {String} Attribution string, displayed when an 
+     *     <OpenLayers.Control.Attribution> has been added to the map.
+     */
+    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 
+     *     changes.
+     */
+    inRange: false,
+    
+    /**
+     * Propery: imageSize
+     * {<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 
+     *     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
+     *     object and sent to the constructor when the layer is created.
+     */
+    options: null,
+
+    /**
+     * APIProperty: eventListeners
+     * {Object} If set as an option at construction, the eventListeners
+     *     object will be registered with <OpenLayers.Events.on>.  Object
+     *     structure must be a listeners object as shown in the example for
+     *     the events.on method.
+     */
+    eventListeners: null,
+
+    /**
+     * APIProperty: gutter
+     * {Integer} Determines the width (in pixels) of the gutter around image
+     *     tiles to ignore.  By setting this property to a non-zero value,
+     *     images will be requested that are wider and taller than the tile
+     *     size by a value of 2 x gutter.  This allows artifacts of rendering
+     *     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, 
+
+    /**
+     * APIProperty: projection
+     * {<OpenLayers.Projection>} or {<String>} Set in the layer options to
+     *     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.  
+     */
+    projection: null,    
+    
+    /**
+     * APIProperty: units
+     * {String} The layer map units.  Defaults to 'degrees'.  Possible values
+     *     are 'degrees' (or 'dd'), 'm', 'ft', 'km', 'mi', 'inches'.
+     */
+    units: null,
+
+    /**
+     * APIProperty: scales
+     * {Array}  An array of map scales in descending order.  The values in the
+     *     array correspond to the map scale denominator.  Note that these
+     *     values only make sense if the display (monitor) resolution of the
+     *     client is correctly guessed by whomever is configuring the
+     *     application.  In addition, the units property must also be set.
+     *     Use <resolutions> instead wherever possible.
+     */
+    scales: null,
+
+    /**
+     * APIProperty: resolutions
+     * {Array} 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,
+    
+    /**
+     * APIProperty: maxExtent
+     * {<OpenLayers.Bounds>}  The center of these bounds will not stray outside
+     *     of the viewport extent during panning.  In addition, if
+     *     <displayOutsideMaxExtent> is set to false, data will not be
+     *     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 
+     *     displaying the whole world.
+     */
+    maxResolution: null,
+
+    /**
+     * APIProperty: minResolution
+     * {Float}
+     */
+    minResolution: null,
+
+    /**
+     * APIProperty: numZoomLevels
+     * {Integer}
+     */
+    numZoomLevels: null,
+   
+    /**
+     * APIProperty: minScale
+     * {Float}
+     */
+    minScale: null,
+    
+    /**
+     * APIProperty: maxScale
+     * {Float}
+     */
+    maxScale: null,
+
+    /**
+     * APIProperty: displayOutsideMaxExtent
+     * {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.   
+     */
+    wrapDateLine: false,
+    
+    /**
+     * APIProperty: transitionEffect
+     * {String} The transition effect to use when the map is panned or
+     *     zoomed.  
+     *
+     * There are currently two supported values:
+     *  - *null* No transition effect (the default).
+     *  - *resize*  Existing tiles are resized on zoom to provide a visual
+     *    effect of the zoom having taken place immediately.  As the
+     *    new tiles become available, they are drawn over top of the
+     *    resized tiles.
+     */
+    transitionEffect: null,
+    
+    /**
+     * Property: SUPPORTED_TRANSITIONS
+     * {Array} An immutable (that means don't change it!) list of supported 
+     *     transitionEffect values.
+     */
+    SUPPORTED_TRANSITIONS: ['resize'],
+
+    /**
+     * Property: metadata
+     * {Object} This object can be used to store additional information on a
+     *     layer object.
+     */
+    metadata: {},
+    
+    /**
+     * Constructor: OpenLayers.Layer
+     *
+     * Parameters:
+     * name - {String} The layer name
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, options) {
+
+        this.addOptions(options);
+
+        this.name = name;
+        
+        if (this.id == null) {
+
+            this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
+
+            this.div = OpenLayers.Util.createDiv(this.id);
+            this.div.style.width = "100%";
+            this.div.style.height = "100%";
+            this.div.dir = "ltr";
+
+            this.events = new OpenLayers.Events(this, this.div, 
+                                                this.EVENT_TYPES);
+            if(this.eventListeners instanceof Object) {
+                this.events.on(this.eventListeners);
+            }
+
+        }
+
+        if (this.wrapDateLine) {
+            this.displayOutsideMaxExtent = true;
+        }
+    },
+    
+    /**
+     * Method: destroy
+     * Destroy is a destructor: this is to alleviate cyclic references which
+     *     the Javascript garbage cleaner can not take care of on its own.
+     *
+     * Parameters:
+     * setNewBaseLayer - {Boolean} Set a new base layer when this layer has
+     *     been destroyed.  Default is true.
+     */
+    destroy: function(setNewBaseLayer) {
+        if (setNewBaseLayer == null) {
+            setNewBaseLayer = true;
+        }
+        if (this.map != null) {
+            this.map.removeLayer(this, setNewBaseLayer);
+        }
+        this.projection = null;
+        this.map = null;
+        this.name = null;
+        this.div = null;
+        this.options = null;
+
+        if (this.events) {
+            if(this.eventListeners) {
+                this.events.un(this.eventListeners);
+            }
+            this.events.destroy();
+        }
+        this.eventListeners = null;
+        this.events = null;
+    },
+    
+   /**
+    * Method: clone
+    *
+    * Parameters:
+    * obj - {<OpenLayers.Layer>} The layer to be cloned
+    *
+    * Returns:
+    * {<OpenLayers.Layer>} An exact clone of this <OpenLayers.Layer>
+    */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer(this.name, this.getOptions());
+        }
+        
+        // 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. 
+        obj.map = null;
+        
+        return obj;
+    },
+    
+    /**
+     * Method: getOptions
+     * Extracts an object from the layer with the properties that were set as
+     *     options, but updates them with the values currently set on the
+     *     instance.
+     * 
+     * Returns:
+     * {Object} the <options> of the layer, representing the current state.
+     */
+    getOptions: function() {
+        var options = {};
+        for(var o in this.options) {
+            options[o] = this[o];
+        }
+        return options;
+    },
+    
+    /** 
+     * APIMethod: setName
+     * Sets the new layer name for this layer.  Can trigger a changelayer event
+     *     on the map.
+     *
+     * Parameters:
+     * newName - {String} The new name.
+     */
+    setName: function(newName) {
+        if (newName != this.name) {
+            this.name = newName;
+            if (this.map != null) {
+                this.map.events.triggerEvent("changelayer", {
+                    layer: this,
+                    property: "name"
+                });
+            }
+        }
+    },    
+    
+   /**
+    * 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);
+
+        // make sure this.projection references a projection object
+        if(typeof this.projection == "string") {
+            this.projection = new OpenLayers.Projection(this.projection);
+        }
+
+        // get the units from the projection, if we have a projection
+        // and it it has units
+        if(this.projection && this.projection.getUnits()) {
+            this.units = this.projection.getUnits();
+        }
+
+        // re-initialize resolutions if necessary, i.e. if any of the
+        // properties of the "properties" array defined below is set
+        // in the new options
+        if(this.map) {
+            var properties = this.RESOLUTION_PROPERTIES.concat(
+                ["projection", "units", "minExtent", "maxExtent"]
+            );
+            for(var o in newOptions) {
+                if(newOptions.hasOwnProperty(o) &&
+                   OpenLayers.Util.indexOf(properties, o) >= 0) {
+
+                    this.initResolutions();
+                    break;
+                }
+            }
+        }
+    },
+
+    /**
+     * APIMethod: onMapResize
+     * This function can be implemented by subclasses
+     */
+    onMapResize: function() {
+        //this function can be implemented by subclasses  
+    },
+
+    /**
+     * APIMethod: redraw
+     * Redraws the layer.  Returns true if the layer was redrawn, false if not.
+     *
+     * Returns:
+     * {Boolean} The layer was redrawn.
+     */
+    redraw: function() {
+        var redrawn = false;
+        if (this.map) {
+
+            // min/max Range may have changed
+            this.inRange = this.calculateInRange();
+
+            // map's center might not yet be set
+            var extent = this.getExtent();
+
+            if (extent && this.inRange && this.visibility) {
+                var zoomChanged = true;
+                this.moveTo(extent, zoomChanged, false);
+                this.events.triggerEvent("moveend",
+                    {"zoomChanged": zoomChanged});
+                redrawn = true;
+            }
+        }
+        return redrawn;
+    },
+
+    /**
+     * Method: moveTo
+     * 
+     * Parameters:
+     * bound - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean} Tells when zoom has changed, as layers have to
+     *     do some init work in that case.
+     * dragging - {Boolean}
+     */
+    moveTo:function(bounds, zoomChanged, dragging) {
+        var display = this.visibility;
+        if (!this.isBaseLayer) {
+            display = display && this.inRange;
+        }
+        this.display(display);
+    },
+
+    /**
+     * 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. 
+     * 
+     * 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.minExtent = this.minExtent || this.map.minExtent;
+
+            this.projection = this.projection || this.map.projection;
+            if (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
+     *     will have a base layer.  To be overridden by subclasses.
+     */
+    afterAdd: function() {
+    },
+    
+    /**
+     * APIMethod: removeMap
+     * 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. 
+     *     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. 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    removeMap: function(map) {
+        //to be overridden by subclasses
+    },
+    
+    /**
+     * APIMethod: getImageSize
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} optional tile bounds, can be used
+     *     by subclasses that have to deal with different tile sizes at the
+     *     layer extent edges (e.g. Zoomify)
+     * 
+     * Returns:
+     * {<OpenLayers.Size>} The size that the image should be, taking into 
+     *     account gutters.
+     */ 
+    getImageSize: function(bounds) { 
+        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>}
+     */
+    setTileSize: function(size) {
+        var tileSize = (size) ? size :
+                                ((this.tileSize) ? this.tileSize :
+                                                   this.map.getTileSize());
+        this.tileSize = tileSize;
+        if(this.gutter) {
+          // layers with gutters need non-null tile sizes
+          //if(tileSize == null) {
+          //    OpenLayers.console.error("Error in layer.setMap() for " +
+          //                              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)); 
+        }
+    },
+
+    /**
+     * APIMethod: getVisibility
+     * 
+     * Returns:
+     * {Boolean} The layer should be displayed (if in range).
+     */
+    getVisibility: function() {
+        return this.visibility;
+    },
+
+    /** 
+     * APIMethod: setVisibility
+     * 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 
+     *     subverted.
+     * 
+     * Parameters:
+     * visible - {Boolean} Whether or not to display the layer (if in range)
+     */
+    setVisibility: function(visibility) {
+        if (visibility != this.visibility) {
+            this.visibility = visibility;
+            this.display(visibility);
+            this.redraw();
+            if (this.map != null) {
+                this.map.events.triggerEvent("changelayer", {
+                    layer: this,
+                    property: "visibility"
+                });
+            }
+            this.events.triggerEvent("visibilitychanged");
+        }
+    },
+
+    /** 
+     * APIMethod: display
+     * Hide or show the Layer
+     * 
+     * Parameters:
+     * display - {Boolean}
+     */
+    display: function(display) {
+        if (display != (this.div.style.display != "none")) {
+            this.div.style.display = (display && this.calculateInRange()) ? "block" : "none";
+        }
+    },
+
+    /**
+     * APIMethod: calculateInRange
+     * 
+     * Returns:
+     * {Boolean} The layer is displayable at the current map's current
+     *     resolution. Note that if 'alwaysInRange' is true for the layer, 
+     *     this function will always return true.
+     */
+    calculateInRange: function() {
+        var inRange = false;
+
+        if (this.alwaysInRange) {
+            inRange = true;
+        } else {
+            if (this.map) {
+                var resolution = this.map.getResolution();
+                inRange = ( (resolution >= this.minResolution) &&
+                            (resolution <= this.maxResolution) );
+            }
+        }
+        return inRange;
+    },
+
+    /** 
+     * APIMethod: setIsBaseLayer
+     * 
+     * Parameters:
+     * isBaseLayer - {Boolean}
+     */
+    setIsBaseLayer: function(isBaseLayer) {
+        if (isBaseLayer != this.isBaseLayer) {
+            this.isBaseLayer = isBaseLayer;
+            if (this.map != null) {
+                this.map.events.triggerEvent("changebaselayer", {
+                    layer: this
+                });
+            }
+        }
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*                 Baselayer Functions                  */
+  /*                                                      */
+  /********************************************************/
+  
+    /** 
+     * Method: initResolutions
+     * 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 
+     *     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 
+     *     openlayers.org homepage:
+     *     http://trac.openlayers.org/wiki/SettingZoomLevels
+     */
+    initResolutions: function() {
+
+        // ok we want resolutions, here's our strategy:
+        //
+        // 1. if resolutions are defined in the layer config, use them
+        // 2. else, if scales are defined in the layer config then derive
+        //    resolutions from these scales
+        // 3. else, attempt to calculate resolutions from maxResolution,
+        //    minResolution, numZoomLevels, maxZoomLevel set in the
+        //    layer config
+        // 4. if we still don't have resolutions, and if resolutions
+        //    are defined in the same, use them
+        // 5. else, if scales are defined in the map then derive
+        //    resolutions from these scales
+        // 6. else, attempt to calculate resolutions from maxResolution,
+        //    minResolution, numZoomLevels, maxZoomLevel set in the
+        //    map
+        // 7. hope for the best!
+
+        var i, len;
+        var props = {}, alwaysInRange = true;
+
+        // get resolution data from layer config
+        // (we also set alwaysInRange in the layer as appropriate)
+        for(i=0, len=this.RESOLUTION_PROPERTIES.length; i<len; i++) {
+            var p = this.RESOLUTION_PROPERTIES[i];
+            props[p] = this.options[p];
+            if(alwaysInRange && this.options[p]) {
+                alwaysInRange = false;
+            }
+        }
+        if(this.alwaysInRange == null) {
+            this.alwaysInRange = alwaysInRange;
+        }
+
+        // if we don't have resolutions then attempt to derive them from scales
+        if(props.resolutions == null) {
+            props.resolutions = this.resolutionsFromScales(props.scales);
+        }
+
+        // if we still don't have resolutions then attempt to calculate them
+        if(props.resolutions == null) {
+            props.resolutions = this.calculateResolutions(props);
+        }
+
+        // if we couldn't calculate resolutions then we look at we have
+        // in the map
+        if(props.resolutions == null) {
+            for(i=0, len=this.RESOLUTION_PROPERTIES.length; i<len; i++) {
+                var p = this.RESOLUTION_PROPERTIES[i];
+                props[p] = this.options[p] != null ?
+                    this.options[p] : this.map[p];
+            }
+            if(props.resolutions == null) {
+                props.resolutions = this.resolutionsFromScales(props.scales);
+            }
+            if(props.resolutions == null) {
+                props.resolutions = this.calculateResolutions(props);
+            }
+        }
+
+        // ok, we new need to set properties in the instance
+
+        // get maxResolution from the config if it's defined there
+        var maxResolution;
+        if(this.options.maxResolution &&
+           this.options.maxResolution !== "auto") {
+            maxResolution = this.options.maxResolution;
+        }
+        if(this.options.minScale) {
+            maxResolution = OpenLayers.Util.getResolutionFromScale(
+                this.options.minScale, this.units);
+        }
+
+        // get minResolution from the config if it's defined there
+        var minResolution;
+        if(this.options.minResolution &&
+           this.options.minResolution !== "auto") {
+            minResolution = this.options.minResolution;
+        }
+        if(this.options.maxScale) {
+            minResolution = OpenLayers.Util.getResolutionFromScale(
+                this.options.maxScale, this.units);
+        }
+
+        if(props.resolutions) {
+
+            //sort resolutions array descendingly
+            props.resolutions.sort(function(a, b) {
+                return (b - a);
+            });
+
+            // if we still don't have a maxResolution get it from the
+            // resolutions array
+            if(!maxResolution) {
+                maxResolution = props.resolutions[0];
+            }
+
+            // if we still don't have a minResolution get it from the
+            // resolutions array
+            if(!minResolution) {
+                var lastIdx = props.resolutions.length - 1;
+                minResolution = props.resolutions[lastIdx];
+            }
+        }
+
+        this.resolutions = props.resolutions;
+        if(this.resolutions) {
+            len = this.resolutions.length;
+            this.scales = new Array(len);
+            for(i=0; i<len; i++) {
+                this.scales[i] = OpenLayers.Util.getScaleFromResolution(
+                    this.resolutions[i], this.units);
+            }
+            this.numZoomLevels = len;
+        }
+        this.minResolution = minResolution;
+        if(minResolution) {
+            this.maxScale = OpenLayers.Util.getScaleFromResolution(
+                minResolution, this.units);
+        }
+        this.maxResolution = maxResolution;
+        if(maxResolution) {
+            this.minScale = OpenLayers.Util.getScaleFromResolution(
+                maxResolution, this.units);
+        }
+    },
+
+    /**
+     * Method: resolutionsFromScales
+     * Derive resolutions from scales.
+     *
+     * Parameters:
+     * scales - {Array(Number)} Scales
+     *
+     * Returns
+     * {Array(Number)} Resolutions
+     */
+    resolutionsFromScales: function(scales) {
+        if(scales == null) {
+            return;
+        }
+        var resolutions, i, len;
+        len = scales.length;
+        resolutions = new Array(len);
+        for(i=0; i<len; i++) {
+            resolutions[i] = OpenLayers.Util.getResolutionFromScale(
+                scales[i], this.units);
+        }
+        return resolutions;
+    },
+
+    /**
+     * Method: calculateResolutions
+     * Calculate resolutions based on the provided properties.
+     *
+     * Parameters:
+     * props - {Object} Properties
+     *
+     * Return:
+     * {Array({Number})} Array of resolutions.
+     */
+    calculateResolutions: function(props) {
+
+        // determine maxResolution
+        var maxResolution = props.maxResolution;
+        if(props.minScale != null) {
+            maxResolution =
+                OpenLayers.Util.getResolutionFromScale(props.minScale,
+                                                       this.units);
+        } else if(maxResolution == "auto" && this.maxExtent != null) {
+            var viewSize = this.map.getSize();
+            var wRes = this.maxExtent.getWidth() / viewSize.w;
+            var hRes = this.maxExtent.getHeight() / viewSize.h;
+            maxResolution = Math.max(wRes, hRes);
+        }
+
+        // determine minResolution
+        var minResolution = props.minResolution;
+        if(props.maxScale != null) {
+            minResolution =
+                OpenLayers.Util.getResolutionFromScale(props.maxScale,
+                                                       this.units);
+        } else if(props.minResolution == "auto" && this.minExtent != null) {
+            var viewSize = this.map.getSize();
+            var wRes = this.minExtent.getWidth() / viewSize.w;
+            var hRes = this.minExtent.getHeight()/ viewSize.h;
+            minResolution = Math.max(wRes, hRes);
+        }
+
+        // determine numZoomLevels
+        var maxZoomLevel = props.maxZoomLevel;
+        var numZoomLevels = props.numZoomLevels;
+        if(typeof minResolution === "number" &&
+           typeof maxResolution === "number" && numZoomLevels === undefined) {
+            var ratio = maxResolution / minResolution;
+            numZoomLevels = Math.floor(Math.log(ratio) / Math.log(2)) + 1;
+        } else if(numZoomLevels === undefined && maxZoomLevel != null) {
+            numZoomLevels = maxZoomLevel + 1;
+        }
+
+        // are we able to calculate resolutions?
+        if(typeof numZoomLevels !== "number" || numZoomLevels <= 0 ||
+           (typeof maxResolution !== "number" &&
+                typeof minResolution !== "number")) {
+            return;
+        }
+
+        // now we have numZoomLevels and at least one of maxResolution
+        // or minResolution, we can populate the resolutions array
+
+        var resolutions = new Array(numZoomLevels);
+        var base = 2;
+        if(typeof minResolution == "number" &&
+           typeof maxResolution == "number") {
+            // if maxResolution and minResolution are set, we calculate
+            // the base for exponential scaling that starts at
+            // maxResolution and ends at minResolution in numZoomLevels
+            // steps.
+            base = Math.pow(
+                    (maxResolution / minResolution),
+                (1 / (numZoomLevels - 1))
+            );
+        }
+
+        var i;
+        if(typeof maxResolution === "number") {
+            for(i=0; i<numZoomLevels; i++) {
+                resolutions[i] = maxResolution / Math.pow(base, i);
+            }
+        } else {
+            for(i=0; i<numZoomLevels; i++) {
+                resolutions[numZoomLevels - 1 - i] =
+                    minResolution * Math.pow(base, i);
+            }
+        }
+
+        return resolutions;
+    },
+
+    /**
+     * APIMethod: getResolution
+     * 
+     * Returns:
+     * {Float} The currently selected resolution of the map, taken from the
+     *     resolutions array, indexed by current zoom level.
+     */
+    getResolution: function() {
+        var zoom = this.map.getZoom();
+        return this.getResolutionForZoom(zoom);
+    },
+
+    /** 
+     * APIMethod: getExtent
+     * 
+     * Returns:
+     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat 
+     *     bounds of the current viewPort.
+     */
+    getExtent: function() {
+        // just use stock map calculateBounds function -- passing no arguments
+        //  means it will user map's current center & resolution
+        //
+        return this.map.calculateBounds();
+    },
+
+    /**
+     * 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 
+     *     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 
+     *     calling getZoomForResolution(), passing along the 'closest'
+     *     parameter.
+     */
+    getZoomForExtent: function(extent, closest) {
+        var viewSize = this.map.getSize();
+        var idealResolution = Math.max( extent.getWidth()  / viewSize.w,
+                                        extent.getHeight() / viewSize.h );
+
+        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>}
+     */
+    getDataExtent: function () {
+        //to be implemented by subclasses
+    },
+
+    /**
+     * APIMethod: getResolutionForZoom
+     * 
+     * Parameter:
+     * zoom - {Float}
+     * 
+     * Returns:
+     * {Float} A suitable resolution for the specified zoom.
+     */
+    getResolutionForZoom: function(zoom) {
+        zoom = Math.max(0, Math.min(zoom, this.resolutions.length - 1));
+        var resolution;
+        if(this.map.fractionalZoom) {
+            var low = Math.floor(zoom);
+            var high = Math.ceil(zoom);
+            resolution = this.resolutions[low] -
+                ((zoom-low) * (this.resolutions[low]-this.resolutions[high]));
+        } else {
+            resolution = this.resolutions[Math.round(zoom)];
+        }
+        return resolution;
+    },
+
+    /**
+     * APIMethod: getZoomForResolution
+     * 
+     * Parameters:
+     * resolution - {Float}
+     * 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 
+     *     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 
+     *     value and the 'closest' specification.
+     */
+    getZoomForResolution: function(resolution, closest) {
+        var zoom;
+        if(this.map.fractionalZoom) {
+            var lowZoom = 0;
+            var highZoom = this.resolutions.length - 1;
+            var highRes = this.resolutions[lowZoom];
+            var lowRes = this.resolutions[highZoom];
+            var res;
+            for(var i=0, len=this.resolutions.length; i<len; ++i) {
+                res = this.resolutions[i];
+                if(res >= resolution) {
+                    highRes = res;
+                    lowZoom = i;
+                }
+                if(res <= resolution) {
+                    lowRes = res;
+                    highZoom = i;
+                    break;
+                }
+            }
+            var dRes = highRes - lowRes;
+            if(dRes > 0) {
+                zoom = lowZoom + ((highRes - resolution) / dRes);
+            } else {
+                zoom = lowZoom;
+            }
+        } else {
+            var diff;
+            var minDiff = Number.POSITIVE_INFINITY;
+            for(var i=0, len=this.resolutions.length; i<len; i++) {            
+                if (closest) {
+                    diff = Math.abs(this.resolutions[i] - resolution);
+                    if (diff > minDiff) {
+                        break;
+                    }
+                    minDiff = diff;
+                } else {
+                    if (this.resolutions[i] < resolution) {
+                        break;
+                    }
+                }
+            }
+            zoom = Math.max(0, i-1);
+        }
+        return zoom;
+    },
+    
+    /**
+     * APIMethod: getLonLatFromViewPortPx
+     * 
+     * Parameters:
+     * viewPortPx - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in 
+     *     view port <OpenLayers.Pixel>, translated into lon/lat by the layer.
+     */
+    getLonLatFromViewPortPx: function (viewPortPx) {
+        var lonlat = null;
+        if (viewPortPx != null) {
+            var size = this.map.getSize();
+            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); 
+
+                if (this.wrapDateLine) {
+                    lonlat = lonlat.wrapDateLine(this.maxExtent);
+                }
+            } // else { DEBUG STATEMENT }
+        }
+        return lonlat;
+    },
+
+    /**
+     * 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 
+     *     <OpenLayers.LonLat>,translated into view port pixels.
+     */
+    getViewPortPxFromLonLat: function (lonlat) {
+        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}
+     */
+    setOpacity: function(opacity) {
+        if (opacity != this.opacity) {
+            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, 
+                                                 null, null, null, opacity);
+            }
+            if (this.map != null) {
+                this.map.events.triggerEvent("changelayer", {
+                    layer: this,
+                    property: "opacity"
+                });
+            }
+        }
+    },
+
+    /**
+     * Method: getZIndex
+     * 
+     * Returns: 
+     * {Integer} the z-index of this layer
+     */    
+    getZIndex: function () {
+        return this.div.style.zIndex;
+    },
+
+    /**
+     * Method: setZIndex
+     * 
+     * Parameters: 
+     * zIndex - {Integer}
+     */    
+    setZIndex: function (zIndex) {
+        this.div.style.zIndex = zIndex;
+    },
+
+    /**
+     * 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 
+     *     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 
+            // layer's gutter in pixels.
+            var mapGutter = this.gutter * this.map.getResolution();
+            bounds = new OpenLayers.Bounds(bounds.left - mapGutter,
+                                           bounds.bottom - mapGutter,
+                                           bounds.right + mapGutter,
+                                           bounds.top + mapGutter);
+        }
+
+        if (this.wrapDateLine) {
+            // wrap around the date line, within the limits of rounding error
+            var wrappingOptions = { 
+                'rightTolerance':this.getResolution()
+            };    
+            bounds = bounds.wrapDateLine(this.maxExtent, wrappingOptions);
+                              
+        }
+        return bounds;
+    },
+
+    CLASS_NAME: "OpenLayers.Layer"
+});
diff --git a/lib/OpenLayers/Layer/ArcGIS93Rest.js b/lib/OpenLayers/Layer/ArcGIS93Rest.js
new file mode 100644
index 0000000..1c1c70d
--- /dev/null
+++ b/lib/OpenLayers/Layer/ArcGIS93Rest.js
@@ -0,0 +1,253 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ * @requires OpenLayers/Tile/Image.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.ArcGIS93Rest
+ * Instances of OpenLayers.Layer.ArcGIS93Rest are used to display data from
+ *     ESRI ArcGIS Server 9.3 (and up?) Mapping Services using the REST API.
+ *     Create a new ArcGIS93Rest layer with the <OpenLayers.Layer.ArcGIS93Rest>
+ *     constructor.  More detail on the REST API is available at
+ *     http://sampleserver1.arcgisonline.com/ArcGIS/SDK/REST/index.html ;
+ *     specifically, the URL provided to this layer should be an export service
+ *     URL: http://sampleserver1.arcgisonline.com/ArcGIS/SDK/REST/export.html 
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.ArcGIS93Rest = OpenLayers.Class(OpenLayers.Layer.Grid, {
+
+    /**
+     * Constant: DEFAULT_PARAMS
+     * {Object} Hashtable of default parameter key/value pairs 
+     */
+    DEFAULT_PARAMS: { 
+      format: "png"
+    },
+        
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean} Default is true for ArcGIS93Rest layer
+     */
+    isBaseLayer: true,
+ 
+ 
+    /**
+     * Constructor: OpenLayers.Layer.ArcGIS93Rest
+     * Create a new ArcGIS93Rest layer object.
+     *
+     * Example:
+     * (code)
+     * var arcims = new OpenLayers.Layer.ArcGIS93Rest("MyName",
+     *                                    "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/export", 
+     *                                    {
+     *                                      layers: "0,1,2"
+     *                                    });
+     * (end)
+     *
+     * Parameters:
+     * name - {String} A name for the layer
+     * url - {String} Base url for the ArcGIS server REST service
+     * options - {Object} An object with key/value pairs representing the
+     *                    options and option values.
+     * Valid Options:
+     *        format: {String} MIME type of desired image type.
+     *        layers: {String} Comma-separated list of layers to display.
+     *        srs: {String} Projection ID.
+     */
+    initialize: function(name, url, params, options) {
+        var newArguments = [];
+        //uppercase params
+        params = OpenLayers.Util.upperCaseObject(params);
+        newArguments.push(name, url, params, options);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
+        OpenLayers.Util.applyDefaults(
+                       this.params, 
+                       OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
+                       );
+                       
+        //layer is transparent        
+        if (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 
+            //  format, depending on the browser's capabilities
+            if (this.params.FORMAT == "jpg") {
+                this.params.FORMAT = OpenLayers.Util.alphaHack() ? "gif"
+                                                                 : "png";
+            }
+        }
+    },    
+
+    
+    /**
+     * Method: destroy
+     * Destroy this layer
+     */
+    destroy: function() {
+        // for now, nothing special to do here. 
+        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);  
+    },   
+    
+    /**
+         * Method: clone
+         * Create a clone of this layer
+         *
+         * Returns:
+         * {<OpenLayers.Layer.ArcGIS93Rest>} An exact clone of this layer
+         */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.ArcGIS93Rest(this.name,
+                                           this.url,
+                                           this.params,
+                                           this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    },
+    
+    
+    /**
+     * Method: getURL
+     * Return an image url this layer.
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox for the
+     *                                request.
+     *
+     * Returns:
+     * {String} A string with the map image's url.
+     */
+    getURL: function (bounds) {
+        bounds = this.adjustBounds(bounds);
+
+        // ArcGIS Server only wants the numeric portion of the projection ID.
+        var projWords = this.projection.getCode().split(":");
+        var srid = projWords[projWords.length - 1];
+
+        var imageSize = this.getImageSize(); 
+        var newParams = {
+            'BBOX': bounds.toBBOX(),
+            'SIZE': imageSize.w + "," + imageSize.h,
+            // We always want image, the other options were json, image with a whole lotta html around it, etc.
+            'F': "image",
+            'BBOXSR': srid,
+            'IMAGESR': srid
+        };
+
+        // Now add the filter parameters.
+        if (this.layerDefs) {
+            var layerDefStrList = [];
+            var layerID;
+            for(layerID in this.layerDefs) {
+                if (this.layerDefs.hasOwnProperty(layerID)) {
+                    if (this.layerDefs[layerID]) {
+                        layerDefStrList.push(layerID);
+                        layerDefStrList.push(":");
+                        layerDefStrList.push(this.layerDefs[layerID]);
+                        layerDefStrList.push(";");
+                    }
+                }
+            }
+            if (layerDefStrList.length > 0) {
+                newParams['LAYERDEFS'] = layerDefStrList.join("");
+            }
+        }
+        var requestString = this.getFullRequestString(newParams);
+        return requestString;
+    },
+    
+    /**
+     * Method: setLayerFilter
+     * addTile creates a tile, initializes it, and adds it to the layer div. 
+     *
+     * Parameters:
+     * id - {String} The id of the layer to which the filter applies.
+     * queryDef - {String} A sql-ish query filter, for more detail see the ESRI
+     *                     documentation at http://sampleserver1.arcgisonline.com/ArcGIS/SDK/REST/export.html
+     */
+    setLayerFilter: function ( id, queryDef ) {
+        if (!this.layerDefs) {
+            this.layerDefs = {};
+        }
+        if (queryDef) {
+            this.layerDefs[id] = queryDef;
+        } else {
+            delete this.layerDefs[id];
+        }
+    },
+    
+    /**
+     * Method: clearLayerFilter
+     * Clears layer filters, either from a specific layer,
+     * or all of them.
+     *
+     * Parameters:
+     * id - {String} The id of the layer from which to remove any
+     *               filter.  If unspecified/blank, all filters
+     *               will be removed.
+     */
+    clearLayerFilter: function ( id ) {
+        if (id) {
+            delete this.layerDefs[id];
+        } else {
+            delete this.layerDefs;
+        }
+    },
+    
+    /**
+     * 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, 
+                                                             newArguments);
+    },
+
+    /**
+     * Method: addTile
+     * 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, 
+                                         null, this.tileSize);
+    },
+
+    
+    CLASS_NAME: "OpenLayers.Layer.ArcGIS93Rest"
+});
diff --git a/lib/OpenLayers/Layer/ArcIMS.js b/lib/OpenLayers/Layer/ArcIMS.js
new file mode 100644
index 0000000..96d4934
--- /dev/null
+++ b/lib/OpenLayers/Layer/ArcIMS.js
@@ -0,0 +1,466 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ * @requires OpenLayers/Tile/Image.js
+ * @requires OpenLayers/Format/ArcXML.js
+ * @requires OpenLayers/Request.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.ArcIMS
+ * Instances of OpenLayers.Layer.ArcIMS are used to display data from ESRI ArcIMS
+ *     Mapping Services. Create a new ArcIMS layer with the <OpenLayers.Layer.ArcIMS>
+ *     constructor.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.ArcIMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+
+    /**
+     * Constant: DEFAULT_PARAMS
+     * {Object} Default query string parameters.
+     */
+    DEFAULT_PARAMS: { 
+        ClientVersion: "9.2",
+        ServiceName: ''
+    },
+    
+    /**
+     * APIProperty: tileSize
+     * {<OpenLayers.Size>} Size for tiles.  Default is 512x512.
+     */
+    tileSize: null,
+    
+    /**
+     * APIProperty: featureCoordSys
+     * {String} Code for feature coordinate system.  Default is "4326".
+     */
+    featureCoordSys: "4326",
+    
+    /**
+     * APIProperty: filterCoordSys
+     * {String} Code for filter coordinate system.  Default is "4326".
+     */
+    filterCoordSys: "4326",
+    
+    /**
+     * APIProperty: layers
+     * {Array} An array of objects with layer properties.
+     */
+    layers: null,
+    
+    /**
+     * APIProperty: async
+     * {Boolean} Request images asynchronously.  Default is true.
+     */
+    async: true,
+    
+    /**
+     * APIProperty: name
+     * {String} Layer name.  Default is "ArcIMS".
+     */
+    name: "ArcIMS",
+
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean} The layer is a base layer.  Default is true.
+     */
+    isBaseLayer: true,
+
+    /**
+     * Constant: DEFAULT_OPTIONS
+     * {Object} Default layers properties.
+     */
+    DEFAULT_OPTIONS: {
+        tileSize: new OpenLayers.Size(512, 512),
+        featureCoordSys: "4326",
+        filterCoordSys: "4326",
+        layers: null,
+        isBaseLayer: true,
+        async: true,
+        name: "ArcIMS"
+    }, 
+ 
+    /**
+     * Constructor: OpenLayers.Layer.ArcIMS
+     * Create a new ArcIMS layer object.
+     *
+     * Example:
+     * (code)
+     * var arcims = new OpenLayers.Layer.ArcIMS(
+     *     "Global Sample",
+     *     "http://sample.avencia.com/servlet/com.esri.esrimap.Esrimap", 
+     *     {
+     *         service: "OpenLayers_Sample", 
+     *         layers: [
+     *             // layers to manipulate
+     *             {id: "1", visible: true}
+     *         ]
+     *     }
+     * );
+     * (end)
+     *
+     * Parameters:
+     * name - {String} A name for the layer
+     * url - {String} Base url for the ArcIMS server
+     * options - {Object} Optional object with properties to be set on the
+     *     layer.
+     */
+    initialize: function(name, url, options) {
+        
+        this.tileSize = new OpenLayers.Size(512, 512);
+
+        // parameters
+        this.params = OpenLayers.Util.applyDefaults(
+            {ServiceName: options.serviceName},
+            this.DEFAULT_PARAMS
+        );
+        this.options = OpenLayers.Util.applyDefaults(
+            options, this.DEFAULT_OPTIONS
+        );
+          
+        OpenLayers.Layer.Grid.prototype.initialize.apply(
+            this, [name, url, this.params, options]
+        );
+
+        //layer is transparent        
+        if (this.transparent) {
+            
+            // unless explicitly set in options, make layer an overlay
+            if (!this.isBaseLayer) {
+                this.isBaseLayer = false;
+            } 
+            
+            // jpegs can never be transparent, so intelligently switch the 
+            //  format, depending on the browser's capabilities
+            if (this.format == "image/jpeg") {
+                this.format = OpenLayers.Util.alphaHack() ? "image/gif" : "image/png";
+            }
+        }
+
+        // create an empty layer list if no layers specified in the options
+        if (this.options.layers === null) {
+            this.options.layers = [];
+        }
+    },    
+
+    
+    /**
+     * Method: destroy
+     * Destroy this layer
+     */
+    destroy: function() {
+        // for now, nothing special to do here. 
+        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);  
+    },   
+    
+    
+    /**
+     * Method: getURL
+     * Return an image url this layer.
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox for the
+     *     request.
+     *
+     * Returns:
+     * {String} A string with the map image's url.
+     */
+    getURL: function(bounds) {
+        var url = "";
+        bounds = this.adjustBounds(bounds);
+        
+        // create an arcxml request to generate the image
+        var axlReq = new OpenLayers.Format.ArcXML( 
+            OpenLayers.Util.extend(this.options, {
+                requesttype: "image",
+                envelope: bounds.toArray(),
+                tileSize: this.tileSize
+            })
+        );
+        
+        // create a synchronous ajax request to get an arcims image
+        var req = new OpenLayers.Request.POST({
+            url: this.getFullRequestString(),
+            data: axlReq.write(),
+            async: false
+        });
+        
+        // if the response exists
+        if (req != null) {
+            var doc = req.responseXML;
+
+            if (!doc || !doc.documentElement) {            
+                doc = req.responseText;
+            }
+
+            // create a new arcxml format to read the response
+            var axlResp = new OpenLayers.Format.ArcXML();
+            var arcxml = axlResp.read(doc);
+            url = this.getUrlOrImage(arcxml.image.output);
+        }
+        
+        return url;
+    },
+    
+    
+    /**
+     * Method: getURLasync
+     * Get an image url this layer asynchronously, and execute a callback
+     *     when the image url is generated.
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} A bounds representing the bbox for the
+     *     request.
+     * scope - {Object} The scope of the callback method.
+     * prop - {String} The name of the property in the scoped object to 
+     *     recieve the image url.
+     * callback - {Function} Function to call when image url is retrieved.
+     */
+    getURLasync: function(bounds, scope, prop, callback) {
+        bounds = this.adjustBounds(bounds);
+        
+        // create an arcxml request to generate the image
+        var axlReq = new OpenLayers.Format.ArcXML(  
+            OpenLayers.Util.extend(this.options, { 
+                requesttype: "image",
+                envelope: bounds.toArray(),
+                tileSize: this.tileSize
+            })
+        );
+        
+        // create an asynchronous ajax request to get an arcims image
+        OpenLayers.Request.POST({
+            url: this.getFullRequestString(),
+            async: true,
+            data: axlReq.write(),
+            callback: function(req) {
+                // process the response from ArcIMS, and call the callback function
+                // to set the image URL
+                var doc = req.responseXML;
+                if (!doc || !doc.documentElement) {            
+                    doc = req.responseText;
+                }
+
+                // create a new arcxml format to read the response
+                var axlResp = new OpenLayers.Format.ArcXML();
+                var arcxml = axlResp.read(doc);
+                
+                scope[prop] = this.getUrlOrImage(arcxml.image.output);
+
+                // call the callback function to recieve the updated property on the
+                // scoped object
+                callback.apply(scope);
+            },
+            scope: this
+        });
+    },
+    
+    /**
+     * Method: getUrlOrImage
+     * Extract a url or image from the ArcXML image output.
+     *
+     * Parameters:
+     * output - {Object} The image.output property of the object returned from
+     *     the ArcXML format read method.
+     *
+     * Returns:
+     * {String} A URL for an image (potentially with the data protocol).
+     */
+    getUrlOrImage: function(output) {
+        var ret = "";
+        if(output.url) {
+            // If the image response output url is a string, then the image
+            // data is not inline.
+            ret = output.url;
+        } else if(output.data) {
+            // The image data is inline and base64 encoded, create a data
+            // url for the image.  This will only work for small images,
+            // due to browser url length limits.
+            ret = "data:image/" + output.type + 
+                  ";base64," + output.data;
+        }
+        return ret;
+    },
+    
+    /**
+     * Method: setLayerQuery
+     * Set the query definition on this layer. Query definitions are used to
+     *     render parts of the spatial data in an image, and can be used to
+     *     filter features or layers in the ArcIMS service.
+     *
+     * Parameters:
+     * id - {String} The ArcIMS layer ID.
+     * queryDef - {Object} The query definition to apply to this layer.
+     */
+    setLayerQuery: function(id, querydef) {
+        // find the matching layer, if it exists
+        for (var lyr = 0; lyr < this.options.layers.length; lyr++) {
+            if (id == this.options.layers[lyr].id) {
+                // replace this layer definition
+                this.options.layers[lyr].query = querydef;
+                return;
+            }
+        }
+      
+        // no layer found, create a new definition
+        this.options.layers.push({id: id, visible: true, query: querydef});
+    },
+    
+    /**
+     * Method: getFeatureInfo
+     * Get feature information from ArcIMS.  Using the applied geometry, apply
+     *     the options to the query (buffer, area/envelope intersection), and
+     *     query the ArcIMS service.
+     *
+     * A note about accuracy:
+     * ArcIMS interprets the accuracy attribute in feature requests to be
+     *     something like the 'modulus' operator on feature coordinates,
+     *     applied to the database geometry of the feature.  It doesn't round,
+     *     so your feature coordinates may be up to (1 x accuracy) offset from
+     *     the actual feature coordinates.  If the accuracy of the layer is not
+     *     specified, the accuracy will be computed to be approximately 1
+     *     feature coordinate per screen  pixel.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.LonLat>} or {<OpenLayers.Geometry.Polygon>} The
+     *     geometry to use when making the query. This should be a closed
+     *     polygon for behavior approximating a free selection.
+     * layer - {Object} The ArcIMS layer definition. This is an anonymous object
+     *     that looks like:
+     * (code)
+     * {
+     *     id: "ArcXML layer ID",  // the ArcXML layer ID
+     *     query: {
+     *         where: "STATE = 'PA'",  // the where clause of the query
+     *         accuracy: 100           // the accuracy of the returned feature
+     *     }
+     * }
+     * (end)
+     * options - {Object} Object with non-default properties to set on the layer.
+     *     Supported properties are buffer, callback, scope, and any other
+     *     properties applicable to the ArcXML format.  Set the 'callback' and
+     *     'scope' for an object and function to recieve the parsed features
+     *     from ArcIMS.
+     */
+    getFeatureInfo: function(geometry, layer, options) {
+        // set the buffer to 1 unit (dd/m/ft?) by default
+        var buffer = options.buffer || 1;
+        // empty callback by default
+        var callback = options.callback || function() {};
+        // default scope is window (global)
+        var scope = options.scope || window;
+
+        // apply these option to the request options
+        var requestOptions = {};
+        OpenLayers.Util.extend(requestOptions, this.options);
+
+        // this is a feature request
+        requestOptions.requesttype = "feature";
+
+        if (geometry instanceof OpenLayers.LonLat) {
+            // create an envelope if the geometry is really a lon/lat
+            requestOptions.polygon = null;
+            requestOptions.envelope = [ 
+                geometry.lon - buffer, 
+                geometry.lat - buffer,
+                geometry.lon + buffer,
+                geometry.lat + buffer
+            ];
+        } else if (geometry instanceof OpenLayers.Geometry.Polygon) {
+            // use the polygon assigned, and empty the envelope
+            requestOptions.envelope = null;
+            requestOptions.polygon = geometry;
+        }
+      
+        // create an arcxml request to get feature requests
+        var arcxml = new OpenLayers.Format.ArcXML(requestOptions);
+
+        // apply any get feature options to the arcxml request
+        OpenLayers.Util.extend(arcxml.request.get_feature, options);
+
+        arcxml.request.get_feature.layer = layer.id;
+        if (typeof layer.query.accuracy == "number") {
+            // set the accuracy if it was specified
+            arcxml.request.get_feature.query.accuracy = layer.query.accuracy;
+        } else {
+            // guess that the accuracy is 1 per screen pixel
+            var mapCenter = this.map.getCenter();
+            var viewPx = this.map.getViewPortPxFromLonLat(mapCenter);
+            viewPx.x++;
+            var mapOffCenter = this.map.getLonLatFromPixel(viewPx);
+            arcxml.request.get_feature.query.accuracy = mapOffCenter.lon - mapCenter.lon;
+        }
+        
+        // set the get_feature query to be the same as the layer passed in
+        arcxml.request.get_feature.query.where = layer.query.where;
+        
+        // use area_intersection
+        arcxml.request.get_feature.query.spatialfilter.relation = "area_intersection";
+      
+        // create a new asynchronous request to get the feature info
+        OpenLayers.Request.POST({
+            url: this.getFullRequestString({'CustomService': 'Query'}),
+            data: arcxml.write(),
+            callback: function(request) {
+                // parse the arcxml response
+                var response = arcxml.parseResponse(request.responseText);
+                
+                if (!arcxml.iserror()) {
+                    // if the arcxml is not an error, call the callback with the features parsed
+                    callback.call(scope, response.features);
+                } else {
+                    // if the arcxml is an error, return null features selected
+                    callback.call(scope, null);
+                }
+            }
+        });
+    },
+
+    /**
+     * Method: clone
+     * Create a clone of this layer
+     *
+     * Returns:
+     * {<OpenLayers.Layer.ArcIMS>} An exact clone of this layer
+     */
+    clone: function (obj) {
+
+        if (obj == null) {
+            obj = new OpenLayers.Layer.ArcIMS(this.name,
+                                           this.url,
+                                           this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    },
+    
+    /**
+     * Method: addTile
+     * 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 image tile.
+     */
+    addTile:function(bounds,position) {
+        return new OpenLayers.Tile.Image(
+            this, position, bounds, null, this.tileSize
+        );
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.ArcIMS"
+});
diff --git a/lib/OpenLayers/Layer/Boxes.js b/lib/OpenLayers/Layer/Boxes.js
new file mode 100644
index 0000000..c4d292e
--- /dev/null
+++ b/lib/OpenLayers/Layer/Boxes.js
@@ -0,0 +1,76 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer.js
+ * @requires OpenLayers/Layer/Markers.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.Boxes
+ * Draw divs as 'boxes' on the layer. 
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Markers>
+ */
+OpenLayers.Layer.Boxes = OpenLayers.Class(OpenLayers.Layer.Markers, {
+
+    /**
+     * Constructor: OpenLayers.Layer.Boxes
+     *
+     * Parameters:
+     * name - {String} 
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function (name, options) {
+        OpenLayers.Layer.Markers.prototype.initialize.apply(this, arguments);
+    },
+    
+    /**
+     * Method: drawMarker 
+     * Calculate the pixel location for the marker, create it, and
+     *    add it to the layer's div
+     *
+     * Parameters: 
+     * marker - {<OpenLayers.Marker.Box>} 
+     */
+    drawMarker: function(marker) {
+        var bounds   = marker.bounds;
+        var topleft  = this.map.getLayerPxFromLonLat(
+                            new OpenLayers.LonLat(bounds.left,  bounds.top));
+        var botright = this.map.getLayerPxFromLonLat(
+                             new OpenLayers.LonLat(bounds.right, bounds.bottom));
+        if (botright == null || topleft == null) {
+            marker.display(false);
+        } else {
+            var sz = new OpenLayers.Size(
+                Math.max(1, botright.x - topleft.x),
+                Math.max(1, botright.y - topleft.y));
+            var markerDiv = marker.draw(topleft, sz);
+            if (!marker.drawn) {
+                this.div.appendChild(markerDiv);
+                marker.drawn = true;
+            }
+        }
+    },
+
+
+    /**
+     * APIMethod: removeMarker 
+     * 
+     * Parameters:
+     * marker - {<OpenLayers.Marker.Box>} 
+     */
+    removeMarker: function(marker) {
+        OpenLayers.Util.removeItem(this.markers, marker);
+        if ((marker.div != null) &&
+            (marker.div.parentNode == this.div) ) {
+            this.div.removeChild(marker.div);    
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.Boxes"
+});
diff --git a/lib/OpenLayers/Layer/EventPane.js b/lib/OpenLayers/Layer/EventPane.js
new file mode 100644
index 0000000..e6a95d5
--- /dev/null
+++ b/lib/OpenLayers/Layer/EventPane.js
@@ -0,0 +1,418 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer.js
+ * @requires OpenLayers/Util.js
+ */
+
+/**
+ * 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. 
+     *     Default is on.
+     */
+    smoothDragPan: true,
+
+    /**
+     * Property: isBaseLayer
+     * {Boolean} EventPaned layers are always base layers, by necessity.
+     */ 
+    isBaseLayer: true,
+
+    /**
+     * APIProperty: isFixed
+     * {Boolean} EventPaned layers are fixed by default.
+     */ 
+    isFixed: true,
+
+    /**
+     * Property: pane
+     * {DOMElement} A reference to the element that controls the events.
+     */
+    pane: null,
+
+
+    /**
+     * 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 ve layer, this will be of type VEMap
+     */ 
+    mapObject: null,
+
+
+    /**
+     * Constructor: OpenLayers.Layer.EventPane
+     * Create a new event pane layer
+     *
+     * Parameters:
+     * name - {String}
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, options) {
+        OpenLayers.Layer.prototype.initialize.apply(this, arguments);
+        if (this.pane == null) {
+            this.pane = OpenLayers.Util.createDiv(this.div.id + "_EventPane");
+        }
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Deconstruct this layer.
+     */
+    destroy: function() {
+        this.mapObject = null;
+        this.pane = null;
+        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. 
+     *
+     * 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 = 
+                "url(" + OpenLayers.Util.getImagesLocation() + "blank.gif)";
+        }
+
+        if (this.isFixed) {
+            this.map.viewPortDiv.appendChild(this.pane);
+        } else {
+            this.map.layerContainerDiv.appendChild(this.pane);
+        }
+
+        // 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();
+        }
+    },
+
+    /**
+     * APIMethod: removeMap
+     * On being removed from the map, we'll like to remove the invisible 'pane'
+     *     div that we added to it on creation. 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    removeMap: function(map) {
+        if (this.pane && this.pane.parentNode) {
+            this.pane.parentNode.removeChild(this.pane);
+        }
+        OpenLayers.Layer.prototype.removeMap.apply(this, arguments);
+    },
+  
+    /**
+     * Method: loadWarningMessage
+     * 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 
+     *     provide the actual warning message.
+     */
+    loadWarningMessage:function() {
+
+        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 div = OpenLayers.Util.createDiv(this.name + "_warning", 
+                                            topLeft, 
+                                            size,
+                                            null,
+                                            null,
+                                            null,
+                                            "auto");
+
+        div.style.padding = "7px";
+        div.style.backgroundColor = "yellow";
+
+        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.
+     */
+    getWarningHTML:function() {
+        //should be implemented by subclasses
+        return "";
+    },
+  
+    /**
+     * Method: display
+     * Set the display on the pane
+     *
+     * Parameters:
+     * display - {Boolean}
+     */
+    display: function(display) {
+        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}
+     */
+    setZIndex: function (zIndex) {
+        OpenLayers.Layer.prototype.setZIndex.apply(this, arguments);
+        this.pane.style.zIndex = parseInt(this.div.style.zIndex) + 1;
+    },
+
+    /**
+     * Method: moveTo
+     * Handle calls to move the layer.
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean}
+     * dragging - {Boolean}
+     */
+    moveTo:function(bounds, zoomChanged, dragging) {
+        OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
+
+        if (this.mapObject != null) {
+
+            var newCenter = this.map.getCenter();
+            var newZoom = this.map.getZoom();
+
+            if (newCenter != null) {
+
+                var moOldCenter = this.getMapObjectCenter();
+                var oldCenter = this.getOLLonLatFromMapObjectLonLat(moOldCenter);
+
+                var moOldZoom = this.getMapObjectZoom();
+                var oldZoom= this.getOLZoomFromMapObjectZoom(moOldZoom);
+
+                if ( !(newCenter.equals(oldCenter)) || 
+                     !(newZoom == oldZoom) ) {
+
+                    if (dragging && this.dragPanMapObject && 
+                        this.smoothDragPan) {
+                        var oldPx = this.map.getViewPortPxFromLonLat(oldCenter);
+                        var newPx = this.map.getViewPortPxFromLonLat(newCenter);
+                        this.dragPanMapObject(newPx.x-oldPx.x, oldPx.y-newPx.y);
+                    } else {
+                        var center = this.getMapObjectLonLatFromOLLonLat(newCenter);
+                        var zoom = this.getMapObjectZoomFromOLZoom(newZoom);
+                        this.setMapObjectCenter(center, zoom, dragging);
+                    }
+                }
+            }
+        }
+    },
+
+
+  /********************************************************/
+  /*                                                      */
+  /*                 Baselayer Functions                  */
+  /*                                                      */
+  /********************************************************/
+
+    /**
+     * Method: getLonLatFromViewPortPx
+     * Get a map location from a pixel location
+     * 
+     * Parameters:
+     * viewPortPx - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     *  {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in view
+     *  port OpenLayers.Pixel, translated into lon/lat by map lib
+     *  If the map lib is not loaded or not centered, returns null
+     */
+    getLonLatFromViewPortPx: function (viewPortPx) {
+        var lonlat = null;
+        if ( (this.mapObject != null) && 
+             (this.getMapObjectCenter() != null) ) {
+            var moPixel = this.getMapObjectPixelFromOLPixel(viewPortPx);
+            var moLonLat = this.getMapObjectLonLatFromMapObjectPixel(moPixel);
+            lonlat = this.getOLLonLatFromMapObjectLonLat(moLonLat);
+        }
+        return lonlat;
+    },
+
+ 
+    /**
+     * Method: getViewPortPxFromLonLat
+     * Get a pixel location from a map location
+     *
+     * Parameters:
+     * lonlat - {<OpenLayers.LonLat>}
+     *
+     * Returns:
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in
+     * OpenLayers.LonLat, translated into view port pixels by map lib
+     * If map lib is not loaded or not centered, returns null
+     */
+    getViewPortPxFromLonLat: function (lonlat) {
+        var viewPortPx = null;
+        if ( (this.mapObject != null) && 
+             (this.getMapObjectCenter() != null) ) {
+
+            var moLonLat = this.getMapObjectLonLatFromOLLonLat(lonlat);
+            var moPixel = this.getMapObjectPixelFromMapObjectLonLat(moLonLat);
+        
+            viewPortPx = this.getOLPixelFromMapObjectPixel(moPixel);
+        }
+        return viewPortPx;
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*               Translation Functions                  */
+  /*                                                      */
+  /*   The following functions translate Map Object and   */
+  /*            OL formats for Pixel, LonLat              */
+  /*                                                      */
+  /********************************************************/
+
+  //
+  // TRANSLATION: MapObject LatLng <-> OpenLayers.LonLat
+  //
+
+    /**
+     * Method: getOLLonLatFromMapObjectLonLat
+     * Get an OL style map location from a 3rd party style map location
+     *
+     * Parameters
+     * moLonLat - {Object}
+     * 
+     * Returns:
+     * {<OpenLayers.LonLat>} An OpenLayers.LonLat, translated from the passed in 
+     *          MapObject LonLat
+     *          Returns null if null value is passed in
+     */
+    getOLLonLatFromMapObjectLonLat: function(moLonLat) {
+        var olLonLat = null;
+        if (moLonLat != null) {
+            var lon = this.getLongitudeFromMapObjectLonLat(moLonLat);
+            var lat = this.getLatitudeFromMapObjectLonLat(moLonLat);
+            olLonLat = new OpenLayers.LonLat(lon, lat);
+        }
+        return olLonLat;
+    },
+
+    /**
+     * Method: getMapObjectLonLatFromOLLonLat
+     * Get a 3rd party map location from an OL map location.
+     *
+     * Parameters:
+     * olLonLat - {<OpenLayers.LonLat>}
+     * 
+     * Returns:
+     * {Object} A MapObject LonLat, translated from the passed in 
+     *          OpenLayers.LonLat
+     *          Returns null if null value is passed in
+     */
+    getMapObjectLonLatFromOLLonLat: function(olLonLat) {
+        var moLatLng = null;
+        if (olLonLat != null) {
+            moLatLng = this.getMapObjectLonLatFromLonLat(olLonLat.lon,
+                                                         olLonLat.lat);
+        }
+        return moLatLng;
+    },
+
+
+  //
+  // TRANSLATION: MapObject Pixel <-> OpenLayers.Pixel
+  //
+
+    /**
+     * Method: getOLPixelFromMapObjectPixel
+     * Get an OL pixel location from a 3rd party pixel location.
+     *
+     * Parameters:
+     * moPixel - {Object}
+     * 
+     * Returns:
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel, translated from the passed in 
+     *          MapObject Pixel
+     *          Returns null if null value is passed in
+     */
+    getOLPixelFromMapObjectPixel: function(moPixel) {
+        var olPixel = null;
+        if (moPixel != null) {
+            var x = this.getXFromMapObjectPixel(moPixel);
+            var y = this.getYFromMapObjectPixel(moPixel);
+            olPixel = new OpenLayers.Pixel(x, y);
+        }
+        return olPixel;
+    },
+
+    /**
+     * Method: getMapObjectPixelFromOLPixel
+     * Get a 3rd party pixel location from an OL pixel location
+     *
+     * Parameters:
+     * olPixel - {<OpenLayers.Pixel>}
+     * 
+     * Returns:
+     * {Object} A MapObject Pixel, translated from the passed in 
+     *          OpenLayers.Pixel
+     *          Returns null if null value is passed in
+     */
+    getMapObjectPixelFromOLPixel: function(olPixel) {
+        var moPixel = null;
+        if (olPixel != null) {
+            moPixel = this.getMapObjectPixelFromXY(olPixel.x, olPixel.y);
+        }
+        return moPixel;
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.EventPane"
+});
diff --git a/lib/OpenLayers/Layer/FixedZoomLevels.js b/lib/OpenLayers/Layer/FixedZoomLevels.js
new file mode 100644
index 0000000..4d63633
--- /dev/null
+++ b/lib/OpenLayers/Layer/FixedZoomLevels.js
@@ -0,0 +1,315 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.FixedZoomLevels
+ *   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 
+ *    it merely takes map.zoom and indexes into resolutions[]... but....
+ * 
+ *   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 
+ *    bottom-right by using the getLonLatFromViewPortPx() translation function,
+ *    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, 
+ *    it is your responsibility to provide the following three functions:
+ * 
+ *   - getLonLatFromViewPortPx
+ *   - getViewPortPxFromLonLat
+ *   - getZoomForExtent
+ * 
+ *  ...those three functions should generally be provided by any reasonable 
+ *  API that you might be working from.
+ *
+ */
+OpenLayers.Layer.FixedZoomLevels = OpenLayers.Class({
+      
+  /********************************************************/
+  /*                                                      */
+  /*                 Baselayer Functions                  */
+  /*                                                      */
+  /*    The following functions must all be implemented   */
+  /*                  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... 
+        // 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. 
+    },
+    
+    /**
+     * Method: initResolutions
+     * Populate the resolutions array
+     */
+    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.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. 
+        //  
+        //  Because we allow for the setting of either the 'numZoomLevels'
+        //   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. 
+        //
+        // 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 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 
+        // 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 
+        // 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. 
+        //
+
+        //the number of zoom levels we'd like to have.
+        var desiredZoomLevels;
+
+        //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) && 
+              (this.options.maxZoomLevel != null)) // (2)
+              ||
+             ((this.numZoomLevels == null) &&
+              (this.maxZoomLevel != null)) // (4)
+           ) {
+            //calculate based on specified maxZoomLevel (on layer or map)
+            desiredZoomLevels = this.maxZoomLevel - this.minZoomLevel + 1;
+        } else {
+            //calculate based on specified numZoomLevels (on layer or map)
+            // this covers cases (1) and (3)
+            desiredZoomLevels = this.numZoomLevels;
+        }
+
+        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 
+            // the constants on the layer itself (and calculated into the
+            // '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 
+            // maximum limit as calculated by the layer's constants.
+            this.numZoomLevels = limitZoomLevels;
+        }
+
+        //now that the 'numZoomLevels' is appropriately, safely set, 
+        // we go back and re-calculate the 'maxZoomLevel'.
+        this.maxZoomLevel = this.minZoomLevel + this.numZoomLevels - 1;
+
+        if (this.RESOLUTIONS != null) {
+            var resolutionsIndex = 0;
+            this.resolutions = [];
+            for(var i= this.minZoomLevel; i <= this.maxZoomLevel; 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
+     */
+    getResolution: function() {
+
+        if (this.resolutions != null) {
+            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 );
+            }
+            return resolution;
+        }
+     },
+
+    /**
+     * APIMethod: getExtent
+     * Calculates using px-> lonlat translation functions on tl and br 
+     *     corners of viewport
+     * 
+     * Returns:
+     * {<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, 
+                                       tlLL.lat);
+        }
+
+        return extent;
+    },
+
+    /**
+     * Method: getZoomForResolution
+     * Get the zoom level for a given resolution
+     *
+     * Parameters:
+     * resolution - {Float}
+     *
+     * Returns:
+     * {Integer} A suitable zoom level for the specified resolution.
+     *           If no baselayer is set, returns null.
+     */
+    getZoomForResolution: function(resolution) {
+      
+        if (this.resolutions != null) {
+            return OpenLayers.Layer.prototype.getZoomForResolution.apply(this, arguments);
+        } else {
+            var extent = OpenLayers.Layer.prototype.getExtent.apply(this, []);
+            return this.getZoomForExtent(extent);
+        }
+    },
+
+
+
+    
+    /********************************************************/
+    /*                                                      */
+    /*             Translation Functions                    */
+    /*                                                      */
+    /*    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
+     */
+    getOLZoomFromMapObjectZoom: function(moZoom) {
+        var zoom = null;
+        if (moZoom != null) {
+            zoom = moZoom - this.minZoomLevel;
+        }
+        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; 
+        if (olZoom != null) {
+            zoom = olZoom + this.minZoomLevel;
+        }
+        return zoom;
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.FixedZoomLevels"
+});
+
diff --git a/lib/OpenLayers/Layer/GML.js b/lib/OpenLayers/Layer/GML.js
new file mode 100644
index 0000000..6631cd6
--- /dev/null
+++ b/lib/OpenLayers/Layer/GML.js
@@ -0,0 +1,174 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/Vector.js
+ * @requires OpenLayers/Request/XMLHttpRequest.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.GML
+ * Create a vector layer by parsing a GML file. The GML file is
+ *     passed in as a parameter.
+ * *Deprecated*.  To be removed in 3.0.  Instead use OpenLayers.Layer.Vector
+ *     with Protocol.HTTP and Strategy.Fixed. Provide the protocol with a 
+ *     format parameter to get the parser you want for your data.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Vector>
+ */
+OpenLayers.Layer.GML = OpenLayers.Class(OpenLayers.Layer.Vector, {
+    
+    /**
+      * Property: loaded
+      * {Boolean} Flag for whether the GML data has been loaded yet.
+      */
+    loaded: false,
+
+    /**
+      * APIProperty: format
+      * {<OpenLayers.Format>} The format you want the data to be parsed with.
+      */
+    format: null,
+
+    /**
+     * APIProperty: formatOptions
+     * {Object} Hash of options which should be passed to the format when it is
+     * created. Must be passed in the constructor.
+     */
+    formatOptions: null, 
+    
+    /**
+     * Constructor: OpenLayers.Layer.GML
+     * Load and parse a single file on the web, according to the format
+     * provided via the 'format' option, defaulting to GML. 
+     *
+     * Parameters:
+     * name - {String} 
+     * url - {String} URL of a GML file.
+     * options - {Object} Hashtable of extra options to tag onto the layer.
+     */
+     initialize: function(name, url, options) {
+        var newArguments = [];
+        newArguments.push(name, options);
+        OpenLayers.Layer.Vector.prototype.initialize.apply(this, newArguments);
+        this.url = url;
+    },
+
+    /**
+     * APIMethod: setVisibility
+     * Set the visibility flag for the layer and hide/show&redraw accordingly. 
+     * Fire event unless otherwise specified
+     * GML will be loaded if the layer is being made visible for the first
+     * time.
+     *  
+     * Parameters:
+     * visible - {Boolean} Whether or not to display the layer 
+     *                          (if in range)
+     * noEvent - {Boolean} 
+     */
+    setVisibility: function(visibility, noEvent) {
+        OpenLayers.Layer.Vector.prototype.setVisibility.apply(this, arguments);
+        if(this.visibility && !this.loaded){
+            // Load the GML
+            this.loadGML();
+        }
+    },
+
+    /**
+     * Method: moveTo
+     * If layer is visible and GML has not been loaded, load GML, then load GML
+     * and call OpenLayers.Layer.Vector.moveTo() to redraw at the new location.
+     * 
+     * Parameters:
+     * bounds - {Object} 
+     * zoomChanged - {Object} 
+     * minor - {Object} 
+     */
+    moveTo:function(bounds, zoomChanged, minor) {
+        OpenLayers.Layer.Vector.prototype.moveTo.apply(this, arguments);
+        // Wait until initialisation is complete before loading GML
+        // otherwise we can get a race condition where the root HTML DOM is
+        // loaded after the GML is paited.
+        // See http://trac.openlayers.org/ticket/404
+        if(this.visibility && !this.loaded){
+            this.loadGML();
+        }
+    },
+
+    /**
+     * Method: loadGML
+     */
+    loadGML: function() {
+        if (!this.loaded) {
+            this.events.triggerEvent("loadstart");
+            OpenLayers.Request.GET({
+                url: this.url,
+                success: this.requestSuccess,
+                failure: this.requestFailure,
+                scope: this
+            });
+            this.loaded = true;
+        }    
+    },    
+    
+    /**
+     * Method: setUrl
+     * Change the URL and reload the GML
+     *
+     * Parameters:
+     * url - {String} URL of a GML file.
+     */
+    setUrl:function(url) {
+        this.url = url;
+        this.destroyFeatures();
+        this.loaded = false;
+        this.loadGML();
+    },
+    
+    /**
+     * Method: requestSuccess
+     * Process GML after it has been loaded.
+     * Called by initialize() and loadUrl() after the GML has been loaded.
+     *
+     * Parameters:
+     * request - {String} 
+     */
+    requestSuccess:function(request) {
+        var doc = request.responseXML;
+        
+        if (!doc || !doc.documentElement) {
+            doc = request.responseText;
+        }
+        
+        var options = {};
+        
+        OpenLayers.Util.extend(options, this.formatOptions);
+        if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
+            options.externalProjection = this.projection;
+            options.internalProjection = this.map.getProjectionObject();
+        }    
+        
+        var gml = this.format ? new this.format(options) : new OpenLayers.Format.GML(options);
+        this.addFeatures(gml.read(doc));
+        this.events.triggerEvent("loadend");
+    },
+    
+    /**
+     * Method: requestFailure
+     * Process a failed loading of GML.
+     * Called by initialize() and loadUrl() if there was a problem loading GML.
+     *
+     * Parameters:
+     * request - {String} 
+     */
+    requestFailure: function(request) {
+        OpenLayers.Console.userError(OpenLayers.i18n("errorLoadingGML", {'url':this.url}));
+        this.events.triggerEvent("loadend");
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.GML"
+});
diff --git a/lib/OpenLayers/Layer/GeoRSS.js b/lib/OpenLayers/Layer/GeoRSS.js
new file mode 100644
index 0000000..4e72ba4
--- /dev/null
+++ b/lib/OpenLayers/Layer/GeoRSS.js
@@ -0,0 +1,266 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Markers.js
+ * @requires OpenLayers/Request/XMLHttpRequest.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.GeoRSS
+ * Add GeoRSS Point features to your map. 
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Markers>
+ *  - <OpenLayers.Layer>
+ */
+OpenLayers.Layer.GeoRSS = OpenLayers.Class(OpenLayers.Layer.Markers, {
+
+    /** 
+     * Property: location 
+     * {String} store url of text file 
+     */
+    location: null,
+
+    /** 
+     * Property: features 
+     * {Array(<OpenLayers.Feature>)} 
+     */
+    features: null,
+    
+    /**
+     * APIProperty: formatOptions
+     * {Object} Hash of options which should be passed to the format when it is
+     * created. Must be passed in the constructor.
+     */
+    formatOptions: null, 
+
+    /** 
+     * Property: selectedFeature 
+     * {<OpenLayers.Feature>} 
+     */
+    selectedFeature: null,
+
+    /** 
+     * APIProperty: icon 
+     * {<OpenLayers.Icon>}. This determines the Icon to be used on the map
+     * for this GeoRSS layer.
+     */
+    icon: null,
+
+    /**
+     * APIProperty: popupSize
+     * {<OpenLayers.Size>} This determines the size of GeoRSS popups. If 
+     * not provided, defaults to 250px by 120px. 
+     */
+    popupSize: null, 
+    
+    /** 
+     * APIProperty: useFeedTitle 
+     * {Boolean} Set layer.name to the first <title> element in the feed. Default is true. 
+     */
+    useFeedTitle: true,
+    
+    /**
+    * Constructor: OpenLayers.Layer.GeoRSS
+    * Create a GeoRSS Layer.
+    *
+    * Parameters:
+    * name - {String} 
+    * location - {String} 
+    * options - {Object}
+    */
+    initialize: function(name, location, options) {
+        OpenLayers.Layer.Markers.prototype.initialize.apply(this, [name, options]);
+        this.location = location;
+        this.features = [];
+    },
+
+    /**
+     * Method: destroy 
+     */
+    destroy: function() {
+        // Warning: Layer.Markers.destroy() must be called prior to calling
+        // clearFeatures() here, otherwise we leak memory. Indeed, if
+        // Layer.Markers.destroy() is called after clearFeatures(), it won't be
+        // able to remove the marker image elements from the layer's div since
+        // the markers will have been destroyed by clearFeatures().
+        OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
+        this.clearFeatures();
+        this.features = null;
+    },
+
+    /**
+     * Method: loadRSS
+     * Start the load of the RSS data. Don't do this when we first add the layer,
+     * since we may not be visible at any point, and it would therefore be a waste.
+     */
+    loadRSS: function() {
+        if (!this.loaded) {
+            this.events.triggerEvent("loadstart");
+            OpenLayers.Request.GET({
+                url: this.location,
+                success: this.parseData,
+                scope: this
+            });
+            this.loaded = true;
+        }    
+    },    
+    
+    /**
+     * Method: moveTo
+     * If layer is visible and RSS has not been loaded, load RSS. 
+     * 
+     * Parameters:
+     * bounds - {Object} 
+     * zoomChanged - {Object} 
+     * minor - {Object} 
+     */
+    moveTo:function(bounds, zoomChanged, minor) {
+        OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
+        if(this.visibility && !this.loaded){
+            this.loadRSS();
+        }
+    },
+        
+    /**
+     * Method: parseData
+     * Parse the data returned from the Events call.
+     *
+     * Parameters:
+     * ajaxRequest - {<OpenLayers.Request.XMLHttpRequest>} 
+     */
+    parseData: function(ajaxRequest) {
+        var doc = ajaxRequest.responseXML;
+        if (!doc || !doc.documentElement) {
+            doc = OpenLayers.Format.XML.prototype.read(ajaxRequest.responseText);
+        }
+        
+        if (this.useFeedTitle) {
+            var name = null;
+            try {
+                name = doc.getElementsByTagNameNS('*', 'title')[0].firstChild.nodeValue;
+            }
+            catch (e) {
+                name = doc.getElementsByTagName('title')[0].firstChild.nodeValue;
+            }
+            if (name) {
+                this.setName(name);
+            }    
+        }
+       
+        var options = {};
+        
+        OpenLayers.Util.extend(options, this.formatOptions);
+        
+        if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
+            options.externalProjection = this.projection;
+            options.internalProjection = this.map.getProjectionObject();
+        }    
+        
+        var format = new OpenLayers.Format.GeoRSS(options);
+        var features = format.read(doc);
+        
+        for (var i=0, len=features.length; i<len; i++) {
+            var data = {};
+            var feature = features[i];
+            
+            // we don't support features with no geometry in the GeoRSS
+            // layer at this time. 
+            if (!feature.geometry) {
+                continue;
+            }    
+            
+            var title = feature.attributes.title ? 
+                         feature.attributes.title : "Untitled";
+            
+            var description = feature.attributes.description ? 
+                         feature.attributes.description : "No description.";
+            
+            var link = feature.attributes.link ? feature.attributes.link : "";
+
+            var location = feature.geometry.getBounds().getCenterLonLat();
+            
+            
+            data.icon = this.icon == null ? 
+                                     OpenLayers.Marker.defaultIcon() : 
+                                     this.icon.clone();
+            
+            data.popupSize = this.popupSize ? 
+                             this.popupSize.clone() :
+                             new OpenLayers.Size(250, 120);
+            
+            if (title || description) {
+                // we have supplemental data, store them.
+                data.title = title;
+                data.description = description;
+            
+                var contentHTML = '<div class="olLayerGeoRSSClose">[x]</div>'; 
+                contentHTML += '<div class="olLayerGeoRSSTitle">';
+                if (link) {
+                    contentHTML += '<a class="link" href="'+link+'" target="_blank">';
+                }
+                contentHTML += title;
+                if (link) {
+                    contentHTML += '</a>';
+                }
+                contentHTML += '</div>';
+                contentHTML += '<div style="" class="olLayerGeoRSSDescription">';
+                contentHTML += description;
+                contentHTML += '</div>';
+                data['popupContentHTML'] = contentHTML;                
+            }
+            var feature = new OpenLayers.Feature(this, location, data);
+            this.features.push(feature);
+            var marker = feature.createMarker();
+            marker.events.register('click', feature, this.markerClick);
+            this.addMarker(marker);
+        }
+        this.events.triggerEvent("loadend");
+    },
+    
+    /**
+     * Method: markerClick
+     *
+     * Parameters:
+     * evt - {Event} 
+     */
+    markerClick: function(evt) {
+        var sameMarkerClicked = (this == this.layer.selectedFeature);
+        this.layer.selectedFeature = (!sameMarkerClicked) ? this : null;
+        for(var i=0, len=this.layer.map.popups.length; i<len; i++) {
+            this.layer.map.removePopup(this.layer.map.popups[i]);
+        }
+        if (!sameMarkerClicked) {
+            var popup = this.createPopup();
+            OpenLayers.Event.observe(popup.div, "click",
+                OpenLayers.Function.bind(function() { 
+                    for(var i=0, len=this.layer.map.popups.length; i<len; i++) { 
+                        this.layer.map.removePopup(this.layer.map.popups[i]); 
+                    }
+                }, this)
+            );
+            this.layer.map.addPopup(popup); 
+        }
+        OpenLayers.Event.stop(evt);
+    },
+
+    /**
+     * Method: clearFeatures
+     * Destroy all features in this layer.
+     */
+    clearFeatures: function() {
+        if (this.features != null) {
+            while(this.features.length > 0) {
+                var feature = this.features[0];
+                OpenLayers.Util.removeItem(this.features, feature);
+                feature.destroy();
+            }
+        }        
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.GeoRSS"
+});
diff --git a/lib/OpenLayers/Layer/Google.js b/lib/OpenLayers/Layer/Google.js
new file mode 100644
index 0000000..6437ee3
--- /dev/null
+++ b/lib/OpenLayers/Layer/Google.js
@@ -0,0 +1,795 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/SphericalMercator.js
+ * @requires OpenLayers/Layer/EventPane.js
+ * @requires OpenLayers/Layer/FixedZoomLevels.js
+ */
+
+/**
+ * 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.FixedZoomLevels, {
+    
+    /** 
+     * Constant: MIN_ZOOM_LEVEL
+     * {Integer} 0 
+     */
+    MIN_ZOOM_LEVEL: 0,
+    
+    /** 
+     * Constant: MAX_ZOOM_LEVEL
+     * {Integer} 21
+     */
+    MAX_ZOOM_LEVEL: 21,
+
+    /** 
+     * 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, 
+        0.0439453125,
+        0.02197265625, 
+        0.010986328125, 
+        0.0054931640625, 
+        0.00274658203125,
+        0.001373291015625, 
+        0.0006866455078125, 
+        0.00034332275390625,
+        0.000171661376953125, 
+        0.0000858306884765625, 
+        0.00004291534423828125,
+        0.00002145767211914062, 
+        0.00001072883605957031,
+        0.00000536441802978515, 
+        0.00000268220901489257,
+        0.0000013411045074462891,
+        0.00000067055225372314453
+    ],
+
+    /**
+     * APIProperty: type
+     * {GMapType}
+     */
+    type: null,
+
+    /**
+     * APIProperty: wrapDateLine
+     * {Boolean} Allow user to pan forever east/west.  Default is true.  
+     *     Setting this to false only restricts panning if 
+     *     <sphericalMercator> is true. 
+     */
+    wrapDateLine: true,
+
+    /**
+     * 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. 
+     */
+    sphericalMercator: false, 
+    
+    /**
+     * Property: version
+     * {Number} The version of the Google Maps API
+     */
+    version: null,
+
+    /** 
+     * Constructor: OpenLayers.Layer.Google
+     * 
+     * Parameters:
+     * name - {String} A name for the layer.
+     * options - {Object} An optional object whose properties will be set
+     *     on the layer.
+     */
+    initialize: function(name, options) {
+        options = options || {};
+        if(!options.version) {
+            options.version = typeof GMap2 === "function" ? "2" : "3";
+        }
+        var mixin = OpenLayers.Layer.Google["v" +
+            options.version.replace(/\./g, "_")];
+        if (mixin) {
+            OpenLayers.Util.applyDefaults(options, mixin);
+        } else {
+            throw "Unsupported Google Maps API version: " + options.version;
+        }
+
+        OpenLayers.Util.applyDefaults(options, mixin.DEFAULTS);
+        if (options.maxExtent) {
+            options.maxExtent = options.maxExtent.clone();
+        }
+
+        OpenLayers.Layer.EventPane.prototype.initialize.apply(this,
+            [name, options]);
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, 
+            [name, options]);
+
+        if (this.sphericalMercator) {
+            OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
+            this.initMercatorParameters();
+        }    
+    },
+
+    /**
+     * Method: clone
+     * Create a clone of this layer
+     *
+     * Returns:
+     * {<OpenLayers.Layer.Google>} An exact clone of this layer
+     */
+    clone: function() {
+        /**
+         * This method isn't intended to be called by a subclass and it
+         * doesn't call the same method on the superclass.  We don't call
+         * the super's clone because we don't want properties that are set
+         * on this layer after initialize (i.e. this.mapObject etc.).
+         */
+        return new OpenLayers.Layer.Google(
+            this.name, this.getOptions()
+        );
+    },
+
+    /**
+     * APIMethod: setVisibility
+     * 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 
+     *     subverted.
+     * 
+     * Parameters:
+     * visible - {Boolean} Display the layer (if in range)
+     */
+    setVisibility: function(visible) {
+        // sharing a map container, opacity has to be set per layer
+        var opacity = this.opacity == null ? 1 : this.opacity;
+        OpenLayers.Layer.EventPane.prototype.setVisibility.apply(this, arguments);
+        this.setOpacity(opacity);
+    },
+    
+    /** 
+     * APIMethod: display
+     * Hide or show the Layer
+     * 
+     * Parameters:
+     * display - {Boolean}
+     */
+    display: function(visible) {
+        if (!this._dragging) {
+            this.setGMapVisibility(visible);
+        }
+        OpenLayers.Layer.EventPane.prototype.display.apply(this, arguments);
+    },
+    
+    /**
+     * Method: moveTo
+     * 
+     * Parameters:
+     * bound - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean} Tells when zoom has changed, as layers have to
+     *     do some init work in that case.
+     * dragging - {Boolean}
+     */
+    moveTo: function(bounds, zoomChanged, dragging) {
+        this._dragging = dragging;
+        OpenLayers.Layer.EventPane.prototype.moveTo.apply(this, arguments);
+        delete this._dragging;
+    },
+    
+    /**
+     * APIMethod: setOpacity
+     * Sets the opacity for the entire layer (all images)
+     * 
+     * Parameter:
+     * opacity - {Float}
+     */
+    setOpacity: function(opacity) {
+        if (opacity !== this.opacity) {
+            if (this.map != null) {
+                this.map.events.triggerEvent("changelayer", {
+                    layer: this,
+                    property: "opacity"
+                });
+            }
+            this.opacity = opacity;
+        }
+        // Though this layer's opacity may not change, we're sharing a container
+        // and need to update the opacity for the entire container.
+        if (this.getVisibility()) {
+            var container = this.getMapContainer();
+            OpenLayers.Util.modifyDOMElement(
+                container, null, null, null, null, null, null, opacity
+            );
+        }
+    },
+
+    /**
+     * APIMethod: destroy
+     * Clean up this layer.
+     */
+    destroy: function() {
+        /**
+         * We have to override this method because the event pane destroy
+         * deletes the mapObject reference before removing this layer from
+         * the map.
+         */
+        if (this.map) {
+            this.setGMapVisibility(false);
+            var cache = OpenLayers.Layer.Google.cache[this.map.id];
+            if (cache && cache.count <= 1) {
+                this.removeGMapElements();
+            }            
+        }
+        OpenLayers.Layer.EventPane.prototype.destroy.apply(this, arguments);
+    },
+    
+    /**
+     * Method: removeGMapElements
+     * Remove all elements added to the dom.  This should only be called if
+     * this is the last of the Google layers for the given map.
+     */
+    removeGMapElements: function() {
+        var cache = OpenLayers.Layer.Google.cache[this.map.id];
+        if (cache) {
+            // remove shared elements from dom
+            var container = this.mapObject && this.getMapContainer();                
+            if (container && container.parentNode) {
+                container.parentNode.removeChild(container);
+            }
+            var termsOfUse = cache.termsOfUse;
+            if (termsOfUse && termsOfUse.parentNode) {
+                termsOfUse.parentNode.removeChild(termsOfUse);
+            }
+            var poweredBy = cache.poweredBy;
+            if (poweredBy && poweredBy.parentNode) {
+                poweredBy.parentNode.removeChild(poweredBy);
+            }
+        }
+    },
+
+    /**
+     * APIMethod: removeMap
+     * On being removed from the map, also remove termsOfUse and poweredBy divs
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    removeMap: function(map) {
+        // hide layer before removing
+        if (this.visibility && this.mapObject) {
+            this.setGMapVisibility(false);
+        }
+        // check to see if last Google layer in this map
+        var cache = OpenLayers.Layer.Google.cache[map.id];
+        if (cache) {
+            if (cache.count <= 1) {
+                this.removeGMapElements();
+                delete OpenLayers.Layer.Google.cache[map.id];
+            } else {
+                // decrement the layer count
+                --cache.count;
+            }
+        }
+        // remove references to gmap elements
+        delete this.termsOfUse;
+        delete this.poweredBy;
+        delete this.mapObject;
+        delete this.dragObject;
+        OpenLayers.Layer.EventPane.prototype.removeMap.apply(this, arguments);
+    },
+    
+  //
+  // TRANSLATION: MapObject Bounds <-> OpenLayers.Bounds
+  //
+
+    /**
+     * APIMethod: getOLBoundsFromMapObjectBounds
+     * 
+     * Parameters:
+     * moBounds - {Object}
+     * 
+     * Returns:
+     * {<OpenLayers.Bounds>} An <OpenLayers.Bounds>, translated from the 
+     *                       passed-in MapObject Bounds.
+     *                       Returns null if null value is passed in.
+     */
+    getOLBoundsFromMapObjectBounds: function(moBounds) {
+        var olBounds = null;
+        if (moBounds != null) {
+            var sw = moBounds.getSouthWest();
+            var ne = moBounds.getNorthEast();
+            if (this.sphericalMercator) {
+                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, 
+                                             ne.lat );
+        }
+        return olBounds;
+    },
+
+    /** 
+     * APIMethod: getWarningHTML
+     * 
+     * Returns: 
+     * {String} String with information on why layer is broken, how to get
+     *          it working.
+     */
+    getWarningHTML:function() {
+        return OpenLayers.i18n("googleWarning");
+    },
+
+
+    /************************************
+     *                                  *
+     *   MapObject Interface Controls   *
+     *                                  *
+     ************************************/
+
+
+  // Get&Set Center, Zoom
+
+    /**
+     * APIMethod: getMapObjectCenter
+     * 
+     * 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
+     */
+    getMapObjectZoom: function() {
+        return this.mapObject.getZoom();
+    },
+
+  
+    /************************************
+     *                                  *
+     *       MapObject Primitives       *
+     *                                  *
+     ************************************/
+
+
+  // LonLat
+    
+    /**
+     * APIMethod: getLongitudeFromMapObjectLonLat
+     * 
+     * Parameters:
+     * moLonLat - {Object} MapObject LonLat format
+     * 
+     * Returns:
+     * {Float} Longitude of the given MapObject LonLat
+     */
+    getLongitudeFromMapObjectLonLat: function(moLonLat) {
+        return this.sphericalMercator ? 
+          this.forwardMercator(moLonLat.lng(), moLonLat.lat()).lon :
+          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 ? 
+          this.forwardMercator(moLonLat.lng(), moLonLat.lat()).lat :
+          moLonLat.lat(); 
+        return lat;  
+    },
+    
+  // Pixel
+    
+    /**
+     * APIMethod: getXFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Integer} X value of the MapObject Pixel
+     */
+    getXFromMapObjectPixel: function(moPixel) {
+        return moPixel.x;
+    },
+
+    /**
+     * APIMethod: getYFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Integer} Y value of the MapObject Pixel
+     */
+    getYFromMapObjectPixel: function(moPixel) {
+        return moPixel.y;
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.Google"
+});
+
+/**
+ * Property: OpenLayers.Layer.Google.cache
+ * {Object} Cache for elements that should only be created once per map.
+ */
+OpenLayers.Layer.Google.cache = {};
+
+
+/**
+ * Constant: OpenLayers.Layer.Google.v2
+ * 
+ * Mixin providing functionality specific to the Google Maps API v2.
+ */
+OpenLayers.Layer.Google.v2 = {
+    
+    /**
+     * Property: termsOfUse
+     * {DOMElement} Div for Google's copyright and terms of use link
+     */
+    termsOfUse: null, 
+
+    /**
+     * Property: poweredBy
+     * {DOMElement} Div for Google's powered by logo and link
+     */
+    poweredBy: null, 
+
+    /**
+     * 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, 
+    
+    /** 
+     * Method: loadMapObject
+     * Load the GMap and register appropriate event listeners. If we can't 
+     *     load GMap2, then display a warning message.
+     */
+    loadMapObject:function() {
+        if (!this.type) {
+            this.type = G_NORMAL_MAP;
+        }
+        var mapObject, termsOfUse, poweredBy;
+        var cache = OpenLayers.Layer.Google.cache[this.map.id];
+        if (cache) {
+            // there are already Google layers added to this map
+            mapObject = cache.mapObject;
+            termsOfUse = cache.termsOfUse;
+            poweredBy = cache.poweredBy;
+            // increment the layer count
+            ++cache.count;
+        } else {
+            // this is the first Google layer for this map
+
+            var container = this.map.viewPortDiv;
+            var div = document.createElement("div");
+            div.id = this.map.id + "_GMap2Container";
+            div.style.position = "absolute";
+            div.style.width = "100%";
+            div.style.height = "100%";
+            container.appendChild(div);
+
+            // create GMap and shuffle elements
+            try {
+                mapObject = new GMap2(div);
+                
+                // move the ToS and branding stuff up to the container div
+                termsOfUse = div.lastChild;
+                container.appendChild(termsOfUse);
+                termsOfUse.style.zIndex = "1100";
+                termsOfUse.style.right = "";
+                termsOfUse.style.bottom = "";
+                termsOfUse.className = "olLayerGoogleCopyright";
+
+                poweredBy = div.lastChild;
+                container.appendChild(poweredBy);
+                poweredBy.style.zIndex = "1100";
+                poweredBy.style.right = "";
+                poweredBy.style.bottom = "";
+                poweredBy.className = "olLayerGooglePoweredBy gmnoprint";
+                
+            } catch (e) {
+                throw(e);
+            }
+            // cache elements for use by any other google layers added to
+            // this same map
+            OpenLayers.Layer.Google.cache[this.map.id] = {
+                mapObject: mapObject,
+                termsOfUse: termsOfUse,
+                poweredBy: poweredBy,
+                count: 1
+            };
+        }
+
+        this.mapObject = mapObject;
+        this.termsOfUse = termsOfUse;
+        this.poweredBy = poweredBy;
+        
+        // ensure this layer type is one of the mapObject types
+        if (OpenLayers.Util.indexOf(this.mapObject.getMapTypes(),
+                                    this.type) === -1) {
+            this.mapObject.addMapType(this.type);
+        }
+
+        //since v 2.93 getDragObject is now available.
+        if(typeof mapObject.getDragObject == "function") {
+            this.dragObject = mapObject.getDragObject();
+        } else {
+            this.dragPanMapObject = null;
+        }
+        
+        if(this.isBaseLayer === false) {
+            this.setGMapVisibility(this.div.style.display !== "none");
+        }
+
+    },
+
+    /**
+     * APIMethod: onMapResize
+     */
+    onMapResize: function() {
+        // workaround for resizing of invisible or not yet fully loaded layers
+        // where GMap2.checkResize() does not work. We need to load the GMap
+        // for the old div size, then checkResize(), and then call
+        // layer.moveTo() to trigger GMap.setCenter() (which will finish
+        // the GMap initialization).
+        if(this.visibility && this.mapObject.isLoaded()) {
+            this.mapObject.checkResize();
+        } else {
+            if(!this._resized) {
+                var layer = this;
+                var handle = GEvent.addListener(this.mapObject, "load", function() {
+                    GEvent.removeListener(handle);
+                    delete layer._resized;
+                    layer.mapObject.checkResize();
+                    layer.moveTo(layer.map.getCenter(), layer.map.getZoom());
+                });
+            }
+            this._resized = true;
+        }
+    },
+
+    /**
+     * Method: setGMapVisibility
+     * Display the GMap container and associated elements.
+     * 
+     * Parameters:
+     * visible - {Boolean} Display the GMap elements.
+     */
+    setGMapVisibility: function(visible) {
+        var cache = OpenLayers.Layer.Google.cache[this.map.id];
+        if (cache) {
+            var container = this.mapObject.getContainer();
+            if (visible === true) {
+                this.mapObject.setMapType(this.type);
+                container.style.display = "";
+                this.termsOfUse.style.left = "";
+                this.termsOfUse.style.display = "";
+                this.poweredBy.style.display = "";            
+                cache.displayed = this.id;
+            } else {
+                if (cache.displayed === this.id) {
+                    delete cache.displayed;
+                }
+                if (!cache.displayed) {
+                    container.style.display = "none";
+                    this.termsOfUse.style.display = "none";
+                    // move ToU far to the left in addition to setting display
+                    // to "none", because at the end of the GMap2 load
+                    // sequence, display: none will be unset and ToU would be
+                    // visible after loading a map with a google layer that is
+                    // initially hidden. 
+                    this.termsOfUse.style.left = "-9999px";
+                    this.poweredBy.style.display = "none";
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: getMapContainer
+     * 
+     * Returns:
+     * {DOMElement} the GMap container's div
+     */
+    getMapContainer: function() {
+        return this.mapObject.getContainer();
+    },
+
+  //
+  // TRANSLATION: MapObject Bounds <-> OpenLayers.Bounds
+  //
+
+    /**
+     * APIMethod: getMapObjectBoundsFromOLBounds
+     * 
+     * Parameters:
+     * olBounds - {<OpenLayers.Bounds>}
+     * 
+     * Returns:
+     * {Object} A MapObject Bounds, translated from olBounds
+     *          Returns null if null value is passed in
+     */
+    getMapObjectBoundsFromOLBounds: function(olBounds) {
+        var moBounds = null;
+        if (olBounds != null) {
+            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) : 
+              new OpenLayers.LonLat(olBounds.top, olBounds.right);
+            moBounds = new GLatLngBounds(new GLatLng(sw.lat, sw.lon),
+                                         new GLatLng(ne.lat, ne.lon));
+        }
+        return moBounds;
+    },
+
+
+    /************************************
+     *                                  *
+     *   MapObject Interface Controls   *
+     *                                  *
+     ************************************/
+
+
+  // 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); 
+    },
+   
+    /**
+     * APIMethod: dragPanMapObject
+     * 
+     * Parameters:
+     * dX - {Integer}
+     * dY - {Integer}
+     */
+    dragPanMapObject: function(dX, dY) {
+        this.dragObject.moveBy(new GSize(-dX, dY));
+    },
+
+
+  // LonLat - Pixel Translation
+  
+    /**
+     * APIMethod: getMapObjectLonLatFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Object} MapObject LonLat translated from MapObject Pixel
+     */
+    getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
+        return this.mapObject.fromContainerPixelToLatLng(moPixel);
+    },
+
+    /**
+     * APIMethod: getMapObjectPixelFromMapObjectLonLat
+     * 
+     * Parameters:
+     * moLonLat - {Object} MapObject LonLat format
+     * 
+     * Returns:
+     * {Object} MapObject Pixel transtlated from MapObject LonLat
+     */
+    getMapObjectPixelFromMapObjectLonLat: function(moLonLat) {
+        return this.mapObject.fromLatLngToContainerPixel(moLonLat);
+    },
+
+  
+  // Bounds
+  
+    /** 
+     * APIMethod: getMapObjectZoomFromMapObjectBounds
+     * 
+     * Parameters:
+     * moBounds - {Object} MapObject Bounds format
+     * 
+     * Returns:
+     * {Object} MapObject Zoom for specified MapObject Bounds
+     */
+    getMapObjectZoomFromMapObjectBounds: function(moBounds) {
+        return this.mapObject.getBoundsZoomLevel(moBounds);
+    },
+
+    /************************************
+     *                                  *
+     *       MapObject Primitives       *
+     *                                  *
+     ************************************/
+
+
+  // LonLat
+    
+    /**
+     * APIMethod: getMapObjectLonLatFromLonLat
+     * 
+     * Parameters:
+     * lon - {Float}
+     * lat - {Float}
+     * 
+     * Returns:
+     * {Object} MapObject LonLat built from lon and lat params
+     */
+    getMapObjectLonLatFromLonLat: function(lon, lat) {
+        var gLatLng;
+        if(this.sphericalMercator) {
+            var lonlat = this.inverseMercator(lon, lat);
+            gLatLng = new GLatLng(lonlat.lat, lonlat.lon);
+        } else {
+            gLatLng = new GLatLng(lat, lon);
+        }
+        return gLatLng;
+    },
+
+  // Pixel
+    
+    /**
+     * APIMethod: getMapObjectPixelFromXY
+     * 
+     * Parameters:
+     * x - {Integer}
+     * y - {Integer}
+     * 
+     * Returns:
+     * {Object} MapObject Pixel from x and y parameters
+     */
+    getMapObjectPixelFromXY: function(x, y) {
+        return new GPoint(x, y);
+    }
+    
+};
diff --git a/lib/OpenLayers/Layer/Google/v3.js b/lib/OpenLayers/Layer/Google/v3.js
new file mode 100644
index 0000000..38a86c6
--- /dev/null
+++ b/lib/OpenLayers/Layer/Google/v3.js
@@ -0,0 +1,419 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Google.js
+ */
+
+/**
+ * Constant: OpenLayers.Layer.Google.v3
+ * 
+ * Mixin providing functionality specific to the Google Maps API v3. Note that
+ * this layer configures the google.maps.map object with the "disableDefaultUI"
+ * option set to true. Using UI controls that the Google Maps API provides is
+ * not supported by the OpenLayers API.
+ */
+OpenLayers.Layer.Google.v3 = {
+    
+    /**
+     * Constant: DEFAULTS
+     * {Object} It is not recommended to change the properties set here. Note
+     * that Google.v3 layers only work when sphericalMercator is set to true.
+     * 
+     * (code)
+     * {
+     *     maxExtent: new OpenLayers.Bounds(
+     *         -128 * 156543.0339,
+     *         -128 * 156543.0339,
+     *         128 * 156543.0339,
+     *         128 * 156543.0339
+     *     ),
+     *     sphericalMercator: true,
+     *     maxResolution: 156543.0339,
+     *     units: "m",
+     *     projection: "EPSG:900913"
+     * }
+     * (end)
+     */
+    DEFAULTS: {
+        maxExtent: new OpenLayers.Bounds(
+            -128 * 156543.0339,
+            -128 * 156543.0339,
+            128 * 156543.0339,
+            128 * 156543.0339
+        ),
+        sphericalMercator: true,
+        maxResolution: 156543.0339,
+        units: "m",
+        projection: "EPSG:900913"
+    },
+
+    /** 
+     * Method: loadMapObject
+     * Load the GMap and register appropriate event listeners. If we can't 
+     *     load GMap2, then display a warning message.
+     */
+    loadMapObject:function() {
+        if (!this.type) {
+            this.type = google.maps.MapTypeId.ROADMAP;
+        }
+        var mapObject;
+        var cache = OpenLayers.Layer.Google.cache[this.map.id];
+        if (cache) {
+            // there are already Google layers added to this map
+            mapObject = cache.mapObject;
+            // increment the layer count
+            ++cache.count;
+        } else {
+            // this is the first Google layer for this map
+
+            var container = this.map.viewPortDiv;
+            var div = document.createElement("div");
+            div.id = this.map.id + "_GMapContainer";
+            div.style.position = "absolute";
+            div.style.width = "100%";
+            div.style.height = "100%";
+            container.appendChild(div);
+
+            // create GMap and shuffle elements
+            var center = this.map.getCenter();
+            mapObject = new google.maps.Map(div, {
+                center: center ?
+                    new google.maps.LatLng(center.lat, center.lon) :
+                    new google.maps.LatLng(0, 0),
+                zoom: this.map.getZoom() || 0,
+                mapTypeId: this.type,
+                disableDefaultUI: true,
+                keyboardShortcuts: false,
+                draggable: false,
+                disableDoubleClickZoom: true,
+                scrollwheel: false
+            });
+            
+            // cache elements for use by any other google layers added to
+            // this same map
+            cache = {
+                mapObject: mapObject,
+                count: 1
+            };
+            OpenLayers.Layer.Google.cache[this.map.id] = cache;
+            this.repositionListener = google.maps.event.addListenerOnce(
+                mapObject, 
+                "center_changed", 
+                OpenLayers.Function.bind(this.repositionMapElements, this)
+            );
+        }
+        this.mapObject = mapObject;
+        this.setGMapVisibility(this.visibility);
+    },
+    
+    /**
+     * Method: repositionMapElements
+     *
+     * Waits until powered by and terms of use elements are available and then
+     * moves them so they are clickable.
+     */
+    repositionMapElements: function() {
+
+        // This is the first time any Google layer in this mapObject has been
+        // made visible.  The mapObject needs to know the container size.
+        google.maps.event.trigger(this.mapObject, "resize");
+        
+        var div = this.mapObject.getDiv().firstChild;
+        if (!div || div.childNodes.length < 3) {
+            this.repositionTimer = window.setTimeout(
+                OpenLayers.Function.bind(this.repositionMapElements, this),
+                250
+            );
+            return false;
+        }
+
+        var cache = OpenLayers.Layer.Google.cache[this.map.id];
+        var container = this.map.viewPortDiv;
+
+        // move the ToS and branding stuff up to the container div
+        var termsOfUse = div.lastChild;
+        container.appendChild(termsOfUse);
+        termsOfUse.style.zIndex = "1100";
+        termsOfUse.style.bottom = "";
+        termsOfUse.className = "olLayerGoogleCopyright olLayerGoogleV3";
+        termsOfUse.style.display = "";
+        cache.termsOfUse = termsOfUse;
+
+        var poweredBy = div.lastChild;
+        container.appendChild(poweredBy);
+        poweredBy.style.zIndex = "1100";
+        poweredBy.style.bottom = "";
+        poweredBy.className = "olLayerGooglePoweredBy olLayerGoogleV3 gmnoprint";
+        poweredBy.style.display = "";
+        cache.poweredBy = poweredBy;
+
+        this.setGMapVisibility(this.visibility);
+
+    },
+
+    /**
+     * APIMethod: onMapResize
+     */
+    onMapResize: function() {
+        if (this.visibility) {
+            google.maps.event.trigger(this.mapObject, "resize");
+        } else {
+            if (!this._resized) {
+                var layer = this;
+                google.maps.event.addListenerOnce(this.mapObject, "tilesloaded", function() {
+                    delete layer._resized;
+                    google.maps.event.trigger(layer.mapObject, "resize");
+                    layer.moveTo(layer.map.getCenter(), layer.map.getZoom());
+                });
+            }
+            this._resized = true;
+        }
+    },
+
+    /**
+     * Method: setGMapVisibility
+     * Display the GMap container and associated elements.
+     * 
+     * Parameters:
+     * visible - {Boolean} Display the GMap elements.
+     */
+    setGMapVisibility: function(visible) {
+        var cache = OpenLayers.Layer.Google.cache[this.map.id];
+        if (cache) {
+            var type = this.type;
+            var layers = this.map.layers;
+            var layer;
+            for (var i=layers.length-1; i>=0; --i) {
+                layer = layers[i];
+                if (layer instanceof OpenLayers.Layer.Google &&
+                            layer.visibility === true && layer.inRange === true) {
+                    type = layer.type;
+                    visible = true;
+                    break;
+                }
+            }
+            var container = this.mapObject.getDiv();
+            if (visible === true) {
+                this.mapObject.setMapTypeId(type);                
+                container.style.left = "";
+                if (cache.termsOfUse && cache.termsOfUse.style) {
+                    cache.termsOfUse.style.left = "";
+                    cache.termsOfUse.style.display = "";
+                    cache.poweredBy.style.display = "";            
+                }
+                cache.displayed = this.id;
+            } else {
+                delete cache.displayed;
+                container.style.left = "-9999px";
+                if (cache.termsOfUse && cache.termsOfUse.style) {
+                    cache.termsOfUse.style.display = "none";
+                    // move ToU far to the left in addition to setting
+                    // display to "none", because at the end of the GMap
+                    // load sequence, display: none will be unset and ToU
+                    // would be visible after loading a map with a google
+                    // layer that is initially hidden. 
+                    cache.termsOfUse.style.left = "-9999px";
+                    cache.poweredBy.style.display = "none";
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: getMapContainer
+     * 
+     * Returns:
+     * {DOMElement} the GMap container's div
+     */
+    getMapContainer: function() {
+        return this.mapObject.getDiv();
+    },
+    
+  //
+  // TRANSLATION: MapObject Bounds <-> OpenLayers.Bounds
+  //
+
+    /**
+     * APIMethod: getMapObjectBoundsFromOLBounds
+     * 
+     * Parameters:
+     * olBounds - {<OpenLayers.Bounds>}
+     * 
+     * Returns:
+     * {Object} A MapObject Bounds, translated from olBounds
+     *          Returns null if null value is passed in
+     */
+    getMapObjectBoundsFromOLBounds: function(olBounds) {
+        var moBounds = null;
+        if (olBounds != null) {
+            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) : 
+              new OpenLayers.LonLat(olBounds.top, olBounds.right);
+            moBounds = new google.maps.LatLngBounds(
+                new google.maps.LatLng(sw.lat, sw.lon),
+                new google.maps.LatLng(ne.lat, ne.lon)
+            );
+        }
+        return moBounds;
+    },
+
+
+    /************************************
+     *                                  *
+     *   MapObject Interface Controls   *
+     *                                  *
+     ************************************/
+
+
+  // LonLat - Pixel Translation
+  
+    /**
+     * APIMethod: getMapObjectLonLatFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Object} MapObject LonLat translated from MapObject Pixel
+     */
+    getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
+        var size = this.map.getSize();
+        var lon = this.getLongitudeFromMapObjectLonLat(this.mapObject.center);
+        var lat = this.getLatitudeFromMapObjectLonLat(this.mapObject.center);
+        var res = this.map.getResolution();
+
+        var delta_x = moPixel.x - (size.w / 2);
+        var delta_y = moPixel.y - (size.h / 2);
+    
+        var lonlat = new OpenLayers.LonLat(
+            lon + delta_x * res,
+            lat - delta_y * res
+        ); 
+
+        if (this.wrapDateLine) {
+            lonlat = lonlat.wrapDateLine(this.maxExtent);
+        }
+        return this.getMapObjectLonLatFromLonLat(lonlat.lon, lonlat.lat);
+    },
+
+    /**
+     * APIMethod: getMapObjectPixelFromMapObjectLonLat
+     * 
+     * Parameters:
+     * moLonLat - {Object} MapObject LonLat format
+     * 
+     * Returns:
+     * {Object} MapObject Pixel transtlated from MapObject LonLat
+     */
+    getMapObjectPixelFromMapObjectLonLat: function(moLonLat) {
+        var lon = this.getLongitudeFromMapObjectLonLat(moLonLat);
+        var lat = this.getLatitudeFromMapObjectLonLat(moLonLat);
+        var res = this.map.getResolution();
+        var extent = this.map.getExtent();
+        var px = new OpenLayers.Pixel(
+            (1/res * (lon - extent.left)),
+            (1/res * (extent.top - lat))
+        );    
+        return this.getMapObjectPixelFromXY(px.x, px.y);
+    },
+
+  
+    /** 
+     * 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.setOptions({
+            center: center,
+            zoom: zoom
+        });
+    },
+   
+    
+  // Bounds
+  
+    /** 
+     * APIMethod: getMapObjectZoomFromMapObjectBounds
+     * 
+     * Parameters:
+     * moBounds - {Object} MapObject Bounds format
+     * 
+     * Returns:
+     * {Object} MapObject Zoom for specified MapObject Bounds
+     */
+    getMapObjectZoomFromMapObjectBounds: function(moBounds) {
+        return this.mapObject.getBoundsZoomLevel(moBounds);
+    },
+
+    /************************************
+     *                                  *
+     *       MapObject Primitives       *
+     *                                  *
+     ************************************/
+
+
+  // LonLat
+    
+    /**
+     * APIMethod: getMapObjectLonLatFromLonLat
+     * 
+     * Parameters:
+     * lon - {Float}
+     * lat - {Float}
+     * 
+     * Returns:
+     * {Object} MapObject LonLat built from lon and lat params
+     */
+    getMapObjectLonLatFromLonLat: function(lon, lat) {
+        var gLatLng;
+        if(this.sphericalMercator) {
+            var lonlat = this.inverseMercator(lon, lat);
+            gLatLng = new google.maps.LatLng(lonlat.lat, lonlat.lon);
+        } else {
+            gLatLng = new google.maps.LatLng(lat, lon);
+        }
+        return gLatLng;
+    },
+    
+  // Pixel
+    
+    /**
+     * APIMethod: getMapObjectPixelFromXY
+     * 
+     * Parameters:
+     * x - {Integer}
+     * y - {Integer}
+     * 
+     * Returns:
+     * {Object} MapObject Pixel from x and y parameters
+     */
+    getMapObjectPixelFromXY: function(x, y) {
+        return new google.maps.Point(x, y);
+    },
+        
+    /**
+     * APIMethod: destroy
+     * Clean up this layer.
+     */
+    destroy: function() {
+        if (this.repositionListener) {
+            google.maps.event.removeListener(this.repositionListener);
+        }
+        if (this.repositionTimer) {
+            window.clearTimeout(this.repositionTimer);
+        }
+        OpenLayers.Layer.Google.prototype.destroy.apply(this, arguments);
+    }
+    
+};
diff --git a/lib/OpenLayers/Layer/Grid.js b/lib/OpenLayers/Layer/Grid.js
new file mode 100644
index 0000000..1eca360
--- /dev/null
+++ b/lib/OpenLayers/Layer/Grid.js
@@ -0,0 +1,755 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/HTTPRequest.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.Grid
+ * Base class for layers that use a lattice of tiles.  Create a new grid
+ * layer with the <OpenLayers.Layer.Grid> constructor.
+ *
+ * Inherits from:
+ *  - <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 
+     *     an array of tiles.
+     */
+    grid: null,
+
+    /**
+     * APIProperty: singleTile
+     * {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 
+     *     entire viewport, it is reloaded.
+     */
+    singleTile: false,
+
+    /** APIProperty: ratio
+     *  {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 
+     *           extra rows and colums of tiles on each side which will
+     *           surround the minimum grid tiles to cover the map.
+     */
+    buffer: 2,
+
+    /**
+     * APIProperty: numLoadingTiles
+     * {Integer} How many tiles are still loading?
+     */
+    numLoadingTiles: 0,
+
+    /**
+     * Constructor: OpenLayers.Layer.Grid
+     * Create a new grid layer
+     *
+     * Parameters:
+     * name - {String}
+     * url - {String}
+     * params - {Object}
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, params, options) {
+        OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this, 
+                                                                arguments);
+        
+        //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
+        //
+        this.events.addEventType("tileloaded");
+
+        this.grid = [];
+    },
+
+    /**
+     * APIMethod: destroy
+     * Deconstruct the layer and clear the grid.
+     */
+    destroy: function() {
+        this.clearGrid();
+        this.grid = null;
+        this.tileSize = null;
+        OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments); 
+    },
+
+    /**
+     * Method: clearGrid
+     * Go through and remove all tiles from the grid, calling
+     *    destroy() on each of them to kill circular references
+     */
+    clearGrid:function() {
+        if (this.grid) {
+            for(var iRow=0, len=this.grid.length; iRow<len; iRow++) {
+                var row = this.grid[iRow];
+                for(var iCol=0, clen=row.length; iCol<clen; iCol++) {
+                    var tile = row[iCol];
+                    this.removeTileMonitoringHooks(tile);
+                    tile.destroy();
+                }
+            }
+            this.grid = [];
+        }
+    },
+
+    /**
+     * APIMethod: clone
+     * Create a clone of this layer
+     *
+     * 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,
+                                            this.params,
+                                            this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+        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
+     * This function is called whenever the map is moved. All the moving
+     * of actual 'tiles' is done by the map, but moveTo's role is to accept
+     * a bounds and make sure the data that that bounds requires is pre-loaded.
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean}
+     * dragging - {Boolean}
+     */
+    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();            
+      
+            if (this.singleTile) {
+                
+                // 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 || 
+                     (!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 (forceReTile || !tilesBounds.containsBounds(bounds, true)) {
+                    this.initGriddedTiles(bounds);
+                } else {
+                    //we might have to shift our buffer tiles
+                    this.moveGriddedTiles(bounds);
+                }
+            }
+        }
+    },
+    
+    /**
+     * 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) { 
+        if (this.singleTile) {
+            size = this.map.getSize();
+            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 
+     *     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 
+     * onscreen)
+     */
+    getGridBounds: function() {
+        var msg = "The getGridBounds() function is deprecated. It will be " +
+                  "removed in 3.0. Please use getTilesBounds() instead.";
+        OpenLayers.Console.warn(msg);
+        return this.getTilesBounds();
+    },
+
+    /**
+     * APIMethod: getTilesBounds
+     * Return the bounds of the tile grid.
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>} A Bounds object representing the bounds of all the
+     *     currently loaded tiles (including those partially or not at all seen 
+     *     onscreen).
+     */
+    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 topRightTile = this.grid[0][right];
+    
+            bounds = new OpenLayers.Bounds(bottomLeftTile.bounds.left, 
+                                           bottomLeftTile.bounds.bottom,
+                                           topRightTile.bounds.right, 
+                                           topRightTile.bounds.top);
+            
+        }   
+        return bounds;
+    },
+
+    /**
+     * Method: initSingleTile
+     * 
+     * Parameters: 
+     * bounds - {<OpenLayers.Bounds>}
+     */
+    initSingleTile: function(bounds) {
+
+        //determine new tile bounds
+        var center = bounds.getCenterLonLat();
+        var tileWidth = bounds.getWidth() * this.ratio;
+        var tileHeight = bounds.getHeight() * this.ratio;
+                                       
+        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);
+
+        if (!this.grid.length) {
+            this.grid[0] = [];
+        }
+
+        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  
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bound>}
+     * extent - {<OpenLayers.Bounds>}
+     * resolution - {Number}
+     *
+     * Returns:
+     * Object containing properties tilelon, tilelat, tileoffsetlat,
+     * tileoffsetlat, tileoffsetx, tileoffsety
+     */
+    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 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 { 
+          tilelon: tilelon, tilelat: tilelat,
+          tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat,
+          tileoffsetx: tileoffsetx, tileoffsety: tileoffsety
+        };
+
+    },
+
+    /**
+     * 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) + 
+                      Math.max(1, 2 * this.buffer);
+        var minCols = Math.ceil(viewSize.w/this.tileSize.w) +
+                      Math.max(1, 2 * this.buffer);
+        
+        var extent = this.getMaxExtent();
+        var resolution = this.map.getResolution();
+        
+        var tileLayout = this.calculateGridLayout(bounds, extent, resolution);
+
+        var tileoffsetx = Math.round(tileLayout.tileoffsetx); // heaven help us
+        var tileoffsety = Math.round(tileLayout.tileoffsety);
+
+        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 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) {
+                row = [];
+                this.grid.push(row);
+            }
+
+            tileoffsetlon = startLon;
+            tileoffsetx = startX;
+            var colidx = 0;
+ 
+            do {
+                var tileBounds = 
+                    new OpenLayers.Bounds(tileoffsetlon, 
+                                          tileoffsetlat, 
+                                          tileoffsetlon + tilelon,
+                                          tileoffsetlat + tilelat);
+
+                var x = tileoffsetx;
+                x -= layerContainerDivLeft;
+
+                var y = tileoffsety;
+                y -= layerContainerDivTop;
+
+                var px = new OpenLayers.Pixel(x, y);
+                var tile = row[colidx++];
+                if (!tile) {
+                    tile = this.addTile(tileBounds, px);
+                    this.addTileMonitoringHooks(tile);
+                    row.push(tile);
+                } else {
+                    tile.moveTo(tileBounds, px, false);
+                }
+     
+                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: getMaxExtent
+     * Get this layer's maximum extent. (Implemented as a getter for
+     *     potential specific implementations in sub-classes.)
+     *
+     * Returns:
+     * {OpenLayers.Bounds}
+     */
+    getMaxExtent: function() {
+        return this.maxExtent;
+    },
+    
+    /**
+     * 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. 
+     */
+    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;
+            var testCell = iCell;
+
+            switch (directions[direction]) {
+                case "right":
+                    testCell++;
+                    break;
+                case "down":
+                    testRow++;
+                    break;
+                case "left":
+                    testCell--;
+                    break;
+                case "up":
+                    testRow--;
+                    break;
+            } 
+    
+            // 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;
+                iCell = testCell;
+            } else {
+                //need to try to load a tile in a different direction
+                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;       
+        }
+    },
+
+    /**
+     * APIMethod: addTile
+     * 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
+     * bounds - {<OpenLayers.Bounds>}
+     * position - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {<OpenLayers.Tile>} The added OpenLayers.Tile
+     */
+    addTile:function(bounds, position) {
+        // Should be implemented by subclasses
+    },
+    
+    /** 
+     * Method: addTileMonitoringHooks
+     * 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: 
+     * 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) {
+                this.events.triggerEvent("loadstart");
+            }
+            this.numLoadingTiles++;
+        };
+        tile.events.register("loadstart", this, tile.onLoadStart);
+      
+        tile.onLoadEnd = function() {
+            this.numLoadingTiles--;
+            this.events.triggerEvent("tileloaded");
+            //if that was the last tile, then trigger a 'loadend' on the layer
+            if (this.numLoadingTiles == 0) {
+                this.events.triggerEvent("loadend");
+            }
+        };
+        tile.events.register("loadend", this, tile.onLoadEnd);
+        tile.events.register("unload", this, tile.onLoadEnd);
+    },
+
+    /** 
+     * Method: removeTileMonitoringHooks
+     * This function takes a tile as input and removes the tile hooks 
+     *     that were added in addTileMonitoringHooks()
+     * 
+     * Parameters: 
+     * tile - {<OpenLayers.Tile>}
+     */
+    removeTileMonitoringHooks: function(tile) {
+        tile.unload();
+        tile.events.un({
+            "loadstart": tile.onLoadStart,
+            "loadend": tile.onLoadEnd,
+            "unload": tile.onLoadEnd,
+            scope: this
+        });
+    },
+    
+    /**
+     * Method: moveGriddedTiles
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     */
+    moveGriddedTiles: function(bounds) {
+        var buffer = this.buffer || 1;
+        while (true) {
+            var tlLayer = this.grid[0][0].position;
+            var tlViewPort = 
+                this.map.getViewPortPxFromLayerPx(tlLayer);
+            if (tlViewPort.x > -this.tileSize.w * (buffer - 1)) {
+                this.shiftColumn(true);
+            } else if (tlViewPort.x < -this.tileSize.w * buffer) {
+                this.shiftColumn(false);
+            } else if (tlViewPort.y > -this.tileSize.h * (buffer - 1)) {
+                this.shiftRow(true);
+            } else if (tlViewPort.y < -this.tileSize.h * buffer) {
+                this.shiftRow(false);
+            } else {
+                break;
+            }
+        };
+    },
+
+    /**
+     * Method: shiftRow
+     * Shifty grid work
+     *
+     * Parameters:
+     * prepend - {Boolean} if true, prepend to beginning.
+     *                          if false, then append to end
+     */
+    shiftRow:function(prepend) {
+        var modelRowIndex = (prepend) ? 0 : (this.grid.length - 1);
+        var grid = this.grid;
+        var modelRow = grid[modelRowIndex];
+
+        var resolution = this.map.getResolution();
+        var deltaY = (prepend) ? -this.tileSize.h : this.tileSize.h;
+        var deltaLat = resolution * -deltaY;
+
+        var row = (prepend) ? grid.pop() : grid.shift();
+
+        for (var i=0, len=modelRow.length; i<len; i++) {
+            var modelTile = modelRow[i];
+            var bounds = modelTile.bounds.clone();
+            var position = modelTile.position.clone();
+            bounds.bottom = bounds.bottom + deltaLat;
+            bounds.top = bounds.top + deltaLat;
+            position.y = position.y + deltaY;
+            row[i].moveTo(bounds, position);
+        }
+
+        if (prepend) {
+            grid.unshift(row);
+        } else {
+            grid.push(row);
+        }
+    },
+
+    /**
+     * Method: shiftColumn
+     * Shift grid work in the other dimension
+     *
+     * Parameters:
+     * prepend - {Boolean} if true, prepend to beginning.
+     *                          if false, then append to end
+     */
+    shiftColumn: function(prepend) {
+        var deltaX = (prepend) ? -this.tileSize.w : this.tileSize.w;
+        var resolution = this.map.getResolution();
+        var deltaLon = resolution * deltaX;
+
+        for (var i=0, len=this.grid.length; i<len; i++) {
+            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;
+            bounds.right = bounds.right + deltaLon;
+            position.x = position.x + deltaX;
+
+            var tile = prepend ? this.grid[i].pop() : this.grid[i].shift();
+            tile.moveTo(bounds, position);
+            if (prepend) {
+                row.unshift(tile);
+            } else {
+                row.push(tile);
+            }
+        }
+    },
+    
+    /**
+     * 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();
+            for (var i=0, l=row.length; i<l; i++) {
+                var tile = row[i];
+                this.removeTileMonitoringHooks(tile);
+                tile.destroy();
+            }
+        }
+        
+        // remove extra columns
+        while (this.grid[0].length > columns) {
+            for (var i=0, l=this.grid.length; i<l; i++) {
+                var row = this.grid[i];
+                var tile = row.pop();
+                this.removeTileMonitoringHooks(tile);
+                tile.destroy();
+            }
+        }
+    },
+
+    /**
+     * Method: onMapResize
+     * For singleTile layers, this will set a new tile size according to the
+     * dimensions of the map pane.
+     */
+    onMapResize: function() {
+        if (this.singleTile) {
+            this.clearGrid();
+            this.setTileSize();
+        }
+    },
+    
+    /**
+     * APIMethod: getTileBounds
+     * Returns The tile bounds for a layer given a pixel location.
+     *
+     * Parameters:
+     * viewPortPx - {<OpenLayers.Pixel>} The location in the viewport.
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>} Bounds of the tile at the given pixel location.
+     */
+    getTileBounds: function(viewPortPx) {
+        var maxExtent = this.maxExtent;
+        var resolution = this.getResolution();
+        var tileMapWidth = resolution * this.tileSize.w;
+        var tileMapHeight = resolution * this.tileSize.h;
+        var mapPoint = this.getLonLatFromViewPortPx(viewPortPx);
+        var tileLeft = maxExtent.left + (tileMapWidth *
+                                         Math.floor((mapPoint.lon -
+                                                     maxExtent.left) /
+                                                    tileMapWidth));
+        var tileBottom = maxExtent.bottom + (tileMapHeight *
+                                             Math.floor((mapPoint.lat -
+                                                         maxExtent.bottom) /
+                                                        tileMapHeight));
+        return new OpenLayers.Bounds(tileLeft, tileBottom,
+                                     tileLeft + tileMapWidth,
+                                     tileBottom + tileMapHeight);
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.Grid"
+});
diff --git a/lib/OpenLayers/Layer/HTTPRequest.js b/lib/OpenLayers/Layer/HTTPRequest.js
new file mode 100644
index 0000000..1bf8385
--- /dev/null
+++ b/lib/OpenLayers/Layer/HTTPRequest.js
@@ -0,0 +1,230 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.HTTPRequest
+ * 
+ * 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. 
+     */
+    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 
+     *           which can create non-square geographic pixels can, like WMS.
+     *           
+     */
+    reproject: false,
+
+    /**
+     * Constructor: OpenLayers.Layer.HTTPRequest
+     * 
+     * Parameters:
+     * name - {String}
+     * url - {Array(String) or String}
+     * params - {Object}
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, params, options) {
+        var newArguments = arguments;
+        newArguments = [name, options];
+        OpenLayers.Layer.prototype.initialize.apply(this, newArguments);
+        this.url = url;
+        this.params = OpenLayers.Util.extend( {}, params);
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        this.url = null;
+        this.params = null;
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments); 
+    },
+    
+    /**
+     * APIMethod: clone
+     * 
+     * Parameters:
+     * obj - {Object}
+     * 
+     * Returns:
+     * {<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.getOptions());
+        }
+        
+        //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}
+     */
+    setUrl: function(newUrl) {
+        this.url = newUrl;
+    },
+
+    /**
+     * APIMethod: mergeNewParams
+     * 
+     * Parameters:
+     * newParams - {Object}
+     *
+     * Returns:
+     * redrawn: {Boolean} whether the layer was actually redrawn.
+     */
+    mergeNewParams:function(newParams) {
+        this.params = OpenLayers.Util.extend(this.params, newParams);
+        var ret = this.redraw();
+        if(this.map != null) {
+            this.map.events.triggerEvent("changelayer", {
+                layer: this,
+                property: "params"
+            });
+        }
+        return ret;
+    },
+
+    /**
+     * APIMethod: redraw
+     * Redraws the layer.  Returns true if the layer was redrawn, false if not.
+     *
+     * Parameters:
+     * force - {Boolean} Force redraw by adding random parameter.
+     *
+     * Returns:
+     * {Boolean} The layer was redrawn.
+     */
+    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 
+     *     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.
+     *
+     * 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); 
+        }
+        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. 
+     *
+     *    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: 
+     * {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 
+        // 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 
+        // 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));
+        for(var key in allParams) {
+            if(key.toUpperCase() in urlParams) {
+                delete allParams[key];
+            }
+        }
+        paramsString = OpenLayers.Util.getParameterString(allParams);
+        
+        return OpenLayers.Util.urlAppend(url, paramsString);
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.HTTPRequest"
+});
diff --git a/lib/OpenLayers/Layer/Image.js b/lib/OpenLayers/Layer/Image.js
new file mode 100644
index 0000000..7d28504
--- /dev/null
+++ b/lib/OpenLayers/Layer/Image.js
@@ -0,0 +1,254 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+ 
+/**
+ * @requires OpenLayers/Layer.js
+ * @requires OpenLayers/Tile/Image.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.Image
+ * Instances of OpenLayers.Layer.Image are used to display data from a web
+ * accessible image as a map layer.  Create a new image layer with the
+ * <OpenLayers.Layer.Image> constructor.  Inherits from <OpenLayers.Layer>.
+ */
+OpenLayers.Layer.Image = OpenLayers.Class(OpenLayers.Layer, {
+
+    /**
+     * Property: isBaseLayer
+     * {Boolean} The layer is a base layer.  Default is true.  Set this property
+     * in the layer options
+     */
+    isBaseLayer: true,
+    
+    /**
+     * Property: url
+     * {String} URL of the image to use
+     */
+    url: null,
+
+    /**
+     * Property: extent
+     * {<OpenLayers.Bounds>} The image bounds in map units.  This extent will
+     *     also be used as the default maxExtent for the layer.  If you wish
+     *     to have a maxExtent that is different than the image extent, set the
+     *     maxExtent property of the options argument (as with any other layer).
+     */
+    extent: null,
+    
+    /**
+     * Property: size
+     * {<OpenLayers.Size>} The image size in pixels
+     */
+    size: null,
+
+    /**
+     * Property: tile
+     * {<OpenLayers.Tile.Image>}
+     */
+    tile: null,
+
+    /**
+     * Property: aspectRatio
+     * {Float} The ratio of height/width represented by a single pixel in the
+     * graphic
+     */
+    aspectRatio: null,
+
+    /**
+     * Constructor: OpenLayers.Layer.Image
+     * Create a new image layer
+     *
+     * Parameters:
+     * name - {String} A name for the layer.
+     * url - {String} Relative or absolute path to the image
+     * extent - {<OpenLayers.Bounds>} The extent represented by the image
+     * size - {<OpenLayers.Size>} The size (in pixels) of the image
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, extent, size, options) {
+        this.url = url;
+        this.extent = extent;
+        this.maxExtent = extent;
+        this.size = size;
+        OpenLayers.Layer.prototype.initialize.apply(this, [name, options]);
+
+        this.aspectRatio = (this.extent.getHeight() / this.size.h) /
+                           (this.extent.getWidth() / this.size.w);
+    },    
+
+    /**
+     * Method: destroy
+     * Destroy this layer
+     */
+    destroy: function() {
+        if (this.tile) {
+            this.removeTileMonitoringHooks(this.tile);
+            this.tile.destroy();
+            this.tile = null;
+        }
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);
+    },
+    
+    /**
+     * Method: clone
+     * Create a clone of this layer
+     *
+     * Paramters:
+     * obj - {Object} An optional layer (is this ever used?)
+     *
+     * Returns:
+     * {<OpenLayers.Layer.Image>} An exact copy of this layer
+     */
+    clone: function(obj) {
+        
+        if(obj == null) {
+            obj = new OpenLayers.Layer.Image(this.name,
+                                               this.url,
+                                               this.extent,
+                                               this.size,
+                                               this.getOptions());
+        }
+
+        //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: setMap
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    setMap: function(map) {
+        /**
+         * If nothing to do with resolutions has been set, assume a single
+         * resolution determined by ratio*extent/size - if an image has a
+         * pixel aspect ratio different than one (as calculated above), the
+         * image will be stretched in one dimension only.
+         */
+        if( this.options.maxResolution == null ) {
+            this.options.maxResolution = this.aspectRatio *
+                                         this.extent.getWidth() /
+                                         this.size.w;
+        }
+        OpenLayers.Layer.prototype.setMap.apply(this, arguments);
+    },
+
+    /** 
+     * Method: moveTo
+     * Create the tile for the image or resize it for the new resolution
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean}
+     * dragging - {Boolean}
+     */
+    moveTo:function(bounds, zoomChanged, dragging) {
+        OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
+
+        var firstRendering = (this.tile == null);
+
+        if(zoomChanged || firstRendering) {
+
+            //determine new tile size
+            this.setTileSize();
+
+            //determine new position (upper left corner of new bounds)
+            var ul = new OpenLayers.LonLat(this.extent.left, this.extent.top);
+            var ulPx = this.map.getLayerPxFromLonLat(ul);
+
+            if(firstRendering) {
+                //create the new tile
+                this.tile = new OpenLayers.Tile.Image(this, ulPx, this.extent, 
+                                                      null, this.tileSize);
+                this.addTileMonitoringHooks(this.tile);
+            } else {
+                //just resize the tile and set it's new position
+                this.tile.size = this.tileSize.clone();
+                this.tile.position = ulPx.clone();
+            }
+            this.tile.draw();
+        }
+    }, 
+
+    /**
+     * Set the tile size based on the map size.
+     */
+    setTileSize: function() {
+        var tileWidth = this.extent.getWidth() / this.map.getResolution();
+        var tileHeight = this.extent.getHeight() / this.map.getResolution();
+        this.tileSize = new OpenLayers.Size(tileWidth, tileHeight);
+    },
+
+    /** 
+     * Method: addTileMonitoringHooks
+     * 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: 
+     * tile - {<OpenLayers.Tile>}
+     */
+    addTileMonitoringHooks: function(tile) {
+        tile.onLoadStart = function() {
+            this.events.triggerEvent("loadstart");
+        };
+        tile.events.register("loadstart", this, tile.onLoadStart);
+      
+        tile.onLoadEnd = function() {
+            this.events.triggerEvent("loadend");
+        };
+        tile.events.register("loadend", this, tile.onLoadEnd);
+        tile.events.register("unload", this, tile.onLoadEnd);
+    },
+
+    /** 
+     * Method: removeTileMonitoringHooks
+     * This function takes a tile as input and removes the tile hooks 
+     *     that were added in <addTileMonitoringHooks>.
+     * 
+     * Parameters: 
+     * tile - {<OpenLayers.Tile>}
+     */
+    removeTileMonitoringHooks: function(tile) {
+        tile.unload();
+        tile.events.un({
+            "loadstart": tile.onLoadStart,
+            "loadend": tile.onLoadEnd,
+            "unload": tile.onLoadEnd,
+            scope: this
+        });
+    },
+    
+    /**
+     * APIMethod: setUrl
+     * 
+     * Parameters:
+     * newUrl - {String}
+     */
+    setUrl: function(newUrl) {
+        this.url = newUrl;
+        this.tile.draw();
+    },
+
+    /** 
+     * APIMethod: getURL
+     * The url we return is always the same (the image itself never changes)
+     *     so we can ignore the bounds parameter (it will always be the same, 
+     *     anyways) 
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     */
+    getURL: function(bounds) {
+        return this.url;
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.Image"
+});
diff --git a/lib/OpenLayers/Layer/KaMap.js b/lib/OpenLayers/Layer/KaMap.js
new file mode 100644
index 0000000..9a63942
--- /dev/null
+++ b/lib/OpenLayers/Layer/KaMap.js
@@ -0,0 +1,206 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.KaMap
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.KaMap = OpenLayers.Class(OpenLayers.Layer.Grid, {
+
+    /** 
+     * APIProperty: isBaseLayer
+     * {Boolean} KaMap Layer is always a base layer 
+     */    
+    isBaseLayer: true,
+
+    /**
+     * APIProperty: units
+     * {?}
+     */    
+    units: null,
+
+    /**
+     * APIProperty: resolution
+     * {Float}
+     */
+    resolution: OpenLayers.DOTS_PER_INCH,
+    
+    /**
+     * Constant: DEFAULT_PARAMS
+     * {Object} parameters set by default. The default parameters set 
+     * the format via the 'i' parameter to 'jpeg'.    
+     */
+    DEFAULT_PARAMS: {
+        i: 'jpeg',
+        map: ''
+    },
+        
+    /**
+     * Constructor: OpenLayers.Layer.KaMap
+     * 
+     * Parameters:
+     * name - {String}
+     * url - {String}
+     * params - {Object} Parameters to be sent to the HTTP server in the
+     *    query string for the tile. The format can be set via the 'i'
+     *    parameter (defaults to jpg) , and the map should be set via 
+     *    the 'map' parameter. It has been reported that ka-Map may behave
+     *    inconsistently if your format parameter does not match the format
+     *    parameter configured in your config.php. (See ticket #327 for more
+     *    information.)
+     * options - {Object} Additional options for the layer. Any of the 
+     *     APIProperties listed on this layer, and any layer types it
+     *     extends, can be overridden through the options parameter. 
+     */
+    initialize: function(name, url, params, options) {
+        var newArguments = [];
+        newArguments.push(name, url, params, options);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
+        this.params = OpenLayers.Util.applyDefaults(
+            this.params, this.DEFAULT_PARAMS
+        );
+    },
+
+    /**
+     * Method: getURL
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} 
+     * 
+     * Returns:
+     * {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);
+        var mapRes = this.map.getResolution();
+        var scale = Math.round((this.map.getScale() * 10000)) / 10000;
+        var pX = Math.round(bounds.left / mapRes);
+        var pY = -Math.round(bounds.top / mapRes);
+        return this.getFullRequestString(
+                      { t: pY, 
+                        l: pX,
+                        s: scale
+                      });
+    },
+
+    /**
+     * Method: addTile
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     * position - {<OpenLayers.Pixel>}
+     * 
+     * Returns:
+     * {<OpenLayers.Tile.Image>}
+     */    
+    addTile:function(bounds,position) {
+        var url = this.getURL(bounds);
+        return new OpenLayers.Tile.Image(this, position, bounds, 
+                                             url, this.tileSize);
+    },
+
+    /** 
+     * Method: calculateGridLayout
+     * ka-Map uses the center point of the map as an origin for 
+     * its tiles. Override calculateGridLayout to center tiles 
+     * correctly for this case.
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bound>}
+     * extent - {<OpenLayers.Bounds>}
+     * resolution - {Number}
+     *
+     * Returns:
+     * Object containing properties tilelon, tilelat, tileoffsetlat,
+     * tileoffsetlat, tileoffsetx, tileoffsety
+     */
+    calculateGridLayout: function(bounds, extent, resolution) {
+        var tilelon = resolution*this.tileSize.w;
+        var tilelat = resolution*this.tileSize.h;
+        
+        var offsetlon = bounds.left;
+        var tilecol = Math.floor(offsetlon/tilelon) - this.buffer;
+        var tilecolremain = offsetlon/tilelon - tilecol;
+        var tileoffsetx = -tilecolremain * this.tileSize.w;
+        var tileoffsetlon = tilecol * tilelon;
+        
+        var offsetlat = bounds.top;  
+        var tilerow = Math.ceil(offsetlat/tilelat) + this.buffer;
+        var tilerowremain = tilerow - offsetlat/tilelat;
+        var tileoffsety = -(tilerowremain+1) * this.tileSize.h;
+        var tileoffsetlat = tilerow * tilelat;
+        
+        return { 
+          tilelon: tilelon, tilelat: tilelat,
+          tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat,
+          tileoffsetx: tileoffsetx, tileoffsety: tileoffsety
+        };
+    },    
+
+    /**
+     * APIMethod: clone
+     * 
+     * Parameters: 
+     * obj - {Object}
+     * 
+     * Returns:
+     * {<OpenLayers.Layer.Kamap>} An exact clone of this OpenLayers.Layer.KaMap
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.KaMap(this.name,
+                                            this.url,
+                                            this.params,
+                                            this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+        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;
+    },    
+    
+    /**
+     * APIMethod: getTileBounds
+     * Returns The tile bounds for a layer given a pixel location.
+     *
+     * Parameters:
+     * viewPortPx - {<OpenLayers.Pixel>} The location in the viewport.
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>} Bounds of the tile at the given pixel location.
+     */
+    getTileBounds: function(viewPortPx) {
+        var resolution = this.getResolution();
+        var tileMapWidth = resolution * this.tileSize.w;
+        var tileMapHeight = resolution * this.tileSize.h;
+        var mapPoint = this.getLonLatFromViewPortPx(viewPortPx);
+        var tileLeft = tileMapWidth * Math.floor(mapPoint.lon / tileMapWidth);
+        var tileBottom = tileMapHeight * Math.floor(mapPoint.lat / tileMapHeight);
+        return new OpenLayers.Bounds(tileLeft, tileBottom,
+                                     tileLeft + tileMapWidth,
+                                     tileBottom + tileMapHeight);
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.KaMap"
+});
diff --git a/lib/OpenLayers/Layer/KaMapCache.js b/lib/OpenLayers/Layer/KaMapCache.js
new file mode 100644
index 0000000..b4ac08f
--- /dev/null
+++ b/lib/OpenLayers/Layer/KaMapCache.js
@@ -0,0 +1,148 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ * @requires OpenLayers/Layer/KaMap.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.KaMapCache
+ * 
+ * This class is designed to talk directly to a web-accessible ka-Map
+ * cache generated by the precache2.php script.
+ * 
+ * To create a a new KaMapCache layer, you must indicate also the "i" parameter
+ * (that will be used to calculate the file extension), and another special
+ * parameter, object names "metaTileSize", with "h" (height) and "w" (width)
+ * properties.
+ * 
+ *     // Create a new kaMapCache layer. 
+ *     var kamap_base = new OpenLayers.Layer.KaMapCache(
+ *         "Satellite",
+ *         "http://www.example.org/web/acessible/cache",
+ *         {g: "satellite", map: "world", i: 'png24', metaTileSize: {w: 5, h: 5} }
+ *       );
+ *    
+ *     // Create an kaMapCache overlay layer (using "isBaseLayer: false"). 
+ *     // Forces the output to be a "gif", using the "i" parameter.
+ *     var kamap_overlay = new OpenLayers.Layer.KaMapCache(
+ *         "Streets",
+ *         "http://www.example.org/web/acessible/cache",
+ *         {g: "streets", map: "world", i: "gif", metaTileSize: {w: 5, h: 5} },
+ *         {isBaseLayer: false}
+ *       );
+ *
+ * The cache URLs must look like: 
+ *   var/cache/World/50000/Group_Name/def/t-440320/l20480
+ * 
+ * This means that the cache generated via tile.php will *not* work with
+ *     this class, and should instead use the KaMap layer.
+ *
+ * More information is available in Ticket #1518.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.KaMap>
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.KaMapCache = OpenLayers.Class(OpenLayers.Layer.KaMap, {
+
+    /**
+     * Constant: IMAGE_EXTENSIONS
+     * {Object} Simple hash map to convert format to extension.
+     */
+    IMAGE_EXTENSIONS: {
+        'jpeg': 'jpg',
+        'gif' : 'gif',
+        'png' : 'png',
+        'png8' : 'png',
+        'png24' : 'png',
+        'dithered' : 'png'
+    },
+    
+    /**
+     * Constant: DEFAULT_FORMAT
+     * {Object} Simple hash map to convert format to extension.
+     */
+    DEFAULT_FORMAT: 'jpeg',
+    
+    /**
+     * Constructor: OpenLayers.Layer.KaMapCache
+     * 
+     * Parameters:
+     * name - {String}
+     * url - {String}
+     * params - {Object} Parameters to be sent to the HTTP server in the
+     *    query string for the tile. The format can be set via the 'i'
+     *    parameter (defaults to jpg) , and the map should be set via 
+     *    the 'map' parameter. It has been reported that ka-Map may behave
+     *    inconsistently if your format parameter does not match the format
+     *    parameter configured in your config.php. (See ticket #327 for more
+     *    information.)
+     * options - {Object} Additional options for the layer. Any of the 
+     *     APIProperties listed on this layer, and any layer types it
+     *     extends, can be overridden through the options parameter. 
+     */
+    initialize: function(name, url, params, options) {
+        OpenLayers.Layer.KaMap.prototype.initialize.apply(this, arguments);
+        this.extension = this.IMAGE_EXTENSIONS[this.params.i.toLowerCase() || DEFAULT_FORMAT];
+    },
+
+    /**
+     * Method: getURL
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} 
+     * 
+     * Returns:
+     * {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);
+        var mapRes = this.map.getResolution();
+        var scale = Math.round((this.map.getScale() * 10000)) / 10000;
+        var pX = Math.round(bounds.left / mapRes);
+        var pY = -Math.round(bounds.top / mapRes);
+
+        var metaX = Math.floor(pX / this.tileSize.w / this.params.metaTileSize.w) * this.tileSize.w * this.params.metaTileSize.w;
+        var metaY = Math.floor(pY / this.tileSize.h / this.params.metaTileSize.h) * this.tileSize.h * this.params.metaTileSize.h;
+
+        // 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.
+        //
+        var url = this.url;
+        if (url instanceof Array) {
+            url = this.selectUrl(paramsString, url);
+        }  
+    
+        var components = [
+            url,
+            "/",
+            this.params.map,
+            "/",
+            scale,
+            "/",
+            this.params.g.replace(/\s/g, '_'),
+            "/def/t", 
+            metaY,
+            "/l",
+            metaX,
+            "/t",
+            pY,
+            "l",
+            pX,
+            ".",
+            this.extension
+          ];
+          
+        return components.join("");
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.KaMapCache"
+});
diff --git a/lib/OpenLayers/Layer/MapGuide.js b/lib/OpenLayers/Layer/MapGuide.js
new file mode 100644
index 0000000..52392b0
--- /dev/null
+++ b/lib/OpenLayers/Layer/MapGuide.js
@@ -0,0 +1,489 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Request/XMLHttpRequest.js
+ * @requires OpenLayers/Layer/Grid.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.MapGuide
+ * Instances of OpenLayers.Layer.MapGuide are used to display
+ * data from a MapGuide OS instance.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+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 
+     **/
+    useHttpTile: false,
+    
+    /** 
+     * APIProperty: singleTile
+     * {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 
+     * 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 
+     * 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 
+     * 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
+     */
+    TILE_PARAMS: {
+         operation: 'GETTILEIMAGE',
+         version: '1.2.0'
+    },
+
+    /**
+     * Constant: SINGLE_TILE_PARAMS
+     * {Object} Hashtable of default parameter key/value pairs for untiled layer
+     */
+    SINGLE_TILE_PARAMS: {
+        operation: 'GETMAPIMAGE',
+        format: 'PNG',
+        locale: 'en',
+        clip: '1',
+        version: '1.0.0'
+    },
+    
+    /**
+     * Constant: OVERLAY_PARAMS
+     * {Object} Hashtable of default parameter key/value pairs for untiled layer
+     */
+    OVERLAY_PARAMS: {
+        operation: 'GETDYNAMICMAPOVERLAYIMAGE',
+        format: 'PNG',
+        locale: 'en',
+        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 
+     * serverconfig.ini section [TileServiceProperties]
+     */
+    FOLDER_PARAMS: {
+        tileColumnsPerFolder: 30,
+        tileRowsPerFolder: 30,
+        format: 'png',
+        querystring: null
+    },	
+
+    /** 
+     * Property: defaultSize
+     * {<OpenLayers.Size>} Tile size as produced by MapGuide server
+     **/
+    defaultSize: new OpenLayers.Size(300,300),
+
+    /**
+     * Constructor: OpenLayers.Layer.MapGuide
+     * Create a new Mapguide layer, either tiled or untiled.  
+     *
+     * 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'.  
+     *
+     * 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.  
+     * See the MapGuide example for how to set these values for MGOS.
+     *
+     * Parameters:
+     * name - {String} Name of the layer displayed in the interface
+     * url - {String} Location of the MapGuide mapagent executable
+     *            (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: 
+     *   - mapDefinition - {String} The MapGuide resource definition
+     *            (e.g. Library://Samples/Gmap/Maps/gmapTiled.MapDefinition)
+     *   - 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 
+     *            (for untiled overlays layers only)
+     *   - basemaplayergroupname - {String} GroupName for tiled MapGuide layers only
+     *   - format - Image format to be returned (for untiled overlay layers only)
+     *   - showLayers - {String} A comma separated list of GUID's for the
+     *       layers to display eg: 'cvc-xcv34,453-345-345sdf'.
+     *   - hideLayers - {String} A comma separated list of GUID's for the
+     *       layers to hide eg: 'cvc-xcv34,453-345-345sdf'.
+     *   - showGroups - {String} A comma separated list of GUID's for the
+     *       groups to display eg: 'cvc-xcv34,453-345-345sdf'.
+     *   - hideGroups - {String} A comma separated list of GUID's for the
+     *       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; 
+     *          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, 
+        // it will be an overlay
+        if (options == null || options.isBaseLayer == null) {
+            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) {
+            OpenLayers.Util.applyDefaults(
+                           this.params,
+                           this.OVERLAY_PARAMS
+                           );
+            if (!this.useAsyncOverlay) {
+              this.params.version = "1.0.0";
+            }
+          } else {
+            OpenLayers.Util.applyDefaults(
+                           this.params,
+                           this.SINGLE_TILE_PARAMS
+                           );
+          }         
+        } else {
+            //initialize for tiled layers
+            if (this.useHttpTile) {
+                OpenLayers.Util.applyDefaults(
+                               this.params,
+                               this.FOLDER_PARAMS
+                               );
+            } else {
+                OpenLayers.Util.applyDefaults(
+                               this.params,
+                               this.TILE_PARAMS
+                               );
+            }
+            this.setTileSize(this.defaultSize); 
+        }
+    },
+
+    /**
+     * Method: clone
+     * Create a clone of this layer
+     *
+     * Returns:
+     * {<OpenLayers.Layer.MapGuide>} An exact clone of this layer
+     */
+    clone: function (obj) {
+      if (obj == null) {
+            obj = new OpenLayers.Layer.MapGuide(this.name,
+                                           this.url,
+                                           this.params,
+                                           this.getOptions());
+      }
+      //get all additions from superclasses
+      obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+      return obj;
+    },
+
+    /**
+     * Method: 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, 
+                                         null, this.tileSize);
+    },
+
+    /**
+     * Method: getURL
+     * Return a query string for this layer
+     *
+     * Parameters:
+     * 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 
+     *          as parameters.
+     */
+    getURL: function (bounds) {
+        var url;
+        var center = bounds.getCenterLonLat();
+        var mapSize = this.map.getSize();
+
+        if (this.singleTile) {
+          //set up the call for GETMAPIMAGE or GETDYNAMICMAPOVERLAY with
+          //dynamic map parameters
+          var params = {
+            setdisplaydpi: OpenLayers.DOTS_PER_INCH,
+            setdisplayheight: mapSize.h*this.ratio,
+            setdisplaywidth: mapSize.w*this.ratio,
+            setviewcenterx: center.lon,
+            setviewcentery: center.lat,
+            setviewscale: this.map.getScale()
+          };
+          
+          if (this.useOverlay && !this.useAsyncOverlay) {
+            //first we need to call GETVISIBLEMAPEXTENT to set the extent
+            var getVisParams = {};
+            getVisParams = OpenLayers.Util.extend(getVisParams, params);
+            getVisParams.operation = "GETVISIBLEMAPEXTENT";
+            getVisParams.version = "1.0.0";
+            getVisParams.session = this.params.session;
+            getVisParams.mapName = this.params.mapName;
+            getVisParams.format = 'text/xml';
+            url = this.getFullRequestString( getVisParams );
+            
+            OpenLayers.Request.GET({url: url, async: false});
+          }
+          //construct the full URL
+          url = this.getFullRequestString( params );
+        } else {
+
+          //tiled version
+          var currentRes = this.map.getResolution();
+          var colidx = Math.floor((bounds.left-this.maxExtent.left)/currentRes);
+          colidx = Math.round(colidx/this.tileSize.w);
+          var rowidx = Math.floor((this.maxExtent.top-bounds.top)/currentRes);
+          rowidx = Math.round(rowidx/this.tileSize.h);
+
+          if (this.useHttpTile){
+	          url = this.getImageFilePath(
+                   {
+                       tilecol: colidx,
+                       tilerow: rowidx,
+                       scaleindex: this.resolutions.length - this.map.zoom - 1
+                    });
+		  
+          } else {
+            url = this.getFullRequestString(
+                   {
+                       tilecol: colidx,
+                       tilerow: rowidx,
+                       scaleindex: this.resolutions.length - this.map.zoom - 1
+                    });
+          }
+       }
+       return url;
+    },
+
+    /**
+     * Method: getFullRequestString
+     * getFullRequestString on MapGuide layers is special, because we 
+     * do a regular expression replace on ',' in parameters to '+'.
+     * This is why it is subclassed here.
+     *
+     * Parameters:
+     * altUrl - {String} Alternative base URL to use.
+     *
+     * Returns:
+     * {String} A string with the layer's url appropriately encoded for MapGuide
+     */
+    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, 
+        //  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;        
+
+        // 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);
+        // ignore parameters that are already in the url search string
+        var urlParams = OpenLayers.Util.upperCaseObject(
+                            OpenLayers.Util.getParameters(url));
+        for(var key in allParams) {
+            if(key.toUpperCase() in urlParams) {
+                delete allParams[key];
+            }
+        }
+        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
+           leave ',' only in the case of list items (since otherwise it is
+           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 == "?")) {
+                requestString += paramsString;
+            } else {
+                if (url.indexOf('?') == -1) {
+                    //serverPath has no ? -- add one
+                    requestString += '?' + paramsString;
+                } else {
+                    //serverPath contains ?, so must already have paramsString at the end
+                    requestString += '&' + paramsString;
+                }
+            }
+        }
+        return requestString;
+    },
+
+     /** 
+     * Method: getImageFilePath
+     * special handler to request mapguide tiles from an http exposed tilecache 
+     *
+     * Parameters:
+     * altUrl - {String} Alternative base URL to use.
+     *
+     * Returns:
+     * {String} A string with the url for the tile image
+     */
+    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, 
+        //  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 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) 
+                + '.' + this.params.format;
+    
+        if (this.params.querystring) {
+               tilePath += "?" + this.params.querystring;
+        }
+        
+        requestString += tilePath;
+        return requestString;
+    },
+    
+    /** 
+     * Method: calculateGridLayout
+     * Generate parameters for the grid layout. This  
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bound>}
+     * extent - {<OpenLayers.Bounds>}
+     * resolution - {Number}
+     *
+     * Returns:
+     * Object containing properties tilelon, tilelat, tileoffsetlat,
+     * tileoffsetlat, tileoffsetx, tileoffsety
+     */
+    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 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 { 
+          tilelon: tilelon, tilelat: tilelat,
+          tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat,
+          tileoffsetx: tileoffsetx, tileoffsety: tileoffsety
+        };
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.MapGuide"
+});
diff --git a/lib/OpenLayers/Layer/MapServer.js b/lib/OpenLayers/Layer/MapServer.js
new file mode 100644
index 0000000..6e93d3a
--- /dev/null
+++ b/lib/OpenLayers/Layer/MapServer.js
@@ -0,0 +1,199 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.MapServer
+ * Instances of OpenLayers.Layer.MapServer are used to display
+ * data from a MapServer CGI instance.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.MapServer = OpenLayers.Class(OpenLayers.Layer.Grid, {
+
+    /**
+     * Constant: DEFAULT_PARAMS
+     * {Object} Hashtable of default parameter key/value pairs 
+     */
+    DEFAULT_PARAMS: {
+        mode: "map",
+        map_imagetype: "png"
+    },
+
+    /**
+     * Constructor: OpenLayers.Layer.MapServer
+     * Create a new MapServer layer object
+     *
+     * Parameters:
+     * name - {String} A name for the layer
+     * url - {String} Base url for the MapServer CGI
+     *       (e.g. http://www2.dmsolutions.ca/cgi-bin/mapserv)
+     * params - {Object} An object with key/value pairs representing the
+     *          GetMap query string parameters and parameter values.
+     * options - {Ojbect} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, params, options) {
+        var newArguments = [];
+        newArguments.push(name, url, params, options);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
+
+        this.params = OpenLayers.Util.applyDefaults(
+            this.params, this.DEFAULT_PARAMS
+        );
+
+        // 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.params.transparent != true));
+        }
+    },
+
+    /**
+     * Method: clone
+     * Create a clone of this layer
+     *
+     * Returns:
+     * {<OpenLayers.Layer.MapServer>} An exact clone of this layer
+     */
+    clone: function (obj) {
+        if (obj == null) {
+            obj = new OpenLayers.Layer.MapServer(this.name,
+                                           this.url,
+                                           this.params,
+                                           this.getOptions());
+        }
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    },
+
+    /**
+     * Method: 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, 
+                                         null, this.tileSize);
+    },
+    
+    /**
+     * Method: getURL
+     * Return a query string for this layer
+     *
+     * Parameters:
+     * 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 
+     *          as parameters.
+     */
+    getURL: function (bounds) {
+        bounds = this.adjustBounds(bounds);
+        // 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 url = this.getFullRequestString(
+                     {mapext:   extent,
+                      imgext:   extent,
+                      map_size: [imageSize.w, imageSize.h],
+                      imgx:     imageSize.w / 2,
+                      imgy:     imageSize.h / 2,
+                      imgxy:    [imageSize.w, imageSize.h]
+                      });
+        
+        return url;
+    },
+    
+    /** 
+     * Method: getFullRequestString
+     * combine the layer's url with its params and these newParams. 
+     *   
+     * Parameter:
+     * newParams - {Object} New parameters that should be added to the 
+     *                      request string.
+     * altUrl - {String} (optional) Replace the URL in the full request  
+     *                              string with the provided URL.
+     * 
+     * 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 
+        // 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 
+        // 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));
+        for(var key in allParams) {
+            if(key.toUpperCase() in urlParams) {
+                delete allParams[key];
+            }
+        }
+        paramsString = OpenLayers.Util.getParameterString(allParams);
+        
+        // requestString always starts with url
+        var requestString = url;        
+
+        // MapServer 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
+        //  leave ',' only in the case of list items (since otherwise it is
+        //  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 == "?")) {
+                requestString += paramsString;
+            } else {
+                if (url.indexOf('?') == -1) {
+                    //serverPath has no ? -- add one
+                    requestString += '?' + paramsString;
+                } else {
+                    //serverPath contains ?, so must already have paramsString at the end
+                    requestString += '&' + paramsString;
+                }
+            }
+        }
+        return requestString;
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.MapServer"
+});
diff --git a/lib/OpenLayers/Layer/MapServer/Untiled.js b/lib/OpenLayers/Layer/MapServer/Untiled.js
new file mode 100644
index 0000000..1967eb6
--- /dev/null
+++ b/lib/OpenLayers/Layer/MapServer/Untiled.js
@@ -0,0 +1,72 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+ 
+/**
+ * @requires OpenLayers/Layer/MapServer.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.MapServer.Untiled
+ * *Deprecated*.  To be removed in 3.0.  Instead use OpenLayers.Layer.MapServer
+ *     and pass the option 'singleTile' as true.
+ * 
+ * Inherits from: 
+ *  - <OpenLayers.Layer.MapServer>
+ */
+OpenLayers.Layer.MapServer.Untiled = OpenLayers.Class(OpenLayers.Layer.MapServer, {
+
+    /**
+     * APIProperty: singleTile
+     * {singleTile} Always true for untiled.
+     */
+    singleTile: true,
+
+    /**
+     * Constructor: OpenLayers.Layer.MapServer.Untiled
+     *
+     * Parameters:
+     * name - {String} 
+     * url - {String} 
+     * params - {Object} 
+     * options - {Object} 
+     */
+    initialize: function(name, url, params, options) {
+        OpenLayers.Layer.MapServer.prototype.initialize.apply(this, arguments);
+        
+        var msg = "The OpenLayers.Layer.MapServer.Untiled class is deprecated and " +
+                  "will be removed in 3.0. Instead, you should use the " +
+                  "normal OpenLayers.Layer.MapServer class, passing it the option " +
+                  "'singleTile' as true.";
+        OpenLayers.Console.warn(msg);
+    },    
+
+    /**
+     * Method: clone
+     * Create a clone of this layer
+     *
+     * Returns:
+     * {<OpenLayers.Layer.MapServer.Untiled>} An exact clone of this layer
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.MapServer.Untiled(this.name,
+                                                         this.url,
+                                                         this.params,
+                                                         this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.MapServer.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+        
+        return obj;
+    }, 
+
+    CLASS_NAME: "OpenLayers.Layer.MapServer.Untiled"
+});
diff --git a/lib/OpenLayers/Layer/Markers.js b/lib/OpenLayers/Layer/Markers.js
new file mode 100644
index 0000000..1efed48
--- /dev/null
+++ b/lib/OpenLayers/Layer/Markers.js
@@ -0,0 +1,187 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.Markers
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer> 
+ */
+OpenLayers.Layer.Markers = OpenLayers.Class(OpenLayers.Layer, {
+    
+    /** 
+     * APIProperty: isBaseLayer 
+     * {Boolean} Markers layer is never a base layer.  
+     */
+    isBaseLayer: false,
+    
+    /** 
+     * APIProperty: markers 
+     * {Array(<OpenLayers.Marker>)} internal marker list 
+     */
+    markers: null,
+
+
+    /** 
+     * 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 
+     * Create a Markers layer.
+     *
+     * Parameters:
+     * 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 
+     */
+    destroy: function() {
+        this.clearMarkers();
+        this.markers = null;
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: setOpacity
+     * Sets the opacity for all the markers.
+     * 
+     * Parameter:
+     * opacity - {Float}
+     */
+    setOpacity: function(opacity) {
+        if (opacity != this.opacity) {
+            this.opacity = opacity;
+            for (var i=0, len=this.markers.length; i<len; i++) {
+                this.markers[i].setOpacity(this.opacity);
+            }
+        }
+    },
+
+    /** 
+     * Method: moveTo
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} 
+     * zoomChanged - {Boolean} 
+     * dragging - {Boolean} 
+     */
+    moveTo:function(bounds, zoomChanged, dragging) {
+        OpenLayers.Layer.prototype.moveTo.apply(this, arguments);
+
+        if (zoomChanged || !this.drawn) {
+            for(var i=0, len=this.markers.length; i<len; i++) {
+                this.drawMarker(this.markers[i]);
+            }
+            this.drawn = true;
+        }
+    },
+
+    /**
+     * APIMethod: addMarker
+     *
+     * Parameters:
+     * marker - {<OpenLayers.Marker>} 
+     */
+    addMarker: function(marker) {
+        this.markers.push(marker);
+
+        if (this.opacity != null) {
+            marker.setOpacity(this.opacity);
+        }
+
+        if (this.map && this.map.getExtent()) {
+            marker.map = this.map;
+            this.drawMarker(marker);
+        }
+    },
+
+    /**
+     * APIMethod: removeMarker
+     *
+     * Parameters:
+     * marker - {<OpenLayers.Marker>} 
+     */
+    removeMarker: function(marker) {
+        if (this.markers && this.markers.length) {
+            OpenLayers.Util.removeItem(this.markers, marker);
+            marker.erase();
+        }
+    },
+
+    /**
+     * Method: clearMarkers
+     * This method removes all markers from a layer. The markers are not
+     * destroyed by this function, but are removed from the list of markers.
+     */
+    clearMarkers: function() {
+        if (this.markers != null) {
+            while(this.markers.length > 0) {
+                this.removeMarker(this.markers[0]);
+            }
+        }
+    },
+
+    /** 
+     * Method: drawMarker
+     * Calculate the pixel location for the marker, create it, and 
+     *    add it to the layer's div
+     *
+     * Parameters:
+     * marker - {<OpenLayers.Marker>} 
+     */
+    drawMarker: function(marker) {
+        var px = this.map.getLayerPxFromLonLat(marker.lonlat);
+        if (px == null) {
+            marker.display(false);
+        } else {
+            if (!marker.isDrawn()) {
+                var markerImg = marker.draw(px);
+                this.div.appendChild(markerImg);
+            } else if(marker.icon) {
+                marker.icon.moveTo(px);
+            }
+        }
+    },
+    
+    /** 
+     * 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++) {
+                var marker = this.markers[i];
+                maxExtent.extend(marker.lonlat);
+            }
+        }
+
+        return maxExtent;
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.Markers"
+});
diff --git a/lib/OpenLayers/Layer/MultiMap.js b/lib/OpenLayers/Layer/MultiMap.js
new file mode 100644
index 0000000..e390e78
--- /dev/null
+++ b/lib/OpenLayers/Layer/MultiMap.js
@@ -0,0 +1,284 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/EventPane.js
+ * @requires OpenLayers/Layer/FixedZoomLevels.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.MultiMap
+ * Note that MultiMap does not fully support the sphericalMercator
+ * option. See Ticket #953 for more details.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.EventPane>
+ *  - <OpenLayers.Layer.FixedZoomLevels>
+ */
+OpenLayers.Layer.MultiMap = OpenLayers.Class(
+  OpenLayers.Layer.EventPane, OpenLayers.Layer.FixedZoomLevels, {
+    
+    /** 
+     * Constant: MIN_ZOOM_LEVEL
+     * {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: [
+        9, 
+        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.00004291534423828125
+    ],
+
+    /**
+     * APIProperty: type
+     * {?}
+     */
+    type: null,
+
+    /** 
+     * Constructor: OpenLayers.Layer.MultiMap
+     * 
+     * Parameters:
+     * name - {String}
+     * options - {Object}
+     */
+    initialize: function(name, options) {
+        OpenLayers.Layer.EventPane.prototype.initialize.apply(this, arguments);
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize.apply(this, 
+                                                                    arguments);
+        if (this.sphericalMercator) {
+            OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
+            this.initMercatorParameters();
+            this.RESOLUTIONS.unshift(10); 
+        }    
+    },
+    
+    /**
+     * Method: loadMapObject
+     */
+    loadMapObject:function() {
+        try { //crash proofing
+            this.mapObject = new MultimapViewer(this.div);
+        } catch (e) { }
+    },
+
+    /** 
+     * APIMethod: getWarningHTML
+     * 
+     * Returns: 
+     * {String} String with information on why layer is broken, how to get
+     *          it working.
+     */
+    getWarningHTML:function() {
+        return OpenLayers.i18n(
+            "getLayerWarning", {'layerType':"MM", 'layerLib':"MultiMap"}
+        );
+    },
+
+
+
+    /************************************
+     *                                  *
+     *   MapObject Interface Controls   *
+     *                                  *
+     ************************************/
+
+
+  // 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.goToPosition(center, zoom); 
+    },
+   
+    /**
+     * APIMethod: getMapObjectCenter
+     * 
+     * Returns: 
+     * {Object} The mapObject's current center in Map Object format
+     */
+    getMapObjectCenter: function() {
+        return this.mapObject.getCurrentPosition();
+    },
+
+    /** 
+     * APIMethod: getMapObjectZoom
+     * 
+     * Returns:
+     * {Integer} The mapObject's current zoom, in Map Object format
+     */
+    getMapObjectZoom: function() {
+        return this.mapObject.getZoomFactor();
+    },
+
+
+  // LonLat - Pixel Translation
+  
+    /**
+     * APIMethod: getMapObjectLonLatFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Object} MapObject LonLat translated from MapObject Pixel
+     */
+    getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
+        moPixel.x = moPixel.x - (this.map.getSize().w/2);
+        moPixel.y = moPixel.y - (this.map.getSize().h/2);
+        return this.mapObject.getMapPositionAt(moPixel);
+    },
+
+    /**
+     * APIMethod: getMapObjectPixelFromMapObjectLonLat
+     * 
+     * Parameters:
+     * moLonLat - {Object} MapObject LonLat format
+     * 
+     * Returns:
+     * {Object} MapObject Pixel transtlated from MapObject LonLat
+     */
+    getMapObjectPixelFromMapObjectLonLat: function(moLonLat) {
+        return this.mapObject.geoPosToContainerPixels(moLonLat);
+    },
+
+
+    /************************************
+     *                                  *
+     *       MapObject Primitives       *
+     *                                  *
+     ************************************/
+
+
+  // LonLat
+    
+    /**
+     * APIMethod: getLongitudeFromMapObjectLonLat
+     * 
+     * Parameters:
+     * moLonLat - {Object} MapObject LonLat format
+     * 
+     * Returns:
+     * {Float} Longitude of the given MapObject LonLat
+     */
+    getLongitudeFromMapObjectLonLat: function(moLonLat) {
+        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 ? 
+            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
+     */
+    getMapObjectLonLatFromLonLat: function(lon, lat) {
+        var mmLatLon;
+        if(this.sphericalMercator) {
+            var lonlat = this.inverseMercator(lon, lat);
+            mmLatLon = new MMLatLon(lonlat.lat, lonlat.lon);
+        } else {
+            mmLatLon = new MMLatLon(lat, lon);
+        }
+        return mmLatLon;
+    },
+
+  // Pixel
+    
+    /**
+     * APIMethod: getXFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Integer} X value of the MapObject Pixel
+     */
+    getXFromMapObjectPixel: function(moPixel) {
+        return moPixel.x;
+    },
+
+    /**
+     * APIMethod: getYFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Integer} Y value of the MapObject Pixel
+     */
+    getYFromMapObjectPixel: function(moPixel) {
+        return moPixel.y;
+    },
+
+    /**
+     * APIMethod: getMapObjectPixelFromXY
+     * 
+     * Parameters:
+     * x - {Integer}
+     * y - {Integer}
+     * 
+     * Returns:
+     * {Object} MapObject Pixel from x and y parameters
+     */
+    getMapObjectPixelFromXY: function(x, y) {
+        return new MMPoint(x, y);
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.MultiMap"
+});
diff --git a/lib/OpenLayers/Layer/PointTrack.js b/lib/OpenLayers/Layer/PointTrack.js
new file mode 100644
index 0000000..27607ca
--- /dev/null
+++ b/lib/OpenLayers/Layer/PointTrack.js
@@ -0,0 +1,103 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/Vector.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.PointTrack
+ * Vector layer to display ordered point features as a line, creating one
+ * LineString feature for each pair of two points.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Vector> 
+ */
+OpenLayers.Layer.PointTrack = OpenLayers.Class(OpenLayers.Layer.Vector, {
+  
+    /**
+     * APIProperty:
+     * dataFrom  - {<OpenLayers.Layer.PointTrack.dataFrom>} optional. If the
+     *             lines should get the data/attributes from one of the two
+     *             points, creating it, which one should it be?
+     */
+    dataFrom: null,
+    
+    /**
+     * Constructor: OpenLayers.PointTrack
+     * Constructor for a new OpenLayers.PointTrack instance.
+     *
+     * Parameters:
+     * name     - {String} name of the layer
+     * options  - {Object} Optional object with properties to tag onto the
+     *            instance.
+     */    
+    initialize: function(name, options) {
+        OpenLayers.Layer.Vector.prototype.initialize.apply(this, arguments);
+    },
+        
+    /**
+     * APIMethod: addNodes
+     * Adds point features that will be used to create lines from, using point
+     * pairs. The first point of a pair will be the source node, the second
+     * will be the target node.
+     * 
+     * Parameters:
+     * pointFeatures - {Array(<OpenLayers.Feature>)}
+     * 
+     */
+    addNodes: function(pointFeatures) {
+        if (pointFeatures.length < 2) {
+            OpenLayers.Console.error(
+                    "At least two point features have to be added to create" +
+                    "a line from");
+            return;
+        }
+        
+        var lines = new Array(pointFeatures.length-1);
+        
+        var pointFeature, startPoint, endPoint;
+        for(var i=0, len=pointFeatures.length; i<len; i++) {
+            pointFeature = pointFeatures[i];
+            endPoint = pointFeature.geometry;
+            
+            if (!endPoint) {
+              var lonlat = pointFeature.lonlat;
+              endPoint = new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat);
+            } else if(endPoint.CLASS_NAME != "OpenLayers.Geometry.Point") {
+                OpenLayers.Console.error(
+                        "Only features with point geometries are supported.");
+                return;
+            }
+            
+            if(i > 0) {
+                var attributes = (this.dataFrom != null) ?
+                        (pointFeatures[i+this.dataFrom].data ||
+                                pointFeatures[i+this.dataFrom].attributes) :
+                        null;
+                var line = new OpenLayers.Geometry.LineString([startPoint,
+                        endPoint]);
+                        
+                lines[i-1] = new OpenLayers.Feature.Vector(line, attributes);
+            }
+            
+            startPoint = endPoint;
+        }
+
+        this.addFeatures(lines);
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.PointTrack"
+});
+
+/**
+ * Constant: OpenLayers.Layer.PointTrack.dataFrom
+ * {Object} with the following keys
+ * - SOURCE_NODE: take data/attributes from the source node of the line
+ * - TARGET_NODE: take data/attributes from the target node of the line
+ */
+OpenLayers.Layer.PointTrack.dataFrom = {'SOURCE_NODE': -1, 'TARGET_NODE': 0};
+
diff --git a/lib/OpenLayers/Layer/SphericalMercator.js b/lib/OpenLayers/Layer/SphericalMercator.js
new file mode 100644
index 0000000..85418fe
--- /dev/null
+++ b/lib/OpenLayers/Layer/SphericalMercator.js
@@ -0,0 +1,196 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer.js
+ * @requires OpenLayers/Projection.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.SphericalMercator
+ * A mixin for layers that wraps up the pieces neccesary to have a coordinate
+ *     conversion for working with commercial APIs which use a spherical
+ *     mercator projection.  Using this layer as a base layer, additional
+ *     layers can be used as overlays if they are in the same projection.
+ *
+ * A layer is given properties of this object by setting the sphericalMercator
+ *     property to true.
+ *
+ * More projection information:
+ *  - http://spatialreference.org/ref/user/google-projection/
+ *
+ * Proj4 Text:
+ *     +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0
+ *     +k=1.0 +units=m +nadgrids=@null +no_defs
+ *
+ * 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], 
+ *     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], 
+ *     PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["x", EAST],
+ *     AXIS["y", NORTH], AUTHORITY["EPSG","900913"]]
+ */
+OpenLayers.Layer.SphericalMercator = {
+
+    /**
+     * Method: getExtent
+     * Get the map's extent.
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>} The map extent.
+     */
+    getExtent: function() {
+        var extent = null;
+        if (this.sphericalMercator) {
+            extent = this.map.calculateBounds();
+        } else {
+            extent = OpenLayers.Layer.FixedZoomLevels.prototype.getExtent.apply(this);
+        }
+        return extent;
+    },
+
+    /**
+     * Method: getLonLatFromViewPortPx
+     * Get a map location from a pixel location
+     * 
+     * Parameters:
+     * viewPortPx - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     *  {<OpenLayers.LonLat>} An OpenLayers.LonLat which is the passed-in view
+     *  port OpenLayers.Pixel, translated into lon/lat by map lib
+     *  If the map lib is not loaded or not centered, returns null
+     */
+    getLonLatFromViewPortPx: function (viewPortPx) {
+        return OpenLayers.Layer.prototype.getLonLatFromViewPortPx.apply(this, arguments);
+    },
+    
+    /**
+     * Method: getViewPortPxFromLonLat
+     * Get a pixel location from a map location
+     *
+     * Parameters:
+     * lonlat - {<OpenLayers.LonLat>}
+     *
+     * Returns:
+     * {<OpenLayers.Pixel>} An OpenLayers.Pixel which is the passed-in
+     * OpenLayers.LonLat, translated into view port pixels by map lib
+     * If map lib is not loaded or not centered, returns null
+     */
+    getViewPortPxFromLonLat: function (lonlat) {
+        return OpenLayers.Layer.prototype.getViewPortPxFromLonLat.apply(this, arguments);
+    },
+
+    /** 
+     * Method: initMercatorParameters 
+     * Set up the mercator parameters on the layer: resolutions,
+     *     projection, units.
+     */
+    initMercatorParameters: function() {
+        // set up properties for Mercator - assume EPSG:900913
+        this.RESOLUTIONS = [];
+        var maxResolution = 156543.0339;
+        for(var zoom=0; zoom<=this.MAX_ZOOM_LEVEL; ++zoom) {
+            this.RESOLUTIONS[zoom] = maxResolution / Math.pow(2, zoom);
+        }
+        this.units = "m";
+        this.projection = this.projection || "EPSG:900913";
+    },
+
+    /**
+     * APIMethod: forwardMercator
+     * Given a lon,lat in EPSG:4326, return a point in Spherical Mercator.
+     *
+     * Parameters:
+     * lon - {float} 
+     * lat - {float}
+     * 
+     * Returns:
+     * {<OpenLayers.LonLat>} The coordinates transformed to Mercator.
+     */
+    forwardMercator: function(lon, lat) {
+        var x = lon * 20037508.34 / 180;
+        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);
+    },
+
+    /**
+     * APIMethod: inverseMercator
+     * Given a x,y in Spherical Mercator, return a point in EPSG:4326.
+     *
+     * 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.
+     */
+    inverseMercator: function(x, y) {
+
+        var lon = (x / 20037508.34) * 180;
+        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 
+     * 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. 
+     * 
+     * Returns:
+     * {Object} The point, with the x and y properties transformed to spherical
+     * mercator.
+     */
+    projectForward: function(point) {
+        var lonlat = OpenLayers.Layer.SphericalMercator.forwardMercator(point.x, point.y);
+        point.x = lonlat.lon;
+        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. 
+     * 
+     * Returns:
+     * {Object} The point, with the x and y properties transformed from
+     * spherical mercator to unprojected coordinates..
+     */
+    projectInverse: function(point) {
+        var lonlat = OpenLayers.Layer.SphericalMercator.inverseMercator(point.x, point.y);
+        point.x = lonlat.lon;
+        point.y = lonlat.lat;
+        return point;
+    }
+
+};
+
+/**
+ * Note: Two transforms declared
+ * Transforms from EPSG:4326 to EPSG:900913 and from EPSG:900913 to EPSG:4326
+ *     are set by this class.
+ */
+OpenLayers.Projection.addTransform("EPSG:4326", "EPSG:900913",
+    OpenLayers.Layer.SphericalMercator.projectForward);
+OpenLayers.Projection.addTransform("EPSG:900913", "EPSG:4326",
+    OpenLayers.Layer.SphericalMercator.projectInverse);
diff --git a/lib/OpenLayers/Layer/TMS.js b/lib/OpenLayers/Layer/TMS.js
new file mode 100644
index 0000000..3314c31
--- /dev/null
+++ b/lib/OpenLayers/Layer/TMS.js
@@ -0,0 +1,167 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ * @requires OpenLayers/Tile/Image.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.TMS
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.TMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+
+    /**
+     * APIProperty: serviceVersion
+     * {String}
+     */
+    serviceVersion: "1.0.0",
+
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean}
+     */
+    isBaseLayer: true,
+
+    /**
+     * APIProperty: tileOrigin
+     * {<OpenLayers.Pixel>}
+     */
+    tileOrigin: null,
+
+    /**
+     * APIProperty: serverResolutions
+     * {Array} A list of all resolutions available on the server.  Only set this 
+     *     property if the map resolutions differs from the server.
+     */
+    serverResolutions: null,
+
+    /**
+     * APIProperty: zoomOffset
+     * {Number} If your cache has more zoom levels than you want to provide
+     *     access to with this layer, supply a zoomOffset.  This zoom offset
+     *     is added to the current map zoom level to determine the level
+     *     for a requested tile.  For example, if you supply a zoomOffset
+     *     of 3, when the map is at the zoom 0, tiles will be requested from
+     *     level 3 of your cache.  Default is 0 (assumes cache level and map
+     *     zoom are equivalent).  Using <zoomOffset> is an alternative to
+     *     setting <serverResolutions> if you only want to expose a subset
+     *     of the server resolutions.
+     */
+    zoomOffset: 0,
+    
+    /**
+     * Constructor: OpenLayers.Layer.TMS
+     * 
+     * Parameters:
+     * name - {String}
+     * url - {String}
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, options) {
+        var newArguments = [];
+        newArguments.push(name, url, {}, options);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
+    },    
+
+    /**
+     * APIMethod:destroy
+     */
+    destroy: function() {
+        // for now, nothing special to do here. 
+        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);  
+    },
+
+    
+    /**
+     * APIMethod: clone
+     * 
+     * Parameters:
+     * obj - {Object}
+     * 
+     * Returns:
+     * {<OpenLayers.Layer.TMS>} An exact clone of this <OpenLayers.Layer.TMS>
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.TMS(this.name,
+                                           this.url,
+                                           this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    },    
+    
+    /**
+     * Method: getURL
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     * 
+     * Returns:
+     * {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);
+        var res = this.map.getResolution();
+        var x = Math.round((bounds.left - this.tileOrigin.lon) / (res * this.tileSize.w));
+        var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tileSize.h));
+        var z = this.serverResolutions != null ?
+            OpenLayers.Util.indexOf(this.serverResolutions, res) :
+            this.map.getZoom() + this.zoomOffset;
+        var path = this.serviceVersion + "/" + this.layername + "/" + z + "/" + x + "/" + y + "." + this.type; 
+        var url = this.url;
+        if (url instanceof Array) {
+            url = this.selectUrl(path, url);
+        }
+        return url + path;
+    },
+
+    /**
+     * Method: addTile
+     * 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, 
+                                         null, this.tileSize);
+    },
+
+    /** 
+     * APIMethod: setMap
+     * When the layer is added to a map, then we can fetch our origin 
+     *    (if we don't have one.) 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    setMap: function(map) {
+        OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments);
+        if (!this.tileOrigin) { 
+            this.tileOrigin = new OpenLayers.LonLat(this.map.maxExtent.left,
+                                                this.map.maxExtent.bottom);
+        }                                       
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.TMS"
+});
diff --git a/lib/OpenLayers/Layer/Text.js b/lib/OpenLayers/Layer/Text.js
new file mode 100644
index 0000000..658b5ea
--- /dev/null
+++ b/lib/OpenLayers/Layer/Text.js
@@ -0,0 +1,264 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Markers.js
+ * @requires OpenLayers/Format/Text.js
+ * @requires OpenLayers/Request/XMLHttpRequest.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.Text
+ * This layer creates markers given data in a text file.  The <location>
+ *     property of the layer (specified as a property of the options argument
+ *     in the <OpenLayers.Layer.Text> constructor) points to a tab delimited
+ *     file with data used to create markers.
+ *
+ * The first row of the data file should be a header line with the column names
+ *     of the data. Each column should be delimited by a tab space. The
+ *     possible columns are:
+ *      - *point* lat,lon of the point where a marker is to be placed
+ *      - *lat*  Latitude of the point where a marker is to be placed
+ *      - *lon*  Longitude of the point where a marker is to be placed
+ *      - *icon* or *image* URL of marker icon to use.
+ *      - *iconSize* Size of Icon to use.
+ *      - *iconOffset* Where the top-left corner of the icon is to be placed
+ *            relative to the latitude and longitude of the point.
+ *      - *title* The text of the 'title' is placed inside an 'h2' marker
+ *            inside a popup, which opens when the marker is clicked.
+ *      - *description* The text of the 'description' is placed below the h2
+ *            in the popup. this can be plain text or HTML.
+ *
+ * Example text file:
+ * (code)
+ * lat	lon	title	description	iconSize	iconOffset	icon
+ * 10	20	title	description	21,25		-10,-25		http://www.openlayers.org/dev/img/marker.png
+ * (end)
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Markers>
+ */
+OpenLayers.Layer.Text = OpenLayers.Class(OpenLayers.Layer.Markers, {
+
+    /**
+     * APIProperty: location 
+     * {String} URL of text file.  Must be specified in the "options" argument
+     *   of the constructor. Can not be changed once passed in. 
+     */
+    location:null,
+
+    /** 
+     * Property: features
+     * {Array(<OpenLayers.Feature>)} 
+     */
+    features: null,
+    
+    /**
+     * APIProperty: formatOptions
+     * {Object} Hash of options which should be passed to the format when it is
+     * created. Must be passed in the constructor.
+     */
+    formatOptions: null, 
+
+    /** 
+     * Property: selectedFeature
+     * {<OpenLayers.Feature>}
+     */
+    selectedFeature: null,
+
+    /**
+     * Constructor: OpenLayers.Layer.Text
+     * Create a text layer.
+     * 
+     * Parameters:
+     * name - {String} 
+     * options - {Object} Object with properties to be set on the layer.
+     *     Must include <location> property.
+     */
+    initialize: function(name, options) {
+        OpenLayers.Layer.Markers.prototype.initialize.apply(this, arguments);
+        this.features = new Array();
+    },
+
+    /**
+     * APIMethod: destroy 
+     */
+    destroy: function() {
+        // Warning: Layer.Markers.destroy() must be called prior to calling
+        // clearFeatures() here, otherwise we leak memory. Indeed, if
+        // Layer.Markers.destroy() is called after clearFeatures(), it won't be
+        // able to remove the marker image elements from the layer's div since
+        // the markers will have been destroyed by clearFeatures().
+        OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
+        this.clearFeatures();
+        this.features = null;
+    },
+    
+    /**
+     * Method: loadText
+     * Start the load of the Text data. Don't do this when we first add the layer,
+     * since we may not be visible at any point, and it would therefore be a waste.
+     */
+    loadText: function() {
+        if (!this.loaded) {
+            if (this.location != null) {
+
+                var onFail = function(e) {
+                    this.events.triggerEvent("loadend");
+                };
+
+                this.events.triggerEvent("loadstart");
+                OpenLayers.Request.GET({
+                    url: this.location,
+                    success: this.parseData,
+                    failure: onFail,
+                    scope: this
+                });
+                this.loaded = true;
+            }
+        }    
+    },    
+    
+    /**
+     * Method: moveTo
+     * If layer is visible and Text has not been loaded, load Text. 
+     * 
+     * Parameters:
+     * bounds - {Object} 
+     * zoomChanged - {Object} 
+     * minor - {Object} 
+     */
+    moveTo:function(bounds, zoomChanged, minor) {
+        OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
+        if(this.visibility && !this.loaded){
+            this.loadText();
+        }
+    },
+    
+    /**
+     * Method: parseData
+     *
+     * Parameters:
+     * ajaxRequest - {<OpenLayers.Request.XMLHttpRequest>} 
+     */
+    parseData: function(ajaxRequest) {
+        var text = ajaxRequest.responseText;
+        
+        var options = {};
+        
+        OpenLayers.Util.extend(options, this.formatOptions);
+        
+        if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
+            options.externalProjection = this.projection;
+            options.internalProjection = this.map.getProjectionObject();
+        }    
+        
+        var parser = new OpenLayers.Format.Text(options);
+        var features = parser.read(text);
+        for (var i=0, len=features.length; i<len; i++) {
+            var data = {};
+            var feature = features[i];
+            var location;
+            var iconSize, iconOffset;
+            
+            location = new OpenLayers.LonLat(feature.geometry.x, 
+                                             feature.geometry.y);
+            
+            if (feature.style.graphicWidth 
+                && feature.style.graphicHeight) {
+                iconSize = new OpenLayers.Size(
+                    feature.style.graphicWidth,
+                    feature.style.graphicHeight);
+            }        
+            
+            // FIXME: At the moment, we only use this if we have an 
+            // externalGraphic, because icon has no setOffset API Method.
+            /**
+             * FIXME FIRST!!
+             * The Text format does all sorts of parseFloating
+             * The result of a parseFloat for a bogus string is NaN.  That
+             * means the three possible values here are undefined, NaN, or a
+             * number.  The previous check was an identity check for null.  This
+             * means it was failing for all undefined or NaN.  A slightly better
+             * check is for undefined.  An even better check is to see if the
+             * value is a number (see #1441).
+             */
+            if (feature.style.graphicXOffset !== undefined
+                && feature.style.graphicYOffset !== undefined) {
+                iconOffset = new OpenLayers.Pixel(
+                    feature.style.graphicXOffset, 
+                    feature.style.graphicYOffset);
+            }
+            
+            if (feature.style.externalGraphic != null) {
+                data.icon = new OpenLayers.Icon(feature.style.externalGraphic, 
+                                                iconSize, 
+                                                iconOffset);
+            } else {
+                data.icon = OpenLayers.Marker.defaultIcon();
+
+                //allows for the case where the image url is not 
+                // specified but the size is. use a default icon
+                // but change the size
+                if (iconSize != null) {
+                    data.icon.setSize(iconSize);
+                }
+            }
+            
+            if ((feature.attributes.title != null) 
+                && (feature.attributes.description != null)) {
+                data['popupContentHTML'] = 
+                    '<h2>'+feature.attributes.title+'</h2>' + 
+                    '<p>'+feature.attributes.description+'</p>';
+            }
+            
+            data['overflow'] = feature.attributes.overflow || "auto"; 
+            
+            var markerFeature = new OpenLayers.Feature(this, location, data);
+            this.features.push(markerFeature);
+            var marker = markerFeature.createMarker();
+            if ((feature.attributes.title != null) 
+                && (feature.attributes.description != null)) {
+              marker.events.register('click', markerFeature, this.markerClick);
+            }
+            this.addMarker(marker);
+        }
+        this.events.triggerEvent("loadend");
+    },
+    
+    /**
+     * Property: markerClick
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    markerClick: function(evt) {
+        var sameMarkerClicked = (this == this.layer.selectedFeature);
+        this.layer.selectedFeature = (!sameMarkerClicked) ? this : null;
+        for(var i=0, len=this.layer.map.popups.length; i<len; i++) {
+            this.layer.map.removePopup(this.layer.map.popups[i]);
+        }
+        if (!sameMarkerClicked) {
+            this.layer.map.addPopup(this.createPopup()); 
+        }
+        OpenLayers.Event.stop(evt);
+    },
+
+    /**
+     * Method: clearFeatures
+     */
+    clearFeatures: function() {
+        if (this.features != null) {
+            while(this.features.length > 0) {
+                var feature = this.features[0];
+                OpenLayers.Util.removeItem(this.features, feature);
+                feature.destroy();
+            }
+        }        
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.Text"
+});
diff --git a/lib/OpenLayers/Layer/TileCache.js b/lib/OpenLayers/Layer/TileCache.js
new file mode 100644
index 0000000..b3c0c2d
--- /dev/null
+++ b/lib/OpenLayers/Layer/TileCache.js
@@ -0,0 +1,165 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.TileCache
+ * A read only TileCache layer.  Used to requests tiles cached by TileCache in
+ *     a web accessible cache.  This means that you have to pre-populate your
+ *     cache before this layer can be used.  It is meant only to read tiles
+ *     created by TileCache, and not to make calls to TileCache for tile
+ *     creation.  Create a new instance with the
+ *     <OpenLayers.Layer.TileCache> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.TileCache = OpenLayers.Class(OpenLayers.Layer.Grid, {
+
+    /** 
+     * APIProperty: isBaseLayer
+     * {Boolean} Treat this layer as a base layer.  Default is true.
+     */
+    isBaseLayer: true,
+    
+    /** 
+     * APIProperty: format
+     * {String} Mime type of the images returned.  Default is image/png.
+     */
+    format: 'image/png',
+
+    /**
+     * APIProperty: serverResolutions
+     * {Array} A list of all resolutions available on the server.  Only set this 
+     *     property if the map resolutions differs from the server.
+     */
+    serverResolutions: null,
+
+    /**
+     * Constructor: OpenLayers.Layer.TileCache
+     * Create a new read only TileCache layer.
+     *
+     * Parameters:
+     * name - {String} Name of the layer displayed in the interface
+     * url - {String} Location of the web accessible cache (not the location of
+     *     your tilecache script!)
+     * layername - {String} Layer name as defined in the TileCache 
+     *     configuration
+     * options - {Object} Optional object with properties to be set on the
+     *     layer.  Note that you should speficy your resolutions to match
+     *     your TileCache configuration.  This can be done by setting
+     *     the resolutions array directly (here or on the map), by setting
+     *     maxResolution and numZoomLevels, or by using scale based properties.
+     */
+    initialize: function(name, url, layername, options) {
+        this.layername = layername;
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this,
+                                                         [name, url, {}, options]);
+        this.extension = this.format.split('/')[1].toLowerCase();
+        this.extension = (this.extension == 'jpg') ? 'jpeg' : this.extension;
+    },    
+
+    /**
+     * APIMethod: clone
+     * obj - {Object} 
+     * 
+     * Returns:
+     * {<OpenLayers.Layer.TileCache>} An exact clone of this 
+     *     <OpenLayers.Layer.TileCache>
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.TileCache(this.name,
+                                                 this.url,
+                                                 this.layername,
+                                                 this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    },    
+    
+    /**
+     * Method: getURL
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} 
+     * 
+     * Returns:
+     * {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) {
+        var res = this.map.getResolution();
+        var bbox = this.maxExtent;
+        var size = this.tileSize;
+        var tileX = Math.round((bounds.left - bbox.left) / (res * size.w));
+        var tileY = Math.round((bounds.bottom - bbox.bottom) / (res * size.h));
+        var tileZ = this.serverResolutions != null ?
+            OpenLayers.Util.indexOf(this.serverResolutions, res) :
+            this.map.getZoom();
+        /**
+         * Zero-pad a positive integer.
+         * number - {Int} 
+         * length - {Int} 
+         *
+         * Returns:
+         * {String} A zero-padded string
+         */
+        function zeroPad(number, length) {
+            number = String(number);
+            var zeros = [];
+            for(var i=0; i<length; ++i) {
+                zeros.push('0');
+            }
+            return zeros.join('').substring(0, length - number.length) + number;
+        }
+        var components = [
+            this.layername,
+            zeroPad(tileZ, 2),
+            zeroPad(parseInt(tileX / 1000000), 3),
+            zeroPad((parseInt(tileX / 1000) % 1000), 3),
+            zeroPad((parseInt(tileX) % 1000), 3),
+            zeroPad(parseInt(tileY / 1000000), 3),
+            zeroPad((parseInt(tileY / 1000) % 1000), 3),
+            zeroPad((parseInt(tileY) % 1000), 3) + '.' + this.extension
+        ];
+        var path = components.join('/'); 
+        var url = this.url;
+        if (url instanceof Array) {
+            url = this.selectUrl(path, url);
+        }
+        url = (url.charAt(url.length - 1) == '/') ? url : url + '/';
+        return url + path;
+    },
+
+    /**
+     * Method: addTile
+     * Create a tile, initialize it, and add 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) {
+        var url = this.getURL(bounds);
+        return new OpenLayers.Tile.Image(this, position, bounds, 
+                                             url, this.tileSize);
+    },
+    
+    CLASS_NAME: "OpenLayers.Layer.TileCache"
+});
diff --git a/lib/OpenLayers/Layer/Vector.js b/lib/OpenLayers/Layer/Vector.js
new file mode 100644
index 0000000..d16e1a2
--- /dev/null
+++ b/lib/OpenLayers/Layer/Vector.js
@@ -0,0 +1,947 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer.js
+ * @requires OpenLayers/Renderer.js
+ * @requires OpenLayers/StyleMap.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.Vector
+ * Instances of OpenLayers.Layer.Vector are used to render vector data from
+ *     a variety of sources. Create a new vector layer with the
+ *     <OpenLayers.Layer.Vector> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer>
+ */
+OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer, {
+
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * layer.events.register(type, obj, listener);
+     * (end)
+     *
+     * Listeners will be called with a reference to an event object.  The
+     *     properties of this event depends on exactly what happened.
+     *
+     * All event objects have at least the following properties:
+     * object - {Object} A reference to layer.events.object.
+     * element - {DOMElement} A reference to layer.events.element.
+     *
+     * Supported map event types (in addition to those from <OpenLayers.Layer>):
+     * beforefeatureadded - Triggered before a feature is added.  Listeners
+     *      will receive an object with a *feature* property referencing the
+     *      feature to be added.  To stop the feature from being added, a
+     *      listener should return false.
+     * beforefeaturesadded - Triggered before an array of features is added.
+     *      Listeners will receive an object with a *features* property
+     *      referencing the feature to be added. To stop the features from
+     *      being added, a listener should return false.
+     * featureadded - Triggered after a feature is added.  The event
+     *      object passed to listeners will have a *feature* property with a
+     *      reference to the added feature.
+     * featuresadded - Triggered after features are added.  The event
+     *      object passed to listeners will have a *features* property with a
+     *      reference to an array of added features.
+     * beforefeatureremoved - Triggered before a feature is removed. Listeners
+     *      will receive an object with a *feature* property referencing the
+     *      feature to be removed.
+     * beforefeaturesremoved - Triggered before multiple features are removed. 
+     *      Listeners will receive an object with a *features* property
+     *      referencing the features to be removed.
+     * featureremoved - Triggerd after a feature is removed. The event
+     *      object passed to listeners will have a *feature* property with a
+     *      reference to the removed feature.
+     * featuresremoved - Triggered after features are removed. The event
+     *      object passed to listeners will have a *features* property with a
+     *      reference to an array of removed features.
+     * featureselected - Triggered after a feature is selected.  Listeners
+     *      will receive an object with a *feature* property referencing the
+     *      selected feature.
+     * 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* 
+     *      property referencing the selected feature.
+     * featuremodified - Triggered when a feature has been modified.
+     *      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 
+     *      the modified feature.
+     * vertexmodified - Triggered when a vertex within any feature geometry
+     *      has been modified.  Listeners will receive an object with a
+     *      *feature* property referencing the modified feature, a *vertex*
+     *      property referencing the vertex modified (always a point geometry),
+     *      and a *pixel* property referencing the pixel location of the
+     *      modification.
+     * sketchstarted - Triggered when a feature sketch bound for this layer
+     *      is started.  Listeners will receive an object with a *feature*
+     *      property referencing the new sketch feature and a *vertex* property
+     *      referencing the creation point.
+     * sketchmodified - Triggered when a feature sketch bound for this layer
+     *      is modified.  Listeners will receive an object with a *vertex*
+     *      property referencing the modified vertex and a *feature* property
+     *      referencing the sketch feature.
+     * sketchcomplete - Triggered when a feature sketch bound for this layer
+     *      is complete.  Listeners will receive an object with a *feature*
+     *      property referencing the sketch feature.  By returning false, a
+     *      listener can stop the sketch feature from being added to the layer.
+     * refresh - Triggered when something wants a strategy to ask the protocol
+     *      for a new set of features.
+     */
+    EVENT_TYPES: ["beforefeatureadded", "beforefeaturesadded",
+                  "featureadded", "featuresadded", "beforefeatureremoved",
+                  "beforefeaturesremoved", "featureremoved", "featuresremoved",
+                  "beforefeatureselected", "featureselected", "featureunselected", 
+                  "beforefeaturemodified", "featuremodified", "afterfeaturemodified",
+                  "vertexmodified", "sketchstarted", "sketchmodified",
+                  "sketchcomplete", "refresh"],
+
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean} The layer is a base layer.  Default is false.  Set this property
+     * in the layer options.
+     */
+    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>)} 
+     */
+    features: null,
+    
+    /** 
+     * Property: filter
+     * {<OpenLayers.Filter>} The filter set in this layer,
+     *     a strategy launching read requests can combined
+     *     this filter with its own filter.
+     */
+    filter: null,
+    
+    /** 
+     * Property: selectedFeatures
+     * {Array(<OpenLayers.Feature.Vector>)} 
+     */
+    selectedFeatures: null,
+    
+    /**
+     * Property: unrenderedFeatures
+     * {Object} hash of features, keyed by feature.id, that the renderer
+     *     failed to draw
+     */
+    unrenderedFeatures: null,
+
+    /**
+     * APIProperty: reportError
+     * {Boolean} report friendly error message when loading of renderer
+     * fails.
+     */
+    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
+     * add support for additional renderers. This list is ordered:
+     * the first renderer which returns true for the  'supported()'
+     * 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
+     * "OpenLayers.Geometry.Point" to limit types.
+     */
+    geometryType: null,
+
+    /** 
+     * Property: drawn
+     * {Boolean} Whether the Vector Layer features have been drawn yet.
+     */
+    drawn: false,
+
+    /**
+     * Constructor: OpenLayers.Layer.Vector
+     * Create a new vector layer
+     *
+     * Parameters:
+     * name - {String} A name for the layer
+     * options - {Object} Optional object with non-default properties to set on
+     *           the layer.
+     *
+     * Returns:
+     * {<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(
+            OpenLayers.Layer.prototype.EVENT_TYPES
+        );
+
+        OpenLayers.Layer.prototype.initialize.apply(this, arguments);
+
+        // allow user-set renderer, otherwise assign one
+        if (!this.renderer || !this.renderer.supported()) {  
+            this.assignRenderer();
+        }
+
+        // if no valid renderer found, display error
+        if (!this.renderer || !this.renderer.supported()) {
+            this.renderer = null;
+            this.displayError();
+        } 
+
+        if (!this.styleMap) {
+            this.styleMap = new OpenLayers.StyleMap();
+        }
+
+        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++) {
+                this.strategies[i].setLayer(this);
+            }
+        }
+
+    },
+
+    /**
+     * APIMethod: destroy
+     * Destroy this layer
+     */
+    destroy: function() {
+        if (this.strategies) {
+            var strategy, i, len;
+            for(i=0, len=this.strategies.length; i<len; i++) {
+                strategy = this.strategies[i];
+                if(strategy.autoDestroy) {
+                    strategy.destroy();
+                }
+            }
+            this.strategies = null;
+        }
+        if (this.protocol) {
+            if(this.protocol.autoDestroy) {
+                this.protocol.destroy();
+            }
+            this.protocol = null;
+        }
+        this.destroyFeatures();
+        this.features = null;
+        this.selectedFeatures = null;
+        this.unrenderedFeatures = null;
+        if (this.renderer) {
+            this.renderer.destroy();
+        }
+        this.renderer = null;
+        this.geometryType = null;
+        this.drawn = null;
+        OpenLayers.Layer.prototype.destroy.apply(this, arguments);  
+    },
+
+    /**
+     * Method: clone
+     * Create a clone of this layer.
+     * 
+     * Note: Features of the layer are also cloned.
+     *
+     * Returns:
+     * {<OpenLayers.Layer.Vector>} An exact clone of this layer
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.Vector(this.name, this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+        var features = this.features;
+        var len = features.length;
+        var clonedFeatures = new Array(len);
+        for(var i=0; i<len; ++i) {
+            clonedFeatures[i] = features[i].clone();
+        }
+        obj.features = clonedFeatures;
+
+        return obj;
+    },    
+    
+    /**
+     * Method: refresh
+     * Ask the layer to request features again and redraw them.  Triggers
+     *     the refresh event if the layer is in range and visible.
+     *
+     * Parameters:
+     * obj - {Object} Optional object with properties for any listener of
+     *     the refresh event.
+     */
+    refresh: function(obj) {
+        if(this.calculateInRange() && this.visibility) {
+            this.events.triggerEvent("refresh", obj);
+        }
+    },
+
+    /** 
+     * Method: assignRenderer
+     * 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 = this.renderers[i];
+            var renderer = (typeof rendererClass == "function") ?
+                rendererClass :
+                OpenLayers.Renderer[rendererClass];
+            if (renderer && renderer.prototype.supported()) {
+                this.renderer = new renderer(this.div, this.rendererOptions);
+                break;
+            }  
+        }  
+    },
+
+    /** 
+     * Method: displayError 
+     * Let the user know their browser isn't supported.
+     */
+    displayError: function() {
+        if (this.reportError) {
+            OpenLayers.Console.userError(OpenLayers.i18n("browserNotSupported", 
+                                     {'renderers':this.renderers.join("\n")}));
+        }    
+    },
+
+    /** 
+     * Method: setMap
+     * 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>} 
+     */
+    setMap: function(map) {        
+        OpenLayers.Layer.prototype.setMap.apply(this, arguments);
+
+        if (!this.renderer) {
+            this.map.removeLayer(this);
+        } else {
+            this.renderer.map = this.map;
+            this.renderer.setSize(this.map.getSize());
+        }
+    },
+
+    /**
+     * Method: afterAdd
+     * Called at the end of the map.addLayer sequence.  At this point, the map
+     *     will have a base layer.  Any autoActivate strategies will be
+     *     activated here.
+     */
+    afterAdd: function() {
+        if(this.strategies) {
+            var strategy, i, len;
+            for(i=0, len=this.strategies.length; i<len; i++) {
+                strategy = this.strategies[i];
+                if(strategy.autoActivate) {
+                    strategy.activate();
+                }
+            }
+        }
+    },
+
+    /**
+     * Method: removeMap
+     * The layer has been removed from the map.
+     *
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    removeMap: function(map) {
+        this.drawn = false;
+        if(this.strategies) {
+            var strategy, i, len;
+            for(i=0, len=this.strategies.length; i<len; i++) {
+                strategy = this.strategies[i];
+                if(strategy.autoActivate) {
+                    strategy.deactivate();
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: onMapResize
+     * Notify the renderer of the change in size. 
+     * 
+     */
+    onMapResize: function() {
+        OpenLayers.Layer.prototype.onMapResize.apply(this, arguments);
+        this.renderer.setSize(this.map.getSize());
+    },
+
+    /**
+     * Method: moveTo
+     *  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 
+     *   renderer redraw features.
+     * 
+     *  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} 
+     */
+    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.
+            // This seems to happen on only certain configurations; it was originally
+            // noticed in FF 2.0 and Linux.
+            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];
+                    this.drawFeature(feature);
+                }
+            }
+        }
+        
+        if (!this.drawn || zoomChanged || !coordSysUnchanged) {
+            this.drawn = true;
+            var feature;
+            for(var i=0, len=this.features.length; i<len; i++) {
+                this.renderer.locked = (i !== (len - 1));
+                feature = this.features[i];
+                this.drawFeature(feature);
+            }
+        }    
+    },
+    
+    /** 
+     * APIMethod: display
+     * Hide or show the Layer
+     * 
+     * Parameters:
+     * display - {Boolean}
+     */
+    display: function(display) {
+        OpenLayers.Layer.prototype.display.apply(this, arguments);
+        // we need to set the display style of the root in case it is attached
+        // to a foreign layer
+        var currentDisplay = this.div.style.display;
+        if(currentDisplay != this.renderer.root.style.display) {
+            this.renderer.root.style.display = currentDisplay;
+        }
+    },
+
+    /**
+     * APIMethod: addFeatures
+     * Add Features to the layer.
+     *
+     * Parameters:
+     * 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};
+            var ret = this.events.triggerEvent("beforefeaturesadded", event);
+            if(ret === false) {
+                return;
+            }
+            features = event.features;
+        }
+        
+        // Track successfully added features for featuresadded event, since
+        // beforefeatureadded can veto single features.
+        var featuresAdded = [];
+        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',
+                          {'geomType':this.geometryType.prototype.CLASS_NAME});
+                throw throwStr;
+              }
+
+            //give feature reference to its layer
+            feature.layer = this;
+
+            if (!feature.style && this.style) {
+                feature.style = OpenLayers.Util.extend({}, this.style);
+            }
+
+            if (notify) {
+                if(this.events.triggerEvent("beforefeatureadded",
+                                            {feature: feature}) === false) {
+                    continue;
+                };
+                this.preFeatureInsert(feature);
+            }
+
+            featuresAdded.push(feature);
+            this.features.push(feature);
+            this.drawFeature(feature);
+            
+            if (notify) {
+                this.events.triggerEvent("featureadded", {
+                    feature: feature
+                });
+                this.onFeatureInsert(feature);
+            }
+        }
+        
+        if(notify) {
+            this.events.triggerEvent("featuresadded", {features: featuresAdded});
+        }
+    },
+
+
+    /**
+     * APIMethod: removeFeatures
+     * Remove features from the layer.  This erases any drawn features and
+     *     removes them from the layer's control.  The beforefeatureremoved
+     *     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.
+     * options - {Object} Optional properties for changing behavior of the
+     *     removal.
+     *
+     * Valid options:
+     * silent - {Boolean} Supress event triggering.  Default is false.
+     */
+    removeFeatures: function(features, options) {
+        if(!features || features.length === 0) {
+            return;
+        }
+        if (features === this.features) {
+            return this.removeAllFeatures(options);
+        }
+        if (!(features instanceof Array)) {
+            features = [features];
+        }
+        if (features === this.selectedFeatures) {
+            features = features.slice();
+        }
+
+        var notify = !options || !options.silent;
+        
+        if (notify) {
+            this.events.triggerEvent(
+                "beforefeaturesremoved", {features: features}
+            );
+        }
+
+        for (var i = features.length - 1; i >= 0; i--) {
+            // We remain locked so long as we're not at 0
+            // and the 'next' feature has a geometry. We do the geometry check
+            // 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 
+            // of the list checking the remaining features every time. So long as
+            // 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];
+
+            if (notify) {
+                this.events.triggerEvent("beforefeatureremoved", {
+                    feature: feature
+                });
+            }
+
+            this.features = OpenLayers.Util.removeItem(this.features, feature);
+            // feature has no layer at this point
+            feature.layer = null;
+
+            if (feature.geometry) {
+                this.renderer.eraseFeatures(feature);
+            }
+                    
+            //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);
+            }
+
+            if (notify) {
+                this.events.triggerEvent("featureremoved", {
+                    feature: feature
+                });
+            }
+        }
+
+        if (notify) {
+            this.events.triggerEvent("featuresremoved", {features: features});
+        }
+    },
+    
+    /** 
+     * APIMethod: removeAllFeatures
+     * Remove all features from the layer.
+     *
+     * Parameters:
+     * options - {Object} Optional properties for changing behavior of the
+     *     removal.
+     *
+     * Valid options:
+     * silent - {Boolean} Supress event triggering.  Default is false.
+     */
+    removeAllFeatures: function(options) {
+        var notify = !options || !options.silent;
+        var features = this.features;
+        if (notify) {
+            this.events.triggerEvent(
+                "beforefeaturesremoved", {features: features}
+            );
+        }
+        var feature;
+        for (var i = features.length-1; i >= 0; i--) {
+            feature = features[i];
+            if (notify) {
+                this.events.triggerEvent("beforefeatureremoved", {
+                    feature: feature
+                });
+            }
+            feature.layer = null;
+            if (notify) {
+                this.events.triggerEvent("featureremoved", {
+                    feature: feature
+                });
+            }
+        }
+        this.renderer.clear();
+        this.features = [];
+        this.unrenderedFeatures = {};
+        this.selectedFeatures = [];
+        if (notify) {
+            this.events.triggerEvent("featuresremoved", {features: features});
+        }
+    },
+
+    /**
+     * APIMethod: destroyFeatures
+     * Erase and destroy features on the layer.
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>)} An optional array of
+     *     features to destroy.  If not supplied, all features on the layer
+     *     will be destroyed.
+     * options - {Object}
+     */
+    destroyFeatures: function(features, options) {
+        var all = (features == undefined); // evaluates to true if
+                                           // features is null
+        if(all) {
+            features = this.features;
+        }
+        if(features) {
+            this.removeFeatures(features, options);
+            for(var i=features.length-1; i>=0; i--) {
+                features[i].destroy();
+            }
+        }
+    },
+
+    /**
+     * APIMethod: drawFeature
+     * Draw (or redraw) a feature on the layer.  If the optional style argument
+     * 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 
+     * 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 
+     * 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 
+     * happen.
+     *
+     * Parameters: 
+     * feature - {<OpenLayers.Feature.Vector>} 
+     * style - {String | Object} Named render intent or full symbolizer object.
+     */
+    drawFeature: function(feature, style) {
+        // don't try to draw the feature with the renderer if the layer is not 
+        // drawn itself
+        if (!this.drawn) {
+            return
+        }
+        if (typeof style != "object") {
+            if(!style && feature.state === OpenLayers.State.DELETE) {
+                style = "delete";
+            }
+            var renderIntent = style || feature.renderIntent;
+            style = feature.style || this.style;
+            if (!style) {
+                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>)} 
+     */
+    eraseFeatures: function(features) {
+        this.renderer.eraseFeatures(features);
+    },
+
+    /**
+     * Method: getFeatureFromEvent
+     * Given an event, return a feature if the event occurred over one.
+     * Otherwise, return null.
+     *
+     * Parameters:
+     * 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")); 
+            return null;
+        }    
+        var featureId = this.renderer.getFeatureIdFromEvent(evt);
+        return this.getFeatureById(featureId);
+    },
+
+    /**
+     * APIMethod: getFeatureBy
+     * Given a property value, return the feature if it exists in the features array
+     *
+     * Parameters:
+     * property - {String}
+     * value - {String}
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>} A feature corresponding to the given
+     * property value or null if there is no such feature.
+     */
+    getFeatureBy: function(property, value) {
+        //TBD - would it be more efficient to use a hash for this.features?
+        var feature = null;
+        for(var i=0, len=this.features.length; i<len; ++i) {
+            if(this.features[i][property] == value) {
+                feature = this.features[i];
+                break;
+            }
+        }
+        return feature;
+    },
+
+    /**
+     * APIMethod: getFeatureById
+     * Given a feature id, return the feature if it exists in the features array
+     *
+     * Parameters:
+     * featureId - {String}
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>} A feature corresponding to the given
+     * featureId or null if there is no such feature.
+     */
+    getFeatureById: function(featureId) {
+        return this.getFeatureBy('id', featureId);
+    },
+
+    /**
+     * APIMethod: getFeatureByFid
+     * Given a feature fid, return the feature if it exists in the features array
+     *
+     * Parameters:
+     * featureFid - {String}
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>} A feature corresponding to the given
+     * featureFid or null if there is no such feature.
+     */
+    getFeatureByFid: function(featureFid) {
+        return this.getFeatureBy('fid', featureFid);
+    },
+
+    /**
+     * Unselect the selected features
+     * i.e. clears the featureSelection array
+     * change the style back
+    clearSelection: function() {
+
+       var vectorLayer = this.map.vectorLayer;
+        for (var i = 0; i < this.map.featureSelection.length; i++) {
+            var featureSelection = this.map.featureSelection[i];
+            vectorLayer.drawFeature(featureSelection, vectorLayer.style);
+        }
+        this.map.featureSelection = [];
+    },
+     */
+
+
+    /**
+     * APIMethod: onFeatureInsert
+     * method called after a feature is inserted.
+     * Does nothing by default. Override this if you
+     * need to do something on feature updates.
+     *
+     * Paarameters: 
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    onFeatureInsert: function(feature) {
+    },
+    
+    /**
+     * APIMethod: preFeatureInsert
+     * method called before a feature is inserted.
+     * Does nothing by default. Override this if you
+     * need to do something when features are first added to the
+     * layer, but before they are drawn, such as adjust the style.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     */
+    preFeatureInsert: function(feature) {
+    },
+
+    /** 
+     * APIMethod: getDataExtent
+     * Calculates the max extent which includes all of the features.
+     * 
+     * Returns:
+     * {<OpenLayers.Bounds>}
+     */
+    getDataExtent: function () {
+        var maxExtent = null;
+        var features = this.features;
+        if(features && (features.length > 0)) {
+            maxExtent = new OpenLayers.Bounds();
+            var geometry = null;
+            for(var i=0, len=features.length; i<len; i++) {
+                geometry = features[i].geometry;
+                if (geometry) {
+                    maxExtent.extend(geometry.getBounds());
+                }
+            }
+        }
+        return maxExtent;
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.Vector"
+});
diff --git a/lib/OpenLayers/Layer/Vector/RootContainer.js b/lib/OpenLayers/Layer/Vector/RootContainer.js
new file mode 100644
index 0000000..c2b3da4
--- /dev/null
+++ b/lib/OpenLayers/Layer/Vector/RootContainer.js
@@ -0,0 +1,157 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/Vector.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.Vector.RootContainer
+ * A special layer type to combine multiple vector layers inside a single
+ *     renderer root container. This class is not supposed to be instantiated
+ *     from user space, it is a helper class for controls that require event
+ *     processing for multiple vector layers.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Vector>
+ */
+OpenLayers.Layer.Vector.RootContainer = OpenLayers.Class(OpenLayers.Layer.Vector, {
+    
+    /**
+     * Property: displayInLayerSwitcher
+     * Set to false for this layer type
+     */
+    displayInLayerSwitcher: false,
+    
+    /**
+     * APIProperty: layers
+     * Layers that are attached to this container. Required config option.
+     */
+    layers: null,
+    
+    /**
+     * Constructor: OpenLayers.Layer.Vector.RootContainer
+     * Create a new root container for multiple vector layer. This constructor
+     * is not supposed to be used from user space, it is only to be used by
+     * controls that need feature selection across multiple vector layers.
+     *
+     * Parameters:
+     * name - {String} A name for the layer
+     * options - {Object} Optional object with non-default properties to set on
+     *           the layer.
+     * 
+     * Required options properties:
+     * layers - {Array(<OpenLayers.Layer.Vector>)} The layers managed by this
+     *     container
+     *
+     * Returns:
+     * {<OpenLayers.Layer.Vector.RootContainer>} A new vector layer root
+     *     container
+     */
+    initialize: function(name, options) {
+        OpenLayers.Layer.Vector.prototype.initialize.apply(this, arguments);
+    },
+    
+    /**
+     * Method: display
+     */
+    display: function() {},
+    
+    /**
+     * Method: getFeatureFromEvent
+     * walk through the layers to find the feature returned by the event
+     * 
+     * Parameters:
+     * evt - {Object} event object with a feature property
+     * 
+     * Returns:
+     * {<OpenLayers.Feature.Vector>}
+     */
+    getFeatureFromEvent: function(evt) {
+        var layers = this.layers;
+        var feature;
+        for(var i=0; i<layers.length; i++) {
+            feature = layers[i].getFeatureFromEvent(evt);
+            if(feature) {
+                return feature;
+            }
+        }
+    },
+    
+    /**
+     * Method: setMap
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    setMap: function(map) {
+        OpenLayers.Layer.Vector.prototype.setMap.apply(this, arguments);
+        this.collectRoots();
+        map.events.register("changelayer", this, this.handleChangeLayer);
+    },
+    
+    /**
+     * Method: removeMap
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    removeMap: function(map) {
+        map.events.unregister("changelayer", this, this.handleChangeLayer);
+        this.resetRoots();
+        OpenLayers.Layer.Vector.prototype.removeMap.apply(this, arguments);
+    },
+    
+    /**
+     * Method: collectRoots
+     * Collects the root nodes of all layers this control is configured with
+     * and moveswien the nodes to this control's layer
+     */
+    collectRoots: function() {
+        var layer;
+        // walk through all map layers, because we want to keep the order
+        for(var i=0; i<this.map.layers.length; ++i) {
+            layer = this.map.layers[i];
+            if(OpenLayers.Util.indexOf(this.layers, layer) != -1) {
+                layer.renderer.moveRoot(this.renderer);
+            }
+        }
+    },
+    
+    /**
+     * Method: resetRoots
+     * Resets the root nodes back into the layers they belong to.
+     */
+    resetRoots: function() {
+        var layer;
+        for(var i=0; i<this.layers.length; ++i) {
+            layer = this.layers[i];
+            if(this.renderer && layer.renderer.getRenderLayerId() == this.id) {
+                this.renderer.moveRoot(layer.renderer);
+            }
+        }
+    },
+    
+    /**
+     * Method: handleChangeLayer
+     * Event handler for the map's changelayer event. We need to rebuild
+     * this container's layer dom if order of one of its layers changes.
+     * This handler is added with the setMap method, and removed with the
+     * removeMap method.
+     * 
+     * Parameters:
+     * evt - {Object}
+     */
+    handleChangeLayer: function(evt) {
+        var layer = evt.layer;
+        if(evt.property == "order" &&
+                        OpenLayers.Util.indexOf(this.layers, layer) != -1) {
+            this.resetRoots();
+            this.collectRoots();
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.Vector.RootContainer"
+});
diff --git a/lib/OpenLayers/Layer/VirtualEarth.js b/lib/OpenLayers/Layer/VirtualEarth.js
new file mode 100644
index 0000000..4fba250
--- /dev/null
+++ b/lib/OpenLayers/Layer/VirtualEarth.js
@@ -0,0 +1,368 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/SphericalMercator.js
+ * @requires OpenLayers/Layer/EventPane.js
+ * @requires OpenLayers/Layer/FixedZoomLevels.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.VirtualEarth
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.EventPane>
+ *  - <OpenLayers.Layer.FixedZoomLevels>
+ */
+OpenLayers.Layer.VirtualEarth = OpenLayers.Class(
+    OpenLayers.Layer.EventPane,
+    OpenLayers.Layer.FixedZoomLevels, {
+    
+    /** 
+     * Constant: MIN_ZOOM_LEVEL
+     * {Integer} 1 
+     */
+    MIN_ZOOM_LEVEL: 1,
+    
+    /** 
+     * 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, 
+        0.0439453125,
+        0.02197265625, 
+        0.010986328125, 
+        0.0054931640625, 
+        0.00274658203125,
+        0.001373291015625, 
+        0.0006866455078125, 
+        0.00034332275390625, 
+        0.000171661376953125, 
+        0.0000858306884765625, 
+        0.00004291534423828125,
+        0.00002145767211914062, 
+        0.00001072883605957031,
+        0.00000536441802978515
+    ],
+
+    /**
+     * APIProperty: type
+     * {VEMapType}
+     */
+    type: null,
+
+    /**
+     * APIProperty: wrapDateLine
+     * {Boolean} Allow user to pan forever east/west.  Default is true.  
+     *     Setting this to false only restricts panning if 
+     *     <sphericalMercator> is true. 
+     */
+    wrapDateLine: true,
+
+    /**
+     * 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. 
+     */
+    sphericalMercator: false,
+    
+    /**
+     * APIProperty: animationEnabled
+     * {Boolean} If set to true, the transition between zoom levels will be
+     *     animated. Set to false to match the zooming experience of other
+     *     layer types. Default is 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, 
+                                                                    arguments);
+        if(this.sphericalMercator) {
+            OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
+            this.initMercatorParameters();
+        }
+    },
+    
+    /**
+     * Method: loadMapObject
+     */
+    loadMapObject:function() {
+
+        // create div and set to same size as map
+        var veDiv = OpenLayers.Util.createDiv(this.name);
+        var sz = this.map.getSize();
+        veDiv.style.width = sz.w + "px";
+        veDiv.style.height = sz.h + "px";
+        this.div.appendChild(veDiv);
+
+        try { // crash prevention
+            this.mapObject = new VEMap(this.name);
+        } catch (e) { }
+
+        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: 
+                // 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", OpenLayers.Function.True);
+
+            } catch (e) { }
+            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 
+        // to be careful
+        if ( !this.mapObject ||
+             !this.mapObject.vemapcontrol ||
+             !this.mapObject.vemapcontrol.PanMap ||
+             (typeof this.mapObject.vemapcontrol.PanMap != "function")) {
+
+            this.dragPanMapObject = null;
+        }
+
+    },
+
+    /**
+     * Method: onMapResize
+     */
+    onMapResize: function() {
+        this.mapObject.Resize(this.map.size.w, this.map.size.h);
+    },
+
+    /** 
+     * APIMethod: getWarningHTML
+     * 
+     * Returns: 
+     * {String} String with information on why layer is broken, how to get
+     *          it working.
+     */
+    getWarningHTML:function() {
+        return OpenLayers.i18n(
+            "getLayerWarning", {'layerType':'VE', 'layerLib':'VirtualEarth'}
+        );
+    },
+
+
+
+    /************************************
+     *                                  *
+     *   MapObject Interface Controls   *
+     *                                  *
+     ************************************/
+
+
+  // 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); 
+    },
+   
+    /**
+     * APIMethod: getMapObjectCenter
+     * 
+     * Returns: 
+     * {Object} The mapObject's current center in Map Object format
+     */
+    getMapObjectCenter: function() {
+        return this.mapObject.GetCenter();
+    },
+
+    /**
+     * APIMethod: dragPanMapObject
+     * 
+     * Parameters:
+     * dX - {Integer}
+     * dY - {Integer}
+     */
+    dragPanMapObject: function(dX, dY) {
+        this.mapObject.vemapcontrol.PanMap(dX, -dY);
+    },
+
+    /** 
+     * APIMethod: getMapObjectZoom
+     * 
+     * Returns:
+     * {Integer} The mapObject's current zoom, in Map Object format
+     */
+    getMapObjectZoom: function() {
+        return this.mapObject.GetZoomLevel();
+    },
+
+
+  // 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') 
+            ? 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
+     */
+    getMapObjectPixelFromMapObjectLonLat: function(moLonLat) {
+        return this.mapObject.LatLongToPixel(moLonLat);
+    },
+
+
+    /************************************
+     *                                  *
+     *       MapObject Primitives       *
+     *                                  *
+     ************************************/
+
+
+  // LonLat
+    
+    /**
+     * APIMethod: getLongitudeFromMapObjectLonLat
+     * 
+     * Parameters:
+     * moLonLat - {Object} MapObject LonLat format
+     * 
+     * Returns:
+     * {Float} Longitude of the given MapObject LonLat
+     */
+    getLongitudeFromMapObjectLonLat: function(moLonLat) {
+        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 ? 
+            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
+     */
+    getMapObjectLonLatFromLonLat: function(lon, lat) {
+        var veLatLong;
+        if(this.sphericalMercator) {
+            var lonlat = this.inverseMercator(lon, lat);
+            veLatLong = new VELatLong(lonlat.lat, lonlat.lon);
+        } else {
+            veLatLong = new VELatLong(lat, lon);
+        }
+        return veLatLong;
+    },
+
+  // Pixel
+    
+    /**
+     * APIMethod: getXFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Integer} X value of the MapObject Pixel
+     */
+    getXFromMapObjectPixel: function(moPixel) {
+        return moPixel.x;
+    },
+
+    /**
+     * APIMethod: getYFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Integer} Y value of the MapObject Pixel
+     */
+    getYFromMapObjectPixel: function(moPixel) {
+        return moPixel.y;
+    },
+
+    /**
+     * APIMethod: getMapObjectPixelFromXY
+     * 
+     * Parameters:
+     * x - {Integer}
+     * y - {Integer}
+     * 
+     * Returns:
+     * {Object} MapObject Pixel from x and y parameters
+     */
+    getMapObjectPixelFromXY: function(x, y) {
+        //the conditional here is to test if we are running the v6 of VE
+        return (typeof VEPixel != 'undefined') ? new VEPixel(x, y)
+                         : new Msn.VE.Pixel(x, y);
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.VirtualEarth"
+});
diff --git a/lib/OpenLayers/Layer/WFS.js b/lib/OpenLayers/Layer/WFS.js
new file mode 100644
index 0000000..61c4c3f
--- /dev/null
+++ b/lib/OpenLayers/Layer/WFS.js
@@ -0,0 +1,609 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Tile/WFS.js
+ * @requires OpenLayers/Layer/Vector.js
+ * @requires OpenLayers/Layer/Markers.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.WFS
+ * *Deprecated*.  To be removed in 3.0.  Instead use OpenLayers.Layer.Vector
+ *     with a Protocol.WFS and one or more Strategies.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Vector>
+ *  - <OpenLayers.Layer.Markers>
+ */
+OpenLayers.Layer.WFS = OpenLayers.Class(
+  OpenLayers.Layer.Vector, OpenLayers.Layer.Markers, {
+
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean} WFS layer is not a base layer by default. 
+     */
+    isBaseLayer: false,
+    
+    /**
+     * Property: tile
+     * {<OpenLayers.Tile.WFS>}
+     */
+    tile: null,    
+    
+    /**
+     * APIProperty: ratio
+     * {Float} The ratio property determines the size of the serverside query
+     *    relative to the map viewport size. By default, we load an area twice
+     *    as big as the map, to allow for panning without immediately reload.
+     *    Setting this to 1 will cause the area of the WFS request to match
+     *    the map area exactly. It is recommended to set this to some number
+     *    at least slightly larger than 1, otherwise accidental clicks can
+     *    cause a data reload, by moving the map only 1 pixel.
+     */
+    ratio: 2,
+
+    /**  
+     * Property: DEFAULT_PARAMS
+     * {Object} Hashtable of default key/value parameters
+     */
+    DEFAULT_PARAMS: { service: "WFS",
+                      version: "1.0.0",
+                      request: "GetFeature"
+                    },
+    
+    /** 
+     * APIProperty: featureClass
+     * {<OpenLayers.Feature>} If featureClass is defined, an old-style markers
+     *     based WFS layer is created instead of a new-style vector layer. If
+     *     sent, this should be a subclass of OpenLayers.Feature
+     */
+    featureClass: null,
+    
+    /**
+      * APIProperty: format
+      * {<OpenLayers.Format>} The format you want the data to be parsed with.
+      * Must be passed in the constructor. Should be a class, not an instance.
+      * This option can only be used if no featureClass is passed / vectorMode
+      * is false: if a featureClass is passed, then this parameter is ignored.
+      */
+    format: null,
+
+    /** 
+     * Property: formatObject
+     * {<OpenLayers.Format>} Internally created/managed format object, used by
+     * the Tile to parse data.
+     */
+    formatObject: null,
+
+    /**
+     * APIProperty: formatOptions
+     * {Object} Hash of options which should be passed to the format when it is
+     * created. Must be passed in the constructor.
+     */
+    formatOptions: null, 
+
+    /**
+     * Property: vectorMode
+     * {Boolean} Should be calculated automatically. Determines whether the
+     *     layer is in vector mode or marker mode.
+     */
+    vectorMode: true, 
+    
+    /**
+     * APIProperty: encodeBBOX
+     * {Boolean} Should the BBOX commas be encoded? The WMS spec says 'no', 
+     *     but some services want it that way. Default false.
+     */
+    encodeBBOX: false,
+    
+    /**
+     * APIProperty: extractAttributes 
+     * {Boolean} Should the WFS layer parse attributes from the retrieved
+     *     GML? Defaults to false. If enabled, parsing is slower, but 
+     *     attributes are available in the attributes property of 
+     *     layer features.
+     */
+    extractAttributes: false,
+
+    /**
+     * Constructor: OpenLayers.Layer.WFS
+     *
+     * Parameters:
+     * name - {String} 
+     * url - {String} 
+     * params - {Object} 
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, params, options) {
+        if (options == undefined) { options = {}; } 
+        
+        if (options.featureClass || 
+            !OpenLayers.Layer.Vector || 
+            !OpenLayers.Feature.Vector) {
+            this.vectorMode = false;
+        }    
+
+        // Uppercase params
+        params = OpenLayers.Util.upperCaseObject(params);
+        
+        // Turn off error reporting, browsers like Safari may work
+        // depending on the setup, and we don't want an unneccesary alert.
+        OpenLayers.Util.extend(options, {'reportError': false});
+        var newArguments = [];
+        newArguments.push(name, options);
+        OpenLayers.Layer.Vector.prototype.initialize.apply(this, newArguments);
+        if (!this.renderer || !this.vectorMode) {
+            this.vectorMode = false; 
+            if (!options.featureClass) {
+                options.featureClass = OpenLayers.Feature.WFS;
+            }   
+            OpenLayers.Layer.Markers.prototype.initialize.apply(this, 
+                                                                newArguments);
+        }
+        
+        if (this.params && this.params.typename && !this.options.typename) {
+            this.options.typename = this.params.typename;
+        }
+        
+        if (!this.options.geometry_column) {
+            this.options.geometry_column = "the_geom";
+        }    
+        
+        this.params = OpenLayers.Util.applyDefaults(
+            params, 
+            OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
+        );
+        this.url = url;
+    },    
+    
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        if (this.vectorMode) {
+            OpenLayers.Layer.Vector.prototype.destroy.apply(this, arguments);
+        } else {    
+            OpenLayers.Layer.Markers.prototype.destroy.apply(this, arguments);
+        }    
+        if (this.tile) {
+            this.tile.destroy();
+        }
+        this.tile = null;
+
+        this.ratio = null;
+        this.featureClass = null;
+        this.format = null;
+
+        if (this.formatObject && this.formatObject.destroy) {
+            this.formatObject.destroy();
+        }
+        this.formatObject = null;
+        
+        this.formatOptions = null;
+        this.vectorMode = null;
+        this.encodeBBOX = null;
+        this.extractAttributes = null;
+    },
+    
+    /**
+     * Method: setMap
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>} 
+     */
+    setMap: function(map) {
+        if (this.vectorMode) {
+            OpenLayers.Layer.Vector.prototype.setMap.apply(this, arguments);
+            
+            var options = {
+              'extractAttributes': this.extractAttributes
+            };
+            
+            OpenLayers.Util.extend(options, this.formatOptions);
+            if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
+                options.externalProjection = this.projection;
+                options.internalProjection = this.map.getProjectionObject();
+            }    
+            
+            this.formatObject = this.format ? new this.format(options) : new OpenLayers.Format.GML(options);
+        } else {    
+            OpenLayers.Layer.Markers.prototype.setMap.apply(this, arguments);
+        }    
+    },
+    
+    /** 
+     * Method: moveTo
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} 
+     * zoomChanged - {Boolean} 
+     * dragging - {Boolean} 
+     */
+    moveTo:function(bounds, zoomChanged, dragging) {
+        if (this.vectorMode) {
+            OpenLayers.Layer.Vector.prototype.moveTo.apply(this, arguments);
+        } else {
+            OpenLayers.Layer.Markers.prototype.moveTo.apply(this, arguments);
+        }    
+
+        // don't load wfs features while dragging, wait for drag end
+        if (dragging) {
+            // TBD try to hide the vector layer while dragging
+            // this.setVisibility(false);
+            // this will probably help for panning performances
+            return false;
+        }
+        
+        if ( zoomChanged ) {
+            if (this.vectorMode) {
+                this.renderer.clear();
+            }
+        }
+        
+    //DEPRECATED - REMOVE IN 3.0
+        // don't load data if current zoom level doesn't match
+        if (this.options.minZoomLevel) {
+            OpenLayers.Console.warn(OpenLayers.i18n('minZoomLevelError'));
+            
+            if (this.map.getZoom() < this.options.minZoomLevel) {
+                return null;
+            }
+        }
+        
+        if (bounds == null) {
+            bounds = this.map.getExtent();
+        }
+
+        var firstRendering = (this.tile == null);
+
+        //does the new bounds to which we need to move fall outside of the 
+        // current tile's bounds?
+        var outOfBounds = (!firstRendering &&
+                           !this.tile.bounds.containsBounds(bounds));
+
+        if (zoomChanged || firstRendering || (!dragging && outOfBounds)) {
+            //determine new tile bounds
+            var center = bounds.getCenterLonLat();
+            var tileWidth = bounds.getWidth() * this.ratio;
+            var tileHeight = bounds.getHeight() * this.ratio;
+            var tileBounds = 
+                new OpenLayers.Bounds(center.lon - (tileWidth / 2),
+                                      center.lat - (tileHeight / 2),
+                                      center.lon + (tileWidth / 2),
+                                      center.lat + (tileHeight / 2));
+
+            //determine new tile size
+            var tileSize = this.map.getSize();
+            tileSize.w = tileSize.w * this.ratio;
+            tileSize.h = tileSize.h * this.ratio;
+
+            //determine new position (upper left corner of new bounds)
+            var ul = new OpenLayers.LonLat(tileBounds.left, tileBounds.top);
+            var pos = this.map.getLayerPxFromLonLat(ul);
+
+            //formulate request url string
+            var url = this.getFullRequestString();
+        
+            var params = null;
+
+            // Cant combine "filter" and "BBOX". This is a cheap hack to help
+            // people out who can't migrate to the WFS protocol immediately.
+            var filter = this.params.filter || this.params.FILTER;
+            if (filter) {
+                params = {FILTER: filter};
+            }
+            else {
+                params = {BBOX: this.encodeBBOX ? tileBounds.toBBOX() 
+                                                    : tileBounds.toArray()};
+            }
+            
+            if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
+                var projectedBounds = tileBounds.clone();
+                projectedBounds.transform(this.map.getProjectionObject(), 
+                                          this.projection);
+                if (!filter){
+                    params.BBOX = this.encodeBBOX ? projectedBounds.toBBOX() 
+                                                : projectedBounds.toArray();
+                }
+            }                                  
+
+            url += "&" + OpenLayers.Util.getParameterString(params);
+
+            if (!this.tile) {
+                this.tile = new OpenLayers.Tile.WFS(this, pos, tileBounds, 
+                                                     url, tileSize);
+                this.addTileMonitoringHooks(this.tile);
+                this.tile.draw();
+            } else {
+                if (this.vectorMode) {
+                    this.destroyFeatures();
+                    this.renderer.clear();
+                } else {
+                    this.clearMarkers();
+                }    
+                this.removeTileMonitoringHooks(this.tile);
+                this.tile.destroy();
+                
+                this.tile = null;
+                this.tile = new OpenLayers.Tile.WFS(this, pos, tileBounds, 
+                                                     url, tileSize);
+                this.addTileMonitoringHooks(this.tile);
+                this.tile.draw();
+            } 
+        }
+    },
+
+    /** 
+     * Method: addTileMonitoringHooks
+     * 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 tile
+     *     (making sure to check that the tile is always the layer's current
+     *     tile before taking any action).
+     * 
+     * Parameters: 
+     * tile - {<OpenLayers.Tile>}
+     */
+    addTileMonitoringHooks: function(tile) {
+        tile.onLoadStart = function() {
+            //if this is the the layer's current tile, then trigger 
+            // a 'loadstart'
+            if (this == this.layer.tile) {
+                this.layer.events.triggerEvent("loadstart");
+            }
+        };
+        tile.events.register("loadstart", tile, tile.onLoadStart);
+      
+        tile.onLoadEnd = function() {
+            //if this is the the layer's current tile, then trigger 
+            // a 'tileloaded' and 'loadend'
+            if (this == this.layer.tile) {
+                this.layer.events.triggerEvent("tileloaded");
+                this.layer.events.triggerEvent("loadend");
+            }
+        };
+        tile.events.register("loadend", tile, tile.onLoadEnd);
+        tile.events.register("unload", tile, tile.onLoadEnd);
+    },
+    
+    /** 
+     * Method: removeTileMonitoringHooks
+     * This function takes a tile as input and removes the tile hooks 
+     *     that were added in addTileMonitoringHooks()
+     * 
+     * Parameters: 
+     * tile - {<OpenLayers.Tile>}
+     */
+    removeTileMonitoringHooks: function(tile) {
+        tile.unload();
+        tile.events.un({
+            "loadstart": tile.onLoadStart,
+            "loadend": tile.onLoadEnd,
+            "unload": tile.onLoadEnd,
+            scope: tile
+        });
+    },
+
+    /**
+     * Method: onMapResize
+     * Call the onMapResize method of the appropriate parent class. 
+     */
+    onMapResize: function() {
+        if(this.vectorMode) {
+            OpenLayers.Layer.Vector.prototype.onMapResize.apply(this, 
+                                                                arguments);
+        } else {
+            OpenLayers.Layer.Markers.prototype.onMapResize.apply(this, 
+                                                                 arguments);
+        }
+    },
+    
+    /**
+     * Method: display
+     * Call the display method of the appropriate parent class. 
+     */
+    display: function() {
+        if(this.vectorMode) {
+            OpenLayers.Layer.Vector.prototype.display.apply(this, 
+                                                                arguments);
+        } else {
+            OpenLayers.Layer.Markers.prototype.display.apply(this, 
+                                                                 arguments);
+        }
+    },
+    
+    /**
+     * APIMethod: mergeNewParams
+     * Modify parameters for the layer and redraw.
+     * 
+     * Parameters:
+     * newParams - {Object}
+     */
+    mergeNewParams:function(newParams) {
+        var upperParams = OpenLayers.Util.upperCaseObject(newParams);
+        var newArguments = [upperParams];
+        return OpenLayers.Layer.HTTPRequest.prototype.mergeNewParams.apply(this, 
+                                                                 newArguments);
+    },
+
+    /**
+     * APIMethod: clone
+     *
+     * Parameters:
+     * obj - {Object} 
+     * 
+     * Returns:
+     * {<OpenLayers.Layer.WFS>} An exact clone of this OpenLayers.Layer.WFS
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.WFS(this.name,
+                                           this.url,
+                                           this.params,
+                                           this.getOptions());
+        }
+
+        //get all additions from superclasses
+        if (this.vectorMode) {
+            obj = OpenLayers.Layer.Vector.prototype.clone.apply(this, [obj]);
+        } else {
+            obj = OpenLayers.Layer.Markers.prototype.clone.apply(this, [obj]);
+        }    
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    },
+
+    /** 
+     * APIMethod: getFullRequestString
+     * 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 
+     *     works for now and always.
+     *
+     * Parameters:
+     * newParams - {Object} 
+     * altUrl - {String} Use this as the url instead of the layer's url
+     */
+    getFullRequestString:function(newParams, altUrl) {
+        var projectionCode = this.projection.getCode() || this.map.getProjection();
+        this.params.SRS = (projectionCode == "none") ? null : projectionCode;
+
+        return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(
+                                                    this, arguments);
+    },
+   
+    /**
+     * APIMethod: commit
+     * Write out the data to a WFS server.
+     */
+    commit: function() {
+        if (!this.writer) {
+            var options = {};
+            if (this.map && !this.projection.equals(this.map.getProjectionObject())) {
+                options.externalProjection = this.projection;
+                options.internalProjection = this.map.getProjectionObject();
+            }    
+            
+            this.writer = new OpenLayers.Format.WFS(options,this);
+        }
+
+        var data = this.writer.write(this.features);
+
+        OpenLayers.Request.POST({
+            url: this.url,
+            data: data,
+            success: this.commitSuccess,
+            failure: this.commitFailure,
+            scope: this
+        });
+    },
+
+    /**
+     * Method: commitSuccess
+     * Called when the Ajax request returns a response
+     *
+     * Parameters:
+     * response - {XmlNode} from server
+     */
+    commitSuccess: function(request) {
+        var response = request.responseText;
+        if (response.indexOf('SUCCESS') != -1) {
+            this.commitReport(OpenLayers.i18n("commitSuccess", {'response':response}));
+            
+            for(var i = 0; i < this.features.length; i++) {
+                this.features[i].state = null;
+            }    
+            // TBD redraw the layer or reset the state of features
+            // foreach features: set state to null
+        } else if (response.indexOf('FAILED') != -1 ||
+            response.indexOf('Exception') != -1) {
+            this.commitReport(OpenLayers.i18n("commitFailed", {'response':response}));
+        }
+    },
+    
+    /**
+     * Method: commitFailure
+     * Called when the Ajax request fails
+     *
+     * Parameters:
+     * response - {XmlNode} from server
+     */
+    commitFailure: function(request) {},
+    
+    /**
+     * APIMethod: commitReport 
+     * Called with a 'success' message if the commit succeeded, otherwise
+     *     a failure message, and the full request text as a second parameter.
+     *     Override this function to provide custom transaction reporting.
+     *
+     * string - {String} reporting string
+     * response - {String} full XML response
+     */
+    commitReport: function(string, response) {
+        OpenLayers.Console.userError(string);
+    },
+
+    
+    /**
+     * APIMethod: refresh
+     * Refreshes all the features of the layer
+     */
+    refresh: function() {
+        if (this.tile) {
+            if (this.vectorMode) {
+                this.renderer.clear();
+                this.features.length = 0;
+            } else {   
+                this.clearMarkers();
+                this.markers.length = 0;
+            }    
+            this.tile.draw();
+        }
+    },
+    
+    /** 
+     * APIMethod: getDataExtent
+     * Calculates the max extent which includes all of the layer data.
+     * 
+     * Returns:
+     * {<OpenLayers.Bounds>}
+     */
+    getDataExtent: function () {
+        var extent; 
+        //get all additions from superclasses
+        if (this.vectorMode) {
+            extent = OpenLayers.Layer.Vector.prototype.getDataExtent.apply(this);
+        } else {
+            extent = OpenLayers.Layer.Markers.prototype.getDataExtent.apply(this);
+        }    
+
+        return extent;
+    },
+    
+    /** 
+     * APIMethod: setOpacity 
+     * Call the setOpacity method of the appropriate parent class to set the
+     *     opacity.  
+     * 
+     * Parameter: 
+     * opacity - {Float} 
+     */
+    setOpacity: function (opacity) {
+        if (this.vectorMode) {
+            OpenLayers.Layer.Vector.prototype.setOpacity.apply(this, [opacity]);
+        } else {
+            OpenLayers.Layer.Markers.prototype.setOpacity.apply(this, [opacity]);
+        }    
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.WFS"
+});
diff --git a/lib/OpenLayers/Layer/WMS.js b/lib/OpenLayers/Layer/WMS.js
new file mode 100644
index 0000000..c35bd17
--- /dev/null
+++ b/lib/OpenLayers/Layer/WMS.js
@@ -0,0 +1,268 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ * @requires OpenLayers/Tile/Image.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.WMS
+ * 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>
+ */
+OpenLayers.Layer.WMS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+
+    /**
+     * Constant: DEFAULT_PARAMS
+     * {Object} Hashtable of default parameter key/value pairs 
+     */
+    DEFAULT_PARAMS: { service: "WMS",
+                      version: "1.1.1",
+                      request: "GetMap",
+                      styles: "",
+                      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. 
+     * {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 
+     *           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', 
+     * 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,
+    
+    /**
+     * Property: yx
+     * {Object} Keys in this object are EPSG codes for which the axis order
+     *     is to be reversed (yx instead of xy, LatLon instead of LonLat), with
+     *     true as value. This is only relevant for WMS versions >= 1.3.0.
+     */
+    yx: {'EPSG:4326': true},
+    
+    /**
+     * 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", 
+     *                                    {layers: "modis,global_mosaic"});
+     * (end)
+     *
+     * Parameters:
+     * name - {String} A name for the layer
+     * url - {String} Base url for the WMS
+     *                (e.g. http://wms.jpl.nasa.gov/wms.cgi)
+     * params - {Object} An object with key/value pairs representing the
+     *                   GetMap query string parameters and parameter values.
+     * options - {Ojbect} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, params, options) {
+        var newArguments = [];
+        //uppercase params
+        params = OpenLayers.Util.upperCaseObject(params);
+        if (parseFloat(params.VERSION) >= 1.3 && !params.EXCEPTIONS) {
+            params.EXCEPTIONS = "INIMAGE";
+        } 
+        newArguments.push(name, url, params, options);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
+        OpenLayers.Util.applyDefaults(
+                       this.params, 
+                       OpenLayers.Util.upperCaseObject(this.DEFAULT_PARAMS)
+                       );
+
+
+        //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 
+            //  format, depending on teh browser's capabilities
+            if (this.params.FORMAT == "image/jpeg") {
+                this.params.FORMAT = OpenLayers.Util.alphaHack() ? "image/gif"
+                                                                 : "image/png";
+            }
+        }
+
+    },    
+
+    /**
+     * Method: destroy
+     * Destroy this layer
+     */
+    destroy: function() {
+        // for now, nothing special to do here. 
+        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);  
+    },
+
+    
+    /**
+     * Method: clone
+     * Create a clone of this layer
+     *
+     * Returns:
+     * {<OpenLayers.Layer.WMS>} An exact clone of this layer
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.WMS(this.name,
+                                           this.url,
+                                           this.params,
+                                           this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    },    
+    
+    /**
+     * APIMethod: reverseAxisOrder
+     * Returns true if the axis order is reversed for the WMS version and
+     * projection of the layer.
+     * 
+     * Returns:
+     * {Boolean} true if the axis order is reversed, false otherwise.
+     */
+    reverseAxisOrder: function() {
+        return (parseFloat(this.params.VERSION) >= 1.3 && 
+            !!this.yx[this.map.getProjectionObject().getCode()]);
+    },
+    
+    /**
+     * Method: getURL
+     * Return a GetMap query string for this layer
+     *
+     * Parameters:
+     * 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 as 
+     *          parameters.
+     */
+    getURL: function (bounds) {
+        bounds = this.adjustBounds(bounds);
+        
+        var imageSize = this.getImageSize();
+        var newParams = {};
+        // WMS 1.3 introduced axis order
+        var reverseAxisOrder = this.reverseAxisOrder();
+        newParams.BBOX = this.encodeBBOX ?
+            bounds.toBBOX(null, reverseAxisOrder) :
+            bounds.toArray(reverseAxisOrder);
+        newParams.WIDTH = imageSize.w;
+        newParams.HEIGHT = imageSize.h;
+        var requestString = this.getFullRequestString(newParams);
+        return requestString;
+    },
+
+    /**
+     * Method: addTile
+     * 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, 
+                                         null, this.tileSize);
+    },
+
+    /**
+     * 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, 
+                                                             newArguments);
+    },
+
+    /** 
+     * APIMethod: getFullRequestString
+     * 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 
+     *     works for now and always.
+     *
+     * Parameters:
+     * newParams - {Object}
+     * altUrl - {String} Use this as the url instead of the layer's url
+     * 
+     * Returns:
+     * {String} 
+     */
+    getFullRequestString:function(newParams, altUrl) {
+        var projectionCode = this.map.getProjection();
+        var value = (projectionCode == "none") ? null : projectionCode
+        if (parseFloat(this.params.VERSION) >= 1.3) {
+            this.params.CRS = value;
+        } else {
+            this.params.SRS = value;
+        }
+
+        return OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(
+                                                    this, arguments);
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.WMS"
+});
diff --git a/lib/OpenLayers/Layer/WMS/Post.js b/lib/OpenLayers/Layer/WMS/Post.js
new file mode 100644
index 0000000..0758042
--- /dev/null
+++ b/lib/OpenLayers/Layer/WMS/Post.js
@@ -0,0 +1,99 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+ 
+/**
+ * @requires OpenLayers/Layer/WMS.js
+ * @requires OpenLayers/Tile/Image/IFrame.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.WMS.Post
+ * Instances of OpenLayers.Layer.WMS.Post are used to retrieve data from OGC
+ * Web Mapping Services via HTTP-POST (application/x-www-form-urlencoded). 
+ * Create a new WMS layer with the <OpenLayers.Layer.WMS.Post> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.WMS>
+ */
+OpenLayers.Layer.WMS.Post = OpenLayers.Class(OpenLayers.Layer.WMS, {
+
+    /**
+     * Property: tileClass
+     * {Object} Class, used to create tiles.
+     */
+    tileClass: null,
+
+    /**
+     * APIProperty: unsupportedBrowsers
+     * {Array} Array with browsers, which should use the HTTP-GET protocol 
+     * instead of HTTP-POST for fetching tiles from a WMS .
+     * Defaults to ["mozilla", "firefox", "opera"], because Opera is not able 
+     * to show transparent images in IFrames and Firefox/Mozilla has some ugly 
+     * effects of viewport-shaking when panning the map. Both browsers, Opera
+     * and Firefox/Mozilla, have no problem with long urls, which is the reason
+     * for using POST instead of GET. The strings to pass to this array are
+     * the ones returned by <OpenLayers.Util.getBrowserName()>.
+     */
+    unsupportedBrowsers: ["mozilla", "firefox", "opera"],
+
+    /**
+     * Property: SUPPORTED_TRANSITIONS
+     * {Array} 
+     * no supported transitions for this type of layer, because it is not
+     * possible to modify the initialized tiles (iframes)
+     */
+    SUPPORTED_TRANSITIONS: [],
+
+    /**
+     * Constructor: OpenLayers.Layer.WMS.Post
+     * Creates a new WMS layer object.
+     *
+     * Example:
+     * (code)
+     * var wms = new OpenLayers.Layer.WMS.Post(
+     *  "NASA Global Mosaic",
+     *  "http://wms.jpl.nasa.gov/wms.cgi",
+     *  {layers: "modis, global_mosaic"});
+     * (end)
+     *
+     * Parameters:
+     * name - {String} A name for the layer
+     * url - {String} Base url for the WMS
+     *                (e.g. http://wms.jpl.nasa.gov/wms.cgi)
+     * params - {Object} An object with key/value pairs representing the
+     *                   GetMap query string parameters and parameter values.
+     * options - {Object} Hashtable of extra options to tag onto the layer.
+     */
+    initialize: function(name, url, params, options) {
+        var newArguments = [];
+        newArguments.push(name, url, params, options);
+        OpenLayers.Layer.WMS.prototype.initialize.apply(this, newArguments);
+
+        this.tileClass = OpenLayers.Util.indexOf(
+            this.unsupportedBrowsers, OpenLayers.Util.getBrowserName()) != -1
+                ? OpenLayers.Tile.Image
+                : OpenLayers.Tile.Image.IFrame;
+    },
+    
+    /**
+     * Method: addTile
+     * addTile creates a tile, initializes it and adds it as iframe to the
+     * layer div.
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     * position - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {<OpenLayers.Tile.Image.IFrame>} The added OpenLayers.Tile.Image.IFrame
+     */
+    addTile: function(bounds,position) {
+        return new this.tileClass(
+            this, position, bounds, null, this.tileSize);
+    },
+
+    CLASS_NAME: 'OpenLayers.Layer.WMS.Post'
+});
diff --git a/lib/OpenLayers/Layer/WMS/Untiled.js b/lib/OpenLayers/Layer/WMS/Untiled.js
new file mode 100644
index 0000000..c40860c
--- /dev/null
+++ b/lib/OpenLayers/Layer/WMS/Untiled.js
@@ -0,0 +1,72 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+ 
+/**
+ * @requires OpenLayers/Layer/WMS.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.WMS.Untiled
+ * *Deprecated*.  To be removed in 3.0.  Instead use OpenLayers.Layer.WMS and 
+ *     pass the option 'singleTile' as true.
+ * 
+ * Inherits from: 
+ *  - <OpenLayers.Layer.WMS>
+ */
+OpenLayers.Layer.WMS.Untiled = OpenLayers.Class(OpenLayers.Layer.WMS, {
+
+    /**
+     * APIProperty: singleTile
+     * {singleTile} Always true for untiled.
+     */
+    singleTile: true,
+
+    /**
+     * Constructor: OpenLayers.Layer.WMS.Untiled
+     *
+     * Parameters:
+     * name - {String} 
+     * url - {String} 
+     * params - {Object} 
+     * options - {Object} 
+     */
+    initialize: function(name, url, params, options) {
+        OpenLayers.Layer.WMS.prototype.initialize.apply(this, arguments);
+        
+        var msg = "The OpenLayers.Layer.WMS.Untiled class is deprecated and " +
+                  "will be removed in 3.0. Instead, you should use the " +
+                  "normal OpenLayers.Layer.WMS class, passing it the option " +
+                  "'singleTile' as true.";
+        OpenLayers.Console.warn(msg);
+    },    
+
+    /**
+     * Method: clone
+     * Create a clone of this layer
+     *
+     * Returns:
+     * {<OpenLayers.Layer.WMS.Untiled>} An exact clone of this layer
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.WMS.Untiled(this.name,
+                                                   this.url,
+                                                   this.params,
+                                                   this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.WMS.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    }, 
+
+    CLASS_NAME: "OpenLayers.Layer.WMS.Untiled"
+});
diff --git a/lib/OpenLayers/Layer/WMTS.js b/lib/OpenLayers/Layer/WMTS.js
new file mode 100644
index 0000000..c1ec099
--- /dev/null
+++ b/lib/OpenLayers/Layer/WMTS.js
@@ -0,0 +1,476 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ * @requires OpenLayers/Tile/Image.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.WMTS
+ * Instances of the WMTS class allow viewing of tiles from a service that 
+ *     implements the OGC WMTS specification version 1.0.0.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.WMTS = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean} The layer will be considered a base layer.  Default is true.
+     */
+    isBaseLayer: true,
+
+    /**
+     * Property: version
+     * {String} WMTS version.  Default is "1.0.0".
+     */
+    version: "1.0.0",
+    
+    /**
+     * APIProperty: requestEncoding
+     * {String} Request encoding.  Can be "REST" or "KVP".  Default is "KVP".
+     */
+    requestEncoding: "KVP",
+    
+    /**
+     * APIProperty: url
+     * {String} The base URL for the WMTS service.  Must be provided.
+     */
+    url: null,
+
+    /**
+     * APIProperty: layer
+     * {String} The layer identifier advertised by the WMTS service.  Must be 
+     *     provided.
+     */
+    layer: null,
+    
+    /** 
+     * APIProperty: matrixSet
+     * {String} One of the advertised matrix set identifiers.  Must be provided.
+     */
+    matrixSet: null,
+
+    /** 
+     * APIProperty: style
+     * {String} One of the advertised layer styles.  Must be provided.
+     */
+    style: null,
+    
+    /** 
+     * APIProperty: format
+     * {String} The image MIME type.  Default is "image/jpeg".
+     */
+    format: "image/jpeg",
+    
+    /**
+     * APIProperty: tileOrigin
+     * {<OpenLayers.LonLat>} The top-left corner of the tile matrix in map 
+     *     units.  If the tile origin for each matrix in a set is different,
+     *     the <matrixIds> should include a topLeftCorner property.  If
+     *     not provided, the tile origin will default to the top left corner
+     *     of the layer <maxExtent>.
+     */
+    tileOrigin: null,
+    
+    /**
+     * APIProperty: tileFullExtent
+     * {<OpenLayers.Bounds>}  The full extent of the tile set.  If not supplied,
+     *     the layer's <maxExtent> property will be used.
+     */
+    tileFullExtent: null,
+
+    /**
+     * APIProperty: formatSuffix
+     * {String} For REST request encoding, an image format suffix must be 
+     *     included in the request.  If not provided, the suffix will be derived
+     *     from the <format> property.
+     */
+    formatSuffix: null,    
+
+    /**
+     * APIProperty: matrixIds
+     * {Array} A list of tile matrix identifiers.  If not provided, the matrix
+     *     identifiers will be assumed to be integers corresponding to the 
+     *     map zoom level.  If a list of strings is provided, each item should
+     *     be the matrix identifier that corresponds to the map zoom level.
+     *     Additionally, a list of objects can be provided.  Each object should
+     *     describe the matrix as presented in the WMTS capabilities.  These
+     *     objects should have the propertes shown below.
+     * 
+     * Matrix properties:
+     * identifier - {String} The matrix identifier (required).
+     * topLeftCorner - {<OpenLayers.LonLat>} The top left corner of the 
+     *     matrix.  Must be provided if different than the layer <tileOrigin>.
+     * tileWidth - {Number} The tile width for the matrix.  Must be provided 
+     *     if different than the width given in the layer <tileSize>.
+     * tileHeight - {Number} The tile height for the matrix.  Must be provided 
+     *     if different than the height given in the layer <tileSize>.
+     */
+    matrixIds: null,
+    
+    /**
+     * APIProperty: dimensions
+     * {Array} For RESTful request encoding, extra dimensions may be specified.
+     *     Items in this list should be property names in the <params> object.
+     *     Values of extra dimensions will be determined from the corresponding
+     *     values in the <params> object.
+     */
+    dimensions: null,
+    
+    /**
+     * APIProperty: params
+     * {Object} Extra parameters to include in tile requests.  For KVP 
+     *     <requestEncoding>, these properties will be encoded in the request 
+     *     query string.  For REST <requestEncoding>, these properties will
+     *     become part of the request path, with order determined by the 
+     *     <dimensions> list.
+     */
+    params: null,
+    
+    /**
+     * APIProperty: zoomOffset
+     * {Number} If your cache has more levels than you want to provide
+     *     access to with this layer, supply a zoomOffset.  This zoom offset
+     *     is added to the current map zoom level to determine the level
+     *     for a requested tile.  For example, if you supply a zoomOffset
+     *     of 3, when the map is at the zoom 0, tiles will be requested from
+     *     level 3 of your cache.  Default is 0 (assumes cache level and map
+     *     zoom are equivalent).  Additionally, if this layer is to be used
+     *     as an overlay and the cache has fewer zoom levels than the base
+     *     layer, you can supply a negative zoomOffset.  For example, if a
+     *     map zoom level of 1 corresponds to your cache level zero, you would
+     *     supply a -1 zoomOffset (and set the maxResolution of the layer
+     *     appropriately).  The zoomOffset value has no effect if complete
+     *     matrix definitions (including scaleDenominator) are supplied in
+     *     the <matrixIds> property.  Defaults to 0 (no zoom offset).
+     */
+    zoomOffset: 0,
+    
+    /**
+     * Property: formatSuffixMap
+     * {Object} a map between WMTS 'format' request parameter and tile image file suffix
+     */
+    formatSuffixMap: {
+        "image/png": "png",
+        "image/png8": "png",
+        "image/png24": "png",
+        "image/png32": "png",
+        "png": "png",
+        "image/jpeg": "jpg",
+        "image/jpg": "jpg",
+        "jpeg": "jpg",
+        "jpg": "jpg"
+    },
+    
+    /**
+     * Property: matrix
+     * {Object} Matrix definition for the current map resolution.  Updated by
+     *     the <updateMatrixProperties> method.
+     */
+    matrix: null,
+    
+    /**
+     * Constructor: OpenLayers.Layer.WMTS
+     * Create a new WMTS layer.
+     *
+     * Example:
+     * (code)
+     * var wmts = new OpenLayers.Layer.WMTS({
+     *     name: "My WMTS Layer",
+     *     url: "http://example.com/wmts", 
+     *     layer: "layer_id",
+     *     style: "default",
+     *     matrixSet: "matrix_id"
+     * });
+     * (end)
+     *
+     * Parameters:
+     * config - {Object} Configuration properties for the layer.
+     *
+     * Required configuration properties:
+     * url - {String} The base url for the service.  See the <url> property.
+     * layer - {String} The layer identifier.  See the <layer> property.
+     * style - {String} The layer style identifier.  See the <style> property.
+     * matrixSet - {String} The tile matrix set identifier.  See the <matrixSet>
+     *     property.
+     *
+     * Any other documented layer properties can be provided in the config object.
+     */
+    initialize: function(config) {
+
+        // confirm required properties are supplied
+        var required = {
+            url: true,
+            layer: true,
+            style: true,
+            matrixSet: true
+        };
+        for (var prop in required) {
+            if (!(prop in config)) {
+                throw new Error("Missing property '" + prop + "' in layer configuration.");
+            }
+        }
+
+        config.params = OpenLayers.Util.upperCaseObject(config.params);
+        var args = [config.name, config.url, config.params, config];
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, args);
+        
+
+        // determine format suffix (for REST)
+        if (!this.formatSuffix) {
+            this.formatSuffix = this.formatSuffixMap[this.format] || this.format.split("/").pop();            
+        }
+
+        // expand matrixIds (may be array of string or array of object)
+        if (this.matrixIds) {
+            var len = this.matrixIds.length;
+            if (len && typeof this.matrixIds[0] === "string") {
+                var ids = this.matrixIds;
+                this.matrixIds = new Array(len);
+                for (var i=0; i<len; ++i) {
+                    this.matrixIds[i] = {identifier: ids[i]};
+                }
+            }
+        }
+
+    },
+    
+    /**
+     * Method: setMap
+     */
+    setMap: function() {
+        OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments);
+        this.updateMatrixProperties();
+    },
+    
+    /**
+     * Method: updateMatrixProperties
+     * Called when map resolution changes to update matrix related properties.
+     */
+    updateMatrixProperties: function() {
+        this.matrix = this.getMatrix();
+        if (this.matrix) {
+            if (this.matrix.topLeftCorner) {
+                this.tileOrigin = this.matrix.topLeftCorner;
+            }
+            if (this.matrix.tileWidth && this.matrix.tileHeight) {
+                this.tileSize = new OpenLayers.Size(
+                    this.matrix.tileWidth, this.matrix.tileHeight
+                );
+            }
+            if (!this.tileOrigin) { 
+                this.tileOrigin = new OpenLayers.LonLat(
+                    this.maxExtent.left, this.maxExtent.top
+                );
+            }   
+            if (!this.tileFullExtent) { 
+                this.tileFullExtent = this.maxExtent;
+            }
+        }
+    },
+    
+    /**
+     * Method: moveTo
+     * 
+     * Parameters:
+     * bound - {<OpenLayers.Bounds>}
+     * zoomChanged - {Boolean} Tells when zoom has changed, as layers have to
+     *     do some init work in that case.
+     * dragging - {Boolean}
+     */
+    moveTo:function(bounds, zoomChanged, dragging) {
+        if (zoomChanged || !this.matrix) {
+            this.updateMatrixProperties();
+        }
+        return OpenLayers.Layer.Grid.prototype.moveTo.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: clone
+     * 
+     * Parameters:
+     * obj - {Object}
+     * 
+     * Returns:
+     * {<OpenLayers.Layer.WMTS>} An exact clone of this <OpenLayers.Layer.WMTS>
+     */
+    clone: function(obj) {
+        if (obj == null) {
+            obj = new OpenLayers.Layer.WMTS(this.options);
+        }
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+        // copy/set any non-init, non-simple values here
+        return obj;
+    },
+    
+    /**
+     * Method: getMatrix
+     * Get the appropriate matrix definition for the current map resolution.
+     */
+    getMatrix: function() {
+        var matrix;
+        if (!this.matrixIds || this.matrixIds.length === 0) {
+            matrix = {identifier: this.map.getZoom() + this.zoomOffset};
+        } else {
+            // get appropriate matrix given the map scale if possible
+            if ("scaleDenominator" in this.matrixIds[0]) {
+                // scale denominator calculation based on WMTS spec
+                var denom = 
+                    OpenLayers.METERS_PER_INCH * 
+                    OpenLayers.INCHES_PER_UNIT[this.units] * 
+                    this.map.getResolution() / 0.28E-3;
+                var diff = Number.POSITIVE_INFINITY;
+                var delta;
+                for (var i=0, ii=this.matrixIds.length; i<ii; ++i) {
+                    delta = Math.abs(1 - (this.matrixIds[i].scaleDenominator / denom));
+                    if (delta < diff) {
+                        diff = delta;
+                        matrix = this.matrixIds[i];
+                    }
+                }
+            } else {
+                // fall back on zoom as index
+                matrix = this.matrixIds[this.map.getZoom() + this.zoomOffset];
+            }
+        }
+        return matrix;
+    },
+    
+    /** 
+     * Method: getTileInfo
+     * Get tile information for a given location at the current map resolution.
+     *
+     * Parameters:
+     * loc - {<OpenLayers.LonLat} A location in map coordinates.
+     *
+     * Returns:
+     * {Object} An object with "col", "row", "i", and "j" properties.  The col
+     *     and row values are zero based tile indexes from the top left.  The
+     *     i and j values are the number of pixels to the left and top 
+     *     (respectively) of the given location within the target tile.
+     */
+    getTileInfo: function(loc) {
+        var res = this.map.getResolution();
+        
+        var fx = (loc.lon - this.tileOrigin.lon) / (res * this.tileSize.w);
+        var fy = (this.tileOrigin.lat - loc.lat) / (res * this.tileSize.h);
+
+        var col = Math.floor(fx);
+        var row = Math.floor(fy);
+        
+        return {
+            col: col, 
+            row: row,
+            i: Math.floor((fx - col) * this.tileSize.w),
+            j: Math.floor((fy - row) * this.tileSize.h)
+        };
+    },
+    
+    /**
+     * Method: getURL
+     * 
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     * 
+     * Returns:
+     * {String} A URL for the tile corresponding to the given bounds.
+     */
+    getURL: function(bounds) {
+        bounds = this.adjustBounds(bounds);
+        var url = "";
+        if (!this.tileFullExtent || this.tileFullExtent.intersectsBounds(bounds)) {            
+
+            var center = bounds.getCenterLonLat();            
+            var info = this.getTileInfo(center);
+            var matrixId = this.matrix.identifier;
+
+            if (this.requestEncoding.toUpperCase() === "REST") {
+
+                // include 'version', 'layer' and 'style' in tile resource url
+                var path = this.version + "/" + this.layer + "/" + this.style + "/";
+
+                // append optional dimension path elements
+                if (this.dimensions) {
+                    for (var i=0; i<this.dimensions.length; i++) {
+                        if (this.params[this.dimensions[i]]) {
+                            path = path + this.params[this.dimensions[i]] + "/";
+                        }
+                    }
+                }
+
+                // append other required path elements
+                path = path + this.matrixSet + "/" + this.matrix.identifier + 
+                    "/" + info.row + "/" + info.col + "." + this.formatSuffix;
+                
+                if (this.url instanceof Array) {
+                    url = this.selectUrl(path, this.url);
+                } else {
+                    url = this.url;
+                }
+                if (!url.match(/\/$/)) {
+                    url = url + "/";
+                }
+                url = url + path;
+
+            } else if (this.requestEncoding.toUpperCase() === "KVP") {
+
+                // assemble all required parameters
+                var params = {
+                    SERVICE: "WMTS",
+                    REQUEST: "GetTile",
+                    VERSION: this.version,
+                    LAYER: this.layer,
+                    STYLE: this.style,
+                    TILEMATRIXSET: this.matrixSet,
+                    TILEMATRIX: this.matrix.identifier,
+                    TILEROW: info.row,
+                    TILECOL: info.col,
+                    FORMAT: this.format
+                };
+                url = OpenLayers.Layer.Grid.prototype.getFullRequestString.apply(this, [params]);
+
+            }
+        }
+        return url;    
+    },
+    
+    /**
+     * APIMethod: mergeNewParams
+     * Extend the existing layer <params> with new properties.  Tiles will be
+     *     reloaded with updated params in the request.
+     * 
+     * Parameters:
+     * newParams - {Object} Properties to extend to existing <params>.
+     */
+    mergeNewParams: function(newParams) {
+        if (this.requestEncoding.toUpperCase() === "KVP") {
+            return OpenLayers.Layer.Grid.prototype.mergeNewParams.apply(
+                this, [OpenLayers.Util.upperCaseObject(newParams)]
+            );
+        }
+    },
+
+    /**
+     * Method: addTile
+     * Create a tile, initialize it, and add 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, 
+                                         null, this.tileSize);
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.WMTS"
+});
diff --git a/lib/OpenLayers/Layer/WorldWind.js b/lib/OpenLayers/Layer/WorldWind.js
new file mode 100644
index 0000000..f281cb7
--- /dev/null
+++ b/lib/OpenLayers/Layer/WorldWind.js
@@ -0,0 +1,120 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.WorldWind
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.WorldWind = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    
+    DEFAULT_PARAMS: {
+    },
+
+    /**
+     * APIProperty: isBaseLayer
+     * WorldWind layer is a base layer by default.
+     */
+    isBaseLayer: true,    
+
+    
+    /** 
+     * APIProperty: lzd
+     * LevelZeroTileSizeDegrees
+     */
+    lzd: null,
+
+    /**
+     * APIProperty: zoomLevels
+     * Number of zoom levels.
+     */
+    zoomLevels: null,
+    
+    /**
+     * Constructor: OpenLayers.Layer.WorldWind
+     * 
+     * Parameters:
+     * name - {String} Name of Layer
+     * url - {String} Base URL  
+     * lzd - {Float} Level zero tile size degrees 
+     * zoomLevels - {Int} number of zoom levels
+     * params - {Object} additional parameters
+     * options - {Object} additional options
+     */
+    initialize: function(name, url, lzd, zoomLevels, params, options) {
+        this.lzd = lzd;
+        this.zoomLevels = zoomLevels;
+        var newArguments = [];
+        newArguments.push(name, url, params, options);
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
+        this.params = OpenLayers.Util.applyDefaults(
+            this.params, this.DEFAULT_PARAMS
+        );
+    },
+    /**
+     * Method: addTile
+     * 
+     * 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, 
+                                             null, this.tileSize);
+    },
+
+    /**
+     * Method: getZoom
+     * Convert map zoom to WW zoom.
+     */
+    getZoom: function () {
+        var zoom = this.map.getZoom();
+        var extent = this.map.getMaxExtent();
+        zoom = zoom - Math.log(this.maxResolution / (this.lzd/512))/Math.log(2);
+        return zoom;
+    },
+
+    /**
+     * Method: getURL
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} 
+     *
+     * Returns:
+     * {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);
+        var zoom = this.getZoom();
+        var extent = this.map.getMaxExtent();
+        var deg = this.lzd/Math.pow(2,this.getZoom());
+        var x = Math.floor((bounds.left - extent.left)/deg);
+        var y = Math.floor((bounds.bottom - extent.bottom)/deg);
+        if (this.map.getResolution() <= (this.lzd/512)
+            && this.getZoom() <= this.zoomLevels) {
+            return this.getFullRequestString(
+              { L: zoom, 
+                X: x,
+                Y: y
+              });
+        } else {
+            return OpenLayers.Util.getImagesLocation() + "blank.gif";
+        }
+
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.WorldWind"
+});
diff --git a/lib/OpenLayers/Layer/XYZ.js b/lib/OpenLayers/Layer/XYZ.js
new file mode 100644
index 0000000..6aba72f
--- /dev/null
+++ b/lib/OpenLayers/Layer/XYZ.js
@@ -0,0 +1,196 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ * @requires OpenLayers/Tile/Image.js
+ */
+
+/** 
+ * Class: OpenLayers.Layer.XYZ
+ * The XYZ class is designed to make it easier for people who have tiles
+ * arranged by a standard XYZ grid. 
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.XYZ = OpenLayers.Class(OpenLayers.Layer.Grid, {
+    
+    /**
+     * APIProperty: isBaseLayer
+     * Default is true, as this is designed to be a base tile source. 
+     */
+    isBaseLayer: true,
+    
+    /**
+     * APIProperty: sphericalMecator
+     * Whether the tile extents should be set to the defaults for 
+     *    spherical mercator. Useful for things like OpenStreetMap.
+     *    Default is false, except for the OSM subclass.
+     */
+    sphericalMercator: false,
+
+    /**
+     * APIProperty: zoomOffset
+     * {Number} If your cache has more zoom levels than you want to provide
+     *     access to with this layer, supply a zoomOffset.  This zoom offset
+     *     is added to the current map zoom level to determine the level
+     *     for a requested tile.  For example, if you supply a zoomOffset
+     *     of 3, when the map is at the zoom 0, tiles will be requested from
+     *     level 3 of your cache.  Default is 0 (assumes cache level and map
+     *     zoom are equivalent).
+     */
+    zoomOffset: 0,
+    
+    /**
+     * Constructor: OpenLayers.Layer.XYZ
+     *
+     * Parameters:
+     * name - {String}
+     * url - {String}
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, options) {
+        if (options && options.sphericalMercator || this.sphericalMercator) {
+            options = OpenLayers.Util.extend({
+                maxExtent: new OpenLayers.Bounds(
+                    -128 * 156543.0339,
+                    -128 * 156543.0339,
+                    128 * 156543.0339,
+                    128 * 156543.0339
+                ),
+                maxResolution: 156543.0339,
+                numZoomLevels: 19,
+                units: "m",
+                projection: "EPSG:900913"
+            }, options);
+        }
+        url = url || this.url;
+        name = name || this.name;
+        var newArguments = [name, url, {}, options];
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
+    },
+    
+    /**
+     * APIMethod: clone
+     * Create a clone of this layer
+     *
+     * Parameters:
+     * obj - {Object} Is this ever used?
+     * 
+     * Returns:
+     * {<OpenLayers.Layer.XYZ>} An exact clone of this OpenLayers.Layer.XYZ
+     */
+    clone: function (obj) {
+        
+        if (obj == null) {
+            obj = new OpenLayers.Layer.XYZ(this.name,
+                                            this.url,
+                                            this.getOptions());
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        return obj;
+    },    
+
+    /**
+     * Method: getUrl
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     *
+     * Returns:
+     * {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) {
+        var res = this.map.getResolution();
+        var x = Math.round((bounds.left - this.maxExtent.left) 
+            / (res * this.tileSize.w));
+        var y = Math.round((this.maxExtent.top - bounds.top) 
+            / (res * this.tileSize.h));
+        var z = this.map.getZoom() + this.zoomOffset;
+
+        var url = this.url;
+        var s = '' + x + y + z;
+        if (url instanceof Array)
+        {
+            url = this.selectUrl(s, url);
+        }
+        
+        var path = OpenLayers.String.format(url, {'x': x, 'y': y, 'z': z});
+
+        return path;
+    },
+    
+    /**
+     * Method: addTile
+     * 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, 
+                                         null, this.tileSize);
+    },
+     
+    /* APIMethod: setMap
+     * When the layer is added to a map, then we can fetch our origin 
+     *    (if we don't have one.) 
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    setMap: function(map) {
+        OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments);
+        if (!this.tileOrigin) { 
+            this.tileOrigin = new OpenLayers.LonLat(this.maxExtent.left,
+                                                this.maxExtent.bottom);
+        }                                       
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.XYZ"
+});
+
+
+/**
+ * Class: OpenLayers.Layer.OSM
+ * A class to access OpenStreetMap tiles. By default, uses the OpenStreetMap
+ *    hosted tile.openstreetmap.org 'Mapnik' tileset. If you wish to use
+ *    tiles at home / osmarender layer instead, you can pass a layer like:
+ * 
+ * (code)
+ *     new OpenLayers.Layer.OSM("t at h", 
+ *       "http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png"); 
+ * (end)
+ *
+ * This layer defaults to Spherical Mercator.
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Layer.XYZ>
+ */
+OpenLayers.Layer.OSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {
+     name: "OpenStreetMap",
+     attribution: "Data CC-By-SA by <a href='http://openstreetmap.org/'>OpenStreetMap</a>",
+     sphericalMercator: true,
+     url: 'http://tile.openstreetmap.org/${z}/${x}/${y}.png',
+     clone: function(obj) {
+         if (obj == null) {
+             obj = new OpenLayers.Layer.OSM(
+                 this.name, this.url, this.getOptions());
+         }
+         obj = OpenLayers.Layer.XYZ.prototype.clone.apply(this, [obj]);
+         return obj;
+     },
+     CLASS_NAME: "OpenLayers.Layer.OSM"
+});
diff --git a/lib/OpenLayers/Layer/Yahoo.js b/lib/OpenLayers/Layer/Yahoo.js
new file mode 100644
index 0000000..1f0b375
--- /dev/null
+++ b/lib/OpenLayers/Layer/Yahoo.js
@@ -0,0 +1,430 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Layer/SphericalMercator.js
+ * @requires OpenLayers/Layer/EventPane.js
+ * @requires OpenLayers/Layer/FixedZoomLevels.js
+ */
+
+/**
+ * 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 
+     */
+    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, 
+        0.0439453125,
+        0.02197265625, 
+        0.010986328125, 
+        0.0054931640625, 
+        0.00274658203125, 
+        0.001373291015625, 
+        0.0006866455078125, 
+        0.00034332275390625, 
+        0.000171661376953125, 
+        0.0000858306884765625, 
+        0.00004291534423828125,
+        0.00002145767211914062,
+        0.00001072883605957031
+    ],
+
+    /**
+     * APIProperty: type
+     * {YahooMapType}
+     */
+    type: null,
+    
+    /**
+     * APIProperty: wrapDateLine
+     * {Boolean} Allow user to pan forever east/west.  Default is true.  
+     *     Setting this to false only restricts panning if 
+     *     <sphericalMercator> is true. 
+     */
+    wrapDateLine: true,
+
+    /**
+     * 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. 
+     */
+    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, 
+                                                                    arguments);
+        if(this.sphericalMercator) {
+            OpenLayers.Util.extend(this, OpenLayers.Layer.SphericalMercator);
+            this.initMercatorParameters();
+        }
+    },
+    
+    /**
+     * Method: loadMapObject
+     */
+    loadMapObject:function() {
+        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 || 
+                 (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) {}     
+    },    
+    
+    
+    /** 
+     * 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 
+     *     once the map has been loaded and centered.
+     * 
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    setMap: function(map) {
+        OpenLayers.Layer.EventPane.prototype.setMap.apply(this, arguments);
+
+        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.
+     */
+    fixYahooEventPane: function() {
+        var yahooEventPane = OpenLayers.Util.getElement("ygddfdiv");
+        if (yahooEventPane != null) {
+            if (yahooEventPane.parentNode != null) {
+                yahooEventPane.parentNode.removeChild(yahooEventPane);
+            }
+            this.map.events.unregister("moveend", this, 
+                                       this.fixYahooEventPane);
+        }
+    },
+
+    /** 
+     * APIMethod: getWarningHTML
+     * 
+     * Returns: 
+     * {String} String with information on why layer is broken, how to get
+     *          it working.
+     */
+    getWarningHTML:function() {
+        return OpenLayers.i18n(
+            "getLayerWarning", {'layerType':'Yahoo', 'layerLib':'Yahoo'}
+        );
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*             Translation Functions                    */
+  /*                                                      */
+  /*    The following functions translate GMaps and OL    */ 
+  /*     formats for Pixel, LonLat, Bounds, and Zoom      */
+  /*                                                      */
+  /********************************************************/
+
+
+  //
+  // 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.
+     */
+    getOLZoomFromMapObjectZoom: function(moZoom) {
+        var zoom = null;
+        if (moZoom != null) {
+            zoom = OpenLayers.Layer.FixedZoomLevels.prototype.getOLZoomFromMapObjectZoom.apply(this, [moZoom]);
+            zoom = 18 - zoom;
+        }
+        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; 
+        if (olZoom != null) {
+            zoom = OpenLayers.Layer.FixedZoomLevels.prototype.getMapObjectZoomFromOLZoom.apply(this, [olZoom]);
+            zoom = 18 - zoom;
+        }
+        return zoom;
+    },
+
+    /************************************
+     *                                  *
+     *   MapObject Interface Controls   *
+     *                                  *
+     ************************************/
+
+
+  // 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); 
+    },
+   
+    /**
+     * APIMethod: getMapObjectCenter
+     * 
+     * Returns: 
+     * {Object} The mapObject's current center in Map Object format
+     */
+    getMapObjectCenter: function() {
+        return this.mapObject.getCenterLatLon();
+    },
+
+    /**
+     * APIMethod: dragPanMapObject
+     * 
+     * Parameters:
+     * dX - {Integer}
+     * dY - {Integer}
+     */
+    dragPanMapObject: function(dX, dY) {
+        this.mapObject.moveByXY({
+            'x': -dX,
+            'y': dY
+        });
+    },
+    
+    /** 
+     * APIMethod: getMapObjectZoom
+     * 
+     * Returns:
+     * {Integer} The mapObject's current zoom, in Map Object format
+     */
+    getMapObjectZoom: function() {
+        return this.mapObject.getZoomLevel();
+    },
+
+
+  // LonLat - Pixel Translation
+  
+    /**
+     * APIMethod: getMapObjectLonLatFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Object} MapObject LonLat translated from MapObject Pixel
+     */
+    getMapObjectLonLatFromMapObjectPixel: function(moPixel) {
+        return this.mapObject.convertXYLatLon(moPixel);
+    },
+
+    /**
+     * APIMethod: getMapObjectPixelFromMapObjectLonLat
+     * 
+     * Parameters:
+     * moLonLat - {Object} MapObject LonLat format
+     * 
+     * Returns:
+     * {Object} MapObject Pixel transtlated from MapObject LonLat
+     */
+    getMapObjectPixelFromMapObjectLonLat: function(moLonLat) {
+        return this.mapObject.convertLatLonXY(moLonLat);
+    },
+
+
+    /************************************
+     *                                  *
+     *       MapObject Primitives       *
+     *                                  *
+     ************************************/
+
+
+  // LonLat
+    
+    /**
+     * APIMethod: getLongitudeFromMapObjectLonLat
+     * 
+     * Parameters:
+     * moLonLat - {Object} MapObject LonLat format
+     * 
+     * Returns:
+     * {Float} Longitude of the given MapObject LonLat
+     */
+    getLongitudeFromMapObjectLonLat: function(moLonLat) {
+        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 ? 
+            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
+     */
+    getMapObjectLonLatFromLonLat: function(lon, lat) {
+        var yLatLong;
+        if(this.sphericalMercator) {
+            var lonlat = this.inverseMercator(lon, lat);
+            yLatLong = new YGeoPoint(lonlat.lat, lonlat.lon);
+        } else {
+            yLatLong = new YGeoPoint(lat, lon);
+        }
+        return yLatLong;
+    },
+
+  // Pixel
+    
+    /**
+     * APIMethod: getXFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Integer} X value of the MapObject Pixel
+     */
+    getXFromMapObjectPixel: function(moPixel) {
+        return moPixel.x;
+    },
+
+    /**
+     * APIMethod: getYFromMapObjectPixel
+     * 
+     * Parameters:
+     * moPixel - {Object} MapObject Pixel format
+     * 
+     * Returns:
+     * {Integer} Y value of the MapObject Pixel
+     */
+    getYFromMapObjectPixel: function(moPixel) {
+        return moPixel.y;
+    },
+
+    /**
+     * 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"
+});
diff --git a/lib/OpenLayers/Layer/Zoomify.js b/lib/OpenLayers/Layer/Zoomify.js
new file mode 100644
index 0000000..d2ae0e3
--- /dev/null
+++ b/lib/OpenLayers/Layer/Zoomify.js
@@ -0,0 +1,308 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/*
+ * Development supported by a R&D grant DC08P02OUK006 - Old Maps Online
+ * (www.oldmapsonline.org) from Ministry of Culture of the Czech Republic.
+ */
+
+
+/**
+ * @requires OpenLayers/Layer/Grid.js
+ */
+
+/**
+ * Class: OpenLayers.Layer.Zoomify
+ *
+ * Inherits from:
+ *  - <OpenLayers.Layer.Grid>
+ */
+OpenLayers.Layer.Zoomify = OpenLayers.Class(OpenLayers.Layer.Grid, {
+
+    /**
+     * Property: url
+     * {String} URL for root directory with TileGroupX subdirectories.
+     */
+    url: null,
+
+    /**
+     * Property: size
+     * {<OpenLayers.Size>} The Zoomify image size in pixels.
+     */
+    size: null,
+
+    /**
+     * APIProperty: isBaseLayer
+     * {Boolean}
+     */
+    isBaseLayer: true,
+
+    /**
+     * Property: standardTileSize
+     * {Integer} The size of a standard (non-border) square tile in pixels.
+     */
+    standardTileSize: 256,
+
+    /**
+     * Property: numberOfTiers
+     * {Integer} Depth of the Zoomify pyramid, number of tiers (zoom levels)
+     *                          - filled during Zoomify pyramid initialization.
+     */
+    numberOfTiers: 0,
+
+    /**
+     * Property: tileCountUpToTier
+     * {Array(Integer)} Number of tiles up to the given tier of pyramid.
+     *                          - filled during Zoomify pyramid initialization.
+     */
+    tileCountUpToTier: new Array(),
+
+    /**
+     * Property: tierSizeInTiles
+     * {Array(<OpenLayers.Size>)} Size (in tiles) for each tier of pyramid.
+     *                          - filled during Zoomify pyramid initialization.
+     */
+    tierSizeInTiles: new Array(),
+
+    /**
+     * Property: tierImageSize
+     * {Array(<OpenLayers.Size>)} Image size in pixels for each pyramid tier.
+     *                          - filled during Zoomify pyramid initialization.
+     */
+    tierImageSize: new Array(),
+
+    /**
+     * Constructor: OpenLayers.Layer.Zoomify
+     *
+     * Parameters:
+     * name - {String} A name for the layer.
+     * url - {String} - Relative or absolute path to the image or more
+     *        precisly to the TileGroup[X] directories root.
+     *        Flash plugin use the variable name "zoomifyImagePath" for this.
+     * size - {<OpenLayers.Size>} The size (in pixels) of the image.
+     * options - {Object} Hashtable of extra options to tag onto the layer
+     */
+    initialize: function(name, url, size, options) {
+
+        // initilize the Zoomify pyramid for given size
+        this.initializeZoomify( size );
+
+        var newArguments = [];
+        newArguments.push(name, url, size, {}, options);
+
+        OpenLayers.Layer.Grid.prototype.initialize.apply(this, newArguments);
+    },
+
+    /**
+     * Method: initializeZoomify
+     * It generates constants for all tiers of the Zoomify pyramid
+     *
+     * Parameters:
+     * size - {<OpenLayers.Size>} The size of the image in pixels
+     *
+     */
+    initializeZoomify: function( size ) {
+
+        var imageSize = size.clone()
+        var tiles = new OpenLayers.Size(
+            Math.ceil( imageSize.w / this.standardTileSize ),
+            Math.ceil( imageSize.h / this.standardTileSize )
+            );
+
+        this.tierSizeInTiles.push( tiles );
+        this.tierImageSize.push( imageSize );
+
+        while (imageSize.w > this.standardTileSize ||
+               imageSize.h > this.standardTileSize ) {
+
+            imageSize = new OpenLayers.Size(
+                Math.floor( imageSize.w / 2 ),
+                Math.floor( imageSize.h / 2 )
+                );
+            tiles = new OpenLayers.Size(
+                Math.ceil( imageSize.w / this.standardTileSize ),
+                Math.ceil( imageSize.h / this.standardTileSize )
+                );
+            this.tierSizeInTiles.push( tiles );
+            this.tierImageSize.push( imageSize );
+        }
+
+        this.tierSizeInTiles.reverse();
+        this.tierImageSize.reverse();
+
+        this.numberOfTiers = this.tierSizeInTiles.length;
+
+        this.tileCountUpToTier[0] = 0;
+        for (var i = 1; i < this.numberOfTiers; i++) {
+            this.tileCountUpToTier.push(
+                this.tierSizeInTiles[i-1].w * this.tierSizeInTiles[i-1].h +
+                this.tileCountUpToTier[i-1]
+                );
+        }
+    },
+
+    /**
+     * APIMethod:destroy
+     */
+    destroy: function() {
+        // for now, nothing special to do here.
+        OpenLayers.Layer.Grid.prototype.destroy.apply(this, arguments);
+
+        // Remove from memory the Zoomify pyramid - is that enough?
+        this.tileCountUpToTier.length = 0
+        this.tierSizeInTiles.length = 0
+        this.tierImageSize.length = 0
+
+    },
+
+    /**
+     * APIMethod: clone
+     *
+     * Parameters:
+     * obj - {Object}
+     *
+     * Returns:
+     * {<OpenLayers.Layer.Zoomify>} An exact clone of this <OpenLayers.Layer.Zoomify>
+     */
+    clone: function (obj) {
+
+        if (obj == null) {
+            obj = new OpenLayers.Layer.Zoomify(this.name,
+                                           this.url,
+                                           this.size,
+                                           this.options);
+        }
+
+        //get all additions from superclasses
+        obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]);
+
+        // copy/set any non-init, non-simple values here
+
+        return obj;
+    },
+
+    /**
+     * Method: getURL
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     *
+     * Returns:
+     * {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);
+        var res = this.map.getResolution();
+        var x = Math.round((bounds.left - this.tileOrigin.lon) / (res * this.tileSize.w));
+        var y = Math.round((this.tileOrigin.lat - bounds.top) / (res * this.tileSize.h));
+        var z = this.map.getZoom();
+
+        var tileIndex = x + y * this.tierSizeInTiles[z].w + this.tileCountUpToTier[z];
+        var path = "TileGroup" + Math.floor( (tileIndex) / 256 ) +
+            "/" + z + "-" + x + "-" + y + ".jpg";
+        var url = this.url;
+        if (url instanceof Array) {
+            url = this.selectUrl(path, url);
+        }
+        return url + path;
+    },
+
+    /**
+     * Method: getImageSize
+     * getImageSize returns size for a particular tile. If bounds are given as
+     * first argument, size is calculated (bottom-right tiles are non square).
+     *
+     */
+    getImageSize: function() {
+        if (arguments.length > 0) {
+            bounds = this.adjustBounds(arguments[0]);
+            var res = this.map.getResolution();
+            var x = Math.round((bounds.left - this.tileOrigin.lon) / (res * this.tileSize.w));
+            var y = Math.round((this.tileOrigin.lat - bounds.top) / (res * this.tileSize.h));
+            var z = this.map.getZoom();
+            var w = this.standardTileSize;
+            var h = this.standardTileSize;
+            if (x == this.tierSizeInTiles[z].w -1 ) {
+                var w = this.tierImageSize[z].w % this.standardTileSize;
+            };
+            if (y == this.tierSizeInTiles[z].h -1 ) {
+                var h = this.tierImageSize[z].h % this.standardTileSize;
+            };
+            return (new OpenLayers.Size(w, h));
+        } else {
+            return this.tileSize;
+        }
+    },
+
+    /**
+     * Method: addTile
+     * 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,
+                                         null, this.tileSize);
+    },
+
+    /**
+     * APIMethod: setMap
+     * When the layer is added to a map, then we can fetch our origin
+     *    (if we don't have one.)
+     *
+     * Parameters:
+     * map - {<OpenLayers.Map>}
+     */
+    setMap: function(map) {
+        OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments);
+        this.tileOrigin = new OpenLayers.LonLat(this.map.maxExtent.left,
+                                                this.map.maxExtent.top);
+    },
+
+    /**
+     * Method: calculateGridLayout
+     * Generate parameters for the grid layout. This
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bound>}
+     * extent - {<OpenLayers.Bounds>}
+     * resolution - {Number}
+     *
+     * Returns:
+     * Object containing properties tilelon, tilelat, tileoffsetlat,
+     * tileoffsetlat, tileoffsetx, tileoffsety
+     */
+    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 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 {
+          tilelon: tilelon, tilelat: tilelat,
+          tileoffsetlon: tileoffsetlon, tileoffsetlat: tileoffsetlat,
+          tileoffsetx: tileoffsetx, tileoffsety: tileoffsety
+        };
+    },
+
+    CLASS_NAME: "OpenLayers.Layer.Zoomify"
+});
diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js
new file mode 100644
index 0000000..12f1b9a
--- /dev/null
+++ b/lib/OpenLayers/Map.js
@@ -0,0 +1,2417 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Util.js
+ * @requires OpenLayers/Events.js
+ * @requires OpenLayers/Tween.js
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * 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. 
+ */
+OpenLayers.Map = OpenLayers.Class({
+    
+    /**
+     * Constant: Z_INDEX_BASE
+     * {Object} Base z-indexes for different classes of thing 
+     */
+    Z_INDEX_BASE: {
+        BaseLayer: 100,
+        Overlay: 325,
+        Feature: 725,
+        Popup: 750,
+        Control: 1000
+    },
+
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * map.events.register(type, obj, listener);
+     * (end)
+     *
+     * Listeners will be called with a reference to an event object.  The
+     *     properties of this event depends on exactly what happened.
+     *
+     * All event objects have at least the following properties:
+     *  - *object* {Object} A reference to map.events.object.
+     *  - *element* {DOMElement} A reference to map.events.element.
+     *
+     * Browser events have the following additional properties:
+     *  - *xy* {<OpenLayers.Pixel>} The pixel location of the event (relative
+     *      to the the map viewport).
+     *  - other properties that come with browser events
+     *
+     * Supported map event types:
+     *  - *preaddlayer* triggered before a layer has been added.  The event
+     *      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.
+     *  - *removelayer* triggered after a layer has been removed.  The event
+     *      object will include a *layer* property that references the removed
+     *      layer.
+     *  - *changelayer* triggered after a layer name change, order change,
+     *      opacity change, params change or visibility change
+     *      (due to resolution thresholds). Listeners will receive an event
+     *      object with *layer* and *property* properties. The *layer*
+     *      property will be a reference to the changed layer. 
+     *      The *property* property will be a key to the
+     *      changed property (name, order, opacity, params or visibility).
+     *  - *movestart* triggered after the start of a drag, pan, or zoom
+     *  - *move* triggered after each drag, pan, or zoom
+     *  - *moveend* triggered after a drag, pan, or zoom completes
+     *  - *zoomend* triggered after a zoom completes
+     *  - *mouseover* triggered after mouseover the map
+     *  - *mouseout* triggered after mouseout the map
+     *  - *mousemove* triggered after mousemove the map
+     *  - *changebaselayer* triggered after the base layer changes
+     */
+    EVENT_TYPES: [ 
+        "preaddlayer", "addlayer", "removelayer", "changelayer", "movestart",
+        "move", "moveend", "zoomend", "popupopen", "popupclose",
+        "addmarker", "removemarker", "clearmarkers", "mouseover",
+        "mouseout", "mousemove", "dragstart", "drag", "dragend",
+        "changebaselayer"],
+
+    /**
+     * Property: id
+     * {String} Unique identifier for the map
+     */
+    id: null,
+    
+    /**
+     * Property: fractionalZoom
+     * {Boolean} For a base layer that supports it, allow the map resolution
+     *     to be set to a value between one of the values in the resolutions
+     *     array.  Default is false.
+     *
+     * When fractionalZoom is set to true, it is possible to zoom to
+     *     an arbitrary extent.  This requires a base layer from a source
+     *     that supports requests for arbitrary extents (i.e. not cached
+     *     tiles on a regular lattice).  This means that fractionalZoom
+     *     will not work with commercial layers (Google, Yahoo, VE), layers
+     *     using TileCache, or any other pre-cached data sources.
+     *
+     * If you are using fractionalZoom, then you should also use
+     *     <getResolutionForZoom> instead of layer.resolutions[zoom] as the
+     *     former works for non-integer zoom levels.
+     */
+    fractionalZoom: false,
+    
+    /**
+     * APIProperty: events
+     * {<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
+     *     false.  If true, the lowest layer in the draw order will act as
+     *     the base layer.  In addition, if set to true, all layers will
+     *     have isBaseLayer set to false when they are added to the map.
+     *
+     * Note:
+     * If you set map.allOverlays to true, then you *cannot* use
+     *     map.setBaseLayer or layer.setIsBaseLayer.  With allOverlays true,
+     *     the lowest layer in the draw layer is the base layer.  So, to change
+     *     the base layer, use <setLayerIndex> or <raiseLayer> to set the layer
+     *     index to 0.
+     */
+    allOverlays: false,
+
+    /**
+     * APIProperty: div
+     * {DOMElement|String} The element that contains the map (or an id for
+     *     that element).  If the <OpenLayers.Map> constructor is called
+     *     with two arguments, this should be provided as the first argument.
+     *     Alternatively, the map constructor can be called with the options
+     *     object as the only argument.  In this case (one argument), a
+     *     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 are 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.
+     */
+    dragging: false,
+
+    /**
+     * Property: size
+     * {<OpenLayers.Size>} Size of the main div (this.div)
+     */
+    size: null,
+    
+    /**
+     * Property: viewPortDiv
+     * {HTMLDivElement} The element that represents the map viewport
+     */
+    viewPortDiv: null,
+
+    /**
+     * Property: layerContainerOrigin
+     * {<OpenLayers.LonLat>} The lonlat at which the later container was
+     *                       re-initialized (on-zoom)
+     */
+    layerContainerOrigin: null,
+
+    /**
+     * Property: layerContainerDiv
+     * {HTMLDivElement} The element that contains the layers.
+     */
+    layerContainerDiv: null,
+
+    /**
+     * APIProperty: layers
+     * {Array(<OpenLayers.Layer>)} Ordered list of layers in the map
+     */
+    layers: null,
+
+    /**
+     * Property: controls
+     * {Array(<OpenLayers.Control>)} List of controls associated with the map.
+     *
+     * If not provided in the map options at construction, the map will
+     *     be given the following controls by default:
+     *  - <OpenLayers.Control.Navigation>
+     *  - <OpenLayers.Control.PanZoom>
+     *  - <OpenLayers.Control.ArgParser>
+     *  - <OpenLayers.Control.Attribution>
+     */
+    controls: null,
+
+    /**
+     * Property: popups
+     * {Array(<OpenLayers.Popup>)} List of popups associated with the map
+     */
+    popups: null,
+
+    /**
+     * APIProperty: baseLayer
+     * {<OpenLayers.Layer>} The currently selected base layer.  This determines
+     * min/max zoom level, projection, etc.
+     */
+    baseLayer: null,
+    
+    /**
+     * Property: center
+     * {<OpenLayers.LonLat>} The current center of the map
+     */
+    center: null,
+
+    /**
+     * Property: resolution
+     * {Float} The resolution of the map.
+     */
+    resolution: null,
+
+    /**
+     * Property: zoom
+     * {Integer} The current zoom level of the map
+     */
+    zoom: 0,    
+
+    /**
+     * Property: panRatio
+     * {Float} The ratio of the current extent within
+     *         which panning will tween.
+     */
+    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 
+     *          still the same as that of the map. Fix for #480
+     */
+    viewRequestID: 0,
+
+  // Options
+
+    /**
+     * APIProperty: tileSize
+     * {<OpenLayers.Size>} Set in the map options to override the default tile
+     *                     size for this map.
+     */
+    tileSize: null,
+
+    /**
+     * APIProperty: projection
+     * {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",    
+        
+    /**
+     * APIProperty: units
+     * {String} The map units.  Defaults to 'degrees'.  Possible values are
+     *          'degrees' (or 'dd'), 'm', 'ft', 'km', 'mi', 'inches'.
+     */
+    units: 'degrees',
+
+    /**
+     * 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 
+     *     (maxExtent, maxResolution, maxScale, etc.).
+     */
+    resolutions: 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 map 
+     *          options if you are not using a geographic projection and 
+     *          displaying the whole world.
+     */
+    maxResolution: 1.40625,
+
+    /**
+     * APIProperty: minResolution
+     * {Float}
+     */
+    minResolution: null,
+
+    /**
+     * APIProperty: maxScale
+     * {Float}
+     */
+    maxScale: null,
+
+    /**
+     * APIProperty: minScale
+     * {Float}
+     */
+    minScale: null,
+
+    /**
+     * APIProperty: maxExtent
+     * {<OpenLayers.Bounds>} The maximum extent for the map.  Defaults to the
+     *                       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 
+     *                        world.
+     */
+    maxExtent: null,
+    
+    /**
+     * APIProperty: minExtent
+     * {<OpenLayers.Bounds>}
+     */
+    minExtent: null,
+    
+    /**
+     * APIProperty: restrictedExtent
+     * {<OpenLayers.Bounds>} Limit map navigation to this extent where possible.
+     *     If a non-null restrictedExtent is set, panning will be restricted
+     *     to the given bounds.  In addition, zooming to a resolution that
+     *     displays more than the restricted extent will center the map
+     *     on the restricted extent.  If you wish to limit the zoom level
+     *     or resolution, use maxResolution.
+     */
+    restrictedExtent: null,
+
+    /**
+     * APIProperty: numZoomLevels
+     * {Integer} Number of zoom levels for the map.  Defaults to 16.  Set a
+     *           different value in the map options if needed.
+     */
+    numZoomLevels: 16,
+
+    /**
+     * 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 
+     *          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. 
+     */
+    displayProjection: null,
+
+    /**
+     * APIProperty: fallThrough
+     * {Boolean} Should OpenLayers allow events on the map to fall through to
+     *           other elements on the page, or should it swallow them? (#457)
+     *           Default is to fall through.
+     */
+    fallThrough: true,
+    
+    /**
+     * Property: panTween
+     * {OpenLayers.Tween} Animated panning tween object, see panTo()
+     */
+    panTween: null,
+
+    /**
+     * APIProperty: eventListeners
+     * {Object} If set as an option at construction, the eventListeners
+     *     object will be registered with <OpenLayers.Events.on>.  Object
+     *     structure must be a listeners object as shown in the example for
+     *     the events.on method.
+     */
+    eventListeners: null,
+
+    /**
+     * APIProperty: panMethod
+     * {Function} The Easing function to be used for tweening.  Default is
+     * OpenLayers.Easing.Expo.easeOut. Setting this to 'null' turns off
+     * animated panning.
+     */
+    panMethod: OpenLayers.Easing.Expo.easeOut,
+    
+    /**
+     * Property: panDuration
+     * {Integer} The number of steps to be passed to the
+     * OpenLayers.Tween.start() method when the map is
+     * panned.
+     * Default is 50.
+     */
+    panDuration: 50,
+    
+    /**
+     * Property: paddingForPopups
+     * {<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
+     *     ways to call the map constructor.  See the examples below.
+     *
+     * Parameters:
+     * div - {DOMElement|String}  The element or id of an element in your page
+     *     that will contain the map.  May be omitted if the <div> option is
+     *     provided or if you intend to call the <render> method later.
+     * options - {Object} Optional object with properties to tag onto the map.
+     *
+     * Examples (method one):
+     * (code)
+     * // create a map with default options in an element with the id "map1"
+     * var map = new OpenLayers.Map("map1");
+     *
+     * // create a map with non-default options in an element with id "map2"
+     * var options = {
+     *     maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+     *     maxResolution: 156543,
+     *     units: 'm',
+     *     projection: "EPSG:41001"
+     * };
+     * var map = new OpenLayers.Map("map2", options);
+     * (end)
+     *
+     * Examples (method two - single argument):
+     * (code)
+     * // create a map with non-default options
+     * var map = new OpenLayers.Map({
+     *     div: "map_id",
+     *     maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+     *     maxResolution: 156543,
+     *     units: 'm',
+     *     projection: "EPSG:41001"
+     * });
+     *
+     * // create a map without a reference to a container - call render later
+     * var map = new OpenLayers.Map({
+     *     maxExtent: new OpenLayers.Bounds(-200000, -200000, 200000, 200000),
+     *     maxResolution: 156543,
+     *     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 
+        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'; 
+
+        // now override default options 
+        OpenLayers.Util.extend(this, options);
+
+        // initialize layers array
+        this.layers = [];
+
+        this.id = OpenLayers.Util.createUniqueID("OpenLayers.Map_");
+
+        this.div = OpenLayers.Util.getElement(div);
+        if(!this.div) {
+            this.div = document.createElement("div");
+            this.div.style.height = "1px";
+            this.div.style.width = "1px";
+        }
+        
+        OpenLayers.Element.addClass(this.div, 'olMap');
+
+        // the viewPortDiv is the outermost div we modify
+        var id = this.id + "_OpenLayers_ViewPort";
+        this.viewPortDiv = OpenLayers.Util.createDiv(id, null, null, null,
+                                                     "relative", null,
+                                                     "hidden");
+        this.viewPortDiv.style.width = "100%";
+        this.viewPortDiv.style.height = "100%";
+        this.viewPortDiv.className = "olMapViewport";
+        this.div.appendChild(this.viewPortDiv);
+
+        // the layerContainerDiv is the one that holds all the layers
+        id = this.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, 
+                                            {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. 
+        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 
+            //  map's size has not actually changed.
+            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
+            var addNode = true;
+            var nodes = document.getElementsByTagName('link');
+            for(var i=0, len=nodes.length; i<len; ++i) {
+                if(OpenLayers.Util.isEquivalentUrl(nodes.item(i).href,
+                                                   this.theme)) {
+                    addNode = false;
+                    break;
+                }
+            }
+            // only add a new node if one with an equivalent url hasn't already
+            // been added
+            if(addNode) {
+                var cssNode = document.createElement('link');
+                cssNode.setAttribute('rel', 'stylesheet');
+                cssNode.setAttribute('type', 'text/css');
+                cssNode.setAttribute('href', this.theme);
+                document.getElementsByTagName('head')[0].appendChild(cssNode);
+            }
+        }
+        
+        if (this.controls == null) {
+            if (OpenLayers.Control != null) { // running full or lite?
+                this.controls = [ new OpenLayers.Control.Navigation(),
+                                  new OpenLayers.Control.PanZoom(),
+                                  new OpenLayers.Control.ArgParser(),
+                                  new OpenLayers.Control.Attribution()
+                                ];
+            } else {
+                this.controls = [];
+            }
+        }
+
+        for(var i=0, len=this.controls.length; i<len; i++) {
+            this.addControlToMap(this.controls[i]);
+        }
+
+        this.popups = [];
+
+        this.unloadDestroy = OpenLayers.Function.bind(this.destroy, this);
+        
+
+        // always call map.destroy()
+        OpenLayers.Event.observe(window, 'unload', this.unloadDestroy);
+        
+        // add any initial layers
+        if (options && options.layers) {
+            this.addLayers(options.layers);        
+            // set center (and optionally zoom)
+            if (options.center) {
+                // zoom can be undefined here
+                this.setCenter(options.center, options.zoom);
+            }
+        }
+    },
+    
+    /**
+     * 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
+     *     will be moved from the current to the new container.
+     */
+    render: function(div) {
+        this.div = OpenLayers.Util.getElement(div);
+        OpenLayers.Element.addClass(this.div, 'olMap');
+        this.events.attachToElement(this.div);
+        this.viewPortDiv.parentNode.removeChild(this.viewPortDiv);
+        this.div.appendChild(this.viewPortDiv);
+        this.updateSize();
+    },
+
+    /**
+     * Method: unloadDestroy
+     * Function that is called to destroy the map on page unload. stored here
+     *     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 
+     *    non-IE browsers.
+     */
+    updateSizeDestroy: null,
+
+    /**
+     * APIMethod: destroy
+     * Destroy this map
+     */
+    destroy:function() {
+        // if unloadDestroy is null, we've already been destroyed
+        if (!this.unloadDestroy) {
+            return false;
+        }
+        
+        // make sure panning doesn't continue after destruction
+        if(this.panTween) {
+            this.panTween.stop();
+            this.panTween = null;
+        }
+
+        // map has been destroyed. dont do it again!
+        OpenLayers.Event.stopObserving(window, 'unload', this.unloadDestroy);
+        this.unloadDestroy = null;
+
+        if (this.updateSizeDestroy) {
+            OpenLayers.Event.stopObserving(window, 'resize', 
+                                           this.updateSizeDestroy);
+        } else {
+            this.events.unregister("resize", this, this.updateSize);
+        }    
+        
+        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 
+                // baselayer after each baselayer is removed
+                this.layers[i].destroy(false);
+            } 
+            this.layers = null;
+        }
+        if (this.viewPortDiv) {
+            this.div.removeChild(this.viewPortDiv);
+        }
+        this.viewPortDiv = null;
+
+        if(this.eventListeners) {
+            this.events.un(this.eventListeners);
+            this.eventListeners = null;
+        }
+        this.events.destroy();
+        this.events = null;
+
+    },
+
+    /**
+     * APIMethod: setOptions
+     * Change the map options
+     *
+     * Parameters:
+     * options - {Object} Hashtable of options to tag to the map
+     */
+    setOptions: function(options) {
+        OpenLayers.Util.extend(this, options);
+    },
+
+    /**
+     * APIMethod: getTileSize
+     * Get the tile size for the map
+     *
+     * Returns:
+     * {<OpenLayers.Size>}
+     */
+     getTileSize: function() {
+         return this.tileSize;
+     },
+
+
+    /**
+     * APIMethod: getBy
+     * Get a list of objects given a property and a match item.
+     *
+     * Parameters:
+     * array - {String} A property on the map whose value is an array.
+     * property - {String} A property on each item of the given array.
+     * match - {String | Object} A string to match.  Can also be a regular
+     *     expression literal or object.  In addition, it can be any object
+     *     with a method named test.  For reqular expressions or other, if
+     *     match.test(map[array][i][property]) evaluates to true, the item will
+     *     be included in the array returned.  If no items are found, an empty
+     *     array is returned.
+     *
+     * Returns:
+     * {Array} An array of items where the given property matches the given
+     *     criteria.
+     */
+    getBy: function(array, property, match) {
+        var test = (typeof match.test == "function");
+        var found = OpenLayers.Array.filter(this[array], function(item) {
+            return item[property] == match || (test && match.test(item[property]));
+        });
+        return found;
+    },
+
+    /**
+     * APIMethod: getLayersBy
+     * Get a list of layers with properties matching the given criteria.
+     *
+     * Parameter:
+     * property - {String} A layer property to be matched.
+     * match - {String | Object} A string to match.  Can also be a regular
+     *     expression literal or object.  In addition, it can be any object
+     *     with a method named test.  For reqular expressions or other, if
+     *     match.test(layer[property]) evaluates to true, the layer will be
+     *     included in the array returned.  If no layers are found, an empty
+     *     array is returned.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Layer>)} A list of layers matching the given criteria.
+     *     An empty array is returned if no matches are found.
+     */
+    getLayersBy: function(property, match) {
+        return this.getBy("layers", property, match);
+    },
+
+    /**
+     * APIMethod: getLayersByName
+     * Get a list of layers with names matching the given name.
+     *
+     * Parameter:
+     * match - {String | Object} A layer name.  The name can also be a regular
+     *     expression literal or object.  In addition, it can be any object
+     *     with a method named test.  For reqular expressions or other, if
+     *     name.test(layer.name) evaluates to true, the layer will be included
+     *     in the list of layers returned.  If no layers are found, an empty
+     *     array is returned.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Layer>)} A list of layers matching the given name.
+     *     An empty array is returned if no matches are found.
+     */
+    getLayersByName: function(match) {
+        return this.getLayersBy("name", match);
+    },
+
+    /**
+     * APIMethod: getLayersByClass
+     * Get a list of layers of a given class (CLASS_NAME).
+     *
+     * Parameter:
+     * match - {String | Object} A layer class name.  The match can also be a
+     *     regular expression literal or object.  In addition, it can be any
+     *     object with a method named test.  For reqular expressions or other,
+     *     if type.test(layer.CLASS_NAME) evaluates to true, the layer will
+     *     be included in the list of layers returned.  If no layers are
+     *     found, an empty array is returned.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Layer>)} A list of layers matching the given class.
+     *     An empty array is returned if no matches are found.
+     */
+    getLayersByClass: function(match) {
+        return this.getLayersBy("CLASS_NAME", match);
+    },
+
+    /**
+     * APIMethod: getControlsBy
+     * Get a list of controls with properties matching the given criteria.
+     *
+     * Parameter:
+     * property - {String} A control property to be matched.
+     * match - {String | Object} A string to match.  Can also be a regular
+     *     expression literal or object.  In addition, it can be any object
+     *     with a method named test.  For reqular expressions or other, if
+     *     match.test(layer[property]) evaluates to true, the layer will be
+     *     included in the array returned.  If no layers are found, an empty
+     *     array is returned.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Control>)} A list of controls matching the given
+     *     criteria.  An empty array is returned if no matches are found.
+     */
+    getControlsBy: function(property, match) {
+        return this.getBy("controls", property, match);
+    },
+
+    /**
+     * APIMethod: getControlsByClass
+     * Get a list of controls of a given class (CLASS_NAME).
+     *
+     * Parameter:
+     * match - {String | Object} A control class name.  The match can also be a
+     *     regular expression literal or object.  In addition, it can be any
+     *     object with a method named test.  For reqular expressions or other,
+     *     if type.test(control.CLASS_NAME) evaluates to true, the control will
+     *     be included in the list of controls returned.  If no controls are
+     *     found, an empty array is returned.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Control>)} A list of controls matching the given class.
+     *     An empty array is returned if no matches are found.
+     */
+    getControlsByClass: function(match) {
+        return this.getControlsBy("CLASS_NAME", match);
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*                  Layer Functions                     */
+  /*                                                      */
+  /*     The following functions deal with adding and     */
+  /*        removing Layers to and from the Map           */
+  /*                                                      */
+  /********************************************************/         
+
+    /**
+     * APIMethod: getLayer
+     * Get a layer based on its id
+     *
+     * Parameter:
+     * id - {String} A layer id
+     *
+     * Returns:
+     * {<OpenLayers.Layer>} The Layer with the corresponding id from the map's 
+     *                      layer collection, or null if not found.
+     */
+    getLayer: function(id) {
+        var foundLayer = null;
+        for (var i=0, len=this.layers.length; i<len; i++) {
+            var layer = this.layers[i];
+            if (layer.id == id) {
+                foundLayer = layer;
+                break;
+            }
+        }
+        return foundLayer;
+    },
+
+    /**
+    * Method: setLayerZIndex
+    * 
+    * Parameters:
+    * layer - {<OpenLayers.Layer>} 
+    * zIdx - {int} 
+    */    
+    setLayerZIndex: function (layer, zIdx) {
+        layer.setZIndex(
+            this.Z_INDEX_BASE[layer.isBaseLayer ? 'BaseLayer' : 'Overlay']
+            + zIdx * 5 );
+    },
+
+    /**
+     * Method: resetLayersZIndex
+     * Reset each layer's z-index based on layer's array index
+     */
+    resetLayersZIndex: function() {
+        for (var i=0, len=this.layers.length; i<len; i++) {
+            var layer = this.layers[i];
+            this.setLayerZIndex(layer, i);
+        }
+    },
+
+    /**
+    * APIMethod: addLayer
+    *
+    * Parameters:
+    * 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', 
+                                                      {'layerName':layer.name});
+                OpenLayers.Console.warn(msg);
+                return false;
+            }
+        }
+        if(this.allOverlays) {
+            layer.isBaseLayer = false;
+        }
+
+        if (this.events.triggerEvent("preaddlayer", {layer: layer}) === false) {
+            return;
+        }
+        
+        layer.div.className = "olLayerDiv";
+        layer.div.style.overflow = "";
+        this.setLayerZIndex(layer, this.layers.length);
+
+        if (layer.isFixed) {
+            this.viewPortDiv.appendChild(layer.div);
+        } else {
+            this.layerContainerDiv.appendChild(layer.div);
+        }
+        this.layers.push(layer);
+        layer.setMap(this);
+
+        if (layer.isBaseLayer || (this.allOverlays && !this.baseLayer))  {
+            if (this.baseLayer == null) {
+                // set the first baselaye we add as the baselayer
+                this.setBaseLayer(layer);
+            } else {
+                layer.setVisibility(false);
+            }
+        } else {
+            layer.redraw();
+        }
+
+        this.events.triggerEvent("addlayer", {layer: layer});
+        layer.afterAdd();
+    },
+
+    /**
+    * APIMethod: addLayers 
+    *
+    * Parameters:
+    * 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. 
+     * 
+     *   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 
+     *   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 
+     *     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>} 
+     * setNewBaseLayer - {Boolean} Default is true
+     */
+    removeLayer: function(layer, setNewBaseLayer) {
+        if (setNewBaseLayer == null) {
+            setNewBaseLayer = true;
+        }
+
+        if (layer.isFixed) {
+            this.viewPortDiv.removeChild(layer.div);
+        } else {
+            this.layerContainerDiv.removeChild(layer.div);
+        }
+        OpenLayers.Util.removeItem(this.layers, layer);
+        layer.removeMap(this);
+        layer.map = null;
+
+        // if we removed the base layer, need to set a new one
+        if(this.baseLayer == layer) {
+            this.baseLayer = null;
+            if(setNewBaseLayer) {
+                for(var i=0, len=this.layers.length; i<len; i++) {
+                    var iLayer = this.layers[i];
+                    if (iLayer.isBaseLayer || this.allOverlays) {
+                        this.setBaseLayer(iLayer);
+                        break;
+                    }
+                }
+            }
+        }
+
+        this.resetLayersZIndex();
+
+        this.events.triggerEvent("removelayer", {layer: layer});
+    },
+
+    /**
+     * APIMethod: getNumLayers
+     * 
+     * Returns:
+     * {Int} The number of layers attached to the map.
+     */
+    getNumLayers: function () {
+        return this.layers.length;
+    },
+
+    /** 
+     * APIMethod: getLayerIndex
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer>}
+     *
+     * Returns:
+     * {Integer} The current (zero-based) index of the given layer in the map's
+     *           layer stack. Returns -1 if the layer isn't on the map.
+     */
+    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
+     *     map.getLayerIndex() to find out the current index of a layer. Note
+     *     that this cannot (or at least should not) be effectively used to
+     *     raise base layers above overlays.
+     *
+     * Parameters:
+     * layer - {<OpenLayers.Layer>} 
+     * idx - {int} 
+     */
+    setLayerIndex: function (layer, idx) {
+        var base = this.getLayerIndex(layer);
+        if (idx < 0) {
+            idx = 0;
+        } else if (idx > this.layers.length) {
+            idx = this.layers.length;
+        }
+        if (base != idx) {
+            this.layers.splice(base, 1);
+            this.layers.splice(idx, 0, layer);
+            for (var i=0, len=this.layers.length; i<len; i++) {
+                this.setLayerZIndex(this.layers[i], i);
+            }
+            this.events.triggerEvent("changelayer", {
+                layer: layer, property: "order"
+            });
+            if(this.allOverlays) {
+                if(idx === 0) {
+                    this.setBaseLayer(layer);
+                } else if(this.baseLayer !== this.layers[0]) {
+                    this.setBaseLayer(this.layers[0]);
+                }
+            }
+        }
+    },
+
+    /** 
+     * APIMethod: raiseLayer
+     * 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} 
+     */
+    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>}
+     */
+    setBaseLayer: function(newBaseLayer) {
+        
+        if (newBaseLayer != this.baseLayer) {
+          
+            // ensure newBaseLayer is already loaded
+            if (OpenLayers.Util.indexOf(this.layers, newBaseLayer) != -1) {
+
+                // preserve center and scale when changing base layers
+                var center = this.getCenter();
+                var newResolution = OpenLayers.Util.getResolutionFromScale(
+                    this.getScale(), newBaseLayer.units
+                );
+
+                // 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 
+                // draw themselves.
+                this.viewRequestID++;
+                if(!this.allOverlays || this.baseLayer.visibility) {
+                    this.baseLayer.setVisibility(true);
+                }
+
+                // recenter the map
+                if (center != null) {
+                    // new zoom level derived from old scale
+                    var newZoom = this.getZoomForResolution(
+                        newResolution || this.resolution, true
+                    );
+                    // zoom and force zoom change
+                    this.setCenter(center, newZoom, false, true);
+                }
+
+                this.events.triggerEvent("changebaselayer", {
+                    layer: this.baseLayer
+                });
+            }        
+        }
+    },
+
+
+  /********************************************************/
+  /*                                                      */
+  /*                 Control Functions                    */
+  /*                                                      */
+  /*     The following functions deal with adding and     */
+  /*        removing Controls to and from the Map         */
+  /*                                                      */
+  /********************************************************/         
+
+    /**
+     * APIMethod: addControl
+     * Add the passed over control to the map. Optionally 
+     *     position the control at the given pixel.
+     * 
+     * Parameters:
+     * control - {<OpenLayers.Control>}
+     * px - {<OpenLayers.Pixel>}
+     */    
+    addControl: function (control, px) {
+        this.controls.push(control);
+        this.addControlToMap(control, px);
+    },
+    
+    /**
+     * APIMethod: addControls
+     * Add all of the passed over controls to the map. 
+     *     You can pass over an optional second array
+     *     with pixel-objects to position the controls.
+     *     The indices of the two arrays should match and
+     *     you can add null as pixel for those controls 
+     *     you want to be autopositioned.   
+     *     
+     * Parameters:
+     * controls - {Array(<OpenLayers.Control>)}
+     * pixels - {Array(<OpenLayers.Pixel>)}
+     */    
+    addControls: function (controls, pixels) {
+        var pxs = (arguments.length === 1) ? [] : pixels;
+        for (var i=0, len=controls.length; i<len; i++) {
+            var ctrl = controls[i];
+            var px = (pxs[i]) ? pxs[i] : null;
+            this.addControl( ctrl, px );
+        }
+    },
+
+    /**
+     * 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 
+        // the display projection.
+        if (this.displayProjection && !control.displayProjection) {
+            control.displayProjection = this.displayProjection;
+        }    
+        
+        control.setMap(this);
+        var div = control.draw(px);
+        if (div) {
+            if(!control.outsideViewport) {
+                div.style.zIndex = this.Z_INDEX_BASE['Control'] +
+                                    this.controls.length;
+                this.viewPortDiv.appendChild( div );
+            }
+        }
+        if(control.autoActivate) {
+            control.activate();
+        }
+    },
+    
+    /**
+     * 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, 
+     *                        returns null.
+     */    
+    getControl: function (id) {
+        var returnControl = null;
+        for(var i=0, len=this.controls.length; i<len; i++) {
+            var control = this.controls[i];
+            if (control.id == id) {
+                returnControl = control;
+                break;
+            }
+        }
+        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 
+     *     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)) ) {
+            if (control.div && (control.div.parentNode == this.viewPortDiv)) {
+                this.viewPortDiv.removeChild(control.div);
+            }
+            OpenLayers.Util.removeItem(this.controls, control);
+        }
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*                  Popup Functions                     */
+  /*                                                      */
+  /*     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
+     */
+    addPopup: function(popup, exclusive) {
+
+        if (exclusive) {
+            //remove all other popups from screen
+            for (var i = this.popups.length - 1; i >= 0; --i) {
+                this.removePopup(this.popups[i]);
+            }
+        }
+
+        popup.map = this;
+        this.popups.push(popup);
+        var popupDiv = popup.draw();
+        if (popupDiv) {
+            popupDiv.style.zIndex = this.Z_INDEX_BASE['Popup'] +
+                                    this.popups.length;
+            this.layerContainerDiv.appendChild(popupDiv);
+        }
+    },
+    
+    /** 
+    * APIMethod: removePopup
+    * 
+    * Parameters:
+    * popup - {<OpenLayers.Popup>}
+    */
+    removePopup: function(popup) {
+        OpenLayers.Util.removeItem(this.popups, popup);
+        if (popup.div) {
+            try { this.layerContainerDiv.removeChild(popup.div); }
+            catch (e) { } // Popups sometimes apparently get disconnected
+                      // from the layerContainerDiv, and cause complaints.
+        }
+        popup.map = null;
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*              Container Div Functions                 */
+  /*                                                      */
+  /*   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. 
+     *                     Note - A clone() of this locally cached variable is
+     *                     returned, so as not to allow users to modify it.
+     */
+    getSize: function () {
+        var size = null;
+        if (this.size != null) {
+            size = this.size.clone();
+        }
+        return size;
+    },
+
+    /**
+     * 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 
+     *     the "onresize" for an element)
+     */
+    updateSize: function() {
+        // the div might have moved on the page, also
+        var newSize = this.getCurrentSize();
+        if (newSize && !isNaN(newSize.h) && !isNaN(newSize.w)) {
+            this.events.clearMouseCache();
+            var oldSize = this.getSize();
+            if (oldSize == null) {
+                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();                
+                }
+    
+                var center = this.getCenter();
+    
+                if (this.baseLayer != null && center != null) {
+                    var zoom = this.getZoom();
+                    this.zoom = null;
+                    this.setCenter(center, zoom);
+                }
+    
+            }
+        }
+    },
+    
+    /**
+     * Method: getCurrentSize
+     * 
+     * Returns:
+     * {<OpenLayers.Size>} A new <OpenLayers.Size> object with the dimensions 
+     *                     of the map div
+     */
+    getCurrentSize: function() {
+
+        var size = new OpenLayers.Size(this.div.clientWidth, 
+                                       this.div.clientHeight);
+
+        if (size.w == 0 && size.h == 0 || isNaN(size.w) && isNaN(size.h)) {
+            size.w = this.div.offsetWidth;
+            size.h = this.div.offsetHeight;
+        }
+        if (size.w == 0 && size.h == 0 || isNaN(size.w) && isNaN(size.h)) {
+            size.w = parseInt(this.div.style.width);
+            size.h = parseInt(this.div.style.height);
+        }
+        return size;
+    },
+
+    /** 
+     * Method: calculateBounds
+     * 
+     * Parameters:
+     * center - {<OpenLayers.LonLat>} Default is this.getCenter()
+     * resolution - {float} Default is this.getResolution() 
+     * 
+     * Returns:
+     * {<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;
+    },
+
+
+  /********************************************************/
+  /*                                                      */
+  /*            Zoom, Center, Pan Functions               */
+  /*                                                      */
+  /*    The following functions handle the validation,    */
+  /*   getting and setting of the Zoom Level and Center   */
+  /*       as well as the panning of the Map              */
+  /*                                                      */
+  /********************************************************/
+    /**
+     * APIMethod: getCenter
+     * 
+     * Returns:
+     * {<OpenLayers.LonLat>}
+     */
+    getCenter: function () {
+        var center = null;
+        if (this.center) {
+            center = this.center.clone();
+        }
+        return center;
+    },
+
+
+    /**
+     * 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}
+     * options - {Object} Options to configure panning:
+     *  - *animate* {Boolean} Use panTo instead of setCenter. Default is true.
+     *  - *dragging* {Boolean} Call setCenter with dragging true.  Default is
+     *    false.
+     */
+    pan: function(dx, dy, options) {
+        options = OpenLayers.Util.applyDefaults(options, {
+            animate: true,
+            dragging: false
+        });
+        // getCenter
+        var centerPx = this.getViewPortPxFromLonLat(this.getCenter());
+
+        // 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);
+            if (options.animate) {
+                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>}
+     */
+    panTo: function(lonlat) {
+        if (this.panMethod && this.getExtent().scale(this.panRatio).containsLonLat(lonlat)) {
+            if (!this.panTween) {
+                this.panTween = new OpenLayers.Tween(this.panMethod);
+            }
+            var center = this.getCenter();
+
+            // center will not change, don't do nothing
+            if (lonlat.lon == center.lon &&
+                lonlat.lat == center.lat) {
+                return;
+            }
+
+            var from = {
+                lon: center.lon,
+                lat: center.lat
+            };
+            var to = {
+                lon: lonlat.lon,
+                lat: lonlat.lat
+            };
+            this.panTween.start(from, to, this.panDuration, {
+                callbacks: {
+                    start: OpenLayers.Function.bind(function(lonlat) {
+                        this.events.triggerEvent("movestart");
+                    }, this),
+                    eachStep: OpenLayers.Function.bind(function(lonlat) {
+                        lonlat = new OpenLayers.LonLat(lonlat.lon, lonlat.lat);
+                        this.moveTo(lonlat, this.zoom, {
+                            'dragging': true,
+                            'noEvent': true
+                        });
+                    }, this),
+                    done: OpenLayers.Function.bind(function(lonlat) {
+                        lonlat = new OpenLayers.LonLat(lonlat.lon, lonlat.lat);
+                        this.moveTo(lonlat, this.zoom, {
+                            'noEvent': true
+                        });
+                        this.events.triggerEvent("moveend");
+                    }, this)
+                }
+            });
+        } else {
+            this.setCenter(lonlat);
+        }
+    },
+
+    /**
+     * 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 
+     *                      movestart/end events
+     * forceZoomChange - {Boolean} Specifies whether or not to trigger zoom 
+     *                             change events (needed on baseLayer change)
+     *
+     * TBD: reconsider forceZoomChange in 3.0
+     */
+    setCenter: function(lonlat, zoom, dragging, forceZoomChange) {
+        this.moveTo(lonlat, zoom, {
+            'dragging': dragging,
+            'forceZoomChange': forceZoomChange,
+            'caller': 'setCenter'
+        });
+    },
+
+    /**
+     * Method: moveTo
+     *
+     * Parameters:
+     * lonlat - {<OpenLayers.LonLat>}
+     * zoom - {Integer}
+     * options - {Object}
+     */
+    moveTo: function(lonlat, zoom, options) {
+        if (!options) { 
+            options = {};
+        }
+        if (zoom != null) {
+            zoom = parseFloat(zoom);
+            if (!this.fractionalZoom) {
+                zoom = Math.round(zoom);
+            }
+        }
+        // dragging is false by default
+        var dragging = options.dragging;
+        // forceZoomChange is false by default
+        var forceZoomChange = options.forceZoomChange;
+        // noEvent is false by default
+        var noEvent = options.noEvent;
+
+        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(zoom == null) { 
+                zoom = this.getZoom(); 
+            }
+            var resolution = this.getResolutionForZoom(zoom);
+            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); 
+                } else if(extent.left < this.restrictedExtent.left) {
+                    lonlat = lonlat.add(this.restrictedExtent.left -
+                                        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) { 
+                    lonlat = lonlat.add(0, this.restrictedExtent.bottom -
+                                        extent.bottom); 
+                } 
+                else if(extent.top > this.restrictedExtent.top) { 
+                    lonlat = lonlat.add(0, this.restrictedExtent.top -
+                                        extent.top); 
+                } 
+            }
+        }
+        
+        var zoomChanged = forceZoomChange || (
+                            (this.isValidZoomLevel(zoom)) && 
+                            (zoom != this.getZoom()) );
+
+        var centerChanged = (this.isValidLonLat(lonlat)) && 
+                            (!lonlat.equals(this.center));
+
+
+        // if neither center nor zoom will change, no need to do anything
+        if (zoomChanged || centerChanged || !dragging) {
+
+            if (!this.dragging && !noEvent) {
+                this.events.triggerEvent("movestart");
+            }
+
+            if (centerChanged) {
+                if ((!zoomChanged) && (this.center)) { 
+                    // if zoom hasnt changed, just slide layerContainer
+                    //  (must be done before setting this.center to new value)
+                    this.centerLayerContainer(lonlat);
+                }
+                this.center = lonlat.clone();
+            }
+
+            // (re)set the layerContainerDiv's location
+            if ((zoomChanged) || (this.layerContainerOrigin == null)) {
+                this.layerContainerOrigin = this.center.clone();
+                this.layerContainerDiv.style.left = "0px";
+                this.layerContainerDiv.style.top  = "0px";
+            }
+
+            if (zoomChanged) {
+                this.zoom = zoom;
+                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    
+
+            if(this.baseLayer.visibility) {
+                this.baseLayer.moveTo(bounds, zoomChanged, dragging);
+                if(dragging) {
+                    this.baseLayer.events.triggerEvent("move");
+                } else {
+                    this.baseLayer.events.triggerEvent("moveend",
+                        {"zoomChanged": zoomChanged}
+                    );
+                }
+            }
+            
+            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) {
+                    var inRange = layer.calculateInRange();
+                    if (layer.inRange != inRange) {
+                        // the inRange property has changed. If the layer is
+                        // no longer in range, we turn it off right away. If
+                        // the layer is no longer out of range, the moveTo
+                        // call below will turn on the layer.
+                        layer.inRange = inRange;
+                        if (!inRange) {
+                            layer.display(false);
+                        }
+                        this.events.triggerEvent("changelayer", {
+                            layer: layer, property: "visibility"
+                        });
+                    }
+                    if (inRange && layer.visibility) {
+                        layer.moveTo(bounds, zoomChanged, dragging);
+                        if(dragging) {
+                            layer.events.triggerEvent("move");
+                        } else {
+                            layer.events.triggerEvent("moveend",
+                                {"zoomChanged": zoomChanged}
+                            );
+                        }
+                    }
+                }                
+            }
+            
+            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"); }
+        }
+
+        // even if nothing was done, we want to notify of this
+        if (!dragging && !noEvent) {
+            this.events.triggerEvent("moveend");
+        }
+        
+        // Store the map dragging state for later use
+        this.dragging = !!dragging; 
+
+    },
+
+    /** 
+     * Method: centerLayerContainer
+     * This function takes care to recenter the layerContainerDiv.
+     * 
+     * Parameters:
+     * lonlat - {<OpenLayers.LonLat>}
+     */
+    centerLayerContainer: function (lonlat) {
+
+        var originPx = this.getViewPortPxFromLonLat(this.layerContainerOrigin);
+        var newPx = this.getViewPortPxFromLonLat(lonlat);
+
+        if ((originPx != null) && (newPx != null)) {
+            this.layerContainerDiv.style.left = Math.round(originPx.x - newPx.x) + "px";
+            this.layerContainerDiv.style.top  = Math.round(originPx.y - newPx.y) + "px";
+        }
+    },
+
+    /**
+     * Method: isValidZoomLevel
+     * 
+     * Parameters:
+     * zoomLevel - {Integer}
+     * 
+     * Returns:
+     * {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 < 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
+     */
+    isValidLonLat: function(lonlat) {
+        var valid = false;
+        if (lonlat != null) {
+            var maxExtent = this.getMaxExtent();
+            valid = maxExtent.containsLonLat(lonlat);        
+        }
+        return valid;
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*                 Layer Options                        */
+  /*                                                      */
+  /*    Accessor functions to Layer Options parameters    */
+  /*                                                      */
+  /********************************************************/
+    
+    /**
+     * APIMethod: getProjection
+     * 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. 
+     * 
+     * Returns:
+     * {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.
+     *
+     * Returns:
+     * {<OpenLayers.Projection>} The Projection of the base layer.
+     */
+    getProjectionObject: function() {
+        var projection = null;
+        if (this.baseLayer != null) {
+            projection = this.baseLayer.projection;
+        }
+        return projection;
+    },
+    
+    /**
+     * APIMethod: getMaxResolution
+     * 
+     * Returns:
+     * {String} The Map's Maximum Resolution
+     */
+    getMaxResolution: function() {
+        var maxResolution = null;
+        if (this.baseLayer != null) {
+            maxResolution = this.baseLayer.maxResolution;
+        }
+        return maxResolution;
+    },
+        
+    /**
+     * APIMethod: getMaxExtent
+     *
+     * Parameters:
+     * options - {Object} 
+     * 
+     * Allowed Options:
+     * restricted - {Boolean} If true, returns restricted extent (if it is 
+     *     available.)
+     *
+     * Returns:
+     * {<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).
+     */
+    getMaxExtent: function (options) {
+        var maxExtent = null;
+        if(options && options.restricted && this.restrictedExtent){
+            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 
+     *           current baseLayer.
+     */
+    getNumZoomLevels: function() {
+        var numZoomLevels = null;
+        if (this.baseLayer != null) {
+            numZoomLevels = this.baseLayer.numZoomLevels;
+        }
+        return numZoomLevels;
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*                 Baselayer Functions                  */
+  /*                                                      */
+  /*    The following functions, all publicly exposed     */
+  /*       in the API?, are all merely wrappers to the    */
+  /*       the same calls on whatever layer is set as     */
+  /*                the current base layer                */
+  /*                                                      */
+  /********************************************************/
+
+    /**
+     * APIMethod: getExtent
+     * 
+     * Returns:
+     * {<OpenLayers.Bounds>} A Bounds object which represents the lon/lat 
+     *                       bounds of the current viewPort. 
+     *                       If no baselayer is set, returns null.
+     */
+    getExtent: function () {
+        var extent = null;
+        if (this.baseLayer != null) {
+            extent = this.baseLayer.getExtent();
+        }
+        return extent;
+    },
+
+    /**
+     * APIMethod: getResolution
+     * 
+     * Returns:
+     * {Float} The current resolution of the map. 
+     *         If no baselayer is set, returns null.
+     */
+    getResolution: function () {
+        var resolution = null;
+        if (this.baseLayer != null) {
+            resolution = this.baseLayer.getResolution();
+        } else if(this.allOverlays === true && this.layers.length > 0) {
+            // while adding the 1st layer to the map in allOverlays mode,
+            // this.baseLayer is not set yet when we need the resolution
+            // for calculateInRange.
+            resolution = this.layers[0].getResolution();
+        }
+        return resolution;
+    },
+
+    /**
+     * APIMethod: getUnits
+     * 
+     * Returns:
+     * {Float} The current units of the map. 
+     *         If no baselayer is set, returns null.
+     */
+    getUnits: function () {
+        var units = null;
+        if (this.baseLayer != null) {
+            units = this.baseLayer.units;
+        }
+        return units;
+    },
+
+     /**
+      * APIMethod: getScale
+      * 
+      * Returns:
+      * {Float} The current scale denominator of the map. 
+      *         If no baselayer is set, returns null.
+      */
+    getScale: function () {
+        var scale = null;
+        if (this.baseLayer != null) {
+            var res = this.getResolution();
+            var units = this.baseLayer.units;
+            scale = OpenLayers.Util.getScaleFromResolution(res, units);
+        }
+        return scale;
+    },
+
+
+    /**
+     * 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 
+     *     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.
+     */
+    getZoomForExtent: function (bounds, closest) {
+        var zoom = null;
+        if (this.baseLayer != null) {
+            zoom = this.baseLayer.getZoomForExtent(bounds, closest);
+        }
+        return zoom;
+    },
+
+    /**
+     * APIMethod: getResolutionForZoom
+     * 
+     * Parameter:
+     * zoom - {Float}
+     * 
+     * Returns:
+     * {Float} A suitable resolution for the specified zoom.  If no baselayer
+     *     is set, returns null.
+     */
+    getResolutionForZoom: function(zoom) {
+        var resolution = null;
+        if(this.baseLayer) {
+            resolution = this.baseLayer.getResolutionForZoom(zoom);
+        }
+        return resolution;
+    },
+
+    /**
+     * APIMethod: getZoomForResolution
+     * 
+     * Parameter:
+     * resolution - {Float}
+     * 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 
+     *     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.
+     */
+    getZoomForResolution: function(resolution, closest) {
+        var zoom = null;
+        if (this.baseLayer != null) {
+            zoom = this.baseLayer.getZoomForResolution(resolution, closest);
+        }
+        return zoom;
+    },
+
+  /********************************************************/
+  /*                                                      */
+  /*                  Zooming Functions                   */
+  /*                                                      */
+  /*    The following functions, all publicly exposed     */
+  /*       in the API, are all merely wrappers to the     */
+  /*               the setCenter() function               */
+  /*                                                      */
+  /********************************************************/
+  
+    /** 
+     * APIMethod: zoomTo
+     * Zoom to a specific zoom level
+     * 
+     * Parameters:
+     * zoom - {Integer}
+     */
+    zoomTo: function(zoom) {
+        if (this.isValidZoomLevel(zoom)) {
+            this.setCenter(null, zoom);
+        }
+    },
+    
+    /**
+     * APIMethod: zoomIn
+     * 
+     * Parameters:
+     * zoom - {int}
+     */
+    zoomIn: function() {
+        this.zoomTo(this.getZoom() + 1);
+    },
+    
+    /**
+     * APIMethod: zoomOut
+     * 
+     * Parameters:
+     * zoom - {int}
+     */
+    zoomOut: function() {
+        this.zoomTo(this.getZoom() - 1);
+    },
+
+    /**
+     * 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 
+     *     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. 
+            // 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 
+            // 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 
+            // 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 
+            // setCenter, so we have it wrap itself across the date line.
+            //
+            center = bounds.getCenterLonLat().wrapDateLine(maxExtent);
+        }
+        this.setCenter(center, this.getZoomForExtent(bounds, closest));
+    },
+
+    /** 
+     * APIMethod: zoomToMaxExtent
+     * Zoom to the full extent and recenter.
+     *
+     * Parameters:
+     * options - 
+     * 
+     * Allowed Options:
+     * restricted - {Boolean} True to zoom to restricted extent if it is 
+     *     set. Defaults to true.
+     */
+    zoomToMaxExtent: function(options) {
+        //restricted is true by default
+        var restricted = (options) ? options.restricted : true;
+
+        var maxExtent = this.getMaxExtent({
+            'restricted': restricted 
+        });
+        this.zoomToExtent(maxExtent);
+    },
+
+    /** 
+     * APIMethod: zoomToScale
+     * 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 
+     *     not exactly contain the entire extent.
+     *     Default is false.
+     * 
+     */
+    zoomToScale: function(scale, closest) {
+        var res = OpenLayers.Util.getResolutionFromScale(scale, 
+                                                         this.baseLayer.units);
+        var size = this.getSize();
+        var w_deg = size.w * res;
+        var h_deg = size.h * res;
+        var center = this.getCenter();
+
+        var extent = new OpenLayers.Bounds(center.lon - w_deg / 2,
+                                           center.lat - h_deg / 2,
+                                           center.lon + w_deg / 2,
+                                           center.lat + h_deg / 2);
+        this.zoomToExtent(extent, closest);
+    },
+    
+  /********************************************************/
+  /*                                                      */
+  /*             Translation Functions                    */
+  /*                                                      */
+  /*      The following functions translate between       */
+  /*           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 
+     *                       port <OpenLayers.Pixel>, translated into lon/lat
+     *                       by the current base layer.
+     */
+    getLonLatFromViewPortPx: function (viewPortPx) {
+        var lonlat = null; 
+        if (this.baseLayer != null) {
+            lonlat = this.baseLayer.getLonLatFromViewPortPx(viewPortPx);
+        }
+        return lonlat;
+    },
+
+    /**
+     * APIMethod: getViewPortPxFromLonLat
+     * 
+     * Parameters:
+     * lonlat - {<OpenLayers.LonLat>}
+     * 
+     * Returns:
+     * {<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; 
+        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 
+     *                       current base layer
+     */
+    getLonLatFromPixel: function (px) {
+        return this.getLonLatFromViewPortPx(px);
+    },
+
+    /**
+     * APIMethod: getPixelFromLonLat
+     * 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 
+     *     <OpenLayers.LonLat> translated into view port pixels by the current
+     *     base layer.
+     */
+    getPixelFromLonLat: function (lonlat) {
+        var px = this.getViewPortPxFromLonLat(lonlat);
+        px.x = Math.round(px.x);
+        px.y = Math.round(px.y);
+        return px;
+    },
+    
+    /**
+     * Method: getGeodesicPixelSize
+     * 
+     * Parameters:
+     * px - {<OpenLayers.Pixel>} The pixel to get the geodesic length for. If
+     *     not provided, the center pixel of the map viewport will be used.
+     * 
+     * Returns:
+     * {<OpenLayers.Size>} The geodesic size of the pixel in kilometers.
+     */
+    getGeodesicPixelSize: function(px) {
+        var lonlat = px ? this.getLonLatFromPixel(px) : (this.getCenter() ||
+            new OpenLayers.LonLat(0, 0));
+        var res = this.getResolution();
+        var left = lonlat.add(-res / 2, 0);
+        var right = lonlat.add(res / 2, 0);
+        var bottom = lonlat.add(0, -res / 2);
+        var top = lonlat.add(0, res / 2);
+        var dest = new OpenLayers.Projection("EPSG:4326");
+        var source = this.getProjectionObject() || dest;
+        if(!source.equals(dest)) {
+            left.transform(source, dest);
+            right.transform(source, dest);
+            bottom.transform(source, dest);
+            top.transform(source, dest);
+        }
+        
+        return new OpenLayers.Size(
+            OpenLayers.Util.distVincenty(left, right),
+            OpenLayers.Util.distVincenty(bottom, top)
+        );
+    },
+
+
+
+  //
+  // TRANSLATION: ViewPortPx <-> LayerPx
+  //
+
+    /**
+     * APIMethod: getViewPortPxFromLayerPx
+     * 
+     * Parameters:
+     * layerPx - {<OpenLayers.Pixel>}
+     * 
+     * Returns:
+     * {<OpenLayers.Pixel>} Layer Pixel translated into ViewPort Pixel 
+     *                      coordinates
+     */
+    getViewPortPxFromLayerPx:function(layerPx) {
+        var viewPortPx = null;
+        if (layerPx != null) {
+            var dX = parseInt(this.layerContainerDiv.style.left);
+            var dY = parseInt(this.layerContainerDiv.style.top);
+            viewPortPx = layerPx.add(dX, dY);            
+        }
+        return viewPortPx;
+    },
+    
+    /**
+     * APIMethod: getLayerPxFromViewPortPx
+     * 
+     * Parameters:
+     * viewPortPx - {<OpenLayers.Pixel>}
+     * 
+     * Returns:
+     * {<OpenLayers.Pixel>} ViewPort Pixel translated into Layer Pixel 
+     *                      coordinates
+     */
+    getLayerPxFromViewPortPx:function(viewPortPx) {
+        var layerPx = null;
+        if (viewPortPx != null) {
+            var dX = -parseInt(this.layerContainerDiv.style.left);
+            var dY = -parseInt(this.layerContainerDiv.style.top);
+            layerPx = viewPortPx.add(dX, dY);
+            if (isNaN(layerPx.x) || isNaN(layerPx.y)) {
+                layerPx = null;
+            }
+        }
+        return layerPx;
+    },
+    
+  //
+  // TRANSLATION: LonLat <-> LayerPx
+  //
+
+    /**
+     * Method: getLonLatFromLayerPx
+     * 
+     * Parameters:
+     * px - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * {<OpenLayers.LonLat>}
+     */
+    getLonLatFromLayerPx: function (px) {
+       //adjust for displacement of layerContainerDiv
+       px = this.getViewPortPxFromLayerPx(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 
+     *                      by the current base layer
+     */
+    getLayerPxFromLonLat: function (lonlat) {
+       //adjust for displacement of layerContainerDiv
+       var px = this.getPixelFromLonLat(lonlat);
+       return this.getLayerPxFromViewPortPx(px);         
+    },
+
+    CLASS_NAME: "OpenLayers.Map"
+});
+
+/**
+ * Constant: TILE_WIDTH
+ * {Integer} 256 Default tile width (unless otherwise specified)
+ */
+OpenLayers.Map.TILE_WIDTH = 256;
+/**
+ * Constant: TILE_HEIGHT
+ * {Integer} 256 Default tile height (unless otherwise specified)
+ */
+OpenLayers.Map.TILE_HEIGHT = 256;
diff --git a/lib/OpenLayers/Marker.js b/lib/OpenLayers/Marker.js
new file mode 100644
index 0000000..ad850aa
--- /dev/null
+++ b/lib/OpenLayers/Marker.js
@@ -0,0 +1,242 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Events.js
+ * @requires OpenLayers/Icon.js
+ */
+
+/**
+ * Class: OpenLayers.Marker
+ * 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>.
+ *
+ * Example:
+ * (code)
+ * var markers = new OpenLayers.Layer.Markers( "Markers" );
+ * map.addLayer(markers);
+ *
+ * var size = new OpenLayers.Size(21,25);
+ * var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
+ * var icon = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png', size, offset);
+ * markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon));
+ * markers.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0),icon.clone()));
+ *
+ * (end)
+ *
+ * Note that if you pass an icon into the Marker constructor, it will take
+ * that icon and use it. This means that you should not share icons between
+ * markers -- you use them once, but you should clone() for any additional
+ * markers using that same icon.
+ */
+OpenLayers.Marker = OpenLayers.Class({
+    
+    /** 
+     * Property: icon 
+     * {<OpenLayers.Icon>} The icon used by this marker.
+     */
+    icon: null,
+
+    /** 
+     * Property: lonlat 
+     * {<OpenLayers.LonLat>} location of object
+     */
+    lonlat: null,
+    
+    /** 
+     * Property: events 
+     * {<OpenLayers.Events>} the event handler.
+     */
+    events: null,
+    
+    /** 
+     * 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
+     * icon - {<OpenLayers.Icon>}  the icon for this marker
+     */
+    initialize: function(lonlat, icon) {
+        this.lonlat = lonlat;
+        
+        var newIcon = (icon) ? icon : OpenLayers.Marker.defaultIcon();
+        if (this.icon == null) {
+            this.icon = newIcon;
+        } else {
+            this.icon.url = newIcon.url;
+            this.icon.size = newIcon.size;
+            this.icon.offset = newIcon.offset;
+            this.icon.calculateOffset = newIcon.calculateOffset;
+        }
+        this.events = new OpenLayers.Events(this, this.icon.imageDiv, null);
+    },
+    
+    /**
+     * APIMethod: destroy
+     * 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.)
+     */
+    destroy: function() {
+        // erase any drawn features
+        this.erase();
+
+        this.map = null;
+
+        this.events.destroy();
+        this.events = null;
+
+        if (this.icon != null) {
+            this.icon.destroy();
+            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 
+    * location passed-in
+    */
+    draw: function(px) {
+        return this.icon.draw(px);
+    }, 
+
+    /** 
+    * Method: erase
+    * Erases any drawn elements for this marker.
+    */
+    erase: function() {
+        if (this.icon != null) {
+            this.icon.erase();
+        }
+    }, 
+
+    /**
+    * Method: moveTo
+    * Move the marker to the new location.
+    *
+    * Parameters:
+    * px - {<OpenLayers.Pixel>} the pixel position to move to
+    */
+    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;   
+    },
+
+    /**
+     * Method: onScreen
+     *
+     * Returns:
+     * {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.
+     *
+     * Parameters:
+     * inflate - {float} the ratio to enlarge the marker by (passing 2
+     *                   will double the size).
+     */
+    inflate: function(inflate) {
+        if (this.icon) {
+            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 
+     *   its icon
+     * 
+     * Parameters:
+     * opacity - {float}  Specified as fraction (0.4, etc)
+     */
+    setOpacity: function(opacity) {
+        this.icon.setOpacity(opacity);
+    },
+
+    /**
+     * Method: setUrl
+     * Change URL of the Icon Image.
+     * 
+     * url - {String} 
+     */
+    setUrl: function(url) {
+        this.icon.setUrl(url);
+    },    
+
+    /** 
+     * Method: display
+     * Hide or show the icon
+     * 
+     * display - {Boolean} 
+     */
+    display: function(display) {
+        this.icon.display(display);
+    },
+
+    CLASS_NAME: "OpenLayers.Marker"
+});
+
+
+/**
+ * Function: defaultIcon
+ * Creates a default <OpenLayers.Icon>.
+ * 
+ * Returns:
+ * {<OpenLayers.Icon>} A default OpenLayers.Icon to use for a marker
+ */
+OpenLayers.Marker.defaultIcon = function() {
+    var url = OpenLayers.Util.getImagesLocation() + "marker.png";
+    var size = new OpenLayers.Size(21, 25);
+    var calculateOffset = function(size) {
+                    return new OpenLayers.Pixel(-(size.w/2), -size.h);
+                 };
+
+    return new OpenLayers.Icon(url, size, null, calculateOffset);        
+};
+    
+
diff --git a/lib/OpenLayers/Marker/Box.js b/lib/OpenLayers/Marker/Box.js
new file mode 100644
index 0000000..ca4f5ea
--- /dev/null
+++ b/lib/OpenLayers/Marker/Box.js
@@ -0,0 +1,120 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Marker.js
+ */
+
+/**
+ * Class: OpenLayers.Marker.Box
+ *
+ * Inherits from:
+ *  - <OpenLayers.Marker> 
+ */
+OpenLayers.Marker.Box = OpenLayers.Class(OpenLayers.Marker, {
+
+    /** 
+     * Property: bounds 
+     * {<OpenLayers.Bounds>} 
+     */
+    bounds: null,
+
+    /** 
+     * Property: div 
+     * {DOMElement} 
+     */
+    div: null,
+    
+    /** 
+     * Constructor: OpenLayers.Marker.Box
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>} 
+     * borderColor - {String} 
+     * borderWidth - {int} 
+     */
+    initialize: function(bounds, borderColor, borderWidth) {
+        this.bounds = bounds;
+        this.div    = OpenLayers.Util.createDiv();
+        this.div.style.overflow = 'hidden';
+        this.events = new OpenLayers.Events(this, this.div, null);
+        this.setBorder(borderColor, borderWidth);
+    },
+
+    /**
+     * Method: destroy 
+     */    
+    destroy: function() {
+
+        this.bounds = null;
+        this.div = null;
+
+        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
+     */
+    setBorder: function (color, width) {
+        if (!color) {
+            color = "red";
+        }
+        if (!width) {
+            width = 2;
+        }
+        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 
+    *         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.
+     */
+    onScreen:function() {
+        var onScreen = false;
+        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: function(display) {
+        this.div.style.display = (display) ? "" : "none";
+    },
+
+    CLASS_NAME: "OpenLayers.Marker.Box"
+});
+
diff --git a/lib/OpenLayers/Popup.js b/lib/OpenLayers/Popup.js
new file mode 100644
index 0000000..449d297
--- /dev/null
+++ b/lib/OpenLayers/Popup.js
@@ -0,0 +1,1052 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * 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.  
+ * 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", 
+ *                    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 
+     */
+    events: null,
+    
+    /** Property: id
+     * {String} the unique identifier assigned to this popup.
+     */
+    id: "",
+
+    /** 
+     * Property: lonlat 
+     * {<OpenLayers.LonLat>} the position of this popup on the map
+     */
+    lonlat: null,
+
+    /** 
+     * Property: div 
+     * {DOMElement} the div that contains this popup.
+     */
+    div: null,
+
+    /** 
+     * Property: contentSize 
+     * {<OpenLayers.Size>} the width and height of the content.
+     */
+    contentSize: null,    
+
+    /** 
+     * Property: size 
+     * {<OpenLayers.Size>} the width and height of the popup.
+     */
+    size: null,    
+
+    /** 
+     * Property: contentHTML 
+     * {String} An HTML string for this popup to display.
+     */
+    contentHTML: null,
+    
+    /** 
+     * Property: backgroundColor 
+     * {String} the background color used by the popup.
+     */
+    backgroundColor: "",
+    
+    /** 
+     * Property: opacity 
+     * {float} the opacity of this popup (between 0.0 and 1.0)
+     */
+    opacity: "",
+
+    /** 
+     * Property: border 
+     * {String} the border size of the popup.  (eg 2px)
+     */
+    border: "",
+    
+    /** 
+     * Property: contentDiv 
+     * {DOMElement} a reference to the element that holds the content of
+     *              the div.
+     */
+    contentDiv: null,
+    
+    /** 
+     * 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.
+     */
+    autoSize: false,
+
+    /**
+     * APIProperty: minSize
+     * {<OpenLayers.Size>} Minimum size allowed for the popup's contents.
+     */
+    minSize: null,
+
+    /**
+     * APIProperty: maxSize
+     * {<OpenLayers.Size>} Maximum size allowed for the popup's contents.
+     */
+    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 
+     *     padding of the content div inside the popup. This was originally
+     *     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 
+     *     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 
+     *     re-initialized, which is troublesome.
+     *     With this property the hack can be disabled.
+     */
+    disableFirefoxOverflowHack: false,
+
+    /**
+     * 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, 
+     *     instead of an <OpenLayers.Bounds> object.
+     */
+    fixPadding: function() {
+        if (typeof this.padding == "number") {
+            this.padding = new OpenLayers.Bounds(
+                this.padding, this.padding, this.padding, this.padding
+            );
+        }
+    },
+
+    /**
+     * APIProperty: panMapIfOutOfView
+     * {Boolean} When drawn, pan map such that the entire popup is visible in
+     *     the current viewport (if necessary).
+     *     Default is false.
+     */
+    panMapIfOutOfView: false,
+    
+    /**
+     * 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,
+
+    /**
+     * APIProperty: closeOnMove
+     * {Boolean} When map pans, close the popup.
+     *     Default is false.
+     */
+    closeOnMove: false,
+    
+    /** 
+     * 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: 
+    * id - {String} a unqiue identifier for this popup.  If null is passed
+    *               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   
+    *                                 popup.
+    * closeBox - {Boolean}            Whether to display a close box inside
+    *                                 the popup.
+    * closeBoxCallback - {Function}   Function to be called on closeBox click.
+    */
+    initialize:function(id, lonlat, contentSize, contentHTML, closeBox, closeBoxCallback) {
+        if (id == null) {
+            id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
+        }
+
+        this.id = id;
+        this.lonlat = lonlat;
+
+        this.contentSize = (contentSize != null) ? contentSize 
+                                  : new OpenLayers.Size(
+                                                   OpenLayers.Popup.WIDTH,
+                                                   OpenLayers.Popup.HEIGHT);
+        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, 
+                                             null, null, null, "hidden");
+        this.div.className = this.displayClass;
+        
+        var groupDivId = this.id + "_GroupDiv";
+        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(), 
+                                                    null, "relative");
+        this.contentDiv.className = this.contentDisplayClass;
+        this.groupDiv.appendChild(this.contentDiv);
+        this.div.appendChild(this.groupDiv);
+
+        if (closeBox) {
+            this.addCloseBox(closeBoxCallback);
+        } 
+
+        this.registerEvents();
+    },
+
+    /** 
+     * Method: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+
+        this.id = null;
+        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); 
+            this.groupDiv.removeChild(this.closeDiv);
+        }
+        this.closeDiv = null;
+        
+        this.div.removeChild(this.groupDiv);
+        this.groupDiv = null;
+
+        if (this.map != null) {
+            this.map.removePopup(this);
+        }
+        this.map = null;
+        this.div = null;
+        
+        this.autoSize = null;
+        this.minSize = null;
+        this.maxSize = null;
+        this.padding = null;
+        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
+    */
+    draw: function(px) {
+        if (px == null) {
+            if ((this.lonlat != null) && (this.map != null)) {
+                px = this.map.getLayerPxFromLonLat(this.lonlat);
+            }
+        }
+
+        // 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() {
+                var style = document.defaultView.getComputedStyle(
+                    this.contentDiv, null
+                );
+                var currentOverflow = style.getPropertyValue("overflow");
+                if (currentOverflow != "hidden") {
+                    this.contentDiv._oldOverflow = currentOverflow;
+                    this.contentDiv.style.overflow = "hidden";
+                }
+            });
+            this.map.events.register("moveend", this, function() {
+                var oldOverflow = this.contentDiv._oldOverflow;
+                if (oldOverflow) {
+                    this.contentDiv.style.overflow = oldOverflow;
+                    this.contentDiv._oldOverflow = null;
+                }
+            });
+        }
+
+        this.moveTo(px);
+        if (!this.autoSize && !this.size) {
+            this.setSize(this.contentSize);
+        }
+        this.setBackgroundColor();
+        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, 
+     * 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);           
+            }    
+        }
+    },
+
+    /**
+     * Method: moveTo
+     * 
+     * Parameters:
+     * px - {<OpenLayers.Pixel>} the top and left position of the popup div. 
+     */
+    moveTo: function(px) {
+        if ((px != null) && (this.div != null)) {
+            this.div.style.left = px.x + "px";
+            this.div.style.top = px.y + "px";
+        }
+    },
+
+    /**
+     * Method: visible
+     *
+     * Returns:      
+     * {Boolean} Boolean indicating whether or not the popup is visible
+     */
+    visible: function() {
+        return OpenLayers.Element.visible(this.div);
+    },
+
+    /**
+     * Method: toggle
+     * Toggles visibility of the popup.
+     */
+    toggle: function() {
+        if (this.visible()) {
+            this.hide();
+        } else {
+            this.show();
+        }
+    },
+
+    /**
+     * Method: show
+     * Makes the popup visible.
+     */
+    show: function() {
+        OpenLayers.Element.show(this.div);
+
+        if (this.panMapIfOutOfView) {
+            this.panIntoView();
+        }    
+    },
+
+    /**
+     * Method: hide
+     * Makes the popup invisible.
+     */
+    hide: function() {
+        OpenLayers.Element.hide(this.div);
+    },
+
+    /**
+     * Method: setSize
+     * Used to adjust the size of the popup. 
+     *
+     * Parameters:
+     * 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". 
+        var contentDivPadding = this.getContentDivPadding();
+        var wPadding = contentDivPadding.left + contentDivPadding.right;
+        var hPadding = contentDivPadding.top + contentDivPadding.bottom;
+
+        // take into account the popup's 'padding' property
+        this.fixPadding();
+        wPadding += this.padding.left + this.padding.right;
+        hPadding += this.padding.top + this.padding.bottom;
+
+        // make extra space for the close div
+        if (this.closeDiv) {
+            var closeDivWidth = parseInt(this.closeDiv.style.width);
+            wPadding += closeDivWidth + contentDivPadding.right;
+        }
+
+        //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 
+        // me want to shoot someone, but so it goes.
+        if (OpenLayers.Util.getBrowserName() == "msie") {
+            this.contentSize.w += 
+                contentDivPadding.left + contentDivPadding.right;
+            this.contentSize.h += 
+                contentDivPadding.bottom + contentDivPadding.top;
+        }
+
+        if (this.div != null) {
+            this.div.style.width = this.size.w + "px";
+            this.div.style.height = this.size.h + "px";
+        }
+        if (this.contentDiv != null){
+            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 
+     *     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 + 
+            "</div>";
+ 
+        var containerElement = (this.map) ? this.map.layerContainerDiv
+        								  : document.body;
+        var realSize = OpenLayers.Util.getRenderedDimensions(
+            preparedHTML, null,	{
+                displayClass: this.displayClass,
+                containerElement: containerElement
+            }
+        );
+
+        // is the "real" size of the div is safe to display in our map?
+        var safeSize = this.getSafeContentSize(realSize);
+
+        var newSize = null;
+        if (safeSize.equals(realSize)) {
+            //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 
+            // 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.                
+                newSize = safeSize;
+            } else {
+                //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, {
+                        displayClass: this.contentDisplayClass,
+                        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 
+                // adjust for that.
+                //
+                var currentOverflow = OpenLayers.Element.getStyle(
+                    this.contentDiv, "overflow"
+                );
+                if ( (currentOverflow != "hidden") && 
+                     (clippedSize.equals(safeSize)) ) {
+                    var scrollBar = OpenLayers.Util.getScrollbarWidth();
+                    if (fixedSize.w) {
+                        clippedSize.h += scrollBar;
+                    } else {
+                        clippedSize.w += scrollBar;
+                    }
+                }
+                
+                newSize = this.getSafeContentSize(clippedSize);
+            }
+        }                        
+        this.setSize(newSize);     
+    },    
+
+    /**
+     * Method: setBackgroundColor
+     * Sets the background color of the popup.
+     *
+     * Parameters:
+     * color - {String} the background color.  eg "#FFBBBB"
+     */
+    setBackgroundColor:function(color) { 
+        if (color != undefined) {
+            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).   
+     */
+    setOpacity:function(opacity) { 
+        if (opacity != undefined) {
+            this.opacity = opacity; 
+        }
+        
+        if (this.div != null) {
+            // for Mozilla and Safari
+            this.div.style.opacity = this.opacity;
+
+            // 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 
+     */
+    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.
+     *
+     * Parameters:
+     * contentHTML - {String} HTML for the div.
+     */
+    setContentHTML:function(contentHTML) {
+
+        if (contentHTML != null) {
+            this.contentHTML = contentHTML;
+        }
+       
+        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();
+
+                //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() { 
+
+        // 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 
+        // 'img' properties in the context.
+        //
+        var onImgLoad = function() {
+            
+            this.popup.updateSize();
+     
+            if ( this.popup.visible() && this.popup.panMapIfOutOfView ) {
+                this.popup.panIntoView();
+            }
+
+            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 
+        // popup accordingly to its new size.
+        var images = this.contentDiv.getElementsByTagName("img");
+        for (var i = 0, len = images.length; i < len; i++) {
+            var img = images[i];
+            if (img.width == 0 || img.height == 0) {
+
+                var context = {
+                    'popup': this,
+                    'img': img
+                };
+
+                //expando this function to the image itself before registering
+                // it. This way we can easily and properly unregister it.
+                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 
+     *     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". 
+        var contentDivPadding = this.getContentDivPadding();
+        var wPadding = contentDivPadding.left + contentDivPadding.right;
+        var hPadding = contentDivPadding.top + contentDivPadding.bottom;
+
+        // take into account the popup's 'padding' property
+        this.fixPadding();
+        wPadding += this.padding.left + this.padding.right;
+        hPadding += this.padding.top + this.padding.bottom;
+
+        if (this.closeDiv) {
+            var closeDivWidth = parseInt(this.closeDiv.style.width);
+            wPadding += closeDivWidth + contentDivPadding.right;
+        }
+
+        // prevent the popup from being smaller than a specified minimal size
+        if (this.minSize) {
+            safeContentSize.w = Math.max(safeContentSize.w, 
+                (this.minSize.w - wPadding));
+            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, 
+                (this.maxSize.w - wPadding));
+            safeContentSize.h = Math.min(safeContentSize.h, 
+                (this.maxSize.h - hPadding));
+        }
+        
+        //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);
+                switch (this.relativePosition) {
+                    case "tr":
+                        extraX = px.x;
+                        extraY = this.map.size.h - px.y;
+                        break;
+                    case "tl":
+                        extraX = this.map.size.w - px.x;
+                        extraY = this.map.size.h - px.y;
+                        break;
+                    case "bl":
+                        extraX = this.map.size.w - px.x;
+                        extraY = px.y;
+                        break;
+                    case "br":
+                        extraX = px.x;
+                        extraY = px.y;
+                        break;
+                    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 - 
+                hPadding - extraY;
+            
+            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. 
+     *
+     *     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:
+     * {<OpenLayers.Bounds>}
+     */
+    getContentDivPadding: function() {
+
+        //use cached value if we have it
+        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        
+            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 = "";
+            }
+        }
+        return contentDivPadding;
+    },
+
+    /**
+     * Method: addCloseBox
+     * 
+     * Parameters:
+     * callback - {Function} The callback to be called when the close button
+     *     is clicked.
+     */
+    addCloseBox: function(callback) {
+
+        this.closeDiv = OpenLayers.Util.createDiv(
+            this.id + "_close", null, new OpenLayers.Size(17, 17)
+        );
+        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);
+
+        var closePopup = callback || function(e) {
+            this.hide();
+            OpenLayers.Event.stop(e);
+        };
+        OpenLayers.Event.observe(this.closeDiv, "click", 
+                OpenLayers.Function.bindAsEventListener(closePopup, this));
+    },
+
+    /**
+     * Method: panIntoView
+     * 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, 
+        // 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 
+        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 
+        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 
+     *   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. 
+     *   
+     *   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 
+     *    hyperlinks or drag-selecting text.
+     */
+     registerEvents:function() {
+        this.events = new OpenLayers.Events(this, this.div, null, true);
+
+        this.events.on({
+            "mousedown": this.onmousedown,
+            "mousemove": this.onmousemove,
+            "mouseup": this.onmouseup,
+            "click": this.onclick,
+            "mouseout": this.onmouseout,
+            "dblclick": this.ondblclick,
+            scope: this
+        });
+        
+     },
+
+    /** 
+     * Method: onmousedown 
+     * When mouse goes down within the popup, make a note of
+     *   it locally, and then do not propagate the mousedown 
+     *   (but do so safely so that user can select text inside)
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    onmousedown: function (evt) {
+        this.mousedown = true;
+        OpenLayers.Event.stop(evt, true);
+    },
+
+    /** 
+     * Method: onmousemove
+     * 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} 
+     */
+    onmousemove: function (evt) {
+        if (this.mousedown) {
+            OpenLayers.Event.stop(evt, true);
+        }
+    },
+
+    /** 
+     * 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 
+     *   select text inside
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    onmouseup: function (evt) {
+        if (this.mousedown) {
+            this.mousedown = false;
+            OpenLayers.Event.stop(evt, true);
+        }
+    },
+
+    /**
+     * Method: onclick
+     * Ignore clicks, but allowing default browser handling
+     * 
+     * Parameters:
+     * 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} 
+     */
+    onmouseout: function (evt) {
+        this.mousedown = false;
+    },
+    
+    /** 
+     * Method: ondblclick
+     * Ignore double-clicks, but allowing default browser handling
+     * 
+     * Parameters:
+     * evt - {Event} 
+     */
+    ondblclick: function (evt) {
+        OpenLayers.Event.stop(evt, true);
+    },
+
+    CLASS_NAME: "OpenLayers.Popup"
+});
+
+OpenLayers.Popup.WIDTH = 200;
+OpenLayers.Popup.HEIGHT = 200;
+OpenLayers.Popup.COLOR = "white";
+OpenLayers.Popup.OPACITY = 1;
+OpenLayers.Popup.BORDER = "0px";
diff --git a/lib/OpenLayers/Popup/Anchored.js b/lib/OpenLayers/Popup/Anchored.js
new file mode 100644
index 0000000..b89b211
--- /dev/null
+++ b/lib/OpenLayers/Popup/Anchored.js
@@ -0,0 +1,198 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Popup.js
+ */
+
+/**
+ * Class: OpenLayers.Popup.Anchored
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Popup>
+ */
+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, 
+     *     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.
+     */
+    keepInMap: true,
+
+    /**
+     * Parameter: anchor
+     * {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> 
+    *     and 'offset' <OpenLayers.Pixel> (generally an <OpenLayers.Icon>).
+    * closeBox - {Boolean}
+    * closeBoxCallback - {Function} Function to be called on closeBox click.
+    */
+    initialize:function(id, lonlat, contentSize, contentHTML, anchor, closeBox,
+                        closeBoxCallback) {
+        var newArguments = [
+            id, lonlat, contentSize, contentHTML, closeBox, closeBoxCallback
+        ];
+        OpenLayers.Popup.prototype.initialize.apply(this, newArguments);
+
+        this.anchor = (anchor != null) ? anchor 
+                                       : { size: new OpenLayers.Size(0,0),
+                                           offset: new OpenLayers.Pixel(0,0)};
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        this.anchor = null;
+        this.relativePosition = null;
+        
+        OpenLayers.Popup.prototype.destroy.apply(this, arguments);        
+    },
+
+    /**
+     * APIMethod: show
+     * 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)
+     */
+    show: function() {
+        this.updatePosition();
+        OpenLayers.Popup.prototype.show.apply(this, arguments);
+    },
+
+    /**
+     * 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 
+     *     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);        
+        OpenLayers.Popup.prototype.moveTo.apply(this, newArguments);
+        
+        //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();
+        }
+    },
+
+    /**
+     * APIMethod: setSize
+     * 
+     * Parameters:
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     *     contents div (in pixels).
+     */
+    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 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 
+     *     here, since the popup looks exactly the same in all four positions.
+     *     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) : this.anchor.size.h;
+        
+        var left = (this.relativePosition.charAt(1) == 'l');
+        newPx.x += (left) ? -(size.w + this.anchor.size.w) : this.anchor.size.w;
+
+        return newPx;   
+    },
+
+    CLASS_NAME: "OpenLayers.Popup.Anchored"
+});
diff --git a/lib/OpenLayers/Popup/AnchoredBubble.js b/lib/OpenLayers/Popup/AnchoredBubble.js
new file mode 100644
index 0000000..94809ca
--- /dev/null
+++ b/lib/OpenLayers/Popup/AnchoredBubble.js
@@ -0,0 +1,190 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Popup/Anchored.js
+ */
+
+/**
+ * Class: OpenLayers.Popup.AnchoredBubble
+ * 
+ * Inherits from: 
+ *  - <OpenLayers.Popup.Anchored>
+ */
+OpenLayers.Popup.AnchoredBubble = 
+  OpenLayers.Class(OpenLayers.Popup.Anchored, {
+
+    /**
+     * Property: rounded
+     * {Boolean} Has the popup been rounded yet?
+     */
+    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>) 
+     *     (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
+        );
+        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(); 
+        this.setOpacity();
+
+        return this.div;
+    },
+
+    /**
+     * Method: updateRelativePosition
+     * The popup has been moved to a new relative location, in which case
+     *     we will want to re-do the rico corners.
+     */
+    updateRelativePosition: function() {
+        this.setRicoCorners();
+    },
+
+    /**
+     * APIMethod: setSize
+     * 
+     * Parameters:
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     *     contents div (in pixels).
+     */
+    setSize:function(contentSize) { 
+        OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments);
+
+        this.setRicoCorners();
+    },  
+
+    /**
+     * APIMethod: setBackgroundColor
+     * 
+     * Parameters:
+     * color - {String}
+     */
+    setBackgroundColor:function(color) { 
+        if (color != undefined) {
+            this.backgroundColor = color; 
+        }
+        
+        if (this.div != null) {
+            if (this.contentDiv != null) {
+                this.div.style.background = "transparent";
+                OpenLayers.Rico.Corner.changeColor(this.groupDiv, 
+                                                   this.backgroundColor);
+            }
+        }
+    },  
+    
+    /**
+     * APIMethod: setOpacity
+     * 
+     * Parameters: 
+     * opacity - {float}
+     */
+    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, 
+                                                     this.opacity);
+            }
+        }
+    },  
+ 
+    /** 
+     * Method: setBorder
+     * Always sets border to 0. Bubble Popups can not have a border.
+     * 
+     * Parameters:
+     * border - {Integer}
+     */
+    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,
+                       bgColor: "transparent",
+                         blend: false};
+
+        if (!this.rounded) {
+            OpenLayers.Rico.Corner.round(this.div, options);
+            this.rounded = true;
+        } else {
+            OpenLayers.Rico.Corner.reRound(this.groupDiv, options);
+            //set the popup color and opacity
+            this.setBackgroundColor(); 
+            this.setOpacity();
+        }
+    },
+
+    /** 
+     * Method: getCornersToRound
+     *  
+     * Returns:
+     * {String} The proper corners string ("tr tl bl br") for rico to round.
+     */
+    getCornersToRound:function() {
+
+        var corners = ['tl', 'tr', 'bl', 'br'];
+
+        //we want to round all the corners _except_ the opposite one. 
+        var corner = OpenLayers.Bounds.oppositeQuadrant(this.relativePosition);
+        OpenLayers.Util.removeItem(corners, corner);
+
+        return corners.join(" ");
+    },
+
+    CLASS_NAME: "OpenLayers.Popup.AnchoredBubble"
+});
+
+/**
+ * Constant: CORNER_SIZE
+ * {Integer} 5. Border space for the RICO corners.
+ */
+OpenLayers.Popup.AnchoredBubble.CORNER_SIZE = 5;
+
diff --git a/lib/OpenLayers/Popup/Framed.js b/lib/OpenLayers/Popup/Framed.js
new file mode 100644
index 0000000..6dfc763
--- /dev/null
+++ b/lib/OpenLayers/Popup/Framed.js
@@ -0,0 +1,343 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Popup/Anchored.js
+ */
+
+/**
+ * Class: OpenLayers.Popup.Framed
+ * 
+ * Inherits from:
+ *  - <OpenLayers.Popup.Anchored>
+ */
+OpenLayers.Popup.Framed =
+  OpenLayers.Class(OpenLayers.Popup.Anchored, {
+
+    /**
+     * Property: imageSrc
+     * {String} location of the image to be used as the popup frame
+     */
+    imageSrc: null,
+
+    /**
+     * Property: imageSize
+     * {<OpenLayers.Size>} Size (measured in pixels) of the image located
+     *     by the 'imageSrc' property.
+     */
+    imageSize: null,
+
+    /**
+     * APIProperty: isAlphaImage
+     * {Boolean} The image has some alpha and thus needs to use the alpha 
+     *     image hack. Note that setting this to true will have no noticeable
+     *     effect in FF or IE7 browsers, but will all but crush the ie6 
+     *     browser. 
+     *     Default is false.
+     */
+    isAlphaImage: false,
+
+    /**
+     * Property: positionBlocks
+     * {Object} Hash of different position blocks (Object/Hashs). Each block 
+     *     will be keyed by a two-character 'relativePosition' 
+     *     code string (ie "tl", "tr", "bl", "br"). Block properties are 
+     *     'offset', 'padding' (self-explanatory), and finally the 'blocks'
+     *     parameter, which is an array of the block objects. 
+     * 
+     *     Each block object must have 'size', 'anchor', and 'position' 
+     *     properties.
+     * 
+     *     Note that positionBlocks should never be modified at runtime.
+     */
+    positionBlocks: null,
+
+    /**
+     * Property: blocks
+     * {Array[Object]} Array of objects, each of which is one "block" of the 
+     *     popup. Each block has a 'div' and an 'image' property, both of 
+     *     which are DOMElements, and the latter of which is appended to the 
+     *     former. These are reused as the popup goes changing positions for
+     *     great economy and elegance.
+     */
+    blocks: null,
+
+    /** 
+     * APIProperty: fixedRelativePosition
+     * {Boolean} We want the framed popup to work dynamically placed relative
+     *     to its anchor but also in just one fixed position. A well designed
+     *     framed popup will have the pixels and logic to display itself in 
+     *     any of the four relative positions, but (understandably), this will
+     *     not be the case for all of them. By setting this property to 'true', 
+     *     framed popup will not recalculate for the best placement each time
+     *     it's open, but will always open the same way. 
+     *     Note that if this is set to true, it is generally advisable to also
+     *     set the 'panIntoView' property to true so that the popup can be 
+     *     scrolled into view (since it will often be offscreen on open)
+     *     Default is false.
+     */
+    fixedRelativePosition: false,
+
+    /** 
+     * Constructor: OpenLayers.Popup.Framed
+     * 
+     * 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>) 
+     *     (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) {
+
+        OpenLayers.Popup.Anchored.prototype.initialize.apply(this, arguments);
+
+        if (this.fixedRelativePosition) {
+            //based on our decided relativePostion, set the current padding
+            // this keeps us from getting into trouble 
+            this.updateRelativePosition();
+            
+            //make calculateRelativePosition always return the specified
+            // fixed position.
+            this.calculateRelativePosition = function(px) {
+                return this.relativePosition;
+            };
+        }
+
+        this.contentDiv.style.position = "absolute";
+        this.contentDiv.style.zIndex = 1;
+
+        if (closeBox) {
+            this.closeDiv.style.zIndex = 1;
+        }
+
+        this.groupDiv.style.position = "absolute";
+        this.groupDiv.style.top = "0px";
+        this.groupDiv.style.left = "0px";
+        this.groupDiv.style.height = "100%";
+        this.groupDiv.style.width = "100%";
+    },
+
+    /** 
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        this.imageSrc = null;
+        this.imageSize = null;
+        this.isAlphaImage = null;
+
+        this.fixedRelativePosition = false;
+        this.positionBlocks = null;
+
+        //remove our blocks
+        for(var i = 0; i < this.blocks.length; i++) {
+            var block = this.blocks[i];
+
+            if (block.image) {
+                block.div.removeChild(block.image);
+            }
+            block.image = null;
+
+            if (block.div) {
+                this.groupDiv.removeChild(block.div);
+            }
+            block.div = null;
+        }
+        this.blocks = null;
+
+        OpenLayers.Popup.Anchored.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: setBackgroundColor
+     */
+    setBackgroundColor:function(color) {
+        //does nothing since the framed popup's entire scheme is based on a 
+        // an image -- changing the background color makes no sense. 
+    },
+
+    /**
+     * APIMethod: setBorder
+     */
+    setBorder:function() {
+        //does nothing since the framed popup's entire scheme is based on a 
+        // an image -- changing the popup's border makes no sense. 
+    },
+
+    /**
+     * Method: setOpacity
+     * Sets the opacity of the popup.
+     * 
+     * Parameters:
+     * opacity - {float} A value between 0.0 (transparent) and 1.0 (solid).   
+     */
+    setOpacity:function(opacity) {
+        //does nothing since we suppose that we'll never apply an opacity
+        // to a framed popup
+    },
+
+    /**
+     * APIMethod: setSize
+     * Overridden here, because we need to update the blocks whenever the size
+     *     of the popup has changed.
+     * 
+     * Parameters:
+     * contentSize - {<OpenLayers.Size>} the new size for the popup's 
+     *     contents div (in pixels).
+     */
+    setSize:function(contentSize) { 
+        OpenLayers.Popup.Anchored.prototype.setSize.apply(this, arguments);
+
+        this.updateBlocks();
+    },
+
+    /**
+     * Method: updateRelativePosition
+     * When the relative position changes, we need to set the new padding 
+     *     BBOX on the popup, reposition the close div, and update the blocks.
+     */
+    updateRelativePosition: function() {
+
+        //update the padding
+        this.padding = this.positionBlocks[this.relativePosition].padding;
+
+        //update the position of our close box to new padding
+        if (this.closeDiv) {
+            // 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 + 
+                                        this.padding.right + "px";
+            this.closeDiv.style.top = contentDivPadding.top + 
+                                      this.padding.top + "px";
+        }
+
+        this.updateBlocks();
+    },
+
+    /** 
+     * Method: calculateNewPx
+     * Besides the standard offset as determined by the Anchored class, our 
+     *     Framed popups have a special 'offset' property for each of their 
+     *     positions, which is used to offset the popup relative to its anchor.
+     * 
+     * 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 = OpenLayers.Popup.Anchored.prototype.calculateNewPx.apply(
+            this, arguments
+        );
+
+        newPx = newPx.offset(this.positionBlocks[this.relativePosition].offset);
+
+        return newPx;
+    },
+
+    /**
+     * Method: createBlocks
+     */
+    createBlocks: function() {
+        this.blocks = [];
+
+        //since all positions contain the same number of blocks, we can 
+        // just pick the first position and use its blocks array to create
+        // our blocks array
+        var firstPosition = null;
+        for(var key in this.positionBlocks) {
+            firstPosition = key;
+            break;
+        }
+        
+        var position = this.positionBlocks[firstPosition];
+        for (var i = 0; i < position.blocks.length; i++) {
+
+            var block = {};
+            this.blocks.push(block);
+
+            var divId = this.id + '_FrameDecorationDiv_' + i;
+            block.div = OpenLayers.Util.createDiv(divId, 
+                null, null, null, "absolute", null, "hidden", null
+            );
+
+            var imgId = this.id + '_FrameDecorationImg_' + i;
+            var imageCreator = 
+                (this.isAlphaImage) ? OpenLayers.Util.createAlphaImageDiv
+                                    : OpenLayers.Util.createImage;
+
+            block.image = imageCreator(imgId, 
+                null, this.imageSize, this.imageSrc, 
+                "absolute", null, null, null
+            );
+
+            block.div.appendChild(block.image);
+            this.groupDiv.appendChild(block.div);
+        }
+    },
+
+    /**
+     * Method: updateBlocks
+     * Internal method, called on initialize and when the popup's relative
+     *     position has changed. This function takes care of re-positioning
+     *     the popup's blocks in their appropropriate places.
+     */
+    updateBlocks: function() {
+        if (!this.blocks) {
+            this.createBlocks();
+        }
+        
+        if (this.size && this.relativePosition) {
+            var position = this.positionBlocks[this.relativePosition];
+            for (var i = 0; i < position.blocks.length; i++) {
+    
+                var positionBlock = position.blocks[i];
+                var block = this.blocks[i];
+    
+                // adjust sizes
+                var l = positionBlock.anchor.left;
+                var b = positionBlock.anchor.bottom;
+                var r = positionBlock.anchor.right;
+                var t = positionBlock.anchor.top;
+    
+                //note that we use the isNaN() test here because if the 
+                // size object is initialized with a "auto" parameter, the 
+                // size constructor calls parseFloat() on the string, 
+                // which will turn it into NaN
+                //
+                var w = (isNaN(positionBlock.size.w)) ? this.size.w - (r + l) 
+                                                      : positionBlock.size.w;
+    
+                var h = (isNaN(positionBlock.size.h)) ? this.size.h - (b + t) 
+                                                      : positionBlock.size.h;
+    
+                block.div.style.width = (w < 0 ? 0 : w) + 'px';
+                block.div.style.height = (h < 0 ? 0 : h) + 'px';
+    
+                block.div.style.left = (l != null) ? l + 'px' : '';
+                block.div.style.bottom = (b != null) ? b + 'px' : '';
+                block.div.style.right = (r != null) ? r + 'px' : '';            
+                block.div.style.top = (t != null) ? t + 'px' : '';
+    
+                block.image.style.left = positionBlock.position.x + 'px';
+                block.image.style.top = positionBlock.position.y + 'px';
+            }
+    
+            this.contentDiv.style.left = this.padding.left + "px";
+            this.contentDiv.style.top = this.padding.top + "px";
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Popup.Framed"
+});
diff --git a/lib/OpenLayers/Popup/FramedCloud.js b/lib/OpenLayers/Popup/FramedCloud.js
new file mode 100644
index 0000000..81782de
--- /dev/null
+++ b/lib/OpenLayers/Popup/FramedCloud.js
@@ -0,0 +1,231 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Popup/Framed.js
+ * @requires OpenLayers/Util.js
+ */
+
+/**
+ * Class: OpenLayers.Popup.FramedCloud
+ * 
+ * Inherits from: 
+ *  - <OpenLayers.Popup.Framed>
+ */
+OpenLayers.Popup.FramedCloud = 
+  OpenLayers.Class(OpenLayers.Popup.Framed, {
+
+    /** 
+     * Property: contentDisplayClass
+     * {String} The CSS class of the popup content div.
+     */
+    contentDisplayClass: "olFramedCloudPopupContent",
+
+    /**
+     * APIProperty: autoSize
+     * {Boolean} Framed Cloud is autosizing by default.
+     */
+    autoSize: true,
+
+    /**
+     * APIProperty: panMapIfOutOfView
+     * {Boolean} Framed Cloud does pan into view by default.
+     */
+    panMapIfOutOfView: true,
+
+    /**
+     * APIProperty: imageSize
+     * {<OpenLayers.Size>}
+     */
+    imageSize: new OpenLayers.Size(1276, 736),
+
+    /**
+     * APIProperty: isAlphaImage
+     * {Boolean} The FramedCloud does not use an alpha image (in honor of the 
+     *     good ie6 folk out there)
+     */
+    isAlphaImage: false,
+
+    /** 
+     * APIProperty: fixedRelativePosition
+     * {Boolean} The Framed Cloud popup works in just one fixed position.
+     */
+    fixedRelativePosition: false,
+
+    /**
+     * Property: positionBlocks
+     * {Object} Hash of differen position blocks, keyed by relativePosition
+     *     two-character code string (ie "tl", "tr", "bl", "br")
+     */
+    positionBlocks: {
+        "tl": {
+            'offset': new OpenLayers.Pixel(44, 0),
+            'padding': new OpenLayers.Bounds(8, 40, 8, 9),
+            'blocks': [
+                { // top-left
+                    size: new OpenLayers.Size('auto', 'auto'),
+                    anchor: new OpenLayers.Bounds(0, 51, 22, 0),
+                    position: new OpenLayers.Pixel(0, 0)
+                },
+                { //top-right
+                    size: new OpenLayers.Size(22, 'auto'),
+                    anchor: new OpenLayers.Bounds(null, 50, 0, 0),
+                    position: new OpenLayers.Pixel(-1238, 0)
+                },
+                { //bottom-left
+                    size: new OpenLayers.Size('auto', 19),
+                    anchor: new OpenLayers.Bounds(0, 32, 22, null),
+                    position: new OpenLayers.Pixel(0, -631)
+                },
+                { //bottom-right
+                    size: new OpenLayers.Size(22, 18),
+                    anchor: new OpenLayers.Bounds(null, 32, 0, null),
+                    position: new OpenLayers.Pixel(-1238, -632)
+                },
+                { // stem
+                    size: new OpenLayers.Size(81, 35),
+                    anchor: new OpenLayers.Bounds(null, 0, 0, null),
+                    position: new OpenLayers.Pixel(0, -688)
+                }
+            ]
+        },
+        "tr": {
+            'offset': new OpenLayers.Pixel(-45, 0),
+            'padding': new OpenLayers.Bounds(8, 40, 8, 9),
+            'blocks': [
+                { // top-left
+                    size: new OpenLayers.Size('auto', 'auto'),
+                    anchor: new OpenLayers.Bounds(0, 51, 22, 0),
+                    position: new OpenLayers.Pixel(0, 0)
+                },
+                { //top-right
+                    size: new OpenLayers.Size(22, 'auto'),
+                    anchor: new OpenLayers.Bounds(null, 50, 0, 0),
+                    position: new OpenLayers.Pixel(-1238, 0)
+                },
+                { //bottom-left
+                    size: new OpenLayers.Size('auto', 19),
+                    anchor: new OpenLayers.Bounds(0, 32, 22, null),
+                    position: new OpenLayers.Pixel(0, -631)
+                },
+                { //bottom-right
+                    size: new OpenLayers.Size(22, 19),
+                    anchor: new OpenLayers.Bounds(null, 32, 0, null),
+                    position: new OpenLayers.Pixel(-1238, -631)
+                },
+                { // stem
+                    size: new OpenLayers.Size(81, 35),
+                    anchor: new OpenLayers.Bounds(0, 0, null, null),
+                    position: new OpenLayers.Pixel(-215, -687)
+                }
+            ]
+        },
+        "bl": {
+            'offset': new OpenLayers.Pixel(45, 0),
+            'padding': new OpenLayers.Bounds(8, 9, 8, 40),
+            'blocks': [
+                { // top-left
+                    size: new OpenLayers.Size('auto', 'auto'),
+                    anchor: new OpenLayers.Bounds(0, 21, 22, 32),
+                    position: new OpenLayers.Pixel(0, 0)
+                },
+                { //top-right
+                    size: new OpenLayers.Size(22, 'auto'),
+                    anchor: new OpenLayers.Bounds(null, 21, 0, 32),
+                    position: new OpenLayers.Pixel(-1238, 0)
+                },
+                { //bottom-left
+                    size: new OpenLayers.Size('auto', 21),
+                    anchor: new OpenLayers.Bounds(0, 0, 22, null),
+                    position: new OpenLayers.Pixel(0, -629)
+                },
+                { //bottom-right
+                    size: new OpenLayers.Size(22, 21),
+                    anchor: new OpenLayers.Bounds(null, 0, 0, null),
+                    position: new OpenLayers.Pixel(-1238, -629)
+                },
+                { // stem
+                    size: new OpenLayers.Size(81, 33),
+                    anchor: new OpenLayers.Bounds(null, null, 0, 0),
+                    position: new OpenLayers.Pixel(-101, -674)
+                }
+            ]
+        },
+        "br": {
+            'offset': new OpenLayers.Pixel(-44, 0),
+            'padding': new OpenLayers.Bounds(8, 9, 8, 40),
+            'blocks': [
+                { // top-left
+                    size: new OpenLayers.Size('auto', 'auto'),
+                    anchor: new OpenLayers.Bounds(0, 21, 22, 32),
+                    position: new OpenLayers.Pixel(0, 0)
+                },
+                { //top-right
+                    size: new OpenLayers.Size(22, 'auto'),
+                    anchor: new OpenLayers.Bounds(null, 21, 0, 32),
+                    position: new OpenLayers.Pixel(-1238, 0)
+                },
+                { //bottom-left
+                    size: new OpenLayers.Size('auto', 21),
+                    anchor: new OpenLayers.Bounds(0, 0, 22, null),
+                    position: new OpenLayers.Pixel(0, -629)
+                },
+                { //bottom-right
+                    size: new OpenLayers.Size(22, 21),
+                    anchor: new OpenLayers.Bounds(null, 0, 0, null),
+                    position: new OpenLayers.Pixel(-1238, -629)
+                },
+                { // stem
+                    size: new OpenLayers.Size(81, 33),
+                    anchor: new OpenLayers.Bounds(0, null, null, 0),
+                    position: new OpenLayers.Pixel(-311, -674)
+                }
+            ]
+        }
+    },
+
+    /**
+     * APIProperty: minSize
+     * {<OpenLayers.Size>}
+     */
+    minSize: new OpenLayers.Size(105, 10),
+
+    /**
+     * APIProperty: maxSize
+     * {<OpenLayers.Size>}
+     */
+    maxSize: new OpenLayers.Size(1200, 660),
+
+    /** 
+     * Constructor: OpenLayers.Popup.FramedCloud
+     * 
+     * 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>) 
+     *     (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.imageSrc = OpenLayers.Util.getImagesLocation() + 'cloud-popup-relative.png';
+        OpenLayers.Popup.Framed.prototype.initialize.apply(this, arguments);
+        this.contentDiv.className = this.contentDisplayClass;
+    },
+
+    /** 
+     * APIMethod: destroy
+     */
+    destroy: function() {
+        OpenLayers.Popup.Framed.prototype.destroy.apply(this, arguments);
+    },
+
+    CLASS_NAME: "OpenLayers.Popup.FramedCloud"
+});
diff --git a/lib/OpenLayers/Projection.js b/lib/OpenLayers/Projection.js
new file mode 100644
index 0000000..48b0ff8
--- /dev/null
+++ b/lib/OpenLayers/Projection.js
@@ -0,0 +1,178 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Util.js
+ */
+
+/**
+ * Class: OpenLayers.Projection
+ * Class for coordinate transforms between coordinate systems.
+ *     Depends on the proj4js library. If proj4js is not available, 
+ *     then this is just an empty stub.
+ */
+OpenLayers.Projection = OpenLayers.Class({
+
+    /**
+     * Property: proj
+     * {Object} Proj4js.Proj instance.
+     */
+    proj: null,
+    
+    /**
+     * Property: projCode
+     * {String}
+     */
+    projCode: null,
+
+    /**
+     * Constructor: OpenLayers.Projection
+     * This class offers several methods for interacting with a wrapped 
+     *     pro4js projection object. 
+     *
+     * Parameters:
+     * projCode - {String} A string identifying the Well Known Identifier for
+     *    the projection.
+     * options - {Object} An optional object to set additional properties
+     *     on the layer.
+     *
+     * Returns:
+     * {<OpenLayers.Projection>} A projection object.
+     */
+    initialize: function(projCode, options) {
+        OpenLayers.Util.extend(this, options);
+        this.projCode = projCode;
+        if (window.Proj4js) {
+            this.proj = new Proj4js.Proj(projCode);
+        }
+    },
+    
+    /**
+     * APIMethod: getCode
+     * Get the string SRS code.
+     *
+     * Returns:
+     * {String} The SRS code.
+     */
+    getCode: function() {
+        return this.proj ? this.proj.srsCode : this.projCode;
+    },
+   
+    /**
+     * APIMethod: getUnits
+     * Get the units string for the projection -- returns null if 
+     *     proj4js is not available.
+     *
+     * Returns:
+     * {String} The units abbreviation.
+     */
+    getUnits: function() {
+        return this.proj ? this.proj.units : null;
+    },
+
+    /**
+     * Method: toString
+     * Convert projection to string (getCode wrapper).
+     *
+     * Returns:
+     * {String} The projection code.
+     */
+    toString: function() {
+        return this.getCode();
+    },
+
+    /**
+     * Method: equals
+     * Test equality of two projection instances.  Determines equality based
+     *     soley on the projection code.
+     *
+     * Returns:
+     * {Boolean} The two projections are equivalent.
+     */
+    equals: function(projection) {
+        if (projection && projection.getCode) {
+            return this.getCode() == projection.getCode();
+        } else {
+            return false;
+        }    
+    },
+
+    /* Method: destroy
+     * Destroy projection object.
+     */
+    destroy: function() {
+        delete this.proj;
+        delete this.projCode;
+    },
+    
+    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 
+ * 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. 
+ * 
+ * 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
+ * transformed according to the transformation function.
+ *
+ * Note - Properties on this object should not be set directly.  To add a
+ *     transform method to this object, use the <addTransform> method.  For an
+ *     example of usage, see the OpenLayers.Layer.SphericalMercator file.
+ */
+OpenLayers.Projection.transforms = {};
+
+/**
+ * APIMethod: addTransform
+ * Set a custom transform method between two projections.  Use this method in
+ *     cases where the proj4js lib is not available or where custom projections
+ *     need to be handled.
+ *
+ * Parameters:
+ * from - {String} The code for the source projection
+ * to - {String} the code for the destination projection
+ * method - {Function} A function that takes a point as an argument and
+ *     transforms that point from the source to the destination projection
+ *     in place.  The original point should be modified.
+ */
+OpenLayers.Projection.addTransform = function(from, to, method) {
+    if(!OpenLayers.Projection.transforms[from]) {
+        OpenLayers.Projection.transforms[from] = {};
+    }
+    OpenLayers.Projection.transforms[from][to] = method;
+};
+
+/**
+ * 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.
+ * sourceProj - {OpenLayers.Projection} Source map coordinate system
+ * destProj - {OpenLayers.Projection} Destination map coordinate system
+ *
+ * Returns:
+ * point - {object} A transformed coordinate.  The original point is modified.
+ */
+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()] && 
+               OpenLayers.Projection.transforms[source.getCode()][dest.getCode()]) {
+        OpenLayers.Projection.transforms[source.getCode()][dest.getCode()](point); 
+    }
+    return point;
+};
diff --git a/lib/OpenLayers/Protocol.js b/lib/OpenLayers/Protocol.js
new file mode 100644
index 0000000..1e6b05e
--- /dev/null
+++ b/lib/OpenLayers/Protocol.js
@@ -0,0 +1,272 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * Class: OpenLayers.Protocol
+ * Abstract vector layer protocol class.  Not to be instantiated directly.  Use
+ *     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.
+     */
+    options: null,
+
+    /**
+     * Property: autoDestroy
+     * {Boolean} The creator of the protocol can set autoDestroy to false
+     *      to fully control when the protocol is destroyed. Defaults to
+     *      true.
+     */
+    autoDestroy: true,
+   
+    /**
+     * Property: defaultFilter
+     * {OpenLayers.Filter} Optional default filter to read requests
+     */
+    defaultFilter: null,
+    
+    /**
+     * Constructor: OpenLayers.Protocol
+     * Abstract class for vector protocols.  Create instances of a subclass.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        options = options || {};
+        OpenLayers.Util.extend(this, options);
+        this.options = options;
+    },
+
+    /**
+     * Method: mergeWithDefaultFilter
+     * Merge filter passed to the read method with the default one
+     *
+     * Parameters:
+     * filter - {OpenLayers.Filter}
+     */
+    mergeWithDefaultFilter: function(filter) {
+        var merged;
+        if (filter && this.defaultFilter) {
+            merged = new OpenLayers.Filter.Logical({
+                type: OpenLayers.Filter.Logical.AND,
+                filters: [this.defaultFilter, filter]
+            });
+        } else {
+            merged = filter || this.defaultFilter || undefined;
+        }
+        return merged;
+    },
+
+    /**
+     * APIMethod: destroy
+     * Clean up the protocol.
+     */
+    destroy: function() {
+        this.options = null;
+        this.format = null;
+    },
+    
+    /**
+     * APIMethod: read
+     * Construct a request for reading new features.
+     *
+     * Parameters:
+     * options - {Object} Optional object for configuring the request.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     * object, the same object will be passed to the callback function passed
+     * if one exists in the options object.
+     */
+    read: function(options) {
+        options = options || {};
+        options.filter = this.mergeWithDefaultFilter(options.filter);
+    },
+    
+    
+    /**
+     * APIMethod: create
+     * Construct a request for writing newly created features.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})} or
+     *            {<OpenLayers.Feature.Vector>}
+     * options - {Object} Optional object for configuring the request.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     * object, the same object will be passed to the callback function passed
+     * if one exists in the options object.
+     */
+    create: function() {
+    },
+    
+    /**
+     * APIMethod: update
+     * Construct a request updating modified features.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})} or
+     *            {<OpenLayers.Feature.Vector>}
+     * options - {Object} Optional object for configuring the request.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     * object, the same object will be passed to the callback function passed
+     * if one exists in the options object.
+     */
+    update: function() {
+    },
+    
+    /**
+     * APIMethod: delete
+     * Construct a request deleting a removed feature.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     * options - {Object} Optional object for configuring the request.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     * object, the same object will be passed to the callback function passed
+     * if one exists in the options object.
+     */
+    "delete": function() {
+    },
+
+    /**
+     * APIMethod: commit
+     * Go over the features and for each take action
+     * based on the feature state. Possible actions are create,
+     * update and delete.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})}
+     * options - {Object} Object whose possible keys are "create", "update",
+     *      "delete", "callback" and "scope", the values referenced by the
+     *      first three are objects as passed to the "create", "update", and
+     *      "delete" methods, the value referenced by the "callback" key is
+     *      a function which is called when the commit operation is complete
+     *      using the scope referenced by the "scope" key.
+     *
+     * Returns:
+     * {Array({<OpenLayers.Protocol.Response>})} An array of
+     * <OpenLayers.Protocol.Response> objects.
+     */
+    commit: function() {
+    },
+
+    /**
+     * Method: abort
+     * Abort an ongoing request.
+     *
+     * Parameters:
+     * response - {<OpenLayers.Protocol.Response>}
+     */
+    abort: function(response) {
+    },
+   
+    /**
+     * Method: createCallback
+     * Returns a function that applies the given public method with resp and
+     *     options arguments.
+     *
+     * Parameters:
+     * method - {Function} The method to be applied by the callback.
+     * response - {<OpenLayers.Protocol.Response>} The protocol response object.
+     * options - {Object} Options sent to the protocol method
+     */
+    createCallback: function(method, response, options) {
+        return OpenLayers.Function.bind(function() {
+            method.apply(this, [response, options]);
+        }, this);
+    },
+   
+    CLASS_NAME: "OpenLayers.Protocol" 
+});
+
+/**
+ * Class: OpenLayers.Protocol.Response
+ * Protocols return Response objects to their users.
+ */
+OpenLayers.Protocol.Response = OpenLayers.Class({
+    /**
+     * Property: code
+     * {Number} - OpenLayers.Protocol.Response.SUCCESS or
+     *            OpenLayers.Protocol.Response.FAILURE
+     */
+    code: null,
+
+    /**
+     * Property: requestType
+     * {String} The type of request this response corresponds to. Either
+     *      "create", "read", "update" or "delete".
+     */
+    requestType: null,
+
+    /**
+     * Property: last
+     * {Boolean} - true if this is the last response expected in a commit,
+     * false otherwise, defaults to true.
+     */
+    last: true,
+
+    /**
+     * Property: features
+     * {Array({<OpenLayers.Feature.Vector>})} or {<OpenLayers.Feature.Vector>}
+     * The features returned in the response by the server.
+     */
+    features: null,
+
+    /**
+     * Property: reqFeatures
+     * {Array({<OpenLayers.Feature.Vector>})} or {<OpenLayers.Feature.Vector>}
+     * The features provided by the user and placed in the request by the
+     *      protocol.
+     */
+    reqFeatures: null,
+
+    /**
+     * Property: priv
+     */
+    priv: null,
+
+    /**
+     * Constructor: OpenLayers.Protocol.Response
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Util.extend(this, options);
+    },
+
+    /**
+     * Method: success
+     *
+     * Returns:
+     * {Boolean} - true on success, false otherwise
+     */
+    success: function() {
+        return this.code > 0;
+    },
+
+    CLASS_NAME: "OpenLayers.Protocol.Response"
+});
+
+OpenLayers.Protocol.Response.SUCCESS = 1;
+OpenLayers.Protocol.Response.FAILURE = 0;
diff --git a/lib/OpenLayers/Protocol/HTTP.js b/lib/OpenLayers/Protocol/HTTP.js
new file mode 100644
index 0000000..3b231cd
--- /dev/null
+++ b/lib/OpenLayers/Protocol/HTTP.js
@@ -0,0 +1,655 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Protocol.js
+ * @requires OpenLayers/Feature/Vector.js
+ * @requires OpenLayers/Filter/Spatial.js
+ * @requires OpenLayers/Filter/Comparison.js
+ * @requires OpenLayers/Filter/Logical.js
+ * @requires OpenLayers/Request/XMLHttpRequest.js
+ */
+
+/**
+ * Class: OpenLayers.Protocol.HTTP
+ * A basic HTTP protocol for vector layers.  Create a new instance with the
+ *     <OpenLayers.Protocol.HTTP> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Protocol>
+ */
+OpenLayers.Protocol.HTTP = OpenLayers.Class(OpenLayers.Protocol, {
+
+    /**
+     * Property: url
+     * {String} Service URL, read-only, set through the options
+     *     passed to constructor.
+     */
+    url: null,
+
+    /**
+     * Property: headers
+     * {Object} HTTP request headers, read-only, set through the options
+     *     passed to the constructor,
+     *     Example: {'Content-Type': 'plain/text'}
+     */
+    headers: null,
+
+    /**
+     * Property: params
+     * {Object} Parameters of GET requests, read-only, set through the options
+     *     passed to the constructor,
+     *     Example: {'bbox': '5,5,5,5'}
+     */
+    params: null,
+    
+    /**
+     * Property: callback
+     * {Object} Function to be called when the <read>, <create>,
+     *     <update>, <delete> or <commit> operation completes, read-only,
+     *     set through the options passed to the constructor.
+     */
+    callback: null,
+
+    /**
+     * Property: scope
+     * {Object} Callback execution scope, read-only, set through the
+     *     options passed to the constructor.
+     */
+    scope: null,
+
+    /**
+     * Property: readWithPOST
+     * {Boolean} true if read operations are done with POST requests
+     *     instead of GET, defaults to false.
+     */
+    readWithPOST: false,
+
+    /**
+     * Property: wildcarded.
+     * {Boolean} If true percent signs are added around values
+     *     read from LIKE filters, for example if the protocol
+     *     read method is passed a LIKE filter whose property
+     *     is "foo" and whose value is "bar" the string
+     *     "foo__ilike=%bar%" will be sent in the query string;
+     *     defaults to false.
+     */
+    wildcarded: false,
+
+    /**
+     * Constructor: OpenLayers.Protocol.HTTP
+     * A class for giving layers generic HTTP protocol.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     *
+     * Valid options include:
+     * url - {String}
+     * headers - {Object} 
+     * params - {Object}
+     * format - {<OpenLayers.Format>}
+     * callback - {Function}
+     * scope - {Object}
+     */
+    initialize: function(options) {
+        options = options || {};
+        this.params = {};
+        this.headers = {};
+        OpenLayers.Protocol.prototype.initialize.apply(this, arguments);
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Clean up the protocol.
+     */
+    destroy: function() {
+        this.params = null;
+        this.headers = null;
+        OpenLayers.Protocol.prototype.destroy.apply(this);
+    },
+   
+    /**
+     * APIMethod: read
+     * Construct a request for reading new features.
+     *
+     * Parameters:
+     * options - {Object} Optional object for configuring the request.
+     *     This object is modified and should not be reused.
+     *
+     * Valid options:
+     * url - {String} Url for the request.
+     * params - {Object} Parameters to get serialized as a query string.
+     * headers - {Object} Headers to be set on the request.
+     * filter - {<OpenLayers.Filter>} Filter to get serialized as a
+     *     query string.
+     * readWithPOST - {Boolean} If the request should be done with POST.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} A response 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.
+     */
+    read: function(options) {
+        OpenLayers.Protocol.prototype.read.apply(this, arguments);
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+        options.params = OpenLayers.Util.applyDefaults(
+            options.params, this.options.params);
+        if(options.filter) {
+            options.params = this.filterToParams(
+                options.filter, options.params);
+        }
+        var readWithPOST = (options.readWithPOST !== undefined) ?
+                           options.readWithPOST : this.readWithPOST;
+        var resp = new OpenLayers.Protocol.Response({requestType: "read"});
+        if(readWithPOST) {
+            resp.priv = OpenLayers.Request.POST({
+                url: options.url,
+                callback: this.createCallback(this.handleRead, resp, options),
+                data: OpenLayers.Util.getParameterString(options.params),
+                headers: {
+                    "Content-Type": "application/x-www-form-urlencoded"
+                }
+            });
+        } else {
+            resp.priv = OpenLayers.Request.GET({
+                url: options.url,
+                callback: this.createCallback(this.handleRead, resp, options),
+                params: options.params,
+                headers: options.headers
+            });
+        }
+        return resp;
+    },
+
+    /**
+     * Method: handleRead
+     * Individual callbacks are created for read, create and update, should
+     *     a subclass need to override each one separately.
+     *
+     * Parameters:
+     * resp - {<OpenLayers.Protocol.Response>} The response object to pass to
+     *     the user callback.
+     * options - {Object} The user options passed to the read call.
+     */
+    handleRead: function(resp, options) {
+        this.handleResponse(resp, options);
+    },
+
+    /**
+     * Method: filterToParams
+     * Convert an <OpenLayers.Filter> object to parameters.
+     *
+     * Parameters:
+     * filter - {OpenLayers.Filter} filter to convert.
+     * params - {Object} The parameters object.
+     *
+     * Returns:
+     * {Object} The resulting parameters object.
+     */
+    filterToParams: function(filter, params) {
+        params = params || {};
+        var className = filter.CLASS_NAME;
+        var filterType = className.substring(className.lastIndexOf(".") + 1);
+        switch(filterType) {
+            case "Spatial":
+                switch(filter.type) {
+                    case OpenLayers.Filter.Spatial.BBOX:
+                        params.bbox = filter.value.toArray();
+                        break;
+                    case OpenLayers.Filter.Spatial.DWITHIN:
+                        params.tolerance = filter.distance;
+                        // no break here
+                    case OpenLayers.Filter.Spatial.WITHIN:
+                        params.lon = filter.value.x;
+                        params.lat = filter.value.y;
+                        break;
+                    default:
+                        OpenLayers.Console.warn(
+                            "Unknown spatial filter type " + filter.type);
+                }
+                break;
+            case "Comparison":
+                var op = OpenLayers.Protocol.HTTP.COMP_TYPE_TO_OP_STR[filter.type];
+                if(op !== undefined) {
+                    var value = filter.value;
+                    if(filter.type == OpenLayers.Filter.Comparison.LIKE) {
+                        value = this.regex2value(value);
+                        if(this.wildcarded) {
+                            value = "%" + value + "%";
+                        }
+                    }
+                    params[filter.property + "__" + op] = value;
+                    params.queryable = params.queryable || [];
+                    params.queryable.push(filter.property);
+                } else {
+                    OpenLayers.Console.warn(
+                        "Unknown comparison filter type " + filter.type);
+                }
+                break;
+            case "Logical":
+                if(filter.type === OpenLayers.Filter.Logical.AND) {
+                    for(var i=0,len=filter.filters.length; i<len; i++) {
+                        params = this.filterToParams(filter.filters[i], params);
+                    }
+                } else {
+                    OpenLayers.Console.warn(
+                        "Unsupported logical filter type " + filter.type);
+                }
+                break;
+            default:
+                OpenLayers.Console.warn("Unknown filter type " + filterType);
+        }
+        return params;
+    },
+
+    /**
+     * Method: regex2value
+     * Convert the value from a regular expression string to a LIKE/ILIKE
+     * string known to the web service.
+     *
+     * Parameters:
+     * value - {String} The regex string.
+     *
+     * Returns:
+     * {String} The converted string.
+     */
+    regex2value: function(value) {
+
+        // highly sensitive!! Do not change this without running the
+        // Protocol/HTTP.html unit tests
+
+        // convert % to \%
+        value = value.replace(/%/g, "\\%");
+
+        // convert \\. to \\_ (\\.* occurences converted later)
+        value = value.replace(/\\\\\.(\*)?/g, function($0, $1) {
+            return $1 ? $0 : "\\\\_";
+        });
+
+        // convert \\.* to \\%
+        value = value.replace(/\\\\\.\*/g, "\\\\%");
+
+        // convert . to _ (\. and .* occurences converted later)
+        value = value.replace(/(\\)?\.(\*)?/g, function($0, $1, $2) {
+            return $1 || $2 ? $0 : "_";
+        });
+
+        // convert .* to % (\.* occurnces converted later)
+        value = value.replace(/(\\)?\.\*/g, function($0, $1) {
+            return $1 ? $0 : "%";
+        });
+
+        // convert \. to .
+        value = value.replace(/\\\./g, ".");
+
+        // replace \* with * (watching out for \\*)
+        value = value.replace(/(\\)?\\\*/g, function($0, $1) {
+            return $1 ? $0 : "*";
+        });
+
+        return value;
+    },
+
+    /**
+     * APIMethod: create
+     * Construct a request for writing newly created features.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})} or
+     *     {<OpenLayers.Feature.Vector>}
+     * options - {Object} Optional object for configuring the request.
+     *     This object is modified and should not be reused.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     *     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.
+     */
+    create: function(features, options) {
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+
+        var resp = new OpenLayers.Protocol.Response({
+            reqFeatures: features,
+            requestType: "create"
+        });
+
+        resp.priv = OpenLayers.Request.POST({
+            url: options.url,
+            callback: this.createCallback(this.handleCreate, resp, options),
+            headers: options.headers,
+            data: this.format.write(features)
+        });
+
+        return resp;
+    },
+
+    /**
+     * Method: handleCreate
+     * Called the the request issued by <create> is complete.  May be overridden
+     *     by subclasses.
+     *
+     * Parameters:
+     * resp - {<OpenLayers.Protocol.Response>} The response object to pass to
+     *     any user callback.
+     * options - {Object} The user options passed to the create call.
+     */
+    handleCreate: function(resp, options) {
+        this.handleResponse(resp, options);
+    },
+
+    /**
+     * APIMethod: update
+     * Construct a request updating modified feature.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     * options - {Object} Optional object for configuring the request.
+     *     This object is modified and should not be reused.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     *     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.
+     */
+    update: function(feature, options) {
+        options = options || {};
+        var url = options.url ||
+                  feature.url ||
+                  this.options.url + "/" + feature.fid;
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+
+        var resp = new OpenLayers.Protocol.Response({
+            reqFeatures: feature,
+            requestType: "update"
+        });
+
+        resp.priv = OpenLayers.Request.PUT({
+            url: url,
+            callback: this.createCallback(this.handleUpdate, resp, options),
+            headers: options.headers,
+            data: this.format.write(feature)
+        });
+
+        return resp;
+    },
+
+    /**
+     * Method: handleUpdate
+     * Called the the request issued by <update> is complete.  May be overridden
+     *     by subclasses.
+     *
+     * Parameters:
+     * resp - {<OpenLayers.Protocol.Response>} The response object to pass to
+     *     any user callback.
+     * options - {Object} The user options passed to the update call.
+     */
+    handleUpdate: function(resp, options) {
+        this.handleResponse(resp, options);
+    },
+
+    /**
+     * APIMethod: delete
+     * Construct a request deleting a removed feature.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     * options - {Object} Optional object for configuring the request.
+     *     This object is modified and should not be reused.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     *     object, whose "priv" property references the HTTP request, this 
+     *     object is also passed to the callback function when the request
+     *     completes.
+     */
+    "delete": function(feature, options) {
+        options = options || {};
+        var url = options.url ||
+                  feature.url ||
+                  this.options.url + "/" + feature.fid;
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+
+        var resp = new OpenLayers.Protocol.Response({
+            reqFeatures: feature,
+            requestType: "delete"
+        });
+
+        resp.priv = OpenLayers.Request.DELETE({
+            url: url,
+            callback: this.createCallback(this.handleDelete, resp, options),
+            headers: options.headers
+        });
+
+        return resp;
+    },
+
+    /**
+     * Method: handleDelete
+     * Called the the request issued by <delete> is complete.  May be overridden
+     *     by subclasses.
+     *
+     * Parameters:
+     * resp - {<OpenLayers.Protocol.Response>} The response object to pass to
+     *     any user callback.
+     * options - {Object} The user options passed to the delete call.
+     */
+    handleDelete: function(resp, options) {
+        this.handleResponse(resp, options);
+    },
+
+    /**
+     * Method: handleResponse
+     * Called by CRUD specific handlers.
+     *
+     * Parameters:
+     * resp - {<OpenLayers.Protocol.Response>} The response object to pass to
+     *     any user callback.
+     * options - {Object} The user options passed to the create, read, update,
+     *     or delete call.
+     */
+    handleResponse: function(resp, options) {
+        var request = resp.priv;
+        if(options.callback) {
+            if(request.status >= 200 && request.status < 300) {
+                // success
+                if(resp.requestType != "delete") {
+                    resp.features = this.parseFeatures(request);
+                }
+                resp.code = OpenLayers.Protocol.Response.SUCCESS;
+            } else {
+                // failure
+                resp.code = OpenLayers.Protocol.Response.FAILURE;
+            }
+            options.callback.call(options.scope, resp);
+        }
+    },
+
+    /**
+     * Method: parseFeatures
+     * Read HTTP response body and return features.
+     *
+     * Parameters:
+     * request - {XMLHttpRequest} The request object
+     *
+     * Returns:
+     * {Array({<OpenLayers.Feature.Vector>})} or
+     *     {<OpenLayers.Feature.Vector>} Array of features or a single feature.
+     */
+    parseFeatures: function(request) {
+        var doc = request.responseXML;
+        if (!doc || !doc.documentElement) {
+            doc = request.responseText;
+        }
+        if (!doc || doc.length <= 0) {
+            return null;
+        }
+        return this.format.read(doc);
+    },
+
+    /**
+     * APIMethod: commit
+     * Iterate over each feature and take action based on the feature state.
+     *     Possible actions are create, update and delete.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})}
+     * options - {Object} Optional object for setting up intermediate commit
+     *     callbacks.
+     *
+     * Valid options:
+     * create - {Object} Optional object to be passed to the <create> method.
+     * update - {Object} Optional object to be passed to the <update> method.
+     * delete - {Object} Optional object to be passed to the <delete> method.
+     * callback - {Function} Optional function to be called when the commit
+     *     is complete.
+     * scope - {Object} Optional object to be set as the scope of the callback.
+     *
+     * Returns:
+     * {Array(<OpenLayers.Protocol.Response>)} An array of response objects,
+     *     one per request made to the server, each object's "priv" property
+     *     references the corresponding HTTP request.
+     */
+    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.
+        var types = {};
+        types[OpenLayers.State.INSERT] = [];
+        types[OpenLayers.State.UPDATE] = [];
+        types[OpenLayers.State.DELETE] = [];
+        var feature, list, requestFeatures = [];
+        for(var i=0, len=features.length; i<len; ++i) {
+            feature = features[i];
+            list = types[feature.state];
+            if(list) {
+                list.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        
+        });
+        
+        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 ? 
+                        OpenLayers.Protocol.Response.SUCCESS :
+                        OpenLayers.Protocol.Response.FAILURE;
+                    options.callback.apply(options.scope, [finalResponse]);
+                }    
+            }
+        }
+
+        // start issuing requests
+        var queue = types[OpenLayers.State.INSERT];
+        if(queue.length > 0) {
+            resp.push(this.create(
+                queue, OpenLayers.Util.applyDefaults(
+                    {callback: insertCallback, scope: this}, options.create
+                )
+            ));
+        }
+        queue = types[OpenLayers.State.UPDATE];
+        for(var i=queue.length-1; i>=0; --i) {
+            resp.push(this.update(
+                queue[i], OpenLayers.Util.applyDefaults(
+                    {callback: callback, scope: this}, options.update
+                ))
+            );
+        }
+        queue = types[OpenLayers.State.DELETE];
+        for(var i=queue.length-1; i>=0; --i) {
+            resp.push(this["delete"](
+                queue[i], OpenLayers.Util.applyDefaults(
+                    {callback: callback, scope: this}, options["delete"]
+                ))
+            );
+        }
+        return resp;
+    },
+
+    /**
+     * APIMethod: abort
+     * Abort an ongoing request, the response object passed to
+     * this method must come from this HTTP protocol (as a result
+     * of a create, read, update, delete or commit operation).
+     *
+     * Parameters:
+     * response - {<OpenLayers.Protocol.Response>}
+     */
+    abort: function(response) {
+        if (response) {
+            response.priv.abort();
+        }
+    },
+
+    /**
+     * Method: callUserCallback
+     * This method is used from within the commit method each time an
+     *     an HTTP response is received from the server, it is responsible
+     *     for calling the user-supplied callbacks.
+     *
+     * Parameters:
+     * resp - {<OpenLayers.Protocol.Response>}
+     * options - {Object} The map of options passed to the commit call.
+     */
+    callUserCallback: function(resp, options) {
+        var opt = options[resp.requestType];
+        if(opt && opt.callback) {
+            opt.callback.call(opt.scope, resp);
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Protocol.HTTP" 
+});
+
+/**
+ * Property: OpenLayers.Protocol.HTTP.COMP_TYPE_TO_OP_STR
+ * {Object} A private class-level property mapping the
+ *     OpenLayers.Filter.Comparison types to the operation
+ *     strings of the protocol.
+ */
+(function() {
+    var o = OpenLayers.Protocol.HTTP.COMP_TYPE_TO_OP_STR = {};
+    o[OpenLayers.Filter.Comparison.EQUAL_TO]                 = "eq";
+    o[OpenLayers.Filter.Comparison.NOT_EQUAL_TO]             = "ne";
+    o[OpenLayers.Filter.Comparison.LESS_THAN]                = "lt";
+    o[OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO]    = "lte";
+    o[OpenLayers.Filter.Comparison.GREATER_THAN]             = "gt";
+    o[OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO] = "gte";
+    o[OpenLayers.Filter.Comparison.LIKE]                     = "ilike";
+})();
+
diff --git a/lib/OpenLayers/Protocol/SOS.js b/lib/OpenLayers/Protocol/SOS.js
new file mode 100644
index 0000000..eb95b50
--- /dev/null
+++ b/lib/OpenLayers/Protocol/SOS.js
@@ -0,0 +1,33 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Protocol.js
+ */
+
+/**
+ * Function: OpenLayers.Protocol.SOS
+ * Used to create a versioned SOS protocol.  Default version is 1.0.0.
+ *
+ * Returns:
+ * {<OpenLayers.Protocol>} An SOS protocol for the given version.
+ */
+OpenLayers.Protocol.SOS = function(options) {
+    options = OpenLayers.Util.applyDefaults(
+        options, OpenLayers.Protocol.SOS.DEFAULTS
+    );
+    var cls = OpenLayers.Protocol.SOS["v"+options.version.replace(/\./g, "_")];
+    if(!cls) {
+        throw "Unsupported SOS version: " + options.version;
+    }
+    return new cls(options);
+};
+
+/**
+ * Constant: OpenLayers.Protocol.SOS.DEFAULTS
+ */
+OpenLayers.Protocol.SOS.DEFAULTS = {
+    "version": "1.0.0"
+};
diff --git a/lib/OpenLayers/Protocol/SOS/v1_0_0.js b/lib/OpenLayers/Protocol/SOS/v1_0_0.js
new file mode 100644
index 0000000..de47b1c
--- /dev/null
+++ b/lib/OpenLayers/Protocol/SOS/v1_0_0.js
@@ -0,0 +1,132 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Protocol/SOS.js
+ * @requires OpenLayers/Format/SOSGetFeatureOfInterest.js
+ */
+
+/**
+ * Class: OpenLayers.Protocol.SOS.v1_0_0
+ * An SOS v1.0.0 Protocol for vector layers.  Create a new instance with the
+ *     <OpenLayers.Protocol.SOS.v1_0_0> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Protocol>
+ */
+ OpenLayers.Protocol.SOS.v1_0_0 = OpenLayers.Class(OpenLayers.Protocol, {
+
+    /**
+     * APIProperty: fois
+     * {Array(String)} Array of features of interest (foi)
+     */
+    fois: null,
+
+    /**
+     * Property: formatOptions
+     * {Object} Optional options for the format.  If a format is not provided,
+     *     this property can be used to extend the default format options.
+     */
+    formatOptions: null,
+   
+    /**
+     * Constructor: OpenLayers.Protocol.SOS
+     * A class for giving layers an SOS protocol.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     * Valid options properties:
+     * url - {String} URL to send requests to (required).
+     * fois - {Array} The features of interest (required).
+     */
+    initialize: function(options) {
+        OpenLayers.Protocol.prototype.initialize.apply(this, [options]);
+        if(!options.format) {
+            this.format = new OpenLayers.Format.SOSGetFeatureOfInterest(
+                this.formatOptions);
+        }
+    },
+   
+    /**
+     * APIMethod: destroy
+     * Clean up the protocol.
+     */
+    destroy: function() {
+        if(this.options && !this.options.format) {
+            this.format.destroy();
+        }
+        this.format = null;
+        OpenLayers.Protocol.prototype.destroy.apply(this);
+    },
+
+    /**
+     * APIMethod: read
+     * Construct a request for reading new sensor positions. This is done by
+     *     issuing one GetFeatureOfInterest request.
+     */
+    read: function(options) {
+        options = OpenLayers.Util.extend({}, options);
+        OpenLayers.Util.applyDefaults(options, this.options || {});
+        var response = new OpenLayers.Protocol.Response({requestType: "read"});
+        var format = this.format;
+        var data = OpenLayers.Format.XML.prototype.write.apply(format,
+            [format.writeNode("sos:GetFeatureOfInterest", {fois: this.fois})]
+        );
+        response.priv = OpenLayers.Request.POST({
+            url: options.url,
+            callback: this.createCallback(this.handleRead, response, options),
+            data: data
+        });
+        return response;
+    },
+   
+    /**
+     * Method: handleRead
+     * Deal with response from the read request.
+     *
+     * Parameters:
+     * response - {<OpenLayers.Protocol.Response>} The response object to pass
+     *     to the user callback.
+     * options - {Object} The user options passed to the read call.
+     */
+    handleRead: function(response, options) {
+        if(options.callback) {
+            var request = response.priv;
+            if(request.status >= 200 && request.status < 300) {
+                // success
+                response.features = this.parseFeatures(request);
+                response.code = OpenLayers.Protocol.Response.SUCCESS;
+            } else {
+                // failure
+                response.code = OpenLayers.Protocol.Response.FAILURE;
+            }
+            options.callback.call(options.scope, response);
+        }
+    },
+
+    /**
+     * Method: parseFeatures
+     * Read HTTP response body and return features
+     *
+     * Parameters:
+     * request - {XMLHttpRequest} The request object
+     *
+     * Returns:
+     * {Array({<OpenLayers.Feature.Vector>})} Array of features
+     */
+    parseFeatures: function(request) {
+        var doc = request.responseXML;
+        if(!doc || !doc.documentElement) {
+            doc = request.responseText;
+        }
+        if(!doc || doc.length <= 0) {
+            return null;
+        }
+        return this.format.read(doc);
+    },
+
+    CLASS_NAME: "OpenLayers.Protocol.SOS.v1_0_0"
+});
diff --git a/lib/OpenLayers/Protocol/SQL.js b/lib/OpenLayers/Protocol/SQL.js
new file mode 100644
index 0000000..73982eb
--- /dev/null
+++ b/lib/OpenLayers/Protocol/SQL.js
@@ -0,0 +1,88 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Protocol.js
+ */
+
+/**
+ * Class: OpenLayers.Protocol.SQL
+ * Abstract SQL protocol class.  Not to be instantiated directly.  Use
+ *     one of the SQL protocol subclasses instead.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Protocol>
+ */
+OpenLayers.Protocol.SQL = OpenLayers.Class(OpenLayers.Protocol, {
+
+    /**
+     * APIProperty: databaseName
+     * {String}
+     */
+    databaseName: 'ol',
+
+    /**
+     * APIProperty: tableName
+     * Name of the database table into which Features should be saved.
+     */
+    tableName: "ol_vector_features",
+
+    /**
+     * Property: postReadFiltering
+     * {Boolean} Whether the filter (if there's one) must be applied after
+     *      the features have been read from the database; for example the
+     *      BBOX strategy passes the read method a BBOX spatial filter, if
+     *      postReadFiltering is true every feature read from the database
+     *      will go through the BBOX spatial filter, which can be costly;
+     *      defaults to true.
+     */
+    postReadFiltering: true,
+
+    /**
+     * Constructor: OpenLayers.Protocol.SQL
+     */
+    initialize: function(options) {
+        OpenLayers.Protocol.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: destroy
+     * Clean up the protocol.
+     */
+    destroy: function() {
+        OpenLayers.Protocol.prototype.destroy.apply(this);
+    },
+
+    /**
+     * APIMethod: supported
+     * This should be overridden by specific subclasses
+     *
+     * Returns:
+     * {Boolean} Whether or not the browser supports the SQL backend
+     */
+    supported: function() {
+        return false;
+    },
+
+    /**
+     * Method: evaluateFilter
+     * If postReadFiltering is true evaluate the filter against the feature
+     * and return the result of the evaluation, otherwise return true.
+     *
+     * Parameters:
+     * {<OpenLayers.Feature.Vector>} The feature.
+     * {<OpenLayers.Filter>} The filter.
+     *
+     * Returns:
+     * {Boolean} true if postReadFiltering if false, the result of the
+     * filter evaluation otherwise.
+     */
+    evaluateFilter: function(feature, filter) {
+        return filter && this.postReadFiltering ?
+            filter.evaluate(feature) : true;
+    },
+
+    CLASS_NAME: "OpenLayers.Protocol.SQL"
+});
diff --git a/lib/OpenLayers/Protocol/SQL/Gears.js b/lib/OpenLayers/Protocol/SQL/Gears.js
new file mode 100644
index 0000000..233e030
--- /dev/null
+++ b/lib/OpenLayers/Protocol/SQL/Gears.js
@@ -0,0 +1,561 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires Gears/gears_init.js
+ * @requires OpenLayers/Protocol/SQL.js
+ * @requires OpenLayers/Format/JSON.js
+ * @requires OpenLayers/Format/WKT.js
+ */
+
+/**
+ * Class: OpenLayers.Protocol.SQL.Gears
+ * This Protocol stores feature in the browser via the Gears Database module 
+ * <http://code.google.com/apis/gears/api_database.html>.
+ *
+ * The main advantage is that all the read, create, update and delete operations 
+ * can be done offline.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Protocol.SQL>
+ */
+OpenLayers.Protocol.SQL.Gears = OpenLayers.Class(OpenLayers.Protocol.SQL, {
+
+    /**
+     * Property: FID_PREFIX
+     * {String}
+     */
+    FID_PREFIX: '__gears_fid__',
+
+    /**
+     * Property: NULL_GEOMETRY
+     * {String}
+     */
+    NULL_GEOMETRY: '__gears_null_geometry__',
+
+    /**
+     * Property: NULL_FEATURE_STATE
+     * {String}
+     */
+    NULL_FEATURE_STATE: '__gears_null_feature_state__',
+
+    /**
+     * Property: jsonParser
+     * {<OpenLayers.Format.JSON>}
+     */
+    jsonParser: null,
+
+    /**
+     * Property: wktParser
+     * {<OpenLayers.Format.WKT>}
+     */
+    wktParser: null,
+
+    /**
+     * Property: fidRegExp
+     * {RegExp} Regular expression to know whether a feature was
+     *      created in offline mode.
+     */
+    fidRegExp: null,
+
+    /**
+     * Property: saveFeatureState
+     * {Boolean} Whether to save the feature state (<OpenLayers.State>)
+     *      into the database, defaults to true.
+     */    
+    saveFeatureState: true,
+
+    /**
+     * Property: typeOfFid
+     * {String} The type of the feature identifier, either "number" or
+     *      "string", defaults to "string".
+     */
+    typeOfFid: "string",
+
+    /**
+     * Property: db
+     * {GearsDatabase}
+     */
+    db: null,
+
+    /**
+     * Constructor: OpenLayers.Protocol.SQL.Gears
+     */
+    initialize: function(options) {
+        if (!this.supported()) {
+            return;
+        }
+        OpenLayers.Protocol.SQL.prototype.initialize.apply(this, [options]);
+        this.jsonParser = new OpenLayers.Format.JSON();
+        this.wktParser = new OpenLayers.Format.WKT();
+
+        this.fidRegExp = new RegExp('^' + this.FID_PREFIX);
+        this.initializeDatabase();
+
+        
+    },
+
+    /**
+     * Method: initializeDatabase
+     */
+    initializeDatabase: function() {
+        this.db = google.gears.factory.create('beta.database');
+        this.db.open(this.databaseName);
+        this.db.execute(
+            "CREATE TABLE IF NOT EXISTS " + this.tableName +
+            " (fid TEXT UNIQUE, geometry TEXT, properties TEXT," +
+            "  state TEXT)");
+   },
+
+    /**
+     * APIMethod: destroy
+     * Clean up the protocol.
+     */
+    destroy: function() {
+        this.db.close();
+        this.db = null;
+
+        this.jsonParser = null;
+        this.wktParser = null;
+
+        OpenLayers.Protocol.SQL.prototype.destroy.apply(this);
+    },
+
+    /**
+     * APIMethod: supported
+     * Determine whether a browser supports Gears
+     *
+     * Returns:
+     * {Boolean} The browser supports Gears
+     */
+    supported: function() {
+        return !!(window.google && google.gears);
+    },
+
+    /**
+     * APIMethod: read
+     * Read all features from the database and return a
+     * <OpenLayers.Protocol.Response> instance. If the options parameter
+     * contains a callback attribute, the function is called with the response
+     * as a parameter.
+     *
+     * Parameters:
+     * options - {Object} Optional object for configuring the request; it
+     *      can have the {Boolean} property "noFeatureStateReset" which
+     *      specifies if the state of features read from the Gears
+     *      database must be reset to null, if "noFeatureStateReset"
+     *      is undefined or false then each feature's state is reset
+     *      to null, if "noFeatureStateReset" is true the feature state
+     *      is preserved.
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     *      object.
+     */
+    read: function(options) {
+        OpenLayers.Protocol.prototype.read.apply(this, arguments);
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+
+        var feature, features = [];
+        var rs = this.db.execute("SELECT * FROM " + this.tableName);
+        while (rs.isValidRow()) {
+            feature = this.unfreezeFeature(rs);
+            if (this.evaluateFilter(feature, options.filter)) {
+                if (!options.noFeatureStateReset) {
+                    feature.state = null;
+                }
+                features.push(feature);
+            }
+            rs.next();
+        }
+        rs.close();
+
+        var resp = new OpenLayers.Protocol.Response({
+            code: OpenLayers.Protocol.Response.SUCCESS,
+            requestType: "read",
+            features: features
+        });
+
+        if (options && options.callback) {
+            options.callback.call(options.scope, resp);
+        }
+
+        return resp;
+    },
+
+    /**
+     * Method: unfreezeFeature
+     *
+     * Parameters:
+     * row - {ResultSet}
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>}
+     */
+    unfreezeFeature: function(row) {
+        var feature;
+        var wkt = row.fieldByName('geometry');
+        if (wkt == this.NULL_GEOMETRY) {
+            feature = new OpenLayers.Feature.Vector();
+        } else {
+            feature = this.wktParser.read(wkt);
+        }
+
+        feature.attributes = this.jsonParser.read(
+            row.fieldByName('properties'));
+
+        feature.fid = this.extractFidFromField(row.fieldByName('fid'));
+
+        var state = row.fieldByName('state');
+        if (state == this.NULL_FEATURE_STATE) {
+            state = null;
+        }
+        feature.state = state;
+
+        return feature;
+    },
+
+    /**
+     * Method: extractFidFromField
+     *
+     * Parameters:
+     * field - {String}
+     *
+     * Returns
+     * {String} or {Number} The fid.
+     */
+    extractFidFromField: function(field) {
+        if (!field.match(this.fidRegExp) && this.typeOfFid == "number") {
+            field = parseFloat(field);
+        }
+        return field;
+    },
+
+    /**
+     * APIMethod: create
+     * Create new features into the database.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})} or
+     *            {<OpenLayers.Feature.Vector>} The features to create in
+     *            the database.
+     * options - {Object} Optional object for configuring the request.
+     *
+     * Returns:
+     *  {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     *          object.
+     */
+    create: function(features, options) {
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+
+        var resp = this.createOrUpdate(features);
+        resp.requestType = "create";
+
+        if (options && options.callback) {
+            options.callback.call(options.scope, resp);
+        }
+
+        return resp;
+    },
+
+    /**
+     * APIMethod: update
+     * Construct a request updating modified feature.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})} or
+     *            {<OpenLayers.Feature.Vector>} The features to update in
+     *            the database.
+     * options - {Object} Optional object for configuring the request.
+     *
+     * Returns:
+     *  {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     *          object.
+     */
+    update: function(features, options) {
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+
+        var resp = this.createOrUpdate(features);
+        resp.requestType = "update";
+
+        if (options && options.callback) {
+            options.callback.call(options.scope, resp);
+        }
+
+        return resp;
+    },
+
+    /**
+     * Method: createOrUpdate
+     * Construct a request for updating or creating features in the
+     * database.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})} or
+     *      {<OpenLayers.Feature.Vector>} The feature to create or update
+     *      in the database.
+     *
+     * Returns:
+     *  {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     *          object.
+     */
+    createOrUpdate: function(features) {
+        if (!(features instanceof Array)) {
+            features = [features];
+        }
+
+        var i, len = features.length, feature;
+        var insertedFeatures = new Array(len);
+ 
+        for (i = 0; i < len; i++) {
+            feature = features[i];
+            var params = this.freezeFeature(feature);
+            this.db.execute(
+                "REPLACE INTO " + this.tableName + 
+                " (fid, geometry, properties, state)" + 
+                " VALUES (?, ?, ?, ?)",
+                params);
+
+            var clone = feature.clone();
+            clone.fid = this.extractFidFromField(params[0]);
+            insertedFeatures[i] = clone;
+        }
+
+        return new OpenLayers.Protocol.Response({
+            code: OpenLayers.Protocol.Response.SUCCESS,
+            features: insertedFeatures,
+            reqFeatures: features
+        });
+    },
+
+    /**
+     * Method: freezeFeature
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     * state - {String} The feature state to store in the database.
+     *
+     * Returns:
+     * {Array}
+     */
+    freezeFeature: function(feature) {
+        // 2 notes:
+        // - fid might not be a string
+        // - getFeatureStateForFreeze needs the feature fid to it's stored
+        //   in the feature here
+        feature.fid = feature.fid != null ?
+            "" + feature.fid : OpenLayers.Util.createUniqueID(this.FID_PREFIX);
+
+        var geometry = feature.geometry != null ?
+            feature.geometry.toString() : this.NULL_GEOMETRY;
+
+        var properties = this.jsonParser.write(feature.attributes);
+
+        var state = this.getFeatureStateForFreeze(feature);
+
+        return [feature.fid, geometry, properties, state];
+    },
+
+    /**
+     * Method: getFeatureStateForFreeze
+     * Get the state of the feature to store into the database.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} The feature.
+     *
+     * Returns
+     * {String} The state
+     */
+    getFeatureStateForFreeze: function(feature) {
+        var state;
+        if (!this.saveFeatureState) {
+            state = this.NULL_FEATURE_STATE;
+        } else if (this.createdOffline(feature)) {
+            // if the feature was created in offline mode, its
+            // state must remain INSERT
+            state = OpenLayers.State.INSERT;
+        } else {
+            state = feature.state;
+        }
+        return state;
+    },
+
+    /**
+     * APIMethod: delete
+     * Delete features from the database.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})} or
+     *            {<OpenLayers.Feature.Vector>}
+     * options - {Object} Optional object for configuring the request.
+     *       This object is modified and should not be reused.
+     *
+     * Returns:
+     *  {<OpenLayers.Protocol.Response>} An <OpenLayers.Protocol.Response>
+     *          object.
+     */
+    "delete": function(features, options) {
+        if (!(features instanceof Array)) {
+            features = [features];
+        }
+
+        options = OpenLayers.Util.applyDefaults(options, this.options);
+
+        var i, len, feature;
+        for (i = 0, len = features.length; i < len; i++) {
+            feature = features[i];
+
+            // if saveFeatureState is set to true and if the feature wasn't created
+            // in offline mode we don't delete it in the database but just update 
+            // it state column
+            if (this.saveFeatureState && !this.createdOffline(feature)) {
+                var toDelete = feature.clone();
+                toDelete.fid = feature.fid;
+                if (toDelete.geometry) {
+                    toDelete.geometry.destroy();
+                    toDelete.geometry = null;
+                }
+                toDelete.state = feature.state;
+                this.createOrUpdate(toDelete);
+            } else {
+                this.db.execute(
+                    "DELETE FROM " + this.tableName +
+                    " WHERE fid = ?", [feature.fid]);
+            }
+        }
+
+        var resp = new OpenLayers.Protocol.Response({
+            code: OpenLayers.Protocol.Response.SUCCESS,
+            requestType: "delete",
+            reqFeatures: features
+        });
+
+        if (options && options.callback) {
+            options.callback.call(options.scope, resp);
+        }
+
+        return resp;
+    },
+
+    /**
+     * Method: createdOffline
+     * Returns true if the feature had a feature id when it was created in
+     *      the Gears database, false otherwise; this is determined by
+     *      checking the form of the feature's fid value.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     *
+     * Returns:
+     * {Boolean}
+     */
+    createdOffline: function(feature) {
+        return (typeof feature.fid == "string" &&
+                !!(feature.fid.match(this.fidRegExp)));
+    },
+
+    /**
+     * APIMethod: commit
+     * Go over the features and for each take action
+     * based on the feature state. Possible actions are create,
+     * update and delete.
+     *
+     * Parameters:
+     * features - {Array({<OpenLayers.Feature.Vector>})}
+     * options - {Object} Object whose possible keys are "create", "update",
+     *      "delete", "callback" and "scope", the values referenced by the
+     *      first three are objects as passed to the "create", "update", and
+     *      "delete" methods, the value referenced by the "callback" key is
+     *      a function which is called when the commit operation is complete
+     *      using the scope referenced by the "scope" key.
+     *
+     * Returns:
+     * {Array({<OpenLayers.Protocol.Response>})} An array of
+     *       <OpenLayers.Protocol.Response> objects, one per request made
+     *       to the database.
+     */
+    commit: function(features, options) {
+        var opt, resp = [], nRequests = 0, nResponses = 0;
+
+        function callback(resp) {
+            if (++nResponses < nRequests) {
+                resp.last = false;
+            }
+            this.callUserCallback(options, resp);
+        }
+
+        var feature, toCreate = [], toUpdate = [], toDelete = [];
+        for (var i = features.length - 1; i >= 0; i--) {
+            feature = features[i];
+            switch (feature.state) {
+            case OpenLayers.State.INSERT:
+                toCreate.push(feature);
+                break;
+            case OpenLayers.State.UPDATE:
+                toUpdate.push(feature);
+                break;
+            case OpenLayers.State.DELETE:
+                toDelete.push(feature);
+                break;
+            }
+        }
+        if (toCreate.length > 0) {
+            nRequests++;
+            opt = OpenLayers.Util.applyDefaults(
+                {"callback": callback, "scope": this},
+                options.create
+            );
+            resp.push(this.create(toCreate, opt));
+        }
+        if (toUpdate.length > 0) {
+            nRequests++;
+            opt = OpenLayers.Util.applyDefaults(
+                {"callback": callback, "scope": this},
+                options.update
+            );
+            resp.push(this.update(toUpdate, opt));
+        }
+        if (toDelete.length > 0) {
+            nRequests++;
+            opt = OpenLayers.Util.applyDefaults(
+                {"callback": callback, "scope": this},
+                options["delete"]
+            );
+            resp.push(this["delete"](toDelete, opt));
+        }
+
+        return resp;
+    },
+
+    /**
+     * Method: clear
+     * Removes all rows of the table.
+     */
+    clear: function() {
+        this.db.execute("DELETE FROM " + this.tableName);
+    },
+
+    /**
+     * Method: callUserCallback
+     * This method is called from within commit each time a request is made
+     * to the database, it is responsible for calling the user-supplied
+     * callbacks.
+     *
+     * Parameters:
+     * options - {Object} The map of options passed to the commit call.
+     * resp - {<OpenLayers.Protocol.Response>}
+     */
+    callUserCallback: function(options, resp) {
+        var opt = options[resp.requestType];
+        if (opt && opt.callback) {
+            opt.callback.call(opt.scope, resp);
+        }
+        if (resp.last && options.callback) {
+            options.callback.call(options.scope);
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Protocol.SQL.Gears"
+});
diff --git a/lib/OpenLayers/Protocol/WFS.js b/lib/OpenLayers/Protocol/WFS.js
new file mode 100644
index 0000000..d07d303
--- /dev/null
+++ b/lib/OpenLayers/Protocol/WFS.js
@@ -0,0 +1,71 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Protocol.js
+ */
+
+/**
+ * Function: OpenLayers.Protocol.WFS
+ * Used to create a versioned WFS protocol.  Default version is 1.0.0.
+ *
+ * Returns:
+ * {<OpenLayers.Protocol>} A WFS protocol of the given version.
+ */
+OpenLayers.Protocol.WFS = function(options) {
+    options = OpenLayers.Util.applyDefaults(
+        options, OpenLayers.Protocol.WFS.DEFAULTS
+    );
+    var cls = OpenLayers.Protocol.WFS["v"+options.version.replace(/\./g, "_")];
+    if(!cls) {
+        throw "Unsupported WFS version: " + options.version;
+    }
+    return new cls(options);
+};
+
+/**
+ * Function: OpenLayers.Protocol.WFS.fromWMSLayer
+ * Convenience function to create a WFS protocol from a WMS layer.  This makes
+ *     the assumption that a WFS requests can be issued at the same URL as
+ *     WMS requests and that a WFS featureType exists with the same name as the
+ *     WMS layer.
+ *     
+ * This function is designed to auto-configure <url>, <featureType>,
+ *     <featurePrefix> and <srsName> for WFS <version> 1.1.0. Note that
+ *     srsName matching with the WMS layer will not work with WFS 1.0.0..
+ * 
+ * Parameters:
+ * layer - {<OpenLayers.Layer.WMS>} WMS layer that has a matching WFS
+ *     FeatureType at the same server url with the same typename.
+ * options - {Object} Default properties to be set on the protocol.
+ *
+ */
+OpenLayers.Protocol.WFS.fromWMSLayer = function(layer, options) {
+    var typeName, featurePrefix;
+    var param = layer.params["LAYERS"];
+    var parts = (param instanceof Array ? param[0] : param).split(":");
+    if(parts.length > 1) {
+        featurePrefix = parts[0];
+    }
+    typeName = parts.pop();
+    var protocolOptions = {
+        url: layer.url,
+        featureType: typeName,
+        featurePrefix: featurePrefix,
+        srsName: layer.projection && layer.projection.getCode() ||
+                 layer.map && layer.map.getProjectionObject().getCode(),
+        version: "1.1.0"
+    };
+    return new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults(
+        options, protocolOptions
+    ));
+};
+
+/**
+ * Constant: OpenLayers.Protocol.WFS.DEFAULTS
+ */
+OpenLayers.Protocol.WFS.DEFAULTS = {
+    "version": "1.0.0"
+};
diff --git a/lib/OpenLayers/Protocol/WFS/v1.js b/lib/OpenLayers/Protocol/WFS/v1.js
new file mode 100644
index 0000000..b6da13a
--- /dev/null
+++ b/lib/OpenLayers/Protocol/WFS/v1.js
@@ -0,0 +1,342 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Protocol/WFS.js
+ */
+
+/**
+ * Class: OpenLayers.Protocol.WFS.v1
+ * Abstract class for for v1.0.0 and v1.1.0 protocol.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Protocol>
+ */
+OpenLayers.Protocol.WFS.v1 = OpenLayers.Class(OpenLayers.Protocol, {
+    
+    /**
+     * Property: version
+     * {String} WFS version number.
+     */
+    version: null,
+    
+    /**
+     * Property: srsName
+     * {String} Name of spatial reference system.  Default is "EPSG:4326".
+     */
+    srsName: "EPSG:4326",
+    
+    /**
+     * Property: featureType
+     * {String} Local feature typeName.
+     */
+    featureType: null,
+    
+    /**
+     * Property: featureNS
+     * {String} Feature namespace.
+     */
+    featureNS: null,
+    
+    /**
+     * Property: geometryName
+     * {String} Name of the geometry attribute for features.  Default is
+     *     "the_geom".
+     */
+    geometryName: "the_geom",
+    
+    /**
+     * Property: schema
+     * {String} Optional schema location that will be included in the
+     *     schemaLocation attribute value.  Note that the feature type schema
+     *     is required for a strict XML validator (on transactions with an
+     *     insert for example), but is *not* required by the WFS specification
+     *     (since the server is supposed to know about feature type schemas).
+     */
+    schema: null,
+
+    /**
+     * Property: featurePrefix
+     * {String} Namespace alias for feature type.  Default is "feature".
+     */
+    featurePrefix: "feature",
+    
+    /**
+     * Property: formatOptions
+     * {Object} Optional options for the format.  If a format is not provided,
+     *     this property can be used to extend the default format options.
+     */
+    formatOptions: null,
+
+    /** 
+     * Property: readFormat 
+     * {<OpenLayers.Format>} For WFS requests it is possible to get a  
+     *     different output format than GML. In that case, we cannot parse  
+     *     the response with the default format (WFST) and we need a different 
+     *     format for reading. 
+     */ 
+    readFormat: null,     
+    
+    /**
+     * Constructor: OpenLayers.Protocol.WFS
+     * A class for giving layers WFS protocol.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     *
+     * Valid options properties:
+     * url - {String} URL to send requests to (required).
+     * featureType - {String} Local (without prefix) feature typeName (required).
+     * featureNS - {String} Feature namespace (required, but can be autodetected
+     *     for reading if featurePrefix is provided and identical to the prefix
+     *     in the server response).
+     * featurePrefix - {String} Feature namespace alias (optional - only used
+     *     for writing if featureNS is provided).  Default is 'feature'.
+     * geometryName - {String} Name of geometry attribute.  Default is 'the_geom'.
+     */
+    initialize: function(options) {
+        OpenLayers.Protocol.prototype.initialize.apply(this, [options]);
+        if(!options.format) {
+            this.format = OpenLayers.Format.WFST(OpenLayers.Util.extend({
+                version: this.version,
+                featureType: this.featureType,
+                featureNS: this.featureNS,
+                featurePrefix: this.featurePrefix,
+                geometryName: this.geometryName,
+                srsName: this.srsName,
+                schema: this.schema
+            }, this.formatOptions));
+        }
+        if(!this.featureNS && this.featurePrefix) {
+            // featureNS autodetection
+            var readNode = this.format.readNode;
+            this.format.readNode = function(node, obj) {
+                if(!this.featureNS && node.prefix == this.featurePrefix) {
+                    this.featureNS = node.namespaceURI;
+                    this.setNamespace("feature", this.featureNS);
+                }
+                return readNode.apply(this, arguments);
+            };
+        }
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Clean up the protocol.
+     */
+    destroy: function() {
+        if(this.options && !this.options.format) {
+            this.format.destroy();
+        }
+        this.format = null;
+        OpenLayers.Protocol.prototype.destroy.apply(this);
+    },
+
+    /**
+     * Method: read
+     * Construct a request for reading new features.  Since WFS splits the
+     *     basic CRUD operations into GetFeature requests (for read) and
+     *     Transactions (for all others), this method does not make use of the
+     *     format's read method (that is only about reading transaction
+     *     responses).
+     */
+    read: function(options) {
+        OpenLayers.Protocol.prototype.read.apply(this, arguments);
+        options = OpenLayers.Util.extend({}, options);
+        OpenLayers.Util.applyDefaults(options, this.options || {});
+        var response = new OpenLayers.Protocol.Response({requestType: "read"});
+        
+        var data = OpenLayers.Format.XML.prototype.write.apply(
+            this.format, [this.format.writeNode("wfs:GetFeature", options)]
+        );
+
+        response.priv = OpenLayers.Request.POST({
+            url: options.url,
+            callback: this.createCallback(this.handleRead, response, options),
+            params: options.params,
+            headers: options.headers,
+            data: data
+        });        
+
+        return response;
+    },
+    
+    /**
+     * Method: handleRead
+     * Deal with response from the read request.
+     *
+     * Parameters:
+     * response - {<OpenLayers.Protocol.Response>} The response object to pass
+     *     to the user callback.
+     * options - {Object} The user options passed to the read call.
+     */
+    handleRead: function(response, options) {
+        if(options.callback) {
+            var request = response.priv;
+            if(request.status >= 200 && request.status < 300) {
+                // success
+                response.features = this.parseFeatures(request);
+                response.code = OpenLayers.Protocol.Response.SUCCESS;
+            } else {
+                // failure
+                response.code = OpenLayers.Protocol.Response.FAILURE;
+            }
+            options.callback.call(options.scope, response);
+        }
+    },
+
+    /**
+     * Method: parseFeatures
+     * Read HTTP response body and return features
+     *
+     * Parameters:
+     * request - {XMLHttpRequest} The request object
+     *
+     * Returns:
+     * {Array({<OpenLayers.Feature.Vector>})} or
+     *     {<OpenLayers.Feature.Vector>} Array of features or a single feature.
+     */
+    parseFeatures: function(request) {
+        var doc = request.responseXML;
+        if(!doc || !doc.documentElement) {
+            doc = request.responseText;
+        }
+        if(!doc || doc.length <= 0) {
+            return null;
+        }
+        return (this.readFormat !== null) ? this.readFormat.read(doc) : 
+            this.format.read(doc);
+    },
+
+    /**
+     * Method: commit
+     * Given a list of feature, assemble a batch request for update, create,
+     *     and delete transactions.  A commit call on the prototype amounts
+     *     to writing a WFS transaction - so the write method on the format
+     *     is used.
+     *
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>}
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} A response object with a features
+     *     property containing any insertIds and a priv property referencing
+     *     the XMLHttpRequest object.
+     */
+    commit: function(features, options) {
+
+        options = OpenLayers.Util.extend({}, options);
+        OpenLayers.Util.applyDefaults(options, this.options);
+        
+        var response = new OpenLayers.Protocol.Response({
+            requestType: "commit",
+            reqFeatures: features
+        });
+        response.priv = OpenLayers.Request.POST({
+            url: options.url,
+            data: this.format.write(features, options),
+            callback: this.createCallback(this.handleCommit, response, options)
+        });
+        
+        return response;
+    },
+    
+    /**
+     * Method: handleCommit
+     * Called when the commit request returns.
+     * 
+     * Parameters:
+     * response - {<OpenLayers.Protocol.Response>} The response object to pass
+     *     to the user callback.
+     * options - {Object} The user options passed to the commit call.
+     */
+    handleCommit: function(response, options) {
+        if(options.callback) {
+            var request = response.priv;
+
+            // ensure that we have an xml doc
+            var data = request.responseXML;
+            if(!data || !data.documentElement) {
+                data = request.responseText;
+            }
+            
+            var obj = this.format.read(data) || {};
+            
+            response.insertIds = obj.insertIds || [];
+            response.code = (obj.success) ?
+                OpenLayers.Protocol.Response.SUCCESS :
+                OpenLayers.Protocol.Response.FAILURE;
+            options.callback.call(options.scope, response);
+        }
+    },
+    
+    /**
+     * Method: filterDelete
+     * Send a request that deletes all features by their filter.
+     * 
+     * Parameters:
+     * filter - {OpenLayers.Filter} filter
+     */
+    filterDelete: function(filter, options) {
+        options = OpenLayers.Util.extend({}, options);
+        OpenLayers.Util.applyDefaults(options, this.options);    
+        
+        var response = new OpenLayers.Protocol.Response({
+            requestType: "commit"
+        });    
+        
+        var root = this.format.createElementNSPlus("wfs:Transaction", {
+            attributes: {
+                service: "WFS",
+                version: this.version
+            }
+        });
+        
+        var deleteNode = this.format.createElementNSPlus("wfs:Delete", {
+            attributes: {
+                typeName: (options.featureNS ? this.featurePrefix + ":" : "") +
+                    options.featureType
+            }
+        });       
+        
+        if(options.featureNS) {
+            deleteNode.setAttribute("xmlns:" + this.featurePrefix, options.featureNS);
+        }
+        var filterNode = this.format.writeNode("ogc:Filter", filter);
+        
+        deleteNode.appendChild(filterNode);
+        
+        root.appendChild(deleteNode);
+        
+        var data = OpenLayers.Format.XML.prototype.write.apply(
+            this.format, [root]
+        );
+        
+        return OpenLayers.Request.POST({
+            url: this.url,
+            callback : options.callback || function(){},
+            data: data
+        });   
+        
+    },
+
+    /**
+     * Method: abort
+     * Abort an ongoing request, the response object passed to
+     * this method must come from this protocol (as a result
+     * of a read, or commit operation).
+     *
+     * Parameters:
+     * response - {<OpenLayers.Protocol.Response>}
+     */
+    abort: function(response) {
+        if (response) {
+            response.priv.abort();
+        }
+    },
+  
+    CLASS_NAME: "OpenLayers.Protocol.WFS.v1" 
+});
diff --git a/lib/OpenLayers/Protocol/WFS/v1_0_0.js b/lib/OpenLayers/Protocol/WFS/v1_0_0.js
new file mode 100644
index 0000000..3e94c81
--- /dev/null
+++ b/lib/OpenLayers/Protocol/WFS/v1_0_0.js
@@ -0,0 +1,44 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Protocol/WFS/v1.js
+ * @requires OpenLayers/Format/WFST/v1_0_0.js
+ */
+
+/**
+ * Class: OpenLayers.Protocol.WFS.v1_0_0
+ * A WFS v1.0.0 protocol for vector layers.  Create a new instance with the
+ *     <OpenLayers.Protocol.WFS.v1_0_0> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Protocol.WFS.v1>
+ */
+OpenLayers.Protocol.WFS.v1_0_0 = OpenLayers.Class(OpenLayers.Protocol.WFS.v1, {
+    
+    /**
+     * Property: version
+     * {String} WFS version number.
+     */
+    version: "1.0.0",
+    
+    /**
+     * Constructor: OpenLayers.Protocol.WFS.v1_0_0
+     * A class for giving layers WFS v1.0.0 protocol.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     *
+     * Valid options properties:
+     * featureType - {String} Local (without prefix) feature typeName (required).
+     * featureNS - {String} Feature namespace (optional).
+     * featurePrefix - {String} Feature namespace alias (optional - only used
+     *     if featureNS is provided).  Default is 'feature'.
+     * geometryName - {String} Name of geometry attribute.  Default is 'the_geom'.
+     */
+   
+    CLASS_NAME: "OpenLayers.Protocol.WFS.v1_0_0" 
+});
diff --git a/lib/OpenLayers/Protocol/WFS/v1_1_0.js b/lib/OpenLayers/Protocol/WFS/v1_1_0.js
new file mode 100644
index 0000000..b670835
--- /dev/null
+++ b/lib/OpenLayers/Protocol/WFS/v1_1_0.js
@@ -0,0 +1,48 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Protocol/WFS/v1.js
+ * @requires OpenLayers/Format/WFST/v1_1_0.js
+ */
+
+/**
+ * Class: OpenLayers.Protocol.WFS.v1_1_0
+ * A WFS v1.1.0 protocol for vector layers.  Create a new instance with the
+ *     <OpenLayers.Protocol.WFS.v1_1_0> constructor.
+ *
+ * Differences from the v1.0.0 protocol:
+ *  - uses Filter Encoding 1.1.0 instead of 1.0.0
+ *  - uses GML 3 instead of 2 if no format is provided
+ *  
+ * Inherits from:
+ *  - <OpenLayers.Protocol.WFS.v1>
+ */
+OpenLayers.Protocol.WFS.v1_1_0 = OpenLayers.Class(OpenLayers.Protocol.WFS.v1, {
+    
+    /**
+     * Property: version
+     * {String} WFS version number.
+     */
+    version: "1.1.0",
+    
+    /**
+     * Constructor: OpenLayers.Protocol.WFS.v1_1_0
+     * A class for giving layers WFS v1.1.0 protocol.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     *
+     * Valid options properties:
+     * featureType - {String} Local (without prefix) feature typeName (required).
+     * featureNS - {String} Feature namespace (optional).
+     * featurePrefix - {String} Feature namespace alias (optional - only used
+     *     if featureNS is provided).  Default is 'feature'.
+     * geometryName - {String} Name of geometry attribute.  Default is 'the_geom'.
+     */
+   
+    CLASS_NAME: "OpenLayers.Protocol.WFS.v1_1_0"
+});
diff --git a/lib/OpenLayers/Renderer.js b/lib/OpenLayers/Renderer.js
new file mode 100644
index 0000000..c7bc5e0
--- /dev/null
+++ b/lib/OpenLayers/Renderer.js
@@ -0,0 +1,362 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * 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. 
+ * 
+ * A note to the user that all subclasses should use getResolution() instead
+ *  of directly accessing this.resolution in order to correctly use the 
+ *  cacheing system.
+ *
+ */
+OpenLayers.Renderer = OpenLayers.Class({
+
+    /** 
+     * Property: container
+     * {DOMElement} 
+     */
+    container: null,
+    
+    /**
+     * Property: root
+     * {DOMElement}
+     */
+    root: null,
+
+    /** 
+     * Property: extent
+     * {<OpenLayers.Bounds>}
+     */
+    extent: null,
+
+    /**
+     * 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 
+     *     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. 
+     */  
+    locked: false,
+    
+    /** 
+     * Property: size
+     * {<OpenLayers.Size>} 
+     */
+    size: null,
+    
+    /**
+     * Property: resolution
+     * {Float} cache of current map resolution
+     */
+    resolution: null,
+    
+    /**
+     * Property: map  
+     * {<OpenLayers.Map>} Reference to the map -- this is set in Vector's setMap()
+     */
+    map: null,
+    
+    /**
+     * Constructor: OpenLayers.Renderer 
+     *
+     * Parameters:
+     * 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
+     */
+    destroy: function() {
+        this.container = null;
+        this.extent = null;
+        this.size =  null;
+        this.resolution = null;
+        this.map = null;
+    },
+
+    /**
+     * 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 
+     * 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
+     * getResolution() request.
+     *
+     * Parameters:
+     * extent - {<OpenLayers.Bounds>}
+     * resolutionChanged - {Boolean}
+     */
+    setExtent: function(extent, resolutionChanged) {
+        this.extent = extent.clone();
+        if (resolutionChanged) {
+            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 
+     * next it is needed.
+     *
+     * Parameters:
+     * 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
+     */
+    getResolution: function() {
+        this.resolution = this.resolution || this.map.getResolution();
+        return this.resolution;
+    },
+    
+    /**
+     * Method: drawFeature
+     * Draw the feature.  The optional style argument can be used
+     * to override the feature's own style.  This method should only
+     * be called from layer.drawFeature().
+     *
+     * Parameters:
+     * 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
+     */
+    drawFeature: function(feature, style) {
+        if(style == null) {
+            style = feature.style;
+        }
+        if (feature.geometry) {
+            var bounds = feature.geometry.getBounds();
+            if(bounds) {
+                if (!bounds.intersectsBounds(this.extent)) {
+                    style = {display: "none"};
+                }
+                var rendered = this.drawGeometry(feature.geometry, style, feature.id);
+                if(style.display != "none" && style.label && rendered !== false) {
+                    var location = feature.geometry.getCentroid(); 
+                    if(style.labelXOffset || style.labelYOffset) {
+                        xOffset = isNaN(style.labelXOffset) ? 0 : style.labelXOffset;
+                        yOffset = isNaN(style.labelYOffset) ? 0 : style.labelYOffset;
+                        var res = this.getResolution();
+                        location.move(xOffset*res, yOffset*res);
+                    }
+                    this.drawText(feature.id, style, location);
+                } else {
+                    this.removeText(feature.id);
+                }
+                return rendered;
+            }
+        }
+    },
+
+
+    /** 
+     * 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>} 
+     */
+    drawGeometry: function(geometry, style, featureId) {},
+        
+    /**
+     * Method: drawText
+     * Function for drawing text labels.
+     * This method is only called by the renderer itself.
+     * 
+     * Parameters: 
+     * featureId - {String}
+     * style -
+     * location - {<OpenLayers.Geometry.Point>}
+     */
+    drawText: function(featureId, style, location) {},
+
+    /**
+     * Method: removeText
+     * Function for removing text labels.
+     * This method is only called by the renderer itself.
+     * 
+     * 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.  
+     * How this happens is specific to the renderer.  This should be
+     * called from layer.getFeatureFromEvent().
+     * Virtual function.
+     * 
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     *
+     * Returns:
+     * {String} A feature id or null.
+     */
+    getFeatureIdFromEvent: function(evt) {},
+    
+    /**
+     * Method: eraseFeatures 
+     * This is called by the layer to erase features
+     * 
+     * Parameters:
+     * features - {Array(<OpenLayers.Feature.Vector>)} 
+     */
+    eraseFeatures: function(features) {
+        if(!(features instanceof Array)) {
+            features = [features];
+        }
+        for(var i=0, len=features.length; i<len; ++i) {
+            var feature = features[i];
+            this.eraseGeometry(feature.geometry, feature.id);
+            this.removeText(feature.id);
+        }
+    },
+    
+    /**
+     * Method: eraseGeometry
+     * Remove a geometry from the renderer (by id).
+     * virtual function.
+     * 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} 
+     * featureId - {String}
+     */
+    eraseGeometry: function(geometry, featureId) {},
+    
+    /**
+     * 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
+     */
+    moveRoot: function(renderer) {},
+
+    /**
+     * 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.container.id;
+    },
+    
+    /**
+     * Method: applyDefaultSymbolizer
+     * 
+     * Parameters:
+     * symbolizer - {Object}
+     * 
+     * Returns:
+     * {Object}
+     */
+    applyDefaultSymbolizer: function(symbolizer) {
+        var result = OpenLayers.Util.extend({},
+            OpenLayers.Renderer.defaultSymbolizer);
+        if(symbolizer.stroke === false) {
+            delete result.strokeWidth;
+            delete result.strokeColor;
+        }
+        if(symbolizer.fill === false) {
+            delete result.fillColor;
+        }
+        OpenLayers.Util.extend(result, symbolizer);
+        return result;
+    },
+
+    CLASS_NAME: "OpenLayers.Renderer"
+});
+
+/**
+ * Constant: OpenLayers.Renderer.defaultSymbolizer
+ * {Object} Properties from this symbolizer will be applied to symbolizers
+ *     with missing properties. This can also be used to set a global
+ *     symbolizer default in OpenLayers. To be SLD 1.x compliant, add the
+ *     following code before rendering any vector features:
+ * (code)
+ * OpenLayers.Renderer.defaultSymbolizer = {
+ *     fillColor: "#808080",
+ *     fillOpacity: 1,
+ *     strokeColor: "#000000",
+ *     strokeOpacity: 1,
+ *     strokeWidth: 1,
+ *     pointRadius: 3,
+ *     graphicName: "square"
+ * };
+ * (end)
+ */
+OpenLayers.Renderer.defaultSymbolizer = {
+    fillColor: "#000000",
+    strokeColor: "#000000",
+    strokeWidth: 2,
+    fillOpacity: 1,
+    strokeOpacity: 1,
+    pointRadius: 0
+};
+    
diff --git a/lib/OpenLayers/Renderer/Canvas.js b/lib/OpenLayers/Renderer/Canvas.js
new file mode 100644
index 0000000..b03c40b
--- /dev/null
+++ b/lib/OpenLayers/Renderer/Canvas.js
@@ -0,0 +1,494 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Renderer.js
+ */
+
+/**
+ * Class: OpenLayers.Renderer.Canvas 
+ * A renderer based on the 2D 'canvas' drawing element.element
+ * 
+ * Inherits:
+ *  - <OpenLayers.Renderer>
+ */
+OpenLayers.Renderer.Canvas = OpenLayers.Class(OpenLayers.Renderer, {
+
+    /**
+     * Property: canvas
+     * {Canvas} The canvas context object.
+     */
+    canvas: null, 
+    
+    /**
+     * Property: features
+     * {Object} Internal object of feature/style pairs for use in redrawing the layer.
+     */
+    features: null, 
+   
+    /**
+     * Constructor: OpenLayers.Renderer.Canvas
+     *
+     * Parameters:
+     * containerID - {<String>} 
+     */
+    initialize: function(containerID) {
+        OpenLayers.Renderer.prototype.initialize.apply(this, arguments);
+        this.root = document.createElement("canvas");
+        this.container.appendChild(this.root);
+        this.canvas = this.root.getContext("2d");
+        this.features = {};
+    },
+    
+    /** 
+     * 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.   
+     * 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * featureId - {String}
+     */
+    eraseGeometry: function(geometry, featureId) {
+        this.eraseFeatures(this.features[featureId][0]);
+    },
+
+    /**
+     * 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. 
+     *
+     * Parameters:
+     * extent - {<OpenLayers.Bounds>} 
+     */
+    setExtent: function(extent) {
+        this.extent = extent.clone();
+        this.resolution = null;
+        this.redraw();
+    },
+    
+    /**
+     * Method: setSize
+     * Sets the size of the drawing surface.
+     *
+     * Once the size is updated, redraw the canvas.
+     *
+     * Parameters:
+     * size - {<OpenLayers.Size>} 
+     */
+    setSize: function(size) {
+        this.size = size.clone();
+        this.root.style.width = size.w + "px";
+        this.root.style.height = size.h + "px";
+        this.root.width = size.w;
+        this.root.height = size.h;
+        this.resolution = null;
+    },
+    
+    /**
+     * Method: drawFeature
+     * Draw the feature. Stores the feature in the features list,
+     * then redraws the layer. 
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>} 
+     * style - {<Object>} 
+     */
+    drawFeature: function(feature, style) {
+        style = style || feature.style;
+        style = this.applyDefaultSymbolizer(style);  
+        
+        this.features[feature.id] = [feature, style]; 
+        this.redraw();
+    },
+
+
+    /** 
+     * Method: drawGeometry
+     * Used when looping (in redraw) over the features; draws
+     * the canvas. 
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>} 
+     * style - {Object} 
+     */
+    drawGeometry: function(geometry, style) {
+        var className = geometry.CLASS_NAME;
+        if ((className == "OpenLayers.Geometry.Collection") ||
+            (className == "OpenLayers.Geometry.MultiPoint") ||
+            (className == "OpenLayers.Geometry.MultiLineString") ||
+            (className == "OpenLayers.Geometry.MultiPolygon")) {
+            for (var i = 0; i < geometry.components.length; i++) {
+                this.drawGeometry(geometry.components[i], style);
+            }
+            return;
+        }
+        switch (geometry.CLASS_NAME) {
+            case "OpenLayers.Geometry.Point":
+                this.drawPoint(geometry, style);
+                break;
+            case "OpenLayers.Geometry.LineString":
+                this.drawLineString(geometry, style);
+                break;
+            case "OpenLayers.Geometry.LinearRing":
+                this.drawLinearRing(geometry, style);
+                break;
+            case "OpenLayers.Geometry.Polygon":
+                this.drawPolygon(geometry, style);
+                break;
+            default:
+                break;
+        }
+    },
+
+    /**
+     * Method: drawExternalGraphic
+     * Called to draw External graphics. 
+     * 
+     * Parameters: 
+     * geometry - {<OpenLayers.Geometry>}
+     * style    - {Object}
+     */ 
+    drawExternalGraphic: function(pt, style) {
+       var img = new Image();
+       
+       if(style.graphicTitle) {
+           img.title=style.graphicTitle;           
+       }
+
+       var width = style.graphicWidth || style.graphicHeight;
+       var height = style.graphicHeight || style.graphicWidth;
+       width = width ? width : style.pointRadius*2;
+       height = height ? height : style.pointRadius*2;
+       var xOffset = (style.graphicXOffset != undefined) ?
+           style.graphicXOffset : -(0.5 * width);
+       var yOffset = (style.graphicYOffset != undefined) ?
+           style.graphicYOffset : -(0.5 * height);
+       
+       var context = { img: img, 
+                       x: (pt[0]+xOffset), 
+                       y: (pt[1]+yOffset), 
+                       width: width, 
+                       height: height, 
+                       opacity: style.graphicOpacity || style.fillOpacity,
+                       canvas: this.canvas };
+
+       img.onload = OpenLayers.Function.bind( function() {
+           this.canvas.globalAlpha = this.opacity;
+           this.canvas.drawImage(this.img, this.x, 
+                                 this.y, this.width, this.height);
+       }, context);
+       img.src = style.externalGraphic;
+    },
+
+    /**
+     * Method: setCanvasStyle
+     * Prepare the canvas for drawing by setting various global settings.
+     *
+     * Parameters:
+     * type - {String} one of 'stroke', 'fill', or 'reset'
+     * style - {Object} Symbolizer hash
+     */
+    setCanvasStyle: function(type, style) {
+        if (type == "fill") {     
+            this.canvas.globalAlpha = style['fillOpacity'];
+            this.canvas.fillStyle = style['fillColor'];
+        } else if (type == "stroke") {  
+            this.canvas.globalAlpha = style['strokeOpacity'];
+            this.canvas.strokeStyle = style['strokeColor'];
+            this.canvas.lineWidth = style['strokeWidth'];
+        } else {
+            this.canvas.globalAlpha = 0;
+            this.canvas.lineWidth = 1;
+        }
+    },
+
+    /**
+     * Method: drawPoint
+     * This method is only called by the renderer itself.
+     * 
+     * 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 {
+                if(style.fill !== false) {
+                    this.setCanvasStyle("fill", style);
+                    this.canvas.beginPath();
+                    this.canvas.arc(pt[0], pt[1], style.pointRadius, 0, Math.PI*2, true);
+                    this.canvas.fill();
+                }
+                
+                if(style.stroke !== false) {
+                    this.setCanvasStyle("stroke", style);
+                    this.canvas.beginPath();
+                    this.canvas.arc(pt[0], pt[1], style.pointRadius, 0, Math.PI*2, true);
+                    this.canvas.stroke();
+                    this.setCanvasStyle("reset");
+                }
+            }
+        }
+    },
+
+    /**
+     * Method: drawLineString
+     * This method is only called by the renderer itself.
+     * 
+     * Parameters: 
+     * geometry - {<OpenLayers.Geometry>}
+     * style    - {Object}
+     */ 
+    drawLineString: function(geometry, style) {
+        if(style.stroke !== false) {
+            this.setCanvasStyle("stroke", style);
+            this.canvas.beginPath();
+            var start = this.getLocalXY(geometry.components[0]);
+            this.canvas.moveTo(start[0], start[1]);
+            for(var i = 1; i < geometry.components.length; i++) {
+                var pt = this.getLocalXY(geometry.components[i]);
+                this.canvas.lineTo(pt[0], pt[1]);
+            }
+            this.canvas.stroke();
+        }
+        this.setCanvasStyle("reset");
+    },    
+    
+    /**
+     * Method: drawLinearRing
+     * This method is only called by the renderer itself.
+     * 
+     * Parameters: 
+     * geometry - {<OpenLayers.Geometry>}
+     * style    - {Object}
+     */ 
+    drawLinearRing: function(geometry, style) {
+        if(style.fill !== false) {
+            this.setCanvasStyle("fill", style);
+            this.canvas.beginPath();
+            var start = this.getLocalXY(geometry.components[0]);
+            this.canvas.moveTo(start[0], start[1]);
+            for(var i = 1; i < geometry.components.length - 1 ; i++) {
+                var pt = this.getLocalXY(geometry.components[i]);
+                this.canvas.lineTo(pt[0], pt[1]);
+            }
+            this.canvas.fill();
+        }
+        
+        if(style.stroke !== false) {
+            this.setCanvasStyle("stroke", style);
+            this.canvas.beginPath();
+            var start = this.getLocalXY(geometry.components[0]);
+            this.canvas.moveTo(start[0], start[1]);
+            for(var i = 1; i < geometry.components.length; i++) {
+                var pt = this.getLocalXY(geometry.components[i]);
+                this.canvas.lineTo(pt[0], pt[1]);
+            }
+            this.canvas.stroke();
+        }
+        this.setCanvasStyle("reset");
+    },    
+    
+    /**
+     * Method: drawPolygon
+     * This method is only called by the renderer itself.
+     * 
+     * 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', 
+                fillColor: '#000000'}
+            ); // inner rings are 'empty'  
+        }
+    },
+    
+    /**
+     * Method: drawText
+     * This method is only called by the renderer itself.
+     *
+     * Parameters:
+     * location - {<OpenLayers.Point>}
+     * style    - {Object}
+     */
+    drawText: function(location, style) {
+        style = OpenLayers.Util.extend({
+            fontColor: "#000000",
+            labelAlign: "cm"
+        }, style);
+        var pt = this.getLocalXY(location);
+        
+        this.setCanvasStyle("reset");
+        this.canvas.fillStyle = style.fontColor;
+        this.canvas.globalAlpha = style.fontOpacity || 1.0;
+        var fontStyle = style.fontWeight + " " + style.fontSize + " " + style.fontFamily;
+        if (this.canvas.fillText) {
+            // HTML5
+            var labelAlign =
+                OpenLayers.Renderer.Canvas.LABEL_ALIGN[style.labelAlign[0]] ||
+                "center";
+            this.canvas.font = fontStyle;
+            this.canvas.textAlign = labelAlign;
+            this.canvas.fillText(style.label, pt[0], pt[1]);
+        } else if (this.canvas.mozDrawText) {
+            // Mozilla pre-Gecko1.9.1 (<FF3.1)
+            this.canvas.mozTextStyle = fontStyle;
+            // No built-in text alignment, so we measure and adjust the position
+            var len = this.canvas.mozMeasureText(style.label);
+            switch(style.labelAlign[0]) {
+                case "l":
+                    break;
+                case "r":
+                    pt[0] -= len;
+                    break;
+                case "c":
+                default:
+                    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]);
+        }
+        this.setCanvasStyle("reset");
+    },
+
+    /**
+     * Method: getLocalXY
+     * transform geographic xy into pixel xy
+     *
+     * Parameters: 
+     * point - {<OpenLayers.Geometry.Point>}
+     */
+    getLocalXY: function(point) {
+        var resolution = this.getResolution();
+        var extent = this.extent;
+        var x = (point.x / resolution + (-extent.left / resolution));
+        var y = ((extent.top / resolution) - point.y / resolution);
+        return [x, y];
+    },
+
+    /**
+     * Method: clear
+     * Clear all vectors from the renderer.
+     */    
+    clear: function() {
+        this.canvas.clearRect(0, 0, this.root.width, this.root.height);
+        this.features = {};
+    },
+
+    /**
+     * Method: getFeatureIdFromEvent
+     * Returns a feature id from an event on the renderer.  
+     * 
+     * Parameters:
+     * evt - {<OpenLayers.Event>} 
+     *
+     * Returns:
+     * {String} A feature id or null.
+     */
+    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, 
+                                           loc.lat + resolution * 5);
+        var geom = bounds.toGeometry();
+        for (var feat in this.features) {
+            if (!this.features.hasOwnProperty(feat)) { continue; }
+            if (this.features[feat][0].geometry.intersects(geom)) {
+                return feat;
+            }
+        }   
+        return null;
+    },
+    
+    /**
+     * 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>)} 
+     */
+    eraseFeatures: function(features) {
+        if(!(features instanceof Array)) {
+            features = [features];
+        }
+        for(var i=0; i<features.length; ++i) {
+            delete this.features[features[i].id];
+        }
+        this.redraw();
+    },
+
+    /**
+     * Method: redraw
+     * The real 'meat' of the function: any time things have changed,
+     *     redraw() can be called to loop over all the data and (you guessed
+     *     it) redraw it.  Unlike Elements-based Renderers, we can't interact
+     *     with things once they're drawn, to remove them, for example, so
+     *     instead we have to just clear everything and draw from scratch.
+     */
+    redraw: function() {
+        if (!this.locked) {
+            this.canvas.clearRect(0, 0, this.root.width, this.root.height);
+            var labelMap = [];
+            var feature, style;
+            for (var id in this.features) {
+                if (!this.features.hasOwnProperty(id)) { continue; }
+                feature = this.features[id][0];
+                style = this.features[id][1];
+                if (!feature.geometry) { continue; }
+                this.drawGeometry(feature.geometry, style);
+                if(style.label) {
+                    labelMap.push([feature, style]);
+                }
+            }
+            var item;
+            for (var i=0, len=labelMap.length; i<len; ++i) {
+                item = labelMap[i];
+                this.drawText(item[0].geometry.getCentroid(), item[1]);
+            }
+        }    
+    },
+
+    CLASS_NAME: "OpenLayers.Renderer.Canvas"
+});
+
+/**
+ * Constant: OpenLayers.Renderer.Canvas.LABEL_ALIGN
+ * {Object}
+ */
+OpenLayers.Renderer.Canvas.LABEL_ALIGN = {
+    "l": "left",
+    "r": "right"
+};
diff --git a/lib/OpenLayers/Renderer/Elements.js b/lib/OpenLayers/Renderer/Elements.js
new file mode 100644
index 0000000..4fc0a3d
--- /dev/null
+++ b/lib/OpenLayers/Renderer/Elements.js
@@ -0,0 +1,1010 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Renderer.js
+ */
+
+/**
+ * Class: OpenLayers.ElementsIndexer
+ * This class takes care of figuring out which order elements should be
+ *     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, 
+    
+    /**
+     * 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 
+     *     value O(1).
+     */
+    indices: null,
+    
+    /**
+     * Property: compare
+     * {Function} This is the function used to determine placement of
+     *     of a new node within the indexer. If null, this defaults to to
+     *     the Z_ORDER_DRAWING_ORDER comparison method.
+     */
+    compare: null,
+    
+    /**
+     * APIMethod: initialize
+     * Create a new indexer with 
+     * 
+     * Parameters:
+     * yOrdering - {Boolean} Whether to use y-ordering.
+     */
+    initialize: function(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)). 
+     * 
+     * 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.
+     */
+    insert: function(newNode) {
+        // If the node is known to the indexer, remove it so we can
+        // recalculate where it should go.
+        if (this.exists(newNode)) {
+            this.remove(newNode);
+        }
+        
+        var nodeId = newNode.id;
+        
+        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);
+    },
+    
+    /**
+     * APIMethod: remove
+     * 
+     * Parameters:
+     * node - {DOMElement} The node to be removed.
+     */
+    remove: function(node) {
+        var nodeId = node.id;
+        var arrayIndex = OpenLayers.Util.indexOf(this.order, nodeId);
+        if (arrayIndex >= 0) {
+            // Remove it from the order array, as well as deleting the node
+            // 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 
+            // order array.
+            if (this.order.length > 0) {
+                var lastId = this.order[this.order.length - 1];
+                this.maxZIndex = this.indices[lastId];
+            } else {
+                this.maxZIndex = 0;
+            }
+        }
+    },
+    
+    /**
+     * APIMethod: clear
+     */
+    clear: function() {
+        this.order = [];
+        this.indices = {};
+        this.maxZIndex = 0;
+    },
+    
+    /**
+     * APIMethod: exists
+     *
+     * Parameters:
+     * node- {DOMElement} The node to test for existence.
+     *
+     * Returns:
+     * {Boolean} Whether or not the node exists in the indexer?
+     */
+    exists: function(node) {
+        return (this.indices[node.id] != null);
+    },
+
+    /**
+     * 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 
+     *     data itself).
+     */
+    getZIndex: function(node) {
+        return node._style.graphicZIndex;  
+    },
+    
+    /**
+     * Method: determineZIndex
+     * 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} 
+     */
+    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
+        // over all indexing methods, we'll create a new z-index that's
+        // greater than any currently in the indexer.
+        if (zIndex == null) {
+            zIndex = this.maxZIndex;
+            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;
+        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;
+        } 
+    },
+    
+    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 
+ *     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}
+     */
+    Z_ORDER: function(indexer, newNode, nextNode) {
+        var newZIndex = indexer.getZIndex(newNode);
+
+        var returnVal = 0;
+        if (nextNode) {
+            var nextZIndex = indexer.getZIndex(nextNode);
+            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 
+     *     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, 
+            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  
+     *     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, 
+            nextNode
+        );
+        
+        if (nextNode && returnVal === 0) {            
+            var result = nextNode._boundsBottom - newNode._boundsBottom;
+            returnVal = (result === 0) ? 1 : result;
+        }
+        
+        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 
+ *  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 
+ *  element-based renderer. The details of creating each node and drawing the
+ *  paths are of course different, but the machinery is the same. 
+ * 
+ * Inherits:
+ *  - <OpenLayers.Renderer>
+ */
+OpenLayers.Renderer.Elements = OpenLayers.Class(OpenLayers.Renderer, {
+
+    /**
+     * Property: rendererRoot
+     * {DOMElement}
+     */
+    rendererRoot: null,
+    
+    /**
+     * Property: root
+     * {DOMElement}
+     */
+    root: null,
+    
+    /**
+     * Property: vectorRoot
+     * {DOMElement}
+     */
+    vectorRoot: null,
+
+    /**
+     * Property: textRoot
+     * {DOMElement}
+     */
+    textRoot: null,
+
+    /**
+     * Property: xmlns
+     * {String}
+     */    
+    xmlns: null,
+    
+    /**
+     * Property: Indexer
+     * {<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, 
+    
+    /**
+     * Constant: BACKGROUND_ID_SUFFIX
+     * {String}
+     */
+    BACKGROUND_ID_SUFFIX: "_background",
+    
+    /**
+     * Constant: BACKGROUND_ID_SUFFIX
+     * {String}
+     */
+    LABEL_ID_SUFFIX: "_label",
+    
+    /**
+     * Constructor: OpenLayers.Renderer.Elements
+     * 
+     * Parameters:
+     * containerID - {String}
+     * options - {Object} options for this renderer. Supported options are:
+     *     * yOrdering - {Boolean} Whether to use y-ordering
+     *     * zIndexing - {Boolean} Whether to use z-indexing. Will be ignored
+     *         if yOrdering is set to true.
+     */
+    initialize: function(containerID, options) {
+        OpenLayers.Renderer.prototype.initialize.apply(this, arguments);
+
+        this.rendererRoot = this.createRenderRoot();
+        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.rendererRoot = null;
+        this.root = null;
+        this.xmlns = null;
+
+        OpenLayers.Renderer.prototype.destroy.apply(this, arguments);
+    },
+    
+    /**
+     * Method: clear
+     * Remove all the elements from the root
+     */    
+    clear: function() {
+        var child;
+        var root = this.vectorRoot;
+        if (root) {
+            while (child = root.firstChild) {
+                root.removeChild(child);
+            }
+        }
+        root = this.textRoot;
+        if (root) {
+            while (child = root.firstChild) {
+                root.removeChild(child);
+            }
+        }
+        if (this.indexer) {
+            this.indexer.clear();
+        }
+    },
+
+    /** 
+     * 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.  
+     *  
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * style - {Object}
+     * 
+     * Returns:
+     * {String} The corresponding node type for the specified geometry
+     */
+    getNodeType: function(geometry, style) { },
+
+    /** 
+     * 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.
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * style - {Object}
+     * featureId - {String}
+     * 
+     * Returns:
+     * {Boolean} true if the geometry has been drawn completely; null if
+     *     incomplete; false otherwise
+     */
+    drawGeometry: function(geometry, style, featureId) {
+        var className = geometry.CLASS_NAME;
+        var rendered = true;
+        if ((className == "OpenLayers.Geometry.Collection") ||
+            (className == "OpenLayers.Geometry.MultiPoint") ||
+            (className == "OpenLayers.Geometry.MultiLineString") ||
+            (className == "OpenLayers.Geometry.MultiPolygon")) {
+            for (var i = 0, len=geometry.components.length; i<len; i++) {
+                rendered = this.drawGeometry(
+                    geometry.components[i], style, featureId) && rendered;
+            }
+            return rendered;
+        };
+
+        rendered = false;
+        if (style.display != "none") {
+            if (style.backgroundGraphic) {
+                this.redrawBackgroundNode(geometry.id, geometry, style,
+                    featureId);
+            }
+            rendered = this.redrawNode(geometry.id, geometry, style,
+                featureId);
+        }
+        if (rendered == false) {
+            var node = document.getElementById(geometry.id);
+            if (node) {
+                if (node._style.backgroundGraphic) {
+                    node.parentNode.removeChild(document.getElementById(
+                        geometry.id + this.BACKGROUND_ID_SUFFIX));
+                }
+                node.parentNode.removeChild(node);
+            }
+        }
+        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
+     */
+    redrawNode: function(id, geometry, style, featureId) {
+        style = this.applyDefaultSymbolizer(style);
+        // 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._boundsBottom = geometry.getBounds().bottom;
+        node._geometryClass = geometry.CLASS_NAME;
+        node._style = style;
+
+        var drawResult = this.drawGeometryNode(node, geometry, style);
+        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
+        // likely where it would be.
+        if (this.indexer) {
+            var insert = this.indexer.insert(node);
+            if (insert) {
+                this.vectorRoot.insertBefore(node, insert);
+            } else {
+                this.vectorRoot.appendChild(node);
+            }
+        } 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){ 
+                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 
+     *     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;
+        backgroundStyle.graphicYOffset = backgroundStyle.backgroundYOffset;
+        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, 
+            null
+        );
+    },
+
+    /**
+     * Method: drawGeometryNode
+     * Given a node, draw a geometry on the specified layer.
+     *     node and geometry are required arguments, style is optional.
+     *     This method is only called by the render itself.
+     *
+     * Parameters:
+     * 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
+     *     could be drawn)
+     */
+    drawGeometryNode: function(node, geometry, style) {
+        style = style || node._style;
+
+        var options = {
+            'isFilled': style.fill === undefined ?
+                true :
+                style.fill,
+            'isStroked': style.stroke === undefined ?
+                !!style.strokeWidth :
+                style.stroke
+        };
+        var drawn;
+        switch (geometry.CLASS_NAME) {
+            case "OpenLayers.Geometry.Point":
+                if(style.graphic === false) {
+                    options.isFilled = false;
+                    options.isStroked = false;
+                }
+                drawn = this.drawPoint(node, geometry);
+                break;
+            case "OpenLayers.Geometry.LineString":
+                options.isFilled = false;
+                drawn = this.drawLineString(node, geometry);
+                break;
+            case "OpenLayers.Geometry.LinearRing":
+                drawn = this.drawLinearRing(node, geometry);
+                break;
+            case "OpenLayers.Geometry.Polygon":
+                drawn = this.drawPolygon(node, geometry);
+                break;
+            case "OpenLayers.Geometry.Surface":
+                drawn = this.drawSurface(node, geometry);
+                break;
+            case "OpenLayers.Geometry.Rectangle":
+                drawn = this.drawRectangle(node, geometry);
+                break;
+            default:
+                break;
+        }
+
+        node._options = options; 
+
+        //set style
+        //TBD simplify this
+        if (drawn != false) {
+            return {
+                node: this.setStyle(node, style, options, geometry),
+                complete: drawn
+            };
+        } else {
+            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. 
+     *     Should be implemented by subclasses.
+     *     This method is only called by the renderer itself.
+     * 
+     * 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. 
+     *     Should be implemented by subclasses.
+     *     This method is only called by the renderer itself.
+     * 
+     * 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. 
+     *     Should be implemented by subclasses.
+     *     This method is only called by the renderer itself.
+     * 
+     * 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. 
+     *    Should be implemented by subclasses.
+     *    This method is only called by the renderer itself.
+     * 
+     * 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. 
+     *     Should be implemented by subclasses.
+     *     This method is only called by the renderer itself.
+     * 
+     * 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. 
+     *     Should be implemented by subclasses.
+     *     This method is only called by the renderer itself.
+     * 
+     * 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. 
+     *     Should be implemented by subclasses.
+     *     This method is only called by the renderer itself.
+     * 
+     * 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}
+     */
+    removeText: function(featureId) {
+        var label = document.getElementById(featureId + this.LABEL_ID_SUFFIX);
+        if (label) {
+            this.textRoot.removeChild(label);
+        }
+    },
+
+    /**
+     * Method: getFeatureIdFromEvent
+     * 
+     * Parameters:
+     * evt - {Object} An <OpenLayers.Event> object
+     *
+     * Returns:
+     * {<OpenLayers.Geometry>} A geometry from an event that 
+     *     happened on a layer.
+     */
+    getFeatureIdFromEvent: function(evt) {
+        var target = evt.target;
+        var useElement = target && target.correspondingUseElement;
+        var node = useElement ? useElement : (target || evt.srcElement);
+        var featureId = node._featureId;
+        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 
+     *     node with the geometry.id, destroy its geometry, and remove it from
+     *     the DOM.
+     * 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * featureId - {String}
+     */
+    eraseGeometry: function(geometry, featureId) {
+        if ((geometry.CLASS_NAME == "OpenLayers.Geometry.MultiPoint") ||
+            (geometry.CLASS_NAME == "OpenLayers.Geometry.MultiLineString") ||
+            (geometry.CLASS_NAME == "OpenLayers.Geometry.MultiPolygon") ||
+            (geometry.CLASS_NAME == "OpenLayers.Geometry.Collection")) {
+            for (var i=0, len=geometry.components.length; i<len; i++) {
+                this.eraseGeometry(geometry.components[i], featureId);
+            }
+        } else {    
+            var element = OpenLayers.Util.getElement(geometry.id);
+            if (element && element.parentNode) {
+                if (element.geometry) {
+                    element.geometry.destroy();
+                    element.geometry = null;
+                }
+                element.parentNode.removeChild(element);
+
+                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);
+                    if (bElem && bElem.parentNode) {
+                        // No need to destroy the geometry since the element and the background
+                        // node share the same geometry.
+                        bElem.parentNode.removeChild(bElem);
+                    }
+                }
+            }
+        }
+    },
+
+    /** 
+     * 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.
+     */
+    nodeFactory: function(id, type) {
+        var node = OpenLayers.Util.getElement(id);
+        if (node) {
+            if (!this.nodeTypeCompare(node, type)) {
+                node.parentNode.removeChild(node);
+                node = this.nodeFactory(id, type);
+            }
+        } else {
+            node = this.createNode(type, id);
+        }
+        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.
+     */
+    createNode: function(type, id) {},
+
+    /**
+     * Method: moveRoot
+     * moves this renderer's root to a different renderer.
+     * 
+     * Parameters:
+     * renderer - {<OpenLayers.Renderer>} target renderer for the moved root
+     */
+    moveRoot: function(renderer) {
+        var root = this.root;
+        if(renderer.root.parentNode == this.rendererRoot) {
+            root = renderer.root;
+        }
+        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
+     */
+    isComplexSymbol: function(graphicName) {
+        return (graphicName != "circle") && !!graphicName;
+    },
+
+    CLASS_NAME: "OpenLayers.Renderer.Elements"
+});
+
+
+/**
+ * Constant: OpenLayers.Renderer.symbol
+ * Coordinate arrays for well known (named) symbols.
+ */
+OpenLayers.Renderer.symbol = {
+    "star": [350,75, 379,161, 469,161, 397,215, 423,301, 350,250, 277,301,
+            303,215, 231,161, 321,161, 350,75],
+    "cross": [4,0, 6,0, 6,4, 10,4, 10,6, 6,6, 6,10, 4,10, 4,6, 0,6, 0,4, 4,4,
+            4,0],
+    "x": [0,0, 25,0, 50,35, 75,0, 100,0, 65,50, 100,100, 75,100, 50,65, 25,100, 0,100, 35,50, 0,0],
+    "square": [0,0, 0,1, 1,1, 1,0, 0,0],
+    "triangle": [0,10, 10,10, 5,0, 0,10]
+};
diff --git a/lib/OpenLayers/Renderer/SVG.js b/lib/OpenLayers/Renderer/SVG.js
new file mode 100644
index 0000000..e704e03
--- /dev/null
+++ b/lib/OpenLayers/Renderer/SVG.js
@@ -0,0 +1,995 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Renderer/Elements.js
+ */
+
+/**
+ * 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}
+     */
+    xlinkns: "http://www.w3.org/1999/xlink",
+
+    /**
+     * 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 
+     *           works around it.
+     */
+    MAX_PIXEL: 15000,
+
+    /**
+     * Property: translationParameters
+     * {Object} Hash with "x" and "y" properties
+     */
+    translationParameters: null,
+    
+    /**
+     * Property: symbolMetrics
+     * {Object} Cache for symbol metrics according to their svg coordinate
+     *     space. This is an object keyed by the symbol's id, and values are
+     *     an array of [width, centerX, centerY].
+     */
+    symbolMetrics: null,
+    
+    /**
+     * Property: isGecko
+     * {Boolean}
+     */
+    isGecko: null,
+
+    /**
+     * Property: supportUse
+     * {Boolean} true if defs/use is supported - known to not work as expected
+     * at least in some applewebkit/5* builds.
+     * See https://bugs.webkit.org/show_bug.cgi?id=33322
+     */
+    supportUse: null,
+
+    /**
+     * Constructor: OpenLayers.Renderer.SVG
+     * 
+     * Parameters:
+     * containerID - {String}
+     */
+    initialize: function(containerID) {
+        if (!this.supported()) { 
+            return; 
+        }
+        OpenLayers.Renderer.Elements.prototype.initialize.apply(this, 
+                                                                arguments);
+        this.translationParameters = {x: 0, y: 0};
+        this.supportUse = (navigator.userAgent.toLowerCase().indexOf("applewebkit/5") == -1);
+        this.isGecko = (navigator.userAgent.toLowerCase().indexOf("gecko/") != -1);
+        
+        this.symbolMetrics = {};
+    },
+
+    /**
+     * APIMethod: destroy
+     */
+    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") || 
+            document.implementation.hasFeature(svgFeature + "BasicStructure", "1.1") ));
+    },    
+
+    /**
+     * Method: inValidRange
+     * See #669 for more information
+     *
+     * Parameters:
+     * x      - {Integer}
+     * 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  
+     *           valid range.
+     */ 
+    inValidRange: function(x, y, xyOnly) {
+        var left = x + (xyOnly ? 0 : this.translationParameters.x);
+        var top = y + (xyOnly ? 0 : this.translationParameters.y);
+        return (left >= -this.MAX_PIXEL && left <= this.MAX_PIXEL &&
+                top >= -this.MAX_PIXEL && top <= this.MAX_PIXEL);
+    },
+
+    /**
+     * 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, 
+                                                               arguments);
+        
+        var resolution = this.getResolution();
+        var left = -extent.left / resolution;
+        var top = extent.top / resolution;
+
+        // If the resolution has changed, start over changing the corner, because
+        // the features will redraw.
+        if (resolutionChanged) {
+            this.left = left;
+            this.top = top;
+            // Set the viewbox
+            var extentString = "0 0 " + this.size.w + " " + this.size.h;
+
+            this.rendererRoot.setAttributeNS(null, "viewBox", extentString);
+            this.translate(0, 0);
+            return true;
+        } else {
+            var inRange = this.translate(left - this.left, top - this.top);
+            if (!inRange) {
+                // recenter the coordinate system
+                this.setExtent(extent, true);
+            }
+            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.
+     */
+    translate: function(x, y) {
+        if (!this.inValidRange(x, y, true)) {
+            return false;
+        } else {
+            var transformString = "";
+            if (x || y) {
+                transformString = "translate(" + x + "," + y + ")";
+            }
+            this.root.setAttributeNS(null, "transform", transformString);
+            this.translationParameters = {x: x, y: y};
+            return true;
+        }
+    },
+
+    /**
+     * 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 
+     * 
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * style - {Object}
+     * 
+     * Returns:
+     * {String} The corresponding node type for the specified geometry
+     */
+    getNodeType: function(geometry, style) {
+        var nodeType = null;
+        switch (geometry.CLASS_NAME) {
+            case "OpenLayers.Geometry.Point":
+                if (style.externalGraphic) {
+                    nodeType = "image";
+                } else if (this.isComplexSymbol(style.graphicName)) {
+                    nodeType = this.supportUse === false ? "svg" : "use";
+                } else {
+                    nodeType = "circle";
+                }
+                break;
+            case "OpenLayers.Geometry.Rectangle":
+                nodeType = "rect";
+                break;
+            case "OpenLayers.Geometry.LineString":
+                nodeType = "polyline";
+                break;
+            case "OpenLayers.Geometry.LinearRing":
+                nodeType = "polygon";
+                break;
+            case "OpenLayers.Geometry.Polygon":
+            case "OpenLayers.Geometry.Curve":
+            case "OpenLayers.Geometry.Surface":
+                nodeType = "path";
+                break;
+            default:
+                break;
+        }
+        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 
+     *                              'isFilled' {Boolean} and
+     *                              'isStroked' {Boolean}
+     */
+    setStyle: function(node, style, options) {
+        style = style  || node._style;
+        options = options || node._options;
+        var r = parseFloat(node.getAttributeNS(null, "r"));
+        var widthFactor = 1;
+        var pos;
+        if (node._geometryClass == "OpenLayers.Geometry.Point" && r) {
+            node.style.visibility = "";
+            if (style.graphic === false) {
+                node.style.visibility = "hidden";
+            } else if (style.externalGraphic) {
+                pos = this.getPosition(node);
+                
+                if (style.graphicTitle) {
+                    node.setAttributeNS(null, "title", style.graphicTitle);
+                }
+                if (style.graphicWidth && style.graphicHeight) {
+                  node.setAttributeNS(null, "preserveAspectRatio", "none");
+                }
+                var width = style.graphicWidth || style.graphicHeight;
+                var height = style.graphicHeight || style.graphicWidth;
+                width = width ? width : style.pointRadius*2;
+                height = height ? height : style.pointRadius*2;
+                var xOffset = (style.graphicXOffset != undefined) ?
+                    style.graphicXOffset : -(0.5 * width);
+                var yOffset = (style.graphicYOffset != undefined) ?
+                    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);
+                node.setAttributeNS(null, "height", height);
+                node.setAttributeNS(this.xlinkns, "href", style.externalGraphic);
+                node.setAttributeNS(null, "style", "opacity: "+opacity);
+            } else if (this.isComplexSymbol(style.graphicName)) {
+                // the symbol viewBox is three times as large as the symbol
+                var offset = style.pointRadius * 3;
+                var size = offset * 2;
+                var id = this.importSymbol(style.graphicName);
+                pos = this.getPosition(node);
+                widthFactor = this.symbolMetrics[id][0] * 3 / size;
+                
+                // remove the node from the dom before we modify it. This
+                // prevents various rendering issues in Safari and FF
+                var parent = node.parentNode;
+                var nextSibling = node.nextSibling;
+                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):
+                    // copy the symbol instead of referencing it
+                    var src = document.getElementById(id);
+                    node.firstChild && node.removeChild(node.firstChild);
+                    node.appendChild(src.firstChild.cloneNode(true));
+                    node.setAttributeNS(null, "viewBox", src.getAttributeNS(null, "viewBox"));
+                } else {
+                    node.setAttributeNS(this.xlinkns, "href", "#" + id);
+                }
+                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) {
+                    parent.insertBefore(node, nextSibling);
+                } else if(parent) {
+                    parent.appendChild(node);
+                }
+            } else {
+                node.setAttributeNS(null, "r", style.pointRadius);
+            }
+
+            var rotation = style.rotation;
+            if ((rotation !== undefined || node._rotation !== undefined) && pos) {
+                node._rotation = rotation;
+                rotation |= 0;
+                if(node.nodeName !== "svg") {
+                    node.setAttributeNS(null, "transform",
+                        "rotate(" + rotation + " " + pos.x + " " +
+                        pos.y + ")");
+                } else {
+                     var metrics = this.symbolMetrics[id];
+                     node.firstChild.setAttributeNS(null, "transform",
+                     "rotate(" + style.rotation + " " + metrics[1] +
+                         " " +  metrics[2] + ")");
+                }
+            }
+        }
+        
+        if (options.isFilled) {
+            node.setAttributeNS(null, "fill", style.fillColor);
+            node.setAttributeNS(null, "fill-opacity", style.fillOpacity);
+        } else {
+            node.setAttributeNS(null, "fill", "none");
+        }
+
+        if (options.isStroked) {
+            node.setAttributeNS(null, "stroke", style.strokeColor);
+            node.setAttributeNS(null, "stroke-opacity", style.strokeOpacity);
+            node.setAttributeNS(null, "stroke-width", style.strokeWidth * widthFactor);
+            node.setAttributeNS(null, "stroke-linecap", style.strokeLinecap || "round");
+            // Hard-coded linejoin for now, to make it look the same as in VML.
+            // There is no strokeLinejoin property yet for symbolizers.
+            node.setAttributeNS(null, "stroke-linejoin", "round");
+            style.strokeDashstyle && node.setAttributeNS(null,
+                "stroke-dasharray", this.dashStyle(style, widthFactor));
+        } 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
+     */
+    dashStyle: function(style, widthFactor) {
+        var w = style.strokeWidth * widthFactor;
+        var str = style.strokeDashstyle;
+        switch (str) {
+            case 'solid':
+                return 'none';
+            case 'dot':
+                return [1, 4 * w].join();
+            case 'dash':
+                return [4 * w, 4 * w].join();
+            case 'dashdot':
+                return [4 * w, 4 * w, 1, 4 * w].join();
+            case 'longdash':
+                return [8 * w, 4 * w].join();
+            case 'longdashdot':
+                return [8 * w, 4 * w, 1, 4 * w].join();
+            default:
+                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
+     */
+    createNode: function(type, id) {
+        var node = document.createElementNS(this.xmlns, type);
+        if (id) {
+            node.setAttributeNS(null, "id", id);
+        }
+        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
+     */
+    createRenderRoot: function() {
+        return this.nodeFactory(this.container.id + "_svgRoot", "svg");
+    },
+
+    /**
+     * Method: createRoot
+     * 
+     * Parameter:
+     * suffix - {String} suffix to append to the id
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    createRoot: function(suffix) {
+        return this.nodeFactory(this.container.id + suffix, "g");
+    },
+
+    /**
+     * Method: createDefs
+     *
+     * Returns:
+     * {DOMElement} The element to which we'll add the symbol definitions
+     */
+    createDefs: function() {
+        var defs = this.nodeFactory(this.container.id + "_defs", "defs");
+        this.rendererRoot.appendChild(defs);
+        return defs;
+    },
+
+    /**************************************
+     *                                    *
+     *     GEOMETRY DRAWING FUNCTIONS     *
+     *                                    *
+     **************************************/
+
+    /**
+     * Method: drawPoint
+     * This method is only called by the renderer itself.
+     * 
+     * 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);
+    },
+
+    /**
+     * Method: drawCircle
+     * This method is only called by the renderer itself.
+     * 
+     * Parameters: 
+     * node - {DOMElement}
+     * geometry - {<OpenLayers.Geometry>}
+     * radius - {Float}
+     * 
+     * Returns:
+     * {DOMElement} or false if the renderer could not draw the circle
+     */
+    drawCircle: function(node, geometry, radius) {
+        var resolution = this.getResolution();
+        var x = (geometry.x / resolution + this.left);
+        var y = (this.top - geometry.y / resolution);
+
+        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: 
+     * 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);  
+        } else {
+            return false;
+        }
+    },
+    
+    /**
+     * Method: drawLinearRing
+     * This method is only called by the renderer itself.
+     * 
+     * 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);  
+        } else {
+            return false;
+        }
+    },
+    
+    /**
+     * Method: drawPolygon
+     * This method is only called by the renderer itself.
+     * 
+     * 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;
+        var complete = true;
+        var linearRingResult, path;
+        for (var j=0, len=geometry.components.length; j<len; j++) {
+            d += " M";
+            linearRingResult = this.getComponentsString(
+                geometry.components[j].components, " ");
+            path = linearRingResult.path;
+            if (path) {
+                d += " " + path;
+                complete = linearRingResult.complete && complete;
+            } else {
+                draw = false;
+            }
+        }
+        d += " z";
+        if (draw) {
+            node.setAttributeNS(null, "d", d);
+            node.setAttributeNS(null, "fill-rule", "evenodd");
+            return complete ? node : null;
+        } else {
+            return false;
+        }    
+    },
+    
+    /**
+     * Method: drawRectangle
+     * This method is only called by the renderer itself.
+     * 
+     * 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)) { 
+            node.setAttributeNS(null, "x", x);
+            node.setAttributeNS(null, "y", y);
+            node.setAttributeNS(null, "width", geometry.width / resolution);
+            node.setAttributeNS(null, "height", geometry.height / resolution);
+            return node;
+        } else {
+            return false;
+        }
+    },
+    
+    /**
+     * Method: drawSurface
+     * This method is only called by the renderer itself.
+     * 
+     * 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
+        var d = null;
+        var draw = true;
+        for (var i=0, len=geometry.components.length; i<len; i++) {
+            if ((i%3) == 0 && (i/3) == 0) {
+                var component = this.getShortString(geometry.components[i]);
+                if (!component) { draw = false; }
+                d = "M " + component;
+            } else if ((i%3) == 1) {
+                var component = this.getShortString(geometry.components[i]);
+                if (!component) { draw = false; }
+                d += " C " + component;
+            } else {
+                var component = this.getShortString(geometry.components[i]);
+                if (!component) { draw = false; }
+                d += " " + component;
+            }
+        }
+        d += " Z";
+        if (draw) {
+            node.setAttributeNS(null, "d", d);
+            return node;
+        } else {
+            return false;
+        }    
+    },
+    
+    /**
+     * Method: drawText
+     * This method is only called by the renderer itself.
+     * 
+     * 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);
+        }
+        if (style.fontOpacity) {
+            label.setAttributeNS(null, "opacity", style.fontOpacity);
+        }
+        if (style.fontFamily) {
+            label.setAttributeNS(null, "font-family", style.fontFamily);
+        }
+        if (style.fontSize) {
+            label.setAttributeNS(null, "font-size", style.fontSize);
+        }
+        if (style.fontWeight) {
+            label.setAttributeNS(null, "font-weight", style.fontWeight);
+        }
+        if(style.labelSelect === true) {
+            label.setAttributeNS(null, "pointer-events", "visible");
+            label._featureId = featureId;
+            tspan._featureId = featureId;
+            tspan._geometry = location;
+            tspan._geometryClass = location.CLASS_NAME;
+        } else {
+            label.setAttributeNS(null, "pointer-events", "none");
+        }
+        var align = style.labelAlign || "cm";
+        label.setAttributeNS(null, "text-anchor",
+            OpenLayers.Renderer.SVG.LABEL_ALIGN[align[0]] || "middle");
+
+        if (this.isGecko) {
+            label.setAttributeNS(null, "dominant-baseline",
+                OpenLayers.Renderer.SVG.LABEL_ALIGN[align[1]] || "central");
+        } else {
+            tspan.setAttributeNS(null, "baseline-shift",
+                OpenLayers.Renderer.SVG.LABEL_VSHIFT[align[1]] || "-35%");
+        }
+
+        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
+     *     draw all components)
+     */
+    getComponentsString: function(components, separator) {
+        var renderCmp = [];
+        var complete = true;
+        var len = components.length;
+        var strings = [];
+        var str, component;
+        for(var i=0; i<len; i++) {
+            component = components[i];
+            renderCmp.push(component);
+            str = this.getShortString(component);
+            if (str) {
+                strings.push(str);
+            } else {
+                // The current component is outside the valid range. Let's
+                // see if the previous or next component is inside the range.
+                // If so, add the coordinate of the intersection with the
+                // valid range bounds.
+                if (i > 0) {
+                    if (this.getShortString(components[i - 1])) {
+                        strings.push(this.clipLine(components[i],
+                            components[i-1]));
+                    }
+                }
+                if (i < len - 1) {
+                    if (this.getShortString(components[i + 1])) {
+                        strings.push(this.clipLine(components[i],
+                            components[i+1]));
+                    }
+                }
+                complete = false;
+            }
+        }
+
+        return {
+            path: strings.join(separator || ","),
+            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
+     * goodComponent - {<OpenLayers.Geometry.Point>)} original geometry of the
+     *     valid point
+     * Returns
+     * {String} the SVG coordinate pair of the clipped point (like
+     *     getShortString), or an empty string if both passed componets are at
+     *     the same point.
+     */
+    clipLine: function(badComponent, goodComponent) {
+        if (goodComponent.equals(badComponent)) {
+            return "";
+        }
+        var resolution = this.getResolution();
+        var maxX = this.MAX_PIXEL - this.translationParameters.x;
+        var maxY = this.MAX_PIXEL - this.translationParameters.y;
+        var x1 = goodComponent.x / resolution + this.left;
+        var y1 = this.top - goodComponent.y / resolution;
+        var x2 = badComponent.x / resolution + this.left;
+        var y2 = this.top - badComponent.y / resolution;
+        var k;
+        if (x2 < -maxX || x2 > maxX) {
+            k = (y2 - y1) / (x2 - x1);
+            x2 = x2 < 0 ? -maxX : maxX;
+            y2 = y1 + (x2 - x1) * k;
+        }
+        if (y2 < -maxY || y2 > maxY) {
+            k = (x2 - x1) / (y2 - y1);
+            y2 = y2 < 0 ? -maxY : maxY;
+            x2 = x1 + (y2 - y1) * k;
+        }
+        return x2 + "," + y2;
+    },
+
+    /** 
+     * Method: getShortString
+     * 
+     * Parameters:
+     * point - {<OpenLayers.Geometry.Point>}
+     * 
+     * Returns:
+     * {String} or false if point is outside the valid range
+     */
+    getShortString: function(point) {
+        var resolution = this.getResolution();
+        var x = (point.x / resolution + this.left);
+        var y = (this.top - point.y / resolution);
+
+        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
+     */
+    getPosition: function(node) {
+        return({
+            x: parseFloat(node.getAttributeNS(null, "cx")),
+            y: parseFloat(node.getAttributeNS(null, "cy"))
+        });
+    },
+
+    /**
+     * 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');
+        }
+
+        var symbolNode = this.nodeFactory(id, "symbol");
+        var node = this.nodeFactory(null, "polygon");
+        symbolNode.appendChild(node);
+        var symbolExtent = new OpenLayers.Bounds(
+                                    Number.MAX_VALUE, Number.MAX_VALUE, 0, 0);
+
+        var points = [];
+        var x,y;
+        for (var i=0; i<symbol.length; i=i+2) {
+            x = symbol[i];
+            y = symbol[i+1];
+            symbolExtent.left = Math.min(symbolExtent.left, x);
+            symbolExtent.bottom = Math.min(symbolExtent.bottom, y);
+            symbolExtent.right = Math.max(symbolExtent.right, x);
+            symbolExtent.top = Math.max(symbolExtent.top, y);
+            points.push(x, ",", y);
+        }
+        
+        node.setAttributeNS(null, "points", points.join(" "));
+        
+        var width = symbolExtent.getWidth();
+        var height = symbolExtent.getHeight();
+        // create a viewBox three times as large as the symbol itself,
+        // to allow for strokeWidth being displayed correctly at the corners.
+        var viewBox = [symbolExtent.left - width,
+                        symbolExtent.bottom - height, width * 3, height * 3];
+        symbolNode.setAttributeNS(null, "viewBox", viewBox.join(" "));
+        this.symbolMetrics[id] = [
+            Math.max(width, height),
+            symbolExtent.getCenterLonLat().lon,
+            symbolExtent.getCenterLonLat().lat
+        ];
+        
+        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 
+     *     happened on a layer.
+     */
+    getFeatureIdFromEvent: function(evt) {
+        var featureId = OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent.apply(this, arguments);
+        if(this.supportUse === false && !featureId) {
+            var target = evt.target;
+            featureId = target.parentNode && target != this.rendererRoot &&
+                target.parentNode._featureId;
+        }
+        return featureId;
+    },
+
+    CLASS_NAME: "OpenLayers.Renderer.SVG"
+});
+
+/**
+ * Constant: OpenLayers.Renderer.SVG.LABEL_ALIGN
+ * {Object}
+ */
+OpenLayers.Renderer.SVG.LABEL_ALIGN = {
+    "l": "start",
+    "r": "end",
+    "b": "bottom",
+    "t": "hanging"
+};
+
+/**
+ * Constant: OpenLayers.Renderer.SVG.LABEL_VSHIFT
+ * {Object}
+ */
+OpenLayers.Renderer.SVG.LABEL_VSHIFT = {
+    // according to
+    // http://www.w3.org/Graphics/SVG/Test/20061213/htmlObjectHarness/full-text-align-02-b.html
+    // a baseline-shift of -70% shifts the text exactly from the
+    // bottom to the top of the baseline, so -35% moves the text to
+    // the center of the baseline.
+    "t": "-70%",
+    "b": "0"    
+};
diff --git a/lib/OpenLayers/Renderer/VML.js b/lib/OpenLayers/Renderer/VML.js
new file mode 100644
index 0000000..a3c02e0
--- /dev/null
+++ b/lib/OpenLayers/Renderer/VML.js
@@ -0,0 +1,999 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Renderer/Elements.js
+ */
+
+/**
+ * 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 (num | 0) to truncate a 
+ * float value to an integer. This is done because it seems that VML doesn't 
+ * support float values.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Renderer.Elements>
+ */
+OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
+
+    /**
+     * Property: xmlns
+     * {String} XML Namespace URN
+     */
+    xmlns: "urn:schemas-microsoft-com:vml",
+    
+    /**
+     * Property: symbolCache
+     * {DOMElement} node holding symbols. This hash is keyed by symbol name,
+     *     and each value is a hash with a "path" and an "extent" property.
+     */
+    symbolCache: {},
+
+    /**
+     * Property: offset
+     * {Object} Hash with "x" and "y" properties
+     */
+    offset: null,
+    
+    /**
+     * Constructor: OpenLayers.Renderer.VML
+     * Create a new VML renderer.
+     *
+     * Parameters:
+     * containerID - {String} The id for the element that contains the renderer
+     */
+    initialize: function(containerID) {
+        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']; 
+            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, 
+                                                                arguments);
+    },
+
+    /**
+     * APIMethod: destroy
+     * Deconstruct the renderer.
+     */
+    destroy: function() {
+        OpenLayers.Renderer.Elements.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * APIMethod: supported
+     * Determine whether a browser supports this renderer.
+     *
+     * Returns:
+     * {Boolean} The browser supports the VML renderer
+     */
+    supported: function() {
+        return !!(document.namespaces);
+    },    
+
+    /**
+     * Method: setExtent
+     * Set the renderer's extent
+     *
+     * 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, 
+                                                               arguments);
+        var resolution = this.getResolution();
+    
+        var left = (extent.left/resolution) | 0;
+        var top = (extent.top/resolution - this.size.h) | 0;
+        if (resolutionChanged || !this.offset) {
+            this.offset = {x: left, y: top};
+            left = 0;
+            top = 0;
+        } else {
+            left = left - this.offset.x;
+            top = top - this.offset.y;
+        }
+
+        
+        var org = left + " " + top;
+        this.root.coordorigin = org;
+        var roots = [this.root, this.vectorRoot, this.textRoot];
+        var root;
+        for(var i=0, len=roots.length; i<len; ++i) {
+            root = roots[i];
+
+            var size = this.size.w + " " + this.size.h;
+            root.coordsize = size;
+            
+        }
+        // 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;
+    },
+
+
+    /**
+     * Method: setSize
+     * Set 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);
+        
+        // setting width and height on all roots to avoid flicker which we
+        // would get with 100% width and height on child roots
+        var roots = [
+            this.rendererRoot,
+            this.root,
+            this.vectorRoot,
+            this.textRoot
+        ];
+        var w = this.size.w + "px";
+        var h = this.size.h + "px";
+        var root;
+        for(var i=0, len=roots.length; i<len; ++i) {
+            root = roots[i];
+            root.style.width = w;
+            root.style.height = h;
+        }
+    },
+
+    /**
+     * Method: getNodeType
+     * Get the node type for a geometry and style
+     *
+     * Parameters:
+     * geometry - {<OpenLayers.Geometry>}
+     * style - {Object}
+     *
+     * Returns:
+     * {String} The corresponding node type for the specified geometry
+     */
+    getNodeType: function(geometry, style) {
+        var nodeType = null;
+        switch (geometry.CLASS_NAME) {
+            case "OpenLayers.Geometry.Point":
+                if (style.externalGraphic) {
+                    nodeType = "olv:rect";
+                } else if (this.isComplexSymbol(style.graphicName)) {
+                    nodeType = "olv:shape";
+                } else {
+                    nodeType = "olv:oval";
+                }
+                break;
+            case "OpenLayers.Geometry.Rectangle":
+                nodeType = "olv:rect";
+                break;
+            case "OpenLayers.Geometry.LineString":
+            case "OpenLayers.Geometry.LinearRing":
+            case "OpenLayers.Geometry.Polygon":
+            case "OpenLayers.Geometry.Curve":
+            case "OpenLayers.Geometry.Surface":
+                nodeType = "olv:shape";
+                break;
+            default:
+                break;
+        }
+        return nodeType;
+    },
+
+    /**
+     * Method: setStyle
+     * Use to set all the style attributes to a VML node.
+     *
+     * Parameters:
+     * node - {DOMElement} An VML element to decorate
+     * style - {Object}
+     * options - {Object} Currently supported options include 
+     *                              'isFilled' {Boolean} and
+     *                              'isStroked' {Boolean}
+     * geometry - {<OpenLayers.Geometry>}
+     */
+    setStyle: function(node, style, options, geometry) {
+        style = style  || node._style;
+        options = options || node._options;
+        var fillColor = style.fillColor;
+
+        if (node._geometryClass === "OpenLayers.Geometry.Point") {
+            if (style.externalGraphic) {
+                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;
+                height = height ? height : style.pointRadius*2;
+
+                var resolution = this.getResolution();
+                var xOffset = (style.graphicXOffset != undefined) ?
+                    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) | 0) + "px";
+                node.style.top = (((geometry.y/resolution - this.offset.y)-(yOffset+height)) | 0) + "px";
+                node.style.width = width + "px";
+                node.style.height = height + "px";
+                node.style.flip = "y";
+                
+                // modify fillColor and options for stroke styling below
+                fillColor = "none";
+                options.isStroked = false;
+            } else if (this.isComplexSymbol(style.graphicName)) {
+                var cache = this.importSymbol(style.graphicName);
+                node.path = cache.path;
+                node.coordorigin = cache.left + "," + cache.bottom;
+                var size = cache.size;
+                node.coordsize = size + "," + size;        
+                this.drawCircle(node, geometry, style.pointRadius);
+                node.style.flip = "y";
+            } else {
+                this.drawCircle(node, geometry, style.pointRadius);
+            }
+        }
+
+        // fill 
+        if (options.isFilled) { 
+            node.fillcolor = fillColor; 
+        } else { 
+            node.filled = "false"; 
+        }
+        var fills = node.getElementsByTagName("fill");
+        var fill = (fills.length == 0) ? null : fills[0];
+        if (!options.isFilled) {
+            if (fill) {
+                node.removeChild(fill);
+            }
+        } else {
+            if (!fill) {
+                fill = this.createNode('olv:fill', node.id + "_fill");
+            }
+            fill.opacity = style.fillOpacity;
+
+            if (node._geometryClass === "OpenLayers.Geometry.Point" &&
+                    style.externalGraphic) {
+
+                // override fillOpacity
+                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);
+            }
+        }
+
+        // additional rendering for rotated graphics or symbols
+        var rotation = style.rotation;
+        if ((rotation !== undefined || node._rotation !== undefined)) {
+            node._rotation = rotation;
+            if (style.externalGraphic) {
+                this.graphicRotate(node, xOffset, yOffset, style);
+                // make the fill fully transparent, because we now have
+                // the graphic as imagedata element. We cannot just remove
+                // the fill, because this is part of the hack described
+                // in graphicRotate
+                fill.opacity = 0;
+            } else if(node._geometryClass === "OpenLayers.Geometry.Point") {
+                node.style.rotation = rotation || 0;
+            }
+        }
+
+        // stroke 
+        var strokes = node.getElementsByTagName("stroke");
+        var stroke = (strokes.length == 0) ? null : strokes[0];
+        if (!options.isStroked) {
+            node.stroked = false;
+            if (stroke) {
+                stroke.on = false;
+            }
+        } else {
+            if (!stroke) {
+                stroke = this.createNode('olv:stroke', node.id + "_stroke");
+                node.appendChild(stroke);
+            }
+            stroke.on = true;
+            stroke.color = style.strokeColor; 
+            stroke.weight = style.strokeWidth + "px"; 
+            stroke.opacity = style.strokeOpacity;
+            stroke.endcap = style.strokeLinecap == 'butt' ? 'flat' :
+                (style.strokeLinecap || 'round');
+            if (style.strokeDashstyle) {
+                stroke.dashstyle = this.dashStyle(style);
+            }
+        }
+        
+        if (style.cursor != "inherit" && style.cursor != null) {
+            node.style.cursor = style.cursor;
+        }
+        return node;
+    },
+
+    /**
+     * Method: graphicRotate
+     * If a point is to be styled with externalGraphic and rotation, VML fills
+     * cannot be used to display the graphic, because rotation of graphic
+     * fills is not supported by the VML implementation of Internet Explorer.
+     * This method creates a olv:imagedata element inside the VML node,
+     * DXImageTransform.Matrix and BasicImage filters for rotation and
+     * opacity, and a 3-step hack to remove rendering artefacts from the
+     * graphic and preserve the ability of graphics to trigger events.
+     * Finally, OpenLayers methods are used to determine the correct
+     * 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
+     * yOffset - {Number} rotation center relative to image, y coordinate
+     * style   - {Object}
+     */
+    graphicRotate: function(node, xOffset, yOffset, style) {
+        var style = style || node._style;
+        var rotation = style.rotation || 0;
+        
+        var aspectRatio, size;
+        if (!(style.graphicWidth && style.graphicHeight)) {
+            // load the image to determine its size
+            var img = new Image();
+            img.onreadystatechange = OpenLayers.Function.bind(function() {
+                if(img.readyState == "complete" ||
+                        img.readyState == "interactive") {
+                    aspectRatio = img.width / img.height;
+                    size = Math.max(style.pointRadius * 2, 
+                        style.graphicWidth || 0,
+                        style.graphicHeight || 0);
+                    xOffset = xOffset * aspectRatio;
+                    style.graphicWidth = size * aspectRatio;
+                    style.graphicHeight = size;
+                    this.graphicRotate(node, xOffset, yOffset, style);
+                }
+            }, 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
+        // events on images:
+        // - Use the fill as usual (like for unrotated images) to handle
+        //   events
+        // - specify an imagedata element with the same src as the fill
+        // - style the imagedata element with an AlphaImageLoader filter
+        //   with empty src
+        var image = document.getElementById(node.id + "_image");
+        if (!image) {
+            image = this.createNode("olv:imagedata", node.id + "_image");
+            node.appendChild(image);
+        }
+        image.style.width = width + "px";
+        image.style.height = height + "px";
+        image.src = style.externalGraphic;
+        image.style.filter =
+            "progid:DXImageTransform.Microsoft.AlphaImageLoader(" + 
+            "src='', sizingMethod='scale')";
+
+        var rot = rotation * Math.PI / 180;
+        var sintheta = Math.sin(rot);
+        var costheta = Math.cos(rot);
+
+        // do the rotation on the image
+        var filter =
+            "progid:DXImageTransform.Microsoft.Matrix(M11=" + costheta +
+            ",M12=" + (-sintheta) + ",M21=" + sintheta + ",M22=" + costheta +
+            ",SizingMethod='auto expand')\n";
+
+        // set the opacity (needed for the imagedata)
+        var opacity = style.graphicOpacity || style.fillOpacity;
+        if (opacity && opacity != 1) {
+            filter += 
+                "progid:DXImageTransform.Microsoft.BasicImage(opacity=" + 
+                opacity+")\n";
+        }
+        node.style.filter = filter;
+
+        // do the rotation again on a box, so we know the insertion point
+        var centerPoint = new OpenLayers.Geometry.Point(-xOffset, -yOffset);
+        var imgBox = new OpenLayers.Bounds(0, 0, width, height).toGeometry();
+        imgBox.rotate(style.rotation, centerPoint);
+        var imgBounds = imgBox.getBounds();
+
+        node.style.left = Math.round(
+            parseInt(node.style.left) + imgBounds.left) + "px";
+        node.style.top = Math.round(
+            parseInt(node.style.top) - imgBounds.bottom) + "px";
+    },
+
+    /**
+     * Method: postDraw
+     * Does some node postprocessing to work around browser issues:
+     * - Some versions of Internet Explorer seem to be unable to set fillcolor
+     *   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.
+     * - In some cases, a node won't become visible after being drawn. Setting
+     *   style.visibility to "visible" works around that.
+     * 
+     * Parameters:
+     * node - {DOMElement}
+     */
+    postDraw: function(node) {
+        node.style.visibility = "visible";
+        var fillColor = node._style.fillColor;
+        var strokeColor = node._style.strokeColor;
+        if (fillColor == "none" &&
+                node.fillcolor != fillColor) {
+            node.fillcolor = fillColor;
+        }
+        if (strokeColor == "none" &&
+                node.strokecolor != strokeColor) {
+            node.strokecolor = strokeColor;
+        }
+    },
+
+
+    /**
+     * Method: setNodeDimension
+     * 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>}
+     */
+    setNodeDimension: function(node, geometry) {
+
+        var bbox = geometry.getBounds();
+        if(bbox) {
+            var resolution = this.getResolution();
+        
+            var scaledBox = 
+                new OpenLayers.Bounds((bbox.left/resolution - this.offset.x) | 0,
+                                      (bbox.bottom/resolution - this.offset.y) | 0,
+                                      (bbox.right/resolution - this.offset.x) | 0,
+                                      (bbox.top/resolution - this.offset.y) | 0);
+            
+            // 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
+     */
+    dashStyle: function(style) {
+        var dash = style.strokeDashstyle;
+        switch (dash) {
+            case 'solid':
+            case 'dot':
+            case 'dash':
+            case 'dashdot':
+            case 'longdash':
+            case 'longdashdot':
+                return dash;
+            default:
+                // very basic guessing of dash style patterns
+                var parts = dash.split(/[ ,]/);
+                if (parts.length == 2) {
+                    if (1*parts[0] >= 2*parts[1]) {
+                        return "longdash";
+                    }
+                    return (parts[0] == 1 || parts[1] == 1) ? "dot" : "dash";
+                } else if (parts.length == 4) {
+                    return (1*parts[0] >= 2*parts[1]) ? "longdashdot" :
+                        "dashdot";
+                }
+                return "solid";
+        }
+    },
+
+    /**
+     * Method: createNode
+     * Create a new node
+     *
+     * Parameters:
+     * type - {String} Kind of node to draw
+     * id - {String} Id for node
+     *
+     * Returns:
+     * {DOMElement} A new node of the given type and id
+     */
+    createNode: function(type, id) {
+        var node = document.createElement(type);
+        if (id) {
+            node.id = id;
+        }
+        
+        // IE hack to make elements unselectable, to prevent 'blue flash'
+        // while dragging vectors; #1410
+        node.unselectable = 'on';
+        node.onselectstart = OpenLayers.Function.False;
+        
+        return node;    
+    },
+    
+    /**
+     * Method: nodeTypeCompare
+     * Determine whether a node is of a given type
+     *
+     * Parameters:
+     * node - {DOMElement} An VML element
+     * type - {String} Kind of node
+     *
+     * Returns:
+     * {Boolean} Whether or not the specified node is of the specified type
+     */
+    nodeTypeCompare: function(node, type) {
+
+        //split type
+        var subType = type;
+        var splitIndex = subType.indexOf(":");
+        if (splitIndex != -1) {
+            subType = subType.substr(splitIndex+1);
+        }
+
+        //split nodeName
+        var nodeName = node.nodeName;
+        splitIndex = nodeName.indexOf(":");
+        if (splitIndex != -1) {
+            nodeName = nodeName.substr(splitIndex+1);
+        }
+
+        return (subType == nodeName);
+    },
+
+    /**
+     * Method: createRenderRoot
+     * Create the renderer root
+     *
+     * Returns:
+     * {DOMElement} The specific render engine's root element
+     */
+    createRenderRoot: function() {
+        return this.nodeFactory(this.container.id + "_vmlRoot", "div");
+    },
+
+    /**
+     * Method: createRoot
+     * Create the main root element
+     * 
+     * Parameters:
+     * suffix - {String} suffix to append to the id
+     *
+     * Returns:
+     * {DOMElement}
+     */
+    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
+     */
+    drawPoint: function(node, geometry) {
+        return this.drawCircle(node, geometry, 1);
+    },
+
+    /**
+     * 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
+     */
+    drawCircle: function(node, geometry, radius) {
+        if(!isNaN(geometry.x)&& !isNaN(geometry.y)) {
+            var resolution = this.getResolution();
+
+            node.style.left = (((geometry.x /resolution - this.offset.x) | 0) - radius) + "px";
+            node.style.top = (((geometry.y /resolution - this.offset.y) | 0) - radius) + "px";
+    
+            var diameter = radius * 2;
+            
+            node.style.width = diameter + "px";
+            node.style.height = diameter + "px";
+            return node;
+        }
+        return false;
+    },
+
+
+    /**
+     * Method: drawLineString
+     * Render a linestring.
+     * 
+     * Parameters:
+     * node - {DOMElement}
+     * geometry - {<OpenLayers.Geometry>}
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    drawLineString: function(node, geometry) {
+        return this.drawLine(node, geometry, false);
+    },
+
+    /**
+     * Method: drawLinearRing
+     * Render a linearring
+     * 
+     * Parameters:
+     * node - {DOMElement}
+     * geometry - {<OpenLayers.Geometry>}
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    drawLinearRing: function(node, geometry) {
+        return this.drawLine(node, geometry, true);
+    },
+
+    /**
+     * Method: DrawLine
+     * Render a line.
+     * 
+     * Parameters:
+     * node - {DOMElement}
+     * geometry - {<OpenLayers.Geometry>}
+     * closeLine - {Boolean} Close the line? (make it a ring?)
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    drawLine: function(node, geometry, closeLine) {
+
+        this.setNodeDimension(node, geometry);
+
+        var resolution = this.getResolution();
+        var numComponents = geometry.components.length;
+        var parts = new Array(numComponents);
+
+        var comp, x, y;
+        for (var i = 0; i < numComponents; i++) {
+            comp = geometry.components[i];
+            x = (comp.x/resolution - this.offset.x) | 0;
+            y = (comp.y/resolution - this.offset.y) | 0;
+            parts[i] = " " + x + "," + y + " l ";
+        }
+        var end = (closeLine) ? " x e" : " e";
+        node.path = "m" + parts.join("") + end;
+        return node;
+    },
+
+    /**
+     * Method: drawPolygon
+     * Render a polygon
+     * 
+     * Parameters:
+     * node - {DOMElement}
+     * geometry - {<OpenLayers.Geometry>}
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    drawPolygon: function(node, geometry) {
+        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++) {
+            linearRing = geometry.components[j];
+
+            path.push("m");
+            for (i=0, ilen=linearRing.components.length; i<ilen; i++) {
+                comp = linearRing.components[i];
+                x = (comp.x / resolution - this.offset.x) | 0;
+                y = (comp.y / resolution - this.offset.y) | 0;
+                path.push(" " + x + "," + y);
+                if (i==0) {
+                    path.push(" l");
+                }
+            }
+            path.push(" x ");
+        }
+        path.push("e");
+        node.path = path.join("");
+        return node;
+    },
+
+    /**
+     * 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) | 0) + "px";
+        node.style.top = ((geometry.y/resolution - this.offset.y) | 0) + "px";
+        node.style.width = ((geometry.width/resolution) | 0) + "px";
+        node.style.height = ((geometry.height/resolution) | 0) + "px";
+        
+        return node;
+    },
+    
+    /**
+     * Method: drawText
+     * This method is only called by the renderer itself.
+     * 
+     * Parameters: 
+     * featureId - {String}
+     * style -
+     * location - {<OpenLayers.Geometry.Point>}
+     */
+    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) | 0) + "px";
+        label.style.top = ((location.y/resolution - this.offset.y) | 0) + "px";
+        label.style.flip = "y";
+
+        textbox.innerText = style.label;
+
+        if (style.fontColor) {
+            textbox.style.color = style.fontColor;
+        }
+        if (style.fontOpacity) {
+            textbox.style.filter = 'alpha(opacity=' + (style.fontOpacity * 100) + ')';
+        }
+        if (style.fontFamily) {
+            textbox.style.fontFamily = style.fontFamily;
+        }
+        if (style.fontSize) {
+            textbox.style.fontSize = style.fontSize;
+        }
+        if (style.fontWeight) {
+            textbox.style.fontWeight = style.fontWeight;
+        }
+        if(style.labelSelect === true) {
+            label._featureId = featureId;
+            textbox._featureId = featureId;
+            textbox._geometry = location;
+            textbox._geometryClass = location.CLASS_NAME;
+        }
+        textbox.style.whiteSpace = "nowrap";
+        // fun with IE: IE7 in standards compliant mode does not display any
+        // text with a left inset of 0. So we set this to 1px and subtract one
+        // pixel later when we set label.style.left
+        textbox.inset = "1px,0px,0px,0px";
+
+        if(!label.parentNode) {
+            label.appendChild(textbox);
+            this.textRoot.appendChild(label);
+        }
+
+        var align = style.labelAlign || "cm";
+        if (align.length == 1) {
+            align += "m";
+        }
+        var xshift = textbox.clientWidth *
+            (OpenLayers.Renderer.VML.LABEL_SHIFT[align.substr(0,1)]);
+        var yshift = textbox.clientHeight *
+            (OpenLayers.Renderer.VML.LABEL_SHIFT[align.substr(1,1)]);
+        label.style.left = parseInt(label.style.left)-xshift-1+"px";
+        label.style.top = parseInt(label.style.top)+yshift+"px";
+        
+    },
+
+    /**
+     * Method: drawSurface
+     * 
+     * Parameters:
+     * node - {DOMElement}
+     * geometry - {<OpenLayers.Geometry>}
+     * 
+     * Returns:
+     * {DOMElement}
+     */
+    drawSurface: function(node, geometry) {
+
+        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++) {
+            comp = geometry.components[i];
+            x = (comp.x / resolution - this.offset.x) | 0;
+            y = (comp.y / resolution - this.offset.y) | 0;
+            if ((i%3)==0 && (i/3)==0) {
+                path.push("m");
+            } else if ((i%3)==1) {
+                path.push(" c");
+            }
+            path.push(" " + x + "," + y);
+        }
+        path.push(" x e");
+
+        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
+     */
+    moveRoot: function(renderer) {
+        var layer = this.map.getLayer(renderer.container.id);
+        if(layer instanceof OpenLayers.Layer.Vector.RootContainer) {
+            layer = this.map.getLayer(this.container.id);
+        }
+        layer && layer.renderer.clear();
+        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');
+        }
+
+        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) {
+            var x = symbol[i];
+            var y = symbol[i+1];
+            symbolExtent.left = Math.min(symbolExtent.left, x);
+            symbolExtent.bottom = Math.min(symbolExtent.bottom, y);
+            symbolExtent.right = Math.max(symbolExtent.right, x);
+            symbolExtent.top = Math.max(symbolExtent.top, y);
+
+            pathitems.push(x);
+            pathitems.push(y);
+            if (i == 0) {
+                pathitems.push("l");
+            }
+        }
+        pathitems.push("x e");
+        var path = pathitems.join(" ");
+
+        var diff = (symbolExtent.getWidth() - symbolExtent.getHeight()) / 2;
+        if(diff > 0) {
+            symbolExtent.bottom = symbolExtent.bottom - diff;
+            symbolExtent.top = symbolExtent.top + diff;
+        } else {
+            symbolExtent.left = symbolExtent.left + diff;
+            symbolExtent.right = symbolExtent.right - diff;
+        }
+        
+        cache = {
+            path: path,
+            size: symbolExtent.getWidth(), // equals getHeight() now
+            left: symbolExtent.left,
+            bottom: symbolExtent.bottom
+        };
+        this.symbolCache[id] = cache;
+        
+        return cache;
+    },
+    
+    CLASS_NAME: "OpenLayers.Renderer.VML"
+});
+
+/**
+ * Constant: OpenLayers.Renderer.VML.LABEL_SHIFT
+ * {Object}
+ */
+OpenLayers.Renderer.VML.LABEL_SHIFT = {
+    "l": 0,
+    "c": .5,
+    "r": 1,
+    "t": 0,
+    "m": .5,
+    "b": 1
+};
diff --git a/lib/OpenLayers/Request.js b/lib/OpenLayers/Request.js
new file mode 100644
index 0000000..a87664c
--- /dev/null
+++ b/lib/OpenLayers/Request.js
@@ -0,0 +1,358 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Events.js
+ */
+
+/**
+ * Namespace: OpenLayers.Request
+ * The OpenLayers.Request namespace contains convenience methods for working
+ *     with XMLHttpRequests.  These methods work with a cross-browser
+ *     W3C compliant <OpenLayers.Request.XMLHttpRequest> class.
+ */
+OpenLayers.Request = {
+    
+    /**
+     * Constant: DEFAULT_CONFIG
+     * {Object} Default configuration for all requests.
+     */
+    DEFAULT_CONFIG: {
+        method: "GET",
+        url: window.location.href,
+        async: true,
+        user: undefined,
+        password: undefined,
+        params: null,
+        proxy: OpenLayers.ProxyHost,
+        headers: {},
+        data: null,
+        callback: function() {},
+        success: null,
+        failure: null,
+        scope: null
+    },
+    
+    /**
+     * APIProperty: events
+     * {<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
+     *     place.
+     * success - Triggered when the HTTP response has a success code (200-299).
+     * 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
+     *     a callback to done state, and send any data.  It is recommended that
+     *     you use one <GET>, <POST>, <PUT>, <DELETE>, <OPTIONS>, or <HEAD>.
+     *     This method is only documented to provide detail on the configuration
+     *     options available to all request methods.
+     *
+     * Parameters:
+     * config - {Object} Object containing properties for configuring the
+     *     request.  Allowed configuration properties are described below.
+     *     This object is modified and should not be reused.
+     *
+     * Allowed config properties:
+     * method - {String} One of GET, POST, PUT, DELETE, HEAD, or
+     *     OPTIONS.  Default is GET.
+     * url - {String} URL for the request.
+     * async - {Boolean} Open an asynchronous request.  Default is true.
+     * user - {String} User for relevant authentication scheme.  Set
+     *     to null to clear current user.
+     * password - {String} Password for relevant authentication scheme.
+     *     Set to null to clear current password.
+     * proxy - {String} Optional proxy.  Defaults to
+     *     <OpenLayers.ProxyHost>.
+     * params - {Object} Any key:value pairs to be appended to the
+     *     url as a query string.  Assumes url doesn't already include a query
+     *     string or hash.  Typically, this is only appropriate for <GET>
+     *     requests where the query string will be appended to the url.
+     *     Parameter values that are arrays will be
+     *     concatenated with a comma (note that this goes against form-encoding)
+     *     as is done with <OpenLayers.Util.getParameterString>.
+     * headers - {Object} Object with header:value pairs to be set on
+     *     the request.
+     * data - {String | Document} Optional data to send with the request.
+     *     Typically, this is only used with <POST> and <PUT> requests.
+     *     Make sure to provide the appropriate "Content-Type" header for your
+     *     data.  For <POST> and <PUT> requests, the content type defaults to
+     *     "application-xml".  If your data is a different content type, or
+     *     if you are using a different HTTP method, set the "Content-Type"
+     *     header to match your data type.
+     * callback - {Function} Function to call when request is done.
+     *     To determine if the request failed, check request.status (200
+     *     indicates success).
+     * success - {Function} Optional function to call if request status is in
+     *     the 200s.  This will be called in addition to callback above and
+     *     would typically only be used as an alternative.
+     * failure - {Function} Optional function to call if request status is not
+     *     in the 200s.  This will be called in addition to callback above and
+     *     would typically only be used as an alternative.
+     * scope - {Object} If callback is a public method on some object,
+     *     set the scope to that object.
+     *
+     * Returns:
+     * {XMLHttpRequest} Request object.  To abort the request before a response
+     *     is received, call abort() on the request object.
+     */
+    issue: function(config) {        
+        // apply default config - proxy host may have changed
+        var defaultConfig = OpenLayers.Util.extend(
+            this.DEFAULT_CONFIG,
+            {proxy: OpenLayers.ProxyHost}
+        );
+        config = OpenLayers.Util.applyDefaults(config, defaultConfig);
+
+        // create request, open, and set headers
+        var request = new OpenLayers.Request.XMLHttpRequest();
+        var url = config.url;
+        if(config.params) {
+            var paramString = OpenLayers.Util.getParameterString(config.params);
+            if(paramString.length > 0) {
+                var separator = (url.indexOf('?') > -1) ? '&' : '?';
+                url += separator + paramString;
+            }
+        }
+        if(config.proxy && (url.indexOf("http") == 0)) {
+            if(typeof config.proxy == "function") {
+                url = config.proxy(url);
+            } else {
+                url = config.proxy + encodeURIComponent(url);
+            }
+        }
+        request.open(
+            config.method, url, config.async, config.user, config.password
+        );
+        for(var header in config.headers) {
+            request.setRequestHeader(header, config.headers[header]);
+        }
+
+        var events = this.events;
+
+        // we want to execute runCallbacks with "this" as the
+        // execution scope
+        var self = this;
+        
+        request.onreadystatechange = function() {
+            if(request.readyState == OpenLayers.Request.XMLHttpRequest.DONE) {
+                var proceed = events.triggerEvent(
+                    "complete",
+                    {request: request, config: config, requestUrl: url}
+                );
+                if(proceed !== false) {
+                    self.runCallbacks(
+                        {request: request, config: config, requestUrl: url}
+                    );
+                }
+            }
+        };
+        
+        // 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
+        if(config.async === false) {
+            request.send(config.data);
+        } else {
+            window.setTimeout(function(){
+                if (request._aborted !== true) {
+                    request.send(config.data);
+                }
+            }, 0);
+        }
+        return request;
+    },
+    
+    /**
+     * Method: runCallbacks
+     * Calls the complete, success and failure callbacks. Application
+     *    can listen to the "complete" event, have the listener 
+     *    display a confirm window and always return false, and
+     *    execute OpenLayers.Request.runCallbacks if the user
+     *    hits "yes" in the confirm window.
+     *
+     * Parameters:
+     * options - {Object} Hash containing request, config and requestUrl keys
+     */
+    runCallbacks: function(options) {
+        var request = options.request;
+        var config = options.config;
+        
+        // bind callbacks to readyState 4 (done)
+        var complete = (config.scope) ?
+            OpenLayers.Function.bind(config.callback, config.scope) :
+            config.callback;
+        
+        // optional success callback
+        var success;
+        if(config.success) {
+            success = (config.scope) ?
+                OpenLayers.Function.bind(config.success, config.scope) :
+                config.success;
+        }
+
+        // optional failure callback
+        var failure;
+        if(config.failure) {
+            failure = (config.scope) ?
+                OpenLayers.Function.bind(config.failure, config.scope) :
+                config.failure;
+        }
+
+        complete(request);
+
+        if (!request.status || (request.status >= 200 && request.status < 300)) {
+            this.events.triggerEvent("success", options);
+            if(success) {
+                success(request);
+            }
+        }
+        if(request.status && (request.status < 200 || request.status >= 300)) {                    
+            this.events.triggerEvent("failure", options);
+            if(failure) {
+                failure(request);
+            }
+        }
+    },
+    
+    /**
+     * APIMethod: GET
+     * Send an HTTP GET request.  Additional configuration properties are
+     *     documented in the <issue> method, with the method property set
+     *     to GET.
+     *
+     * Parameters:
+     * 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.
+     */
+    GET: function(config) {
+        config = OpenLayers.Util.extend(config, {method: "GET"});
+        return OpenLayers.Request.issue(config);
+    },
+    
+    /**
+     * APIMethod: POST
+     * Send a POST request.  Additional configuration properties are
+     *     documented in the <issue> method, with the method property set
+     *     to POST and "Content-Type" header set to "application/xml".
+     *
+     * Parameters:
+     * config - {Object} Object with properties for configuring the request.
+     *     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.
+     */
+    POST: function(config) {
+        config = OpenLayers.Util.extend(config, {method: "POST"});
+        // set content type to application/xml if it isn't already set
+        config.headers = config.headers ? config.headers : {};
+        if(!("CONTENT-TYPE" in OpenLayers.Util.upperCaseObject(config.headers))) {
+            config.headers["Content-Type"] = "application/xml";
+        }
+        return OpenLayers.Request.issue(config);
+    },
+    
+    /**
+     * APIMethod: PUT
+     * Send an HTTP PUT request.  Additional configuration properties are
+     *     documented in the <issue> method, with the method property set
+     *     to PUT and "Content-Type" header set to "application/xml".
+     *
+     * Parameters:
+     * config - {Object} Object with properties for configuring the request.
+     *     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.
+     */
+    PUT: function(config) {
+        config = OpenLayers.Util.extend(config, {method: "PUT"});
+        // set content type to application/xml if it isn't already set
+        config.headers = config.headers ? config.headers : {};
+        if(!("CONTENT-TYPE" in OpenLayers.Util.upperCaseObject(config.headers))) {
+            config.headers["Content-Type"] = "application/xml";
+        }
+        return OpenLayers.Request.issue(config);
+    },
+    
+    /**
+     * APIMethod: DELETE
+     * Send an HTTP DELETE request.  Additional configuration properties are
+     *     documented in the <issue> method, with the method property set
+     *     to DELETE.
+     *
+     * Parameters:
+     * 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.
+     */
+    DELETE: function(config) {
+        config = OpenLayers.Util.extend(config, {method: "DELETE"});
+        return OpenLayers.Request.issue(config);
+    },
+  
+    /**
+     * APIMethod: HEAD
+     * Send an HTTP HEAD request.  Additional configuration properties are
+     *     documented in the <issue> method, with the method property set
+     *     to HEAD.
+     *
+     * Parameters:
+     * 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.
+     */
+    HEAD: function(config) {
+        config = OpenLayers.Util.extend(config, {method: "HEAD"});
+        return OpenLayers.Request.issue(config);
+    },
+    
+    /**
+     * APIMethod: OPTIONS
+     * Send an HTTP OPTIONS request.  Additional configuration properties are
+     *     documented in the <issue> method, with the method property set
+     *     to OPTIONS.
+     *
+     * Parameters:
+     * 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.
+     */
+    OPTIONS: function(config) {
+        config = OpenLayers.Util.extend(config, {method: "OPTIONS"});
+        return OpenLayers.Request.issue(config);
+    }
+
+};
diff --git a/lib/OpenLayers/Request/XMLHttpRequest.js b/lib/OpenLayers/Request/XMLHttpRequest.js
new file mode 100644
index 0000000..9bf714f
--- /dev/null
+++ b/lib/OpenLayers/Request/XMLHttpRequest.js
@@ -0,0 +1,384 @@
+// XMLHttpRequest.js Copyright (C) 2010 Sergey Ilinsky (http://www.ilinsky.com)
+//
+// 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
+//
+// 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.
+
+/**
+ * @requires OpenLayers/Request.js
+ */
+
+(function () {
+
+    // Save reference to earlier defined object implementation (if any)
+    var oXMLHttpRequest    = window.XMLHttpRequest;
+
+    // Define on browser type
+    var bGecko    = !!window.controllers,
+        bIE        = window.document.all && !window.opera,
+        bIE7    = bIE && window.navigator.userAgent.match(/MSIE ([\.0-9]+)/) && RegExp.$1 == 7;
+
+    // Constructor
+    function cXMLHttpRequest() {
+        this._object    = oXMLHttpRequest && !bIE7 ? new oXMLHttpRequest : new window.ActiveXObject("Microsoft.XMLHTTP");
+        this._listeners    = [];
+    };
+
+    // BUGFIX: Firefox with Firebug installed would break pages if not executed
+    if (bGecko && oXMLHttpRequest.wrapped)
+        cXMLHttpRequest.wrapped    = oXMLHttpRequest.wrapped;
+
+    // Constants
+    cXMLHttpRequest.UNSENT                = 0;
+    cXMLHttpRequest.OPENED                = 1;
+    cXMLHttpRequest.HEADERS_RECEIVED    = 2;
+    cXMLHttpRequest.LOADING                = 3;
+    cXMLHttpRequest.DONE                = 4;
+
+    // Public Properties
+    cXMLHttpRequest.prototype.readyState    = cXMLHttpRequest.UNSENT;
+    cXMLHttpRequest.prototype.responseText    = '';
+    cXMLHttpRequest.prototype.responseXML    = null;
+    cXMLHttpRequest.prototype.status        = 0;
+    cXMLHttpRequest.prototype.statusText    = '';
+
+    // Instance-level Events Handlers
+    cXMLHttpRequest.prototype.onreadystatechange    = null;
+
+    // Class-level Events Handlers
+    cXMLHttpRequest.onreadystatechange    = null;
+    cXMLHttpRequest.onopen                = null;
+    cXMLHttpRequest.onsend                = null;
+    cXMLHttpRequest.onabort                = null;
+
+    // Public Methods
+    cXMLHttpRequest.prototype.open    = function(sMethod, sUrl, bAsync, sUser, sPassword) {
+        // Delete headers, required when object is reused
+        delete this._headers;
+
+        // When bAsync parameter value is omitted, use true as default
+        if (arguments.length < 3)
+            bAsync    = true;
+
+        // Save async parameter for fixing Gecko bug with missing readystatechange in synchronous requests
+        this._async        = bAsync;
+
+        // Set the onreadystatechange handler
+        var oRequest    = this,
+            nState        = this.readyState,
+            fOnUnload;
+
+        // BUGFIX: IE - memory leak on page unload (inter-page leak)
+        if (bIE && bAsync) {
+            fOnUnload = function() {
+                if (nState != cXMLHttpRequest.DONE) {
+                    fCleanTransport(oRequest);
+                    // Safe to abort here since onreadystatechange handler removed
+                    oRequest.abort();
+                }
+            };
+                window.attachEvent("onunload", fOnUnload);
+        }
+
+        // Add method sniffer
+        if (cXMLHttpRequest.onopen)
+            cXMLHttpRequest.onopen.apply(this, arguments);
+
+        if (arguments.length > 4)
+            this._object.open(sMethod, sUrl, bAsync, sUser, sPassword);
+        else
+        if (arguments.length > 3)
+            this._object.open(sMethod, sUrl, bAsync, sUser);
+        else
+            this._object.open(sMethod, sUrl, bAsync);
+
+        if (!bGecko && !bIE) {
+            this.readyState    = cXMLHttpRequest.OPENED;
+            fReadyStateChange(this);
+        }
+
+        this._object.onreadystatechange    = function() {
+            if (bGecko && !bAsync)
+                return;
+
+            // Synchronize state
+            oRequest.readyState        = oRequest._object.readyState;
+
+            //
+            fSynchronizeValues(oRequest);
+
+            // BUGFIX: Firefox fires unnecessary DONE when aborting
+            if (oRequest._aborted) {
+                // Reset readyState to UNSENT
+                oRequest.readyState    = cXMLHttpRequest.UNSENT;
+
+                // Return now
+                return;
+            }
+
+            if (oRequest.readyState == cXMLHttpRequest.DONE) {
+                //
+                fCleanTransport(oRequest);
+// Uncomment this block if you need a fix for IE cache
+/*
+                // BUGFIX: IE - cache issue
+                if (!oRequest._object.getResponseHeader("Date")) {
+                    // Save object to cache
+                    oRequest._cached    = oRequest._object;
+
+                    // Instantiate a new transport object
+                    cXMLHttpRequest.call(oRequest);
+
+                    // Re-send request
+                    if (sUser) {
+                         if (sPassword)
+                    oRequest._object.open(sMethod, sUrl, bAsync, sUser, sPassword);
+                        else
+                            oRequest._object.open(sMethod, sUrl, bAsync, sUser);
+                    }
+                    else
+                        oRequest._object.open(sMethod, sUrl, bAsync);
+                    oRequest._object.setRequestHeader("If-Modified-Since", oRequest._cached.getResponseHeader("Last-Modified") || new window.Date(0));
+                    // Copy headers set
+                    if (oRequest._headers)
+                        for (var sHeader in oRequest._headers)
+                            if (typeof oRequest._headers[sHeader] == "string")    // Some frameworks prototype objects with functions
+                                oRequest._object.setRequestHeader(sHeader, oRequest._headers[sHeader]);
+
+                    oRequest._object.onreadystatechange    = function() {
+                        // Synchronize state
+                        oRequest.readyState        = oRequest._object.readyState;
+
+                        if (oRequest._aborted) {
+                            //
+                            oRequest.readyState    = cXMLHttpRequest.UNSENT;
+
+                            // Return
+                            return;
+                        }
+
+                        if (oRequest.readyState == cXMLHttpRequest.DONE) {
+                            // Clean Object
+                            fCleanTransport(oRequest);
+
+                            // get cached request
+                            if (oRequest.status == 304)
+                                oRequest._object    = oRequest._cached;
+
+                            //
+                            delete oRequest._cached;
+
+                            //
+                            fSynchronizeValues(oRequest);
+
+                            //
+                            fReadyStateChange(oRequest);
+
+                            // BUGFIX: IE - memory leak in interrupted
+                            if (bIE && bAsync)
+                                window.detachEvent("onunload", fOnUnload);
+                        }
+                    };
+                    oRequest._object.send(null);
+
+                    // Return now - wait until re-sent request is finished
+                    return;
+                };
+*/
+                // BUGFIX: IE - memory leak in interrupted
+                if (bIE && bAsync)
+                    window.detachEvent("onunload", fOnUnload);
+            }
+
+            // BUGFIX: Some browsers (Internet Explorer, Gecko) fire OPEN readystate twice
+            if (nState != oRequest.readyState)
+                fReadyStateChange(oRequest);
+
+            nState    = oRequest.readyState;
+        }
+    };
+    cXMLHttpRequest.prototype.send    = function(vData) {
+        // Add method sniffer
+        if (cXMLHttpRequest.onsend)
+            cXMLHttpRequest.onsend.apply(this, arguments);
+
+        // BUGFIX: Safari - fails sending documents created/modified dynamically, so an explicit serialization required
+        // BUGFIX: IE - rewrites any custom mime-type to "text/xml" in case an XMLNode is sent
+        // BUGFIX: Gecko - fails sending Element (this is up to the implementation either to standard)
+        if (vData && vData.nodeType) {
+            vData    = window.XMLSerializer ? new window.XMLSerializer().serializeToString(vData) : vData.xml;
+            if (!this._headers["Content-Type"])
+                this._object.setRequestHeader("Content-Type", "application/xml");
+        }
+
+        this._object.send(vData);
+
+        // BUGFIX: Gecko - missing readystatechange calls in synchronous requests
+        if (bGecko && !this._async) {
+            this.readyState    = cXMLHttpRequest.OPENED;
+
+            // Synchronize state
+            fSynchronizeValues(this);
+
+            // Simulate missing states
+            while (this.readyState < cXMLHttpRequest.DONE) {
+                this.readyState++;
+                fReadyStateChange(this);
+                // Check if we are aborted
+                if (this._aborted)
+                    return;
+            }
+        }
+    };
+    cXMLHttpRequest.prototype.abort    = function() {
+        // Add method sniffer
+        if (cXMLHttpRequest.onabort)
+            cXMLHttpRequest.onabort.apply(this, arguments);
+
+        // BUGFIX: Gecko - unnecessary DONE when aborting
+        if (this.readyState > cXMLHttpRequest.UNSENT)
+            this._aborted    = true;
+
+        this._object.abort();
+
+        // BUGFIX: IE - memory leak
+        fCleanTransport(this);
+    };
+    cXMLHttpRequest.prototype.getAllResponseHeaders    = function() {
+        return this._object.getAllResponseHeaders();
+    };
+    cXMLHttpRequest.prototype.getResponseHeader    = function(sName) {
+        return this._object.getResponseHeader(sName);
+    };
+    cXMLHttpRequest.prototype.setRequestHeader    = function(sName, sValue) {
+        // BUGFIX: IE - cache issue
+        if (!this._headers)
+            this._headers    = {};
+        this._headers[sName]    = sValue;
+
+        return this._object.setRequestHeader(sName, sValue);
+    };
+
+    // EventTarget interface implementation
+    cXMLHttpRequest.prototype.addEventListener    = function(sName, fHandler, bUseCapture) {
+        for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++)
+            if (oListener[0] == sName && oListener[1] == fHandler && oListener[2] == bUseCapture)
+                return;
+        // Add listener
+        this._listeners.push([sName, fHandler, bUseCapture]);
+    };
+
+    cXMLHttpRequest.prototype.removeEventListener    = function(sName, fHandler, bUseCapture) {
+        for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++)
+            if (oListener[0] == sName && oListener[1] == fHandler && oListener[2] == bUseCapture)
+                break;
+        // Remove listener
+        if (oListener)
+            this._listeners.splice(nIndex, 1);
+    };
+
+    cXMLHttpRequest.prototype.dispatchEvent    = function(oEvent) {
+        var oEventPseudo    = {
+            'type':            oEvent.type,
+            'target':        this,
+            'currentTarget':this,
+            'eventPhase':    2,
+            'bubbles':        oEvent.bubbles,
+            'cancelable':    oEvent.cancelable,
+            'timeStamp':    oEvent.timeStamp,
+            'stopPropagation':    function() {},    // There is no flow
+            'preventDefault':    function() {},    // There is no default action
+            'initEvent':        function() {}    // Original event object should be initialized
+        };
+
+        // Execute onreadystatechange
+        if (oEventPseudo.type == "readystatechange" && this.onreadystatechange)
+            (this.onreadystatechange.handleEvent || this.onreadystatechange).apply(this, [oEventPseudo]);
+
+        // Execute listeners
+        for (var nIndex = 0, oListener; oListener = this._listeners[nIndex]; nIndex++)
+            if (oListener[0] == oEventPseudo.type && !oListener[2])
+                (oListener[1].handleEvent || oListener[1]).apply(this, [oEventPseudo]);
+    };
+
+    //
+    cXMLHttpRequest.prototype.toString    = function() {
+        return '[' + "object" + ' ' + "XMLHttpRequest" + ']';
+    };
+
+    cXMLHttpRequest.toString    = function() {
+        return '[' + "XMLHttpRequest" + ']';
+    };
+
+    // Helper function
+    function fReadyStateChange(oRequest) {
+        // Sniffing code
+        if (cXMLHttpRequest.onreadystatechange)
+            cXMLHttpRequest.onreadystatechange.apply(oRequest);
+
+        // Fake event
+        oRequest.dispatchEvent({
+            'type':            "readystatechange",
+            'bubbles':        false,
+            'cancelable':    false,
+            'timeStamp':    new Date + 0
+        });
+    };
+
+    function fGetDocument(oRequest) {
+        var oDocument    = oRequest.responseXML,
+            sResponse    = oRequest.responseText;
+        // Try parsing responseText
+        if (bIE && sResponse && oDocument && !oDocument.documentElement && oRequest.getResponseHeader("Content-Type").match(/[^\/]+\/[^\+]+\+xml/)) {
+            oDocument    = new window.ActiveXObject("Microsoft.XMLDOM");
+            oDocument.async                = false;
+            oDocument.validateOnParse    = false;
+            oDocument.loadXML(sResponse);
+        }
+        // Check if there is no error in document
+        if (oDocument)
+            if ((bIE && oDocument.parseError != 0) || !oDocument.documentElement || (oDocument.documentElement && oDocument.documentElement.tagName == "parsererror"))
+                return null;
+        return oDocument;
+    };
+
+    function fSynchronizeValues(oRequest) {
+        try {    oRequest.responseText    = oRequest._object.responseText;    } catch (e) {}
+        try {    oRequest.responseXML    = fGetDocument(oRequest._object);    } catch (e) {}
+        try {    oRequest.status            = oRequest._object.status;            } catch (e) {}
+        try {    oRequest.statusText        = oRequest._object.statusText;        } catch (e) {}
+    };
+
+    function fCleanTransport(oRequest) {
+        // BUGFIX: IE - memory leak (on-page leak)
+        oRequest._object.onreadystatechange    = new window.Function;
+    };
+
+    // Internet Explorer 5.0 (missing apply)
+    if (!window.Function.prototype.apply) {
+        window.Function.prototype.apply    = function(oRequest, oArguments) {
+            if (!oArguments)
+                oArguments    = [];
+            oRequest.__func    = this;
+            oRequest.__func(oArguments[0], oArguments[1], oArguments[2], oArguments[3], oArguments[4]);
+            delete oRequest.__func;
+        };
+    };
+
+    // Register new object with window
+    /**
+     * Class: OpenLayers.Request.XMLHttpRequest
+     * Standard-compliant (W3C) cross-browser implementation of the
+     *     XMLHttpRequest object.  From
+     *     http://code.google.com/p/xmlhttprequest/.
+     */
+    OpenLayers.Request.XMLHttpRequest = cXMLHttpRequest;
+})();
\ No newline at end of file
diff --git a/lib/OpenLayers/Rule.js b/lib/OpenLayers/Rule.js
new file mode 100644
index 0000000..a98f349
--- /dev/null
+++ b/lib/OpenLayers/Rule.js
@@ -0,0 +1,240 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Util.js
+ * @requires OpenLayers/Style.js
+ * @requires OpenLayers/Symbolizer/Point.js
+ * @requires OpenLayers/Symbolizer/Line.js
+ * @requires OpenLayers/Symbolizer/Polygon.js
+ * @requires OpenLayers/Symbolizer/Text.js
+ * @requires OpenLayers/Symbolizer/Raster.js
+ */
+
+/**
+ * Class: OpenLayers.Rule
+ * 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: null,
+    
+    /**
+     * 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)
+     */
+    description: null,
+
+    /**
+     * Property: context
+     * {Object} An optional object with properties that the rule should be
+     * evaluated against. If no context is specified, feature.attributes will
+     * be used.
+     */
+    context: null,
+    
+    /**
+     * Property: filter
+     * {<OpenLayers.Filter>} Optional filter for the rule.
+     */
+    filter: null,
+
+    /**
+     * Property: elseFilter
+     * {Boolean} Determines whether this rule is only to be applied only if
+     * 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 
+     * ignored.
+     */
+    elseFilter: false,
+    
+    /**
+     * Property: symbolizer
+     * {Object} Symbolizer or hash of symbolizers for this rule. If hash of
+     * symbolizers, keys are one or more of ["Point", "Line", "Polygon"]. The
+     * latter if useful if it is required to style e.g. vertices of a line
+     * with a point symbolizer. Note, however, that this is not implemented
+     * yet in OpenLayers, but it is the way how symbolizers are defined in
+     * SLD.
+     */
+    symbolizer: null,
+    
+    /**
+     * Property: symbolizers
+     * {Array} Collection of symbolizers associated with this rule.  If 
+     *     provided at construction, the symbolizers array has precedence
+     *     over the deprecated symbolizer property.  Note that multiple 
+     *     symbolizers are not currently supported by the vector renderers.
+     *     Rules with multiple symbolizers are currently only useful for
+     *     maintaining elements in an SLD document.
+     */
+    symbolizers: null,
+    
+    /**
+     * APIProperty: minScaleDenominator
+     * {Number} or {String} minimum scale at which to draw the feature.
+     * In the case of a String, this can be a combination of text and
+     * propertyNames in the form "literal ${propertyName}"
+     */
+    minScaleDenominator: null,
+
+    /**
+     * APIProperty: maxScaleDenominator
+     * {Number} or {String} maximum scale at which to draw the feature.
+     * In the case of a String, this can be a combination of text and
+     * 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>}
+     */
+    initialize: function(options) {
+        this.symbolizer = {};
+        OpenLayers.Util.extend(this, options);
+        if (this.symbolizers) {
+            delete this.symbolizer;
+        }
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
+    },
+
+    /** 
+     * APIMethod: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+        for (var i in this.symbolizer) {
+            this.symbolizer[i] = null;
+        }
+        this.symbolizer = null;
+        delete this.symbolizers;
+    },
+    
+    /**
+     * 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.
+     */
+    evaluate: function(feature) {
+        var context = this.getContext(feature);
+        var applies = true;
+
+        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(
+                    this.minScaleDenominator, context);
+        }
+        if (applies && this.maxScaleDenominator) {
+            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
+            if(this.filter.CLASS_NAME == "OpenLayers.Filter.FeatureId") {
+                applies = this.filter.evaluate(feature);
+            } else {
+                applies = this.filter.evaluate(context);
+            }
+        }
+
+        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.
+     */
+    getContext: function(feature) {
+        var context = this.context;
+        if (!context) {
+            context = feature.attributes || feature.data;
+        }
+        if (typeof this.context == "function") {
+            context = this.context(feature);
+        }
+        return context;
+    },
+    
+    /**
+     * APIMethod: clone
+     * Clones this rule.
+     * 
+     * Returns:
+     * {<OpenLayers.Rule>} Clone of this rule.
+     */
+    clone: function() {
+        var options = OpenLayers.Util.extend({}, this);
+        if (this.symbolizers) {
+            // clone symbolizers
+            var len = this.symbolizers.length;
+            options.symbolizers = new Array(len);
+            for (var i=0; i<len; ++i) {
+                options.symbolizers[i] = this.symbolizers[i].clone();
+            }
+        } else {
+            // clone symbolizer
+            options.symbolizer = {};
+            var value, type;
+            for(var key in this.symbolizer) {
+                value = this.symbolizer[key];
+                type = typeof value;
+                if(type === "object") {
+                    options.symbolizer[key] = OpenLayers.Util.extend({}, value);
+                } else if(type === "string") {
+                    options.symbolizer[key] = value;
+                }
+            }
+        }
+        // clone filter
+        options.filter = this.filter && this.filter.clone();
+        // clone context
+        options.context = this.context && OpenLayers.Util.extend({}, this.context);
+        return new OpenLayers.Rule(options);
+    },
+        
+    CLASS_NAME: "OpenLayers.Rule"
+});
\ No newline at end of file
diff --git a/lib/OpenLayers/SingleFile.js b/lib/OpenLayers/SingleFile.js
new file mode 100644
index 0000000..d58b62d
--- /dev/null
+++ b/lib/OpenLayers/SingleFile.js
@@ -0,0 +1,10 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+var OpenLayers = {
+    singleFile: true
+};
+
+
diff --git a/lib/OpenLayers/Strategy.js b/lib/OpenLayers/Strategy.js
new file mode 100644
index 0000000..0f5b2fe
--- /dev/null
+++ b/lib/OpenLayers/Strategy.js
@@ -0,0 +1,117 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * Class: OpenLayers.Strategy
+ * Abstract vector layer strategy class.  Not to be instantiated directly.  Use
+ *     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 
+     * {Boolean} The control is active.
+     */
+    active: null,
+
+    /**
+     * Property: autoActivate
+     * {Boolean} The creator of the strategy can set autoActivate to false
+     *      to fully control when the protocol is activated and deactivated.
+     *      Defaults to true.
+     */
+    autoActivate: true,
+
+    /**
+     * Property: autoDestroy
+     * {Boolean} The creator of the strategy can set autoDestroy to false
+     *      to fully control when the strategy is destroyed. Defaults to
+     *      true.
+     */
+    autoDestroy: true,
+
+    /**
+     * Constructor: OpenLayers.Strategy
+     * Abstract class for vector strategies.  Create instances of a subclass.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Util.extend(this, options);
+        this.options = options;
+        // set the active property here, so that user cannot override it
+        this.active = false;
+    },
+    
+    /**
+     * APIMethod: destroy
+     * Clean up the strategy.
+     */
+    destroy: function() {
+        this.deactivate();
+        this.layer = null;
+        this.options = null;
+    },
+
+    /**
+     * Method: setLayer
+     * Called to set the <layer> property.
+     *
+     * Parameters:
+     * {<OpenLayers.Layer.Vector>}
+     */
+    setLayer: function(layer) {
+        this.layer = layer;
+    },
+    
+    /**
+     * Method: activate
+     * Activate the strategy.  Register any listeners, do appropriate setup.
+     *
+     * Returns:
+     * {Boolean} True if the strategy was successfully activated or false if
+     *      the strategy was already active.
+     */
+    activate: function() {
+        if (!this.active) {
+            this.active = true;
+            return true;
+        }
+        return false;
+    },
+    
+    /**
+     * Method: deactivate
+     * Deactivate the strategy.  Unregister any listeners, do appropriate
+     *     tear-down.
+     *
+     * Returns:
+     * {Boolean} True if the strategy was successfully deactivated or false if
+     *      the strategy was already inactive.
+     */
+    deactivate: function() {
+        if (this.active) {
+            this.active = false;
+            return true;
+        }
+        return false;
+    },
+   
+    CLASS_NAME: "OpenLayers.Strategy" 
+});
diff --git a/lib/OpenLayers/Strategy/BBOX.js b/lib/OpenLayers/Strategy/BBOX.js
new file mode 100644
index 0000000..5e42d9b
--- /dev/null
+++ b/lib/OpenLayers/Strategy/BBOX.js
@@ -0,0 +1,278 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Strategy.js
+ * @requires OpenLayers/Filter/Spatial.js
+ */
+
+/**
+ * Class: OpenLayers.Strategy.BBOX
+ * A simple strategy that reads new features when the viewport invalidates
+ *     some bounds.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Strategy>
+ */
+OpenLayers.Strategy.BBOX = OpenLayers.Class(OpenLayers.Strategy, {
+    
+    /**
+     * Property: bounds
+     * {<OpenLayers.Bounds>} The current data bounds (in the same projection
+     *     as the layer - not always the same projection as the map).
+     */
+    bounds: null,
+    
+    /** 
+     * Property: resolution 
+     * {Float} The current data resolution. 
+     */ 
+    resolution: null, 
+           
+    /**
+     * APIProperty: ratio
+     * {Float} The ratio of the data bounds to the viewport bounds (in each
+     *     dimension).  Default is 2.
+     */
+    ratio: 2,
+
+    /** 
+     * Property: resFactor 
+     * {Float} Optional factor used to determine when previously requested 
+     *     features are invalid.  If set, the resFactor will be compared to the
+     *     resolution of the previous request to the current map resolution.
+     *     If resFactor > (old / new) and 1/resFactor < (old / new).  If you
+     *     set a resFactor of 1, data will be requested every time the
+     *     resolution changes.  If you set a resFactor of 3, data will be
+     *     requested if the old resolution is 3 times the new, or if the new is
+     *     3 times the old.  If the old bounds do not contain the new bounds
+     *     new data will always be requested (with or without considering
+     *     resFactor). 
+     */ 
+    resFactor: null, 
+    
+    /**
+     * Property: response
+     * {<OpenLayers.Protocol.Response>} The protocol response object returned
+     *      by the layer protocol.
+     */
+    response: null,
+
+    /**
+     * Constructor: OpenLayers.Strategy.BBOX
+     * Create a new BBOX strategy.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Strategy.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * Method: activate
+     * Set up strategy with regard to reading new batches of remote data.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully activated.
+     */
+    activate: function() {
+        var activated = OpenLayers.Strategy.prototype.activate.call(this);
+        if(activated) {
+            this.layer.events.on({
+                "moveend": this.update,
+                scope: this
+            });
+            this.layer.events.on({
+                "refresh": this.update,
+                scope: this
+            });
+        }
+        return activated;
+    },
+    
+    /**
+     * Method: deactivate
+     * Tear down strategy with regard to reading new batches of remote data.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this);
+        if(deactivated) {
+            this.layer.events.un({
+                "moveend": this.update,
+                scope: this
+            });
+            this.layer.events.un({
+                "refresh": this.update,
+                scope: this
+            });
+        }
+        return deactivated;
+    },
+
+    /**
+     * Method: update
+     * Callback function called on "moveend" or "refresh" layer events.
+     *
+     * Parameters:
+     * options - {Object} An object with a property named "force", this
+     *      property references a boolean value indicating if new data
+     *      must be incondtionally read.
+     */
+    update: function(options) {
+        var mapBounds = this.getMapBounds();
+        if ((options && options.force) || this.invalidBounds(mapBounds)) {
+            this.calculateBounds(mapBounds);
+            this.resolution = this.layer.map.getResolution(); 
+            this.triggerRead();
+        }
+    },
+    
+    /**
+     * Method: getMapBounds
+     * Get the map bounds expressed in the same projection as this layer.
+     *
+     * Returns:
+     * {<OpenLayers.Bounds>} Map bounds in the projection of the layer.
+     */
+    getMapBounds: function() {
+        var bounds = this.layer.map.getExtent();
+        if(!this.layer.projection.equals(this.layer.map.getProjectionObject())) {
+            bounds = bounds.clone().transform(
+                this.layer.map.getProjectionObject(), this.layer.projection
+            );
+        }
+        return bounds;
+    },
+
+    /**
+     * Method: invalidBounds
+     * Determine whether the previously requested set of features is invalid. 
+     *     This occurs when the new map bounds do not contain the previously 
+     *     requested bounds.  In addition, if <resFactor> is set, it will be 
+     *     considered.
+     *
+     * Parameters:
+     * mapBounds - {<OpenLayers.Bounds>} the current map extent, will be
+     *      retrieved from the map object if not provided
+     *
+     * Returns:
+     * {Boolean} 
+     */
+    invalidBounds: function(mapBounds) {
+        if(!mapBounds) {
+            mapBounds = this.getMapBounds();
+        }
+        var invalid = !this.bounds || !this.bounds.containsBounds(mapBounds);
+        if(!invalid && this.resFactor) {
+            var ratio = this.resolution / this.layer.map.getResolution();
+            invalid = (ratio >= this.resFactor || ratio <= (1 / this.resFactor));
+        }
+        return invalid;
+    },
+ 
+    /**
+     * Method: calculateBounds
+     *
+     * Parameters:
+     * mapBounds - {<OpenLayers.Bounds>} the current map extent, will be
+     *      retrieved from the map object if not provided
+     */
+    calculateBounds: function(mapBounds) {
+        if(!mapBounds) {
+            mapBounds = this.getMapBounds();
+        }
+        var center = mapBounds.getCenterLonLat();
+        var dataWidth = mapBounds.getWidth() * this.ratio;
+        var dataHeight = mapBounds.getHeight() * this.ratio;
+        this.bounds = new OpenLayers.Bounds(
+            center.lon - (dataWidth / 2),
+            center.lat - (dataHeight / 2),
+            center.lon + (dataWidth / 2),
+            center.lat + (dataHeight / 2)
+        );
+    },
+    
+    /**
+     * Method: triggerRead
+     *
+     * Returns:
+     * {<OpenLayers.Protocol.Response>} The protocol response object
+     *      returned by the layer protocol.
+     */
+    triggerRead: function() {
+        if (this.response) {
+            this.layer.protocol.abort(this.response);
+            this.layer.events.triggerEvent("loadend");
+        }
+        this.layer.events.triggerEvent("loadstart");
+        this.response = this.layer.protocol.read({
+            filter: this.createFilter(),
+            callback: this.merge,
+            scope: this
+        });
+    },
+ 
+    /**
+     * Method: createFilter
+     * Creates a spatial BBOX filter. If the layer that this strategy belongs
+     * to has a filter property, this filter will be combined with the BBOX 
+     * filter.
+     * 
+     * Returns
+     * {<OpenLayers.Filter>} The filter object.
+     */
+    createFilter: function() {
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value: this.bounds,
+            projection: this.layer.projection
+        });
+        if (this.layer.filter) {
+            filter = new OpenLayers.Filter.Logical({
+                type: OpenLayers.Filter.Logical.AND,
+                filters: [this.layer.filter, filter]
+            });
+        }
+        return filter;
+    },
+   
+    /**
+     * Method: merge
+     * Given a list of features, determine which ones to add to the layer.
+     *     If the layer projection differs from the map projection, features
+     *     will be transformed from the layer projection to the map projection.
+     *
+     * Parameters:
+     * resp - {<OpenLayers.Protocol.Response>} The response object passed
+     *      by the protocol.
+     */
+    merge: function(resp) {
+        this.layer.destroyFeatures();
+        var features = resp.features;
+        if(features && features.length > 0) {
+            var remote = this.layer.projection;
+            var local = this.layer.map.getProjectionObject();
+            if(!local.equals(remote)) {
+                var geom;
+                for(var i=0, len=features.length; i<len; ++i) {
+                    geom = features[i].geometry;
+                    if(geom) {
+                        geom.transform(remote, local);
+                    }
+                }
+            }
+            this.layer.addFeatures(features);
+        }
+        this.response = null;
+        this.layer.events.triggerEvent("loadend");
+    },
+   
+    CLASS_NAME: "OpenLayers.Strategy.BBOX" 
+});
diff --git a/lib/OpenLayers/Strategy/Cluster.js b/lib/OpenLayers/Strategy/Cluster.js
new file mode 100644
index 0000000..a97eed1
--- /dev/null
+++ b/lib/OpenLayers/Strategy/Cluster.js
@@ -0,0 +1,280 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Strategy.js
+ */
+
+/**
+ * Class: OpenLayers.Strategy.Cluster
+ * Strategy for vector feature clustering.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Strategy>
+ */
+OpenLayers.Strategy.Cluster = OpenLayers.Class(OpenLayers.Strategy, {
+    
+    /**
+     * APIProperty: distance
+     * {Integer} Pixel distance between features that should be considered a
+     *     single cluster.  Default is 20 pixels.
+     */
+    distance: 20,
+    
+    /**
+     * APIProperty: threshold
+     * {Integer} Optional threshold below which original features will be
+     *     added to the layer instead of clusters.  For example, a threshold
+     *     of 3 would mean that any time there are 2 or fewer features in
+     *     a cluster, those features will be added directly to the layer instead
+     *     of a cluster representing those features.  Default is null (which is
+     *     equivalent to 1 - meaning that clusters may contain just one feature).
+     */
+    threshold: null,
+    
+    /**
+     * Property: features
+     * {Array(<OpenLayers.Feature.Vector>)} Cached features.
+     */
+    features: null,
+    
+    /**
+     * Property: clusters
+     * {Array(<OpenLayers.Feature.Vector>)} Calculated clusters.
+     */
+    clusters: null,
+    
+    /**
+     * Property: clustering
+     * {Boolean} The strategy is currently clustering features.
+     */
+    clustering: false,
+    
+    /**
+     * Property: resolution
+     * {Float} The resolution (map units per pixel) of the current cluster set.
+     */
+    resolution: null,
+
+    /**
+     * Constructor: OpenLayers.Strategy.Cluster
+     * Create a new clustering strategy.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Strategy.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * APIMethod: activate
+     * Activate the strategy.  Register any listeners, do appropriate setup.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully activated.
+     */
+    activate: function() {
+        var activated = OpenLayers.Strategy.prototype.activate.call(this);
+        if(activated) {
+            this.layer.events.on({
+                "beforefeaturesadded": this.cacheFeatures,
+                "moveend": this.cluster,
+                scope: this
+            });
+        }
+        return activated;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivate the strategy.  Unregister any listeners, do appropriate
+     *     tear-down.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this);
+        if(deactivated) {
+            this.clearCache();
+            this.layer.events.un({
+                "beforefeaturesadded": this.cacheFeatures,
+                "moveend": this.cluster,
+                scope: this
+            });
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: cacheFeatures
+     * Cache features before they are added to the layer.
+     *
+     * Parameters:
+     * event - {Object} The event that this was listening for.  This will come
+     *     with a batch of features to be clustered.
+     *     
+     * Returns:
+     * {Boolean} False to stop features from being added to the layer.
+     */
+    cacheFeatures: function(event) {
+        var propagate = true;
+        if(!this.clustering) {
+            this.clearCache();
+            this.features = event.features;
+            this.cluster();
+            propagate = false;
+        }
+        return propagate;
+    },
+    
+    /**
+     * Method: clearCache
+     * Clear out the cached features.
+     */
+    clearCache: function() {
+        this.features = null;
+    },
+    
+    /**
+     * Method: cluster
+     * Cluster features based on some threshold distance.
+     *
+     * Parameters:
+     * event - {Object} The event received when cluster is called as a
+     *     result of a moveend event.
+     */
+    cluster: function(event) {
+        if((!event || event.zoomChanged) && this.features) {
+            var resolution = this.layer.map.getResolution();
+            if(resolution != this.resolution || !this.clustersExist()) {
+                this.resolution = resolution;
+                var clusters = [];
+                var feature, clustered, cluster;
+                for(var i=0; i<this.features.length; ++i) {
+                    feature = this.features[i];
+                    if(feature.geometry) {
+                        clustered = false;
+                        for(var j=clusters.length-1; j>=0; --j) {
+                            cluster = clusters[j];
+                            if(this.shouldCluster(cluster, feature)) {
+                                this.addToCluster(cluster, feature);
+                                clustered = true;
+                                break;
+                            }
+                        }
+                        if(!clustered) {
+                            clusters.push(this.createCluster(this.features[i]));
+                        }
+                    }
+                }
+                this.layer.removeAllFeatures();
+                if(clusters.length > 0) {
+                    if(this.threshold > 1) {
+                        var clone = clusters.slice();
+                        clusters = [];
+                        var candidate;
+                        for(var i=0, len=clone.length; i<len; ++i) {
+                            candidate = clone[i];
+                            if(candidate.attributes.count < this.threshold) {
+                                Array.prototype.push.apply(clusters, candidate.cluster);
+                            } else {
+                                clusters.push(candidate);
+                            }
+                        }
+                    }
+                    this.clustering = true;
+                    // A legitimate feature addition could occur during this
+                    // addFeatures call.  For clustering to behave well, features
+                    // should be removed from a layer before requesting a new batch.
+                    this.layer.addFeatures(clusters);
+                    this.clustering = false;
+                }
+                this.clusters = clusters;
+            }
+        }
+    },
+    
+    /**
+     * Method: clustersExist
+     * Determine whether calculated clusters are already on the layer.
+     *
+     * Returns:
+     * {Boolean} The calculated clusters are already on the layer.
+     */
+    clustersExist: function() {
+        var exist = false;
+        if(this.clusters && this.clusters.length > 0 &&
+           this.clusters.length == this.layer.features.length) {
+            exist = true;
+            for(var i=0; i<this.clusters.length; ++i) {
+                if(this.clusters[i] != this.layer.features[i]) {
+                    exist = false;
+                    break;
+                }
+            }
+        }
+        return exist;
+    },
+    
+    /**
+     * Method: shouldCluster
+     * Determine whether to include a feature in a given cluster.
+     *
+     * Parameters:
+     * cluster - {<OpenLayers.Feature.Vector>} A cluster.
+     * feature - {<OpenLayers.Feature.Vector>} A feature.
+     *
+     * Returns:
+     * {Boolean} The feature should be included in the cluster.
+     */
+    shouldCluster: function(cluster, feature) {
+        var cc = cluster.geometry.getBounds().getCenterLonLat();
+        var fc = feature.geometry.getBounds().getCenterLonLat();
+        var distance = (
+            Math.sqrt(
+                Math.pow((cc.lon - fc.lon), 2) + Math.pow((cc.lat - fc.lat), 2)
+            ) / this.resolution
+        );
+        return (distance <= this.distance);
+    },
+    
+    /**
+     * Method: addToCluster
+     * Add a feature to a cluster.
+     *
+     * Parameters:
+     * cluster - {<OpenLayers.Feature.Vector>} A cluster.
+     * feature - {<OpenLayers.Feature.Vector>} A feature.
+     */
+    addToCluster: function(cluster, feature) {
+        cluster.cluster.push(feature);
+        cluster.attributes.count += 1;
+    },
+    
+    /**
+     * Method: createCluster
+     * Given a feature, create a cluster.
+     *
+     * Parameters:
+     * feature - {<OpenLayers.Feature.Vector>}
+     *
+     * Returns:
+     * {<OpenLayers.Feature.Vector>} A cluster.
+     */
+    createCluster: function(feature) {
+        var center = feature.geometry.getBounds().getCenterLonLat();
+        var cluster = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(center.lon, center.lat),
+            {count: 1}
+        );
+        cluster.cluster = [feature];
+        return cluster;
+    },
+
+    CLASS_NAME: "OpenLayers.Strategy.Cluster" 
+});
diff --git a/lib/OpenLayers/Strategy/Filter.js b/lib/OpenLayers/Strategy/Filter.js
new file mode 100644
index 0000000..3ade24a
--- /dev/null
+++ b/lib/OpenLayers/Strategy/Filter.js
@@ -0,0 +1,164 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Strategy.js
+ * @requires OpenLayers/Filter.js
+ */
+
+/**
+ * Class: OpenLayers.Strategy.Filter
+ * Strategy for limiting features that get added to a layer by 
+ *     evaluating a filter.  The strategy maintains a cache of
+ *     all features until removeFeatures is called on the layer.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Strategy>
+ */
+OpenLayers.Strategy.Filter = OpenLayers.Class(OpenLayers.Strategy, {
+    
+    /**
+     * APIProperty: filter
+     * {<OpenLayers.Filter>}  Filter for limiting features sent to the layer.
+     *     Use the <setFilter> method to update this filter after construction.
+     */
+    filter: null,
+    
+    /**
+     * Property: cache
+     * {Array(<OpenLayers.Feature.Vector>)} List of currently cached
+     *     features.
+     */
+    cache: null,
+    
+    /**
+     * Property: caching
+     * {Boolean} The filter is currently caching features.
+     */
+    caching: false,
+    
+    /**
+     * Constructor: OpenLayers.Strategy.Filter
+     * Create a new filter strategy.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.  Strategy must be constructed with at least a <filter> 
+     *     property.
+     */
+    initialize: function(options) {
+        OpenLayers.Strategy.prototype.initialize.apply(this, [options]);
+        if (!this.filter || !(this.filter instanceof OpenLayers.Filter)) {
+            throw new Error("Filter strategy must be constructed with a filter");
+        }
+    },
+
+    /**
+     * APIMethod: activate
+     * Activate the strategy.  Register any listeners, do appropriate setup.
+     *     By default, this strategy automatically activates itself when a layer
+     *     is added to a map.
+     *
+     * Returns:
+     * {Boolean} True if the strategy was successfully activated or false if
+     *      the strategy was already active.
+     */
+    activate: function() {
+        var activated = OpenLayers.Strategy.prototype.activate.apply(this, arguments);
+        if (activated) {
+            this.cache = [];
+            this.layer.events.on({
+                "beforefeaturesadded": this.handleAdd,
+                "beforefeaturesremoved": this.handleRemove,
+                scope: this
+            });
+        }
+        return activated;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivate the strategy.  Clear the feature cache.
+     *
+     * Returns:
+     * {Boolean} True if the strategy was successfully deactivated or false if
+     *      the strategy was already inactive.
+     */
+    deactivate: function() {
+        this.cache = null;
+        if (this.layer && this.layer.events) {
+            this.layer.events.un({
+                "beforefeaturesadded": this.handleAdd,
+                "beforefeaturesremoved": this.handleRemove,
+                scope: this
+            });            
+        }
+        return OpenLayers.Strategy.prototype.deactivate.apply(this, arguments);
+    },
+    
+    /**
+     * Method: handleAdd
+     */
+    handleAdd: function(event) {
+        if (!this.caching) {
+            var features = event.features;
+            event.features = [];
+            var feature;
+            for (var i=0, ii=features.length; i<ii; ++i) {
+                feature = features[i];
+                if (this.filter.evaluate(feature)) {
+                    event.features.push(feature);
+                } else {
+                    this.cache.push(feature);
+                }
+            }
+        }
+    },
+    
+    /**
+     * Method: handleRemove
+     */
+    handleRemove: function(event) {
+        if (!this.caching) {
+            this.cache = [];
+        }
+    },
+
+    /** 
+     * APIMethod: setFilter
+     * Update the filter for this strategy.  This will re-evaluate
+     *     any features on the layer and in the cache.  Only features
+     *     for which filter.evalute(feature) returns true will be
+     *     added to the layer.  Others will be cached by the strategy.
+     *
+     * Parameters:
+     * filter - <OpenLayers.Filter> A filter for evaluating features.
+     */
+    setFilter: function(filter) {
+        this.filter = filter;
+        var previousCache = this.cache;
+        this.cache = [];
+        // look through layer for features to remove from layer
+        this.handleAdd({features: this.layer.features});
+        // cache now contains features to remove from layer
+        if (this.cache.length > 0) {
+            this.caching = true;
+            this.layer.removeFeatures(this.cache.slice(), {silent: true});
+            this.caching = false;
+        }
+        // now look through previous cache for features to add to layer
+        if (previousCache.length > 0) {
+            var event = {features: previousCache};
+            this.handleAdd(event);
+            // event has features to add to layer
+            this.caching = true;
+            this.layer.addFeatures(event.features, {silent: true});
+            this.caching = false;
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Strategy.Filter"
+
+});
diff --git a/lib/OpenLayers/Strategy/Fixed.js b/lib/OpenLayers/Strategy/Fixed.js
new file mode 100644
index 0000000..0f77e25
--- /dev/null
+++ b/lib/OpenLayers/Strategy/Fixed.js
@@ -0,0 +1,138 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Strategy.js
+ */
+
+/**
+ * Class: OpenLayers.Strategy.Fixed
+ * A simple strategy that requests features once and never requests new data.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Strategy>
+ */
+OpenLayers.Strategy.Fixed = OpenLayers.Class(OpenLayers.Strategy, {
+    
+    /**
+     * APIProperty: preload
+     * {Boolean} Load data before layer made visible. Enabling this may result
+     *   in considerable overhead if your application loads many data layers
+     *   that are not visible by default. Default is false.
+     */
+    preload: false,
+
+    /**
+     * Constructor: OpenLayers.Strategy.Fixed
+     * Create a new Fixed strategy.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Strategy.prototype.initialize.apply(this, [options]);
+    },
+
+    /**
+     * APIMethod: destroy
+     * Clean up the strategy.
+     */
+    destroy: function() {
+        OpenLayers.Strategy.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * Method: activate
+     * Activate the strategy: load data or add listener to load when visible
+     *
+     * Returns:
+     * {Boolean} True if the strategy was successfully activated or false if
+     *      the strategy was already active.
+     */
+    activate: function() {
+        if(OpenLayers.Strategy.prototype.activate.apply(this, arguments)) {
+            this.layer.events.on({
+                "refresh": this.load,
+                scope: this
+            });
+            if(this.layer.visibility == true || this.preload) {
+                this.load();
+            } else {
+                this.layer.events.on({
+                    "visibilitychanged": this.load,
+                    scope: this
+                });
+            }
+            return true;
+        }
+        return false;
+    },
+    
+    /**
+     * Method: deactivate
+     * Deactivate the strategy.  Undo what is done in <activate>.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this);
+        if(deactivated) {
+            this.layer.events.un({
+                "refresh": this.load,
+                "visibilitychanged": this.load,
+                scope: this
+            });
+        }
+        return deactivated;
+    },
+
+    /**
+     * Method: load
+     * Tells protocol to load data and unhooks the visibilitychanged event
+     *
+     * Parameters:
+     * options - {Object} options to pass to protocol read.
+     */
+    load: function(options) {
+        this.layer.events.triggerEvent("loadstart");
+        this.layer.protocol.read(OpenLayers.Util.applyDefaults({
+            callback: this.merge,
+            filter: this.layer.filter,
+            scope: this
+        }, options));
+        this.layer.events.un({
+            "visibilitychanged": this.load,
+            scope: this
+        });
+    },
+
+    /**
+     * Method: merge
+     * Add all features to the layer.
+     */
+    merge: function(resp) {
+        this.layer.destroyFeatures();
+        var features = resp.features;
+        if (features && features.length > 0) {
+            var remote = this.layer.projection;
+            var local = this.layer.map.getProjectionObject();
+            if(!local.equals(remote)) {
+                var geom;
+                for(var i=0, len=features.length; i<len; ++i) {
+                    geom = features[i].geometry;
+                    if(geom) {
+                        geom.transform(remote, local);
+                    }
+                }
+            }
+            this.layer.addFeatures(features);
+        }
+        this.layer.events.triggerEvent("loadend");
+    },
+
+    CLASS_NAME: "OpenLayers.Strategy.Fixed"
+});
diff --git a/lib/OpenLayers/Strategy/Paging.js b/lib/OpenLayers/Strategy/Paging.js
new file mode 100644
index 0000000..fdf89e5
--- /dev/null
+++ b/lib/OpenLayers/Strategy/Paging.js
@@ -0,0 +1,236 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Strategy.js
+ */
+
+/**
+ * Class: OpenLayers.Strategy.Paging
+ * Strategy for vector feature paging
+ *
+ * Inherits from:
+ *  - <OpenLayers.Strategy>
+ */
+OpenLayers.Strategy.Paging = OpenLayers.Class(OpenLayers.Strategy, {
+    
+    /**
+     * Property: features
+     * {Array(<OpenLayers.Feature.Vector>)} Cached features.
+     */
+    features: null,
+    
+    /**
+     * Property: length
+     * {Integer} Number of features per page.  Default is 10.
+     */
+    length: 10,
+    
+    /**
+     * Property: num
+     * {Integer} The currently displayed page number.
+     */
+    num: null,
+    
+    /**
+     * Property: paging
+     * {Boolean} The strategy is currently changing pages.
+     */
+    paging: false,
+
+    /**
+     * Constructor: OpenLayers.Strategy.Paging
+     * Create a new paging strategy.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Strategy.prototype.initialize.apply(this, [options]);
+    },
+    
+    /**
+     * APIMethod: activate
+     * Activate the strategy.  Register any listeners, do appropriate setup.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully activated.
+     */
+    activate: function() {
+        var activated = OpenLayers.Strategy.prototype.activate.call(this);
+        if(activated) {
+            this.layer.events.on({
+                "beforefeaturesadded": this.cacheFeatures,
+                scope: this
+            });
+        }
+        return activated;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivate the strategy.  Unregister any listeners, do appropriate
+     *     tear-down.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this);
+        if(deactivated) {
+            this.clearCache();
+            this.layer.events.un({
+                "beforefeaturesadded": this.cacheFeatures,
+                scope: this
+            });
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: cacheFeatures
+     * Cache features before they are added to the layer.
+     *
+     * Parameters:
+     * event - {Object} The event that this was listening for.  This will come
+     *     with a batch of features to be paged.
+     */
+    cacheFeatures: function(event) {
+        if(!this.paging) {
+            this.clearCache();
+            this.features = event.features;
+            this.pageNext(event);
+        }
+    },
+    
+    /**
+     * Method: clearCache
+     * Clear out the cached features.  This destroys features, assuming
+     *     nothing else has a reference.
+     */
+    clearCache: function() {
+        if(this.features) {
+            for(var i=0; i<this.features.length; ++i) {
+                this.features[i].destroy();
+            }
+        }
+        this.features = null;
+        this.num = null;
+    },
+    
+    /**
+     * APIMethod: pageCount
+     * Get the total count of pages given the current cache of features.
+     *
+     * Returns:
+     * {Integer} The page count.
+     */
+    pageCount: function() {
+        var numFeatures = this.features ? this.features.length : 0;
+        return Math.ceil(numFeatures / this.length);
+    },
+
+    /**
+     * APIMethod: pageNum
+     * Get the zero based page number.
+     *
+     * Returns:
+     * {Integer} The current page number being displayed.
+     */
+    pageNum: function() {
+        return this.num;
+    },
+
+    /**
+     * APIMethod: pageLength
+     * Gets or sets page length.
+     *
+     * Parameters:
+     * newLength: {Integer} Optional length to be set.
+     *
+     * Returns:
+     * {Integer} The length of a page (number of features per page).
+     */
+    pageLength: function(newLength) {
+        if(newLength && newLength > 0) {
+            this.length = newLength;
+        }
+        return this.length;
+    },
+
+    /**
+     * APIMethod: pageNext
+     * Display the next page of features.
+     *
+     * Returns:
+     * {Boolean} A new page was displayed.
+     */
+    pageNext: function(event) {
+        var changed = false;
+        if(this.features) {
+            if(this.num === null) {
+                this.num = -1;
+            }
+            var start = (this.num + 1) * this.length;
+            changed = this.page(start, event);
+        }
+        return changed;
+    },
+
+    /**
+     * APIMethod: pagePrevious
+     * Display the previous page of features.
+     *
+     * Returns:
+     * {Boolean} A new page was displayed.
+     */
+    pagePrevious: function() {
+        var changed = false;
+        if(this.features) {
+            if(this.num === null) {
+                this.num = this.pageCount();
+            }
+            var start = (this.num - 1) * this.length;
+            changed = this.page(start);
+        }
+        return changed;
+    },
+    
+    /**
+     * Method: page
+     * Display the page starting at the given index from the cache.
+     *
+     * Returns:
+     * {Boolean} A new page was displayed.
+     */
+    page: function(start, event) {
+        var changed = false;
+        if(this.features) {
+            if(start >= 0 && start < this.features.length) {
+                var num = Math.floor(start / this.length);
+                if(num != this.num) {
+                    this.paging = true;
+                    var features = this.features.slice(start, start + this.length);
+                    this.layer.removeFeatures(this.layer.features);
+                    this.num = num;
+                    // modify the event if any
+                    if(event && event.features) {
+                        // this.was called by an event listener
+                        event.features = features;
+                    } else {
+                        // this was called directly on the strategy
+                        this.layer.addFeatures(features);
+                    }
+                    this.paging = false;
+                    changed = true;
+                }
+            }
+        }
+        return changed;
+    },
+    
+    CLASS_NAME: "OpenLayers.Strategy.Paging" 
+});
diff --git a/lib/OpenLayers/Strategy/Refresh.js b/lib/OpenLayers/Strategy/Refresh.js
new file mode 100644
index 0000000..398c110
--- /dev/null
+++ b/lib/OpenLayers/Strategy/Refresh.js
@@ -0,0 +1,140 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Strategy.js
+ */
+
+/**
+ * Class: OpenLayers.Strategy.Refresh
+ * A strategy that refreshes the layer. By default the strategy waits for a
+ *     call to <refresh> before refreshing.  By configuring the strategy with 
+ *     the <interval> option, refreshing can take place automatically.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Strategy>
+ */
+OpenLayers.Strategy.Refresh = OpenLayers.Class(OpenLayers.Strategy, {
+    
+    /**
+     * Property: force
+     * {Boolean} Force a refresh on the layer. Default is false.
+     */
+    force: false,
+
+    /**
+     * Property: interval
+     * {Number} Auto-refresh. Default is 0.  If > 0, layer will be refreshed 
+     *     every N milliseconds.
+     */
+    interval: 0,
+    
+    /**
+     * Property: timer
+     * {Number} The id of the timer.
+     */
+    timer: null,
+
+    /**
+     * Constructor: OpenLayers.Strategy.Refresh
+     * Create a new Refresh strategy.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Strategy.prototype.initialize.apply(this, [options]);
+    },
+   
+    /**
+     * APIMethod: activate
+     * Activate the strategy. Register any listeners, do appropriate setup.
+     * 
+     * Returns:
+     * {Boolean} True if the strategy was successfully activated.
+     */
+    activate: function() {
+        var activated = OpenLayers.Strategy.prototype.activate.call(this);
+        if(activated) {
+            if(this.layer.visibility === true) {
+                this.start();
+            } 
+            this.layer.events.on({
+                "visibilitychanged": this.reset,
+                scope: this
+            });
+        }
+        return activated;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivate the strategy. Unregister any listeners, do appropriate
+     *     tear-down.
+     * 
+     * Returns:
+     * {Boolean} True if the strategy was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this);
+        if(deactivated) {
+            this.stop();
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: reset
+     * Start or cancel the refresh interval depending on the visibility of 
+     *     the layer.
+     */
+    reset: function() {
+        if(this.layer.visibility === true) {
+            this.start();
+        } else {
+            this.stop();
+        }
+    },
+    
+    /**
+     * Method: start
+     * Start the refresh interval. 
+     */
+    start: function() {
+        if(this.interval && typeof this.interval === "number" && 
+            this.interval > 0) {
+
+            this.timer = window.setInterval(
+                OpenLayers.Function.bind(this.refresh, this),
+                this.interval);
+        }
+    },
+    
+    /**
+     * APIMethod: refresh
+     * Tell the strategy to refresh which will refresh the layer.
+     */
+    refresh: function() {
+        if (this.layer && this.layer.refresh && 
+            typeof this.layer.refresh == "function") {
+
+            this.layer.refresh({force: this.force});
+        }
+    },
+   
+    /**
+     * Method: stop
+     * Cancels the refresh interval. 
+     */
+    stop: function() {
+        if(this.timer !== null) {
+            window.clearInterval(this.timer);
+            this.timer = null;
+        }
+    },
+    
+    CLASS_NAME: "OpenLayers.Strategy.Refresh" 
+});
diff --git a/lib/OpenLayers/Strategy/Save.js b/lib/OpenLayers/Strategy/Save.js
new file mode 100644
index 0000000..e151cf5
--- /dev/null
+++ b/lib/OpenLayers/Strategy/Save.js
@@ -0,0 +1,229 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Strategy.js
+ */
+
+/**
+ * Class: OpenLayers.Strategy.Save
+ * A strategy that commits newly created or modified features.  By default
+ *     the strategy waits for a call to <save> before persisting changes.  By
+ *     configuring the strategy with the <auto> option, changes can be saved
+ *     automatically.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Strategy>
+ */
+OpenLayers.Strategy.Save = OpenLayers.Class(OpenLayers.Strategy, {
+    
+    /**
+     * Constant: EVENT_TYPES
+     * {Array(String)} Supported application event types.  Register a listener
+     *     for a particular event with the following syntax:
+     * (code)
+     * strategy.events.register(type, obj, listener);
+     * (end)
+     *
+     *  - *start* Triggered before saving
+     *  - *success* Triggered after a successful transaction
+     *  - *fail* Triggered after a failed transaction
+     *      
+     */
+    EVENT_TYPES: ["start", "success", "fail"],
+ 
+    /** 
+     * Property: events
+     * {<OpenLayers.Events>} Events instance for triggering this protocol
+     *    events.
+     */
+    events: null,
+    
+    /**
+     * APIProperty: auto
+     * {Boolean | Number} Auto-save.  Default is false.  If true, features will be
+     *     saved immediately after being added to the layer and with each
+     *     modification or deletion.  If auto is a number, features will be
+     *     saved on an interval provided by the value (in seconds).
+     */
+    auto: false,
+    
+    /**
+     * Property: timer
+     * {Number} The id of the timer.
+     */
+    timer: null,
+
+    /**
+     * Constructor: OpenLayers.Strategy.Save
+     * Create a new Save strategy.
+     *
+     * Parameters:
+     * options - {Object} Optional object whose properties will be set on the
+     *     instance.
+     */
+    initialize: function(options) {
+        OpenLayers.Strategy.prototype.initialize.apply(this, [options]);
+        this.events = new OpenLayers.Events(this, null, this.EVENT_TYPES);
+    },
+   
+    /**
+     * APIMethod: activate
+     * Activate the strategy.  Register any listeners, do appropriate setup.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully activated.
+     */
+    activate: function() {
+        var activated = OpenLayers.Strategy.prototype.activate.call(this);
+        if(activated) {
+            if(this.auto) {
+                if(typeof this.auto === "number") {
+                    this.timer = window.setInterval(
+                        OpenLayers.Function.bind(this.save, this),
+                        this.auto * 1000
+                    );
+                } else {
+                    this.layer.events.on({
+                        "featureadded": this.triggerSave,
+                        "afterfeaturemodified": this.triggerSave,
+                        scope: this
+                    });
+                }
+            }
+        }
+        return activated;
+    },
+    
+    /**
+     * APIMethod: deactivate
+     * Deactivate the strategy.  Unregister any listeners, do appropriate
+     *     tear-down.
+     * 
+     * Returns:
+     * {Boolean} The strategy was successfully deactivated.
+     */
+    deactivate: function() {
+        var deactivated = OpenLayers.Strategy.prototype.deactivate.call(this);
+        if(deactivated) {
+            if(this.auto) {
+                if(typeof this.auto === "number") {
+                    window.clearInterval(this.timer);
+                } else {
+                    this.layer.events.un({
+                        "featureadded": this.triggerSave,
+                        "afterfeaturemodified": this.triggerSave,
+                        scope: this
+                    });
+                }
+            }
+        }
+        return deactivated;
+    },
+    
+    /**
+     * Method: triggerSave
+     * Registered as a listener.  Calls save if a feature has insert, update,
+     *     or delete state.
+     *
+     * Parameters:
+     * event - {Object} The event this function is listening for.
+     */
+    triggerSave: function(event) {
+        var feature = event.feature;
+        if(feature.state === OpenLayers.State.INSERT ||
+           feature.state === OpenLayers.State.UPDATE ||
+           feature.state === OpenLayers.State.DELETE) {
+            this.save([event.feature]);
+        }
+    },
+    
+    /**
+     * APIMethod: save
+     * Tell the layer protocol to commit unsaved features.  If the layer
+     *     projection differs from the map projection, features will be
+     *     transformed into the layer projection before being committed.
+     *
+     * Parameters:
+     * features - {Array} Features to be saved.  If null, then default is all
+     *     features in the layer.  Features are assumed to be in the map
+     *     projection.
+     */
+    save: function(features) {
+        if(!features) {
+            features = this.layer.features;
+        }
+        this.events.triggerEvent("start", {features:features});
+        var remote = this.layer.projection;
+        var local = this.layer.map.getProjectionObject();
+        if(!local.equals(remote)) {
+            var len = features.length;
+            var clones = new Array(len);
+            var orig, clone;
+            for(var i=0; i<len; ++i) {
+                orig = features[i];
+                clone = orig.clone();
+                clone.fid = orig.fid;
+                clone.state = orig.state;
+                if(orig.url) {
+                    clone.url = orig.url;
+                }
+                clone._original = orig;
+                clone.geometry.transform(local, remote);
+                clones[i] = clone;
+            }
+            features = clones;
+        }
+        this.layer.protocol.commit(features, {
+            callback: this.onCommit,
+            scope: this
+        });
+    },
+    
+    /**
+     * Method: onCommit
+     * Called after protocol commit.
+     *
+     * Parameters:
+     * response - {<OpenLayers.Protocol.Response>} A response object.
+     */
+    onCommit: function(response) {
+        var evt = {"response": response};
+        if(response.success()) {
+            var features = response.reqFeatures;
+            // deal with inserts, updates, and deletes
+            var state, feature;
+            var destroys = [];
+            var insertIds = response.insertIds || [];
+            var j = 0;
+            for(var i=0, len=features.length; i<len; ++i) {
+                feature = features[i];
+                // if projection was different, we may be dealing with clones
+                feature = feature._original || feature;
+                state = feature.state;
+                if(state) {
+                    if(state == OpenLayers.State.DELETE) {
+                        destroys.push(feature);
+                    } else if(state == OpenLayers.State.INSERT) {
+                        feature.fid = insertIds[j];
+                        ++j;
+                    }
+                    feature.state = null;
+                }
+            }
+
+            if(destroys.length > 0) {
+                this.layer.destroyFeatures(destroys);
+            }
+
+            this.events.triggerEvent("success", evt);
+
+        } else {
+            this.events.triggerEvent("fail", evt);
+        }
+    },
+   
+    CLASS_NAME: "OpenLayers.Strategy.Save" 
+});
diff --git a/lib/OpenLayers/Style.js b/lib/OpenLayers/Style.js
new file mode 100644
index 0000000..d9d6d5d
--- /dev/null
+++ b/lib/OpenLayers/Style.js
@@ -0,0 +1,443 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Util.js
+ * @requires OpenLayers/Feature/Vector.js
+ */
+
+/**
+ * Class: OpenLayers.Style
+ * This class represents a UserStyle obtained
+ *     from a SLD, containing styling rules.
+ */
+OpenLayers.Style = OpenLayers.Class({
+
+    /**
+     * Property: id
+     * {String} A unique id for this session.
+     */
+    id: null,
+    
+    /**
+     * APIProperty: name
+     * {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)
+     */
+    description: null,
+
+    /**
+     * APIProperty: layerName
+     * {<String>} name of the layer that this style belongs to, usually
+     * according to the NamedLayer attribute of an SLD document.
+     */
+    layerName: null,
+    
+    /**
+     * APIProperty: isDefault
+     * {Boolean}
+     */
+    isDefault: false,
+     
+    /** 
+     * Property: rules 
+     * {Array(<OpenLayers.Rule>)}
+     */
+    rules: null,
+    
+    /**
+     * Property: context
+     * {Object} An optional object with properties that symbolizers' property
+     * values should be evaluated against. If no context is specified,
+     * feature.attributes will be used
+     */
+    context: null,
+
+    /**
+     * Property: defaultStyle
+     * {Object} hash of style properties to use as default for merging
+     * rule-based style symbolizers onto. If no rules are defined,
+     * createSymbolizer will return this style. If <defaultsPerSymbolizer> is set to
+     * true, the defaultStyle will only be taken into account if there are
+     * rules defined.
+     */
+    defaultStyle: null,
+    
+    /**
+     * Property: defaultsPerSymbolizer
+     * {Boolean} If set to true, the <defaultStyle> will extend the symbolizer
+     * of every rule. Properties of the <defaultStyle> will also be used to set
+     * missing symbolizer properties if the symbolizer has stroke, fill or
+     * 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.
+     *
+     * Parameters:
+     * style        - {Object} Optional hash of style properties that will be
+     *                used as default style for this style object. This style
+     *                applies if no rules are specified. Symbolizers defined in
+     *                rules will extend this default style.
+     * options - {Object} An optional object with properties to set on the
+     *     style.
+     *
+     * Valid options:
+     * rules - {Array(<OpenLayers.Rule>)} List of rules to be added to the
+     *     style.
+     * 
+     * Return:
+     * {<OpenLayers.Style>}
+     */
+    initialize: function(style, options) {
+
+        OpenLayers.Util.extend(this, options);
+        this.rules = [];
+        if(options && options.rules) {
+            this.addRules(options.rules);
+        }
+
+        // use the default style from OpenLayers.Feature.Vector if no style
+        // was given in the constructor
+        this.setDefaultStyle(style ||
+                             OpenLayers.Feature.Vector.style["default"]);
+
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
+    },
+
+    /** 
+     * APIMethod: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+        for (var i=0, len=this.rules.length; i<len; i++) {
+            this.rules[i].destroy();
+            this.rules[i] = null;
+        }
+        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;
+        var elseRules = [];
+        var appliedRules = false;
+        for(var i=0, len=rules.length; i<len; i++) {
+            rule = rules[i];
+            // does the rule apply?
+            var applies = rule.evaluate(feature);
+            
+            if(applies) {
+                if(rule instanceof OpenLayers.Rule && rule.elseFilter) {
+                    elseRules.push(rule);
+                } else {
+                    appliedRules = true;
+                    this.applySymbolizer(rule, style, feature);
+                }
+            }
+        }
+        
+        // if no other rules apply, apply the rules with else filters
+        if(appliedRules == false && elseRules.length > 0) {
+            appliedRules = true;
+            for(var i=0, len=elseRules.length; i<len; i++) {
+                this.applySymbolizer(elseRules[i], style, feature);
+            }
+        }
+
+        // don't display if there were rules but none applied
+        if(rules.length > 0 && appliedRules == false) {
+            style.display = "none";
+        }
+        
+        return style;
+    },
+    
+    /**
+     * Method: applySymbolizer
+     *
+     * Parameters:
+     * rule - {OpenLayers.Rule}
+     * style - {Object}
+     * feature - {<OpenLayer.Feature.Vector>}
+     *
+     * Returns:
+     * {Object} A style with new symbolizer applied.
+     */
+    applySymbolizer: function(rule, style, feature) {
+        var symbolizerPrefix = feature.geometry ?
+                this.getSymbolizerPrefix(feature.geometry) :
+                OpenLayers.Style.SYMBOLIZER_PREFIXES[0];
+
+        var symbolizer = rule.symbolizer[symbolizerPrefix] || rule.symbolizer;
+        
+        if(this.defaultsPerSymbolizer === true) {
+            var defaults = this.defaultStyle;
+            OpenLayers.Util.applyDefaults(symbolizer, {
+                pointRadius: defaults.pointRadius
+            });
+            if(symbolizer.stroke === true || symbolizer.graphic === true) {
+                OpenLayers.Util.applyDefaults(symbolizer, {
+                    strokeWidth: defaults.strokeWidth,
+                    strokeColor: defaults.strokeColor,
+                    strokeOpacity: defaults.strokeOpacity,
+                    strokeDashstyle: defaults.strokeDashstyle,
+                    strokeLinecap: defaults.strokeLinecap
+                });
+            }
+            if(symbolizer.fill === true || symbolizer.graphic === true) {
+                OpenLayers.Util.applyDefaults(symbolizer, {
+                    fillColor: defaults.fillColor,
+                    fillOpacity: defaults.fillOpacity
+                });
+            }
+            if(symbolizer.graphic === true) {
+                OpenLayers.Util.applyDefaults(symbolizer, {
+                    pointRadius: this.defaultStyle.pointRadius,
+                    externalGraphic: this.defaultStyle.externalGraphic,
+                    graphicName: this.defaultStyle.graphicName,
+                    graphicOpacity: this.defaultStyle.graphicOpacity,
+                    graphicWidth: this.defaultStyle.graphicWidth,
+                    graphicHeight: this.defaultStyle.graphicHeight,
+                    graphicXOffset: this.defaultStyle.graphicXOffset,
+                    graphicYOffset: this.defaultStyle.graphicYOffset
+                });
+            }
+        }
+
+        // merge the style with the current style
+        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 = OpenLayers.Util.extend({}, feature.attributes || feature.data);
+        OpenLayers.Util.extend(context, this.context);
+        
+        for (var i in this.propertyStyles) {
+            style[i] = OpenLayers.Style.createLiteral(style[i], context, feature, i);
+        }
+        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;
+     */
+    findPropertyStyles: function() {
+        var propertyStyles = {};
+
+        // check the default style
+        var style = this.defaultStyle;
+        this.addPropertyStyles(propertyStyles, style);
+
+        // walk through all rules to check for properties in their symbolizer
+        var rules = this.rules;
+        var symbolizer, value;
+        for (var i=0, len=rules.length; i<len; i++) {
+            symbolizer = rules[i].symbolizer;
+            for (var key in symbolizer) {
+                value = symbolizer[key];
+                if (typeof value == "object") {
+                    // symbolizer key is "Point", "Line" or "Polygon"
+                    this.addPropertyStyles(propertyStyles, value);
+                } else {
+                    // symbolizer is a hash of style properties
+                    this.addPropertyStyles(propertyStyles, symbolizer);
+                    break;
+                }
+            }
+        }
+        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
+     */
+    addPropertyStyles: function(propertyStyles, symbolizer) {
+        var property;
+        for (var key in symbolizer) {
+            property = symbolizer[key];
+            if (typeof property == "string" &&
+                    property.match(/\$\{\w+\}/)) {
+                propertyStyles[key] = true;
+            }
+        }
+        return propertyStyles;
+    },
+    
+    /**
+     * APIMethod: addRules
+     * Adds rules to this style.
+     * 
+     * Parameters:
+     * rules - {Array(<OpenLayers.Rule>)}
+     */
+    addRules: function(rules) {
+        Array.prototype.push.apply(this.rules, 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.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
+     */
+    getSymbolizerPrefix: function(geometry) {
+        var prefixes = OpenLayers.Style.SYMBOLIZER_PREFIXES;
+        for (var i=0, len=prefixes.length; i<len; i++) {
+            if (geometry.CLASS_NAME.indexOf(prefixes[i]) != -1) {
+                return prefixes[i];
+            }
+        }
+    },
+    
+    /**
+     * APIMethod: clone
+     * Clones this style.
+     * 
+     * Returns:
+     * {<OpenLayers.Style>} Clone of this style.
+     */
+    clone: function() {
+        var options = OpenLayers.Util.extend({}, this);
+        // clone rules
+        if(this.rules) {
+            options.rules = [];
+            for(var i=0, len=this.rules.length; i<len; ++i) {
+                options.rules.push(this.rules[i].clone());
+            }
+        }
+        // clone context
+        options.context = this.context && OpenLayers.Util.extend({}, this.context);
+        //clone default style
+        var defaultStyle = OpenLayers.Util.extend({}, this.defaultStyle);
+        return new OpenLayers.Style(defaultStyle, options);
+    },
+    
+    CLASS_NAME: "OpenLayers.Style"
+});
+
+
+/**
+ * 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}"
+ *         will be replaced by the value of the "bar" attribute of the passed
+ *         feature.
+ * context - {Object} context to take attribute values from
+ * feature - {<OpenLayers.Feature.Vector>} optional feature to pass to
+ *           <OpenLayers.String.format> for evaluating functions in the
+ *           context.
+ * property - {String} optional, name of the property for which the literal is
+ *            being created 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
+ * attribute named "bar" with the value "valueOfBar".
+ */
+OpenLayers.Style.createLiteral = function(value, context, feature, property) {
+    if (typeof value == "string" && value.indexOf("${") != -1) {
+        value = OpenLayers.String.format(value, context, [feature, property]);
+        value = (isNaN(value) || !value) ? value : parseFloat(value);
+    }
+    return value;
+};
+    
+/**
+ * Constant: OpenLayers.Style.SYMBOLIZER_PREFIXES
+ * {Array} prefixes of the sld symbolizers. These are the
+ * same as the main geometry types
+ */
+OpenLayers.Style.SYMBOLIZER_PREFIXES = ['Point', 'Line', 'Polygon', 'Text',
+    'Raster'];
diff --git a/lib/OpenLayers/Style2.js b/lib/OpenLayers/Style2.js
new file mode 100644
index 0000000..2c4bdbc
--- /dev/null
+++ b/lib/OpenLayers/Style2.js
@@ -0,0 +1,111 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Rule.js
+ * @requires OpenLayers/Symbolizer/Point.js
+ * @requires OpenLayers/Symbolizer/Line.js
+ * @requires OpenLayers/Symbolizer/Polygon.js
+ * @requires OpenLayers/Symbolizer/Text.js
+ * @requires OpenLayers/Symbolizer/Raster.js
+ */
+
+/**
+ * Class: OpenLayers.Style2
+ * This class represents a collection of rules for rendering features.
+ */
+OpenLayers.Style2 = OpenLayers.Class({
+
+    /**
+     * Property: id
+     * {String} A unique id for this session.
+     */
+    id: null,
+    
+    /**
+     * APIProperty: name
+     * {String} Style identifier.
+     */
+    name: null,
+    
+    /**
+     * APIProperty: title
+     * {String} Title of this style.
+     */
+    title: null,
+    
+    /**
+     * APIProperty: description
+     * {String} Description of this style.
+     */
+    description: null,
+
+    /**
+     * APIProperty: layerName
+     * {<String>} Name of the layer that this style belongs to, usually
+     *     according to the NamedLayer attribute of an SLD document.
+     */
+    layerName: null,
+    
+    /**
+     * APIProperty: isDefault
+     * {Boolean}
+     */
+    isDefault: false,
+     
+    /** 
+     * APIProperty: rules 
+     * {Array(<OpenLayers.Rule>)} Collection of rendering rules.
+     */
+    rules: null,
+    
+    /** 
+     * Constructor: OpenLayers.Style2
+     * Creates a style representing a collection of rendering rules.
+     *
+     * Parameters:
+     * config - {Object} An object containing properties to be set on the 
+     *     style.  Any documented properties may be set at construction.
+     *
+     * Return:
+     * {<OpenLayers.Style2>} A new style object.
+     */
+    initialize: function(config) {
+        OpenLayers.Util.extend(this, config);
+        this.id = OpenLayers.Util.createUniqueID(this.CLASS_NAME + "_");
+    },
+
+    /** 
+     * APIMethod: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+        for (var i=0, len=this.rules.length; i<len; i++) {
+            this.rules[i].destroy();
+        }
+        delete this.rules;
+    },
+
+    /**
+     * APIMethod: clone
+     * Clones this style.
+     * 
+     * Returns:
+     * {<OpenLayers.Style2>} Clone of this style.
+     */
+    clone: function() {
+        var config = OpenLayers.Util.extend({}, this);
+        // clone rules
+        if (this.rules) {
+            config.rules = [];
+            for (var i=0, len=this.rules.length; i<len; ++i) {
+                config.rules.push(this.rules[i].clone());
+            }
+        }
+        return new OpenLayers.Style2(config);
+    },
+    
+    CLASS_NAME: "OpenLayers.Style2"
+});
diff --git a/lib/OpenLayers/StyleMap.js b/lib/OpenLayers/StyleMap.js
new file mode 100644
index 0000000..5ce463e
--- /dev/null
+++ b/lib/OpenLayers/StyleMap.js
@@ -0,0 +1,160 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @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
+     * specified for the "default" intent at rendering time. Otherwise, every
+     * 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
+     *           intent. If just one style hash or style object is passed,
+     *           this will be used for all known render intents (default,
+     *           select, temporary)
+     * options - {Object} optional hash of additional options for this
+     *           instance
+     */
+    initialize: function (style, options) {
+        this.styles = {
+            "default": new OpenLayers.Style(
+                OpenLayers.Feature.Vector.style["default"]),
+            "select": new OpenLayers.Style(
+                OpenLayers.Feature.Vector.style["select"]),
+            "temporary": new OpenLayers.Style(
+                OpenLayers.Feature.Vector.style["temporary"]),
+            "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) {
+            // user passed a style object
+            this.styles["default"] = style;
+            this.styles["select"] = style;
+            this.styles["temporary"] = style;
+            this.styles["delete"] = style;
+        } else if(typeof style == "object") {
+            for(var key in style) {
+                if(style[key] instanceof OpenLayers.Style) {
+                    // user passed a hash of style objects
+                    this.styles[key] = style[key];
+                } else if(typeof style[key] == "object") {
+                    // user passsed a hash of style hashes
+                    this.styles[key] = new OpenLayers.Style(style[key]);
+                } else {
+                    // user passed a style hash (i.e. symbolizer)
+                    this.styles["default"] = new OpenLayers.Style(style);
+                    this.styles["select"] = new OpenLayers.Style(style);
+                    this.styles["temporary"] = new OpenLayers.Style(style);
+                    this.styles["delete"] = new OpenLayers.Style(style);
+                    break;
+                }
+            }
+        }
+        OpenLayers.Util.extend(this, options);
+    },
+
+    /**
+     * Method: destroy
+     */
+    destroy: function() {
+        for(var key in this.styles) {
+            this.styles[key].destroy();
+        }
+        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.
+     * intent  - {String} The intent determines the symbolizer that will be
+     *           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
+     */
+    createSymbolizer: function(feature, intent) {
+        if(!feature) {
+            feature = new OpenLayers.Feature.Vector();
+        }
+        if(!this.styles[intent]) {
+            intent = "default";
+        }
+        feature.renderIntent = intent;
+        var defaultSymbolizer = {};
+        if(this.extendDefault && intent != "default") {
+            defaultSymbolizer = this.styles["default"].createSymbolizer(feature);
+        }
+        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 
+     * context      - {Object} An optional object with properties that
+     *                symbolizers' property values should be evaluated
+     *                against. If no context is specified, feature.attributes
+     *                will be used
+     */
+    addUniqueValueRules: function(renderIntent, property, symbolizers, context) {
+        var rules = [];
+        for (var value in symbolizers) {
+            rules.push(new OpenLayers.Rule({
+                symbolizer: symbolizers[value],
+                context: context,
+                filter: new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                    property: property,
+                    value: value
+                })
+            }));
+        }
+        this.styles[renderIntent].addRules(rules);
+    },
+
+    CLASS_NAME: "OpenLayers.StyleMap"
+});
diff --git a/lib/OpenLayers/Symbolizer.js b/lib/OpenLayers/Symbolizer.js
new file mode 100644
index 0000000..aeb1f0b
--- /dev/null
+++ b/lib/OpenLayers/Symbolizer.js
@@ -0,0 +1,51 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * Class: OpenLayers.Symbolizer
+ * Base class representing a symbolizer used for feature rendering.
+ */
+OpenLayers.Symbolizer = OpenLayers.Class({
+    
+
+    /**
+     * APIProperty: zIndex
+     * {Number} The zIndex determines the rendering order for a symbolizer.
+     *     Symbolizers with larger zIndex values are rendered over symbolizers
+     *     with smaller zIndex values.  Default is 0.
+     */
+    zIndex: 0,
+    
+    /**
+     * Constructor: OpenLayers.Symbolizer
+     * Instances of this class are not useful.  See one of the subclasses.
+     *
+     * Parameters:
+     * config - {Object} An object containing properties to be set on the 
+     *     symbolizer.  Any documented symbolizer property can be set at 
+     *     construction.
+     *
+     * Returns:
+     * A new symbolizer.
+     */
+    initialize: function(config) {
+        OpenLayers.Util.extend(this, config);
+    },
+    
+    /** 
+     * APIMethod: clone
+     * Create a copy of this symbolizer.
+     *
+     * Returns a symbolizer of the same type with the same properties.
+     */
+    clone: function() {
+        var Type = eval(this.CLASS_NAME);
+        return new Type(OpenLayers.Util.extend({}, this));
+    },
+    
+    CLASS_NAME: "OpenLayers.Symbolizer"
+    
+});
+
diff --git a/lib/OpenLayers/Symbolizer/Line.js b/lib/OpenLayers/Symbolizer/Line.js
new file mode 100644
index 0000000..5d2e0b7
--- /dev/null
+++ b/lib/OpenLayers/Symbolizer/Line.js
@@ -0,0 +1,69 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Symbolizer.js
+ */
+
+/**
+ * Class: OpenLayers.Symbolizer.Line
+ * A symbolizer used to render line features.
+ */
+OpenLayers.Symbolizer.Line = OpenLayers.Class(OpenLayers.Symbolizer, {
+
+    /**
+     * APIProperty: strokeColor
+     * {String} Color for line stroke.  This is a RGB hex value (e.g. "#ff0000"
+     *     for red).
+     */
+    strokeColor: null,
+    
+    /**
+     * APIProperty: strokeOpacity
+     * {Number} Stroke opacity (0-1).
+     */
+    strokeOpacity: null,
+    
+    /**
+     * APIProperty: strokeWidth
+     * {Number} Pixel stroke width.
+     */
+    strokeWidth: null,
+    
+    /**
+     * APIProperty: strokeLinecap
+     * {String} Stroke cap type ("butt", "round", or "square").
+     */
+    strokeLinecap: null,
+    
+    /**
+     * Property: strokeDashstyle
+     * {String} Stroke dash style according to the SLD spec. Note that the
+     *     OpenLayers values for strokeDashstyle ("dot", "dash", "dashdot",
+     *     "longdash", "longdashdot", or "solid") will not work in SLD, but
+     *     most SLD patterns will render correctly in OpenLayers.
+     */
+    strokeDashstyle: null,
+
+    /**
+     * Constructor: OpenLayers.Symbolizer.Line
+     * Create a symbolizer for rendering lines.
+     *
+     * Parameters:
+     * config - {Object} An object containing properties to be set on the 
+     *     symbolizer.  Any documented symbolizer property can be set at 
+     *     construction.
+     *
+     * Returns:
+     * A new line symbolizer.
+     */
+    initialize: function(config) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
+    },
+    
+    CLASS_NAME: "OpenLayers.Symbolizer.Line"
+    
+});
+
diff --git a/lib/OpenLayers/Symbolizer/Point.js b/lib/OpenLayers/Symbolizer/Point.js
new file mode 100644
index 0000000..d9568cd
--- /dev/null
+++ b/lib/OpenLayers/Symbolizer/Point.js
@@ -0,0 +1,141 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Symbolizer.js
+ */
+
+/**
+ * Class: OpenLayers.Symbolizer.Point
+ * A symbolizer used to render point features.
+ */
+OpenLayers.Symbolizer.Point = OpenLayers.Class(OpenLayers.Symbolizer, {
+    
+    /**
+     * APIProperty: strokeColor
+     * {String} Color for line stroke.  This is a RGB hex value (e.g. "#ff0000"
+     *     for red).
+     */
+    strokeColor: null,
+    
+    /**
+     * APIProperty: strokeOpacity
+     * {Number} Stroke opacity (0-1).
+     */
+    strokeOpacity: null,
+    
+    /**
+     * APIProperty: strokeWidth
+     * {Number} Pixel stroke width.
+     */
+    strokeWidth: null,
+    
+    /**
+     * APIProperty: strokeLinecap
+     * {String} Stroke cap type ("butt", "round", or "square").
+     */
+    strokeLinecap: null,
+    
+    /**
+     * Property: strokeDashstyle
+     * {String} Stroke dash style according to the SLD spec. Note that the
+     *     OpenLayers values for strokeDashstyle ("dot", "dash", "dashdot",
+     *     "longdash", "longdashdot", or "solid") will not work in SLD, but
+     *     most SLD patterns will render correctly in OpenLayers.
+     */
+    strokeDashstyle: null,
+
+    /**
+     * APIProperty: fillColor
+     * {String} RGB hex fill color (e.g. "#ff0000" for red).
+     */
+    fillColor: null,
+    
+    /**
+     * APIProperty: fillOpacity
+     * {Number} Fill opacity (0-1).
+     */
+    fillOpacity: null, 
+
+    /**
+     * APIProperty: pointRadius
+     * {Number} Pixel point radius.
+     */
+    pointRadius: null,
+
+    /**
+     * APIProperty: externalGraphic
+     * {String} Url to an external graphic that will be used for rendering 
+     *     points.
+     */
+    externalGraphic: null,
+    
+    /**
+     * APIProperty: graphicWidth
+     * {Number} Pixel width for sizing an external graphic.
+     */
+    graphicWidth: null,
+    
+    /**
+     * APIProperty: graphicHeight
+     * {Number} Pixel height for sizing an external graphic.
+     */
+    graphicHeight: null,
+    
+    /**
+     * APIProperty: graphicOpacity
+     * {Number} Opacity (0-1) for an external graphic.
+     */
+    graphicOpacity: null,
+    
+    /**
+     * APIProperty: graphicXOffset
+     * {Number} Pixel offset along the positive x axis for displacing an 
+     *     external graphic.
+     */
+    graphicXOffset: null,
+    
+    /**
+     * APIProperty: graphicYOffset
+     * {Number} Pixel offset along the positive y axis for displacing an 
+     *     external graphic.
+     */
+    graphicYOffset: null,
+
+    /**
+     * APIProperty: rotation
+     * {Number} The rotation of a graphic in the clockwise direction about its 
+     *     center point (or any point off center as specified by 
+     *     <graphicXOffset> and <graphicYOffset>).
+     */
+    rotation: null,
+    
+    /**
+     * APIProperty: graphicName
+     * {String} Named graphic to use when rendering points.  Supported values 
+     *     include "circle", "square", "star", "x", "cross", and "triangle".
+     */
+    graphicName: null,
+    
+    /**
+     * Constructor: OpenLayers.Symbolizer.Point
+     * Create a symbolizer for rendering points.
+     *
+     * Parameters:
+     * config - {Object} An object containing properties to be set on the 
+     *     symbolizer.  Any documented symbolizer property can be set at 
+     *     construction.
+     *
+     * Returns:
+     * A new point symbolizer.
+     */
+    initialize: function(config) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
+    },
+    
+    CLASS_NAME: "OpenLayers.Symbolizer.Point"
+    
+});
+
diff --git a/lib/OpenLayers/Symbolizer/Polygon.js b/lib/OpenLayers/Symbolizer/Polygon.js
new file mode 100644
index 0000000..10d9a20
--- /dev/null
+++ b/lib/OpenLayers/Symbolizer/Polygon.js
@@ -0,0 +1,81 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Symbolizer.js
+ */
+
+/**
+ * Class: OpenLayers.Symbolizer.Polygon
+ * A symbolizer used to render line features.
+ */
+OpenLayers.Symbolizer.Polygon = OpenLayers.Class(OpenLayers.Symbolizer, {
+    
+    /**
+     * APIProperty: strokeColor
+     * {String} Color for line stroke.  This is a RGB hex value (e.g. "#ff0000"
+     *     for red).
+     */
+    strokeColor: null,
+    
+    /**
+     * APIProperty: strokeOpacity
+     * {Number} Stroke opacity (0-1).
+     */
+    strokeOpacity: null,
+    
+    /**
+     * APIProperty: strokeWidth
+     * {Number} Pixel stroke width.
+     */
+    strokeWidth: null,
+    
+    /**
+     * APIProperty: strokeLinecap
+     * {String} Stroke cap type ("butt", "round", or "square").
+     */
+    strokeLinecap: null,
+    
+    /**
+     * Property: strokeDashstyle
+     * {String} Stroke dash style according to the SLD spec. Note that the
+     *     OpenLayers values for strokeDashstyle ("dot", "dash", "dashdot",
+     *     "longdash", "longdashdot", or "solid") will not work in SLD, but
+     *     most SLD patterns will render correctly in OpenLayers.
+     */
+    strokeDashstyle: null,
+
+    /**
+     * APIProperty: fillColor
+     * {String} RGB hex fill color (e.g. "#ff0000" for red).
+     */
+    fillColor: null,
+    
+    /**
+     * APIProperty: fillOpacity
+     * {Number} Fill opacity (0-1).
+     */
+    fillOpacity: null, 
+
+    /**
+     * Constructor: OpenLayers.Symbolizer.Polygon
+     * Create a symbolizer for rendering polygons.
+     *
+     * Parameters:
+     * config - {Object} An object containing properties to be set on the 
+     *     symbolizer.  Any documented symbolizer property can be set at 
+     *     construction.
+     *
+     * Returns:
+     * A new polygon symbolizer.
+     */
+    initialize: function(config) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
+    },
+    
+    CLASS_NAME: "OpenLayers.Symbolizer.Polygon"
+    
+});
+
diff --git a/lib/OpenLayers/Symbolizer/Raster.js b/lib/OpenLayers/Symbolizer/Raster.js
new file mode 100644
index 0000000..f9975b3
--- /dev/null
+++ b/lib/OpenLayers/Symbolizer/Raster.js
@@ -0,0 +1,34 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Symbolizer.js
+ */
+
+/**
+ * Class: OpenLayers.Symbolizer.Raster
+ * A symbolizer used to render raster images.
+ */
+OpenLayers.Symbolizer.Raster = OpenLayers.Class(OpenLayers.Symbolizer, {
+    
+    /**
+     * Constructor: OpenLayers.Symbolizer.Raster
+     * Create a symbolizer for rendering rasters.
+     *
+     * Parameters:
+     * config - {Object} An object containing properties to be set on the 
+     *     symbolizer.  Any documented symbolizer property can be set at 
+     *     construction.
+     *
+     * Returns:
+     * A new raster symbolizer.
+     */
+    initialize: function(config) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
+    },
+    
+    CLASS_NAME: "OpenLayers.Symbolizer.Raster"
+    
+});
diff --git a/lib/OpenLayers/Symbolizer/Text.js b/lib/OpenLayers/Symbolizer/Text.js
new file mode 100644
index 0000000..1b44178
--- /dev/null
+++ b/lib/OpenLayers/Symbolizer/Text.js
@@ -0,0 +1,65 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Symbolizer.js
+ */
+
+/**
+ * Class: OpenLayers.Symbolizer.Text
+ * A symbolizer used to render text labels for features.
+ */
+OpenLayers.Symbolizer.Text = OpenLayers.Class(OpenLayers.Symbolizer, {
+    
+    /** 
+     * APIProperty: label
+     * {String} The text for the label.
+     */
+    label: null,
+    
+    /** 
+     * APIProperty: fontFamily
+     * {String} The font family for the label.
+     */
+    fontFamily: null,
+
+    /** 
+     * APIProperty: fontSize
+     * {String} The font size for the label.
+     */
+    fontSize: null,
+
+    /** 
+     * APIProperty: fontWeight
+     * {String} The font weight for the label.
+     */
+    fontWeight: null,
+    
+    /**
+     * Property: fontStyle
+     * {String} The font style for the label.
+     */
+    fontStyle: null,
+
+    /**
+     * Constructor: OpenLayers.Symbolizer.Text
+     * Create a symbolizer for rendering text labels.
+     *
+     * Parameters:
+     * config - {Object} An object containing properties to be set on the 
+     *     symbolizer.  Any documented symbolizer property can be set at 
+     *     construction.
+     *
+     * Returns:
+     * A new text symbolizer.
+     */
+    initialize: function(config) {
+        OpenLayers.Symbolizer.prototype.initialize.apply(this, arguments);
+    },
+    
+    CLASS_NAME: "OpenLayers.Symbolizer.Text"
+    
+});
+
diff --git a/lib/OpenLayers/Tile.js b/lib/OpenLayers/Tile.js
new file mode 100644
index 0000000..982a42a
--- /dev/null
+++ b/lib/OpenLayers/Tile.js
@@ -0,0 +1,281 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/*
+ * @requires OpenLayers/Util.js
+ * @requires OpenLayers/Console.js
+ */
+
+/*
+ * Class: OpenLayers.Tile 
+ * This is a class designed to designate a single tile, however
+ *     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. 
+ * 
+ * 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 
+     *                       events on the tile.
+     */
+    events: null,
+
+    /**
+     * Property: id 
+     * {String} null
+     */
+    id: null,
+    
+    /** 
+     * 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 
+     * handled in subclasses. Does not belong here.
+     */
+    url: null,
+
+    /** 
+     * APIProperty: bounds 
+     * {<OpenLayers.Bounds>} null
+     */
+    bounds: null,
+    
+    /** 
+     * Property: size 
+     * {<OpenLayers.Size>} null
+     */
+    size: null,
+    
+    /** 
+     * Property: position 
+     * {<OpenLayers.Pixel>} Top Left pixel of the tile
+     */    
+    position: null,
+
+    /**
+     * Property: isLoading
+     * {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();
+        this.bounds = bounds.clone();
+        this.url = url;
+        this.size = size.clone();
+
+        //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);
+    },
+
+    /**
+     * Method: unload
+     * Call immediately before destroying if you are listening to tile
+     * events, so that counters are properly handled if tile is still
+     * loading at destroy-time. Will only fire an event if the tile is
+     * still loading.
+     */
+    unload: function() {
+       if (this.isLoading) { 
+           this.isLoading = false; 
+           this.events.triggerEvent("unload"); 
+       }
+    },
+    
+    /** 
+     * APIMethod: destroy
+     * Nullify references to prevent circular references and memory leaks.
+     */
+    destroy:function() {
+        this.layer  = null;
+        this.bounds = null;
+        this.size = null;
+        this.position = null;
+        
+        this.events.destroy();
+        this.events = null;
+    },
+    
+    /**
+     * Method: clone
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Tile>} The tile to be cloned
+     *
+     * Returns:
+     * {<OpenLayers.Tile>} An exact clone of this <OpenLayers.Tile>
+     */
+    clone: function (obj) {
+        if (obj == null) {
+            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 
+     *     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 
+     *     the way the code has been developed. Subclasses call this and
+     *     depend on the return to know if they should draw or not.
+     */
+    draw: function() {
+        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 
+        // 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.
+     *
+     * Parameters:
+     * bounds - {<OpenLayers.Bounds>}
+     * position - {<OpenLayers.Pixel>}
+     * redraw - {Boolean} Call draw method on tile after moving.
+     *     Default is true
+     */
+    moveTo: function (bounds, position, redraw) {
+        if (redraw == null) {
+            redraw = true;
+        }
+
+        this.bounds = bounds.clone();
+        this.position = position.clone();
+        if (redraw) {
+            this.draw();
+        }
+    },
+
+    /** 
+     * Method: clear
+     * 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 
+     *     displaying tiles over Google works fine.
+     *
+     * Parameters:
+     * position - {<OpenLayers.Pixel>}
+     *
+     * Returns:
+     * 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 bottomRightPx = position.clone();
+        bottomRightPx.x += this.size.w;
+        bottomRightPx.y += this.size.h;
+        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.  
+        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);  
+        return bounds;
+    },        
+        
+    /** 
+     * Method: showTile
+     * Show the tile only if it should be drawn.
+     */
+    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"
+});
diff --git a/lib/OpenLayers/Tile/Image.js b/lib/OpenLayers/Tile/Image.js
new file mode 100644
index 0000000..0524069
--- /dev/null
+++ b/lib/OpenLayers/Tile/Image.js
@@ -0,0 +1,578 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Tile.js
+ */
+
+/**
+ * Class: OpenLayers.Tile.Image
+ * Instances of OpenLayers.Tile.Image are used to manage the image tiles
+ * used by various layers.  Create a new image tile with the
+ * <OpenLayers.Tile.Image> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Tile>
+ */
+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. 
+     */
+    url: null,
+    
+    /** 
+     * Property: imgDiv
+     * {DOMElement} The div element which wraps the image.
+     */
+    imgDiv: null,
+
+    /**
+     * Property: frame
+     * {DOMElement} The image element is appended to the frame.  Any gutter on
+     * 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
+     *     of the back buffer tile resolution to the map resolution.  Compared
+     *     with the current ratio to determine if zooming occurred.
+     */
+    lastRatio: 1,
+
+    /**
+     * Property: isFirstDraw
+     * {Boolean} Is this the first time the tile is being drawn?
+     *     This is used to force resetBackBuffer to synchronize
+     *     the backBufferTile with the foreground tile the first time
+     *     the foreground tile loads so that if the user zooms
+     *     before the layer has fully loaded, the backBufferTile for
+     *     tiles that have been loaded can be used.
+     */
+    isFirstDraw: true,
+        
+    /**
+     * Property: backBufferTile
+     * {<OpenLayers.Tile>} A clone of the tile used to create transition
+     *     effects when the tile is moved or changes resolution.
+     */
+    backBufferTile: null,
+
+    /** 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.layerAlphaHack = this.layer.alpha && OpenLayers.Util.alphaHack();
+    },
+
+    /** 
+     * APIMethod: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+        if (this.imgDiv != null)  {
+            if (this.layerAlphaHack) {
+                // unregister the "load" handler
+                OpenLayers.Event.stopObservingElement(this.imgDiv.childNodes[0]);                
+            }
+
+            // unregister the "load" and "error" handlers. Only the "error" handler if
+            // this.layerAlphaHack is true.
+            OpenLayers.Event.stopObservingElement(this.imgDiv);
+            
+            if (this.imgDiv.parentNode == this.frame) {
+                this.frame.removeChild(this.imgDiv);
+                this.imgDiv.map = null;
+            }
+            this.imgDiv.urls = null;
+            // abort any currently loading image
+            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); 
+        }
+        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);
+    },
+
+    /**
+     * Method: clone
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Tile.Image>} The tile to be cloned
+     *
+     * Returns:
+     * {<OpenLayers.Tile.Image>} An exact clone of this <OpenLayers.Tile.Image>
+     */
+    clone: function (obj) {
+        if (obj == null) {
+            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.
+     */
+    draw: function() {
+        if (this.layer != this.layer.map.baseLayer && this.layer.reproject) {
+            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) || 
+            this.layer.singleTile) {
+            if (drawTile) {
+                //we use a clone of this tile to create a double buffer for visual
+                //continuity.  The backBufferTile is used to create transition
+                //effects while the tile in the grid is repositioned and redrawn
+                if (!this.backBufferTile) {
+                    this.backBufferTile = this.clone();
+                    this.backBufferTile.hide();
+                    // this is important.  It allows the backBuffer to place itself
+                    // appropriately in the DOM.  The Image subclass needs to put
+                    // 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);
+                }
+                // run any transition effects
+                this.startTransition();
+            } else {
+                // if we aren't going to draw the tile, then the backBuffer should
+                // be hidden too!
+                if (this.backBufferTile) {
+                    this.backBufferTile.clear();
+                }
+            }
+        } else {
+            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"); 
+        } 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 
+     *     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 
+     *    foreground tile
+     */
+    resetBackBuffer: function() {
+        this.showTile();
+        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 
+            var maxExtent = this.layer.maxExtent;
+            var withinMaxExtent = (maxExtent &&
+                                   this.bounds.intersectsBounds(maxExtent, false));
+            if (withinMaxExtent) {
+                this.backBufferTile.position = this.position;
+                this.backBufferTile.bounds = this.bounds;
+                this.backBufferTile.size = this.size;
+                this.backBufferTile.imageSize = this.layer.getImageSize(this.bounds) || this.size;
+                this.backBufferTile.imageOffset = this.layer.imageOffset;
+                this.backBufferTile.resolution = this.layer.getResolution();
+                this.backBufferTile.renderTile();
+            }
+
+            this.backBufferTile.hide();
+        }
+    },
+    
+    /**
+     * Method: renderTile
+     * Internal function to actually initialize the image tile,
+     *     position it correctly, and set its url.
+     */
+    renderTile: function() {
+        if (this.imgDiv == null) {
+            this.initImgDiv();
+        }
+
+        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
+            // 'this', setting the 'url' property of the layer itself, and running
+            // the callback 'positionFrame' when the image request returns.
+            this.layer.getURLasync(this.bounds, this, "url", this.positionImage);
+        } 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(); 
+        }
+        return true;
+    },
+
+    /**
+     * Method: positionImage
+     * Using the properties currenty set on the layer, position the tile correctly.
+     * This method is used both by the async and non-async versions of the Tile.Image
+     * code.
+     */
+     positionImage: function() {
+        // if the this layer doesn't exist at the point the image is
+        // 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(this.bounds); 
+        if (this.layerAlphaHack) {
+            OpenLayers.Util.modifyAlphaImageDiv(this.imgDiv,
+                    null, null, imageSize, this.url);
+        } else {
+            OpenLayers.Util.modifyDOMElement(this.imgDiv,
+                    null, null, imageSize) ;
+            this.imgDiv.src = this.url;
+        }
+    },
+
+    /** 
+     * Method: clear
+     *  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) { 
+                this.imgDiv.src = OpenLayers.Util.getImagesLocation() + "blank.gif";
+            }    
+        }
+    },
+
+    /**
+     * Method: initImgDiv
+     * Creates the imgDiv property on the tile.
+     */
+    initImgDiv: function() {
+        
+        var offset = this.layer.imageOffset; 
+        var size = this.layer.getImageSize(this.bounds); 
+     
+        if (this.layerAlphaHack) {
+            this.imgDiv = OpenLayers.Util.createAlphaImageDiv(null,
+                                                           offset,
+                                                           size,
+                                                           null,
+                                                           "relative",
+                                                           null,
+                                                           null,
+                                                           null,
+                                                           true);
+        } else {
+            this.imgDiv = OpenLayers.Util.createImage(null,
+                                                      offset,
+                                                      size,
+                                                      null,
+                                                      "relative",
+                                                      null,
+                                                      null,
+                                                      true);
+        }
+        
+        this.imgDiv.className = 'olTileImage';
+
+        /* checkImgURL used to be used to called as a work around, but it
+           ended up hiding problems instead of solving them and broke things
+           like relative URLs. See discussion on the dev list:
+           http://openlayers.org/pipermail/dev/2007-January/000205.html
+
+        OpenLayers.Event.observe( this.imgDiv, "load",
+            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); 
+
+        if(this.layer.opacity != null) {
+            
+            OpenLayers.Util.modifyDOMElement(this.imgDiv, 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 
+        // can register when a tile has finished loading.
+        var onload = function() {
+            
+            //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 
+            // a 'loadend' if the msg has already been sent
+            //
+            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)); 
+        } 
+        
+
+        // 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() {
+
+            // If we have gone through all image reload attempts, it is time
+            // to realize that we are done with this image. Since
+            // OpenLayers.Util.onImageLoadError already has taken care about
+            // the error, we can continue as if the image was loaded
+            // successfully.
+            if (this.imgDiv._attempts > OpenLayers.IMAGE_RELOAD_ATTEMPTS) {
+                onload.call(this);
+            }
+        };
+        OpenLayers.Event.observe(this.imgDiv, "error",
+                                 OpenLayers.Function.bind(onerror, this));
+    },
+
+    /**
+     * Method: checkImgURL
+     * Make sure that the image that just loaded is the one this tile is meant
+     * to display, since panning/zooming might have changed the tile's URL in
+     * the meantime. If the tile URL did change before the image loaded, set
+     * 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 
+     * isEquivilant URL function, this might be neccesary at some point.
+     * 
+     * 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.  
+        if (this.layer) {
+            var loaded = this.layerAlphaHack ? this.imgDiv.firstChild.src : this.imgDiv.src;
+            if (!OpenLayers.Util.isEquivalentUrl(loaded, this.url)) {
+                this.hide();
+            }
+        }
+    },
+    
+    /**
+     * Method: startTransition
+     * This method is invoked on tiles that are backBuffers for tiles in the
+     *     grid.  The grid tile is about to be cleared and a new tile source
+     *     loaded.  This is where the transition effect needs to be started
+     *     to provide visual continuity.
+     */
+    startTransition: function() {
+        // backBufferTile has to be valid and ready to use
+        if (!this.backBufferTile || !this.backBufferTile.imgDiv) {
+            return;
+        }
+
+        // calculate the ratio of change between the current resolution of the
+        // backBufferTile and the layer.  If several animations happen in a
+        // row, then the backBufferTile will scale itself appropriately for
+        // each request.
+        var ratio = 1;
+        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 
+                // backBufferTile.
+                var upperLeft = new OpenLayers.LonLat(
+                    this.backBufferTile.bounds.left, 
+                    this.backBufferTile.bounds.top
+                );
+                var size = new OpenLayers.Size(
+                    this.backBufferTile.size.w * ratio,
+                    this.backBufferTile.size.h * ratio
+                );
+
+                var px = this.layer.map.getLayerPxFromLonLat(upperLeft);
+                OpenLayers.Util.modifyDOMElement(this.backBufferTile.frame, 
+                                                 null, px, size);
+                var imageSize = this.backBufferTile.imageSize;
+                imageSize = new OpenLayers.Size(imageSize.w * ratio, 
+                                                imageSize.h * ratio);
+                var imageOffset = this.backBufferTile.imageOffset;
+                if(imageOffset) {
+                    imageOffset = new OpenLayers.Pixel(
+                        imageOffset.x * ratio, imageOffset.y * ratio
+                    );
+                }
+
+                OpenLayers.Util.modifyDOMElement(
+                    this.backBufferTile.imgDiv, null, imageOffset, imageSize
+                ) ;
+
+                this.backBufferTile.show();
+            }
+        } else {
+            // default effect is just to leave the existing tile
+            // until the new one loads if this is a singleTile and
+            // there was no change in resolution.  Otherwise we
+            // don't bother to show the backBufferTile at all
+            if (this.layer.singleTile) {
+                this.backBufferTile.show();
+            } else {
+                this.backBufferTile.hide();
+            }
+        }
+        this.lastRatio = ratio;
+
+    },
+    
+    /** 
+     * Method: show
+     * Show the tile by showing its frame.
+     */
+    show: function() {
+        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, 
+                this.layer.transitionEffect) != -1) {
+            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"); 
diff --git a/lib/OpenLayers/Tile/Image/IFrame.js b/lib/OpenLayers/Tile/Image/IFrame.js
new file mode 100644
index 0000000..4692127
--- /dev/null
+++ b/lib/OpenLayers/Tile/Image/IFrame.js
@@ -0,0 +1,262 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+
+/**
+ * @requires OpenLayers/Tile/Image.js
+ */
+
+/**
+ * Class: OpenLayers.Tile.Image.IFrame
+ * Instances of OpenLayers.Tile.Image.IFrame are used to manage the image tiles
+ * used by Layer.WMS.Post loaded via HTTP-POST-protocol. Create a new image
+ * tile with the <OpenLayers.Tile.Image.IFrame> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Tile.Image>
+ */
+OpenLayers.Tile.Image.IFrame = OpenLayers.Class(OpenLayers.Tile.Image, {
+    
+    /**
+     * Property: layerAlphaHack
+     * {Boolean} Always false for an instance.
+     */
+
+    /**
+     * Constructor: OpenLayers.Tile.Image.IFrame
+     * Constructor for a new <OpenLayers.Tile.Image.IFrame> instance.
+     * 
+     * Parameters:
+     * layer - {<OpenLayers.Layer>} layer that the tile will go in.
+     * position - {<OpenLayers.Pixel>}
+     * bounds - {<OpenLayers.Bounds>}
+     * size - {<OpenLayers.Size>}
+     */   
+    initialize: function(layer, position, bounds, url, size) {
+        OpenLayers.Tile.Image.prototype.initialize.apply(this, arguments);
+        this.layerAlphaHack = false;
+    },
+
+    /** 
+     * Method: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+        if(this.imgDiv != null) {
+            // unregister the "load" handler
+            OpenLayers.Event.stopObservingElement(this.imgDiv.firstChild);
+        }
+        OpenLayers.Tile.Image.prototype.destroy.apply(this, arguments);
+    },
+
+    /**
+     * Method: clear
+     * Removes the iframe from DOM (avoids back-button problems).
+     */
+    clear: function() {
+        if(this.imgDiv) {
+            var iFrame = this.imgDiv.firstChild;
+            OpenLayers.Event.stopObservingElement(iFrame);
+            this.imgDiv.removeChild(iFrame);
+        }
+    },
+
+    /**
+     * Method: clone
+     *
+     * Parameters:
+     * obj - {<OpenLayers.Tile.Image.IFrame>} The tile to be cloned
+     *
+     * Returns:
+     * {<OpenLayers.Tile.Image.IFrame>} An exact clone of this 
+     * <OpenLayers.Tile.Image.IFrame>
+     */
+    clone: function (obj) {
+        if (obj == null) {
+            obj = new OpenLayers.Tile.Image.IFrame(
+                this.layer, this.position, this.bounds, this.url, this.size);
+        } 
+        
+        //pick up properties from superclass
+        obj = OpenLayers.Tile.Image.prototype.clone.apply(this, [obj]);
+        
+        return obj;
+    },
+
+    /**
+     * Method: renderTile
+     */
+     renderTile: function() {
+        if(OpenLayers.Tile.Image.prototype.renderTile.apply(this, arguments)) {
+            // create a html form and add it temporary to the layer div
+            var form = this.createRequestForm();
+            this.imgDiv.appendChild(form);
+
+            // submit the form (means fetching the image)
+            form.submit();
+            this.imgDiv.removeChild(form);
+        }
+    },
+
+    /**
+     * Method: initImgDiv
+     * Creates the imgDiv property on the tile.
+     */
+    initImgDiv: function() {
+        this.imgDiv = this.createImgDiv();
+
+        OpenLayers.Util.modifyDOMElement(this.imgDiv, this.id, null,
+            this.layer.getImageSize(), "relative");
+        this.imgDiv.className = 'olTileImage';
+
+        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, 
+                                             this.layer.opacity);
+        }
+
+        // we need this reference to check back the viewRequestID
+        this.imgDiv.map = this.layer.map;
+    },
+
+    /**
+     * Method: createImgDiv
+     * Creates a div with iframe.and eventPane
+     *
+     * Returns:
+     * {DOMElement}
+     */
+    createImgDiv: function() {
+        var eventPane = document.createElement("div");
+
+        if(OpenLayers.Util.getBrowserName() == "msie") {
+            // IE cannot handle events on elements without backgroundcolor. So we
+            // use this little hack to make elements transparent
+            eventPane.style.backgroundColor = '#FFFFFF';
+            eventPane.style.filter          = 'chroma(color=#FFFFFF)';
+        }
+
+        OpenLayers.Util.modifyDOMElement(eventPane, null,
+            new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
+
+        var imgDiv = document.createElement("div");
+        imgDiv.appendChild(eventPane);
+        return imgDiv;
+    },
+
+    /**
+     * Method: createIFrame
+     * Create the IFrame which shows the image.
+     *
+     * Returns:
+     * {DOMElement} Iframe
+     */
+    createIFrame: function() {
+        var id = this.id+'_iFrame';
+        var iframe;
+        if(OpenLayers.Util.getBrowserName() == "msie") {
+            // InternetExplorer does not set the name attribute of an iFrame 
+            // properly via DOM manipulation, so we need to do it on our own with
+            // this hack.
+            iframe = document.createElement('<iframe name="'+id+'">');
+
+            // IFrames in InternetExplorer are not transparent, if you set the
+            // backgroundColor transparent. This is a workarround to get 
+            // transparent iframes.
+            iframe.style.backgroundColor = '#FFFFFF';
+            iframe.style.filter          = 'chroma(color=#FFFFFF)';
+        }
+        else {
+            iframe = document.createElement('iframe');
+            iframe.style.backgroundColor = 'transparent';
+        
+            // iframe.name needs to be an unique id, otherwise it 
+            // could happen that other iframes are overwritten.
+            iframe.name = id;
+        }
+        iframe.id = id;
+
+        // some special properties to avoid scaling the images and scrollbars 
+        // in the iframe
+        iframe.scrolling             = 'no';
+        iframe.marginWidth           = '0px';
+        iframe.marginHeight          = '0px';
+        iframe.frameBorder           = '0';
+
+        OpenLayers.Util.modifyDOMElement(iframe, id, 
+            new OpenLayers.Pixel(0,0), this.layer.getImageSize(), "absolute");
+
+        //bind a listener to the onload of the iframe so that we
+        // can register when a tile has finished loading.
+        var onload = function() {
+            this.show();
+            //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
+            // a 'loadend' if the msg has already been sent
+            //
+            if (this.isLoading) {
+                this.isLoading = false;
+                this.events.triggerEvent("loadend");
+            }
+        };
+        OpenLayers.Event.observe(iframe, 'load',
+            OpenLayers.Function.bind(onload, this));
+
+        return iframe;
+    },
+    
+    /**
+     * Method: createRequestForm
+     * Create the html <form> element with width, height, bbox and all 
+     * parameters specified in the layer params.
+     *
+     * Returns: 
+     * {DOMElement} The form element which sends the HTTP-POST request to the
+     *              WMS. 
+     */
+    createRequestForm: function() {
+        // creation of the form element
+        var form = document.createElement('form');
+        form.method = 'POST';
+        var cacheId = this.layer.params["_OLSALT"];
+        cacheId = (cacheId ? cacheId + "_" : "") + this.bounds.toBBOX();
+        form.action = OpenLayers.Util.urlAppend(this.layer.url, cacheId);
+
+        // insert the iframe, which has been removed to avoid back-button
+        // problems
+        this.imgDiv.insertBefore(this.createIFrame(), this.imgDiv.firstChild);
+
+        form.target = this.id+'_iFrame';
+
+        // adding all parameters in layer params as hidden fields to the html
+        // form element
+        var imageSize = this.layer.getImageSize();
+        var params = OpenLayers.Util.extend(
+            {
+                "BBOX": this.encodeBBOX ? this.bounds.toBBOX() :
+                        this.bounds.toArray(),
+                "WIDTH": imageSize.w,
+                "HEIGHT": imageSize.h
+            }, this.layer.params);
+            
+        for(var par in params) {
+            var field = document.createElement('input');
+            field.type  = 'hidden';
+            field.name  = par;
+            field.value = params[par];
+            form.appendChild(field);
+        }   
+
+        return form;
+    },
+    
+    CLASS_NAME: "OpenLayers.Tile.Image.IFrame"
+  }
+);
diff --git a/lib/OpenLayers/Tile/WFS.js b/lib/OpenLayers/Tile/WFS.js
new file mode 100644
index 0000000..285ab1e
--- /dev/null
+++ b/lib/OpenLayers/Tile/WFS.js
@@ -0,0 +1,192 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+ 
+/**
+ * @requires OpenLayers/Tile.js
+ * @requires OpenLayers/Request/XMLHttpRequest.js
+ */
+
+/**
+ * Class: OpenLayers.Tile.WFS
+ * Instances of OpenLayers.Tile.WFS are used to manage the image tiles
+ * used by various layers.  Create a new image tile with the
+ * <OpenLayers.Tile.WFS> constructor.
+ *
+ * Inherits from:
+ *  - <OpenLayers.Tile>
+ */
+OpenLayers.Tile.WFS = OpenLayers.Class(OpenLayers.Tile, {
+
+    /** 
+     * Property: features 
+     * {Array(<OpenLayers.Feature>)} list of features in this tile 
+     */
+    features: null,
+
+    /** 
+     * Property: url 
+     * {String} 
+     */
+    url: null,
+    
+    /** 
+     * Property: request 
+     * {<OpenLayers.Request.XMLHttpRequest>} 
+     */ 
+    request: null,     
+    
+    /** TBD 3.0 - reorder the parameters to the init function to put URL 
+     *             as last, so we can continue to call tile.initialize() 
+     *             without changing the arguments. 
+     * 
+     * Constructor: OpenLayers.Tile.WFS
+     * Constructor for a new <OpenLayers.Tile.WFS> 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) {
+        OpenLayers.Tile.prototype.initialize.apply(this, arguments);
+        this.url = url;        
+        this.features = [];
+    },
+
+    /** 
+     * APIMethod: destroy
+     * nullify references to prevent circular references and memory leaks
+     */
+    destroy: function() {
+        OpenLayers.Tile.prototype.destroy.apply(this, arguments);
+        this.destroyAllFeatures();
+        this.features = null;
+        this.url = null;
+        if(this.request) {
+            this.request.abort();
+            //this.request.destroy();
+            this.request = null;
+        }
+    },
+
+    /** 
+     * Method: clear
+     *  Clear the tile of any bounds/position-related data so that it can 
+     *   be reused in a new location.
+     */
+    clear: function() {
+        this.destroyAllFeatures();
+    },
+    
+    /**
+     * Method: draw
+     * Check that a tile should be drawn, and load features for it.
+     */
+    draw:function() {
+        if (OpenLayers.Tile.prototype.draw.apply(this, arguments)) {
+            if (this.isLoading) {
+                //if already loading, send 'reload' instead of 'loadstart'.
+                this.events.triggerEvent("reload"); 
+            } else {
+                this.isLoading = true;
+                this.events.triggerEvent("loadstart");
+            }
+            this.loadFeaturesForRegion(this.requestSuccess);
+        }
+    },
+
+    /** 
+    * Method: loadFeaturesForRegion
+    * Abort any pending requests and issue another request for data. 
+    *
+    * Input are function pointers for what to do on success and failure.
+    *
+    * Parameters:
+    * success - {function}
+    * failure - {function}
+    */
+    loadFeaturesForRegion:function(success, failure) {
+        if(this.request) {
+            this.request.abort();
+        }
+        this.request = OpenLayers.Request.GET({
+            url: this.url,
+            success: success,
+            failure: failure,
+            scope: this
+        });
+    },
+    
+    /**
+    * Method: requestSuccess
+    * Called on return from request succcess. Adds results via 
+    * layer.addFeatures in vector mode, addResults otherwise. 
+    *
+    * Parameters:
+    * request - {<OpenLayers.Request.XMLHttpRequest>}
+    */
+    requestSuccess:function(request) {
+        if (this.features) {
+            var doc = request.responseXML;
+            if (!doc || !doc.documentElement) {
+                doc = request.responseText; 
+            }
+            if (this.layer.vectorMode) {
+                this.layer.addFeatures(this.layer.formatObject.read(doc));
+            } else {
+                var xml = new OpenLayers.Format.XML();
+                if (typeof doc == "string") {
+                    doc = xml.read(doc);
+                }
+                var resultFeatures = xml.getElementsByTagNameNS(
+                    doc, "http://www.opengis.net/gml", "featureMember"
+                );
+                this.addResults(resultFeatures);
+            }
+        }
+        if (this.events) {
+            this.events.triggerEvent("loadend"); 
+        }
+
+        //request produced with success, we can delete the request object.
+        //this.request.destroy();
+        this.request = null;
+    },
+
+    /**
+     * Method: addResults
+     * Construct new feature via layer featureClass constructor, and add to
+     * this.features.
+     * 
+     * Parameters:
+     * results - {Object}
+     */
+    addResults: function(results) {
+        for (var i=0; i < results.length; i++) {
+            var feature = new this.layer.featureClass(this.layer, 
+                                                      results[i]);
+            this.features.push(feature);
+        }
+    },
+
+
+    /** 
+     * Method: destroyAllFeatures
+     * Iterate through and call destroy() on each feature, removing it from
+     *   the local array
+     */
+    destroyAllFeatures: function() {
+        while(this.features.length > 0) {
+            var feature = this.features.shift();
+            feature.destroy();
+        }
+    },
+
+    CLASS_NAME: "OpenLayers.Tile.WFS"
+  }
+);
diff --git a/lib/OpenLayers/Tween.js b/lib/OpenLayers/Tween.js
new file mode 100644
index 0000000..8d3a14b
--- /dev/null
+++ b/lib/OpenLayers/Tween.js
@@ -0,0 +1,318 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * 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
+     *     are functions to be call during the animation. They are passed the
+     *     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
+     * duration - {int} duration of the tween (number of steps)
+     * options - {Object} hash of options (for example callbacks (start, eachStep, done))
+     */
+    start: function(begin, finish, duration, options) {
+        this.playing = true;
+        this.begin = begin;
+        this.finish = finish;
+        this.duration = duration;
+        this.callbacks = options.callbacks;
+        this.time = 0;
+        if (this.interval) {
+            window.clearInterval(this.interval);
+            this.interval = null;
+        }
+        if (this.callbacks && this.callbacks.start) {
+            this.callbacks.start.call(this, this.begin);
+        }
+        this.interval = window.setInterval(
+            OpenLayers.Function.bind(this.play, this), this.INTERVAL);
+    },
+    
+    /**
+     * APIMethod: stop
+     * Stops the Tween, and calls the done callback
+     *     Doesn't do anything if animation is already finished
+     */
+    stop: function() {
+        if (!this.playing) {
+            return;
+        }
+        
+        if (this.callbacks && this.callbacks.done) {
+            this.callbacks.done.call(this, this.finish);
+        }
+        window.clearInterval(this.interval);
+        this.interval = null;
+        this.playing = false;
+    },
+    
+    /**
+     * Method: play
+     * Calls the appropriate easing method
+     */
+    play: function() {
+        var value = {};
+        for (var i in this.begin) {
+            var b = this.begin[i];
+            var f = this.finish[i];
+            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) {
+            this.stop();
+        }
+    },
+    
+    /**
+     * Create empty functions for all easing methods.
+     */
+    CLASS_NAME: "OpenLayers.Tween"
+});
+
+/**
+ * Namespace: OpenLayers.Easing
+ * 
+ * Credits:
+ *      Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>
+ */
+OpenLayers.Easing = {
+    /**
+     * Create empty functions for all easing methods.
+     */
+    CLASS_NAME: "OpenLayers.Easing"
+};
+
+/**
+ * Namespace: OpenLayers.Easing.Linear
+ */
+OpenLayers.Easing.Linear = {
+    
+    /**
+     * Function: easeIn
+     * 
+     * Parameters:
+     * t - {Float} time
+     * b - {Float} beginning position
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    easeIn: function(t, b, c, d) {
+        return c*t/d + b;
+    },
+    
+    /**
+     * Function: easeOut
+     * 
+     * Parameters:
+     * t - {Float} time
+     * b - {Float} beginning position
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    easeOut: function(t, b, c, d) {
+        return c*t/d + b;
+    },
+    
+    /**
+     * Function: easeInOut
+     * 
+     * Parameters:
+     * t - {Float} time
+     * b - {Float} beginning position
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    easeInOut: function(t, b, c, d) {
+        return c*t/d + b;
+    },
+
+    CLASS_NAME: "OpenLayers.Easing.Linear"
+};
+
+/**
+ * Namespace: OpenLayers.Easing.Expo
+ */
+OpenLayers.Easing.Expo = {
+    
+    /**
+     * Function: easeIn
+     * 
+     * Parameters:
+     * t - {Float} time
+     * b - {Float} beginning position
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    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
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    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
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    easeInOut: function(t, b, c, d) {
+        if (t==0) return b;
+        if (t==d) return b+c;
+        if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+        return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+    },
+
+    CLASS_NAME: "OpenLayers.Easing.Expo"
+};
+
+/**
+ * Namespace: OpenLayers.Easing.Quad
+ */
+OpenLayers.Easing.Quad = {
+    
+    /**
+     * Function: easeIn
+     * 
+     * Parameters:
+     * t - {Float} time
+     * b - {Float} beginning position
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    easeIn: function(t, b, c, d) {
+        return c*(t/=d)*t + b;
+    },
+    
+    /**
+     * Function: easeOut
+     * 
+     * Parameters:
+     * t - {Float} time
+     * b - {Float} beginning position
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    easeOut: function(t, b, c, d) {
+        return -c *(t/=d)*(t-2) + b;
+    },
+    
+    /**
+     * Function: easeInOut
+     * 
+     * Parameters:
+     * t - {Float} time
+     * b - {Float} beginning position
+     * c - {Float} total change
+     * d - {Float} duration of the transition
+     */
+    easeInOut: function(t, b, c, d) {
+        if ((t/=d/2) < 1) return c/2*t*t + b;
+        return -c/2 * ((--t)*(t-2) - 1) + b;
+    },
+
+    CLASS_NAME: "OpenLayers.Easing.Quad"
+};
diff --git a/lib/OpenLayers/Util.js b/lib/OpenLayers/Util.js
new file mode 100644
index 0000000..d197eab
--- /dev/null
+++ b/lib/OpenLayers/Util.js
@@ -0,0 +1,1797 @@
+/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for 
+ * full list of contributors). Published under the Clear BSD license.  
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
+ * full text of the license. */
+
+/**
+ * @requires OpenLayers/Console.js
+ */
+
+/**
+ * Namespace: Util
+ */
+OpenLayers.Util = {};
+
+/** 
+ * Function: getElement
+ * This is the old $() from prototype
+ */
+OpenLayers.Util.getElement = function() {
+    var elements = [];
+
+    for (var i=0, len=arguments.length; i<len; i++) {
+        var element = arguments[i];
+        if (typeof element == 'string') {
+            element = document.getElementById(element);
+        }
+        if (arguments.length == 1) {
+            return element;
+        }
+        elements.push(element);
+    }
+    return elements;
+};
+
+/**
+ * Function: isElement
+ * A cross-browser implementation of "e instanceof Element".
+ *
+ * Parameters:
+ * o - {Object} The object to test.
+ *
+ * Returns:
+ * {Boolean}
+ */
+OpenLayers.Util.isElement = function(o) {
+    return !!(o && o.nodeType === 1);
+};
+
+/** 
+ * Maintain existing definition of $.
+ */
+if(typeof window.$  === "undefined") {
+    window.$ = OpenLayers.Util.getElement;
+}
+
+/**
+ * APIFunction: extend
+ * Copy all properties of a source object to a destination object.  Modifies
+ *     the passed in destination object.  Any properties on the source object
+ *     that are set to undefined will not be (re)set on the destination object.
+ *
+ * Parameters:
+ * destination - {Object} The object that will be modified
+ * source - {Object} The object with properties to be set on the destination
+ *
+ * Returns:
+ * {Object} The destination object.
+ */
+OpenLayers.Util.extend = function(destination, source) {
+    destination = destination || {};
+    if(source) {
+        for(var property in source) {
+            var value = source[property];
+            if(value !== undefined) {
+                destination[property] = value;
+            }
+        }
+
+        /**
+         * IE doesn't include the toString property when iterating over an object's
+         * properties with the for(property in object) syntax.  Explicitly check if
+         * the source has its own toString property.
+         */
+
+        /*
+         * FF/Windows < 2.0.0.13 reports "Illegal operation on WrappedNative
+         * prototype object" when calling hawOwnProperty if the source object
+         * is an instance of window.Event.
+         */
+
+        var sourceIsEvt = typeof window.Event == "function"
+                          && source instanceof window.Event;
+
+        if(!sourceIsEvt
+           && source.hasOwnProperty && source.hasOwnProperty('toString')) {
+            destination.toString = source.toString;
+        }
+    }
+    return destination;
+};
+
+
+/** 
+ * Function: removeItem
+ * Remove an object from an array. Iterates through the array
+ *     to find the item, then removes it.
+ *
+ * Parameters:
+ * array - {Array}
+ * item - {Object}
+ * 
+ * Return
+ * {Array} A reference to the array
+ */
+OpenLayers.Util.removeItem = function(array, item) {
+    for(var i = array.length - 1; i >= 0; i--) {
+        if(array[i] == item) {
+            array.splice(i,1);
+            //break;more than once??
+        }
+    }
+    return array;
+};
+
+/**
+ * Function: clearArray
+ * *Deprecated*. This function will disappear in 3.0.
+ * Please use "array.length = 0" instead.
+ * 
+ * Parameters:
+ * array - {Array}
+ */
+OpenLayers.Util.clearArray = function(array) {
+    OpenLayers.Console.warn(
+        OpenLayers.i18n(
+            "methodDeprecated", {'newMethod': 'array = []'}
+        )
+    );
+    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 first object was found in the array.
+ *           If not found, returns -1.
+ */
+OpenLayers.Util.indexOf = function(array, obj) {
+    // use the build-in function if available.
+    if (typeof array.indexOf == "function") {
+        return array.indexOf(obj);
+    } else {
+        for (var i = 0, len = array.length; i < len; i++) {
+            if (array[i] == obj) {
+                return i;
+            }
+        }
+        return -1;   
+    }
+};
+
+
+
+/**
+ * Function: modifyDOMElement
+ * 
+ * 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, 
+ *                           relative, etc.
+ * border - {String}         The style.border attribute.  eg:
+ *                           solid black 2px
+ * overflow - {String}       The style.overview attribute.  
+ * opacity - {Float}         Fractional value (0.0 - 1.0)
+ */
+OpenLayers.Util.modifyDOMElement = function(element, id, px, sz, position, 
+                                            border, overflow, opacity) {
+
+    if (id) {
+        element.id = id;
+    }
+    if (px) {
+        element.style.left = px.x + "px";
+        element.style.top = px.y + "px";
+    }
+    if (sz) {
+        element.style.width = sz.w + "px";
+        element.style.height = sz.h + "px";
+    }
+    if (position) {
+        element.style.position = position;
+    }
+    if (border) {
+        element.style.border = border;
+    }
+    if (overflow) {
+        element.style.overflow = overflow;
+    }
+    if (parseFloat(opacity) >= 0.0 && parseFloat(opacity) < 1.0) {
+        element.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
+        element.style.opacity = opacity;
+    } else if (parseFloat(opacity) == 1.0) {
+        element.style.filter = '';
+        element.style.opacity = '';
+    }
+};
+
+/** 
+ * 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 
+ *               automatically.
+ * 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 
+ *                   background image.
+ * position - {String} The style.position value. eg: absolute,
+ *                     relative etc.
+ * 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: 
+ * {DOMElement} A DOM Div created with the specified attributes.
+ */
+OpenLayers.Util.createDiv = function(id, px, sz, imgURL, position, 
+                                     border, overflow, opacity) {
+
+    var dom = document.createElement('div');
+
+    if (imgURL) {
+        dom.style.backgroundImage = 'url(' + imgURL + ')';
+    }
+
+    //set generic properties
+    if (!id) {
+        id = OpenLayers.Util.createUniqueID("OpenLayersDiv");
+    }
+    if (!position) {
+        position = "absolute";
+    }
+    OpenLayers.Util.modifyDOMElement(dom, id, px, sz, position, 
+                                     border, overflow, opacity);
+
+    return dom;
+};
+
+/**
+ * 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.
+ * px - {<OpenLayers.Pixel>} The left and top positions.
+ * sz - {<OpenLayers.Size>} The style.width and style.height values.
+ * imgURL - {String} The url to use as the image source.
+ * position - {String} The style.position value.
+ * border - {String} The border to place around the image.
+ * 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.
+ */
+OpenLayers.Util.createImage = function(id, px, sz, imgURL, position, border,
+                                       opacity, delayDisplay) {
+
+    var image = document.createElement("img");
+
+    //set generic properties
+    if (!id) {
+        id = OpenLayers.Util.createUniqueID("OpenLayersDiv");
+    }
+    if (!position) {
+        position = "relative";
+    }
+    OpenLayers.Util.modifyDOMElement(image, id, px, sz, position, 
+                                     border, null, opacity);
+
+    if(delayDisplay) {
+        image.style.display = "none";
+        OpenLayers.Event.observe(image, "load", 
+            OpenLayers.Function.bind(OpenLayers.Util.onImageLoad, image));
+        OpenLayers.Event.observe(image, "error", 
+            OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError, image));
+        
+    }
+    
+    //set special properties
+    image.style.alt = id;
+    image.galleryImg = "no";
+    if (imgURL) {
+        image.src = imgURL;
+    }
+
+
+        
+    return image;
+};
+
+/**
+ * Function: setOpacity
+ * *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:
+ *     http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/haslayout.asp
+ *
+ * Parameters:
+ * element - {DOMElement} Set the opacity on this DOM element
+ * opacity - {Float} Opacity value (0.0 - 1.0)
+ */
+OpenLayers.Util.setOpacity = function(element, opacity) {
+    OpenLayers.Util.modifyDOMElement(element, null, null, null,
+                                     null, null, null, opacity);
+};
+
+/**
+ * Function: onImageLoad
+ * Bound to image load events.  For all images created with <createImage> or
+ *     <createAlphaImageDiv>, this function will be bound to the load event.
+ */
+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' 
+    // 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 
+    // 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.style.display = "";  
+    }
+    OpenLayers.Element.removeClass(this, "olImageLoadError");
+};
+
+/**
+ * Property: IMAGE_RELOAD_ATTEMPTS
+ * {Integer} How many times should we try to reload an image before giving up?
+ *           Default is 0
+ */
+OpenLayers.IMAGE_RELOAD_ATTEMPTS = 0;
+
+/**
+ * Function: onImageLoadError 
+ */
+OpenLayers.Util.onImageLoadError = function() {
+    this._attempts = (this._attempts) ? (this._attempts + 1) : 1;
+    if (this._attempts <= OpenLayers.IMAGE_RELOAD_ATTEMPTS) {
+        var urls = this.urls;
+        if (urls && urls instanceof Array && urls.length > 1){
+            var src = this.src.toString();
+            var current_url, k;
+            for (k = 0; current_url = urls[k]; k++){
+                if(src.indexOf(current_url) != -1){
+                    break;
+                }
+            }
+            var guess = Math.floor(urls.length * Math.random());
+            var new_url = urls[guess];
+            k = 0;
+            while(new_url == current_url && k++ < 4){
+                guess = Math.floor(urls.length * Math.random());
+                new_url = urls[guess];
+            }
+            this.src = src.replace(current_url, new_url);
+        } else {
+            this.src = this.src;
+        }
+    } else {
+        OpenLayers.Element.addClass(this, "olImageLoadError");
+    }
+    this.style.display = "";
+};
+
+/**
+ * Property: alphaHackNeeded
+ * {Boolean} true if the png alpha hack is necessary and possible, false otherwise.
+ */
+OpenLayers.Util.alphaHackNeeded = null;
+
+/**
+ * Function: alphaHack
+ * 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.
+ */
+OpenLayers.Util.alphaHack = function() {
+    if (OpenLayers.Util.alphaHackNeeded == null) {
+        var arVersion = navigator.appVersion.split("MSIE");
+        var version = parseFloat(arVersion[1]);
+        var filter = false;
+    
+        // 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 { 
+            filter = !!(document.body.filters);
+        } 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>}
+ * sz - {<OpenLayers.Size>}
+ * imgURL - {String}
+ * position - {String}
+ * 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, 
+                                               opacity) {
+
+    OpenLayers.Util.modifyDOMElement(div, id, px, sz, position,
+                                     null, null, opacity);
+
+    var img = div.childNodes[0];
+
+    if (imgURL) {
+        img.src = imgURL;
+    }
+    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";
+        }
+        if (sizing == null) {
+            sizing = "scale";
+        }
+        
+        div.style.filter = "progid:DXImageTransform.Microsoft" +
+                           ".AlphaImageLoader(src='" + img.src + "', " +
+                           "sizingMethod='" + sizing + "')";
+        if (parseFloat(div.style.opacity) >= 0.0 && 
+            parseFloat(div.style.opacity) < 1.0) {
+            div.style.filter += " alpha(opacity=" + div.style.opacity * 100 + ")";
+        }
+
+        img.style.filter = "alpha(opacity=0)";
+    }
+};
+
+/** 
+ * Function: createAlphaImageDiv
+ * 
+ * id - {String}
+ * px - {<OpenLayers.Pixel>}
+ * sz - {<OpenLayers.Size>}
+ * imgURL - {String}
+ * position - {String}
+ * border - {String}
+ * sizing - {String} 'crop', 'scale', or 'image'. Default is "scale"
+ * 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 
+ *              needed for transparency in IE, it is added.
+ */ 
+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, 
+                                          null, false);
+    div.appendChild(img);
+
+    if (delayDisplay) {
+        img.style.display = "none";
+        OpenLayers.Event.observe(img, "load",
+            OpenLayers.Function.bind(OpenLayers.Util.onImageLoad, div));
+        OpenLayers.Event.observe(img, "error",
+            OpenLayers.Function.bind(OpenLayers.Util.onImageLoadError, div));
+    }
+
+    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 
+ *     passed-in object, but storing them under an uppercased
+ *     version of the key at which they were stored.
+ * 
+ * Parameters: 
+ * object - {Object}
+ * 
+ * Returns: 
+ * {Object} A new Object with all the same keys but uppercased
+ */
+OpenLayers.Util.upperCaseObject = function (object) {
+    var uObject = {};
+    for (var key in object) {
+        uObject[key.toUpperCase()] = object[key];
+    }
+    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
+ *     are undefined in the to object will be set on the to object.
+ *
+ * Returns:
+ * {Object} A reference to the to object.  Note that the to argument is modified
+ *     in place and returned by this function.
+ */
+OpenLayers.Util.applyDefaults = function (to, from) {
+    to = to || {};
+    /*
+     * FF/Windows < 2.0.0.13 reports "Illegal operation on WrappedNative
+     * prototype object" when calling hawOwnProperty if the source object is an
+     * instance of window.Event.
+     */
+    var fromIsEvt = typeof window.Event == "function"
+                    && from instanceof window.Event;
+
+    for (var key in from) {
+        if (to[key] === undefined ||
+            (!fromIsEvt && from.hasOwnProperty
+             && from.hasOwnProperty(key) && !to.hasOwnProperty(key))) {
+            to[key] = from[key];
+        }
+    }
+    /**
+     * IE doesn't include the toString property when iterating over an object's
+     * properties with the for(property in object) syntax.  Explicitly check if
+     * the source has its own toString property.
+     */
+    if(!fromIsEvt && from && from.hasOwnProperty
+       && 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. 
+ *          (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). 
+ */
+OpenLayers.Util.getParameterString = function(params) {
+    var paramsArray = [];
+    
+    for (var key in params) {
+      var value = params[key];
+      if ((value != null) && (typeof value != 'function')) {
+        var encodedValue;
+        if (typeof value == 'object' && value.constructor == Array) {
+          /* value is an array; encode items and separate with "," */
+          var encodedItemArray = [];
+          var item;
+          for (var itemIndex=0, len=value.length; itemIndex<len; itemIndex++) {
+            item = value[itemIndex];
+            encodedItemArray.push(encodeURIComponent(
+                (item === null || item === undefined) ? "" : item)
+            );
+          }
+          encodedValue = encodedItemArray.join(",");
+        }
+        else {
+          /* value is a string; simply encode */
+          encodedValue = encodeURIComponent(value);
+        }
+        paramsArray.push(encodeURIComponent(key) + "=" + encodedValue);
+      }
+    }
+    
+    return paramsArray.join("&");
+};
+
+/**
+ * Function: urlAppend
+ * Appends a parameter string to a url. This function includes the logic for
+ * using the appropriate character (none, & or ?) to append to the url before
+ * appending the param string.
+ * 
+ * Parameters:
+ * url - {String} The url to append to
+ * paramStr - {String} The param string to append
+ * 
+ * Returns:
+ * {String} The new url
+ */
+OpenLayers.Util.urlAppend = function(url, paramStr) {
+    var newUrl = url;
+    if(paramStr) {
+        var parts = (url + " ").split(/[?&]/);
+        newUrl += (parts.pop() === " " ?
+            paramStr :
+            parts.length ? "&" + paramStr : "?" + paramStr);
+    }
+    return newUrl;
+};
+
+/**
+ * Property: ImgPath
+ * {String} Default is ''.
+ */
+OpenLayers.ImgPath = '';
+
+/** 
+ * Function: getImagesLocation
+ * 
+ * Returns:
+ * {String} The fully formatted image location string
+ */
+OpenLayers.Util.getImagesLocation = function() {
+    return OpenLayers.ImgPath || (OpenLayers._getScriptLocation() + "img/");
+};
+
+
+/** 
+ * Function: Try
+ * 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. 
+ *    If none executes successfully, returns null.
+ * 
+ * Returns:
+ * {*} The value returned by the first successfully executed function.
+ */
+OpenLayers.Util.Try = function() {
+    var returnValue = null;
+
+    for (var i=0, len=arguments.length; i<len; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) {}
+    }
+
+    return returnValue;
+};
+
+
+/** 
+ * Function: getNodes
+ * 
+ * These could/should be made namespace aware?
+ * 
+ * Parameters:
+ * p - {}
+ * tagName - {String}
+ * 
+ * Returns:
+ * {Array}
+ */
+OpenLayers.Util.getNodes=function(p, tagName) {
+    var nodes = OpenLayers.Util.Try(
+        function () {
+            return OpenLayers.Util._getNodes(p.documentElement.childNodes,
+                                            tagName);
+        },
+        function () {
+            return OpenLayers.Util._getNodes(p.childNodes, tagName);
+        }
+    );
+    return nodes;
+};
+
+/**
+ * Function: _getNodes
+ * 
+ * Parameters:
+ * nodes - {Array}
+ * tagName - {String}
+ * 
+ * Returns:
+ * {Array}
+ */
+OpenLayers.Util._getNodes=function(nodes, tagName) {
+    var retArray = [];
+    for (var i=0, len=nodes.length; i<len; i++) {
+        if (nodes[i].nodeName==tagName) {
+            retArray.push(nodes[i]);
+        }
+    }
+
+    return retArray;
+};
+
+
+
+/**
+ * Function: getTagText
+ * 
+ * Parameters:
+ * parent - {}
+ * item - {String}
+ * index - {Integer}
+ * 
+ * Returns:
+ * {String}
+ */
+OpenLayers.Util.getTagText = function (parent, item, index) {
+    var result = OpenLayers.Util.getNodes(parent, item);
+    if (result && (result.length > 0))
+    {
+        if (!index) {
+            index=0;
+        }
+        if (result[index].childNodes.length > 1) {
+            return result.childNodes[1].nodeValue; 
+        }
+        else if (result[index].childNodes.length == 1) {
+            return result[index].firstChild.nodeValue; 
+        }
+    } 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( 
+        function() {
+            val = node.text;
+            if (!val) {
+                val = node.textContent;
+            }
+            if (!val) {
+                val = node.firstChild.nodeValue;
+            }
+        }, 
+        function() {
+            val = node.textContent;
+        }); 
+    return val;
+};
+
+/** 
+ * Function: mouseLeft
+ * 
+ * Parameters:
+ * evt - {Event}
+ * div - {HTMLDivElement}
+ * 
+ * Returns:
+ * {Boolean}
+ */
+OpenLayers.Util.mouseLeft = function (evt, div) {
+    // start with the element to which the mouse has moved
+    var target = (evt.relatedTarget) ? evt.relatedTarget : evt.toElement;
+    // walk up the DOM tree.
+    while (target != div && target != null) {
+        target = target.parentNode;
+    }
+    // if the target we stop at isn't the div, then we've left the div.
+    return (target != div);
+};
+
+/**
+ * Property: precision
+ * {Number} The number of significant digits to retain to avoid
+ * floating point precision errors.
+ *
+ * We use 14 as a "safe" default because, although IEEE 754 double floats
+ * (standard on most modern operating systems) support up to about 16
+ * significant digits, 14 significant digits are sufficient to represent
+ * sub-millimeter accuracy in any coordinate system that anyone is likely to
+ * use with OpenLayers.
+ *
+ * If DEFAULT_PRECISION is set to 0, the original non-truncating behavior
+ * of OpenLayers <2.8 is preserved. Be aware that this will cause problems
+ * with certain projections, e.g. spherical Mercator.
+ *
+ */
+OpenLayers.Util.DEFAULT_PRECISION = 14;
+
+/**
+ * Function: toFloat
+ * Convenience method to cast an object to a Number, rounded to the
+ * desired floating point precision.
+ *
+ * Parameters:
+ * number    - {Number} The number to cast and round.
+ * precision - {Number} An integer suitable for use with
+ *      Number.toPrecision(). Defaults to OpenLayers.Util.DEFAULT_PRECISION.
+ *      If set to 0, no rounding is performed.
+ *
+ * Returns:
+ * {Number} The cast, rounded number.
+ */
+OpenLayers.Util.toFloat = function (number, precision) {
+    if (precision == null) {
+        precision = OpenLayers.Util.DEFAULT_PRECISION;
+    }
+    var number;
+    if (precision == 0) {
+        number = parseFloat(number);
+    } else {
+        number = parseFloat(parseFloat(number).toPrecision(precision));
+    }
+    return number;
+};
+
+/**
+ * Function: rad
+ * 
+ * Parameters:
+ * x - {Float}
+ * 
+ * Returns:
+ * {Float}
+ */
+OpenLayers.Util.rad = function(x) {return x*Math.PI/180;};
+
+/**
+ * Function: deg
+ *
+ * Parameters:
+ * x - {Float}
+ *
+ * Returns:
+ * {Float}
+ */
+OpenLayers.Util.deg = function(x) {return x*180/Math.PI;};
+
+/**
+ * Property: VincentyConstants
+ * {Object} Constants for Vincenty functions.
+ */
+OpenLayers.Util.VincentyConstants = {
+    a: 6378137,
+    b: 6356752.3142,
+    f: 1/298.257223563
+};
+
+/**
+ * APIFunction: distVincenty
+ * 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
+ *     coordinates (decimal degrees) and the return distance is in kilometers.
+ */
+OpenLayers.Util.distVincenty = function(p1, p2) {
+    var ct = OpenLayers.Util.VincentyConstants;
+    var a = ct.a, b = ct.b, f = ct.f;
+
+    var L = OpenLayers.Util.rad(p2.lon - p1.lon);
+    var U1 = Math.atan((1-f) * Math.tan(OpenLayers.Util.rad(p1.lat)));
+    var U2 = Math.atan((1-f) * Math.tan(OpenLayers.Util.rad(p2.lat)));
+    var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);
+    var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);
+    var lambda = L, lambdaP = 2*Math.PI;
+    var iterLimit = 20;
+    while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0) {
+        var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);
+        var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) +
+        (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
+        if (sinSigma==0) {
+            return 0;  // co-incident points
+        }
+        var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda;
+        var sigma = Math.atan2(sinSigma, cosSigma);
+        var alpha = Math.asin(cosU1 * cosU2 * sinLambda / sinSigma);
+        var cosSqAlpha = Math.cos(alpha) * Math.cos(alpha);
+        var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha;
+        var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
+        lambdaP = lambda;
+        lambda = L + (1-C) * f * Math.sin(alpha) *
+        (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
+    }
+    if (iterLimit==0) {
+        return NaN;  // formula failed to converge
+    }
+    var uSq = cosSqAlpha * (a*a - b*b) / (b*b);
+    var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
+    var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
+    var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
+        B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
+    var s = b*A*(sigma-deltaSigma);
+    var d = s.toFixed(3)/1000; // round to 1mm precision
+    return d;
+};
+
+/**
+ * APIFunction: destinationVincenty
+ * Calculate destination point given start point lat/long (numeric degrees),
+ * bearing (numeric degrees) & distance (in m).
+ * Adapted from Chris Veness work, see
+ * http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html
+ *
+ * Parameters:
+ * lonlat  - {<OpenLayers.LonLat>} (or any object with both .lat, .lon
+ *     properties) The start point.
+ * brng     - {Float} The bearing (degrees).
+ * distance - {Float} The ground distance (meters).
+ *
+ * Returns:
+ * {<OpenLayers.LonLat>} The destination point.
+ */
+OpenLayers.Util.destinationVincenty = function(lonlat, brng, dist) {
+    var u = OpenLayers.Util;
+    var ct = u.VincentyConstants;
+    var a = ct.a, b = ct.b, f = ct.f;
+
+    var lon1 = lonlat.lon;
+    var lat1 = lonlat.lat;
+
+    var s = dist;
+    var alpha1 = u.rad(brng);
+    var sinAlpha1 = Math.sin(alpha1);
+    var cosAlpha1 = Math.cos(alpha1);
+
+    var tanU1 = (1-f) * Math.tan(u.rad(lat1));
+    var cosU1 = 1 / Math.sqrt((1 + tanU1*tanU1)), sinU1 = tanU1*cosU1;
+    var sigma1 = Math.atan2(tanU1, cosAlpha1);
+    var sinAlpha = cosU1 * sinAlpha1;
+    var cosSqAlpha = 1 - sinAlpha*sinAlpha;
+    var uSq = cosSqAlpha * (a*a - b*b) / (b*b);
+    var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
+    var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
+
+    var sigma = s / (b*A), sigmaP = 2*Math.PI;
+    while (Math.abs(sigma-sigmaP) > 1e-12) {
+        var cos2SigmaM = Math.cos(2*sigma1 + sigma);
+        var sinSigma = Math.sin(sigma);
+        var cosSigma = Math.cos(sigma);
+        var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
+            B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
+        sigmaP = sigma;
+        sigma = s / (b*A) + deltaSigma;
+    }
+
+    var tmp = sinU1*sinSigma - cosU1*cosSigma*cosAlpha1;
+    var lat2 = Math.atan2(sinU1*cosSigma + cosU1*sinSigma*cosAlpha1,
+        (1-f)*Math.sqrt(sinAlpha*sinAlpha + tmp*tmp));
+    var lambda = Math.atan2(sinSigma*sinAlpha1, cosU1*cosSigma - sinU1*sinSigma*cosAlpha1);
+    var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
+    var L = lambda - (1-C) * f * sinAlpha *
+        (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
+
+    var revAz = Math.atan2(sinAlpha, -tmp);  // final bearing
+
+    return new OpenLayers.LonLat(lon1+u.deg(L), u.deg(lat2));
+};
+
+/**
+ * Function: getParameters
+ * 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.
+ */
+OpenLayers.Util.getParameters = function(url) {
+    // if no url specified, take it from the location bar
+    url = url || window.location.href;
+
+    //parse out parameters portion of url string
+    var paramsString = "";
+    if (OpenLayers.String.contains(url, '?')) {
+        var start = url.indexOf('?') + 1;
+        var end = OpenLayers.String.contains(url, "#") ?
+                    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) {
+        var keyValue = pairs[i].split('=');
+        if (keyValue[0]) {
+            var key = decodeURIComponent(keyValue[0]);
+            var value = keyValue[1] || ''; //empty string if no value
+
+            //decode individual values (being liberal by replacing "+" with " ")
+            value = decodeURIComponent(value.replace(/\+/g, " ")).split(",");
+
+            //if there's only one value, do not return as array                    
+            if (value.length == 1) {
+                value = value[0];
+            }                
+            
+            parameters[key] = value;
+         }
+     }
+    return parameters;
+};
+
+/**
+ * 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.
+ */
+OpenLayers.Util.getArgs = function(url) {
+    OpenLayers.Console.warn(
+        OpenLayers.i18n(
+            "methodDeprecated", {'newMethod': 'OpenLayers.Util.getParameters'}
+        )
+    );
+    return OpenLayers.Util.getParameters(url);
+};
+
+/**
+ * Property: lastSeqID
+ * {Integer} The ever-incrementing count variable.
+ *           Used for generating unique ids.
+ */
+OpenLayers.Util.lastSeqID = 0;
+
+/**
+ * Function: createUniqueID
+ * 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.
+ */
+OpenLayers.Util.createUniqueID = function(prefix) {
+    if (prefix == null) {
+        prefix = "id_";
+    }
+    OpenLayers.Util.lastSeqID += 1; 
+    return prefix + OpenLayers.Util.lastSeqID;        
+};
+
+/**
+ * Constant: INCHES_PER_UNIT
+ * {Object} Constant inches per unit -- borrowed from MapServer mapscale.c
+ * derivation of nautical miles from http://en.wikipedia.org/wiki/Nautical_mile
+ * Includes the full set of units supported by CS-MAP (http://trac.osgeo.org/csmap/)
+ * and PROJ.4 (http://trac.osgeo.org/proj/)
+ * 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 = { 
+    'inches': 1.0,
+    'ft': 12.0,
+    'mi': 63360.0,
+    'm': 39.3701,
+    'km': 39370.1,
+    'dd': 4374754,
+    'yd': 36
+};
+OpenLayers.INCHES_PER_UNIT["in"]= OpenLayers.INCHES_PER_UNIT.inches;
+OpenLayers.INCHES_PER_UNIT["degrees"] = OpenLayers.INCHES_PER_UNIT.dd;
+OpenLayers.INCHES_PER_UNIT["nmi"] = 1852 * OpenLayers.INCHES_PER_UNIT.m;
+
+// Units from CS-Map
+OpenLayers.METERS_PER_INCH = 0.02540005080010160020;
+OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT, {
+    "Inch": OpenLayers.INCHES_PER_UNIT.inches,
+    "Meter": 1.0 / OpenLayers.METERS_PER_INCH,   //EPSG:9001
+    "Foot": 0.30480060960121920243 / OpenLayers.METERS_PER_INCH,   //EPSG:9003
+    "IFoot": 0.30480000000000000000 / OpenLayers.METERS_PER_INCH,   //EPSG:9002
+    "ClarkeFoot": 0.3047972651151 / OpenLayers.METERS_PER_INCH,   //EPSG:9005
+    "SearsFoot": 0.30479947153867624624 / OpenLayers.METERS_PER_INCH,   //EPSG:9041
+    "GoldCoastFoot": 0.30479971018150881758 / OpenLayers.METERS_PER_INCH,   //EPSG:9094
+    "IInch": 0.02540000000000000000 / OpenLayers.METERS_PER_INCH,
+    "MicroInch": 0.00002540000000000000 / OpenLayers.METERS_PER_INCH,
+    "Mil": 0.00000002540000000000 / OpenLayers.METERS_PER_INCH,
+    "Centimeter": 0.01000000000000000000 / OpenLayers.METERS_PER_INCH,
+    "Kilometer": 1000.00000000000000000000 / OpenLayers.METERS_PER_INCH,   //EPSG:9036
+    "Yard": 0.91440182880365760731 / OpenLayers.METERS_PER_INCH,
+    "SearsYard": 0.914398414616029 / OpenLayers.METERS_PER_INCH,   //EPSG:9040
+    "IndianYard": 0.91439853074444079983 / OpenLayers.METERS_PER_INCH,   //EPSG:9084
+    "IndianYd37": 0.91439523 / OpenLayers.METERS_PER_INCH,   //EPSG:9085
+    "IndianYd62": 0.9143988 / OpenLayers.METERS_PER_INCH,   //EPSG:9086
+    "IndianYd75": 0.9143985 / OpenLayers.METERS_PER_INCH,   //EPSG:9087
+    "IndianFoot": 0.30479951 / OpenLayers.METERS_PER_INCH,   //EPSG:9080
+    "IndianFt37": 0.30479841 / OpenLayers.METERS_PER_INCH,   //EPSG:9081
+    "IndianFt62": 0.3047996 / OpenLayers.METERS_PER_INCH,   //EPSG:9082
+    "IndianFt75": 0.3047995 / OpenLayers.METERS_PER_INCH,   //EPSG:9083
+    "Mile": 1609.34721869443738887477 / OpenLayers.METERS_PER_INCH,
+    "IYard": 0.91440000000000000000 / OpenLayers.METERS_PER_INCH,   //EPSG:9096
+    "IMile": 1609.34400000000000000000 / OpenLayers.METERS_PER_INCH,   //EPSG:9093
+    "NautM": 1852.00000000000000000000 / OpenLayers.METERS_PER_INCH,   //EPSG:9030
+    "Lat-66": 110943.316488932731 / OpenLayers.METERS_PER_INCH,
+    "Lat-83": 110946.25736872234125 / OpenLayers.METERS_PER_INCH,
+    "Decimeter": 0.10000000000000000000 / OpenLayers.METERS_PER_INCH,
+    "Millimeter": 0.00100000000000000000 / OpenLayers.METERS_PER_INCH,
+    "Dekameter": 10.00000000000000000000 / OpenLayers.METERS_PER_INCH,
+    "Decameter": 10.00000000000000000000 / OpenLayers.METERS_PER_INCH,
+    "Hectometer": 100.00000000000000000000 / OpenLayers.METERS_PER_INCH,
+    "GermanMeter": 1.0000135965 / OpenLayers.METERS_PER_INCH,   //EPSG:9031
+    "CaGrid": 0.999738 / OpenLayers.METERS_PER_INCH,
+    "ClarkeChain": 20.1166194976 / OpenLayers.METERS_PER_INCH,   //EPSG:9038
+    "GunterChain": 20.11684023368047 / OpenLayers.METERS_PER_INCH,   //EPSG:9033
+    "BenoitChain": 20.116782494375872 / OpenLayers.METERS_PER_INCH,   //EPSG:9062
+    "SearsChain": 20.11676512155 / OpenLayers.METERS_PER_INCH,   //EPSG:9042
+    "ClarkeLink": 0.201166194976 / OpenLayers.METERS_PER_INCH,   //EPSG:9039
+    "GunterLink": 0.2011684023368047 / OpenLayers.METERS_PER_INCH,   //EPSG:9034
+    "BenoitLink": 0.20116782494375872 / OpenLayers.METERS_PER_INCH,   //EPSG:9063
+    "SearsLink": 0.2011676512155 / OpenLayers.METERS_PER_INCH,   //EPSG:9043
+    "Rod": 5.02921005842012 / OpenLayers.METERS_PER_INCH,
+    "IntnlChain": 20.1168 / OpenLayers.METERS_PER_INCH,   //EPSG:9097
+    "IntnlLink": 0.201168 / OpenLayers.METERS_PER_INCH,   //EPSG:9098
+    "Perch": 5.02921005842012 / OpenLayers.METERS_PER_INCH,
+    "Pole": 5.02921005842012 / OpenLayers.METERS_PER_INCH,
+    "Furlong": 201.1684023368046 / OpenLayers.METERS_PER_INCH,
+    "Rood": 3.778266898 / OpenLayers.METERS_PER_INCH,
+    "CapeFoot": 0.3047972615 / OpenLayers.METERS_PER_INCH,
+    "Brealey": 375.00000000000000000000 / OpenLayers.METERS_PER_INCH,
+    "ModAmFt": 0.304812252984505969011938 / OpenLayers.METERS_PER_INCH,
+    "Fathom": 1.8288 / OpenLayers.METERS_PER_INCH,
+    "NautM-UK": 1853.184 / OpenLayers.METERS_PER_INCH,
+    "50kilometers": 50000.0 / OpenLayers.METERS_PER_INCH,
+    "150kilometers": 150000.0 / OpenLayers.METERS_PER_INCH
+});
+
+//unit abbreviations supported by PROJ.4
+OpenLayers.Util.extend(OpenLayers.INCHES_PER_UNIT, {
+    "mm": OpenLayers.INCHES_PER_UNIT["Meter"] / 1000.0,
+    "cm": OpenLayers.INCHES_PER_UNIT["Meter"] / 100.0,
+    "dm": OpenLayers.INCHES_PER_UNIT["Meter"] * 100.0,
+    "km": OpenLayers.INCHES_PER_UNIT["Meter"] * 1000.0,
+    "kmi": OpenLayers.INCHES_PER_UNIT["nmi"],    //International Nautical Mile
+    "fath": OpenLayers.INCHES_PER_UNIT["Fathom"], //International Fathom
+    "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-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
+    "ind-ft": OpenLayers.INCHES_PER_UNIT["IndianFt37"],  //Indian Foot
+    "ind-ch": 20.11669506 / OpenLayers.METERS_PER_INCH  //Indian Chain
+});
+
+/** 
+ * Constant: DOTS_PER_INCH
+ * {Integer} 72 (A sensible default)
+ */
+OpenLayers.DOTS_PER_INCH = 72;
+
+/**
+ * Function: normalizeScale
+ * 
+ * Parameters:
+ * scale - {float}
+ * 
+ * Returns:
+ * {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 
+ *         1 / scale
+ */
+OpenLayers.Util.normalizeScale = function (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 
+ *     parameters.  If the given scale is falsey, the returned resolution will
+ *     be undefined.
+ */
+OpenLayers.Util.getResolutionFromScale = function (scale, units) {
+    var resolution;
+    if (scale) {
+        if (units == null) {
+            units = "degrees";
+        }
+        var normScale = OpenLayers.Util.normalizeScale(scale);
+        resolution = 1 / (normScale * OpenLayers.INCHES_PER_UNIT[units]
+                                        * OpenLayers.DOTS_PER_INCH);        
+    }
+    return resolution;
+};
+
+/**
+ * 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 
+ *         parameters.
+ */
+OpenLayers.Util.getScaleFromResolution = function (resolution, units) {
+
+    if (units == null) {
+        units = "degrees";
+    }
+
+    var scale = resolution * OpenLayers.INCHES_PER_UNIT[units] *
+                    OpenLayers.DOTS_PER_INCH;
+    return scale;
+};
+
+/**
+ * Function: safeStopPropagation
+ * *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}
+ */
+OpenLayers.Util.safeStopPropagation = function(evt) {
+    OpenLayers.Event.stop(evt, true);
+};
+
+/**
+ * Function: pagePositon
+ * Calculates the position of an element on the page. 
+ *
+ * Parameters:
+ * forElement - {DOMElement}
+ * 
+ * Returns:
+ * {Array} two item array, L value then T value.
+ */
+OpenLayers.Util.pagePosition = function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    var child = forElement;
+    while(element) {
+
+        if(element == document.body) {
+            if(OpenLayers.Element.getStyle(child, 'position') == 'absolute') {
+                break;
+            }
+        }
+        
+        valueT += element.offsetTop  || 0;
+        valueL += element.offsetLeft || 0;
+
+        child = element;
+        try {
+            // wrapping this in a try/catch because IE chokes on the offsetParent
+            element = element.offsetParent;
+        } catch(e) {
+            OpenLayers.Console.error(OpenLayers.i18n(
+                                  "pagePositionFailed",{'elemId':element.id}));
+            break;
+        }
+    }
+
+    element = forElement;
+    while(element) {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+        element = element.parentNode;
+    }
+    
+    return [valueL, valueT];
+};
+
+
+/** 
+ * Function: isEquivalentUrl
+ * Test two URLs for equivalence. 
+ * 
+ * Setting 'ignoreCase' allows for case-independent comparison.
+ * 
+ * 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) 
+ *  - Arguments (so they can be out of order)
+ *  
+ * Parameters:
+ * url1 - {String}
+ * url2 - {String}
+ * options - {Object} Allows for customization of comparison:
+ *                    'ignoreCase' - Default is True
+ *                    'ignorePort80' - Default is True
+ *                    'ignoreHash' - Default is True
+ *
+ * Returns:
+ * {Boolean} Whether or not the two URLs are equivalent
+ */
+OpenLayers.Util.isEquivalentUrl = function(url1, url2, options) {
+    options = options || {};
+
+    OpenLayers.Util.applyDefaults(options, {
+        ignoreCase: true,
+        ignorePort80: true,
+        ignoreHash: true
+    });
+
+    var urlObj1 = OpenLayers.Util.createUrlObject(url1, options);
+    var urlObj2 = OpenLayers.Util.createUrlObject(url2, options);
+
+    //compare all keys except for "args" (treated below)
+    for(var key in urlObj1) {
+        if(key !== "args") {
+            if(urlObj1[key] != urlObj2[key]) {
+                return false;
+            }
+        }
+    }
+
+    // compare search args - irrespective of order
+    for(var key in urlObj1.args) {
+        if(urlObj1.args[key] != urlObj2.args[key]) {
+            return false;
+        }
+        delete urlObj2.args[key];
+    }
+    // urlObj2 shouldn't have any args left
+    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 
+ *          and ready for comparison
+ */
+OpenLayers.Util.createUrlObject = function(url, options) {
+    options = options || {};
+
+    // deal with relative urls first
+    if(!(/^\w+:\/\//).test(url)) {
+        var loc = window.location;
+        var port = loc.port ? ":" + loc.port : "";
+        var fullUrl = loc.protocol + "//" + loc.host.split(":").shift() + port;
+        if(url.indexOf("/") === 0) {
+            // full pathname
+            url = fullUrl + url;
+        } else {
+            // relative to current path
+            var parts = loc.pathname.split("/");
+            parts.pop();
+            url = fullUrl + parts.join("/") + "/" + url;
+        }
+    }
+  
+    if (options.ignoreCase) {
+        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;  
+
+    //port (get uniform browser behavior with port 80 here)
+    if(options.ignorePort80) {
+        urlObject.port = (a.port == "80" || a.port == "0") ? "" : a.port;
+    } else {
+        urlObject.port = (a.port == "" || a.port == "0") ? "80" : a.port;
+    }
+
+    //hash
+    urlObject.hash = (options.ignoreHash || a.hash === "#") ? "" : a.hash;  
+    
+    //args
+    var queryString = a.search;
+    if (!queryString) {
+        var qMark = url.indexOf("?");
+        queryString = (qMark != -1) ? url.substr(qMark) : "";
+    }
+    urlObject.args = OpenLayers.Util.getParameters(queryString);
+
+    //pathname (uniform browser behavior with leading "/")
+    urlObject.pathname = (a.pathname.charAt(0) == "/") ? a.pathname : "/" + a.pathname;
+    
+    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)) 
+                                  : url.substr(0, qMark);
+    }
+    return head;
+};
+
+
+/**
+ * Function: getBrowserName
+ * 
+ * Returns:
+ * {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 
+ *           return an empty string.
+ */
+OpenLayers.Util.getBrowserName = function() {
+    var browserName = "";
+    
+    var ua = navigator.userAgent.toLowerCase();
+    if ( ua.indexOf( "opera" ) != -1 ) {
+        browserName = "opera";
+    } else if ( ua.indexOf( "msie" ) != -1 ) {
+        browserName = "msie";
+    } else if ( ua.indexOf( "safari" ) != -1 ) {
+        browserName = "safari";
+    } else if ( ua.indexOf( "mozilla" ) != -1 ) {
+        if ( ua.indexOf( "firefox" ) != -1 ) {
+            browserName = "firefox";
+        } else {
+            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 
+ *     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 
+ *     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. 
+ * 
+ * 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;
+
+    //fix a dimension, if specified.
+    if (size) {
+        if (size.w) {
+            w = size.w;
+            container.style.width = w + "px";
+        } else if (size.h) {
+            h = size.h;
+            container.style.height = h + "px";
+        }
+    }
+
+    //add css classes, if specified
+    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) {
+        for (var i=0, l=content.childNodes.length; i<l; i++) {
+            if (!content.childNodes[i].style) continue;
+            content.childNodes[i].style.overflow = "visible";
+        }
+    }
+    
+    // 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;
+    var parent = container.parentNode;
+    while (parent && parent.tagName.toLowerCase()!="body") {
+        var parentPosition = OpenLayers.Element.getStyle(parent, "position");
+        if(parentPosition == "absolute") {
+            parentHasPositionAbsolute = true;
+            break;
+        } else if (parentPosition && parentPosition != "static") {
+            break;
+        }
+        parent = parent.parentNode;
+    }
+
+    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);
+    }
+
+    // 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 
+ *     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. 
+ * 
+ * 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';
+        scr.style.top = '-1000px';
+        scr.style.left = '-1000px';
+        scr.style.width = '100px';
+        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;
+    }
+
+    return scrollbarWidth;
+};
+
+/**
+ * APIFunction: getFormattedLonLat
+ * This function will return latitude or longitude value formatted as 
+ *
+ * Parameters:
+ * coordinate - {Float} the coordinate value to be formatted
+ * axis - {String} value of either 'lat' or 'lon' to indicate which axis is to
+ *          to be formatted (default = lat)
+ * dmsOption - {String} specify the precision of the output can be one of:
+ *           'dms' show degrees minutes and seconds
+ *           'dm' show only degrees and minutes
+ *           'd' show only degrees
+ * 
+ * Returns:
+ * {String} the coordinate value formatted as a string
+ */
+OpenLayers.Util.getFormattedLonLat = function(coordinate, axis, dmsOption) {
+    if (!dmsOption) {
+        dmsOption = 'dms';    //default to show degree, minutes, seconds
+    }
+    var abscoordinate = Math.abs(coordinate)
+    var coordinatedegrees = Math.floor(abscoordinate);
+
+    var coordinateminutes = (abscoordinate - coordinatedegrees)/(1/60);
+    var tempcoordinateminutes = coordinateminutes;
+    coordinateminutes = Math.floor(coordinateminutes);
+    var coordinateseconds = (tempcoordinateminutes - coordinateminutes)/(1/60);
+    coordinateseconds =  Math.round(coordinateseconds*10);
+    coordinateseconds /= 10;
+
+    if( coordinatedegrees < 10 ) {
+        coordinatedegrees = "0" + coordinatedegrees;
+    }
+    var str = coordinatedegrees + "\u00B0";
+
+    if (dmsOption.indexOf('dm') >= 0) {
+        if( coordinateminutes < 10 ) {
+            coordinateminutes = "0" + coordinateminutes;
+        }
+        str += coordinateminutes + "'";
+  
+        if (dmsOption.indexOf('dms') >= 0) {
+            if( coordinateseconds < 10 ) {
+                coordinateseconds = "0" + coordinateseconds;
+            }
+            str += coordinateseconds + '"';
+        }
+    }
+    
+    if (axis == "lon") {
+        str += coordinate < 0 ? OpenLayers.i18n("W") : OpenLayers.i18n("E");
+    } else {
+        str += coordinate < 0 ? OpenLayers.i18n("S") : OpenLayers.i18n("N");
+    }
+    return str;
+};
+
diff --git a/lib/Rico/Color.js b/lib/Rico/Color.js
new file mode 100644
index 0000000..e62a89d
--- /dev/null
+++ b/lib/Rico/Color.js
@@ -0,0 +1,244 @@
+/*
+ * This file has been edited substantially from the Rico-released version by
+ * the OpenLayers development team.
+ *
+ * This file is licensed under the Apache License, Version 2.0.
+ */
+OpenLayers.Rico.Color = OpenLayers.Class({
+
+   initialize: function(red, green, blue) {
+      this.rgb = { r: red, g : green, b : blue };
+   },
+
+   setRed: function(r) {
+      this.rgb.r = r;
+   },
+
+   setGreen: function(g) {
+      this.rgb.g = g;
+   },
+
+   setBlue: function(b) {
+      this.rgb.b = b;
+   },
+
+   setHue: function(h) {
+
+      // get an HSB model, and set the new hue...
+      var hsb = this.asHSB();
+      hsb.h = h;
+
+      // convert back to RGB...
+      this.rgb = OpenLayers.Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b);
+   },
+
+   setSaturation: function(s) {
+      // get an HSB model, and set the new hue...
+      var hsb = this.asHSB();
+      hsb.s = s;
+
+      // convert back to RGB and set values...
+      this.rgb = OpenLayers.Rico.Color.HSBtoRGB(hsb.h, hsb.s, hsb.b);
+   },
+
+   setBrightness: function(b) {
+      // get an HSB model, and set the new hue...
+      var hsb = this.asHSB();
+      hsb.b = b;
+
+      // convert back to RGB and set values...
+      this.rgb = OpenLayers.Rico.Color.HSBtoRGB( hsb.h, hsb.s, hsb.b );
+   },
+
+   darken: function(percent) {
+      var hsb  = this.asHSB();
+      this.rgb = OpenLayers.Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.max(hsb.b - percent,0));
+   },
+
+   brighten: function(percent) {
+      var hsb  = this.asHSB();
+      this.rgb = OpenLayers.Rico.Color.HSBtoRGB(hsb.h, hsb.s, Math.min(hsb.b + percent,1));
+   },
+
+   blend: function(other) {
+      this.rgb.r = Math.floor((this.rgb.r + other.rgb.r)/2);
+      this.rgb.g = Math.floor((this.rgb.g + other.rgb.g)/2);
+      this.rgb.b = Math.floor((this.rgb.b + other.rgb.b)/2);
+   },
+
+   isBright: function() {
+      var hsb = this.asHSB();
+      return this.asHSB().b > 0.5;
+   },
+
+   isDark: function() {
+      return ! this.isBright();
+   },
+
+   asRGB: function() {
+      return "rgb(" + this.rgb.r + "," + this.rgb.g + "," + this.rgb.b + ")";
+   },
+
+   asHex: function() {
+      return "#" + this.rgb.r.toColorPart() + this.rgb.g.toColorPart() + this.rgb.b.toColorPart();
+   },
+
+   asHSB: function() {
+      return OpenLayers.Rico.Color.RGBtoHSB(this.rgb.r, this.rgb.g, this.rgb.b);
+   },
+
+   toString: function() {
+      return this.asHex();
+   }
+
+});
+
+OpenLayers.Rico.Color.createFromHex = function(hexCode) {
+  if(hexCode.length==4) {
+    var shortHexCode = hexCode; 
+    var hexCode = '#';
+    for(var i=1;i<4;i++) { 
+        hexCode += (shortHexCode.charAt(i) + 
+shortHexCode.charAt(i)); 
+    }
+  }
+   if ( hexCode.indexOf('#') == 0 ) {
+       hexCode = hexCode.substring(1);
+   }
+   var red   = hexCode.substring(0,2);
+   var green = hexCode.substring(2,4);
+   var blue  = hexCode.substring(4,6);
+   return new OpenLayers.Rico.Color( parseInt(red,16), parseInt(green,16), parseInt(blue,16) );
+};
+
+/**
+ * Factory method for creating a color from the background of
+ * an HTML element.
+ */
+OpenLayers.Rico.Color.createColorFromBackground = function(elem) {
+
+   var actualColor = 
+      RicoUtil.getElementsComputedStyle(OpenLayers.Util.getElement(elem), 
+                                        "backgroundColor", 
+                                        "background-color");
+
+   if ( actualColor == "transparent" && elem.parentNode ) {
+      return OpenLayers.Rico.Color.createColorFromBackground(elem.parentNode);
+   }
+   if ( actualColor == null ) {
+      return new OpenLayers.Rico.Color(255,255,255);
+   }
+   if ( actualColor.indexOf("rgb(") == 0 ) {
+      var colors = actualColor.substring(4, actualColor.length - 1 );
+      var colorArray = colors.split(",");
+      return new OpenLayers.Rico.Color( parseInt( colorArray[0] ),
+                            parseInt( colorArray[1] ),
+                            parseInt( colorArray[2] )  );
+
+   }
+   else if ( actualColor.indexOf("#") == 0 ) {
+      return OpenLayers.Rico.Color.createFromHex(actualColor);
+   }
+   else {
+      return new OpenLayers.Rico.Color(255,255,255);
+   }
+};
+
+OpenLayers.Rico.Color.HSBtoRGB = function(hue, saturation, brightness) {
+
+   var red   = 0;
+    var green = 0;
+    var blue  = 0;
+
+   if (saturation == 0) {
+      red = parseInt(brightness * 255.0 + 0.5);
+       green = red;
+       blue = red;
+    }
+    else {
+      var h = (hue - Math.floor(hue)) * 6.0;
+      var f = h - Math.floor(h);
+      var p = brightness * (1.0 - saturation);
+      var q = brightness * (1.0 - saturation * f);
+      var t = brightness * (1.0 - (saturation * (1.0 - f)));
+
+      switch (parseInt(h)) {
+         case 0:
+            red   = (brightness * 255.0 + 0.5);
+            green = (t * 255.0 + 0.5);
+            blue  = (p * 255.0 + 0.5);
+            break;
+         case 1:
+            red   = (q * 255.0 + 0.5);
+            green = (brightness * 255.0 + 0.5);
+            blue  = (p * 255.0 + 0.5);
+            break;
+         case 2:
+            red   = (p * 255.0 + 0.5);
+            green = (brightness * 255.0 + 0.5);
+            blue  = (t * 255.0 + 0.5);
+            break;
+         case 3:
+            red   = (p * 255.0 + 0.5);
+            green = (q * 255.0 + 0.5);
+            blue  = (brightness * 255.0 + 0.5);
+            break;
+         case 4:
+            red   = (t * 255.0 + 0.5);
+            green = (p * 255.0 + 0.5);
+            blue  = (brightness * 255.0 + 0.5);
+            break;
+          case 5:
+            red   = (brightness * 255.0 + 0.5);
+            green = (p * 255.0 + 0.5);
+            blue  = (q * 255.0 + 0.5);
+            break;
+        }
+    }
+
+   return { r : parseInt(red), g : parseInt(green) , b : parseInt(blue) };
+};
+
+OpenLayers.Rico.Color.RGBtoHSB = function(r, g, b) {
+
+   var hue;
+   var saturation;
+   var brightness;
+
+   var cmax = (r > g) ? r : g;
+   if (b > cmax) {
+      cmax = b;
+   }
+   var cmin = (r < g) ? r : g;
+   if (b < cmin) {
+      cmin = b;
+   }
+   brightness = cmax / 255.0;
+   if (cmax != 0) {
+      saturation = (cmax - cmin)/cmax;
+   } else {
+      saturation = 0;
+   }
+   if (saturation == 0) {
+      hue = 0;
+   } else {
+      var redc   = (cmax - r)/(cmax - cmin);
+        var greenc = (cmax - g)/(cmax - cmin);
+        var bluec  = (cmax - b)/(cmax - cmin);
+
+        if (r == cmax) {
+           hue = bluec - greenc;
+        } else if (g == cmax) {
+           hue = 2.0 + redc - bluec;
+      } else {
+           hue = 4.0 + greenc - redc;
+      }
+        hue = hue / 6.0;
+        if (hue < 0) {
+           hue = hue + 1.0;
+        }
+   }
+
+   return { h : hue, s : saturation, b : brightness };
+};
+
diff --git a/lib/Rico/Corner.js b/lib/Rico/Corner.js
new file mode 100644
index 0000000..80f73c0
--- /dev/null
+++ b/lib/Rico/Corner.js
@@ -0,0 +1,330 @@
+/*
+ * This file has been edited substantially from the Rico-released
+ * version by the OpenLayers development team.
+ *  
+ *  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  
+ *  
+ * 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.
+ *
+ */  
+OpenLayers.Rico = new Object();
+OpenLayers.Rico.Corner = {
+
+    round: function(e, options) {
+        e = OpenLayers.Util.getElement(e);
+        this._setOptions(options);
+
+        var color = this.options.color;
+        if ( this.options.color == "fromElement" ) {
+            color = this._background(e);
+        }
+        var bgColor = this.options.bgColor;
+        if ( this.options.bgColor == "fromParent" ) {
+            bgColor = this._background(e.offsetParent);
+        }
+        this._roundCornersImpl(e, color, bgColor);
+    },
+
+    /**   This is a helper function to change the background
+    *     color of <div> that has had Rico rounded corners added.
+    *
+    *     It seems we cannot just set the background color for the
+    *     outer <div> so each <span> element used to create the
+    *     corners must have its background color set individually.
+    *
+    * @param {DOM} theDiv - A child of the outer <div> that was
+    *                        supplied to the `round` method.
+    *
+    * @param {String} newColor - The new background color to use.
+    */
+    changeColor: function(theDiv, newColor) {
+   
+        theDiv.style.backgroundColor = newColor;
+
+        var spanElements = theDiv.parentNode.getElementsByTagName("span");
+        
+        for (var currIdx = 0; currIdx < spanElements.length; currIdx++) {
+            spanElements[currIdx].style.backgroundColor = newColor;
+        }
+    }, 
+
+
+    /**   This is a helper function to change the background
+    *     opacity of <div> that has had Rico rounded corners added.
+    *
+    *     See changeColor (above) for algorithm explanation
+    *
+    * @param {DOM} theDiv A child of the outer <div> that was
+    *                        supplied to the `round` method.
+    *
+    * @param {int} newOpacity The new opacity to use (0-1).
+    */
+    changeOpacity: function(theDiv, newOpacity) {
+   
+        var mozillaOpacity = newOpacity;
+        var ieOpacity = 'alpha(opacity=' + newOpacity * 100 + ')';
+        
+        theDiv.style.opacity = mozillaOpacity;
+        theDiv.style.filter = ieOpacity;
+
+        var spanElements = theDiv.parentNode.getElementsByTagName("span");
+        
+        for (var currIdx = 0; currIdx < spanElements.length; currIdx++) {
+            spanElements[currIdx].style.opacity = mozillaOpacity;
+            spanElements[currIdx].style.filter = ieOpacity;
+        }
+
+    },
+
+    /** this function takes care of redoing the rico cornering
+    *    
+    *    you can't just call updateRicoCorners() again and pass it a 
+    *    new options string. you have to first remove the divs that 
+    *    rico puts on top and below the content div.
+    *
+    * @param {DOM} theDiv - A child of the outer <div> that was
+    *                        supplied to the `round` method.
+    *
+    * @param {Object} options - list of options
+    */
+    reRound: function(theDiv, options) {
+
+        var topRico = theDiv.parentNode.childNodes[0];
+        //theDiv would be theDiv.parentNode.childNodes[1]
+        var bottomRico = theDiv.parentNode.childNodes[2];
+       
+        theDiv.parentNode.removeChild(topRico);
+        theDiv.parentNode.removeChild(bottomRico); 
+
+        this.round(theDiv.parentNode, options);
+    }, 
+
+   _roundCornersImpl: function(e, color, bgColor) {
+      if(this.options.border) {
+         this._renderBorder(e,bgColor);
+      }
+      if(this._isTopRounded()) {
+         this._roundTopCorners(e,color,bgColor);
+      }
+      if(this._isBottomRounded()) {
+         this._roundBottomCorners(e,color,bgColor);
+      }
+   },
+
+   _renderBorder: function(el,bgColor) {
+      var borderValue = "1px solid " + this._borderColor(bgColor);
+      var borderL = "border-left: "  + borderValue;
+      var borderR = "border-right: " + borderValue;
+      var style   = "style='" + borderL + ";" + borderR +  "'";
+      el.innerHTML = "<div " + style + ">" + el.innerHTML + "</div>";
+   },
+
+   _roundTopCorners: function(el, color, bgColor) {
+      var corner = this._createCorner(bgColor);
+      for(var i=0 ; i < this.options.numSlices ; i++ ) {
+         corner.appendChild(this._createCornerSlice(color,bgColor,i,"top"));
+      }
+      el.style.paddingTop = 0;
+      el.insertBefore(corner,el.firstChild);
+   },
+
+   _roundBottomCorners: function(el, color, bgColor) {
+      var corner = this._createCorner(bgColor);
+      for(var i=(this.options.numSlices-1) ; i >= 0 ; i-- ) {
+         corner.appendChild(this._createCornerSlice(color,bgColor,i,"bottom"));
+      }
+      el.style.paddingBottom = 0;
+      el.appendChild(corner);
+   },
+
+   _createCorner: function(bgColor) {
+      var corner = document.createElement("div");
+      corner.style.backgroundColor = (this._isTransparent() ? "transparent" : bgColor);
+      return corner;
+   },
+
+   _createCornerSlice: function(color,bgColor, n, position) {
+      var slice = document.createElement("span");
+
+      var inStyle = slice.style;
+      inStyle.backgroundColor = color;
+      inStyle.display  = "block";
+      inStyle.height   = "1px";
+      inStyle.overflow = "hidden";
+      inStyle.fontSize = "1px";
+
+      var borderColor = this._borderColor(color,bgColor);
+      if ( this.options.border && n == 0 ) {
+         inStyle.borderTopStyle    = "solid";
+         inStyle.borderTopWidth    = "1px";
+         inStyle.borderLeftWidth   = "0px";
+         inStyle.borderRightWidth  = "0px";
+         inStyle.borderBottomWidth = "0px";
+         inStyle.height            = "0px"; // assumes css compliant box model
+         inStyle.borderColor       = borderColor;
+      }
+      else if(borderColor) {
+         inStyle.borderColor = borderColor;
+         inStyle.borderStyle = "solid";
+         inStyle.borderWidth = "0px 1px";
+      }
+
+      if ( !this.options.compact && (n == (this.options.numSlices-1)) ) {
+         inStyle.height = "2px";
+      }
+      this._setMargin(slice, n, position);
+      this._setBorder(slice, n, position);
+      return slice;
+   },
+
+   _setOptions: function(options) {
+      this.options = {
+         corners : "all",
+         color   : "fromElement",
+         bgColor : "fromParent",
+         blend   : true,
+         border  : false,
+         compact : false
+      };
+      OpenLayers.Util.extend(this.options, options || {});
+
+      this.options.numSlices = this.options.compact ? 2 : 4;
+      if ( this._isTransparent() ) {
+         this.options.blend = false;
+      }
+   },
+
+   _whichSideTop: function() {
+      if ( this._hasString(this.options.corners, "all", "top") ) {
+         return "";
+      }
+      if ( this.options.corners.indexOf("tl") >= 0 && this.options.corners.indexOf("tr") >= 0 ) {
+         return "";
+      }
+      if (this.options.corners.indexOf("tl") >= 0) {
+         return "left";
+      } else if (this.options.corners.indexOf("tr") >= 0) {
+          return "right";
+      }
+      return "";
+   },
+
+   _whichSideBottom: function() {
+      if ( this._hasString(this.options.corners, "all", "bottom") ) {
+         return "";
+      }
+      if ( this.options.corners.indexOf("bl")>=0 && this.options.corners.indexOf("br")>=0 ) {
+         return "";
+      }
+
+      if(this.options.corners.indexOf("bl") >=0) {
+         return "left";
+      } else if(this.options.corners.indexOf("br")>=0) {
+         return "right";
+      }
+      return "";
+   },
+
+   _borderColor : function(color,bgColor) {
+      if ( color == "transparent" ) {
+         return bgColor;
+      } else if ( this.options.border ) {
+         return this.options.border;
+      } else if ( this.options.blend ) {
+         return this._blend( bgColor, color );
+      } else {
+         return "";
+      }
+   },
+
+
+   _setMargin: function(el, n, corners) {
+      var marginSize = this._marginSize(n);
+      var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom();
+
+      if ( whichSide == "left" ) {
+         el.style.marginLeft = marginSize + "px"; el.style.marginRight = "0px";
+      }
+      else if ( whichSide == "right" ) {
+         el.style.marginRight = marginSize + "px"; el.style.marginLeft  = "0px";
+      }
+      else {
+         el.style.marginLeft = marginSize + "px"; el.style.marginRight = marginSize + "px";
+      }
+   },
+
+   _setBorder: function(el,n,corners) {
+      var borderSize = this._borderSize(n);
+      var whichSide = corners == "top" ? this._whichSideTop() : this._whichSideBottom();
+      if ( whichSide == "left" ) {
+         el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = "0px";
+      }
+      else if ( whichSide == "right" ) {
+         el.style.borderRightWidth = borderSize + "px"; el.style.borderLeftWidth  = "0px";
+      }
+      else {
+         el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px";
+      }
+      if (this.options.border != false) {
+        el.style.borderLeftWidth = borderSize + "px"; el.style.borderRightWidth = borderSize + "px";
+      }
+   },
+
+   _marginSize: function(n) {
+      if ( this._isTransparent() ) {
+         return 0;
+      }
+      var marginSizes          = [ 5, 3, 2, 1 ];
+      var blendedMarginSizes   = [ 3, 2, 1, 0 ];
+      var compactMarginSizes   = [ 2, 1 ];
+      var smBlendedMarginSizes = [ 1, 0 ];
+
+      if ( this.options.compact && this.options.blend ) {
+         return smBlendedMarginSizes[n];
+      } else if ( this.options.compact ) {
+         return compactMarginSizes[n];
+      } else if ( this.options.blend ) {
+         return blendedMarginSizes[n];
+      } else {
+         return marginSizes[n];
+      }
+   },
+
+   _borderSize: function(n) {
+      var transparentBorderSizes = [ 5, 3, 2, 1 ];
+      var blendedBorderSizes     = [ 2, 1, 1, 1 ];
+      var compactBorderSizes     = [ 1, 0 ];
+      var actualBorderSizes      = [ 0, 2, 0, 0 ];
+
+      if ( this.options.compact && (this.options.blend || this._isTransparent()) ) {
+         return 1;
+      } else if ( this.options.compact ) {
+         return compactBorderSizes[n];
+      } else if ( this.options.blend ) {
+         return blendedBorderSizes[n];
+      } else if ( this.options.border ) {
+         return actualBorderSizes[n];
+      } else if ( this._isTransparent() ) {
+         return transparentBorderSizes[n];
+      }
+      return 0;
+   },
+
+   _hasString: function(str) { for(var i=1 ; i<arguments.length ; i++) if (str.indexOf(arguments[i]) >= 0) { return true; } return false; },
+   _blend: function(c1, c2) { var cc1 = OpenLayers.Rico.Color.createFromHex(c1); cc1.blend(OpenLayers.Rico.Color.createFromHex(c2)); return cc1; },
+   _background: function(el) { try { return OpenLayers.Rico.Color.createColorFromBackground(el).asHex(); } catch(err) { return "#ffffff"; } },
+   _isTransparent: function() { return this.options.color == "transparent"; },
+   _isTopRounded: function() { return this._hasString(this.options.corners, "all", "top", "tl", "tr"); },
+   _isBottomRounded: function() { return this._hasString(this.options.corners, "all", "bottom", "bl", "br"); },
+   _hasSingleTextChild: function(el) { return el.childNodes.length == 1 && el.childNodes[0].nodeType == 3; }
+};
\ No newline at end of file
diff --git a/license.txt b/license.txt
new file mode 100644
index 0000000..598af50
--- /dev/null
+++ b/license.txt
@@ -0,0 +1,38 @@
+This license applies to all code and content in the 'branches', 'trunk', and
+'project' directories of the Openlayers code repository at svn.openlayers.org,
+and applies to all release of OpenLayers later than 2.5.
+
+Copyright (c) 2005-2010 OpenLayers Contributors. See authors.txt for
+  full list.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the
+   distribution.
+
+ * Neither the name of OpenLayers nor the names of its contributors 
+   may be used to endorse or promote products derived from this 
+   software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE.  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/news.txt b/news.txt
new file mode 100644
index 0000000..8e3694e
--- /dev/null
+++ b/news.txt
@@ -0,0 +1,59 @@
+OpenLayers 2.10
+  r10722
+  Released 09/09/10
+  http://trac.openlayers.org/wiki/Release/2.10/Notes
+
+OpenLayers 2.9:
+ r10251
+ Released 04/22/10
+ http://trac.openlayers.org/wiki/Release/2.9/Notes
+
+OpenLayers 2.8:
+ r9492
+ Released 06/22/09
+ http://trac.openlayers.org/wiki/Release/2.8/Notes
+
+OpenLayers 2.7:
+ r8063
+ Released 09/29/08
+ http://trac.openlayers.org/wiki/Release/2.7/Notes
+
+OpenLayers 2.6:
+ r6945
+ Released 04/15/08
+ http://trac.openlayers.org/wiki/Release/2.6/Notes
+
+OpenLayers 2.5:
+ r4899
+ Released 10/09/07 
+ http://trac.openlayers.org/wiki/Release/2.5/Notes
+
+OpenLayers 2.4:
+ r3198
+ Released 05/29/07 
+ http://trac.openlayers.org/wiki/Release/2.4/Notes
+
+OpenLayers 2.3:
+ r2255
+ Released 02/21/07 
+ http://trac.openlayers.org/wiki/Release/2.3/Notes
+
+OpenLayers 2.2:
+ r1866
+ Released 11/15/06 
+ http://trac.openlayers.org/wiki/Release/2.2/Notes
+
+OpenLayers 2.1:
+ r1521
+ Released 10/02/06
+ http://trac.openlayers.org/wiki/Release/2.1/Notes
+
+OpenLayers 2.0:
+ r1368
+ Released 08/25/06
+ http://trac.openlayers.org/wiki/Release/2.0/Notes
+
+OpenLayers 1.0
+ r787
+ Released 06/27/06
+ Initial release.
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..de338e8
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1,72 @@
+OpenLayers
+-=-=-=-=-=-
+Copyright (c) 2005-2010 OpenLayers Contributors. See authors.txt for
+more details.
+
+OpenLayers is a JavaScript library for building map applications
+on the web. OpenLayers is made available under a BSD-license.
+Please see license.txt in this distribution for more details.
+
+------------------
+Getting OpenLayers
+------------------
+
+OpenLayers lives at http://www.openlayers.org/.
+
+You can get OpenLayers from
+    http://trac.openlayers.org/wiki/HowToDownload.
+
+---------------------
+Installing OpenLayers
+---------------------
+
+You can use OpenLayers as-is by copying build/OpenLayers.js and the
+entire theme/ and img/ directories up to your webserver, putting them 
+in the same directory. The files can be in subdirectories on your website, 
+or right in the root of the site, as in these examples. 
+To include the OpenLayers library in your web page from the root of the site, use:
+
+  <script type="text/javascript" src="/OpenLayers.js" />
+
+As an example, using bash (with the release files in ~/openlayers ):
+$ cd /var/www/html
+$ cp ~/openlayers/build/OpenLayers.js ./
+$ cp -R ~/openlayers/theme ./
+$ cp -R ~/openlayers/img ./
+
+If you want to use the multiple-file version of OpenLayers (for, say,
+debugging or development purposes), copy the lib/ directory up to your
+webserver in the same directory you put the img/ folder. Then add
+the following to your web page instead:
+
+  <script type="text/javascript" src="/lib/OpenLayers.js" />
+
+As an example, using bash (with the release files in ~/openlayers ):
+$ cd /var/www/html
+$ cp -R ~/openlayers/lib ./
+$ cp -R ~/openlayers/theme ./
+$ cp -R ~/openlayers/img ./
+
+
+------------------------------------
+Using OpenLayers in Your Own Website
+------------------------------------
+
+The examples/ directory is full of useful examples.
+
+Documentation is available at http://trac.openlayers.org/wiki/Documentation.
+You can generate the API documentation with http://www.naturaldocs.org/:
+As an example, using bash (with the release files in ~/openlayers ):
+$ cd ~/openlayers/
+$ /path/to/NaturalDocs -i lib/ -o HTML doc/ -p doc_config/ -s Default OL
+
+Information on changes in the API is available in news.txt.
+
+--------------------------
+Contributing to OpenLayers
+--------------------------
+
+Please join the email lists at http://openlayers.org/mailman/listinfo
+Patches are welcome!
+
+= 30 =
diff --git a/release-license.txt b/release-license.txt
new file mode 100644
index 0000000..7c2f8bb
--- /dev/null
+++ b/release-license.txt
@@ -0,0 +1,3 @@
+This license information is now available at:
+
+http://svn.openlayers.org/trunk/openlayers/license.txt
diff --git a/repository-license.txt b/repository-license.txt
new file mode 100644
index 0000000..7c2f8bb
--- /dev/null
+++ b/repository-license.txt
@@ -0,0 +1,3 @@
+This license information is now available at:
+
+http://svn.openlayers.org/trunk/openlayers/license.txt
diff --git a/tests/Ajax.html b/tests/Ajax.html
new file mode 100644
index 0000000..7608bc1
--- /dev/null
+++ b/tests/Ajax.html
@@ -0,0 +1,27 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_Ajax_loadUrl(t) {
+        t.plan(5);
+        var _get = OpenLayers.Request.GET;
+        var caller = {};
+        var onComplete = function() {};
+        var onFailure = function() {};
+        var params = {};
+        OpenLayers.Request.GET = function(config) {
+            t.eq(config.url, "http://example.com/?format=image+kml", "correct url")
+            t.eq(config.params, params, "correct params");
+            t.eq(config.scope, caller, "correct scope");
+            t.ok(config.success === onComplete, "correct success callback");
+            t.ok(config.failure === onFailure, "correct failure callback");
+        };
+        OpenLayers.loadURL("http://example.com/?format=image+kml", params, caller, onComplete, onFailure);
+        OpenLayers.Request.GET = _get;
+    }
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/BaseTypes.html b/tests/BaseTypes.html
new file mode 100644
index 0000000..c17d686
--- /dev/null
+++ b/tests/BaseTypes.html
@@ -0,0 +1,518 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_String_startsWith(t) {
+        t.plan(3);
+        
+        var str = "chickenHead";
+        
+        var test1 = "chicken";
+        var test2 = "beet";
+
+        t.ok(OpenLayers.String.startsWith(str, "chicken"),
+             "'chickenHead' starts with 'chicken'");
+        t.ok(!OpenLayers.String.startsWith(str, "Head"),
+             "'chickenHead' does not start with 'Head'");
+        t.ok(!OpenLayers.String.startsWith(str, "beet"),
+             "'chickenHead' doesnt start with 'beet'");
+    }
+    
+    function test_String_contains(t) {
+        t.plan(4);
+        
+        var str = "chickenHead";
+
+        t.ok(OpenLayers.String.contains(str, "chicken"),
+             "(beginning) 'chickenHead' contains with 'chicken'");
+        t.ok(OpenLayers.String.contains(str, "ick"),
+             "(middle) 'chickenHead' contains with 'ick'");
+        t.ok(OpenLayers.String.contains(str, "Head"),
+             "(end) 'chickenHead' contains with 'Head'");
+        t.ok(!OpenLayers.String.startsWith(str, "beet"),
+             "'chickenHead' doesnt start with 'beet'");
+    }
+    
+    function test_String_trim(t) {
+        t.plan(6);
+        
+        var str = "chickenHead";
+        t.eq(OpenLayers.String.trim(str),
+             "chickenHead", "string with no extra whitespace is left alone");
+
+        str = "  chickenHead";
+        t.eq(OpenLayers.String.trim(str),
+             "chickenHead", "string with extra whitespace at beginning is trimmed correctly");
+
+        str = "chickenHead    ";
+        t.eq(OpenLayers.String.trim(str),
+             "chickenHead", "string with extra whitespace at end is trimmed correctly");
+
+        str = "  chickenHead    ";
+        t.eq(OpenLayers.String.trim(str),
+             "chickenHead", "string with extra whitespace at beginning and end is trimmed correctly");
+
+        str = "chicken\nHead   ";
+        t.eq(OpenLayers.String.trim(str),
+             "chicken\nHead", "multi-line string with extra whitespace at end is trimmed correctly");
+        str = " ";
+        t.eq(OpenLayers.String.trim(str), "", "whitespace string is trimmed correctly");
+    }
+        
+    function test_String_camelize(t) {
+        t.plan(7);
+        
+        var str = "chickenhead";
+        t.eq(OpenLayers.String.camelize(str), "chickenhead", "string with no hyphens is left alone");
+
+        str = "chicken-head";
+        t.eq(OpenLayers.String.camelize(str), "chickenHead", "string with one middle hyphen is camelized correctly");
+
+        str = "chicken-head-man";
+        t.eq(OpenLayers.String.camelize(str), "chickenHeadMan", "string with multiple middle hyphens is camelized correctly");
+
+        str = "-chickenhead";
+        t.eq(OpenLayers.String.camelize(str), "Chickenhead", "string with starting hyphen is camelized correctly (capitalized)");
+
+        str = "-chicken-head-man";
+        t.eq(OpenLayers.String.camelize(str), "ChickenHeadMan", "string with starting hypen and multiple middle hyphens is camelized correctly");
+
+        str = "chicken-";
+        t.eq(OpenLayers.String.camelize(str), "chicken", "string ending in hyphen is camelized correctly (hyphen dropped)");
+
+        str = "chicken-head-man-";
+        t.eq(OpenLayers.String.camelize(str), "chickenHeadMan", "string with multiple middle hyphens and end hyphen is camelized correctly (end hyphen dropped)");
+
+
+    }
+    
+    function test_String_format(t) {
+        var unchanged = [
+            "", "${ ", "${", " ${", "${${", "${}", "${${}}", " ${ ${",
+            "}", "${${} }"
+        ]
+        t.plan(7 + unchanged.length);
+
+        var format = OpenLayers.String.format;
+        
+        var expected;
+        for(var i=0; i<unchanged.length; ++i) {
+            expected = unchanged[i];
+            t.eq(format(expected), expected,
+                 "'" + expected + "' left unchanged");
+        }
+
+        t.eq(format("${foo} none"),
+             "undefined none", "undefined properties don't bomb");
+
+        window.foo = "bar";
+        t.eq(format("${foo} none"),
+             "bar none", "window context used if none passed");
+        
+        var context = {bar: "foo"};
+        t.eq(format("${bar} foo", context), "foo foo",
+             "properties accessed from context");
+        
+        var context = {bar: "foo", foo: "bar"};
+        t.eq(format("a ${bar} is a ${foo}", context), "a foo is a bar",
+             "multiple properties replaced correctly");
+        
+        // test context with properties that are functions
+        var context = {
+            bar: "church",
+            getDrunk: function() {
+                return arguments[0];
+            }
+        };
+        t.eq(
+            format("I go to the ${bar} to ${getDrunk}.", context, ["eat pretzels"]),
+            "I go to the church to eat pretzels.",
+            "function correctly called in context with arguments"
+        );
+        
+        // test that things don't break
+        var context = {
+            meaning: function(truth) {
+                return truth;
+            }
+        };
+        t.eq(
+            format("In life, truth is ${meaning}.", context),
+            "In life, truth is undefined.",
+            "still works if arguments are not supplied"
+        );
+
+        // test contexts where attribute values can be objects
+        var context = {
+            a: {
+                b: {
+                    c: 'd',
+                    e: function() {
+                        return 'f';
+                    }
+                }
+            }
+        };
+        t.eq(
+            format("${a.b.c} ${a.b.e} ${a.b.q} ${a} ${a...b...c}", context),
+            "d f undefined [object Object] d",
+            "attribute values that are objects are supported"
+        );
+
+    }
+
+    function test_String_isNumeric(t) {
+        var cases = [
+            {value: "3", expect: true},
+            {value: "+3", expect: true},
+            {value: "-3", expect: true},
+            {value: "3.0", expect: true},
+            {value: "+3.0", expect: true},
+            {value: "-3.0", expect: true},
+            {value: "6.02e23", expect: true},
+            {value: "+1.0e-100", expect: true},
+            {value: "-1.0e+100", expect: true},
+            {value: "1E100", expect: true},
+            {value: null, expect: false},
+            {value: true, expect: false},
+            {value: false, expect: false},
+            {value: undefined, expect: false},
+            {value: "", expect: false},
+            {value: "3 ", expect: false},
+            {value: " 3", expect: false},
+            {value: "1e", expect: false},
+            {value: "1+e", expect: false},
+            {value: "1-e", expect: false}
+        ];
+        t.plan(cases.length);
+        
+        var func = OpenLayers.String.isNumeric;
+        var obj, val, got, exp;
+        for(var i=0; i<cases.length; ++i) {
+            obj = cases[i];
+            val = obj.value;
+            exp = obj.expect;
+            got = func(val);
+            t.eq(got, exp, "'" + val + "' returns " + exp);
+        }
+        
+    }
+    
+    function test_Number_numericIf(t) {
+        var cases = [
+            {value: "3", expect: 3},
+            {value: "+3", expect: 3},
+            {value: "-3", expect: -3},
+            {value: "3.0", expect: 3},
+            {value: "+3.0", expect: 3},
+            {value: "-3.0", expect: -3},
+            {value: "6.02e23", expect: 6.02e23},
+            {value: "+1.0e-100", expect: 1e-100},
+            {value: "-1.0e+100", expect: -1e100},
+            {value: "1E100", expect: 1e100},
+            {value: null, expect: null},
+            {value: true, expect: true},
+            {value: false, expect: false},
+            {value: undefined, expect: undefined},
+            {value: "", expect: ""},
+            {value: "3 ", expect: "3 "},
+            {value: " 3", expect: " 3"},
+            {value: "1e", expect: "1e"},
+            {value: "1+e", expect: "1+e"},
+            {value: "1-e", expect: "1-e"}
+        ];
+        t.plan(cases.length);
+        
+        var func = OpenLayers.String.numericIf;
+        var obj, val, got, exp;
+        for(var i=0; i<cases.length; ++i) {
+            obj = cases[i];
+            val = obj.value;
+            exp = obj.expect;
+            got = func(val);
+            t.eq(got, exp, "'" + val + "' returns " + exp);
+        }
+    }
+   
+   
+    function test_Number_limitSigDigs(t) {
+        t.plan(9);
+      
+        var num = 123456789; 
+        t.eq(OpenLayers.Number.limitSigDigs(num), 0, "passing 'null' as sig returns 0");
+        t.eq(OpenLayers.Number.limitSigDigs(num, -1), 0, "passing -1 as sig returns 0");
+        t.eq(OpenLayers.Number.limitSigDigs(num, 0), 0, "passing 0 as sig returns 0");
+        
+        t.eq(OpenLayers.Number.limitSigDigs(num, 15), 123456789, "passing sig greater than num digits in number returns number unmodified");
+        
+        t.eq(OpenLayers.Number.limitSigDigs(num, 1), 100000000, "passing sig 1 works");
+        t.eq(OpenLayers.Number.limitSigDigs(num, 3), 123000000, "passing middle sig works (rounds down)");
+        t.eq(OpenLayers.Number.limitSigDigs(num, 5), 123460000, "passing middle sig works (rounds up)");
+        t.eq(OpenLayers.Number.limitSigDigs(num, 9), 123456789, "passing sig equal to num digits in number works");
+
+        num = 1234.56789;
+        t.eq(OpenLayers.Number.limitSigDigs(num, 5), 1234.6, "running limSigDig() on a floating point number works fine");
+        
+    }
+    
+    function test_Number_format(t) {
+        t.plan(9);
+        var format = OpenLayers.Number.format;
+        t.eq(format(12345), "12,345", "formatting an integer number works");
+        t.eq(format(12345, 3), "12,345.000", "zero padding an integer works");
+        t.eq(format(12345, null, ","), "12,345", "adding thousands separator to an integer works");
+        t.eq(format(12345, 0, ","), "12,345", "adding thousands separator to an integer with defined 0 decimal places works");
+
+        var num = 12345.6789
+        t.eq(format(num, null, "", ","), "12345,6789", "only changing decimal separator and leaving everything else untouched works");
+        t.eq(format(num, 5), "12,345.67890", "filling up decimals with trailing zeroes works");
+        t.eq(format(num, 3, ".", ","), "12.345,679", "rounding and changing decimal/thousands separator in function call works");
+        t.eq(format(num, 0, ""), "12346", "empty thousands separator in function call works");
+        OpenLayers.Number.thousandsSeparator = ".";
+        OpenLayers.Number.decimalSeparator = ",";
+        t.eq(format(num, 3), "12.345,679", "changing thousands/decimal separator globally works");
+    }
+
+    function test_Function_bind(t) {
+        t.plan(12);
+
+        g_obj = {};
+        g_Arg1 = {};
+        g_Arg2 = {};
+        g_Arg3 = {};
+        g_Arg4 = {};
+        var foo = function(x,y,z,a) {
+            t.ok(this == g_obj, "context correctly set");
+            t.ok(x == g_Arg1, "arg1 passed correctly");    
+            t.ok(y == g_Arg2, "arg2 passed correctly");    
+            t.ok(z == g_Arg3, "arg3 passed correctly");    
+            t.ok(a == g_Arg4, "arg4 passed correctly");    
+            t.eq(arguments.length, 4, "correct number of arguments ((regression test for #876))");
+        };
+
+        var newFoo = OpenLayers.Function.bind(foo, g_obj, g_Arg1, g_Arg2);
+
+        newFoo(g_Arg3, g_Arg4);
+        
+        //run again to make sure the arguments are handled correctly
+        newFoo(g_Arg3, g_Arg4);
+    }
+
+    function test_Function_bindAsEventListener(t) {
+        t.plan(4);
+
+        g_obj = {};
+        g_Event = {};
+        g_WindowEvent = {};
+
+        var foo = function(x) {
+            t.ok(this == g_obj, "context correctly set");
+            g_X = x;
+        };
+
+        var newFoo = OpenLayers.Function.bindAsEventListener(foo, g_obj);
+        
+
+        g_X = null;
+        newFoo(g_Event);
+        t.ok(g_X == g_Event, "event properly passed as first argument when event specified");
+    
+        g_X = null;
+        newFoo();
+        t.ok(g_X == window.event, "window.event properly passed as first argument when nothing specified");
+    }
+
+    function test_Array_filter(t) {
+        
+        t.plan(8);
+
+        OpenLayers.Array.filter(["foo"], function(item, index, array) {
+            t.eq(item, "foo", "callback called with proper item");
+            t.eq(index, 0, "callback called with proper index");
+            t.eq(array, ["foo"], "callback called with proper array");
+            t.eq(this, {"foo": "bar"}, "callback called with this set properly");
+        }, {"foo": "bar"});
+
+        var array = [0, 1, 2, 3];
+        var select = OpenLayers.Array.filter(array, function(value) {
+            return value > 1;
+        });
+        t.eq(select, [2, 3], "filter works for basic callback");
+        t.eq(array, [0, 1, 2, 3], "filter doesn't modify original");
+        
+        var obj = {
+            test: function(value) {
+                if(value > 1) {
+                    return true;
+                }
+            }
+        };
+        var select = OpenLayers.Array.filter(array, function(value) {
+            return this.test(value);
+        }, obj);
+        t.eq(select, [2, 3], "filter works for callback and caller");
+        t.eq(array, [0, 1, 2, 3], "filter doesn't modify original");
+        
+        
+    }
+
+    function test_Date_toISOString(t) {
+        t.plan(3);
+    
+        var date, str;
+
+        // check valid date
+        date = new Date(Date.UTC(2010, 10, 27, 18, 19, 15, 123));
+        str = OpenLayers.Date.toISOString(date);
+        t.eq(str, "2010-11-27T18:19:15.123Z", "valid date");
+        
+        // check zero padding
+        date = new Date(Date.UTC(2010, 7, 7, 18, 9, 5, 12));
+        str = OpenLayers.Date.toISOString(date);
+        t.eq(str, "2010-08-07T18:09:05.012Z", "zero padding");
+        
+        // check invalid date
+        date = new Date("foo");
+        str = OpenLayers.Date.toISOString(date);
+        t.eq(str, "Invalid Date", "invalid date");
+
+    }
+    
+    function test_Date_parse(t) {
+        
+        t.plan(93);
+        
+        var cases = {
+            "2000": {
+                year: 2000,
+                month: 0,
+                date: 1
+            },
+            "2005-10": {
+                year: 2005,
+                month: 9,
+                date: 1
+            },
+            "1971-07-23": {
+                year: 1971,
+                month: 6,
+                date: 23
+            },
+            "1801-11-20T04:30:15Z": {
+                year: 1801,
+                month: 10,
+                date: 20,
+                hour: 4,
+                minutes: 30,
+                seconds: 15
+            },
+            "1989-06-15T18:30:15.91Z": {
+                year: 1989,
+                month: 5,
+                date: 15,
+                hour: 18,
+                minutes: 30,
+                seconds: 15,
+                milliseconds: 910
+            },
+            "1989-06-15T18:30:15.091Z": {
+                year: 1989,
+                month: 5,
+                date: 15,
+                hour: 18,
+                minutes: 30,
+                seconds: 15,
+                milliseconds: 91
+            },
+            "1989-06-15T13:30:15.091-05": {
+                year: 1989,
+                month: 5,
+                date: 15,
+                hour: 18,
+                minutes: 30,
+                seconds: 15,
+                milliseconds: 91
+            },
+            "2010-08-06T15:21:25-06": { // MDT
+                year: 2010,
+                month: 7,
+                date: 6,
+                hour: 21,
+                minutes: 21,
+                seconds: 25
+            },
+            "2010-08-07T06:21:25+9": { // JSP
+                year: 2010,
+                month: 7,
+                date: 6,
+                hour: 21,
+                minutes: 21,
+                seconds: 25
+            },
+            "2010-08-07T02:51:25+05:30": { // IST
+                year: 2010,
+                month: 7,
+                date: 6,
+                hour: 21,
+                minutes: 21,
+                seconds: 25
+            },
+            "T21:51:25Z": {
+                hour: 21,
+                minutes: 51,
+                seconds: 25
+            },
+            "T02:51:25+05:30": { // IST
+                hour: 21,
+                minutes: 21,
+                seconds: 25
+            },
+            "T2:51:25.1234-7": { // lenient
+                hour: 9,
+                minutes: 51,
+                seconds: 25,
+                milliseconds: 123
+            }
+        };
+
+        var o, got, exp;
+        for (var str in cases) {
+            o = cases[str];
+            got = OpenLayers.Date.parse(str);
+            exp = new Date(Date.UTC(o.year || 0, o.month || 0, o.date || 1, o.hour || 0, o.minutes || 0, o.seconds || 0, o.milliseconds || 0));
+            if ("year" in o) {
+                t.eq(got.getUTCFullYear(), exp.getUTCFullYear(), str + ": correct UTCFullYear");
+                t.eq(got.getUTCMonth(), exp.getUTCMonth(), str + ": correct UTCMonth");
+                t.eq(got.getUTCDate(), exp.getUTCDate(), str + ": correct UTCDate");
+            } else {
+                t.ok(true, str + ": ECMA doesn't specify how years are handled in time only strings");
+                t.ok(true, str + ": ECMA doesn't specify how months are handled in time only strings");
+                t.ok(true, str + ": ECMA doesn't specify how days are handled in time only strings");
+            }
+            if ("hour" in o) {
+                t.eq(got.getUTCHours(), exp.getUTCHours(), str + ": correct UTCHours");
+                t.eq(got.getUTCMinutes(), exp.getUTCMinutes(), str + ": correct UTCMinutes");
+                t.eq(got.getUTCSeconds(), exp.getUTCSeconds(), str + ": correct UTCSeconds");
+                t.eq(got.getUTCMilliseconds(), exp.getUTCMilliseconds(), str + ": correct UTCMilliseconds");
+            } else {
+                t.ok(true, str + ": ECMA doesn't specify how hours are handled in date only strings");
+                t.ok(true, str + ": ECMA doesn't specify how minutes are handled in date only strings");
+                t.ok(true, str + ": ECMA doesn't specify how seconds are handled in date only strings");
+                t.ok(true, str + ": ECMA doesn't specify how milliseconds are handled in date only strings");
+            }
+        }
+        
+        // check invalid date parsing
+        var invalid = OpenLayers.Date.parse("foo");
+        t.ok(invalid instanceof Date, "invalid is a date");
+        t.ok(isNaN(invalid.getTime()), "invalid has no time");
+            
+
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/BaseTypes/Bounds.html b/tests/BaseTypes/Bounds.html
new file mode 100644
index 0000000..fe11c83
--- /dev/null
+++ b/tests/BaseTypes/Bounds.html
@@ -0,0 +1,637 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var bounds; 
+    function test_Bounds_constructor (t) {
+        t.plan( 21 );
+        
+        bounds = new OpenLayers.Bounds();
+        t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
+        t.eq( bounds.CLASS_NAME, "OpenLayers.Bounds", "bounds.CLASS_NAME is set correctly" );
+        t.eq( bounds.left, null, "bounds.left is initialized to null" );
+        t.eq( bounds.bottom, null, "bounds.bottom is initialized to null" );
+        t.eq( bounds.right, null, "bounds.right is initialized to null" );
+        t.eq( bounds.top, null, "bounds.top is initialized to null" );
+
+
+        bounds = new OpenLayers.Bounds(0,2,10,4);
+        t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
+        t.eq( bounds.CLASS_NAME, "OpenLayers.Bounds", "bounds.CLASS_NAME is set correctly" );
+        t.eq( bounds.left, 0, "bounds.left is set correctly" );
+        t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
+        t.eq( bounds.right, 10, "bounds.right is set correctly" );
+        t.eq( bounds.top, 4, "bounds.top is set correctly" );
+        t.eq( bounds.getWidth(), 10, "bounds.getWidth() returns correct value" );
+        t.eq( bounds.getHeight(), 2, "bounds.getHeight() returns correct value" );
+        
+        var sz = bounds.getSize();
+        var size = new OpenLayers.Size(10,2);
+        t.ok(sz.equals(size),"bounds.getSize() has correct value" );
+    
+        var center = new OpenLayers.Pixel(5,3);
+        var boundsCenter = bounds.getCenterPixel();
+        t.ok( boundsCenter.equals(center), "bounds.getCenterLonLat() has correct value" );
+
+        var center = new OpenLayers.LonLat(5,3);
+        var boundsCenter = bounds.getCenterLonLat();
+        t.ok( boundsCenter.equals(center), "bounds.getCenterLonLat() has correct value" );
+
+        // This is an actual use case with Mercator projection at global scale
+        bounds = new OpenLayers.Bounds(-40075016.67999999,-20037508.339999992,
+                                        40075016.67999999,20037508.339999992);
+        t.eq( bounds.left, -40075016.68, "bounds.left adjusted for floating precision");
+        t.eq( bounds.bottom, -20037508.34, "bounds.bottom adjusted for floating precision");
+        t.eq( bounds.right, 40075016.68, "bounds.right adjusted for floating precision");
+        t.eq( bounds.top, 20037508.34, "bounds.top adjusted for floating precision");
+    }
+
+    function test_Bounds_constructorFromStrings(t) {
+        t.plan( 6 );
+        bounds = new OpenLayers.Bounds("0","2","10","4");
+        t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
+        t.eq( bounds.CLASS_NAME, "OpenLayers.Bounds", "bounds.CLASS_NAME is set correctly" );
+        t.eq( bounds.left, 0, "bounds.left is set correctly" );
+        t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
+        t.eq( bounds.right, 10, "bounds.right is set correctly" );
+        t.eq( bounds.top, 4, "bounds.top is set correctly" );
+        
+    }
+
+    function test_Bounds_toBBOX(t) {
+        t.plan( 5 );
+        bounds = new OpenLayers.Bounds(1,2,3,4);
+        t.eq( bounds.toBBOX(), "1,2,3,4", "toBBOX() returns correct value." );
+        bounds = new OpenLayers.Bounds(1.00000001,2,3,4);
+        t.eq( bounds.toBBOX(), "1,2,3,4", "toBBOX() rounds off small differences." );
+        bounds = new OpenLayers.Bounds(1.00000001,2.5,3,4);
+        t.eq( bounds.toBBOX(), "1,2.5,3,4", "toBBOX() returns correct value. for a half number" );
+        bounds = new OpenLayers.Bounds(1,2.5555555,3,4);
+        t.eq( bounds.toBBOX(), "1,2.555556,3,4", "toBBOX() rounds to correct value." );
+        bounds = new OpenLayers.Bounds(1,2.5555555,3,4);
+        t.eq( bounds.toBBOX(1), "1,2.6,3,4", "toBBOX() rounds to correct value with power provided." );
+        bounds = new OpenLayers.Bounds(1,2.5555555,3,4);
+    }
+
+    function test_Bounds_toString(t) {
+        t.plan( 1 );
+        bounds = new OpenLayers.Bounds(1,2,3,4);
+        t.eq( bounds.toString(), "left-bottom=(1,2) right-top=(3,4)", "toString() returns correct value." ); 
+    }
+    function test_Bounds_toArray(t) {
+        t.plan( 1 );
+        bounds = new OpenLayers.Bounds(1,2,3,4);
+        t.eq( bounds.toArray(), [1,2,3,4], "toArray() returns correct value." ); 
+    }
+
+    function test_Bounds_toGeometry(t) {
+        t.plan(7);
+        var minx = Math.random();
+        var miny = Math.random();
+        var maxx = Math.random();
+        var maxy = Math.random();
+        var bounds = new OpenLayers.Bounds(minx, miny, maxx, maxy);
+        var poly = bounds.toGeometry();
+        t.eq(poly.CLASS_NAME, "OpenLayers.Geometry.Polygon",
+             "polygon instance created");
+        t.eq(poly.components.length, 1,
+             "polygon with one ring created");
+        var ring = poly.components[0];
+        t.eq(ring.components.length, 5,
+             "four sided polygon created");
+        t.eq(ring.components[0].x, OpenLayers.Util.toFloat(minx),
+             "bounds left preserved");
+        t.eq(ring.components[0].y, OpenLayers.Util.toFloat(miny),
+             "bounds bottom preserved");
+        t.eq(ring.components[2].x, OpenLayers.Util.toFloat(maxx),
+             "bounds left preserved");
+        t.eq(ring.components[2].y, OpenLayers.Util.toFloat(maxy),
+             "bounds bottom preserved");
+    }
+
+    function test_Bounds_contains(t) {
+        t.plan( 6 );
+        bounds = new OpenLayers.Bounds(10,10,40,40);
+        t.eq( bounds.contains(20,20), true, "bounds(10,10,40,40) correctly contains LonLat(20,20)" );
+        t.eq( bounds.contains(0,0), false, "bounds(10,10,40,40) correctly does not contain LonLat(0,0)" );
+        t.eq( bounds.contains(40,40), true, "bounds(10,10,40,40) correctly contains LonLat(40,40) with inclusive set to true" );
+        t.eq( bounds.contains(40,40, false), false, "bounds(10,10,40,40) correctly does not contain LonLat(40,40) with inclusive set to false" );
+
+        var px = new OpenLayers.Pixel(15,30);
+        t.eq( bounds.containsPixel(px), bounds.contains(px.x, px.y), "containsPixel works");
+
+        var ll = new OpenLayers.LonLat(15,30);
+        t.eq( bounds.containsLonLat(ll), bounds.contains(ll.lon, ll.lat), "containsLonLat works");
+
+    }
+
+    function test_Bounds_fromString(t) {
+       t.plan( 10 );
+       bounds = OpenLayers.Bounds.fromString("1,2,3,4");
+       t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
+       t.eq( bounds.left, 1, "bounds.left is set correctly" );
+       t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
+       t.eq( bounds.right, 3, "bounds.right is set correctly" );
+       t.eq( bounds.top, 4, "bounds.top is set correctly" );
+
+       bounds = OpenLayers.Bounds.fromString("1.1,2.2,3.3,4.4");
+       t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
+       t.eq( bounds.left, 1.1, "bounds.left is set correctly" );
+       t.eq( bounds.bottom, 2.2, "bounds.bottom is set correctly" );
+       t.eq( bounds.right, 3.3, "bounds.right is set correctly" );
+       t.eq( bounds.top, 4.4, "bounds.top is set correctly" );
+
+    }
+
+    function test_Bounds_getSize(t) {
+        t.plan( 1 );
+        var bounds = new OpenLayers.Bounds(0,10,100,120);
+
+        t.ok( bounds.getSize().equals(new OpenLayers.Size(100, 110)), "getCenterPixel() works correctly");
+    }
+    
+    function test_Bounds_clone(t) {
+       t.plan( 6 );
+       var oldBounds = new OpenLayers.Bounds(1,2,3,4);
+       var bounds = oldBounds.clone();
+       t.ok( bounds instanceof OpenLayers.Bounds, "clone returns new OpenLayers.Bounds object" );
+       t.eq( bounds.left, 1, "bounds.left is set correctly" );
+       t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
+       t.eq( bounds.right, 3, "bounds.right is set correctly" );
+       t.eq( bounds.top, 4, "bounds.top is set correctly" );
+       
+       oldBounds.left = 100;
+       t.eq( bounds.left, 1, "changing olBounds.left does not change bounds.left" );
+    }
+
+    function test_Bounds_intersectsBounds(t) {
+       t.plan(21);
+
+       var aBounds = new OpenLayers.Bounds(-180, -90, 180, 90);
+
+       //inside
+       var bBounds = new OpenLayers.Bounds(-20, -10, 20, 10);
+       var cBounds = new OpenLayers.Bounds(-181,-90,180,90);
+       t.eq( aBounds.intersectsBounds(bBounds),        true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + ")" );
+       t.eq( aBounds.intersectsBounds(bBounds, true),  true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + "), inclusive is true" );
+       t.eq( aBounds.intersectsBounds(bBounds, false), true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + "), inclusive is false" );
+       t.eq( aBounds.intersectsBounds(cBounds, false), true, "aBounds with cBounds adjusted one degree left passes intersect bounds. (3 sides match, 1 side different)." );
+       t.eq( cBounds.intersectsBounds(aBounds, false), true, "cBounds with aBounds adjusted one degree left passes intersect bounds. (3 sides match, 1 side different)." );
+
+       //outside
+       bBounds = new OpenLayers.Bounds(-181, -91, 181, 91);
+       t.eq( aBounds.intersectsBounds(bBounds),        true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + ")" );
+       t.eq( aBounds.intersectsBounds(bBounds, true),  true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + "), inclusive is true" );
+       t.eq( aBounds.intersectsBounds(bBounds, false), true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + "), inclusive is false" );
+
+       //total intersect
+       bBounds = new OpenLayers.Bounds(-185, -100, 20, 50);
+       t.eq( aBounds.intersectsBounds(bBounds),        true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + ")" );
+       t.eq( aBounds.intersectsBounds(bBounds, true),  true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + "), inclusive is true" );
+       t.eq( aBounds.intersectsBounds(bBounds, false), true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + "), inclusive is false" );
+
+       //border intersect
+       bBounds = new OpenLayers.Bounds(-360, -180, -180, -90);
+       t.eq( aBounds.intersectsBounds(bBounds),        true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + ")" );
+       t.eq( aBounds.intersectsBounds(bBounds, true),  true, "(" + aBounds.toBBOX() + ") correctly intersects (" + bBounds.toBBOX() + "), inclusive is true" );
+       t.eq( aBounds.intersectsBounds(bBounds, false), false, "(" + aBounds.toBBOX() + ") does not intersect (" + bBounds.toBBOX() + "), inclusive is false" );
+
+       //no intersect
+       bBounds = new OpenLayers.Bounds(-360, -180, -185, -95);
+       t.eq( aBounds.intersectsBounds(bBounds),        false, "(" + aBounds.toBBOX() + ") does not intersect (" + bBounds.toBBOX() + ")" );
+       t.eq( aBounds.intersectsBounds(bBounds, true),  false, "(" + aBounds.toBBOX() + ") does not intersect (" + bBounds.toBBOX() + "), inclusive is true" );
+       t.eq( aBounds.intersectsBounds(bBounds, false), false, "(" + aBounds.toBBOX() + ") does not intersect (" + bBounds.toBBOX() + "), inclusive is false" );
+
+        // This is an actual use case with Mercator tiles at global scale
+        var merc_aBounds = new OpenLayers.Bounds(-40075016.67999999,20037508.339999992,
+                                                 -20037508.339999992,40075016.67999999),
+            merc_bBounds = new OpenLayers.Bounds(-20037508.34,-20037508.34,
+                                                  20037508.34,20037508.34);
+        t.eq( merc_aBounds.intersectsBounds(merc_bBounds, true), true, "intersect shouldn't fall prey to floating point errors, inclusive is true");
+        t.eq( merc_aBounds.intersectsBounds(merc_bBounds, false), false, "intersect shouldn't fall prey to floating point errors, inclusive is false");
+        
+        // test for bounds intersection where none of the corners are contained within the other bounds
+        var b1 = new OpenLayers.Bounds(-1, -2, 1, 2);
+        var b2 = new OpenLayers.Bounds(-2, -1, 2, 1);
+        t.eq(b1.intersectsBounds(b2), true, "vertical rectangle intersects horizontal rectangle");
+        t.eq(b2.intersectsBounds(b1), true, "horizontal rectangle intersects vertical rectangle");
+        
+    }
+    
+    function test_Bounds_containsBounds(t) {
+        t.plan( 35 );
+        containerBounds = new OpenLayers.Bounds(10,10,40,40);
+
+        //totally outside
+        bounds = new OpenLayers.Bounds(0,0,5,5);
+        t.eq( containerBounds.containsBounds(bounds)              , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ")");
+        t.eq( containerBounds.containsBounds(bounds, false)       , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false" );
+        t.eq( containerBounds.containsBounds(bounds, false, true) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, false, false), false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
+        t.eq( containerBounds.containsBounds(bounds, true)        , false , "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, true)  , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, false) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
+
+        //totally outside on border
+        bounds = new OpenLayers.Bounds(15,0,30,10);
+        t.eq( containerBounds.containsBounds(bounds)              , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ")");
+        t.eq( containerBounds.containsBounds(bounds, false)       , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false" );
+        t.eq( containerBounds.containsBounds(bounds, false, true) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, false, false), false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
+        t.eq( containerBounds.containsBounds(bounds, true)        , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, true)  , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, false) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
+
+        //partially inside
+        bounds = new OpenLayers.Bounds(20,20,50,30);
+        t.eq( containerBounds.containsBounds(bounds)              , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ")");
+        t.eq( containerBounds.containsBounds(bounds, false)       , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false" );
+        t.eq( containerBounds.containsBounds(bounds, false, true) , false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, false, false), false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
+        t.eq( containerBounds.containsBounds(bounds, true)        , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, true)  , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, false) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
+
+        //totally inside on border
+        bounds = new OpenLayers.Bounds(10,20,30,30);
+        t.eq( containerBounds.containsBounds(bounds)              , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ")");
+        t.eq( containerBounds.containsBounds(bounds, false)       , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false" );
+        t.eq( containerBounds.containsBounds(bounds, false, true) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, false, false), false, "(" + containerBounds.toBBOX() + ") correctly does not contain (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
+        t.eq( containerBounds.containsBounds(bounds, true)        , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, true)  , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, false) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );
+
+        //totally inside
+        bounds = new OpenLayers.Bounds(20,20,30,30);
+        t.eq( containerBounds.containsBounds(bounds)              , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ")");
+        t.eq( containerBounds.containsBounds(bounds, false)       , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false" );
+        t.eq( containerBounds.containsBounds(bounds, false, true) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, false, false), true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is false, inclusive is false" );
+        t.eq( containerBounds.containsBounds(bounds, true)        , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, true)  , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is true" );
+        t.eq( containerBounds.containsBounds(bounds, true, false) , true, "(" + containerBounds.toBBOX() + ") correctly contains (" + bounds.toBBOX() + ") when partial is true, inclusive is false" );        
+        
+    }
+    
+    function test_Bounds_determineQuadrant(t) {
+
+       t.plan( 4 );
+       var bounds = new OpenLayers.Bounds(0,0,100,100);
+
+       var tl = new OpenLayers.LonLat(25, 75);
+       var tr = new OpenLayers.LonLat(75, 75);
+       var bl = new OpenLayers.LonLat(25, 25);
+       var br = new OpenLayers.LonLat(75, 25);
+
+       t.eq( bounds.determineQuadrant(tl), "tl", "bounds.determineQuadrant correctly identifies a coordinate in the top left quadrant");
+       t.eq( bounds.determineQuadrant(tr), "tr", "bounds.determineQuadrant correctly identifies a coordinate in the top right quadrant");
+       t.eq( bounds.determineQuadrant(bl), "bl", "bounds.determineQuadrant correctly identifies a coordinate in the bottom left quadrant");
+       t.eq( bounds.determineQuadrant(br), "br", "bounds.determineQuadrant correctly identifies a coordinate in the bottom right quadrant");
+    }
+
+    function test_Bounds_oppositeQuadrant(t) {
+
+       t.plan( 4 );
+
+       t.eq( OpenLayers.Bounds.oppositeQuadrant("tl"), "br", "OpenLayers.Bounds.oppositeQuadrant returns 'br' for 'tl'");
+       t.eq( OpenLayers.Bounds.oppositeQuadrant("tr"), "bl", "OpenLayers.Bounds.oppositeQuadrant returns 'bl' for 'tr'");
+       t.eq( OpenLayers.Bounds.oppositeQuadrant("bl"), "tr", "OpenLayers.Bounds.oppositeQuadrant returns 'tr' for 'bl'");
+       t.eq( OpenLayers.Bounds.oppositeQuadrant("br"), "tl", "OpenLayers.Bounds.oppositeQuadrant returns 'tl' for 'br'");
+    }
+
+    function test_Bounds_equals(t) {
+        t.plan( 3 );
+        var boundsA = new OpenLayers.Bounds(1,2,3,4);
+        var boundsB = new OpenLayers.Bounds(1,2,3,4);
+        var boundsC = new OpenLayers.Bounds(1,5,3,4);
+
+        t.ok( boundsA.equals(boundsB), "equals() returns true on two equal bounds." );
+        t.ok( !boundsA.equals(boundsC), "equals() returns false on two different bounds." );
+        t.ok( !boundsA.equals(null), "equals() returns false on comparison to null");
+    }
+
+    function test_Bounds_getHeight_getWidth(t) {
+        t.plan( 2 );
+        var bounds = new OpenLayers.Bounds(10,20,100,120);
+
+        t.eq( bounds.getWidth(), 90, "getWidth() works" );
+        t.eq( bounds.getHeight(), 100, "getHeight() works" );
+
+    }
+
+    function test_Bounds_getCenters(t) {
+        t.plan( 2 );
+        var bounds = new OpenLayers.Bounds(0,20,100,120);
+
+                t.ok( bounds.getCenterPixel().equals(new OpenLayers.Pixel(50, 70)), "getCenterPixel() works correctly");
+        t.ok( bounds.getCenterLonLat().equals(new OpenLayers.LonLat(50, 70)), "getCenterLonLat() works correctly");
+    }
+    
+    function test_getCenterLonLat(t) {
+        t.plan(7);
+        var bounds = new OpenLayers.Bounds(0, 10, 20, 60);
+        
+        // set private centerLonLat to confirm that it is getting returned if set
+        bounds.centerLonLat = "foo";
+        t.eq(bounds.getCenterLonLat(), "foo", "returns cached value");
+        bounds.centerLonLat = null;
+        
+        // unmodified
+        var center = bounds.getCenterLonLat();
+        t.eq(center.lon, 10, "unmodified: correct x");
+        t.eq(center.lat, 35, "unmodified: correct y");
+        
+        // transformed
+        bounds.transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913"));
+        center = bounds.getCenterLonLat();
+        t.eq(Math.round(center.lon), 1113195, "transformed: correct x");
+        t.eq(Math.round(center.lat), 4759314, "transformed: correct y");
+        
+        // extended
+        bounds.extend(new OpenLayers.Bounds(-10000000, -10000000, 10000000, 10000000));
+        center = bounds.getCenterLonLat();
+        t.eq(center.lon, 0, "extended: correct x");
+        t.eq(center.lat, 0, "extended: correct y");
+        
+        
+    }
+
+    function test_Bounds_fromArray(t) {
+       t.plan( 5 );
+       
+       var bbox = [1,2,3,4];
+       bounds = OpenLayers.Bounds.fromArray(bbox);
+       t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
+       t.eq( bounds.left, 1, "bounds.left is set correctly" );
+       t.eq( bounds.bottom, 2, "bounds.bottom is set correctly" );
+       t.eq( bounds.right, 3, "bounds.right is set correctly" );
+       t.eq( bounds.top, 4, "bounds.top is set correctly" );
+    }
+
+    function test_Bounds_fromSize(t) {
+       t.plan( 5 );
+       
+       var height = 15;
+       var width = 16;
+       var size = new OpenLayers.Size(width, height);
+       bounds = OpenLayers.Bounds.fromSize(size);
+       t.ok( bounds instanceof OpenLayers.Bounds, "new OpenLayers.Bounds returns Bounds object" );
+       t.eq( bounds.left, 0, "bounds.left is set correctly" );
+       t.eq( bounds.bottom, height, "bounds.bottom is set correctly" );
+       t.eq( bounds.right, width, "bounds.right is set correctly" );
+       t.eq( bounds.top, 0, "bounds.top is set correctly" );
+    }
+
+
+    function test_Bounds_extend(t) {
+        t.plan( 9 );
+    
+        var originalBounds = new OpenLayers.Bounds();
+        var bounds = originalBounds.clone();
+        //null bounds to start
+        bounds.extend(new OpenLayers.LonLat(4,5));        
+        t.ok(bounds.equals(new OpenLayers.Bounds(4,5,4,5)), "uninitialized bounds can be safely extended");
+
+
+
+        originalBounds = new OpenLayers.Bounds(10,20,50,80);
+
+        bounds = originalBounds.clone();
+        
+      //null obj
+        bounds.extend(null);        
+        t.ok(bounds.equals(originalBounds), "null to extend does not crash or change original bounds");
+
+      //obj with no classname        
+        var object = {};
+        bounds.extend(object);        
+        t.ok(bounds.equals(originalBounds), "extend() passing object with no classname does not crash or change original bounds")
+
+    //obj is bounds
+
+      //pushing all limits with bounds obj
+        var testBounds = new OpenLayers.Bounds(5, 10, 60, 90);
+        object = testBounds.clone();
+        
+        bounds.extend(object);
+        t.ok(bounds.equals(testBounds), "extend by valid bounds, pushing all limits, correctly extends bounds");
+
+      //pushing no limits with bounds obj
+        bounds = originalBounds.clone();
+
+        testBounds = new OpenLayers.Bounds(15, 30, 40, 70);
+        object = testBounds.clone();
+        
+        bounds.extend(object);
+        t.ok(bounds.equals(originalBounds), "extend by valid bounds, pushing no limits, correctly does not extend bounds");
+
+    // obj is lonlat
+    
+      //left, bottom
+        bounds = originalBounds.clone();
+        
+        object = new OpenLayers.LonLat(5, 10);
+        
+        bounds.extend(object);
+               
+        t.ok( ((bounds.left == object.lon) &&
+               (bounds.bottom == object.lat) &&
+               (bounds.right == originalBounds.right) &&
+               (bounds.top == originalBounds.top)), "obj lonlat to extends correclty modifies left and bottom");
+              
+      //right, top
+        bounds = originalBounds.clone();
+        
+        object = new OpenLayers.LonLat(60,90);
+        
+        bounds.extend(object);
+
+        t.ok( ((bounds.left == originalBounds.left) &&
+               (bounds.bottom == originalBounds.bottom) &&
+               (bounds.right == object.lon) &&
+               (bounds.top == object.lat)), "obj lonlat to extends correclty modifies right and top");
+              
+    // obj is point
+    
+      //left, bottom
+        bounds = originalBounds.clone();
+        
+        object = new OpenLayers.Geometry.Point(5, 10);
+        
+        bounds.extend(object);
+               
+        t.ok( ((bounds.left == object.x) &&
+               (bounds.bottom == object.y) &&
+               (bounds.right == originalBounds.right) &&
+               (bounds.top == originalBounds.top)), "obj Point to extends correclty modifies left and bottom");
+              
+      //right, top
+        bounds = originalBounds.clone();
+        
+        object = new OpenLayers.Geometry.Point(60,90);
+        
+        bounds.extend(object);
+
+        t.ok( ((bounds.left == originalBounds.left) &&
+               (bounds.bottom == originalBounds.bottom) &&
+               (bounds.right == object.x) &&
+               (bounds.top == object.y)), "obj Point to extends correclty modifies right and top");
+
+    }
+     
+     
+    function test_Bounds_wrapDateLine(t) {
+        t.plan( 13 );
+        
+        var testBounds, wrappedBounds, desiredBounds;
+
+        var maxExtent = new OpenLayers.Bounds(-10,-10,10,10);
+        var exactBounds = maxExtent.clone();
+        var simpleBounds = new OpenLayers.Bounds( -5,-5,5,5);
+
+
+
+    //bad maxextent
+        testBounds = simpleBounds.clone();
+        wrappedBounds = testBounds.wrapDateLine(null);
+        t.ok(wrappedBounds.equals(simpleBounds), "wrapping a bounds with a bad maxextent does nothing");
+
+
+
+    //exactly inside 
+        testBounds = exactBounds.clone();
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(exactBounds), "wrapping a bounds precisely within (equal to) maxextent does nothing");
+
+
+    //inside 
+        testBounds = simpleBounds.clone();
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(simpleBounds), "wrapping a bounds within maxextent does nothing");
+    
+// LEFT //
+
+    //straddling left
+        testBounds = simpleBounds.add(-10,0);
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(testBounds), "wrapping a bounds that straddles the left of maxextent does nothing");
+    
+    //left rightTolerance
+        testBounds = simpleBounds.add(-14,0);
+        wrappedBounds = 
+            testBounds.wrapDateLine(maxExtent, {'rightTolerance': 1} );
+        desiredBounds = simpleBounds.add(6,0);
+        t.ok(wrappedBounds.equals(desiredBounds), "wrapping a bounds rightTolerance left of maxextent works");
+
+    //exactly left
+        testBounds = exactBounds.add(-20,0);
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(exactBounds), "wrapping an exact bounds once left of maxextent works");
+    
+    //left
+        testBounds = simpleBounds.add(-20,0);
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(simpleBounds), "wrapping a bounds once left of maxextent works");
+    
+    //way left
+        testBounds = simpleBounds.add(-200,0);
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(simpleBounds), "wrapping a bounds way left of maxextent works");
+
+// RIGHT //
+
+    //straddling right
+        testBounds = simpleBounds.add(10,0);
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(testBounds), "wrapping a bounds that straddles the right of maxextent does nothing");
+    
+    //right leftTolerance
+        testBounds = simpleBounds.add(14,0);
+        wrappedBounds = 
+            testBounds.wrapDateLine(maxExtent, {'leftTolerance': 1} );
+        desiredBounds = simpleBounds.add(-6,0);
+        t.ok(wrappedBounds.equals(desiredBounds), "wrapping a bounds leftTolerance right of maxextent works");
+    
+    //exactly right
+        testBounds = exactBounds.add(20,0);
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(exactBounds), "wrapping an exact bounds once right of maxextent works");
+    
+    //right
+        testBounds = simpleBounds.add(20,0);
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(simpleBounds), "wrapping a bounds once right of maxextent works");
+    
+    //way right
+        testBounds = simpleBounds.add(200,0);
+        wrappedBounds = testBounds.wrapDateLine(maxExtent);
+        t.ok(wrappedBounds.equals(simpleBounds), "wrapping a bounds way right of maxextent works");
+
+
+
+    }
+    function test_Bounds_transform(t) {
+        t.plan( 3 );
+        bounds = new OpenLayers.Bounds(10, -10, 20, 10);
+        bounds.transform(new OpenLayers.Projection("foo"), new OpenLayers.Projection("Bar")); 
+        t.eq(bounds.toBBOX(), "10,-10,20,10", "null transform okay");
+        bounds.transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")); 
+        t.eq(bounds.toBBOX(), "1113194.907778,-1118889.974702,2226389.815556,1118889.974702", "bounds for spherical mercator transform are correct");
+        bounds.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); 
+        t.eq(bounds.toBBOX(), "10,-10,20,10", "bounds for inverse spherical mercator transform are correct");
+    }
+
+    function test_Bounds_add(t) {
+        t.plan( 8 );
+
+        origBounds = new OpenLayers.Bounds(1,2,3,4);
+        testBounds = origBounds.clone();
+
+        var bounds = testBounds.add(5, 50);
+        t.ok( testBounds.equals(origBounds), "testBounds is not modified by add operation");
+
+        var b = new OpenLayers.Bounds(6,52,8,54);
+        t.ok( bounds.equals(b), "bounds is set correctly");
+        
+    //null values
+        var desiredMsg = "You must pass both x and y values to the add function.";
+        OpenLayers.Console.error = function(msg) {
+            t.eq(msg, desiredMsg, "error correctly reported");
+        }
+    
+        bounds = testBounds.add(null, 50);
+        t.ok( testBounds.equals(origBounds), "testBounds is not modified by erroneous add operation (null x)");
+        t.ok(bounds == null, "returns null on erroneous add operation (null x)");
+ 
+        bounds = testBounds.add(5, null);
+        t.ok( testBounds.equals(origBounds), "testBounds is not modified by erroneous add operation (null y)");
+        t.ok(bounds == null, "returns null on erroneous add operation (null y)");
+    }
+
+    function test_Bounds_scale(t) {
+        t.plan(3);
+
+        origBounds = new OpenLayers.Bounds(1,2,3,4);
+        bounds = origBounds.scale(2);  
+        var b = new OpenLayers.Bounds(0,1,4,5);
+        t.ok(bounds.equals(b), "Bounds scale correctly with default origin at center")
+
+        var origin = new OpenLayers.Pixel(0,1);
+        bounds = origBounds.scale(2,origin);
+        b = new OpenLayers.Bounds(2,3,6,7);
+        t.ok(bounds.equals(b), "Bounds scale correctly with offset origin");
+
+        origin = new OpenLayers.Pixel(5,1);
+        bounds = bounds.scale(2, origin);
+        b = new OpenLayers.Bounds(-1, 5, 7, 13);
+        t.ok(bounds.equals(b), "Bounds scale correctly with offset origin");
+
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
+
diff --git a/tests/BaseTypes/Class.html b/tests/BaseTypes/Class.html
new file mode 100644
index 0000000..bcf827e
--- /dev/null
+++ b/tests/BaseTypes/Class.html
@@ -0,0 +1,315 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    // remove this next line at 3.0
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+
+    function test_Class(t) {
+        t.plan(1);
+        var MyClass = OpenLayers.Class({
+            initialize: function () {
+                t.ok(false, "initialize should not be called");
+            }
+        });
+        t.ok(true,
+             "defining a class does not call the constructor for the class");
+    }
+
+    function test_Class_constructor(t) {
+        t.plan(7);
+        
+        var MyClass = OpenLayers.Class({
+            prop: null,
+            classProp: {'bad': 'practice'},
+            initialize: function(a1, a2) {
+                this.prop = "instance property";
+                t.ok(true,
+                     "initialize is called when a new instance is created");
+                t.eq(a1, arg1,
+                     "initialize is called with the proper first argument");
+                t.eq(a2, arg2,
+                     "initialize is called with the proper second argument");
+            },
+            CLASS_NAME: "MyClass"
+        });
+
+        var arg1 = "anArg";
+        var arg2 = {"another": "arg"};
+        var myObj = new MyClass(arg1, arg2);
+        t.eq(MyClass.prop, null,
+             "creating a new instance doesn't modify the class");
+        t.eq(myObj.prop, "instance property",
+             "the new instance is assigned a property in the constructor");
+        t.eq(myObj["CLASS_NAME"], "MyClass",
+             "the new object is an instance of MyClass");
+
+        // allow for modification of class properties
+        MyClass.prototype.classProp.bad = "good";
+        t.eq(myObj.classProp.bad, "good",
+             "modifying a class property modifies properties of the instance");
+    }
+
+    function test_Class_inheritance(t) {
+        t.plan(7);
+        
+        var BaseClass = OpenLayers.Class({
+            prop: "base",
+            initialize: function() {
+                t.ok(false,
+                     "base class constructor is not called during inheritance");
+            },
+            toString: function() {
+                return "toString inherited";
+            },
+            CLASS_NAME: "BaseClass"
+        });
+        
+        var ChildClass = OpenLayers.Class(BaseClass, {
+            initialize: function() {
+                t.ok(true,
+                     "child class constructor is called in creating an instance");
+            },
+            CLASS_NAME: "ChildClass"
+        });
+        
+        var child = new ChildClass();
+        t.eq(child.prop, "base",
+             "instance of child inherits properties from base");
+        t.eq(child.toString(), "toString inherited",
+             "instance of child inherits toString method from base");
+        t.eq(child["CLASS_NAME"],
+             "ChildClass",
+             "new object is an instance of the child class");
+        
+        var F = OpenLayers.Class(Object, {});
+        t.ok(!("initialize" in Object.prototype), "no messing with non OL prototypes");
+
+        // test with an abstract class (i.e. a class that doesn't have an initialize
+        // method) as the parent class
+        var Vehicule = OpenLayers.Class({
+            numWheels: null
+        });
+        var Bike = OpenLayers.Class(Vehicule, {
+            initialize: function() {
+                this.numWheels = 2;
+            }
+        });
+        var b = new Bike();
+        t.ok(b instanceof Vehicule, "a bike is a vehicule");
+        
+        // test inheritance with something that has a non-function initialize property
+        var P = OpenLayers.Class({
+            initialize: "foo"
+        });
+        var C = OpenLayers.Class(P, {
+            initialize: function() {
+                // pass
+            }
+        });
+        var c = new C();
+        t.eq(P.prototype.initialize, "foo", "Class restores custom initialize property.");
+        
+    }
+    
+    function test_Class_multiple_inheritance(t) {
+        t.plan(7);
+        var BaseClass1 = OpenLayers.Class({
+            override: "base1",
+            prop: "base1",
+            variable: null,
+            initialize: function() {
+                t.ok(true,
+                     "only called when an instance of this class is created");
+            },
+            CLASS_NAME: "BaseClass1"
+        });
+
+        var BaseClass2 = OpenLayers.Class({
+            override: "base2",
+            initialize: function() {
+                t.ok(false,
+                     "base class constructor is not called during inheritance");
+            },
+            CLASS_NAME: "BaseClass1"
+        });
+        
+        var ChildClass = OpenLayers.Class(BaseClass1, BaseClass2, {
+            initialize: function(arg) {
+                if(this.prop == "base1") {
+                    this.variable = "child";
+                }
+                t.ok(true,
+                     "only child class constructor is called on initialization");
+            },
+            CLASS_NAME: "ChildClass"
+        });
+        
+        var arg = "child";
+        var child = new ChildClass(arg);
+        t.eq(child.variable, arg,
+             "inheritance works before construction");
+        t.eq(child.prop, "base1",
+             "properties are inherited with multiple classes")
+        t.eq(child.override, "base2",
+             "properties are inherited in the expected order");
+        t.eq(child["CLASS_NAME"],
+             "ChildClass",
+             "object is an instance of child class");
+        
+        var base1 = new BaseClass1();
+        t.eq(base1.override, "base1",
+             "inheritance doesn't mess with parents");
+
+    }
+    
+    // Remove this at 3.0
+    function test_Class_backwards(t) {
+        t.plan(4);
+        // test that a new style class supports old style inheritance
+        var NewClass = OpenLayers.Class({
+            newProp: "new",
+            initialize: function() {
+                t.ok(false, "the base class is never instantiated");
+            },
+            toString: function() {
+                return "new style";
+            }
+        });
+        
+        var OldClass = OpenLayers.Class.create();
+        OldClass.prototype = OpenLayers.Class.inherit(NewClass, {
+            oldProp: "old",
+            initialize: function() {
+                t.ok(true, "only the child class constructor is called");
+            }
+        });
+        
+        var oldObj = new OldClass();
+        t.eq(oldObj.oldProp, "old",
+             "old style classes can still be instantiated");
+        t.eq(oldObj.newProp, "new",
+             "old style inheritance of properties works with new style base");
+        t.eq(oldObj.toString(), "new style",
+             "toString inheritance works with backwards style");
+        
+    }
+
+    // Remove this at 3.0
+    function test_Class_create (t) {
+        t.plan( 3 );
+        var cls = OpenLayers.Class.create();
+        cls.prototype = {
+            initialize: function () {
+                if (isMozilla)
+                    t.ok(this instanceof cls,
+                                "initialize is called on the right class");
+                else
+                    t.ok(true, "initialize is called");
+            }
+        };
+        var obj = new cls();
+        t.eq(typeof obj, "object", "obj is an object");
+        if (isMozilla)
+            t.ok(obj instanceof cls,
+                        "object is of the right class");
+        else
+            t.ok(true, "this test doesn't work in IE");
+    }
+
+    // Remove this at 3.0
+    function test_Class_inherit (t) {
+        t.plan( 20 );
+        var A = OpenLayers.Class.create();
+        var initA = 0;
+        A.prototype = {
+            count: 0,
+            mixed: false,
+            initialize: function () {
+                initA++;
+                this.count++;
+            }
+        };
+
+        var B = OpenLayers.Class.create();
+        var initB = 0;
+        B.prototype = OpenLayers.Class.inherit( A, {
+            initialize: function () {
+                A.prototype.initialize.apply(this, arguments);
+                initB++;
+                this.count++;
+            }
+        });
+
+        var mixin = OpenLayers.Class.create()
+        mixin.prototype = {
+            mixed: true
+        };
+
+        t.eq( initA, 0, "class A not inited" );
+        t.eq( initB, 0, "class B not inited" );
+
+        var objA = new A();
+        t.eq( objA.count, 1, "object A init" );
+        t.eq( initA, 1, "class A init" );
+        if (isMozilla) 
+            t.ok( objA instanceof A, "obj A isa A" );
+        else
+            t.ok( true, "IE sucks" );
+
+        var objB = new B();
+        t.eq( initA, 2, "class A init" );
+        t.eq( initB, 1, "class B init" );
+        t.eq( objB.count, 2, "object B init twice" );
+        if (isMozilla) {
+            t.ok( objB instanceof A, "obj B isa A" );
+            t.ok( objB instanceof B, "obj B isa B" );
+        } else {
+            t.ok( true, "IE sucks" );
+            t.ok( true, "IE sucks" );
+        }
+
+        var C = OpenLayers.Class.create();
+        C.prototype = OpenLayers.Class.inherit( B, mixin, {count: 0} );
+        t.eq( initA, 2, "class A init unchanged" );
+        t.eq( initB, 1, "class B init unchanged" );
+        
+        var objC = new C();
+        t.eq( initA, 3, "class A init changed" );
+        t.eq( initB, 2, "class B init changed" );
+        t.eq( objC.count, 2, "object C init changed" );
+        if (isMozilla) {
+            t.ok( objC instanceof A, "obj C isa A" );
+            t.ok( objC instanceof B, "obj C isa B" );
+            t.ok( objC instanceof C, "obj C isa C" );
+            t.ok( !(objC instanceof mixin), "obj C isn'ta mixin" );
+        } else {
+            t.ok( true, "IE sucks" );
+            t.ok( true, "IE sucks" );
+            t.ok( true, "IE sucks" );
+            t.ok( true, "IE sucks" );
+        }
+        t.eq( objC.mixed, true, "class C has mixin properties" );
+    }
+
+    function test_Class_isInstanceOf(t) {
+        t.plan(7);
+        var wfs = new OpenLayers.Layer.WFS({});
+        var drag = new OpenLayers.Control.DragFeature({});
+        t.ok(wfs instanceof OpenLayers.Layer.WFS, "isInstanceOf(WFS)");
+        t.ok(wfs instanceof OpenLayers.Layer, "isInstanceOf(Layer)");
+        t.ok(!(wfs instanceof OpenLayers.Format), "not isInstanceOf(Format)");
+        t.ok(drag instanceof OpenLayers.Control, "drag is a control");
+        t.ok(!(drag instanceof OpenLayers.Layer), "drag is not a layer");
+
+        //test a class with multiple inheritance
+        var BadClass=OpenLayers.Class(OpenLayers.Layer.WFS, OpenLayers.Control.DragFeature);
+        var bad = new BadClass({});
+        t.ok(!(bad instanceof OpenLayers.Control), "bad is a control, but it is also a layer and we cannot have two superclasses");
+        t.ok(bad instanceof OpenLayers.Layer, "bad is a layer, it inherits from the layer first");
+    }
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/BaseTypes/Element.html b/tests/BaseTypes/Element.html
new file mode 100644
index 0000000..a3fd99c
--- /dev/null
+++ b/tests/BaseTypes/Element.html
@@ -0,0 +1,237 @@
+<html>
+  <head>
+  
+    <script src="../../lib/OpenLayers.js"></script>
+
+    <script type="text/javascript">
+
+    function test_Element_visible(t) {
+        t.plan(3);
+        
+        var elem = {
+            style: {
+                'display': ""
+            }
+        };
+        
+        elem.style.display = "";
+        t.ok(OpenLayers.Element.visible(elem), "element with style.display == '' is visible");
+            
+        elem.style.display = "block";
+        t.ok(OpenLayers.Element.visible(elem), "element with style.display == block is visible");
+            
+        elem.style.display = "none";
+        t.ok(!OpenLayers.Element.visible(elem), "element with style.display == none is not visible");
+    }
+    
+    function test_Element_toggle(t) {
+        t.plan(2);
+
+        var elem1 = {
+            style: {
+                'display': "none"
+            }
+        };
+        
+        var elem2 = {
+            style: {
+                'display': ""
+            }
+        };
+
+        OpenLayers.Element.toggle(elem1, elem2);
+        
+        t.eq(elem1.style.display, "", "hidden element toggled to display");
+        t.eq(elem2.style.display, "none", "shown element toggled to hidden");
+    }
+    
+    function test_Element_hide(t) {
+        t.plan(2);
+
+        var elem1 = {
+            style: {
+                'display': "none"
+            }
+        };
+        
+        var elem2 = {
+            style: {
+                'display': ""
+            }
+        };
+
+        OpenLayers.Element.hide(elem1, elem2, "do-not-exists");
+        
+        t.eq(elem1.style.display, "none", "hidden element stays hidden");
+        t.eq(elem2.style.display, "none", "shown element hidden");
+    }
+    
+    function test_Element_show(t) {
+        t.plan(2);
+
+        var elem1 = {
+            style: {
+                'display': "none"
+            }
+        };
+        
+        var elem2 = {
+            style: {
+                'display': ""
+            }
+        };
+
+        OpenLayers.Element.show(elem1, "do-not-exists", elem2);
+        
+        t.eq(elem1.style.display, "", "hidden element shown");
+        t.eq(elem2.style.display, "", "shown element stays shown");
+    }
+    
+    function test_Element_remove(t) {
+        t.plan(1);
+
+        var elem = {
+            parentNode: {
+                'removeChild': function(elem) {
+                    t.ok(true, "removeChild called");
+                }
+            }        
+        };
+        OpenLayers.Element.remove(elem);
+    }
+    
+    function test_Element_getHeight(t) {
+        t.plan(1);
+
+        var elem = {
+            'offsetHeight': {}
+        };
+        
+        t.ok(OpenLayers.Element.getHeight(elem) == elem.offsetHeight, "offsetHeight returned");
+    }
+    
+    function test_hasClass(t) {        
+        t.plan(14);
+        var has = OpenLayers.Element.hasClass;
+
+        var element = document.createElement("div");
+        element.className = "fe fi fo fum one.part two-part three:part four";
+        
+        t.ok(has(element, "fe"), "has fe");
+        t.ok(has(element, "fi"), "has fi");
+        t.ok(has(element, "fo"), "has fo");
+        t.ok(!has(element, "f"), "hasn't f");
+        t.ok(!has(element, "o"), "hasn't o");
+        t.ok(!has(element, "fumb"), "hasn't fumb");
+        t.ok(!has(element, "one"), "hasn't one");
+        t.ok(has(element, "one.part"), "has one.part");
+        t.ok(!has(element, "two"), "hasn't two");
+        t.ok(has(element, "two-part"), "has two-part");
+        t.ok(!has(element, "three"), "hasn't three");
+        t.ok(has(element, "three:part"), "has three:part");
+        t.ok(has(element, "four"), "has four");
+        
+        element.className = "";
+        t.ok(!has(element, "nada"), "hasn't nada");
+    }
+
+    function test_addClass(t) {        
+        t.plan(6);
+        var add = OpenLayers.Element.addClass;
+        
+        var element = document.createElement("div");
+        element.id = "foo";
+        t.eq(element.className, "", "starts with no class name");
+        
+        var mod = add(element, "first");
+        t.eq(mod.id, element.id, "returns the same element");
+        t.eq(element.className, "first", "properly adds first class name");        
+        t.eq(add(element, "second").className, "first second",
+             "properly adds second class name");
+        t.eq(add(element, "second").className, "first second",
+             "doesn't do anything for duplicated names");
+        t.eq(add(element, "third").className, "first second third",
+             "properly adds third class name");
+    }
+    
+    function test_removeClass(t) {
+        t.plan(5);
+        var remove = OpenLayers.Element.removeClass;
+        
+        var element = document.createElement("div");
+        element.id = "foo";
+        element.className = "first second middle fourth last";
+        
+        var mod = remove(element, "last");
+        t.eq(mod.id, element.id, "returns the same element");
+        t.eq(element.className, "first second middle fourth",
+             "properly removes last class name");
+        t.eq(remove(element, "first").className, "second middle fourth",
+             "properly removes first class name");
+        t.eq(remove(element, "middle").className, "second fourth",
+             "properly removes middle class name");
+        t.eq(remove(element, "nada").className, "second fourth",
+             "doesn't do anything for bogus class name");
+    }
+
+    function test_toggleClass(t) {
+        t.plan(5);
+        var toggle = OpenLayers.Element.toggleClass;
+        
+        var element = document.createElement("div");
+        element.id = "foo";
+        
+        var mod = toggle(element, "first");
+        t.eq(mod.id, element.id, "returns the same element");
+        t.eq(element.className, "first", "adds first new class name");
+        t.eq(toggle(element, "second").className, "first second",
+             "adds second new class name");
+        t.eq(toggle(element, "first").className, "second",
+             "removes first existing class name");
+        t.eq(toggle(element, "second").className, "",
+             "removes second existing class name");
+    }
+
+    function test_Element_getStyle(t) {
+        t.plan(5);
+
+    //tests for this function are not 100% complete... there is some funky
+    // business going on in there with 
+    //  * document.defaultView (moz/ff I believe)
+    // but I cant seem to find a good way to test them.
+    // 
+		t.ok(OpenLayers.Element.getStyle(null, null) == null, "passing null values in to getStyle() doesnt bomb, returns null");
+
+        var elem = document.getElementById("elemID");
+        elem.style.chickenHead = {}
+
+        var style = "chickenHead";
+        t.ok(OpenLayers.Element.getStyle(elem, style) == elem.style.chickenHead, "get style on basic stylename returns correctly");
+
+        elem.style.chickenHead = "auto";
+        style = "chickenHead";
+        t.ok(OpenLayers.Element.getStyle(elem, style) == null, "get style on 'auto' style returns null");
+
+        if (OpenLayers.Util.getBrowserName() == "opera") {
+            elem.style.top = "15px";
+            style = "top";
+
+            elem.style.position = "static";
+            t.ok(OpenLayers.Element.getStyle(elem, style) == null, "in opera: get (top/left/right/bottom) style when position == 'static' returns null");
+            
+            elem.style.position = "";
+            t.ok(OpenLayers.Element.getStyle(elem, style) == null, "in opera: get (top/left/right/bottom) style when position != 'static', gets computedStyle as static and returns null");
+
+        } else {
+            t.ok(true, "browser is not opera.");
+            t.ok(true, "trust me. browser is not opera.");
+        }
+
+    }    
+
+    </script>
+  </head>
+  <body>
+    <div id="elemID" style="width:50px; height:100px; background-color:red">test</div>
+  </body>
+</html>
diff --git a/tests/BaseTypes/LonLat.html b/tests/BaseTypes/LonLat.html
new file mode 100644
index 0000000..400d30b
--- /dev/null
+++ b/tests/BaseTypes/LonLat.html
@@ -0,0 +1,178 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var lonlat; 
+
+    function test_LonLat_constructor (t) {
+        t.plan( 6 );
+        lonlat = new OpenLayers.LonLat(6, 5);
+        t.ok( lonlat instanceof OpenLayers.LonLat, "new OpenLayers.LonLat returns LonLat object" );
+        t.eq( lonlat.CLASS_NAME, "OpenLayers.LonLat", "lonlat.CLASS_NAME is set correctly");
+        t.eq( lonlat.lon, 6, "lonlat.lon is set correctly");
+        t.eq( lonlat.lat, 5, "lonlat.lat is set correctly");
+
+        // possible global Mercator projection values
+        lonlat = new OpenLayers.LonLat(20037508.33999999, -20037508.33999999);
+        t.eq( lonlat.lon, 20037508.34, "lonlat.lon rounds correctly");
+        t.eq( lonlat.lat, -20037508.34, "lonlat.lat rounds correctly");
+    }
+    
+    function test_LonLat_constructorFromStrings (t) {
+        t.plan( 4 );
+        lonlat = new OpenLayers.LonLat("6", "5");
+        t.ok( lonlat instanceof OpenLayers.LonLat, "new OpenLayers.LonLat returns LonLat object" );
+        t.eq( lonlat.CLASS_NAME, "OpenLayers.LonLat", "lonlat.CLASS_NAME is set correctly");
+        t.eq( lonlat.lon, 6, "lonlat.lon is set correctly");
+        t.eq( lonlat.lat, 5, "lonlat.lat is set correctly");
+    }
+
+    function test_LonLat_toString(t) {
+        t.plan( 1 );
+        lonlat = new OpenLayers.LonLat(5,6);
+        t.eq( lonlat.toString(), "lon=5,lat=6", "lonlat.toString() returns correctly");
+    }
+
+    function test_LonLat_toShortString(t) {
+        t.plan( 1 );
+        lonlat = new OpenLayers.LonLat(5,6);
+        t.eq( lonlat.toShortString(), "5, 6", "lonlat.toShortString() returns correctly");
+    }
+
+    function test_LonLat_clone(t) {
+        t.plan( 3 );
+        oldLonLat = new OpenLayers.LonLat(5,6);
+        lonlat = oldLonLat.clone();
+        t.ok( lonlat instanceof OpenLayers.LonLat, "clone returns new OpenLayers.LonLat object" );
+        t.ok( lonlat.equals(oldLonLat), "lonlat is set correctly");
+        
+        oldLonLat.lon = 100;
+        t.eq( lonlat.lon, 5, "changing oldLonLat.lon doesn't change lonlat.lon");
+    }
+
+    function test_LonLat_add(t) {
+        t.plan(10);
+
+        origLL = new OpenLayers.LonLat(10,100);
+        lonlatA = origLL.clone();
+
+        addpx = lonlatA.add(5, 50);
+        t.ok( lonlatA.equals(origLL), "lonlatA is not modified by add operation");
+
+        var ll = new OpenLayers.LonLat(15,150);
+        t.ok( addpx.equals(ll), "addpx is set correctly");
+        
+    //null values
+        var desiredMsg = "You must pass both lon and lat values to the add function.";
+        OpenLayers.Console.error = function(msg) {
+            t.eq(msg, desiredMsg, "error correctly reported");
+        }
+    
+        addpx = lonlatA.add(null, 50);
+        t.ok( lonlatA.equals(origLL), "lonlatA is not modified by erroneous add operation (null lon)");
+        t.ok(addpx == null, "returns null on erroneous add operation (null lon)");
+ 
+        addpx = lonlatA.add(5, null);
+        t.ok( lonlatA.equals(origLL), "lonlatA is not modified by erroneous add operation (null lat)");
+        t.ok(addpx == null, "returns null on erroneous add operation (null lat)");
+
+        // string values
+        addpx = origLL.clone().add("5", "50");
+        t.eq(addpx.lon, 15, "addpx.lon is set correctly");
+        t.eq(addpx.lat, 150, "addpx.lat is set correctly");
+    }
+    
+    function test_LonLat_equals(t) {
+        t.plan( 5 );
+        lonlat = new OpenLayers.LonLat(5,6);
+
+        ll = new OpenLayers.LonLat(5,6);
+        t.eq( lonlat.equals(ll), true, "(5,6) equals (5,6)");
+
+        ll = new OpenLayers.LonLat(1,6);
+        t.eq( lonlat.equals(ll), false, "(5,6) does not equal (1,6)");
+
+        ll = new OpenLayers.LonLat(5,2);
+        t.eq( lonlat.equals(ll), false, "(5,6) does not equal (5,2)");
+
+        ll = new OpenLayers.LonLat(1,2);
+        t.eq( lonlat.equals(ll), false, "(5,6) does not equal (1,2)");
+
+        t.ok( !lonlat.equals(null), "equals() returns false on comparison to null");
+
+    }
+
+    function test_LonLat_fromString(t) {
+        t.plan( 2 );
+        lonlat = OpenLayers.LonLat.fromString("6,5");
+        t.ok( lonlat instanceof OpenLayers.LonLat, "new OpenLayers.LonLat returns LonLat object" );
+
+        var ll = new OpenLayers.LonLat(6, 5);
+        t.ok( lonlat.equals(ll), "lonlat is set correctly");
+    }
+
+    function test_LonLat_transform(t) {
+        t.plan( 6 );
+        lonlat = new OpenLayers.LonLat(10, -10);
+        lonlat.transform(new OpenLayers.Projection("foo"), new OpenLayers.Projection("Bar")); 
+        t.eq(lonlat.lon, 10, "lon for null transform is the same")
+        t.eq(lonlat.lat, -10, "lat for null transform is the same")
+        lonlat.transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913")); 
+        t.eq(Math.round(lonlat.lon), 1113195, "lon for spherical mercator transform is correct");
+        t.eq(Math.round(lonlat.lat), -1118890, "lat for spherical mercator correct")
+        lonlat.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326")); 
+        t.eq(lonlat.lon, 10, "lon for inverse spherical mercator transform is correct");
+        t.eq(Math.round(lonlat.lat), -10, "lat for inverse spherical mercator correct")
+    }
+    
+    function test_LonLat_wrapDateLine(t) {
+        t.plan( 6 );
+
+        var goodLL = new OpenLayers.LonLat(0,0);
+        var testLL, wrappedLL;
+
+  //bad maxextent
+        var maxExtent = null;
+
+        testLL = goodLL.clone();
+        wrappedLL = testLL.wrapDateLine(maxExtent);
+        t.ok(wrappedLL.equals(goodLL), "wrapping a ll with a bad maxextent does nothing");
+        
+        
+  //good maxextent
+        maxExtent = new OpenLayers.Bounds(-10,-10,10,10);
+
+    //inside
+        testLL = goodLL.clone();
+        wrappedLL = testLL.wrapDateLine(maxExtent);
+        t.ok(wrappedLL.equals(goodLL), "wrapping a ll within the maxextent does nothing");
+        
+    //left
+        testLL = goodLL.add(-20,0);
+        wrappedLL = testLL.wrapDateLine(maxExtent);
+        t.ok(wrappedLL.equals(goodLL), "wrapping a ll once left of maxextent works");
+        
+    //way left
+        testLL = goodLL.add(-200,0);
+        wrappedLL = testLL.wrapDateLine(maxExtent);
+        t.ok(wrappedLL.equals(goodLL), "wrapping a ll way left of maxextent works");
+
+    //right
+        testLL = goodLL.add(20,0);
+        wrappedLL = testLL.wrapDateLine(maxExtent);
+        t.ok(wrappedLL.equals(goodLL), "wrapping a ll once right of maxextent works");
+        
+    //way right
+        testLL = goodLL.add(200,0);
+        wrappedLL = testLL.wrapDateLine(maxExtent);
+        t.ok(wrappedLL.equals(goodLL), "wrapping a ll way right of maxextent works");
+
+    }
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/BaseTypes/Pixel.html b/tests/BaseTypes/Pixel.html
new file mode 100644
index 0000000..c9da789
--- /dev/null
+++ b/tests/BaseTypes/Pixel.html
@@ -0,0 +1,111 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var pixel; 
+    
+    function test_Pixel_constructor (t) {
+        t.plan( 4 );
+        pixel = new OpenLayers.Pixel(5,6);
+        t.ok( pixel instanceof OpenLayers.Pixel, "new OpenLayers.Pixel returns Pixel object" );
+        t.eq( pixel.CLASS_NAME, "OpenLayers.Pixel", "pixel.CLASS_NAME is set correctly");
+        t.eq( pixel.x, 5, "pixel.x is set correctly");
+        t.eq( pixel.y, 6, "pixel.y is set correctly");
+    }
+
+    function test_Pixel_constructorFromString (t) {
+        t.plan( 4 );
+        pixel = new OpenLayers.Pixel("5","6");
+        t.ok( pixel instanceof OpenLayers.Pixel, "new OpenLayers.Pixel returns Pixel object" );
+        t.eq( pixel.CLASS_NAME, "OpenLayers.Pixel", "pixel.CLASS_NAME is set correctly");
+        t.eq( pixel.x, 5, "pixel.x is set correctly");
+        t.eq( pixel.y, 6, "pixel.y is set correctly");
+    }
+
+    function test_Pixel_toString(t) {
+        t.plan( 1 );
+        pixel = new OpenLayers.Pixel(5,6);
+        t.eq( pixel.toString(), "x=5,y=6", "pixel.toString() returns correctly");
+    }
+
+    function test_Pixel_clone(t) {
+        t.plan( 4 );
+        oldPixel = new OpenLayers.Pixel(5,6);
+        pixel = oldPixel.clone();
+        t.ok( pixel instanceof OpenLayers.Pixel, "clone returns new OpenLayers.Pixel object" );
+        t.eq( pixel.x, 5, "pixel.x is set correctly");
+        t.eq( pixel.y, 6, "pixel.y is set correctly");
+        
+        oldPixel.x = 100;
+        t.eq( pixel.x, 5, "changing oldPixel.x doesn't change pixel.x");
+    }
+
+    function test_Pixel_equals(t) {
+        t.plan( 5 );
+        pixel = new OpenLayers.Pixel(5,6);
+
+        px = new OpenLayers.Pixel(5,6);
+        t.eq( pixel.equals(px), true, "(5,6) equals (5,6)");
+
+        px = new OpenLayers.Pixel(1,6);
+        t.eq( pixel.equals(px), false, "(5,6) does not equal (1,6)");
+
+        px = new OpenLayers.Pixel(5,2);
+        t.eq( pixel.equals(px), false, "(5,6) does not equal (5,2)");
+
+        px = new OpenLayers.Pixel(1,2);
+        t.eq( pixel.equals(px), false, "(5,6) does not equal (1,2)");
+
+        t.ok( !pixel.equals(null), "equals() returns false on comparison to null");
+
+    }
+
+    function test_Pixel_add(t) {
+        t.plan( 8 );
+
+        var origPX = new OpenLayers.Pixel(5,6);
+        var oldPixel = origPX.clone();
+
+        var pixel = oldPixel.add(10,20);
+        
+        t.ok( oldPixel.equals(origPX), "oldPixel not modified by add operation");
+        
+        var px = new OpenLayers.Pixel(15,26);
+        t.ok( pixel.equals(px), "returned pixel is correct");
+
+    //null values
+        var desiredMsg = "You must pass both x and y values to the add function.";
+        OpenLayers.Console.error = function(msg) {
+            t.eq(msg, desiredMsg, "error correctly reported");
+        }
+    
+        pixel = oldPixel.add(null, 50);
+        t.ok( oldPixel.equals(origPX), "oldPixel is not modified by erroneous add operation (null x)");
+        t.ok(pixel == null, "returns null on erroneous add operation (null x)");
+ 
+        addpx = oldPixel.add(5, null);
+        t.ok( oldPixel.equals(origPX), "oldPixel is not modified by erroneous add operation (null y)");
+        t.ok(pixel == null, "returns null on erroneous add operation (null y)");
+    }
+
+    function test_Pixel_offset(t) {
+        t.plan( 4 );
+
+        var oldPixel = new OpenLayers.Pixel(5,6);
+        var offset = new OpenLayers.Pixel(10,20);
+
+        pixel = oldPixel.offset(offset);
+
+        t.eq( oldPixel.x, 5, "oldPixel.x not modified by offset operation");
+        t.eq( oldPixel.y, 6, "oldPixel.y not modified by offset operation");
+
+        t.eq( pixel.x, 15, "pixel.x is set correctly");
+        t.eq( pixel.y, 26, "pixel.y is set correctly");
+    }
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/BaseTypes/Size.html b/tests/BaseTypes/Size.html
new file mode 100644
index 0000000..ab0c277
--- /dev/null
+++ b/tests/BaseTypes/Size.html
@@ -0,0 +1,67 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var Size; 
+    
+    function test_Size_constructor (t) {
+        t.plan( 4 );
+        size = new OpenLayers.Size(5,6);
+        t.ok( size instanceof OpenLayers.Size, "new OpenLayers.Size returns size object" );
+        t.eq( size.CLASS_NAME, "OpenLayers.Size", "size.CLASS_NAME is set correctly");
+        t.eq( size.w, 5, "size.w is set correctly");
+        t.eq( size.h, 6, "size.h is set correctly");
+    }
+
+    function test_Size_constructorFromString (t) {
+        t.plan( 4 );
+        size = new OpenLayers.Size("5","6");
+        t.ok( size instanceof OpenLayers.Size, "new OpenLayers.Size returns size object" );
+        t.eq( size.CLASS_NAME, "OpenLayers.Size", "size.CLASS_NAME is set correctly");
+        t.eq( size.w, 5, "size.w is set correctly");
+        t.eq( size.h, 6, "size.h is set correctly");
+    }
+    
+    function test_Size_toString(t) {
+        t.plan( 1 );
+        size = new OpenLayers.Size(5,6);
+        t.eq( size.toString(), "w=5,h=6", "size.toString() returns correctly");
+    }
+
+    function test_Size_clone(t) {
+        t.plan( 3 );
+
+        oldSize = new OpenLayers.Size(5,6);
+        size = oldSize.clone();
+        t.ok( size instanceof OpenLayers.Size, "clone returns new OpenLayers.Size object" );
+        t.ok( size.equals(oldSize), "new size is equal to old size correctly");
+        
+        oldSize.w = 100;
+        t.eq( size.w, 5, "changing oldSize.w doesn't change size.w");
+    }
+
+     function test_Size_equals(t) {
+        t.plan( 5 );
+        size = new OpenLayers.Size(5,6);
+
+        sz = new OpenLayers.Size(5,6);
+        t.eq( size.equals(sz), true, "(5,6) equals (5,6)");
+
+        sz = new OpenLayers.Size(1,6);
+        t.eq( size.equals(sz), false, "(5,6) does not equal (1,6)");
+
+        sz = new OpenLayers.Size(5,2);
+        t.eq( size.equals(sz), false, "(5,6) does not equal (5,2)");
+
+        sz = new OpenLayers.Size(1,2);
+        t.eq( size.equals(sz), false, "(5,6) does not equal (1,2)");
+
+        t.ok( !size.equals(null), "equals() returns false on comparison to null");
+    }
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Console.html b/tests/Console.html
new file mode 100644
index 0000000..aac38a2
--- /dev/null
+++ b/tests/Console.html
@@ -0,0 +1,39 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Console(t) {
+        
+        /**
+         * These tests only assure that OpenLayers works when not
+         * in debug mode.  It means that calls to OpenLayers.Console
+         * will not do anything in this case.  When OpenLayers is in
+         * debug mode, we assume that the Firebug extension or Firebug Lite
+         * works as advertised.
+         */
+        
+        // supported OpenLayers.Console methods
+        var methods = ['log', 'debug', 'info', 'warn', 'error', 'assert',
+               'dir', 'dirxml', 'trace', 'group', 'groupEnd', 'time',
+               'timeEnd', 'profile', 'profileEnd', 'count'];
+
+        t.plan(methods.length * 2);
+
+        var nothing, method;
+        for(var i=0; i<methods.length; ++i) {
+            method = OpenLayers.Console[methods[i]];
+            t.ok(method,
+                 "OpenLayers.Console." + methods[i] + " exists");
+            nothing = OpenLayers.Console[methods[i]]();
+            t.eq(nothing, null,
+                 "OpenLayers.Console." + methods[i] + "() " +
+                 "call is harmless when not in debug mode");
+        }
+
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Control.html b/tests/Control.html
new file mode 100644
index 0000000..a94426f
--- /dev/null
+++ b/tests/Control.html
@@ -0,0 +1,106 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Control_constructor(t) {
+        t.plan(4);
+    
+        var control = new OpenLayers.Control();
+
+        t.ok(control instanceof OpenLayers.Control, "new OpenLayers.Control returns object");
+        t.eq(control.displayClass, "olControl", "displayClass set correctly");
+        t.ok(control.id != null, "default id assigned to control");
+        
+        var testID = {};
+        control = new OpenLayers.Control({ 'id': testID });
+        t.ok(control.id == testID, "if id specified in options, no default assigned.");
+    }
+
+    function test_Control_addControl(t) {
+        t.plan(2);
+    
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+
+        t.ok(control.map === map, "Control.map is set to the map object" );
+        t.ok(map.controls[map.controls.length - 1] === control, "map.controls contains control");
+    }
+    
+    function test_Control_title(t) { 
+        t.plan( 1 ); 
+        var titleText = 'Title test'; 
+        control = new OpenLayers.Control({title:titleText}); 
+        t.eq( control.title, titleText, "control.title set correctly" ); 
+    }
+    
+    function test_eventListeners(t) {
+        t.plan(1);
+        
+        var method = OpenLayers.Events.prototype.on;
+        // test that events.on is called at control construction
+        var options = {
+            eventListeners: {foo: "bar"}
+        };
+        OpenLayers.Events.prototype.on = function(obj) {
+            t.eq(obj, options.eventListeners, "events.on called with eventListeners");
+        }
+        var control = new OpenLayers.Control(options);
+        OpenLayers.Events.prototype.on = method;
+        control.destroy();
+
+        // if events.on is called again, this will fail due to an extra test
+        // test control without eventListeners
+        OpenLayers.Events.prototype.on = function(obj) {
+            t.fail("events.on called without eventListeners");
+        }
+        var control2 = new OpenLayers.Control();
+        OpenLayers.Events.prototype.on = method;
+        control2.destroy();
+    }
+
+    function test_Control_destroy(t) {
+        t.plan(3);
+    
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+
+        control.destroy();
+        t.ok(map.controls[map.controls.length - 1] != control, "map.controls doesn't contains control");
+
+        t.ok(control.map == null, "Control.map is null");
+        t.ok(control.handler == null, "Control.handler is null");
+    }
+    
+    function test_autoActivate(t) {
+        
+        t.plan(3);
+        
+        var control, map = new OpenLayers.Map("map");
+
+        // confirm that a control is not activated by default
+        control = new OpenLayers.Control();
+        map.addControl(control);
+        t.ok(!control.active, "control is not activated by default");
+        
+        // confirm that control is activated with autoActivate true
+        control = new OpenLayers.Control({autoActivate: true});
+        map.addControl(control);
+        t.ok(control.active, "control is activated with autoActivate true");
+       
+        // confirm that control is not activated with autoActivate false
+        control = new OpenLayers.Control({autoActivate: false});
+        map.addControl(control);
+        t.ok(!control.active, "control is not activated with autoActivate false");
+        
+        map.destroy();
+        
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/Attribution.html b/tests/Control/Attribution.html
new file mode 100644
index 0000000..f4f0aa6
--- /dev/null
+++ b/tests/Control/Attribution.html
@@ -0,0 +1,59 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+    function test_Control_Attribution_constructor (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.Attribution();
+        t.ok( control instanceof OpenLayers.Control.Attribution, "new OpenLayers.Control returns object" );
+        t.eq( control.displayClass,  "olControlAttribution", "displayClass is correct" );
+    }
+    function test_Control_Attribution_setBaseLayer (t) {
+        t.plan(1);
+        map = new OpenLayers.Map("map");
+        map.addControl(control);
+        map.addLayer(new OpenLayers.Layer("name",{'attribution':'My layer!', isBaseLayer: true}));
+        map.addLayer(new OpenLayers.Layer("name",{'attribution':'My layer 2!', isBaseLayer: true}));
+        map.setBaseLayer(map.layers[1]);
+        t.eq(control.div.innerHTML, 'My layer 2!', "Attribution correct with changed base layer");
+
+    }
+    function test_Control_Attribution_draw (t) {
+        t.plan(3);
+        control = new OpenLayers.Control.Attribution();
+        map = new OpenLayers.Map("map");
+        map.addControl(control);
+        map.addLayer(new OpenLayers.Layer("name",{'attribution':'My layer!'}));
+        t.eq(control.div.innerHTML, 'My layer!', "Attribution correct with one layer.");
+        map.addLayer(new OpenLayers.Layer("name", {'attribution':'My layer 2!'}));
+        t.eq(control.div.innerHTML, 'My layer!, My layer 2!', "Attribution correct with two layers.");
+        control.separator = '|';
+        map.addLayer(new OpenLayers.Layer("name",{'attribution':'My layer 3!'}));
+        t.eq(control.div.innerHTML, 'My layer!|My layer 2!|My layer 3!', "Attribution correct with three layers and diff seperator.");
+
+
+    }    
+    
+    function test_Control_Attribution_no_duplicates(t) {
+        t.plan(2);
+        
+        map = new OpenLayers.Map("map");
+        map.addLayer(new OpenLayers.Layer("Company A: 1",{'attribution':'company A'}));
+        map.addLayer(new OpenLayers.Layer("Company A: 2",{'attribution':'company A'}));
+
+        control = new OpenLayers.Control.Attribution();
+        map.addControl(control);
+        t.eq(control.div.innerHTML, 'company A', "Attribution not duplicated.");
+                
+        map.addLayer(new OpenLayers.Layer("Company B: 1",{'attribution':'company B'}));
+        map.addLayer(new OpenLayers.Layer("Company A: 3",{'attribution':'company A'}));
+        t.eq(control.div.innerHTML, 'company A, company B', "Attribution correct with four layers (3 with same attribution).");
+    }
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/Button.html b/tests/Control/Button.html
new file mode 100644
index 0000000..925e621
--- /dev/null
+++ b/tests/Control/Button.html
@@ -0,0 +1,17 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+      function test_Control_Button_constructor (t) {
+          t.plan( 2 );
+      
+          control = new OpenLayers.Control.Button();
+          t.ok( control instanceof OpenLayers.Control.Button, "new OpenLayers.Control returns object" );
+          t.eq( control.displayClass, "olControlButton", "displayClass is correct" );
+      }
+    
+    </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Control/DragFeature.html b/tests/Control/DragFeature.html
new file mode 100644
index 0000000..edc7689
--- /dev/null
+++ b/tests/Control/DragFeature.html
@@ -0,0 +1,279 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    function test_Control_DragFeature_constructor(t) {
+        t.plan(3);
+        
+        var options = {
+            geometryTypes: "foo"
+        };
+        var layer = "bar";
+        var control = new OpenLayers.Control.DragFeature(layer, options);
+        t.ok(control instanceof OpenLayers.Control.DragFeature,
+             "new OpenLayers.Control.DragFeature returns an instance");
+        t.eq(control.layer, "bar",
+             "constructor sets layer correctly");        
+        t.eq(control.handlers.feature.geometryTypes, "foo",
+             "constructor sets options correctly on feature handler");
+    }
+    
+    function test_Control_DragFeature_destroy(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        control.handlers.drag.destroy = function() {
+            t.ok(true,
+                 "control.destroy calls destroy on drag handler");
+        }
+        control.handlers.feature.destroy = function() {
+            t.ok(true,
+                 "control.destroy calls destroy on feature handler");
+        }
+        
+        control.destroy();
+        
+    }
+    
+    function test_Control_DragFeature_activate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        map.addControl(control);
+        t.ok(!control.handlers.feature.active,
+             "feature handler is not active prior to activating control");
+        control.activate();
+        t.ok(control.handlers.feature.active,
+             "feature handler is active after activating control");
+    }
+
+    function test_Control_DragFeature_deactivate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        map.addControl(control);
+        
+        control.handlers.drag.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on drag handler");
+        }
+        control.handlers.feature.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on feature handler");
+        }
+        control.deactivate();
+    }
+    
+    function test_Control_DragFeature_over(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        map.addControl(control);
+        
+        control.activate();
+        t.ok(!control.handlers.drag.active,
+             "drag handler is not active before over a feature");
+        
+        // simulate a mouseover on a feature
+        var feature = new OpenLayers.Feature.Vector();
+        feature.layer = layer;
+        layer.getFeatureFromEvent = function(evt) {
+            return feature;
+        }
+        map.events.triggerEvent("mousemove", {type: "mousemove"});
+        
+        t.eq(control.feature.id, feature.id,
+             "control gets the proper feature from the feature handler");
+        t.ok(control.handlers.drag.active,
+             "drag handler activated when over a feature");
+    }
+
+    function test_Control_DragFeature_down(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        map.addControl(control);
+        
+        control.activate();
+        
+        // simulate a mouseover on a feature
+        var feature = new OpenLayers.Feature.Vector();
+        feature.layer = layer;
+        layer.getFeatureFromEvent = function(evt) {
+            return feature;
+        }
+        map.events.triggerEvent("mousemove", {type: "mousemove"});
+
+        // simulate a mousedown on a feature
+        control.onStart = function(feat, pixel) {
+            t.eq(feat.id, feature.id, "onStart called with the correct feature");
+            t.eq(pixel, "bar", "onStart called with the correct pixel");
+        }
+        map.events.triggerEvent("mousedown", {xy: "bar", which: 1, type: "mousemove"});
+
+        t.eq(control.lastPixel, "bar",
+             "mousedown sets the lastPixel correctly");
+    }
+
+    function test_Control_DragFeature_move(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        map.addControl(control);
+        map.getResolution = function() {
+            return 2;
+        }
+
+        control.activate();
+
+        // mock up a feature - for the sole purpose of testing mousemove
+        var uid = Math.random();
+        layer.getFeatureFromEvent = function() {
+            var geom = new OpenLayers.Geometry.Point(Math.random(),
+                                                     Math.random());
+            geom.move = function(x, y) {
+                t.eq(x, 2, "move called with dx * res");
+                t.eq(y, -4, "move called with -dy * res");
+            };
+            var feature = new OpenLayers.Feature.Vector(geom);
+            feature.layer = layer;
+            feature.uid = uid;
+            return feature;
+        };
+        layer.drawFeature = function(feature) {
+            t.eq(feature.uid, uid,
+                 "layer.drawFeature called with correct feature");
+        };
+
+        // simulate a mouseover on a feature
+        map.events.triggerEvent("mousemove", {type: "mousemove"});
+
+        // simulate a mousedown on a feature
+        var down = new OpenLayers.Pixel(0, 0);
+        map.events.triggerEvent("mousedown", {xy: down, which: 1, type: "mousemove"});
+
+        // simulate a mousemove on a feature
+        var move = new OpenLayers.Pixel(1, 2);
+        map.events.triggerEvent("mousemove", {xy: move, which: 1, type: "mousemove"});
+        
+    }
+
+    function test_Control_DragFeature_up(t) {
+        t.plan(6);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        map.addControl(control);
+
+        control.activate();
+
+        // simulate a mouseover on a feature
+        var feature = new OpenLayers.Feature.Vector();
+        feature.layer = layer;
+        layer.getFeatureFromEvent = function(evt) {
+            return feature;
+        }
+        map.events.triggerEvent("mousemove", {type: "mousemove"});
+        t.eq(control.over, true,
+            "mouseover on a feature sets the over property to true");
+        t.ok(OpenLayers.Element.hasClass(control.map.viewPortDiv, "olControlDragFeatureOver"),
+            "mouseover on a feature adds class name to map container");
+        t.eq(control.handlers.drag.active, true,
+            "mouseover on a feature activates drag handler");
+
+        // simulate a mouse-up on the map, with the mouse still
+        // over the dragged feature
+        control.handlers.drag.started = true;
+        map.events.triggerEvent("mouseup", {type: "mouseup"});
+        t.eq(control.handlers.drag.active, true,
+            "mouseup while still over dragged feature does not deactivate drag handler");
+
+        // simulate a mouse-up on the map, with the mouse out of
+        // the dragged feature
+        control.handlers.drag.started = true;
+        control.over = false;
+        map.events.triggerEvent("mouseup", {type: "mouseup"});
+        t.eq(control.handlers.drag.active, false,
+            "mouseup deactivates drag handler");
+
+        control.deactivate();
+        t.ok(!OpenLayers.Element.hasClass(control.map.viewPortDiv, "olControlDragFeatureOver"),
+            "deactivate removes class name from map container");
+    }
+    
+    function test_Control_DragFeature_done(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        map.addControl(control);
+
+        control.activate();
+
+
+        // simulate a mouseover on a feature
+        var feature = new OpenLayers.Feature.Vector();
+        feature.layer = layer;
+        layer.getFeatureFromEvent = function() {
+            return feature;
+        };
+        map.events.triggerEvent("mousemove", {type: "mousemove"});
+        t.eq(control.feature.id, feature.id,
+             "feature is set on mouse over");
+        control.doneDragging();
+        t.eq(control.feature.id, feature.id, 
+          "feature sticks around after doneDragging is called.");
+        
+    }
+
+    function test_Control_DragFeature_out(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.DragFeature(layer);
+        map.addControl(control);
+
+        control.activate();
+
+
+        // simulate a mouseover on a feature
+        var feature = new OpenLayers.Feature.Vector();
+        feature.layer = layer;
+        layer.getFeatureFromEvent = function() {
+            return feature;
+        };
+        map.events.triggerEvent("mousemove", {type: "mousemove"});
+        t.eq(control.feature.id, feature.id,
+             "feature is set on mouse over");
+        
+        // simulate a mouseout on a feature
+        layer.getFeatureFromEvent = function() {
+            return null;
+        };
+        map.events.triggerEvent("mousemove", {type: "mousemove"});
+        t.ok(control.feature == null,
+             "feature is set to null on mouse out");
+        
+    }
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Control/DragPan.html b/tests/Control/DragPan.html
new file mode 100644
index 0000000..def6bd6
--- /dev/null
+++ b/tests/Control/DragPan.html
@@ -0,0 +1,104 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map, control, layer; 
+
+    function init_map() {
+        control = new OpenLayers.Control.DragPan();
+        map = new OpenLayers.Map("map", {controls:[control]});
+        layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                    "http://labs.metacarta.com/wms/vmap0",
+                    {layers: 'basic'} );
+        map.addLayer(layer); 
+        map.zoomToMaxExtent();
+        map.zoomIn();
+        control.activate();
+        return [map, control];
+    }    
+    function test_Control_DragPan_constructor (t) {
+        t.plan( 1 );
+    
+        control = new OpenLayers.Control.DragPan();
+        t.ok( control instanceof OpenLayers.Control.DragPan, "new OpenLayers.Control returns object" );
+    }
+    function test_Control_DragPan_drag (t) {
+        t.plan(4);
+        var data = init_map();
+        map = data[0]; control = data[1];
+        res = map.baseLayer.resolutions[map.getZoom()];
+        t.eq(map.center.lat, 0, "Lat is 0 before drag");
+        t.eq(map.center.lon, 0, "Lon is 0 before drag");
+        map.events.triggerEvent('mousedown', {'type':'mousedown', 'xy':new OpenLayers.Pixel(0,0), 'which':1});
+        map.events.triggerEvent('mousemove', {'type':'mousemove', 'xy':new OpenLayers.Pixel(5,5), 'which':1});
+        map.events.triggerEvent('mouseup', {'type':'mouseup', 'xy':new OpenLayers.Pixel(5,5), 'which':1});
+        
+        t.eq(map.getCenter().lat, res * 5, "Lat is " + (res * 5) + " after drag");
+        t.eq(map.getCenter().lon, res * -5, "Lon is " + (res * -5) + " after drag");
+    }
+    function test_Control_DragPan_drag_documentDrag (t) {
+        t.plan(4);
+        control = new OpenLayers.Control.DragPan({documentDrag: true});
+        map = new OpenLayers.Map("map", {controls:[control]});
+        layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://labs.metacarta.com/wms/vmap0",
+                    {layers: 'basic'} );
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        map.zoomIn();
+        control.activate();
+
+        res = map.baseLayer.resolutions[map.getZoom()];
+        t.eq(map.center.lat, 0, "Lat is 0 before drag");
+        t.eq(map.center.lon, 0, "Lon is 0 before drag");
+        map.events.triggerEvent('mousedown', {'type':'mousedown', 'xy':new OpenLayers.Pixel(0,0), 'which':1});
+        map.events.triggerEvent('mousemove', {'type':'mousemove', 'xy':new OpenLayers.Pixel(5,5), 'which':1});
+        map.events.triggerEvent('mouseup', {'type':'mouseup', 'xy':new OpenLayers.Pixel(5,5), 'which':1});
+        
+        t.eq(map.getCenter().lat, res * 5, "Lat is " + (res * 5) + " after drag");
+        t.eq(map.getCenter().lon, res * -5, "Lon is " + (res * -5) + " after drag");
+    }
+    function test_Control_DragPan_click(t) {
+        t.plan(1);
+        var control = new OpenLayers.Control.DragPan();
+        var map = new OpenLayers.Map("map", {controls:[control]});
+        var layer = new OpenLayers.Layer.WMS("OpenLayers WMS", 
+                                        "http://labs.metacarta.com/wms/vmap0",
+                                        {layers: 'basic'});
+        map.addLayer(layer); 
+        map.zoomToMaxExtent();
+        map.zoomIn();
+        control.activate();
+        map.setCenter = function() {
+            t.ok(false, "map.setCenter should not be called here");
+        };
+        var xy = new OpenLayers.Pixel(0, 0);
+        var down = {
+            'type': 'mousedown',
+            'xy': xy,
+            'which': 1
+        };
+        var move = {
+            'type': 'mousemove',
+            'xy': xy,
+            'which': 1
+        };
+        var up = {
+            'type': 'mouseup',
+            'xy': xy,
+            'which': 1
+        };
+        map.events.triggerEvent('mousedown', down);
+        map.events.triggerEvent('mousemove', move);
+        map.events.triggerEvent('mouseup', up);
+        t.ok(true, "clicking without moving the mouse does not call setCenter");
+    }
+    
+
+  </script>
+</head>
+<body>
+    <a id="scale" href="">DragPan</a> <br />
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/DrawFeature.html b/tests/Control/DrawFeature.html
new file mode 100644
index 0000000..63cff1e
--- /dev/null
+++ b/tests/Control/DrawFeature.html
@@ -0,0 +1,111 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(2);
+        var control = new OpenLayers.Control.DrawFeature("foo", function() {});
+        t.ok(control instanceof OpenLayers.Control.DrawFeature,
+             "constructor returns an instance");
+        t.ok(OpenLayers.Util.indexOf(control.EVENT_TYPES, "featureadded") > -1,
+             "featureadded event in EVENT_TYPES");
+    }
+    
+    function test_multi(t) {
+        t.plan(4);
+
+        var layer = new OpenLayers.Layer.Vector();
+        var control;
+        
+        // multi false by default
+        control = new OpenLayers.Control.DrawFeature(
+            layer, OpenLayers.Handler.Polygon
+        );
+        t.ok(!control.multi, "control.multi false by default");
+        t.ok(!control.handler.multi, "handler.multi false by default");
+        
+        // set on handler
+        control = new OpenLayers.Control.DrawFeature(
+            layer, OpenLayers.Handler.Polygon, {multi: true}
+        );
+        t.ok(control.handler.multi, "handler.multi set from control options");
+        
+        // respect handlerOptions
+        control = new OpenLayers.Control.DrawFeature(
+            layer, OpenLayers.Handler.Polygon,
+            {multi: true, handlerOptions: {multi: false}}
+        );
+        t.ok(!control.handler.multi, "handlerOptions.multi respected");
+
+    }
+    
+    function test_drawFeature(t) {
+        t.plan(3);
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.DrawFeature(layer, function() {});
+        var geom = {};
+        
+        layer.addFeatures = function(features) {
+            t.ok(features[0].geometry == geom, "layer.addFeatures called");
+            t.eq(features[0].state, OpenLayers.State.INSERT, "layer state set");
+        };
+        function handlefeatureadded(event) {
+            t.ok(event.feature.geometry == geom, "featureadded triggered");
+        }
+        control.events.on({"featureadded": handlefeatureadded});
+        control.drawFeature(geom);
+        control.events.un({"featureadded": handlefeatureadded});
+        
+    }
+    
+    function test_sketch_events(t) {
+        t.plan(6);
+        var map = new OpenLayers.Map("map", {
+            resolutions: [1]
+        });
+        var layer = new OpenLayers.Layer.Vector("foo", {
+            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
+            isBaseLayer: true
+        });
+        var control = new OpenLayers.Control.DrawFeature(
+            layer, OpenLayers.Handler.Point
+        );
+        map.addLayer(layer);
+        map.addControl(control);
+        map.zoomToMaxExtent();
+        control.activate();
+        
+        var log = {};
+        layer.events.on({
+            sketchstarted: function(event) {
+                log.event = event;
+            },
+            sketchmodified: function(event) {
+                log.event = event;
+            },
+            sketchcomplete: function(event) {
+                log.event = event;
+            }
+        });
+        
+        // mock up draw/modify of a point
+        map.events.triggerEvent("mousedown", {xy: new OpenLayers.Pixel(0, 0)});
+        t.eq(log.event.type, "sketchstarted", "[mousedown] sketchstarted triggered");
+        t.geom_eq(log.event.vertex, new OpenLayers.Geometry.Point(-200, 125), "[mousedown] correct vertex");
+        map.events.triggerEvent("mousemove", {xy: new OpenLayers.Pixel(10, 10)});
+        t.eq(log.event.type, "sketchmodified", "[mousemove] sketchmodified triggered");
+        t.geom_eq(log.event.vertex, new OpenLayers.Geometry.Point(-190, 115), "[mousemove] correct vertex");
+        map.events.triggerEvent("mouseup", {xy: new OpenLayers.Pixel(10, 10)});
+        t.eq(log.event.type, "sketchcomplete", "[mouseup] sketchcomplete triggered");
+        t.geom_eq(log.event.feature.geometry, new OpenLayers.Geometry.Point(-190, 115), "[mouseup] correct geometry");
+        
+        map.destroy();
+    }
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Control/GetFeature.html b/tests/Control/GetFeature.html
new file mode 100644
index 0000000..d0a3060
--- /dev/null
+++ b/tests/Control/GetFeature.html
@@ -0,0 +1,177 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    function test_Control_GetFeature_constructor(t) {
+        t.plan(3);
+        var protocol = "foo";
+        var control = new OpenLayers.Control.GetFeature({
+            protocol: protocol
+        });
+        t.ok(control instanceof OpenLayers.Control.GetFeature,
+             "new OpenLayers.Control.SelectFeature returns an instance");
+        t.eq(control.protocol, "foo",
+             "constructor sets protocol correctly");        
+
+        control = new OpenLayers.Control.GetFeature({
+            filterType: OpenLayers.Filter.Spatial.INTERSECTS
+        });
+        t.eq(control.filterType, OpenLayers.Filter.Spatial.INTERSECTS,
+             "constructor sets filterType correctly");        
+
+    }
+    
+    function test_Control_GetFeature_select(t) {
+        t.plan(10);
+        var cssAdded;
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.WMS("foo", "wms", {
+            layers: "foo"
+        });
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(1,2));
+        var feature1 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,2));
+        var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(2,3));
+        var feature3 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(3,1));
+        var control = new OpenLayers.Control.GetFeature({
+            protocol: new OpenLayers.Protocol({
+                read: function(obj) {
+                    cssAdded = OpenLayers.Element.hasClass(map.viewPortDiv,
+                                                           "olCursorWait");
+                    obj.callback.call(obj.scope, {
+                        features: [feature1, feature2, feature3],
+                        success: function() {return true;}
+                    });
+                }
+            }),
+            box: true
+        });
+        map.addControl(control);
+
+        var singleTest = function(evt) {
+            t.eq(evt.feature.id, feature1.id, "featureselected callback called with closest feature");
+        }
+        cssAdded = false;
+        control.events.register("featureselected", this, singleTest);
+        control.selectClick({xy: new OpenLayers.Pixel(200, 125)});
+        t.ok(cssAdded,
+             "select adds CSS class (click)");
+        t.ok(!OpenLayers.Element.hasClass(map.viewPortDiv, "olCursorWait"),
+             "callback removes CSS class (click)");
+        control.events.unregister("featureselected", this, singleTest);
+
+        var count = 0;
+        var beforeFeatureSelected = function(evt) {
+             count++;
+             return count < 3;
+        }
+        var features = [];
+        var boxTest = function(evt) {
+            features.push(evt.feature);
+        }
+        var beforeFeaturesSelected = function(evt) {
+            t.eq(evt.features.length, 3, "3 features passed to the beforefeaturesselected handler");
+        }
+        var featuresSelected = function(evt) {
+            t.eq(evt.features.length, 2, "2 features passed to the featuresselected handler");
+        }
+        control.events.register("beforefeatureselected", this, beforeFeatureSelected);
+        control.events.register("featureselected", this, boxTest);
+        control.events.register("beforefeaturesselected", this, beforeFeaturesSelected);
+        control.events.register("featuresselected", this, featuresSelected);
+        cssAdded = false;
+        control.selectBox(new OpenLayers.Bounds(0,0,4,4));
+        control.events.unregister("beforefeatureselected", this, beforeFeatureSelected);
+        control.events.unregister("featureselected", this, boxTest);
+        control.events.unregister("beforefeaturesselected", this, beforeFeaturesSelected);
+        control.events.unregister("featuresselected", this, featuresSelected);
+        t.eq(features.length, 2, "2 features inside box selected");
+        t.eq(features[1].id, feature2.id, "featureselected callback called with multiple features");
+        t.ok(cssAdded,
+             "select adds CSS class (box)");
+        t.ok(!OpenLayers.Element.hasClass(map.viewPortDiv, "olCursorWait"),
+             "callback removes CSS class (box)");
+
+        // allow several features even for single click 
+        control.single = false;
+        var multiplePointTest = function(evt) {
+            t.eq(evt.features.length, 3, "3 features passed to the featuresselected handler");
+        }
+        control.events.register("featuresselected", this, multiplePointTest);
+        control.selectClick({xy: new OpenLayers.Pixel(200, 125)});
+        control.events.unregister("featuresselected", this, multiplePointTest);
+    }
+    
+    function test_Control_GetFeature_hover(t) {
+        t.plan(9);
+        var cssAdded;
+        var abortedResponse = null;
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.WMS("foo", "wms", {
+            layers: "foo"
+        });
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(1,2));
+        var feature1 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,2));
+        var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(2,3));
+        var response = new OpenLayers.Protocol.Response();
+        var control = new OpenLayers.Control.GetFeature({
+            protocol: new OpenLayers.Protocol({
+                read: function(obj){
+                    cssAdded = OpenLayers.Element.hasClass(map.viewPortDiv,
+                                                           "olCursorWait");
+                    obj.callback.call(obj.scope, {
+                        features: [feature1, feature2],
+                        success: function() {return true;}
+                    });
+                    return response;
+                },
+                abort: function(response) {
+                    abortedResponse = response;
+                }
+            }),
+            hover: true
+        });
+        map.addControl(control);
+
+        var hoverFeature;
+        var hoverTest = function(evt) {
+            t.eq(evt.feature.id, hoverFeature.id, "hoverfeature callback called with closest feature");
+        }
+        var outTest = function(evt) {
+            t.eq(evt.feature.id, feature1.id, "outfeature callback called with previously hovered feature");
+        }
+        control.events.register("hoverfeature", this, hoverTest);
+        control.events.register("outfeature", this, outTest);
+        hoverFeature = feature1;
+        control.selectHover({xy: new OpenLayers.Pixel(200, 125)});
+        t.ok(control.hoverResponse == response,
+             "selectHover stores the protocol response in the hoverResponse property");
+
+        hoverFeature = feature2;
+        cssAdded = false;
+        control.selectHover({xy: new OpenLayers.Pixel(400, 0)});
+        t.ok(cssAdded,
+             "select adds CSS class (hover)");
+        t.ok(!OpenLayers.Element.hasClass(map.viewPortDiv, "olCursorWait"),
+             "callback removes CSS class (hover)");
+
+        OpenLayers.Element.addClass(map.viewPortDiv, "olCursorWait");
+        control.cancelHover();
+        t.ok(abortedResponse == response,
+             "cancelHover calls protocol.abort() with the expected response");
+        t.eq(control.hoverResponse, null,
+             "cancelHover sets this.hoverResponse to null");
+        t.ok(!OpenLayers.Element.hasClass(map.viewPortDiv, "olCursorWait"),
+             "cancelHover removes CSS class");
+
+        control.events.unregister("hoverfeature", this, hoverTest);
+        control.events.unregister("outfeature", this, outTest);
+    }
+    
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Control/Graticule.html b/tests/Control/Graticule.html
new file mode 100644
index 0000000..0001d2d
--- /dev/null
+++ b/tests/Control/Graticule.html
@@ -0,0 +1,66 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script src="http://proj4js.org/lib/proj4js-compressed.js"></script>
+    <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(2);
+        var options = {};
+        var map = new OpenLayers.Map("map",{projection:"EPSG:4326"});
+        var layer = new OpenLayers.Layer.WMS();
+        map.addLayers([layer]);
+
+        var control = new OpenLayers.Control.Graticule(options);
+        map.addControl(control);
+        map.zoomToMaxExtent();
+
+        t.ok(control.gratLayer instanceof OpenLayers.Layer.Vector,
+             "constructor sets layer correctly");
+        t.ok(control.gratLayer.features.length > 0,
+             "graticule has features");
+        control.destroy();
+    }
+    
+    function test_activate(t) {        
+        t.plan(7);
+        var map = new OpenLayers.Map("map",{projection:"EPSG:4326"});
+        var layer = new OpenLayers.Layer.WMS();
+        map.addLayers([layer]);
+
+        var control = new OpenLayers.Control.Graticule({});
+        map.addControl(control);
+        map.zoomToMaxExtent();
+        
+        t.ok(control.gratLayer.visibility, "Graticule layer is visible by default"); 
+        control.deactivate();
+        t.ok(control.gratLayer.map == null, 
+            "Graticule layer is not in map when control is deactivated"); 
+        control.destroy();
+        
+        var control2 = new OpenLayers.Control.Graticule({autoActivate:false});
+        map.addControl(control2);
+        t.ok(control2.gratLayer.map == null, 
+            "Graticule layer is not in map when autoActivate:false"); 
+        t.ok(control2.gratLayer.features.length == 0, 
+            "Graticule layer is empty when autoActivate:false");
+        control2.activate();
+        t.ok(control2.gratLayer.map != null, 
+            "Graticule layer is on map when control is activated");    
+        t.ok(control2.gratLayer.features.length > 0,
+            "Graticule features refreshed after control is activated");
+        control2.gratLayer.setVisibility(false);
+       
+        control2.destroy();
+        t.ok(control2.gratLayer == null, 
+            "Graticule layer is destroyed when control is destroyed");    
+            
+        map.destroy();        
+    }
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Control/KeyboardDefaults.html b/tests/Control/KeyboardDefaults.html
new file mode 100644
index 0000000..0f83f47
--- /dev/null
+++ b/tests/Control/KeyboardDefaults.html
@@ -0,0 +1,172 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+    function test_Control_KeyboardDefaults_constructor (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.KeyboardDefaults();
+        t.ok( control instanceof OpenLayers.Control.KeyboardDefaults, 
+                "new OpenLayers.Control.KeyboardDefaults returns object" );
+        t.eq( control.displayClass,  "olControlKeyboardDefaults", "displayClass is correct" );
+    }
+
+    function test_Control_KeyboardDefaults_addControl (t) {
+        t.plan( 4 );
+
+        map = new OpenLayers.Map('map');
+        control = new OpenLayers.Control.KeyboardDefaults();
+        t.ok( control instanceof OpenLayers.Control.KeyboardDefaults, 
+                "new OpenLayers.Control.KeyboardDefaults returns object" );
+        t.ok( map instanceof OpenLayers.Map, 
+                "new OpenLayers.Map creates map" );
+        map.addControl(control);
+        t.ok( control.map === map, "Control.map is set to the map object" );
+        t.ok( OpenLayers.Util.indexOf(map.controls, control), "map.controls contains control" );
+    }
+
+    /* When interpretting
+     * the keycodes below (including the comments associated with them),
+     * consult the URL below. For instance, the Safari browser returns
+     * "IE keycodes", and so is supported by any keycode labeled "IE".
+     * 
+     * Very informative URL:
+     *    http://unixpapa.com/js/key.html
+     */
+    function test_Control_KeyboardDefaults_KeyDownEvent (t) {
+        t.plan( 16 );
+
+        var evt = {which: 1};
+        map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+        control = new OpenLayers.Control.KeyboardDefaults();
+        map.addControl(control);
+        
+        var STARTING_ZOOM_LEVEL = 4;
+        var DELAY = 2;
+        
+        var centerLL = new OpenLayers.LonLat(0,0);
+        map.setCenter(centerLL, STARTING_ZOOM_LEVEL);
+
+        // Start new test.
+        evt.keyCode = OpenLayers.Event.KEY_LEFT;
+        control.defaultKeyPress(evt);
+        t.delay_call( 
+            DELAY, function() {
+                t.ok( map.getCenter().lon < centerLL.lon, "key left works correctly" );
+                
+                // Start new test.
+                evt.keyCode = OpenLayers.Event.KEY_RIGHT;
+                control.defaultKeyPress(evt);
+            },
+            DELAY, function() {
+                t.eq( map.getCenter().lon, centerLL.lon, "key right works correctly" );
+                
+                // Start new test. 
+                evt.keyCode = OpenLayers.Event.KEY_UP;
+                control.defaultKeyPress(evt);
+            },
+            DELAY, function() {
+                t.ok( map.getCenter().lat > centerLL.lat, "key up works correctly" ); 
+                
+                // Start new test.
+                evt.keyCode = OpenLayers.Event.KEY_DOWN;
+                control.defaultKeyPress(evt);
+            },
+            DELAY, function() {
+                t.ok( map.getCenter().lat == centerLL.lat, "key down works correctly" ); 
+                
+                // Start new test.
+                evt.keyCode = 33; //page up
+                control.defaultKeyPress(evt);
+            },
+            DELAY, function() {
+                t.ok( map.getCenter().lat > centerLL.lat, "key page up works correctly" ); 
+                
+                // Start new test.
+                evt.keyCode = 34; //page down
+                control.defaultKeyPress(evt);
+            },
+            DELAY, function() {
+                t.ok( map.getCenter().lat == centerLL.lat, "key page down works correctly" ); 
+                
+                // Start new test.
+                evt.keyCode = 35; //end
+                control.defaultKeyPress(evt);
+            },
+            DELAY, function() {
+                t.ok( map.getCenter().lon > centerLL.lon, "key end works correctly" ); 
+                
+                // Start new test.
+                evt.keyCode = 36; //home
+                control.defaultKeyPress(evt);
+            },
+            DELAY, function() {
+                t.ok( map.getCenter().lon == centerLL.lon, "key home works correctly"); 
+                
+                // Start new test.
+                evt.keyCode = 43; //+
+                control.defaultKeyPress(evt);
+                t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 1, "key code 43 works correctly: +/= key (ASCII), keypad + (ASCII, Opera)" );
+                
+                // Start new test. 
+                evt.keyCode = 61;
+                control.defaultKeyPress(evt);
+                t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 2, "key code 61 works correctly: +/= key (Mozilla, Opera, some ASCII)"); 
+                
+                // Start new test.
+                evt.keyCode = 187;
+                control.defaultKeyPress(evt);
+                t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 3, "key code 187 works correctly: +/= key (IE)"); 
+                
+                // Start new test.
+                evt.keyCode = 107; 
+                control.defaultKeyPress(evt);
+                t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 4, "key code 107 works correctly: keypad + (IE, Mozilla)"); 
+                
+                // Start new test.
+                // set zoomanimation flag manually,
+                // reason: loadend event in layers.js will not achieved in unittests
+                map.zoomanimationActive = false;
+                evt.keyCode = 45; 
+                control.defaultKeyPress(evt);
+                t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 3, "key code 45 works correctly: -/_ key (ASCII, Opera), keypad - (ASCII, Opera)");
+                
+                // Start new test. 
+                // set zoomanimation flag manually,
+                // reason: loadend event in layers.js will not achieved in unittests
+                map.zoomanimationActive = false;
+                evt.keyCode = 109; 
+                control.defaultKeyPress(evt);
+                t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 2, "key code 109 works correctly: -/_ key (Mozilla), keypad - (Mozilla, IE)"); 
+                
+                // Start new test.
+                // set zoomanimation flag manually,
+                // reason: loadend event in layers.js will not achieved in unittests
+                map.zoomanimationActive = false;
+                evt.keyCode = 189; 
+                control.defaultKeyPress(evt);
+                t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 1, "key code 189 works correctly: -/_ key (IE)"); 
+                
+                // Start new test.
+                // set zoomanimation flag manually,
+                // reason: loadend event in layers.js will not achieved in unittests
+                map.zoomanimationActive = false;
+                evt.keyCode = 95;
+                control.defaultKeyPress(evt);
+                t.eq( map.getZoom(), STARTING_ZOOM_LEVEL, "key code 95 works correctly: -/_ key (some ASCII)"); 
+            }
+        );
+    }
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/LayerSwitcher.html b/tests/Control/LayerSwitcher.html
new file mode 100644
index 0000000..e058d6b
--- /dev/null
+++ b/tests/Control/LayerSwitcher.html
@@ -0,0 +1,199 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+
+    function test_Control_LayerSwitcher_constructor (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.LayerSwitcher();
+        t.ok( control instanceof OpenLayers.Control.LayerSwitcher, "new OpenLayers.Control.LayerSwitcher returns object" );
+        t.eq( control.displayClass,  "olControlLayerSwitcher", "displayClass is correct" );
+    }
+
+    function test_Control_LayerSwitcher_draw (t) {
+        t.plan( 2 );
+
+        map = new OpenLayers.Map('map');
+        control = new OpenLayers.Control.LayerSwitcher();
+        map.addControl(control);
+
+        var div = control.draw();
+        t.ok( control.div != null, "draw makes a div" );
+        t.ok( div != null, "draw returns its div" );
+    }
+    function test_Control_LayerSwitcher_outsideViewport (t) {
+        t.plan( 2 );
+
+        map = new OpenLayers.Map('map');
+        control = new OpenLayers.Control.LayerSwitcher({'div':OpenLayers.Util.getElement('layerswitcher')});
+        map.addControl(control);
+        t.eq(control.div.style.width, "250px", "Div is not minimized when added."); 
+        control = new OpenLayers.Control.LayerSwitcher();
+        map.addControl(control);
+        t.eq(control.div.style.width, "0px", "Div is minimized when added.");
+    }
+ 
+    function test_Control_LayerSwitcher_loadContents(t) {
+
+        t.plan( 10 );
+
+        map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("WMS", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+
+        markers = new OpenLayers.Layer.Markers("markers");
+        map.addLayer(markers);
+
+        control = new OpenLayers.Control.LayerSwitcher();
+        map.addControl(control);
+
+        t.ok(control.layersDiv != null, "correctly makes layers div");
+        t.ok(OpenLayers.Element.hasClass(control.layersDiv, "layersDiv"),
+             "layers div has class layersDiv");
+        t.ok(control.baseLayersDiv != null, "correctly makes layers div");
+        t.ok(OpenLayers.Element.hasClass(control.baseLayersDiv, "baseLayersDiv"),
+             "base layers div has class baseLayersDiv");
+        t.ok(control.dataLayersDiv != null, "correctly makes layers div");
+        t.ok(OpenLayers.Element.hasClass(control.dataLayersDiv, "dataLayersDiv"),
+             "data layers div has class dataLayersDiv");
+        t.ok(control.maximizeDiv != null, "correctly makes resize div");
+        t.ok(OpenLayers.Element.hasClass(control.maximizeDiv, "maximizeDiv"),
+             "maximize div has class maximizeDiv");
+        t.ok(control.minimizeDiv != null, "correctly makes resize div");
+        t.ok(OpenLayers.Element.hasClass(control.minimizeDiv, "minimizeDiv"),
+             "minimize div has class minmizeDiv");
+    }
+
+
+    function test_Control_LayerSwitcher_redraw (t) {
+
+        t.plan( (OpenLayers.Util.getBrowserName() == "opera" ? 9 : 19 ) );
+
+        map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("WMS", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+
+        markers = new OpenLayers.Layer.Markers("markers");
+        map.addLayer(markers);
+
+        control = new OpenLayers.Control.LayerSwitcher();
+        map.addControl(control);
+
+        var wmsInput = OpenLayers.Util.getElement(control.id + "_input_" + layer.name);
+        t.ok(wmsInput != null, "correctly makes an input for wms layer");
+        t.eq(wmsInput.type, "radio", "wms correctly made a radio button");
+        t.eq(wmsInput.name, control.id + "_baseLayers", "wms correctly named");
+        t.eq(wmsInput.value, layer.name, "wms correctly valued");
+        
+        var markersInput = OpenLayers.Util.getElement(control.id + "_input_" + markers.name);
+        t.ok(markersInput != null, "correctly makes an input for markers layer");
+        t.eq(markersInput.type, "checkbox", "wms correctly made a radio button");
+        t.eq(markersInput.name, markers.name, "wms correctly named");
+        t.eq(markersInput.value, markers.name, "wms correctly valued");
+
+        t.eq(false, control.checkRedraw(), "check redraw is false");
+        if (OpenLayers.Util.getBrowserName() != "opera") { 
+            control = new OpenLayers.Control.LayerSwitcher();
+            var myredraw = control.redraw;
+            control.redraw = function() { 
+                t.ok(true, "redraw called when setting vis");
+            }
+            map.addControl(control); 
+            var func = OpenLayers.Function.bind(myredraw, control);
+            func();
+            markers.setVisibility(false); 
+            t.eq(control.checkRedraw(), true, "check redraw is true after changing layer and not letting redraw happen.");
+            map.removeControl(control);
+            
+            control = new OpenLayers.Control.LayerSwitcher();
+            var myredraw = control.redraw;
+            control.redraw = function() { 
+                t.ok(true, "redraw called when setting inRange");
+            }
+            map.addControl(control); 
+            var func = OpenLayers.Function.bind(myredraw, control);
+            func();
+            markers.inRange = false;
+            t.eq(control.checkRedraw(), true, "check redraw is true after changing layer.inRange and not letting redraw happen.");
+            map.removeControl(control);
+            
+            control = new OpenLayers.Control.LayerSwitcher();
+            var myredraw = control.redraw;
+            control.redraw = function() { 
+                t.ok(true, "redraw called when raising base layer ");
+            }
+            
+            map.addControl(control); 
+            var func = OpenLayers.Function.bind(myredraw, control);
+            func();
+            map.raiseLayer(layer, 1);
+            t.eq(control.checkRedraw(), true, "check redraw is true after changing layer.inRange and not letting redraw happen.");
+            map.removeControl(control);
+        } else {
+            t.debug_print("FIXME: Some LayerSwitcher tests fail in Opera.");
+        }    
+
+    }
+    function test_Control_LayerSwitcher_ascendingw (t) {
+
+        t.plan( 4 );
+
+        map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("WMS", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+
+        markers = new OpenLayers.Layer.Markers("markers");
+        map.addLayer(markers);
+
+        control = new OpenLayers.Control.LayerSwitcher();
+        map.addControl(control);
+        control2 = new OpenLayers.Control.LayerSwitcher({'ascending':false});
+        map.addControl(control2);
+        t.ok(control.div.childNodes[1].childNodes[0].innerHTML.match("Base Layer"), "Base Layers first in LayerSwitcher with ascending true");
+        t.ok(control.div.childNodes[1].childNodes[2].innerHTML.match("Overlays"), "Overlays in LayerSwitcher with ascending true");
+        t.ok(control2.div.childNodes[1].childNodes[2].innerHTML.match("Base Layer"), "Base Layers last in LayerSwitcher with ascending false");
+        t.ok(control2.div.childNodes[1].childNodes[0].innerHTML.match("Overlays"), "Base Layers last in LayerSwitcher with ascending false");
+    }
+    
+    function test_Control_LayerSwitcher_displayInLayerSwitcher (t) {
+
+        t.plan( 2 );
+
+        map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("WMS", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"}, {'displayInLayerSwitcher': false});
+        map.addLayer(layer);
+
+        control = new OpenLayers.Control.LayerSwitcher();
+        map.addControl(control);
+        t.eq(control.div.childNodes[1].childNodes[0].style.display, "none" , "Base layer display off when no visble base layer");
+        
+        map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("WMS", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+
+        control = new OpenLayers.Control.LayerSwitcher();
+        map.addControl(control);
+        t.eq(control.div.childNodes[1].childNodes[0].style.display, "" , "Base layer display on when visble base layer");
+    }
+
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+    <div id="layerswitcher" style="width:250px; height:256px;" />
+</body>
+</html>
diff --git a/tests/Control/Measure.html b/tests/Control/Measure.html
new file mode 100644
index 0000000..29fefe5
--- /dev/null
+++ b/tests/Control/Measure.html
@@ -0,0 +1,122 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialze(t) {
+        
+        t.plan(1);
+        
+        var map = new OpenLayers.Map("map");
+        var control = new OpenLayers.Control.Measure(
+            OpenLayers.Handler.Path, {persist: true}
+        );
+        map.addControl(control);
+        
+        t.eq(control.persist, true, "passing persist to constructor sets persist on handler");
+        
+        map.destroy();
+        
+    }
+    
+    // test for <http://trac.openlayers.org/ticket/2691>
+    function test_cancel(t) {
+        
+        t.plan(4);
+        
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer(null, {
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        var control = new OpenLayers.Control.Measure(
+            OpenLayers.Handler.Path, {persist: true}
+        );
+        map.addControl(control);
+        
+        control.activate();
+        
+        try {
+            control.cancel();
+            t.ok(true, "calling cancel before drawing works");
+        } catch(err) {
+            t.fail("calling cancel before drawing causes trouble: " + err);
+        }
+        t.eq(control.active, true, "control remains active after cancel");
+        
+        // create a simple measurement
+        function trigger(type, x, y) {
+            map.events.triggerEvent(type, {
+                xy: new OpenLayers.Pixel(x, y)
+            })
+        };
+        trigger("mousedown", 0, 0);
+        trigger("mouseup", 0, 0);
+        trigger("mousemove", 10, 10);
+        trigger("mousedown", 10, 10);
+        trigger("mouseup", 10, 10);
+        
+        // confirm that the sketch persists
+        t.eq(control.handler.layer.features.length, 1, "feature persists");
+        // cancel and see that sketch is gone
+        control.cancel();
+        t.eq(control.handler.layer.features.length, 0, "feature is gone after cancel");
+        
+        map.destroy();
+        
+    }
+
+    function test_partial(t) {
+        t.plan(1);
+
+        // set up
+
+        var map, layer, control, geometry, log;
+
+        map = new OpenLayers.Map("map", {units: "m"});
+
+        layer = new OpenLayers.Layer(null, {isBaseLayer: true});
+        map.addLayer(layer);
+
+        map.zoomToMaxExtent();
+
+        control = new OpenLayers.Control.Measure(OpenLayers.Handler.Path, {
+            partialDelay: null
+        });
+
+        map.addControl(control);
+        control.activate();
+
+        control.events.on({
+            "measurepartial": function(e) {
+                log.measure = e.measure;
+            }
+        });
+
+        // test
+
+        geometry = new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(1, 1),
+            new OpenLayers.Geometry.Point(2, 1)
+        ]);
+
+        log = {};
+        control.measurePartial(null, geometry);
+        geometry.components[1].x = 3;
+        t.delay_call(0.2, function() {
+
+            t.eq(log.measure, 1, "partial measure is correct");
+
+            // tear down
+            map.destroy
+        });
+    };
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 512px; height: 256px;"></div>
+</body>
+</html>
diff --git a/tests/Control/ModifyFeature.html b/tests/Control/ModifyFeature.html
new file mode 100644
index 0000000..75de509
--- /dev/null
+++ b/tests/Control/ModifyFeature.html
@@ -0,0 +1,708 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_initialize(t) {
+        t.plan(3);
+        var layer = {
+            styleMap: {createSymbolizer: function(){}},
+            events: {
+                on: function() {},
+                un: function() {}
+            }
+        };
+        var options = {
+            geometryTypes: "bar"
+        };
+        var control = new OpenLayers.Control.ModifyFeature(layer, options);
+        
+        t.ok(control.layer == layer,
+             "constructor sets layer correctly");
+        t.eq(control.selectControl.geometryTypes, "bar",
+             "constructor sets options correctly on feature handler");
+        t.eq(control.mode, OpenLayers.Control.ModifyFeature.RESHAPE,
+             "constructor initializes modification mode correctly");
+        control.destroy();
+    }
+
+    function test_destroy(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        control.selectControl.destroy = function() {
+            t.ok(true,
+                 "control.destroy calls destroy on select control");
+        }
+        control.dragControl.destroy = function() {
+            t.ok(true,
+                 "control.destroy calls destroy on feature handler");
+        }
+        control.destroy();
+        map.destroy();
+    }
+    
+    function test_activate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        map.addControl(control);
+        t.ok(!control.selectControl.active,
+             "select control is not active prior to activating control");
+        control.activate();
+        t.ok(control.selectControl.active,
+             "select control is active after activating control");
+
+        map.destroy();
+    }
+
+    function test_initDeleteCodes(t) {
+        t.plan(3);
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.ModifyFeature(layer, {'deleteCodes': 46});
+        t.eq(control.deleteCodes[0], 46, "Delete code properly turned into an array.");
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        t.eq(control.deleteCodes[0], 46, "Default deleteCodes include delete"); 
+        t.eq(control.deleteCodes[1], 68, "Default deleteCodes include 'd'"); 
+        
+        control.destroy();
+        layer.destroy();
+    }
+    
+    function test_handleKeypress(t) {
+        t.plan(11);
+
+        /**
+         * There are two things that we want to test here
+         * 1) test that control.deleteCodes are respected
+         * 3) test that a vertex is properly deleted
+         *
+         * In the future, feature deletion may be added to the control.
+         */
+        
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        var delKey = 46;
+        var dKey = 100;
+        control.deleteCodes = [delKey, dKey];
+        
+        // test that a polygon vertex is deleted for all delete codes
+        var point = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point()
+        );
+        var poly = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Polygon()
+        );
+        
+        // mock up vertex deletion
+        control.dragControl.feature = point;
+        control.feature = poly;
+        control.vertices = [point];
+        point.geometry.parent = {
+            removeComponent: function(geometry) {
+                t.eq(geometry.id, point.geometry.id,
+                     "vertex deletion: removeComponent called on parent with proper geometry");
+            }
+        };
+        layer.events.on({"featuremodified": function(event) {
+            t.eq(event.feature.id, poly.id, "vertex deletion: featuremodifed triggered");
+        }});
+        layer.drawFeature = function(feature) {
+            t.eq(feature.id, poly.id,
+                 "vertex deletion: drawFeature called with the proper feature");
+        };
+        control.resetVertices = function() {
+            t.ok(true, "vertex deletion: resetVertices called");
+        };
+        control.onModification = function(feature) {
+            t.eq(feature.id, poly.id,
+                 "vertex deletion: onModification called with the proper feature");
+        };
+        // run the above four tests twice
+        control.handleKeypress({keyCode:delKey});
+        control.handleKeypress({keyCode:dKey});
+        t.eq(control.feature.state, OpenLayers.State.UPDATE, "feature state set to update");
+
+        // now make sure nothing happens if the vertex is mid-drag
+        control.dragControl.handlers.drag.dragging = true;
+        control.handleKeypress({keyCode:delKey});
+
+        //  clean up
+        control.destroy();
+        layer.destroy();
+    }    
+        
+
+    function test_onUnSelect(t) {
+        t.plan(6);
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        var fakeFeature = {'id':'myid'};
+        control.vertices = 'a';
+        control.virtualVertices = 'b';
+        control.features = true;
+        layer.events.on({"afterfeaturemodified": function(event) {
+            t.eq(event.feature, fakeFeature, "afterfeaturemodified triggered");
+        }});
+        control.dragControl.deactivate = function() { t.ok(true, "Deactivate called on drag control"); }
+        control.onModificationEnd = function (feature) { t.eq(feature.id, fakeFeature.id, "onModificationEnd got feature.") }
+        layer.removeFeatures = function(verts) {
+            t.ok(verts == 'a', "Normal verts removed correctly");
+        }
+        layer.destroyFeatures = function(verts) {
+            t.ok(verts == 'b', "Virtual verts destroyed correctly");
+        }
+        control.unselectFeature(fakeFeature);
+        t.eq(control.feature, null, "feature is set to null");
+        
+        layer.destroyFeatures = function() {};        
+        control.destroy();
+        layer.destroy();
+    }
+    
+    function test_stop_modification(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.Vector("Vectors!", {isBaseLayer: true});
+        var feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(0, 0)
+        );
+        layer.addFeatures([feature]);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0, 0));
+
+
+        // If a feature is to be modified, control.selectFeature gets called.
+        // We want this test to fail if selectFeature gets called.
+        var modified = false;
+        var _ = OpenLayers.Control.ModifyFeature.prototype.selectFeature;
+        OpenLayers.Control.ModifyFeature.prototype.selectFeature = function() {
+            modified = true;
+        }
+
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        map.addControl(control);
+        control.activate();
+
+        // register a listener that will stop feature modification
+        layer.events.on({"beforefeaturemodified": function() {return false}});
+
+        // we can initiate feature modification by selecting a feature with
+        // the control's select feature control
+        control.selectControl.select(feature);
+        
+        if(modified) {
+            t.fail("selectFeature called, prepping feature for modification");
+        } else {
+            t.ok(true, "the beforefeaturemodified listener stopped feature modification");
+        }
+        
+        OpenLayers.Control.ModifyFeature.prototype.selectFeature = _;
+    }
+
+    function test_selectFeature(t) {
+        t.plan(12);
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.Vector("Vectors!", {isBaseLayer: true});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0, 0));
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        control.vertices = [];
+        control.virtualVertices = [];
+        var callback = function(obj) {
+            t.ok(obj.feature == fakeFeature, "beforefeaturemodified triggered");
+        };
+        layer.events.on({"beforefeaturemodified": callback});
+        control.dragControl.activate = function() { t.ok(true, "drag Control activated"); }
+        control.onModificationStart = function(feature)  { t.eq(feature.id, fakeFeature.id, "On Modification Start called with correct feature."); } 
+        
+        // Start of testing
+        
+        control.collectVertices = function() { t.fail("Collect vertices called when geom is a point"); }
+        var fakeFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0, 0));
+        
+        // Points don't call collectVertices
+        control.selectFeature(fakeFeature);
+        
+        control.collectVertices = function() { 
+          t.ok(true, "collectVertices called"); 
+          this.vertices = 'a';
+          this.virtualVertices = 'd';
+          layer.addFeatures(this.vertices);
+          layer.addFeatures(this.virtualVertices);
+        }
+        
+        layer.addFeatures = function(features) { 
+            t.ok(features == 'a' || features == 'd', "features passed correctly"); 
+        }
+        
+        fakeFeature.geometry = new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(0, 0),
+                new OpenLayers.Geometry.Point(1, 1)
+            ])
+        ]);
+        
+        // OnSelect calls collectVertices and passes features to layer 
+        control.selectFeature(fakeFeature);
+        
+        control.vertices = ['a'];
+        control.virtualVertices = ['b'];
+        
+        layer.addFeatures = function(features) {} 
+        
+        layer.removeFeatures = function(features) { 
+            t.eq(features.length, 1, "Correct feature length passed in");
+        }    
+
+        // Features are removed whenever they exist
+        control.selectFeature(fakeFeature);
+        
+        control.destroy();
+
+        // layer.destroy() will call removeFeatures with an empty array, make
+        // removeFeatures reference an empty function to prevent the above
+        // test to fail
+        layer.removeFeatures = function(features) {};
+        layer.destroy();
+    }  
+
+    function test_resetVertices(t) {
+        t.plan(21);
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        var point = new OpenLayers.Geometry.Point(5,6);
+        var point2 = new OpenLayers.Geometry.Point(7,8);
+        var point3 = new OpenLayers.Geometry.Point(9,10);
+        
+        control.feature = new OpenLayers.Feature.Vector(point);
+        control.resetVertices();
+        t.eq(control.vertices.length, 0, "Correct vertices length");
+        t.eq(control.virtualVertices.length, 0, "Correct virtual vertices length.");
+
+        var multiPoint = new OpenLayers.Geometry.MultiPoint([point, point2]);
+        control.feature = new OpenLayers.Feature.Vector(multiPoint);
+        control.resetVertices();
+        t.eq(control.vertices.length, 2, "Correct vertices length with multipoint");
+        t.eq(control.virtualVertices.length, 0, "Correct virtual vertices length (multipoint).");
+
+        var line = new OpenLayers.Geometry.LineString([point, point2]);
+        control.feature = new OpenLayers.Feature.Vector(line);
+        control.resetVertices();
+        t.eq(control.vertices.length, 2, "Correct vertices length with line");
+        t.eq(control.virtualVertices.length, 1, "Correct virtual vertices length (linestring).");
+        
+        var polygon = new OpenLayers.Geometry.Polygon([new OpenLayers.Geometry.LinearRing([point, point2, point3])]);
+        control.feature = new OpenLayers.Feature.Vector(polygon);
+        control.resetVertices();
+        t.eq(control.vertices.length, 3, "Correct vertices length with polygon");
+        t.eq(control.virtualVertices.length, 3, "Correct virtual vertices length (polygon).");
+
+        control.mode = OpenLayers.Control.ModifyFeature.DRAG;
+        control.resetVertices();
+        t.ok(control.dragHandle != null, "Drag handle is set");
+        t.eq(control.vertices.length, 0, "Correct vertices length with polygon (DRAG)");
+
+        control.mode = OpenLayers.Control.ModifyFeature.ROTATE;
+        control.resetVertices();
+        t.ok(control.radiusHandle != null, "Radius handle is set");
+        t.eq(control.vertices.length, 0, "Correct vertices length with polygon (ROTATE)");
+
+        control.mode = OpenLayers.Control.ModifyFeature.RESIZE;
+        control.resetVertices();
+        t.ok(control.radiusHandle != null, "Radius handle is set");
+        t.eq(control.vertices.length, 0, "Correct vertices length with polygon (RESIZE)");
+
+        control.mode = OpenLayers.Control.ModifyFeature.RESHAPE;
+        control.resetVertices();
+        t.ok(control.radiusHandle == null, "Radius handle is not set (RESHAPE)");
+        t.eq(control.vertices.length, 3, "Correct vertices length with polygon (RESHAPE)");
+        t.eq(control.virtualVertices.length, 3, "Correct virtual vertices length (RESHAPE)");
+        
+        control.mode = OpenLayers.Control.ModifyFeature.RESIZE | OpenLayers.Control.ModifyFeature.RESHAPE;
+        control.resetVertices();
+        t.ok(control.radiusHandle != null, "Radius handle is set (RESIZE|RESHAPE)");
+        t.eq(control.vertices.length, 0, "No vertices when both resizing and reshaping (RESIZE|RESHAPE)");
+        t.eq(control.virtualVertices.length, 0, "No virtual vertices when both resizing and reshaping (RESIZE|RESHAPE)");
+        
+        control.dragControl.feature = new OpenLayers.Feature.Vector(polygon);
+        control.dragControl.map = {};
+        control.dragControl.map.div = {};
+        control.dragControl.map.div.style = {};
+        control.dragControl.map.viewPortDiv = "foo";
+        control.dragControl.handlers.drag.deactivate = function() {
+            this.active = false;
+        }
+        control.resetVertices();
+        t.ok(!control.dragControl.handlers.drag.active, "resetVertices deactivates drag handler");
+        control.dragControl.map = null;
+        
+        control.destroy();
+        layer.destroy();
+    }
+    
+    function test_dragVertex(t) {
+        t.plan(8);
+        var map = new OpenLayers.Map("map", {
+            resolutions: [1]
+        });
+        var layer = new OpenLayers.Layer.Vector("foo", {
+            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+        
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        map.addControl(control);
+        control.activate();
+        
+        map.zoomToMaxExtent();
+        
+        var log = {};
+        layer.events.on({
+            "vertexmodified": function(event) {
+                log.event = event;
+            }
+        });
+        
+        // pretend to drag a point
+        var feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(0, 0)
+        );
+        control.feature = feature;
+        var pixel = new OpenLayers.Pixel(-100, 100);
+        control.dragVertex(feature, pixel);
+        t.eq(log.event.type, "vertexmodified", "[drag point] vertexmodified triggered");
+        t.geom_eq(log.event.vertex, feature.geometry, "[drag point] listeners receive correct vertex");
+        t.eq(log.event.feature.id, feature.id, "[drag point] listeners receive correct feature");
+        t.ok(log.event.pixel === pixel, "[drag point] listeners receive correct pixel");
+        
+        // pretend to drag vertex of a linestring
+        var vert = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(0, 0)
+        );
+        var feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.LineString([
+                vert.geometry, new OpenLayers.Geometry.Point(10, 0)
+            ])
+        );
+        control.feature = feature;
+        var pixel = new OpenLayers.Pixel(-100, 100);
+        control.dragVertex(vert, pixel);
+        t.eq(log.event.type, "vertexmodified", "[drag vertex] vertexmodified triggered");
+        t.geom_eq(log.event.vertex, vert.geometry, "[drag vertex] listeners receive correct vertex");
+        t.eq(log.event.feature.id, feature.id, "[drag vertex] listeners receive correct feature");
+        t.ok(log.event.pixel === pixel, "[drag vertex] listeners receive correct pixel");
+
+
+        map.destroy();
+    }
+        
+    function test_onDrag(t) {
+        t.plan(1);
+        t.ok(true, "onDrag not tested yet.");
+    }
+    
+    function test_dragComplete(t) {
+        t.plan(8);
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+       
+        var fakeFeature = {
+         'geometry': { 'id':'myGeom'},
+         'id': 'fakeFeature'
+        };
+        layer.addFeatures = function (verts) {
+            t.ok(verts == 'virtual' || verts == 'normal', verts + " verts correct");
+        }
+        layer.removeFeatures = function (verts) {
+            t.ok(verts == 'previous virtual' || verts == 'previous normal', verts + " verts correct");
+        }
+        layer.events.on({"featuremodified": function(event) {
+            t.eq(event.feature, fakeFeature, "featuremodified triggered");
+        }});
+        control.onModification = function(feat) {
+            t.eq(feat.id, fakeFeature.id, "onModification gets correct feat");
+        }
+        control.collectVertices = function() {
+            t.ok(true, "collectVertices called");
+            this.vertices = 'normal';
+            this.virtualVertices = 'virtual';
+            layer.addFeatures(this.vertices);
+            layer.addFeatures(this.virtualVertices);
+        }
+        control.feature = fakeFeature;
+        control.vertices = 'previous normal';
+        control.virtualVertices = 'previous virtual';
+        control.dragComplete();
+        t.eq(fakeFeature.state, OpenLayers.State.UPDATE, "feature state set to UPDATE");
+        
+        control.destroy();
+
+        // layer.destroy() will call removeFeatures with an empty array, make
+        // removeFeatures reference an empty function to prevent the above
+        // test to fail
+        layer.removeFeatures = function(verts) {};
+        layer.destroy();
+    }
+    
+    function test_deactivate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        map.addControl(control);
+        
+        control.selectControl.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on select control");
+        }
+        control.dragControl.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on drag control");
+        }
+        control.active = true;
+        control.deactivate();
+        
+        map.destroy();
+    }
+
+    function test_onModificationStart(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        map.addControl(control);
+        control.activate();
+        
+        // make sure onModificationStart is called on feature selection
+        var testFeature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(Math.random(), Math.random())
+        );
+        control.onModificationStart = function(feature) {
+            t.eq(feature.id, testFeature.id,
+                 "onModificationStart called with the right feature");
+        };
+        control.selectFeature(testFeature);
+        
+        map.destroy();
+    }
+    
+    function test_onModification(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        map.addControl(control);
+        control.activate();
+        
+        // make sure onModification is called on drag complete
+        var point = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(Math.random(), Math.random())
+        );
+        control.feature = point;
+        control.onModification = function(feature) {
+            t.eq(feature.id, point.id,
+                "onModification called with the right feature on drag complete");
+        };
+        control.dragComplete();
+        
+        // make sure onModification is called on vertex deletion
+        var poly = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Polygon()
+        );
+        var oldDraw = layer.drawFeature;
+        layer.drawFeature = function() {
+            return;
+        };
+        control.feature = poly;
+        control.vertices = [point];
+        layer.events.on({"featuremodified": function(event) {
+            t.eq(event.feature.id, poly.id, "featuremodified triggered");
+        }});
+        control.onModification = function(feature) {
+            t.eq(feature.id, poly.id,
+                "onModification called with the right feature on vertex delete");
+        };
+        point.geometry.parent = poly.geometry;
+        control.dragControl.feature = point;
+        control.handleKeypress({keyCode:46});
+        layer.drawFeature = oldDraw;
+        
+        map.destroy();
+    }
+
+    function test_onModificationEnd(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        map.addControl(control);
+        control.activate();
+        
+        // make sure onModificationEnd is called on unselect feature
+        var testFeature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(Math.random(), Math.random())
+        );
+        layer.events.on({"afterfeaturemodified": function(event) {
+            t.eq(event.feature.id, testFeature.id, "afterfeaturemodified triggered");
+            t.eq(event.modified, false, "afterfeaturemodified event given proper modified property (false - feature was not modified in this case)");
+        }});
+        control.onModificationEnd = function(feature) {
+            t.eq(feature.id, testFeature.id,
+                 "onModificationEnd called with the right feature");
+        };
+        control.unselectFeature(testFeature);
+        
+        map.destroy();
+    }
+    
+    function test_events(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.ModifyFeature(layer);
+        map.addControl(control);
+        control.activate();
+        
+        // make sure onModificationStart is called on feature selection
+        var testFeature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(Math.random(), Math.random())
+        );
+        
+        // test that beforefeatureselected is triggered
+        function handle_beforefeatureselected(event) {
+            t.ok(event.feature == testFeature, "beforefeatureselected called with the correct feature");
+        }
+        layer.events.on({
+            "beforefeatureselected": handle_beforefeatureselected
+        });
+        layer.events.triggerEvent("beforefeatureselected", {
+            feature: testFeature
+        });
+        layer.events.un({
+            "beforefeatureselected": handle_beforefeatureselected
+        });
+        
+        // test that beforefeatureselected is triggered
+        function handle_featureselected(event) {
+            t.ok(event.feature == testFeature, "featureselected called with the correct feature");
+        }
+        layer.events.on({
+            "featureselected": handle_featureselected
+        });
+        layer.events.triggerEvent("featureselected", {
+            feature: testFeature
+        });
+        layer.events.un({
+            "featureselected": handle_featureselected
+        });
+
+        map.destroy();
+    }
+    
+    function test_standalone(t) {
+        
+        t.plan(17);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        
+        var f1 = new OpenLayers.Feature.Vector(
+            OpenLayers.Geometry.fromWKT("LINESTRING(3 4,10 50,20 25)")
+        );
+        var f2 = new OpenLayers.Feature.Vector(
+            OpenLayers.Geometry.fromWKT("POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2))")
+        );
+        var f3 = new OpenLayers.Feature.Vector(
+            OpenLayers.Geometry.fromWKT("POINT(10 15)")
+        );
+        var f4 = new OpenLayers.Feature.Vector(
+            OpenLayers.Geometry.fromWKT("POINT(15 10)")
+        );
+        layer.addFeatures([f1, f2, f3, f4]);
+        
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.ModifyFeature(layer, {standalone: true});
+        map.addControl(control);
+        
+        var log = [];
+        layer.events.on({
+            beforefeaturemodified: function(evt) {
+                log.push(evt);
+            },
+            featuremodified: function(evt) {
+                log.push(evt);
+            },
+            afterfeaturemodified: function(evt) {
+                log.push(evt);
+            }
+        });
+        
+        // activate control
+        control.activate();
+        t.eq(control.active, true, "[activate] control activated");
+        t.eq(control.selectControl, null, "[activate] no select control");
+        
+        // manually select feature for editing
+        control.selectFeature(f1);
+        t.ok(control.feature === f1, "[select f1] control.feature set to f1");
+        
+        // manually unselect feature for editing
+        control.unselectFeature(f1);
+        t.eq(control.feature, null, "[unselect f1] control.feature set to null");
+        t.eq(log.length, 1, "[unselect f1] event logged");
+        t.eq(log[0].type, "afterfeaturemodified", "[unselect f1] afterfeaturemodified triggered");
+        t.ok(log[0].feature === f1, "[unselect f1] correct feature");
+        t.eq(log[0].modified, false, "[unselect f1] feature not actually modified");
+        
+        // clear log and select new feature for editing
+        log = [];
+        control.selectFeature(f2);
+        t.ok(control.feature === f2, "[select f2] control.feature set to f2");
+                
+        // deactivate control and confirm feature is unselected
+        control.deactivate();
+        t.eq(log.length, 1, "[deactivate] event logged");
+        t.eq(log[0].type, "afterfeaturemodified", "[deactivate] afterfeaturemodified triggered");
+        t.ok(log[0].feature === f2, "[deactivate] correct feature");
+        t.eq(log[0].modified, false, "[deactivate] feature not actually modified");
+        
+        // reactivate control and select a point feature to see if we can drag
+        // another point feature;
+        control.activate();
+        control.selectFeature(f3);
+        control.dragControl.handlers.feature.triggerCallback("mousemove", "in", [f4]);
+        t.eq(control.dragControl.handlers.drag.active, false, "cannot drag unselected feature f4");
+        control.dragControl.handlers.feature.triggerCallback("mousemove", "in", [f3]);
+        t.eq(control.dragControl.handlers.drag.active, true, "can drag selected feature f3");
+        
+        // select the polygon feature to make sure that we can drag vertices and
+        // virtual vertices
+        control.selectFeature(f2);
+        control.dragControl.handlers.feature.triggerCallback("mousemove", "in", [control.vertices[0]]);
+        t.eq(control.dragControl.handlers.drag.active, true, "can drag vertex of feature f2");
+        control.dragControl.handlers.feature.triggerCallback("mousemove", "in", [control.virtualVertices[0]]);
+        t.eq(control.dragControl.handlers.drag.active, true, "can drag virtual vertex of feature f2");
+        control.deactivate();
+        
+        map.destroy();
+        
+    }
+
+
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Control/MousePosition.html b/tests/Control/MousePosition.html
new file mode 100644
index 0000000..2858167
--- /dev/null
+++ b/tests/Control/MousePosition.html
@@ -0,0 +1,109 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map, control; 
+    function test_initialize (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.MousePosition();
+        t.ok( control instanceof OpenLayers.Control.MousePosition, "new OpenLayers.Control returns object" );
+        t.eq( control.displayClass,  "olControlMousePosition", "displayClass is correct" );
+    }
+    function test_destroy(t) {
+        t.plan(1);
+    
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control.MousePosition();
+        map.addControl(control);
+
+        var listeners = map.events.listeners.mousemove.length;
+        control.destroy();
+        
+        t.eq(map.events.listeners.mousemove.length, listeners - 1, "mousemove event is unregistered");
+        map.destroy();     
+    }
+    function test_addControl(t) {
+        t.plan(4);
+
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control.MousePosition();
+        map.addControl(control);
+
+        t.ok(control.map === map, "Control.map is set to the map object");
+        t.ok(map.controls[map.controls.length - 1] === control, "map.controls contains control");
+        t.eq(parseInt(control.div.style.zIndex), map.Z_INDEX_BASE['Control'] + 5, "Control div zIndexed properly" );
+        t.eq(parseInt(map.viewPortDiv.lastChild.style.zIndex), map.Z_INDEX_BASE['Control'] + 5, "Viewport div contains control div");
+        map.destroy();     
+    }
+    function test_redraw_noLayer_displayProjection(t) {
+        t.plan(4);
+        var control = new OpenLayers.Control.MousePosition({'emptyString':''});
+        var map = new OpenLayers.Map('map');
+        map.addControl(control);
+        var control2 = new OpenLayers.Control.MousePosition();
+        map.addControl(control2);
+        t.eq(control2.emptyString, null, "Emptystring is null");
+        t.eq(control.div.innerHTML, "", "innerHTML set correctly");
+        control.redraw({'xy': new OpenLayers.Pixel(10,10)});
+        control.redraw({'xy': new OpenLayers.Pixel(12,12)});
+        t.eq(control.div.innerHTML, "", "innerHTML set correctly");
+        var l = new OpenLayers.Layer('name', {'isBaseLayer': true});
+        map.addLayer(l);
+        map.zoomToMaxExtent();
+        control.redraw({'xy': new OpenLayers.Pixel(10,10)});
+        control.redraw({'xy': new OpenLayers.Pixel(12,12)});
+        t.eq(control.div.innerHTML, "-175.78125, 85.78125", "innerHTML set correctly when triggered.");
+        map.destroy();     
+    }
+    function test_formatOutput(t) {
+        t.plan(1);
+        var control = new OpenLayers.Control.MousePosition({
+            prefix: 'prefix',
+            suffix: 'suffix',
+            separator: 'separator',
+            numDigits: 3
+        });
+        var lonlat = new OpenLayers.LonLat(0.75699, 0.37365);
+        var val = control.formatOutput(lonlat);
+        t.eq(val, 'prefix0.757separator0.374suffix', 'formatOutput correctly formats the mouse position output');
+    }
+    function test_deactivate(t) {
+        t.plan(4);         
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer(null, {isBaseLayer: true});
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        // Auxiliary function
+        function trigger(type, x, y) {
+            map.events.triggerEvent(type, {
+                xy: new OpenLayers.Pixel(x, y)
+            })
+        };        
+
+        var control = new OpenLayers.Control.MousePosition();
+        map.addControl(control);
+        trigger("mousemove", 0, 0);
+
+        trigger("mousemove", 0, 1);
+        t.ok(control.div.innerHTML != "", 
+            "Shows the position after add control (with autoActivate) and move");
+        control.deactivate();
+        t.ok(control.div.innerHTML == "", 
+            "Position is not displayed after deactivate and move");        
+        trigger("mousemove", 0, 2);
+        t.ok(control.div.innerHTML == "", 
+            "Position is not displayed after move when deactivate");
+        control.activate();
+        trigger("mousemove", 0, 3);
+        t.ok(control.div.innerHTML != "", 
+            "Shows the position after activate and move");
+        
+        map.destroy();     
+    }
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/MouseToolbar.html b/tests/Control/MouseToolbar.html
new file mode 100644
index 0000000..e4799ed
--- /dev/null
+++ b/tests/Control/MouseToolbar.html
@@ -0,0 +1,59 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+    function test_Control_MouseToolbar_constructor (t) {
+        t.plan( 1 );
+    
+        control = new OpenLayers.Control.MouseToolbar();
+        t.ok( control instanceof OpenLayers.Control.MouseToolbar, "new OpenLayers.Control.MouseToolbar returns object" );
+    }
+    function test_Control_MouseToolbar_addControl (t) {
+        t.plan( 8 );
+        map = new OpenLayers.Map('map');
+        control = new OpenLayers.Control.MouseToolbar();
+        t.ok( control instanceof OpenLayers.Control.MouseToolbar, "new OpenLayers.Control.MouseToolbar returns object" );
+        t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map creates map" );
+        map.addControl(control);
+        t.ok( control.map === map, "Control.map is set to the map object" );
+        t.ok( map.controls[4] === control, "map.controls contains control" );
+        t.eq( parseInt(control.div.style.zIndex), map.Z_INDEX_BASE['Control'] + 5, "Control div zIndexed properly" );
+        t.eq( parseInt(map.viewPortDiv.lastChild.style.zIndex), map.Z_INDEX_BASE['Control'] + 5, "Viewport div contains control div" );
+        t.eq( control.div.style.left, "6px", "Control div left located correctly by default");
+        t.eq( control.div.style.top, "300px", "Control div top located correctly by default");
+
+    }
+    function test_Control_MouseToolbar_control_events (t) {
+        t.plan( 1 );
+        if ((navigator.userAgent.indexOf("compatible") == -1)) { 
+            var evt = {which: 1}; // control expects left-click
+            map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.WMS("Test Layer", 
+                "http://octo.metacarta.com/cgi-bin/mapserv?",
+                {map: "/mapdata/vmap_wms.map", layers: "basic"});
+            map.addLayer(layer);
+
+            control = new OpenLayers.Control.MouseToolbar();
+            map.addControl(control);
+
+            var centerLL = new OpenLayers.LonLat(0,0); 
+            map.setCenter(centerLL, 5);
+
+            evt.shiftKey = true;
+            evt.xy = new OpenLayers.Size(5,5);
+            control.defaultMouseDown(evt);
+            evt.xy = new OpenLayers.Size(15,15);
+            control.defaultMouseUp(evt);
+            t.eq(map.getZoom(), 6, "Map zoom set correctly after zoombox");
+        } else {
+            t.ok(true, "IE does not run this test.") 
+        }
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/NavToolbar.html b/tests/Control/NavToolbar.html
new file mode 100644
index 0000000..9bf41c9
--- /dev/null
+++ b/tests/Control/NavToolbar.html
@@ -0,0 +1,34 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+    function test_Control_NavToolbar_constructor (t) {
+        t.plan( 4 );
+        control = new OpenLayers.Control.NavToolbar();
+        t.ok( control instanceof OpenLayers.Control.NavToolbar, "new OpenLayers.Control.NavToolbar returns object" );
+        t.eq( control.displayClass,  "olControlNavToolbar", "displayClass is correct" );
+        t.ok( control.controls[0] instanceof OpenLayers.Control.Navigation, "NavToolbar contains Control.Navigation object" );
+        t.ok( control.controls[1] instanceof OpenLayers.Control.ZoomBox, "NavToolbar contains Control.ZoomBox object" );
+    }
+    function test_Control_NavToolbar_addControl (t) {
+        t.plan( 6 );
+        map = new OpenLayers.Map('map');
+        control = new OpenLayers.Control.NavToolbar();
+        t.ok( control instanceof OpenLayers.Control.NavToolbar, "new OpenLayers.Control.NavToolbar returns object" );
+        t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map creates map" );
+        map.addControl(control);
+        t.ok( control.map === map, "Control.map is set to the map object" );
+        t.ok( map.controls[4] === control, "map.controls contains control" );
+        t.eq( parseInt(control.div.style.zIndex), map.Z_INDEX_BASE['Control'] + 7, "Control div zIndexed properly" );
+        t.eq( parseInt(map.viewPortDiv.lastChild.style.zIndex), map.Z_INDEX_BASE['Control'] + 7, "Viewport div contains control div" );
+        // t.eq( control.div.style.top, "6px", "Control div top located correctly by default");
+
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/Navigation.html b/tests/Control/Navigation.html
new file mode 100644
index 0000000..7569eb5
--- /dev/null
+++ b/tests/Control/Navigation.html
@@ -0,0 +1,153 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_Control_Navigation_constructor (t) {
+        t.plan( 3 );
+        var temp = OpenLayers.Control.prototype.initialize;
+        OpenLayers.Control.prototype.initialize = function() {
+            t.ok(true, "OpenLayers.Control's constructor called");
+        };
+
+        var control = new OpenLayers.Control.Navigation();
+        t.ok( control instanceof OpenLayers.Control.Navigation, "new OpenLayers.Control returns object" );
+
+        t.ok( !control.handleRightClicks, "'handleRightClicks' property is disabled by default");
+
+        OpenLayers.Control.prototype.initialize = temp;
+    }
+
+    function test_Control_Navigation_destroy (t) {
+        t.plan(10);
+        
+        var temp = OpenLayers.Control.prototype.destroy;
+        OpenLayers.Control.prototype.destroy = function() {
+            t.ok(true, "OpenLayers.Control's destroy called");
+            temp.call(this);
+        };
+
+        var control = {
+            events: {
+                destroy: function() {
+                    t.ok(true, "events destroyed");
+                }
+            },
+            'deactivate': function() {
+                t.ok(true, "navigation control deactivated before being destroyed");
+            },
+            'dragPan': {
+                'destroy': function() {
+                    t.ok(true, "dragPan destroyed");
+                }
+            },
+            'zoomBox': {
+                'destroy': function() {
+                    t.ok(true, "zoomBox destroyed");
+                }
+            },
+            handlers: {
+                'wheel': {
+                    'destroy': function() {
+                        t.ok(true, "wheelHandler destroyed");
+                    }
+                },
+                'click': {
+                    'destroy': function() {
+                        t.ok(true, "clickHandler destroyed");
+                    }
+                }
+            }
+        };
+
+        //this will also trigger one test by calling OpenLayers.Control's destroy
+        // and three more for the destruction of dragPan, zoomBox, and wheelHandler
+        OpenLayers.Control.Navigation.prototype.destroy.apply(control, []);
+
+        t.eq(control.dragPan, null, "'dragPan' set to null");
+        t.eq(control.zoomBox, null, "'zoomBox' set to null");
+        t.eq(control.handlers, null, "handlers set to null");
+
+        OpenLayers.Control.prototype.destroy = temp;
+    }
+
+    function test_Control_Navigation_disableZoomBox(t) {
+        t.plan(2);
+        var nav = new OpenLayers.Control.Navigation();
+        var zb = new OpenLayers.Control.ZoomBox({});
+        nav.zoomBox = zb;
+        zb.activate();
+        nav.disableZoomBox();
+        t.eq(nav.zoomBoxEnabled, false, "zoom box deactivated");
+        t.eq(zb.active, false, "zoom box control deactivated");
+    }
+
+    function test_Control_Navigation_enableZoomBox(t) {
+        t.plan(2);
+        var nav = new OpenLayers.Control.Navigation();
+        var zb = new OpenLayers.Control.ZoomBox({});
+        nav.zoomBox = zb;
+        nav.active = true;
+        nav.enableZoomBox();
+        t.eq(nav.zoomBoxEnabled, true, "zoom box activated");
+        t.eq(zb.active, true, "zoom box control activated");
+    }
+
+    function test_Control_Navigation_disableZoomWheel(t) {
+        t.plan(2);
+        var nav = new OpenLayers.Control.Navigation();
+        var wheel = new OpenLayers.Handler.MouseWheel(nav, {});
+        nav.handlers.wheel = wheel;
+        wheel.register = function() {};
+        wheel.unregister = function() {};
+        wheel.activate();
+        nav.disableZoomWheel();
+        t.eq(nav.zoomWheelEnabled, false, "mouse wheel deactivated");
+        t.eq(wheel.active, false, "mouse wheel handler deactivated");
+    }
+
+    function test_Control_Navigation_enableZoomWheel(t) {
+        t.plan(2);
+        var nav = new OpenLayers.Control.Navigation({zoomWheelEnabled: false});
+        nav.active = true;
+        var wheel = new OpenLayers.Handler.MouseWheel(nav, {});
+        wheel.register = function() {};
+        wheel.unregister = function() {};
+        nav.handlers.wheel = wheel;
+        nav.enableZoomWheel();
+        t.eq(nav.zoomWheelEnabled, true, "mouse wheel activated");
+        t.eq(wheel.active, true, "mouse wheel handler activated");
+    }
+    
+    function test_documentDrag(t) {
+        
+        t.plan(2);
+
+        /**
+         * These tests confirm that the documentDrag property is false by 
+         * default and is passed on to the DragPan control.  Tests of panning
+         * while dragging outside the viewport should go in the DragPan tests.
+         * Tests of the document events and appropriate callbacks from the 
+         * handler should go in the Drag handler tests.
+         */
+         
+         var nav = new OpenLayers.Control.Navigation();
+         t.eq(nav.documentDrag, false, "documentDrag false by default");
+         // nav.destroy(); // fails if called before draw
+         
+         var map = new OpenLayers.Map({
+             div: document.body,
+             controls: [new OpenLayers.Control.Navigation({documentDrag: true})]
+         });
+         nav = map.controls[0];
+
+         t.eq(nav.dragPan.documentDrag, true, "documentDrag set on the DragPan control");
+         map.destroy();
+         
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Control/NavigationHistory.html b/tests/Control/NavigationHistory.html
new file mode 100644
index 0000000..cccf4b8
--- /dev/null
+++ b/tests/Control/NavigationHistory.html
@@ -0,0 +1,245 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(4);
+        control = new OpenLayers.Control.NavigationHistory();
+        t.ok(control instanceof OpenLayers.Control.NavigationHistory,
+             "constructor returns correct instance");
+        t.eq(control.displayClass, "olControlNavigationHistory",
+             "displayClass is correct");
+        t.ok(control.next instanceof OpenLayers.Control.Button,
+             "constructor creates next control");
+        t.ok(control.previous instanceof OpenLayers.Control.Button,
+             "constructor creates previous control");
+    }
+
+    function test_destroy(t) {
+        t.plan(2);
+        control = new OpenLayers.Control.NavigationHistory();
+        control.next.destroy = function() {
+            t.ok(true, "destroy calls next.destroy");
+        }
+        control.previous.destroy = function() {
+            t.ok(true, "destroy calls previous.destroy");
+        }
+        control.destroy();
+    }
+    
+    function test_previous(t) {
+        var numStates = 10;
+        
+        t.plan(
+            numStates * 3 // for lon, lat, zoom
+            + 3 // for confirming that previous with empty stack works
+        );       
+
+        var history = new Array(numStates);
+        for(var i=0; i<numStates; ++i) {
+            history[i] = {
+                center: new OpenLayers.LonLat(
+                    (i * 360 / numStates) - 180, (i * 180 / numStates) - 90
+                ),
+                zoom: i
+            };
+        }
+        
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer(
+            "test", {isBaseLayer: true}
+        );
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.NavigationHistory();
+        map.addControl(control);
+        
+        // set previous states
+        for(i=0; i<numStates; ++i) {
+            map.setCenter(history[i].center, history[i].zoom);
+        }
+        // test previous states
+        for(i=numStates-1; i>=0; --i) {
+            t.eq(map.getCenter().lon, history[i].center.lon, "(step " + i + ") lon correct");
+            t.eq(map.getCenter().lat, history[i].center.lat, "(step " + i + ") lat correct");
+            t.eq(map.getZoom(), history[i].zoom, "(step " + i + ") zoom correct");
+            control.previous.trigger();
+        }
+        // test previous with empty stack
+        t.eq(map.getCenter().lon, history[0].center.lon, "(step 0 again) lon correct");
+        t.eq(map.getCenter().lat, history[0].center.lat, "(step 0 again) lat correct");
+        t.eq(map.getZoom(), history[0].zoom, "(step 0 again) zoom correct");
+    }
+
+    function test_next(t) {
+        var numStates = 10;
+        
+        t.plan(
+            numStates * 3 // for lon, lat, zoom
+            + 3 // for confirming that next with empty stack works
+        );
+
+        var history = new Array(numStates);
+        for(var i=0; i<numStates; ++i) {
+            history[i] = {
+                center: new OpenLayers.LonLat(
+                    (i * 360 / numStates) - 180, (i * 180 / numStates) - 90
+                ),
+                zoom: i
+            };
+        }
+        
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer(
+            "test", {isBaseLayer: true}
+        );
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.NavigationHistory();
+        map.addControl(control);
+        
+        // set previous states
+        for(i=0; i<numStates; ++i) {
+            map.setCenter(history[i].center, history[i].zoom);
+        }
+        // set next states
+        for(i=numStates-1; i>=0; --i) {
+            control.previous.trigger();
+        }
+        // test next states
+        for(i=0; i<numStates; ++i) {
+            t.eq(map.getCenter().lon, history[i].center.lon, "(step " + i + ") lon correct");
+            t.eq(map.getCenter().lat, history[i].center.lat, "(step " + i + ") lat correct");
+            t.eq(map.getZoom(), history[i].zoom, "(step " + i + ") zoom correct");
+            control.next.trigger();
+        }
+        // test next with empty stack
+        t.eq(map.getCenter().lon, history[numStates-1].center.lon, "(step " + (numStates-1) + " again) lon correct");
+        t.eq(map.getCenter().lat, history[numStates-1].center.lat, "(step " + (numStates-1) + " again) lat correct");
+        t.eq(map.getZoom(), history[numStates-1].zoom, "(step " + (numStates-1) + " again) zoom correct");
+    }
+    
+    function test_limit(t) {
+        var numStates = 10;
+        var limit = 3;
+        
+        t.plan(
+            numStates * 6 // for previous & next lon, lat, zoom
+        );
+
+        var history = new Array(numStates);
+        for(var i=0; i<numStates; ++i) {
+            history[i] = {
+                center: new OpenLayers.LonLat(
+                    (i * 360 / numStates) - 180, (i * 180 / numStates) - 90
+                ),
+                zoom: i
+            };
+        }
+        
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer(
+            "test", {isBaseLayer: true}
+        );
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.NavigationHistory({limit: limit});
+        map.addControl(control);
+        
+        // set previous states
+        for(i=0; i<numStates; ++i) {
+            map.setCenter(history[i].center, history[i].zoom);
+        }
+        // test previous states (only up to limit should work)
+        var state;
+        for(i=numStates-1; i>=0; --i) {
+            state = Math.max(i, numStates - limit - 1);
+            t.eq(map.getCenter().lon, history[state].center.lon, "(previous step " + i + ") lon correct: state " + state);
+            t.eq(map.getCenter().lat, history[state].center.lat, "(previous step " + i + ") lat correct: state " + state);
+            t.eq(map.getZoom(), history[state].zoom, "(previous step " + i + ") zoom correct: state " + state);
+            control.previous.trigger();
+        }
+        // test next states
+        for(i=0; i<numStates; ++i) {
+            state = Math.min(numStates - 1, numStates - limit - 1 + i);
+            t.eq(map.getCenter().lon, history[state].center.lon, "(next step " + i + ") lon correct: state " + state);
+            t.eq(map.getCenter().lat, history[state].center.lat, "(next step " + i + ") lat correct: state " + state);
+            t.eq(map.getZoom(), history[state].zoom, "(next step " + i + ") zoom correct: state " + state);
+            control.next.trigger();
+        }
+        
+    }
+
+    function test_clear(t) {
+        t.plan(7);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer(
+            "test", {isBaseLayer: true}
+        );
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+
+        var control = new OpenLayers.Control.NavigationHistory();
+        map.addControl(control);
+        
+        t.ok(!control.previous.active, "previous control not active");
+        t.ok(!control.next.active, "next control not active");
+
+        map.zoomTo(4);
+        t.ok(control.previous.active, "previous control is active after a move");
+        t.ok(!control.next.active, "next control is not active after a move");
+
+        control.clear();
+        t.eq(control.previousStack.length + control.nextStack.length, 0, "stacks are empty after a clear");
+        t.ok(!control.previous.active, "previous control not active after a clear");
+        t.ok(!control.next.active, "next control not active after a clear");
+
+        control.destroy();
+    }
+
+    function test_reprojection(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer(
+            "test", {isBaseLayer: true}
+        );
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+
+        var control = new OpenLayers.Control.NavigationHistory();
+        map.addControl(control);
+
+        map.zoomTo(4);
+        var bounds = map.getExtent().clone();
+        var expected = bounds.transform(new OpenLayers.Projection('EPSG:4326'),
+            new OpenLayers.Projection('EPSG:900913'));
+        // change the projection to EPSG:900913
+        var projSettings = {
+            units: "m", 
+            maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508), 
+            maxResolution: 156543.0339
+        };
+        map.setOptions(projSettings);
+        map.projection = 'EPSG:900913';
+        delete projSettings.maxResolution;
+        projSettings.projection = new OpenLayers.Projection('EPSG:900913');
+        layer.addOptions(projSettings);
+        layer.initResolutions();
+
+        map.zoomTo(7);
+
+        // go back one in the history
+        control.previous.trigger();
+
+        t.eq(map.getExtent().left.toFixed(3), expected.left.toFixed(3), "The extent [left] is reprojected correctly");
+        t.eq(map.getExtent().right.toFixed(3), expected.right.toFixed(3), "The extent [right] is reprojected correctly");
+        // top and bottom cannot be checked here since in EPSG:900913 the extent is not a rectangle so they are adjusted.
+
+        control.destroy();
+
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 100px; height: 100px;"/>
+</body>
+</html>
diff --git a/tests/Control/OverviewMap.html b/tests/Control/OverviewMap.html
new file mode 100644
index 0000000..3feaa87
--- /dev/null
+++ b/tests/Control/OverviewMap.html
@@ -0,0 +1,181 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map, control;
+    function test_initialize(t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.OverviewMap();
+        t.ok( control instanceof OpenLayers.Control.OverviewMap, "new OpenLayers.Control.OverviewMap returns object" );
+        t.eq( control.displayClass,  "olControlOverviewMap", "displayClass is correct" );
+    }
+
+    function test_setMap(t) {
+        t.plan(4);
+
+        var setMapTest = function(map) {
+            t.ok(true, "Handler.setMap called for " + this.CLASS_NAME);
+            this.map = map;        
+        };
+        var drag_setMap = OpenLayers.Handler.Drag.prototype.setMap;
+        OpenLayers.Handler.Drag.prototype.setMap = setMapTest;
+        var click_setMap = OpenLayers.Handler.Click.prototype.setMap;
+        OpenLayers.Handler.Click.prototype.setMap = setMapTest;
+
+        map = new OpenLayers.Map('map', {
+            layers  : [new OpenLayers.Layer("layer", {isBaseLayer: true})],
+            controls: []
+        });
+        control = new OpenLayers.Control.OverviewMap();
+    
+        map.addControl(control);
+
+        map.zoomToMaxExtent();
+        t.eq(control.handlers.drag.map.id, control.ovmap.id, "drag.map is correct");
+        t.eq(control.handlers.click.map.id, control.ovmap.id, "click.map is correct");
+
+        map.destroy();
+        OpenLayers.Handler.Drag.prototype.setMap = drag_setMap;
+        OpenLayers.Handler.Click.prototype.setMap = click_setMap;
+    }
+
+    function test_destroy(t) {
+        t.plan(6);
+
+        // set up
+
+        var log_drag = [], log_click = [], control;
+
+        map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer("layer", {isBaseLayer: true}));
+
+        control = new OpenLayers.Control.OverviewMap();
+        map.addControl(control);
+
+        map.zoomToMaxExtent();
+
+        control.handlers.drag.destroy = function() {
+            log_drag.push({"map": !!this.map.events});
+        };
+        control.handlers.click.destroy = function() {
+            log_click.push({"map": !!this.map.events});
+        };
+
+        // test
+
+        control.destroy();
+        t.eq(log_drag.length, 2,
+             "destroy() destroys drag handler twice, expected");
+        if (log_drag.length == 2) {
+            t.eq(log_drag[0].map, true,
+                 "destroy() destroys drag handler before ovmap is destroyed (0)");
+            t.eq(log_drag[1].map, false,
+                 "destroy() destroys drag handler after ovmap is destroyed (1)");
+        }
+        t.eq(log_click.length, 2,
+             "destroy() destroys click handler twice, expected");
+        if (log_click.length == 2) {
+            t.eq(log_click[0].map, true,
+                 "destroy() destroys click handler before ovmap is destroyed (0)");
+            t.eq(log_click[1].map, false,
+                 "destroy() destroys click handler after ovmap is destroyed (1)");
+        }
+
+        // tear down
+        map.destroy();
+    }
+    function test_addControl (t) {
+        t.plan( 6 );
+        map = new OpenLayers.Map('map');
+        control = new OpenLayers.Control.OverviewMap();
+        t.ok( control instanceof OpenLayers.Control.OverviewMap, "new OpenLayers.Control.OverviewMap returns object" );
+        t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map creates map" );
+        map.addControl(control);
+        t.ok( control.map === map, "Control.map is set to the map object" );
+        t.ok( map.controls[4] === control, "map.controls contains control" );
+        t.eq( parseInt(control.div.style.zIndex), map.Z_INDEX_BASE['Control'] + 5, "Control div zIndexed properly" );
+        t.eq( parseInt(map.viewPortDiv.lastChild.style.zIndex), map.Z_INDEX_BASE['Control'] + 5, "Viewport div contains control div" );
+
+        map.destroy();
+    }
+    function test_control_events (t) {
+        t.plan( 10 );
+        var evt = {which: 1}; // control expects left-click
+        map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+
+        control = new OpenLayers.Control.OverviewMap();
+        map.addControl(control, new OpenLayers.Pixel(20,20));
+
+        var centerLL = new OpenLayers.LonLat(-71,42); 
+        map.setCenter(centerLL, 11);
+        t.delay_call(1, function() {
+        var overviewCenter = control.ovmap.getCenter();
+        var overviewZoom = control.ovmap.getZoom();
+        t.eq(overviewCenter.lon, -71, "Overviewmap center lon correct");
+        t.eq(overviewCenter.lat, 42, "Overviewmap center lat correct");
+        t.eq(overviewZoom, 8, "Overviewmap zoomcorrect");
+        
+        control.mapDivClick({'xy':new OpenLayers.Pixel(5,5)});
+        }, 2, function() {
+        var cent = map.getCenter();
+        t.eq(cent.lon, -71.3515625, "Clicking on the Overview Map has the correct effect on map lon");
+        t.eq(cent.lat, 42.17578125, "Clicking on the Overview Map has the correct effect on map lat");
+
+        control.handlers.drag = {
+            last: new OpenLayers.Pixel(5,5),
+            destroy: function() {}
+        };
+        control.rectDrag(new OpenLayers.Pixel(15, 15));
+        control.updateMapToRect();
+        }, 2, function() {
+        var cent = map.getCenter();
+        t.eq(cent.lon, -71.2734375, "Dragging on the Overview Map has the correct effect on map lon");
+        t.eq(cent.lat, 42.09765625, "Dragging on the Overview Map has the correct effect on map lat");
+        
+        map.setCenter(new OpenLayers.LonLat(0,0), 0);
+        var overviewCenter = control.ovmap.getCenter();
+        var overviewZoom = control.ovmap.getZoom();
+        t.eq(overviewCenter.lon, 0, "Overviewmap center lon correct -- second zoom");
+        t.eq(overviewCenter.lat, 0, "Overviewmap center lat correct -- second zoom");
+        t.eq(overviewZoom, 0, "Overviewmap zoomcorrect -- second zoom");
+        map.destroy();
+        });
+    }
+
+    function test_initialize_maximized(t) {
+        t.plan(4);
+
+        control = new OpenLayers.Control.OverviewMap()
+        map = new OpenLayers.Map('map', {
+            layers  : [new OpenLayers.Layer("layer", {isBaseLayer: true})],
+            controls: [control]
+        });
+        
+        t.eq(control.maximized, false, "OverviewMap is not maximized by default");
+        t.eq(control.element.style.display, 'none', "OverviewMap.element is not visible");
+        map.destroy();
+
+        control = new OpenLayers.Control.OverviewMap({
+            maximized: true
+        })
+        map = new OpenLayers.Map('map', {
+            layers  : [new OpenLayers.Layer("layer", {isBaseLayer: true})],
+            controls: [control]
+        });
+        t.eq(control.maximized, true, "OverviewMap.maximized is set");
+        t.eq(control.element.style.display, '', "OverviewMap.element is visible");
+
+        map.destroy();
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/PanPanel.html b/tests/Control/PanPanel.html
new file mode 100644
index 0000000..73baa00
--- /dev/null
+++ b/tests/Control/PanPanel.html
@@ -0,0 +1,23 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_constructor (t) {
+        t.plan(1);
+        
+        // set up
+        var control;
+
+        // tests
+        control = new OpenLayers.Control.PanPanel({slideFactor: 200});
+        t.ok(control.controls[0].slideFactor == 200 &&
+             control.controls[1].slideFactor == 200 &&
+             control.controls[2].slideFactor == 200 &&
+             control.controls[3].slideFactor == 200,
+             "ctor sets slideFactor in all Pan controls");
+    }
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Control/PanZoom.html b/tests/Control/PanZoom.html
new file mode 100644
index 0000000..1f2deec
--- /dev/null
+++ b/tests/Control/PanZoom.html
@@ -0,0 +1,230 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+    function test_Control_PanZoom_constructor (t) {
+        t.plan( 4 );
+    
+        control = new OpenLayers.Control.PanZoom();
+        t.ok( control instanceof OpenLayers.Control.PanZoom, "new OpenLayers.Control.PanZoom returns object" );
+        t.eq( control.displayClass,  "olControlPanZoom", "displayClass is correct" );
+        control = new OpenLayers.Control.PanZoom({position: new OpenLayers.Pixel(100,100)});
+        t.eq( control.position.x, 100, "PanZoom X Set correctly."); 
+        t.eq( control.position.y, 100, "PanZoom y Set correctly."); 
+    }
+    function test_Control_PanZoom_addControl (t) {
+        t.plan( 8 );
+        map = new OpenLayers.Map('map');
+        control = new OpenLayers.Control.PanZoom();
+        t.ok( control instanceof OpenLayers.Control.PanZoom, "new OpenLayers.Control.PanZoom returns object" );
+        t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map creates map" );
+        map.addControl(control);
+        t.ok( control.map === map, "Control.map is set to the map object" );
+        t.ok( map.controls[4] === control, "map.controls contains control" );
+        t.eq( parseInt(control.div.style.zIndex), map.Z_INDEX_BASE['Control'] + 5, "Control div zIndexed properly" );
+        t.eq( parseInt(map.viewPortDiv.lastChild.style.zIndex), map.Z_INDEX_BASE['Control'] + 5, "Viewport div contains control div" );
+        t.eq( control.div.style.top, "4px", "Control div top located correctly by default");
+
+        var control2 = new OpenLayers.Control.PanZoom();
+        map.addControl(control2, new OpenLayers.Pixel(100,100));
+        t.eq( control2.div.style.top, "100px", "2nd control div is located correctly");
+    }
+    
+    function test_Control_PanZoom_removeButtons(t) {
+        t.plan(2);
+        map = new OpenLayers.Map("map");
+        control = new OpenLayers.Control.PanZoom();
+        map.addControl(control);
+        control.removeButtons();
+        t.eq(control.buttons.length, 0, "buttons array cleared correctly");
+        t.eq(control.div.childNodes.length, 0, "control div is empty");
+    }
+
+    function test_Control_PanZoom_control_events (t) {
+
+        if ( !window.document.createEvent || OpenLayers.Util.getBrowserName() == "opera" || !t.open_window) {
+            //ie can't simulate mouseclicks
+            t.plan(0);
+            t.debug_print("FIXME: This browser does not support the PanZoom test at this time.");
+        } else {
+            t.plan(35);
+            t.open_window( "Control/PanZoom.html", function( wnd ) {
+                t.delay_call( 3, function() {
+                    var flag;
+                    function setFlag(evt) {
+                        flag[evt.type] = true;
+                    }
+                    function resetFlags() {
+                        flag = {
+                            mousedown: false,
+                            mouseup: false,
+                            click: false,
+                            dblclick: false
+                        };
+                    }
+                    resetFlags();
+                    
+                    wnd.mapper.events.register("mousedown", mapper, setFlag);
+                    wnd.mapper.events.register("mouseup", mapper, setFlag);
+                    wnd.mapper.events.register("click", mapper, setFlag);
+                    wnd.mapper.events.register("dblclick", mapper, setFlag);
+                    
+                    simulateClick(wnd, wnd.control.buttons[0]);
+                    t.delay_call(2, function() {
+                        t.ok( wnd.mapper.getCenter().lat > wnd.centerLL.lat, "Pan up works correctly" );
+                        t.ok(!flag.mousedown, "mousedown does not get to the map");
+                        t.ok(flag.mouseup, "mouseup does get to the map");
+                        t.ok(!flag.click, "click does not get to the map");
+                        t.ok(!flag.dblclick, "dblclick does not get to the map");
+                        resetFlags();
+
+                        simulateClick(wnd, wnd.control.buttons[1]);
+                    }, 2, function() {    
+                    t.ok( wnd.mapper.getCenter().lon < wnd.centerLL.lon, "Pan left works correctly" );
+                    t.ok(!flag.mousedown, "mousedown does not get to the map");
+                    t.ok(flag.mouseup, "mouseup does get to the map");
+                    t.ok(!flag.click, "click does not get to the map");
+                    t.ok(!flag.dblclick, "dblclick does not get to the map");
+                    resetFlags();
+
+                    simulateClick(wnd, wnd.control.buttons[2]);
+                    }, 2, function() {
+                    t.ok( wnd.mapper.getCenter().lon == wnd.centerLL.lon, "Pan right works correctly" );
+                    t.ok(!flag.mousedown, "mousedown does not get to the map");
+                    t.ok(flag.mouseup, "mouseup does get to the map");
+                    t.ok(!flag.click, "click does not get to the map");
+                    t.ok(!flag.dblclick, "dblclick does not get to the map");
+                    resetFlags();
+
+                    simulateClick(wnd, wnd.control.buttons[3]);
+                    }, 2, function() {
+                    t.ok( wnd.mapper.getCenter().lat == wnd.centerLL.lat, "Pan down works correctly" );
+                    t.ok(!flag.mousedown, "mousedown does not get to the map");
+                    t.ok(flag.mouseup, "mouseup does get to the map");
+                    t.ok(!flag.click, "click does not get to the map");
+                    t.ok(!flag.dblclick, "dblclick does not get to the map");
+                    resetFlags();
+
+                    simulateClick(wnd, wnd.control.buttons[4]);
+                    }, 2, function() {
+                    t.eq( wnd.mapper.getZoom(), 6, "zoomin works correctly" );
+                    t.ok(!flag.mousedown, "mousedown does not get to the map");
+                    t.ok(flag.mouseup, "mouseup does get to the map");
+                    t.ok(!flag.click, "click does not get to the map");
+                    t.ok(!flag.dblclick, "dblclick does not get to the map");
+                    resetFlags();
+
+                    simulateClick(wnd, wnd.control.buttons[6]);
+                    }, 2, function() {
+                    t.eq( wnd.mapper.getZoom(), 5, "zoomout works correctly" );
+                    t.ok(!flag.mousedown, "mousedown does not get to the map");
+                    t.ok(flag.mouseup, "mouseup does get to the map");
+                    t.ok(!flag.click, "click does not get to the map");
+                    t.ok(!flag.dblclick, "dblclick does not get to the map");
+                    resetFlags();
+
+                    simulateClick(wnd, wnd.control.buttons[5]);
+                    }, 2, function() {
+                    t.eq( wnd.mapper.getZoom(), 2, "zoomworld works correctly" );
+                    t.ok(!flag.mousedown, "mousedown does not get to the map");
+                    t.ok(flag.mouseup, "mouseup does get to the map");
+                    t.ok(!flag.click, "click does not get to the map");
+                    t.ok(!flag.dblclick, "dblclick does not get to the map");
+                    resetFlags();
+                    });
+                });
+            });
+        }
+    }
+
+    function test_slideRatio(t) {
+        t.plan(4);
+
+        var control = new OpenLayers.Control.PanZoom({
+            slideRatio: .5
+        });
+
+        var map = new OpenLayers.Map();
+
+        map.addControl(control);
+        control.draw();
+        control.activate();
+
+        map.getSize = function() {
+            return {
+                w: 250,
+                h: 100
+            }
+        };
+
+        var delta, dir;
+        var evt = {which: 1}; // a fake left click
+        var buttons = control.buttons;
+        map.pan = function(dx, dy){
+            t.eq([dx,dy],delta,"Panning " + dir + " sets right delta with slideRatio");
+        };
+
+        //up
+        var delta = [0, -50];
+        var dir = "up";
+        control.buttonDown.call(buttons[0], evt);
+        
+        //left
+        var delta = [-125, 0];
+        var dir = "left";
+        control.buttonDown.call(buttons[1], evt);
+        
+        //right
+        var delta = [125, 0];
+        var dir = "right";
+        control.buttonDown.call(buttons[2], evt);
+        
+        //down
+        var delta = [0, 50];
+        var dir = "down";
+        control.buttonDown.call(buttons[3], evt);
+        
+        map.destroy();
+    }
+
+    function simulateClick(wnd, elem) {
+      var evt = wnd.document.createEvent("MouseEvents");
+      evt.initMouseEvent("mousedown", true, true, wnd, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+      elem.dispatchEvent(evt);
+
+      evt = wnd.document.createEvent("MouseEvents");
+      evt.initMouseEvent("mouseup", true, true, wnd, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+      elem.dispatchEvent(evt);
+
+      evt = wnd.document.createEvent("MouseEvents");
+      evt.initMouseEvent("click", true, true, wnd, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+      elem.dispatchEvent(evt);
+
+      evt = wnd.document.createEvent("MouseEvents");
+      evt.initMouseEvent("dblclick", true, true, wnd, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+      elem.dispatchEvent(evt);
+    }
+
+    function loader() {
+        control = new OpenLayers.Control.PanZoom();
+    
+        mapper = new OpenLayers.Map('map', { controls: [control]});
+        
+    
+        var layer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://labs.metacarta.com/wms-c/Basic.py?",
+            {layers: "basic"});
+        mapper.addLayer(layer);
+    
+        centerLL = new OpenLayers.LonLat(0,0); 
+        mapper.setCenter(centerLL, 5);
+    }
+        
+
+  </script>
+</head>
+<body onload="loader()">
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/PanZoomBar.html b/tests/Control/PanZoomBar.html
new file mode 100644
index 0000000..9590dd0
--- /dev/null
+++ b/tests/Control/PanZoomBar.html
@@ -0,0 +1,89 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map;
+    function test_Control_PanZoomBar_constructor (t) {
+        t.plan( 4 );
+
+        control = new OpenLayers.Control.PanZoomBar({position: new OpenLayers.Pixel(100,100)});
+        t.ok( control instanceof OpenLayers.Control.PanZoomBar, "new OpenLayers.Control.PanZoomBar returns object" );
+        t.eq( control.displayClass,  "olControlPanZoomBar", "displayClass is correct" );
+        t.eq( control.position.x, 100, "PanZoom X Set correctly.");
+        t.eq( control.position.y, 100, "PanZoom y Set correctly.");
+    }
+    function test_Control_PanZoomBar_addControl (t) {
+        t.plan( 8 );
+        map = new OpenLayers.Map('map', {controls:[]});
+        var layer = new OpenLayers.Layer.WMS("Test Layer",
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+        control = new OpenLayers.Control.PanZoomBar();
+        t.ok( control instanceof OpenLayers.Control.PanZoomBar, "new OpenLayers.Control.PanZoomBar returns object" );
+        t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map creates map" );
+        map.addControl(control);
+        t.ok( control.map === map, "Control.map is set to the map object" );
+        t.ok( map.controls[0] === control, "map.controls contains control" );
+        t.eq( parseInt(control.div.style.zIndex), 1001, "Control div zIndexed properly" );
+        t.eq( parseInt(map.viewPortDiv.lastChild.style.zIndex), 1001, "Viewport div contains control div" );
+        t.eq( control.div.style.top, "4px", "Control div top located correctly by default");
+
+        var control2 = new OpenLayers.Control.PanZoomBar();
+        map.addControl(control2, new OpenLayers.Pixel(100,100));
+        t.eq( control2.div.style.top, "100px", "2nd control div is located correctly");
+    }
+
+    function test_Control_PanZoomBar_clearDiv(t) {
+        t.plan(2);
+        map = new OpenLayers.Map('map', {controls:[]});
+        var layer = new OpenLayers.Layer.WMS("Test Layer",
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+        control = new OpenLayers.Control.PanZoomBar();
+        map.addControl(control);
+        control.removeButtons();
+        control._removeZoomBar();
+        t.eq(control.div.childNodes.length, 0, "control's div cleared.");
+        t.eq(control.zoombarDiv, null, "zoombar div nullified.")
+    }
+
+    function test_Control_PanZoomBar_divClick (t) {
+        t.plan(2);
+        map = new OpenLayers.Map('map', {controls:[]});
+        var layer = new OpenLayers.Layer.WMS("Test Layer",
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+        control = new OpenLayers.Control.PanZoomBar();
+        map.addControl(control);
+        control.divClick({'xy': {'x': 0, 'y': 50}, which: 1});
+        t.eq(map.zoom, 11, "zoom is correct on standard map");
+
+        map.fractionalZoom = true;
+        control.divClick({'xy': {'x': 0, 'y': 49}, which: 1});
+        t.eq(map.zoom.toFixed(3), '10.545', "zoom is correct on fractional zoom map");
+
+    }
+
+    function test_Control_PanZoomBar_forceFixedZoomLevel_divClick (t) {
+        t.plan(1);
+        map = new OpenLayers.Map('map', {controls:[], fractionalZoom: true});
+        var layer = new OpenLayers.Layer.WMS("Test Layer",
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(layer);
+        control = new OpenLayers.Control.PanZoomBar({forceFixedZoomLevel: true});
+        map.addControl(control);
+
+        control.divClick({'xy': {'x': 0, 'y': 49}, which: 1});
+        t.eq(map.zoom, 11, "forceFixedZoomLevel makes sure only fixed zoom levels are used even if the map has fractionalZoom");
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/Panel.html b/tests/Control/Panel.html
new file mode 100644
index 0000000..59018ae
--- /dev/null
+++ b/tests/Control/Panel.html
@@ -0,0 +1,236 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Control_Panel_constructor (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.Panel();
+        t.ok( control instanceof OpenLayers.Control.Panel, "new OpenLayers.Control returns object" );
+        t.eq( control.displayClass,  "olControlPanel", "displayClass is correct" );
+    }
+    function test_Control_Panel_constructor2 (t) {
+        t.plan(16);
+        var map = new OpenLayers.Map('map');
+        var toolControl = new OpenLayers.Control.ZoomBox();
+        var AnotherToolControl = OpenLayers.Class(OpenLayers.Control, {
+              CLASS_NAME: 'mbControl.TestTool',
+              type: OpenLayers.Control.TYPE_TOOL
+        });
+        var anotherToolControl = new AnotherToolControl();
+        var ToggleControl = OpenLayers.Class(OpenLayers.Control, {
+              CLASS_NAME: 'mbControl.TestToggle',
+              type: OpenLayers.Control.TYPE_TOGGLE
+        });
+        
+        var toggleControl = new ToggleControl();
+        var buttonControl = new OpenLayers.Control.Button({
+            trigger: function () {
+                t.ok(true, "trigger function of button is called.");     
+            }
+        });
+
+        var panel = new OpenLayers.Control.Panel(
+            {defaultControl: anotherToolControl});
+        t.ok(panel instanceof OpenLayers.Control.Panel, 
+              "new OpenLayers.Control.Panel returns object");
+        panel.redraw = function(){
+            panel.redrawsCount++;            
+        };
+
+        panel.addControls([toolControl, anotherToolControl, toggleControl]);
+        t.eq(panel.controls.length, 3,
+              "added three controls to the panel");
+        panel.addControls([buttonControl]);
+
+        panel.redrawsCount = 0;              
+        map.addControl(panel);
+        t.ok((panel.redrawsCount > 0), "Redraw called on add panel to map " + 
+            panel.redrawsCount + " times.");        
+        t.ok((panel.active),"Panel is active after add panel to map.");        
+        
+        panel.redrawsCount = 0;              
+        panel.addControls(new AnotherToolControl());
+        t.ok((panel.redrawsCount > 0),
+            "Redraw called on add control to panel after add panel to map " +
+            panel.redrawsCount + " times."); 
+
+        panel.deactivate();
+        panel.redrawsCount = 0;                      
+        panel.activate();        
+        t.ok((panel.redrawsCount > 0),"Redraw called on activate panel " +
+            panel.redrawsCount + " times."); 
+
+        panel.activateControl(toolControl);
+        t.ok(toolControl.active && !anotherToolControl.active && !toggleControl.active && !buttonControl.active,
+              "activated one tool control, the other one is inactive and the toggle & button controls also.");
+
+        panel.redrawsCount = 0;              
+        panel.activateControl(toggleControl);
+        t.ok((panel.redrawsCount > 0),"Redraw called on activated toggle " +
+            panel.redrawsCount + " times.");
+        t.ok(toolControl.active && !anotherToolControl.active && toggleControl.active,
+              "activated the toggle control, which has no influence on the tool & togggle controls.");
+        panel.activateControl(buttonControl);
+        t.ok(toolControl.active && !anotherToolControl.active && toggleControl.active,
+              "activateContol calling for button, which has no influence on the tool & togggle controls.");
+        t.ok(!buttonControl.active,
+              "activateContol calling for button, button remains inactive.");
+        buttonControl.activate();
+        t.ok(buttonControl.active && toolControl.active && !anotherToolControl.active && toggleControl.active,
+              "activated the button control, which has no influence on the tool & togggle controls.");
+              
+        panel.redrawsCount = 0; 
+        panel.activateControl(anotherToolControl);
+        t.ok((panel.redrawsCount > 0),
+            "Redraw called on activated tool control " + panel.redrawsCount + 
+            " times.");
+        t.ok(!toolControl.active && anotherToolControl.active && toggleControl.active,
+              "activated the other tool control, the first one is inactive and the toggle control still active.");
+        t.ok(buttonControl.active,
+              "activated the other tool control, the button control still active.");
+    }
+    function test_Control_Panel_titles (t) { 
+        t.plan(2); 
+        var panel = new OpenLayers.Control.Panel(); 
+        var toolControl = new OpenLayers.Control.ZoomBox({ 
+            title:"Zoom box: Selecting it you can zoom on an area by clicking and dragging." 
+        }); 
+        panel.addControls([toolControl]); 
+        t.eq(panel.controls.length, 1, "added a control to the panel"); 
+        t.eq(panel.controls[0].title, toolControl.panel_div.title, "the title is correctly set"); 
+    } 
+    
+    function test_Control_Panel_getBy(t) {
+        
+        var panel = {
+            getBy: OpenLayers.Control.Panel.prototype.getBy,
+            getControlsBy: OpenLayers.Control.Panel.prototype.getControlsBy,
+            controls: [
+                {foo: "foo", id: Math.random()},
+                {foo: "bar", id: Math.random()},
+                {foo: "foobar", id: Math.random()},
+                {foo: "foo bar", id: Math.random()},
+                {foo: "foo", id: Math.random()}
+            ]
+        };
+
+        var cases = [
+            {
+                got: panel.getControlsBy("foo", "foo"),
+                expected: [panel.controls[0], panel.controls[4]],
+                message: "(string literal) got two controls matching foo"
+            }, {
+                got: panel.getControlsBy("foo", "bar"),
+                expected: [panel.controls[1]],
+                message: "(string literal) got one control matching foo"
+            }, {
+                got: panel.getControlsBy("foo", "barfoo"),
+                expected: [],
+                message: "(string literal) got empty array for no foo match"
+            }, {
+                got: panel.getControlsBy("foo", /foo/),
+                expected: [panel.controls[0], panel.controls[2], panel.controls[3], panel.controls[4]],
+                message: "(regexp literal) got three controls containing string"
+            }, {
+                got: panel.getControlsBy("foo", /foo$/),
+                expected: [panel.controls[0], panel.controls[4]],
+                message: "(regexp literal) got three controls ending with string"
+            }, {
+                got: panel.getControlsBy("foo", /\s/),
+                expected: [panel.controls[3]],
+                message: "(regexp literal) got control containing space"
+            }, {
+                got: panel.getControlsBy("foo", new RegExp("BAR", "i")),
+                expected: [panel.controls[1], panel.controls[2], panel.controls[3]],
+                message: "(regexp object) got layers ignoring case"
+            }, {
+                got: panel.getControlsBy("foo", {test: function(str) {return str.length > 3;}}),
+                expected: [panel.controls[2], panel.controls[3]],
+                message: "(custom object) got controls with foo length greater than 3"
+            }
+        ];
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, cases[i].message);
+        }
+
+
+    }
+    
+    function test_Control_Panel_saveState (t) { 
+        t.plan(11); 
+        var map = new OpenLayers.Map('map');
+
+        var defaultControl = new OpenLayers.Control();
+        var panel = new OpenLayers.Control.Panel({
+            defaultControl: defaultControl
+        });
+        panel.addControls([new OpenLayers.Control(), defaultControl]);
+        map.addControl(panel);
+        t.eq(defaultControl.active, true,
+            "After panel activation default control is active.");    
+        t.ok(panel.defaultControl,
+            "defaultControl not nullified after initial panel activation");          
+        // activate the 1st control
+        panel.activateControl(panel.controls[0]);
+        panel.deactivate();      
+        t.ok(!panel.controls[0].active && !panel.controls[1].active,
+            "No controls are active after panel deactivation.");
+        panel.activate();   
+        t.eq(panel.controls[0].active, false,
+            "After panel reactivation first control is inactive.");              
+        t.eq(panel.controls[1].active, true,
+            "After panel reactivation default control is active again.");
+        panel.destroy();
+
+        defaultControl = new OpenLayers.Control();
+        panel = new OpenLayers.Control.Panel({
+            saveState: true,
+            defaultControl: defaultControl
+        });
+        panel.addControls([new OpenLayers.Control(), defaultControl]);
+        map.addControl(panel);
+        t.eq(defaultControl.active, true,
+            "After panel activation default control is active.");    
+        t.eq(panel.defaultControl, null,
+            "defaultControl nullified after initial panel activation");          
+        // activate the 1st control, which will deactivate the 2nd
+        panel.activateControl(panel.controls[0]);
+        t.eq(panel.controls[1].active, false,
+            "2nd control deactivated with activation of 1st");
+        panel.deactivate();      
+        t.ok(!panel.controls[0].active && !panel.controls[1].active,
+            "No controls are active after panel deactivation.");
+        panel.activate();   
+        t.eq(panel.controls[0].active, true,
+            "After panel reactivation first control is active.");
+        t.eq(panel.controls[1].active, false,
+            "After panel reactivation second control is inactive.");              
+        panel.destroy();
+        map.destroy();
+    } 
+
+    function test_Control_Panel_autoActivate (t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        var controlNoDeactive = new OpenLayers.Control({autoActivate:true});
+        var chkDeactivate = function () {
+            t.ok(false, "Tool control autoActivate:true was deactivated unnecessarily");
+        };
+        controlNoDeactive.events.on({deactivate: chkDeactivate});
+        var panel = new OpenLayers.Control.Panel();
+        
+        map.addControl(panel);
+        panel.addControls([controlNoDeactive]);
+        controlNoDeactive.events.un({deactivate: chkDeactivate});
+        t.ok(!controlNoDeactive.active, "Tool control autoActivate:true is not active");
+        
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/Permalink.html b/tests/Control/Permalink.html
new file mode 100644
index 0000000..c42d203
--- /dev/null
+++ b/tests/Control/Permalink.html
@@ -0,0 +1,237 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+    function test_Control_Permalink_constructor (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.Permalink();
+        t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
+        t.eq( control.displayClass,  "olControlPermalink", "displayClass is correct" );
+    }
+    function test_Control_Permalink_uncentered (t) {
+        t.plan( 1 );
+    
+        control = new OpenLayers.Control.Permalink('permalink');
+        map = new OpenLayers.Map('map');
+        map.addControl(control);
+        map.events.triggerEvent("changelayer", {});
+        t.ok(true, "permalink didn't bomb out.");
+    }   
+    function test_Control_Permalink_initwithelem (t) {
+        t.plan( 1 );
+    
+        control = new OpenLayers.Control.Permalink(OpenLayers.Util.getElement('permalink'));
+        t.ok(true, "If the above line doesn't throw an error, we're safe."); 
+    }
+    function test_Control_Permalink_updateLinks (t) {
+        t.plan( 3 );
+    
+        control = new OpenLayers.Control.Permalink('permalink');
+        t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
+        map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, {'isBaseLayer': false});
+        map.addLayer(layer);
+        layer.setVisibility(true);
+        if (!map.getCenter())  map.zoomToMaxExtent();
+        map.addControl(control);
+        map.pan(5, 0, {animate:false});
+        t.ok(OpenLayers.Util.isEquivalentUrl(OpenLayers.Util.getElement('permalink').href, location+"?zoom=2&lat=0&lon=1.75781&layers=BT"), 'pan sets permalink');
+        
+        map.layers[1].setVisibility(false);
+        
+        t.ok(OpenLayers.Util.isEquivalentUrl(OpenLayers.Util.getElement('permalink').href, location+"?zoom=2&lat=0&lon=1.75781&layers=BF"), 'setVisibility sets permalink');
+    }
+    function test_Control_Permalink_updateLinksBase (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.Permalink('permalink', "./edit.html" );
+        t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
+        map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        if (!map.getCenter())  map.zoomToMaxExtent();
+        map.addControl(control);
+        map.pan(5, 0, {animate:false});
+        OpenLayers.Util.getElement('edit_permalink').href = './edit.html?zoom=2&lat=0&lon=1.75781&layers=B';
+        t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with base");
+  }
+  function test_Control_Permalink_noElement (t) {
+        t.plan( 2 );
+        control = new OpenLayers.Control.Permalink( );
+        t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
+        map = new OpenLayers.Map('map');
+        map.addControl(control);
+        t.eq(map.controls[4].div.firstChild.nodeName, "A", "Permalink control creates div with 'a' inside." );
+  }
+  function test_Control_Permalink_base_with_query (t) {
+      t.plan( 3 );
+  
+      control = new OpenLayers.Control.Permalink('permalink', "./edit.html?foo=bar" );
+      map = new OpenLayers.Map('map');
+      layer = new OpenLayers.Layer.WMS('Test Layer', "http://example.com" );
+      map.addLayer(layer);
+      if (!map.getCenter())  map.zoomToMaxExtent();
+      map.addControl(control);
+      map.pan(5, 0, {animate:false});
+      OpenLayers.Util.getElement('edit_permalink').href = './edit.html?foo=bar&zoom=2&lat=0&lon=1.75781&layers=B';
+      t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with base and querystring");
+      
+      control = new OpenLayers.Control.Permalink('permalink', "./edit.html?foo=bar&" );
+      map.addControl(control);
+      map.pan(0, 0, {animate:false});
+      t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with base and querystring ending with '&'");
+      
+      control = new OpenLayers.Control.Permalink('permalink', "./edit.html?" );
+      OpenLayers.Util.getElement('edit_permalink').href = './edit.html?zoom=2&lat=0&lon=1.75781&layers=B';
+      map.addControl(control);
+      map.pan(5, 0, {animate:false});
+      map.pan(-5, 0, {animate:false});
+      t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with base and querystring ending with '?'");
+
+  }
+
+    function test_Control_Permalink_nonRepeating (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.Permalink('permalink', "./edit.html?zoom=3" );
+        t.ok( control instanceof OpenLayers.Control.Permalink, "new OpenLayers.Control returns object" );
+        map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        if (!map.getCenter())  map.zoomToMaxExtent();
+        map.addControl(control);
+        map.pan(5, 0, {animate:false});
+        OpenLayers.Util.getElement('edit_permalink').href = './edit.html?zoom=2&lat=0&lon=1.75781&layers=B';
+        t.eq(OpenLayers.Util.getElement('permalink').href, OpenLayers.Util.getElement('edit_permalink').href, "Panning sets permalink with existing zoom in base");
+  }
+  
+    function test_Control_Permalink_customized(t) {
+        t.plan(2);
+      
+        var argParserClass = OpenLayers.Class(OpenLayers.Control.ArgParser, {
+            CLASS_NAME: "CustomArgParser"
+        });
+      
+        control = new OpenLayers.Control.Permalink(null, "./edit.html", {
+            argParserClass: argParserClass,
+            createParams: function(center, zoom, layers) {
+                var params = OpenLayers.Control.Permalink.prototype.createParams.apply(control, arguments);
+                params.customParam = "foo";
+                return params;
+            }
+        });
+        map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        if (!map.getCenter())  map.zoomToMaxExtent();
+        map.addControl(control);
+        map.pan(5, 0, {animate:false});
+      
+        t.eq(this.map.controls[this.map.controls.length-1].CLASS_NAME, "CustomArgParser", "Custom ArgParser added correctly.");
+        t.eq(control.div.firstChild.getAttribute("href"), "./edit.html?zoom=2&lat=0&lon=1.75781&layers=B&customParam=foo", "Custom parameter encoded correctly.");
+    }
+    
+    function test_Control_Permalink_createParams(t) {
+        t.plan(18);
+
+        var baseLayer = { 'isBaseLayer': true };
+
+        var m = {
+            'getCenter': function() { return null; }
+        };
+        
+        var pl = {
+            'map': m,
+            'base': {}
+        };
+
+        old_getParameters = OpenLayers.Util.getParameters;
+        OpenLayers.Util.getParameters = function(base) {
+            t.ok(base == pl.base, "correct base sent in to Util.getParameters()");
+            return g_Params;
+        };
+        
+      //null center, null map.getCenter()
+        g_Params = {};
+        m.baseLayer = baseLayer;
+        var returnParams = OpenLayers.Control.Permalink.prototype.createParams.apply(pl, []);
+        t.ok(returnParams == g_Params, "correct params returned on null center");
+
+      //valid center, zoom, layers
+        g_Params = { 'test': {} };
+        var center = { 'lon': 1.2345678901, 'lat': 9.8765432109 };
+        var zoom = {};
+        var layers = [
+            { 'isBaseLayer': true },
+            baseLayer,
+            { 'isBaseLayer': false, 'getVisibility': function() { return true; } },
+            { 'isBaseLayer': false, 'getVisibility': function() { return false; } }
+        ];
+        var returnParams = OpenLayers.Control.Permalink.prototype.createParams.apply(pl, [center, zoom, layers]);
+
+        t.ok(returnParams.test == g_Params.test, "correct params returned from Util.getParameters() when valid center, zoom, layers");
+        t.ok(returnParams.zoom == zoom, "params.zoom set correctly when valid center, zoom, layers");
+        t.eq(returnParams.lon, 1.23457, "lon set and rounded correctly when valid center, zoom, layers");
+        t.eq(returnParams.lat, 9.87654, "lat set and rounded correctly when valid center, zoom, layers");
+        t.eq(returnParams.layers, "0BTF", "layers processed correctly when valid center, zoom, layers")
+
+
+      //null center, zoom, layers, with displayProjection
+        g_Params = { 'test': {} };
+        g_Projection = {};
+        m = {
+            'baseLayer': baseLayer,
+            'getProjectionObject':  function() { return g_Projection; },
+            'center': { 'lon': {}, 'lat': {} },
+            'getCenter': function() { return this.center; },
+            'zoom': {},
+            'getZoom': function() { return this.zoom; },
+           'layers': [
+                { 'isBaseLayer': false, 'getVisibility': function() { return true; } },
+                baseLayer,
+                { 'isBaseLayer': false, 'getVisibility': function() { return false; } },
+                { 'isBaseLayer': true }
+            ],
+            'getLayers': function() { return this.layers; }
+        };
+        pl = { 
+            'base': {},
+            'map': m,
+            'displayProjection': {}
+        };
+        
+        old_transform = OpenLayers.Projection.transform;
+        OpenLayers.Projection.transform = function(point, projObj, dispProj) {
+            t.ok(point.x = m.center.lon, "correct x value passed into transform");
+            t.ok(point.y = m.center.lat, "correct x value passed into transform");
+            t.ok(projObj == g_Projection, "correct projection object from map passed into transform");
+            t.ok(dispProj == pl.displayProjection, "correct displayProjection from control passed into transform");
+
+            return { 'x': 9.8765432109, 'y': 1.2345678901 };
+        };
+        
+        center = zoom = layers = null;
+
+        var returnParams = OpenLayers.Control.Permalink.prototype.createParams.apply(pl, [center, zoom, layers]);
+        t.ok(returnParams.test == g_Params.test, "correct params returned from Util.getParameters() when null center, zoom, layers, with displayProjection");
+        t.ok(returnParams.zoom == m.zoom, "params.zoom set correctly when null center, zoom, layers, with displayProjection");
+        t.eq(returnParams.lon, 9.87654, "lon set, transformed, and rounded correctly when null center, zoom, layers, with displayProjection");
+        t.eq(returnParams.lat, 1.23457, "lat set, transformed, and rounded correctly when null center, zoom, layers, with displayProjection");
+        t.eq(returnParams.layers, "TBF0", "layers processed correctly when null center, zoom, layers, with displayProjection");
+
+        OpenLayers.Util.getParameters = old_getParameters;
+        OpenLayers.Projection.transform = old_transform;
+    }
+    
+  </script>
+</head>
+<body>
+    <a id="permalink" href="">Permalink</a> <br />
+    <a id="edit_permalink" href="">Edit</a> <br />
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/SLDSelect.html b/tests/Control/SLDSelect.html
new file mode 100644
index 0000000..2221db7
--- /dev/null
+++ b/tests/Control/SLDSelect.html
@@ -0,0 +1,182 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(11);
+        var control = new OpenLayers.Control.SLDSelect(OpenLayers.Handler.Click);
+        t.eq(control.handler instanceof OpenLayers.Handler.Click, true, "Click handler created");
+        t.ok(control.handler.callbacks["click"] === control.select, "Click callback correctly set");
+        control.destroy();
+        control = new OpenLayers.Control.SLDSelect(OpenLayers.Handler.RegularPolygon, {handlerOptions: {irregular: true}});
+        t.eq(control.handler instanceof OpenLayers.Handler.RegularPolygon, true, "RegularPolygon handler created");
+        t.eq(control.handler.irregular, true, "RegularPolygon handler is irregular");
+        t.eq(control.handler.persist, false, "RegularPolygon handler is not persistant");
+        t.ok(control.handler.callbacks["done"] === control.select, "Done callback correctly set");
+        control.destroy();
+        control = new OpenLayers.Control.SLDSelect(OpenLayers.Handler.Polygon);
+        t.eq(control.handler instanceof OpenLayers.Handler.Polygon, true, "Polygon handler created");
+        t.ok(control.handler.callbacks["done"] === control.select, "Done callback correctly set");
+        control.destroy();
+        control = new OpenLayers.Control.SLDSelect(OpenLayers.Handler.Path);
+        t.eq(control.handler instanceof OpenLayers.Handler.Path, true, "Path handler created");
+        t.ok(control.handler.callbacks["done"] === control.select, "Done callback correctly set");
+        control.destroy();
+        var layer = new OpenLayers.Layer.WMS('Foo', 'http://foo', {LAYERS: 'A'});
+        control = new OpenLayers.Control.SLDSelect(OpenLayers.Handler.RegularPolygon, {layers: [layer]});
+        t.eq(control.layers.length, 1, "Layers property correctly set");
+        control.destroy();
+        layer.destroy();
+    }
+
+    function test_select(t) {
+        t.plan(8);
+        var parser = new OpenLayers.Format.WFSDescribeFeatureType();
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS('Foo', 'http://foo', {LAYERS: 'AAA64'});
+        map.addLayer(layer);
+
+        var text =
+            '<?xml version="1.0" encoding="ISO-8859-1" ?>' +
+            '<schema' +
+            '   targetNamespace="http://mapserver.gis.umn.edu/mapserver" ' +
+            '   xmlns:rws="http://mapserver.gis.umn.edu/mapserver" ' +
+            '   xmlns:ogc="http://www.opengis.net/ogc"' +
+            '   xmlns:xsd="http://www.w3.org/2001/XMLSchema"' +
+            '   xmlns="http://www.w3.org/2001/XMLSchema"' +
+            '   xmlns:gml="http://www.opengis.net/gml"' +
+            '   elementFormDefault="qualified" version="0.1" >' +
+            '  <import namespace="http://www.opengis.net/gml"' +
+            '          schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />' +
+            '  <element name="AAA64" ' +
+            '           type="rws:AAA64Type" ' +
+            '           substitutionGroup="gml:_Feature" />' +
+            '  <complexType name="AAA64Type">' +
+            '    <complexContent>' +
+            '      <extension base="gml:AbstractFeatureType">' +
+            '        <sequence>' +
+            '          <element name="geometry" type="gml:MultiLineStringPropertyType" minOccurs="0" maxOccurs="1"/>' +
+            '          <element name="OBJECTID" type="string"/>' +
+            '        </sequence>' +
+            '      </extension>' +
+            '    </complexContent>' +
+            '  </complexType>' +
+            '</schema>';
+
+        OpenLayers.Control.SLDSelect.prototype.wfsCache[layer.id] = parser.read(text);
+        var control = new OpenLayers.Control.SLDSelect(OpenLayers.Handler.RegularPolygon,
+            {layers: [layer], clearOnDeactivate: true, handlerOptions: {irregular: true} });
+
+        var testEvent = function(evt) {
+            t.eq(evt.filters.length, 1, "Event has a filters array set");
+            t.eq(evt.filters[0] instanceof OpenLayers.Filter.Spatial, true, "Spatial filter has been created");
+        };
+
+        control.events.register("selected", this, testEvent);
+        map.addControl(control);
+        var geometry = OpenLayers.Geometry.Polygon.createRegularPolygon(
+            new OpenLayers.Geometry.Point(0, 0), 5, 4);
+        control.select(geometry);
+        control.events.unregister("selected", this, testEvent);
+        t.eq(map.layers.length, 2, "Selection layer has been created and added to the map");
+        t.eq(map.layers[1] instanceof OpenLayers.Layer.WMS.Post, true, "A WMS Post layer has been created as the selection layer");
+        var expected_sld = '<sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"><sld:NamedLayer><sld:Name>AAA64</sld:Name><sld:UserStyle><sld:Name>default</sld:Name><sld:FeatureTypeStyle><sld:Rule><ogc:Filter xmlns:ogc= [...]
+
+        t.xml_eq(map.layers[1].params.SLD_BODY, expected_sld, "SLD generated correctly");
+
+        var geometry = OpenLayers.Geometry.Polygon.createRegularPolygon(
+            new OpenLayers.Geometry.Point(0, 0), 7, 4);
+        control.select(geometry);
+        t.eq(map.layers.length, 2, "Selection layer is reused when new selection is performed");
+
+        map.layers[0].setVisibility(false);
+        t.eq(map.layers[1].getVisibility(), false, "Visibility of selection layer is synchronized with source layer");
+        // activate would issue a SLD WMS DescribeLayer request and we are bypassing this here
+        control.active = true;
+        control.deactivate();
+        t.eq(map.layers.length, 1, "Selection layer is removed on deactive if clearOnDeactivate is set to true");
+        map.destroy();
+    }
+
+    function test_multiselect(t) {
+        t.plan(2);
+
+        var parser = new OpenLayers.Format.WFSDescribeFeatureType();
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS('Multi', 'http://foo', {LAYERS: 'KGNAT.VKUNSTWERK,KGNAT.LKUNSTWERK,KGNAT.PKUNSTWERK'});
+        map.addLayer(layer);
+
+        var text =
+            '<?xml version="1.0" encoding="ISO-8859-1" ?>' +
+            '<schema' +
+            '   targetNamespace="http://mapserver.gis.umn.edu/mapserver" ' +
+            '   xmlns:rws="http://mapserver.gis.umn.edu/mapserver" ' +
+            '   xmlns:ogc="http://www.opengis.net/ogc"' +
+            '   xmlns:xsd="http://www.w3.org/2001/XMLSchema"' +
+            '   xmlns="http://www.w3.org/2001/XMLSchema"' +
+            '   xmlns:gml="http://www.opengis.net/gml"' +
+            '   elementFormDefault="qualified" version="0.1" >' +
+            '  <import namespace="http://www.opengis.net/gml"' +
+            '          schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />' +
+            '  <element name="KGNAT.VKUNSTWERK" ' +
+            '           type="rws:KGNAT.VKUNSTWERKType" ' +
+            '           substitutionGroup="gml:_Feature" />' +
+            '  <complexType name="KGNAT.VKUNSTWERKType">' +
+            '    <complexContent>' +
+            '      <extension base="gml:AbstractFeatureType">' +
+            '        <sequence>' +
+            '          <element name="geometry" type="gml:MultiPolygonPropertyType" minOccurs="0" maxOccurs="1"/>' +
+            '        </sequence>' +
+            '      </extension>' +
+            '    </complexContent>' +
+            '  </complexType>' +
+            '  <element name="KGNAT.LKUNSTWERK" ' +
+            '           type="rws:KGNAT.LKUNSTWERKType" ' +
+            '           substitutionGroup="gml:_Feature" />' +
+            '  <complexType name="KGNAT.LKUNSTWERKType">' +
+            '    <complexContent>' +
+            '      <extension base="gml:AbstractFeatureType">' +
+            '        <sequence>' +
+            '          <element name="geometry" type="gml:MultiLineStringPropertyType" minOccurs="0" maxOccurs="1"/>' +
+            '        </sequence>' +
+            '      </extension>' +
+            '    </complexContent>' +
+            '  </complexType>' +
+            '  <element name="KGNAT.PKUNSTWERK" ' +
+            '           type="rws:KGNAT.PKUNSTWERKType" ' +
+            '           substitutionGroup="gml:_Feature" />' +
+            '  <complexType name="KGNAT.PKUNSTWERKType">' +
+            '    <complexContent>' +
+            '      <extension base="gml:AbstractFeatureType">' +
+            '        <sequence>' +
+            '          <element name="geometry" type="gml:MultiPointPropertyType" minOccurs="0" maxOccurs="1"/>' +
+            '        </sequence>' +
+            '      </extension>' +
+            '    </complexContent>' +
+            '  </complexType>' +
+            '</schema>';
+
+        OpenLayers.Control.SLDSelect.prototype.wfsCache[layer.id] = parser.read(text);
+        var control = new OpenLayers.Control.SLDSelect(OpenLayers.Handler.RegularPolygon, {handlerOptions: {irregular: true}, layers: [layer]});
+        var testEvent = function(evt) {
+            t.eq(evt.filters.length, 3, "Event has a filters array set with length tree");
+        };
+        control.events.register("selected", this, testEvent);
+
+        map.addControl(control);
+        var geometry = OpenLayers.Geometry.Polygon.createRegularPolygon(
+            new OpenLayers.Geometry.Point(0, 0), 5, 4);
+        control.select(geometry);
+        var expected_sld = '<sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"><sld:NamedLayer><sld:Name>KGNAT.VKUNSTWERK</sld:Name><sld:UserStyle><sld:Name>default</sld:Name><sld:FeatureTypeStyle><sld:Rule><ogc:Filter [...]
+
+        t.xml_eq(map.layers[1].params.SLD_BODY, expected_sld, "SLD generated correctly");
+        map.destroy();
+    }
+    
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 100px; height: 100px;"></div>
+</body>
+</html>
diff --git a/tests/Control/Scale.html b/tests/Control/Scale.html
new file mode 100644
index 0000000..7010661
--- /dev/null
+++ b/tests/Control/Scale.html
@@ -0,0 +1,53 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+    function test_Control_Scale_constructor (t) {
+        t.plan( 2 );
+    
+        control = new OpenLayers.Control.Scale();
+        t.ok( control instanceof OpenLayers.Control.Scale, "new OpenLayers.Control returns object" );
+        t.eq( control.displayClass,  "olControlScale", "displayClass is correct" );
+    }
+    function test_Control_Scale_initwithelem (t) {
+        t.plan( 1 );
+    
+        control = new OpenLayers.Control.Scale(OpenLayers.Util.getElement('scale'));
+        t.ok(true, "If this happens, then we passed. (FF throws an error above otherwise)");
+    }
+    function test_Control_Scale_updateScale (t) {
+        t.plan( 4 );
+    
+        control = new OpenLayers.Control.Scale('scale');
+        t.ok( control instanceof OpenLayers.Control.Scale, "new OpenLayers.Control returns object" );
+        map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        map.zoomTo(0);
+        map.addControl(control);
+        t.eq(OpenLayers.Util.getElement('scale').innerHTML, "Scale = 1 : 443M", "Scale set by default."  );
+        map.zoomIn();
+        t.eq(OpenLayers.Util.getElement('scale').innerHTML, "Scale = 1 : 221M", "Zooming in changes scale"  );
+        map.baseLayer.resolutions = [OpenLayers.Util.getResolutionFromScale(110)];
+        map.zoomTo(0);
+        t.eq(OpenLayers.Util.getElement('scale').innerHTML, "Scale = 1 : 110", "Scale of 100 isn't rounded"  );
+    }
+    function test_Control_Scale_internalScale (t) {
+        t.plan(2);
+        control = new OpenLayers.Control.Scale();
+        t.ok( control instanceof OpenLayers.Control.Scale, "new OpenLayers.Control returns object" );
+        map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        map.zoomTo(0);
+        map.addControl(control);
+        t.eq(control.div.firstChild.innerHTML, "Scale = 1 : 443M", "Internal scale displayed properly.");
+    }    
+  </script>
+</head>
+<body>
+    <a id="scale" href="">Scale</a> <br />
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/ScaleLine.html b/tests/Control/ScaleLine.html
new file mode 100644
index 0000000..3a3e8ac
--- /dev/null
+++ b/tests/Control/ScaleLine.html
@@ -0,0 +1,187 @@
+<html>
+<head>
+    <script type="text/javascript">var oldAlert = window.alert, gMess; window.alert = function(message) {gMess = message; return true;};</script>
+    <!-- this gmaps key generated for http://openlayers.org/dev/ -->
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghSPUCi5aRYVveCcVYxzezM4iaj_gxQ9t-UajFL70jfcpquH5l1IJ-Zyyw'></script>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+  var validkey = (window.location.protocol == "file:") ||
+                 (window.location.host == "localhost") ||
+                 (window.location.host == "openlayers.org");
+
+    function test_initialize(t) {
+        t.plan(2);    
+        var control = new OpenLayers.Control.ScaleLine();
+        t.ok(control instanceof OpenLayers.Control.ScaleLine, "new OpenLayers.Control returns object" );
+        t.eq(control.displayClass,  "olControlScaleLine", "displayClass is correct" );
+        control.destroy();
+    }
+
+    function test_initwithelem(t) {
+        t.plan(1);
+        var control = new OpenLayers.Control.ScaleLine({"div":OpenLayers.Util.getElement('ScaleLine')});
+        t.ok(true, "If this happens, then we passed. (FF throws an error above otherwise)");
+        control.destroy();
+    }
+
+    function test_calcDegrees(t) {
+        t.plan(5);
+        var control = new OpenLayers.Control.ScaleLine();
+        t.ok(control instanceof OpenLayers.Control.ScaleLine, "new OpenLayers.Control returns object" );
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        map.zoomTo(0);
+        map.addControl(control);
+        t.eq(control.div.firstChild.style.visibility, "visible", "top scale is present.");
+        t.eq(control.div.lastChild.style.visibility, "visible", "bottom scale is present.");
+        t.eq(control.div.firstChild.innerHTML, "10000 km", "top scale has correct text.");
+        t.eq(control.div.lastChild.innerHTML, "5000 mi", "bottom scale has correct text.");
+        map.destroy();
+    }
+
+    function test_calcsOther (t) {
+        t.plan(5);
+        var control = new OpenLayers.Control.ScaleLine();
+        t.ok(control instanceof OpenLayers.Control.ScaleLine, "new OpenLayers.Control returns object" );
+        var map = new OpenLayers.Map('map');
+        map.units = "mi";
+        var layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        map.zoomTo(0);
+        map.addControl(control);
+        t.eq(control.div.firstChild.style.visibility, "visible", "top scale is present.");
+        t.eq(control.div.lastChild.style.visibility, "visible", "bottom scale is present.");
+        t.eq(control.div.firstChild.innerHTML, "100 km", "top scale has correct text.");
+        t.eq(control.div.lastChild.innerHTML, "100 mi", "bottom scale has correct text.");
+        map.destroy();
+    }
+
+    function test_calcMeters (t) {        
+        t.plan(5);         
+        // this example is taken from the projected-map.html OpenLayers example
+        var lat = 900863; 
+        var lon = 235829;
+        var zoom = 6;
+        var map = new OpenLayers.Map( 'map' );
+        var basemap = new OpenLayers.Layer.WMS( "Boston", 
+          "http://boston.freemap.in/cgi-bin/mapserv?",
+                {
+                 map: '/www/freemap.in/boston/map/gmaps.map', 
+                 layers: 'border,water,roads,rapid_transit,buildings', 
+                 format: 'png', 
+                 transparent: 'off'
+                },
+        
+            {
+              maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), 
+              maxResolution: 296985/1024,  
+              projection:"EPSG:2805",     // Used in WMS/WFS requests.   
+              units: "m"                  // Only neccesary for working with scales.
+              } );
+            
+        map.addLayer(basemap);        
+        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+        map.addControl(new OpenLayers.Control.LayerSwitcher());                
+        var control = new OpenLayers.Control.ScaleLine();
+        t.ok( control instanceof OpenLayers.Control.ScaleLine, "new OpenLayers.Control returns object" );
+        map.addControl(control);
+        t.eq(control.div.firstChild.style.visibility, "visible", "top scale is present.");
+        t.eq(control.div.lastChild.style.visibility, "visible", "bottom scale is present.");
+        t.eq(control.div.firstChild.innerHTML, "200 m", "top scale has correct text.");
+        t.eq(control.div.lastChild.innerHTML, "1000 ft", "bottom scale has correct text.");
+        map.destroy();
+    }
+    
+    function test_useArguments (t) {
+        t.plan(5);
+        var control = new OpenLayers.Control.ScaleLine({topOutUnits: 'dd'} );
+        t.ok( control instanceof OpenLayers.Control.ScaleLine, "new OpenLayers.Control returns object" );
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        map.zoomTo(0);
+        map.addControl(control);
+        t.eq(control.div.firstChild.style.visibility, "visible", "top scale is present.");
+        t.eq(control.div.lastChild.style.visibility, "visible", "bottom scale is present.");
+        t.eq(control.div.firstChild.innerHTML, "100 dd", "top scale has correct text.");
+        t.eq(control.div.lastChild.innerHTML, "5000 mi", "bottom scale has correct text.");
+        map.destroy();
+    }
+
+    function test_respectZoom (t) {
+        if(validkey) {
+            t.plan( 4 );
+        } else {
+            t.plan( 3 );
+        }
+        // ok, switch the units we use for zoomed in values.  This will test that we're both
+        //   correctly respecting all specified parameters and that we're switching to the 
+        //   "in" units when zoomed in
+        var control = new OpenLayers.Control.ScaleLine({topOutUnits : "mi", bottomOutUnits: "km", topInUnits: 'ft', bottomInUnits: 'm'});
+        t.ok( control instanceof OpenLayers.Control.ScaleLine, "new OpenLayers.Control returns object" );
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS('Test Layer', "http://octo.metacarta.com/cgi-bin/mapserv", {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'});
+        map.addLayer(layer);
+        map.zoomTo(0);
+        map.addControl(control);
+        var widthIsOk = true;
+        for (var i=0; i<map.numZoomLevels && widthIsOk; i++) {
+            map.zoomTo(i);
+            var w1 = parseInt(control.eTop.style.width);
+            var w2 = parseInt(control.eBottom.style.width);
+            widthIsOk = w1 <= control.maxWidth && w2 <= control.maxWidth;
+        }
+        t.ok(widthIsOk, "respects maxWidth at all zoom levels in dd");
+        
+        widthIsOk = true;
+        control.maxWidth = 200;
+        for (var i=0; i<map.numZoomLevels && widthIsOk; i++) {
+            map.zoomTo(i);
+            var w1 = parseInt(control.eTop.style.width);
+            var w2 = parseInt(control.eBottom.style.width);
+            widthIsOk = w1 <= control.maxWidth && w2 <= control.maxWidth;
+        }
+        t.ok(widthIsOk, "respects modified maxWidth at all zoom levels in dd");
+
+        if (validkey) {
+            var map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.Google('Goog Layer');
+            var control = new OpenLayers.Control.ScaleLine({topOutUnits : "mi", bottomOutUnits: "km", topInUnits: 'ft', bottomInUnits: 'm'});
+            map.addLayer(layer);
+            map.zoomTo(0);
+            map.addControl(control);
+            var widthIsOk = true;
+            for (var i=0; i<map.numZoomLevels && widthIsOk; i++) {
+                map.zoomTo(i);
+                var w1 = parseInt(control.eTop.style.width);
+                var w2 = parseInt(control.eBottom.style.width);
+                widthIsOk = w1 <= control.maxWidth && w2 <= control.maxWidth;
+            }
+            t.ok(widthIsOk, "respects maxWidth at all zoom levels in m");
+        } else {
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);          
+        }
+
+        map.destroy();
+    }   
+    function test_ie_oneunit(t) {
+        t.plan(2);
+        var control = new OpenLayers.Control.ScaleLine({bottomOutUnits:'',bottomInUnits:'',maxWidth:150});
+        t.ok(control instanceof OpenLayers.Control.ScaleLine, "new OpenLayers.Control returns object" );
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS('Test Layer', "bogus", {});
+        map.addLayer(layer);
+        map.zoomTo(0);
+        map.addControl(control);
+        t.ok(true, "invisible bottom scale doesn't cause scaleline failure (IE only)");
+        map.destroy();
+    }
+  </script>
+</head>
+<body>
+    <a id="ScaleLine" href="">ScaleLine</a> <br/>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Control/SelectFeature.html b/tests/Control/SelectFeature.html
new file mode 100644
index 0000000..42cca0b
--- /dev/null
+++ b/tests/Control/SelectFeature.html
@@ -0,0 +1,418 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    function test_Control_SelectFeature_constructor(t) {
+        t.plan(5);
+        var options = {
+//            geometryTypes: "foo"
+        };
+        var layer = "bar";
+        var control = new OpenLayers.Control.SelectFeature([layer], options);
+        t.ok(control instanceof OpenLayers.Control.SelectFeature,
+             "new OpenLayers.Control.SelectFeature returns an instance");
+        t.eq(control.layers[0], "bar",
+             "constructor with array of layers sets layer correctly");
+//        t.eq(control.handlers.feature.geometryTypes, "foo",
+//             "constructor sets options correctly on feature handler");
+        t.ok(control.layer instanceof OpenLayers.Layer.Vector.RootContainer, "control has a root container layer if constructor was called with an array of layers");
+
+        control = new OpenLayers.Control.SelectFeature(layer, options);
+        t.eq(control.layers, null, "this.layers is null if constructor called with a single layer");
+        t.eq(control.layer, layer, "this.layer holds the layer that was passed with the constructor if called with a single layer")
+    }
+
+    function test_Control_SelectFeature_destroy(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.SelectFeature(layer, {box: true});
+        control.handlers.feature.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on feature handler");
+        }
+        control.handlers.box.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on box handler");
+        }
+// should nullify the layer property here
+        control.destroy();
+
+    }
+
+    function test_Control_SelectFeature_select(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map("map");
+        var layer1 = new OpenLayers.Layer.Vector();
+        var layer2 = new OpenLayers.Layer.Vector();
+        map.addLayers([layer1, layer2]);
+        var control = new OpenLayers.Control.SelectFeature([layer1, layer2]);
+        var feature1 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,1));
+        var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,0));
+        layer1.addFeatures(feature1);
+        layer2.addFeatures(feature2);
+        var drawFeature = function(feature, style) {
+            feature.layer.styleMap.createSymbolizer(feature, style);
+        }
+        layer1.drawFeature = drawFeature;
+        layer2.drawFeature = drawFeature;
+        control.select(feature1);
+        t.eq(feature1.renderIntent, "select", "render intent is set to select");
+        control.select(feature2);
+        t.eq(feature2.renderIntent, "select", "render intent is set to select");
+        control.unselect(feature1);
+        t.eq(feature1.renderIntent, "default", "render intent is set back to default");
+        control.unselect(feature2);
+        t.eq(feature2.renderIntent, "default", "render intent is set back to default");
+    }
+
+    function test_Control_SelectFeature_clickFeature(t) {
+        t.plan(6);
+        // mock up layer
+        var layer = {
+            selectedFeatures: [],
+            drawFeature: function() {},
+            events: {
+                triggerEvent: function() {}
+            }
+        };
+        // mock up active control
+        var control = new OpenLayers.Control.SelectFeature(layer);
+        control.handlers.feature = {
+            evt: {}
+        };
+        // mock up features
+        var features = new Array(4);
+        for(var i=0; i<features.length; ++i) {
+            features[i] = {
+                id: Math.random(),
+                tested: 0,
+                style: "",
+                layer: layer
+            };
+        }
+
+        // test that onSelect gets called properly
+        control.onSelect = function(feature) {
+            feature.tested += 1;
+            t.eq(feature.id, features[feature.index].id,
+                 "onSelect called with proper feature (" + feature.index + ")");
+            t.eq(feature.tested, feature.test,
+                 "onSelect called only once for feature (" + feature.index + ")");
+            t.ok(this == control, "onSelect called in the scope of the control if control.scope is not provided");
+        }
+
+        // test that onUnselect gets called properly
+        control.onUnselect = function(feature) {
+            feature.tested += 1;
+            t.eq(feature.id, features[feature.index].id,
+                 "onUnselect called with proper feature (" + feature.index + ")");
+            t.eq(feature.tested, feature.test,
+                 "onUnselect called only once for feature (" + feature.index + ")");
+            t.ok(this == control, "onUnselect called in the scope of the control if control.scope is not provided");
+        }
+
+        // mock up first click on first feature (runs 3 tests from onSelect)
+        var feature = features[0];
+        feature.index = 0;
+        feature.test = 1;
+        control.clickFeature(feature);
+
+        // mock up second click on first feature (runs no tests - already selected)
+        control.toggle = false;
+        control.clickFeature(feature);
+
+        // mock up second click on first feature (runs 3 tests from onUnselect)
+        control.toggle = true;
+        feature.test = 2;
+        control.clickFeature(feature);
+
+
+    }
+
+    function test_box(t) {
+        t.plan(5);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        map.setBaseLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(1,1));
+        var control = new OpenLayers.Control.SelectFeature(layer, {'multiple': true, box: true });
+        var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
+        var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,1));
+        var feature3 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(-2,-2));
+        var feature4 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(0, 0), new OpenLayers.Geometry.Point(1, 1)
+        ]));
+        layer.addFeatures([feature, feature2, feature3, feature4]);
+        control.setMap(map);
+        map.getLonLatFromPixel = function(arg) {
+            return new OpenLayers.LonLat(arg.x, arg.y);
+        }
+        control.selectBox(new OpenLayers.Bounds(-1, -1, 2, 2));
+        t.eq(layer.selectedFeatures.length, 3, "box around all features selects 3 features");
+
+        control.selectBox(new OpenLayers.Bounds(-3, -3, -1, -1));
+        t.eq(layer.selectedFeatures.length, 4, "box around other features doesn't turn off already selected features.");
+
+        control.multipleSelect = function() {
+            return false;
+        };
+        control.selectBox(new OpenLayers.Bounds(-3, -3, -1, -1));
+        t.eq(layer.selectedFeatures.length, 1, "box around other features correctly turns off already selected features.");
+
+        control.geometryTypes = null;
+        control.selectBox(new OpenLayers.Bounds(-100, -100, 100, 100));
+        t.eq(layer.selectedFeatures.length, layer.features.length, "all features selected with no geometryTypes filter");
+
+        control.geometryTypes = ["OpenLayers.Geometry.Point"];
+        control.selectBox(new OpenLayers.Bounds(-100, -100, 100, 100));
+        t.eq(layer.selectedFeatures.length, 3, "3 features selected with geometryTypes filter");
+
+
+    }
+
+    function test_Control_SelectFeature_activate(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.SelectFeature(layer, {box: true});
+        map.addControl(control);
+        t.ok(!control.handlers.feature.active,
+             "feature handler is not active prior to activating control");
+        t.ok(!control.handlers.box.active,
+             "box handler is not active prior to activating control");
+        control.activate();
+        t.ok(control.handlers.feature.active,
+             "feature handler is active after activating control");
+        t.ok(control.handlers.box.active,
+             "box handler is active after activating control");
+    }
+
+    function test_Control_SelectFeature_deactivate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.SelectFeature(layer, {box: true});
+        map.addControl(control);
+
+        control.activate();
+        control.handlers.feature.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on feature handler");
+            OpenLayers.Handler.Feature.prototype.deactivate.apply(this, arguments);
+        }
+        control.handlers.box.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on box handler");
+        }
+        control.deactivate();
+    }
+
+    function test_highlighyOnly(t) {
+        t.plan(23);
+
+        /*
+         * setup
+         */
+
+        var map, layer, ctrl1, ctrl2, _feature, feature, evt, _style;
+
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer.Vector("name", {isBaseLayer: true});
+        map.addLayer(layer);
+
+        ctrl1 = new OpenLayers.Control.SelectFeature(layer, {
+            highlightOnly: false,
+            hover: false
+        });
+        map.addControl(ctrl1);
+
+        ctrl2 = new OpenLayers.Control.SelectFeature(layer, {
+            highlightOnly: true,
+            hover: true
+        });
+        map.addControl(ctrl2);
+
+        ctrl2.activate();
+        ctrl1.activate();
+
+        feature = new OpenLayers.Feature.Vector();
+        feature.layer = layer;
+
+        // override the layer's getFeatureFromEvent func so that it always
+        // returns the feature referenced to by _feature
+        layer.getFeatureFromEvent = function(evt) { return _feature; };
+
+        evt = {xy: new OpenLayers.Pixel(Math.random(), Math.random())};
+
+        map.zoomToMaxExtent();
+
+        /*
+         * tests
+         */
+
+        // with renderIntent
+
+        ctrl1.renderIntent = "select";
+        ctrl2.renderIntent = "temporary";
+
+        // mouse over feature, feature is drawn with "temporary"
+        _feature = feature;
+        evt.type = "mousemove";
+        map.events.triggerEvent("mousemove", evt);
+        t.eq(feature.renderIntent, "temporary",
+             "feature drawn with expected render intent after \"mouseover\"");
+        t.eq(feature._lastHighlighter, ctrl2.id,
+             "feature._lastHighlighter properly set after \"mouseover\"");
+        t.eq(feature._prevHighlighter, undefined,
+             "feature._prevHighlighter properly set after \"mouseover\"");
+
+        // click in feature, feature is drawn with "select"
+        _feature = feature;
+        evt.type = "click";
+        map.events.triggerEvent("click", evt);
+        t.eq(feature.renderIntent, "select",
+             "feature drawn with expected render intent after \"clickin\"");
+        t.eq(feature._lastHighlighter, ctrl1.id,
+             "feature._lastHighlighter properly set after \"clickin\"");
+        t.eq(feature._prevHighlighter, ctrl2.id,
+             "feature._prevHighlighter properly set after \"clickin\"");
+
+        // mouse out of feature, feature is still drawn with "select"
+        _feature = null;
+        evt.type = "mousemove";
+        map.events.triggerEvent("mousemove", evt);
+        t.eq(feature.renderIntent, "select",
+             "feature drawn with expected render intent after \"mouseout\"");
+        t.eq(feature._lastHighlighter, ctrl1.id,
+             "feature._lastHighlighter properly set after \"nouseout\"");
+        t.ok(feature._prevHighlighter, ctrl2.id,
+             "feature._prevHighlighter properly set after \"mouseout\"");
+
+        // mouse over feature again, feature is drawn with "temporary"
+        _feature = feature;
+        evt.type = "mousemove";
+        map.events.triggerEvent("mousemove", evt);
+        t.eq(feature.renderIntent, "temporary",
+             "feature drawn with expected render intent after \"mouseover\"");
+        t.eq(feature._lastHighlighter, ctrl2.id,
+             "feature._lastHighlighter properly set after \"mouseover\"");
+        t.eq(feature._prevHighlighter, ctrl1.id,
+             "feature._prevHighlighter properly set after \"mouseover\"");
+
+        // mouve out of feature again, feature is still drawn with "select"
+        _feature = null;
+        evt.type = "mousemove";
+        map.events.triggerEvent("mousemove", evt);
+        t.eq(feature.renderIntent, "select",
+             "feature drawn with expected render intent after \"mouseout\"");
+        t.eq(feature._lastHighlighter, ctrl1.id,
+             "feature._lastHighlighter properly set after \"mouseout\"");
+        t.eq(feature._prevHighlighter, undefined,
+             "feature._prevHighlighter properly set after \"mouseout\"");
+
+        // click out of feature, feature is drawn with "default"
+        _feature = null;
+        evt.type = "click";
+        map.events.triggerEvent("click", evt);
+        t.eq(feature.renderIntent, "default",
+             "feature drawn with expected render intent after \"clickout\"");
+        t.eq(feature._lastHighlighter, undefined,
+             "feature._lastHighlighter properly set after \"clickout\"");
+        t.eq(feature._prevHighlighter, undefined,
+             "feature._prevHighlighter properly set after \"clickout\"");
+
+        // with selectStyle
+
+        ctrl1.selectStyle = OpenLayers.Feature.Vector.style["select"];
+        ctrl2.selectStyle = OpenLayers.Feature.Vector.style["temporary"];
+
+        layer.renderer.drawFeature = function(f, s) {
+            var style = OpenLayers.Feature.Vector.style[_style];
+            t.eq(s, style, "renderer drawFeature called with expected style obj (" + _style + ")");
+        };
+
+        // mouse over feature, feature is drawn with "temporary"
+        _feature = feature;
+        _style = "temporary";
+        evt.type = "mousemove";
+        map.events.triggerEvent("mousemove", evt);
+
+        // click in feature, feature is drawn with "select"
+        _feature = feature;
+        _style = "select";
+        evt.type = "click";
+        map.events.triggerEvent("click", evt);
+
+        // mouse out of feature, feature is still drawn with "select" and
+        // the renderer drawFeature method should not be called
+        _feature = null;
+        evt.type = "mousemove";
+        map.events.triggerEvent("mousemove", evt);
+
+        // mouse over feature again, feature is drawn with "temporary"
+        _feature = feature;
+        _style = "temporary";
+        evt.type = "mousemove";
+        map.events.triggerEvent("mousemove", evt);
+
+        // mouve out of feature again, feature is still drawn with "select"
+        _feature = null;
+        _style = "select";
+        evt.type = "mousemove";
+        map.events.triggerEvent("mousemove", evt);
+
+        // click out of feature, feature is drawn with "default"
+        _feature = null;
+        _style = "default";
+        evt.type = "click";
+        map.events.triggerEvent("click", evt);
+    }
+
+    function test_setLayer(t) {
+        t.plan(5);
+        var map = new OpenLayers.Map("map");
+        var layer1 = new OpenLayers.Layer.Vector();
+        var layer2 = new OpenLayers.Layer.Vector();
+        var layer3 = new OpenLayers.Layer.Vector();
+        map.addLayer(layer1, layer2, layer3);
+        // initialize it with a single layer
+        var control = new OpenLayers.Control.SelectFeature(layer1);
+        map.addControl(control);
+        control.activate();
+        control.setLayer([layer2, layer3]);
+        t.eq(control.layer instanceof OpenLayers.Layer.Vector.RootContainer, true, "Root container created correctly on setLayer with multiple layers");
+        t.eq(control.active, true, "Control should be active still after using setLayer");
+        t.eq((control.handlers.feature.layer === control.layer), true, "Feature handler layer set correctly");
+        control.destroy();
+        // initialize with an array of layers
+        control = new OpenLayers.Control.SelectFeature([layer1, layer2]);
+        t.eq((control.layers !== null), true, "Control has a layers property");
+        control.setLayer(layer3);
+        t.eq((control.layers === null), true, "When using setLayer with a single layer, the layers property is removed if present before");
+        map.destroy();
+    }
+
+    function test_destroy(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map("map");
+        var layer1 = new OpenLayers.Layer.Vector();
+        map.addLayer(layer1);
+        var control = new OpenLayers.Control.SelectFeature([layer1]);
+        map.addControl(control);
+        control.activate();
+        control.destroy();
+        t.eq(layer1.renderer.getRenderLayerId(), layer1.id, 
+            "Root container moved correctly when control is destroyed and layers was an array parameter");
+    }   
+   
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Control/Snapping.html b/tests/Control/Snapping.html
new file mode 100644
index 0000000..ded37b8
--- /dev/null
+++ b/tests/Control/Snapping.html
@@ -0,0 +1,334 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        
+        t.plan(5);
+        
+        // construct with a single layer
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.Snapping({
+            layer: layer
+        });
+        
+        t.ok(control.layer === layer, "[a] source layer properly set");
+        t.eq(control.targets.length, 1, "[a] one target layer");
+        t.ok(control.targets[0].layer === layer, "[a] target set");
+        control.destroy();
+        
+        // construct with a different target, default target config
+        var layer2 = new OpenLayers.Layer.Vector();
+        control = new OpenLayers.Control.Snapping({
+            layer: layer,
+            targets: [layer2]
+        });
+        
+        t.eq(control.targets.length, 1, "[b] one target layer");
+        t.ok(control.targets[0].layer == layer2, "[b] target set");
+        control.destroy();
+    }
+    
+    function test_setLayer(t) {
+        
+        t.plan(4);
+        
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.Snapping();
+        control.setLayer(layer);
+        
+        t.ok(control.layer === layer, "layer properly set");
+        
+        // confirm that the control is deactivated and reactivated when setting new layer
+        var log = {
+            activated: 0,
+            deactivated: 0
+        };
+        control.activate = function() {
+            log.activated++;
+        }
+        control.deactivate = function() {
+            log.deactivated++;
+        }
+        control.active = true;
+        
+        var layer2 = new OpenLayers.Layer.Vector();
+        control.setLayer(layer2);
+        
+        t.eq(log.deactivated, 1, "control deactivated");
+        t.ok(control.layer === layer2, "layer properly reset");
+        t.eq(log.activated, 1, "control reactivated");
+        
+        control.destroy();
+    }
+    
+    function test_setTargets(t) {
+        
+        t.plan(4);
+        
+        var layer1 = new OpenLayers.Layer.Vector();
+        var layer2 = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.Snapping();
+        
+        var log = {
+            addTarget: [],
+            addTargetLayer: []
+        };
+        control.addTarget = function(target) {
+            log.addTarget.push(target);
+        };
+        control.addTargetLayer = function(target) {
+            log.addTargetLayer.push(target);
+        };
+
+        control.setTargets([layer1, {layer: layer2}]);
+        
+        t.eq(log.addTargetLayer.length, 1, "setTargetLayer called once");
+        t.ok(log.addTargetLayer[0] === layer1, "setTargetLayer called with layer1");
+        t.eq(log.addTarget.length, 1, "setTarget called once");
+        t.ok(log.addTarget[0].layer === layer2, "setTarget called with layer2");
+        
+        control.destroy();
+    }
+    
+    function test_addTarget(t) {
+        t.plan(5);
+        
+        var layer = new OpenLayers.Layer.Vector();
+
+        var control = new OpenLayers.Control.Snapping({
+            defaults: {
+                nodeTolerance: 30,
+                tolerance: 40
+            }
+        });
+        
+        var log = {};
+        control.addTarget({layer: layer});
+        
+        t.eq(control.targets.length, 1, "single target");
+        var target = control.targets[0];
+        t.ok(target.layer === layer, "correct target layer");
+        t.eq(target.nodeTolerance, 30, "correct nodeTolerance");
+        t.eq(target.edgeTolerance, 40, "correct edgeTolerance");
+        t.eq(target.vertexTolerance, 40, "correct vertexTolerance");
+        
+        control.destroy();
+    }
+    
+    function test_removeTargetLayer(t) {
+        
+        t.plan(3);
+        
+        var layer1 = new OpenLayers.Layer.Vector();
+        var layer2 = new OpenLayers.Layer.Vector();
+        var layer3 = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.Snapping({
+            targets: [layer1, layer2, layer3]
+        });
+        
+        control.removeTargetLayer(layer2);
+        
+        t.eq(control.targets.length, 2, "correct targets length");
+        t.ok(control.targets[0].layer === layer1, "layer1 remains");
+        t.ok(control.targets[1].layer === layer3, "layer3 remains");
+        
+        control.destroy();
+        
+    }
+    
+    function test_activate(t) {
+        
+        t.plan(4);
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.Snapping({
+            layer: layer
+        });
+        
+        control.activate();
+        
+        t.eq(layer.events.listeners.sketchmodified.length, 1, "one sketchmodified listener");
+        t.ok(layer.events.listeners.sketchmodified[0].func === control.onSketchModified, "correct sketchmodified listener");
+        t.eq(layer.events.listeners.vertexmodified.length, 1, "one vertexmodified listener");
+        t.ok(layer.events.listeners.vertexmodified[0].func === control.onVertexModified, "correct vertexmodified listener");
+        
+        control.destroy();
+    }
+    
+    function test_deactivate(t) {
+        
+        t.plan(2);
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.Snapping({
+            layer: layer
+        });
+        
+        control.activate();
+        control.deactivate();
+        
+        t.eq(layer.events.listeners.sketchmodified.length, 0, "no sketchmodified listeners");
+        t.eq(layer.events.listeners.vertexmodified.length, 0, "no vertexmodified listeners");
+        
+        control.destroy();
+    }
+    
+    function test_snapping(t) {
+        
+        t.plan(46);
+        
+        var map = new OpenLayers.Map("map", {
+            resolutions: [1],
+            maxExtent: new OpenLayers.Bounds(0, 0, 100, 100)
+        });
+        
+        var layer1 = new OpenLayers.Layer.Vector(null, {
+            isBaseLayer: true
+        });
+        layer1.addFeatures([
+            new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT(
+                "LINESTRING(0 0, 10 10, 20 20, 30 30)"
+            )),
+            new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT(
+                "LINESTRING(11 10, 20 10, 30 10)"
+            ))
+        ]);
+
+        var layer2 = new OpenLayers.Layer.Vector();
+        layer2.addFeatures([
+            new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT(
+                "LINESTRING(10 10, 20 20, 30 30)"
+            )),
+            new OpenLayers.Feature.Vector(OpenLayers.Geometry.fromWKT(
+                "LINESTRING(21 10, 20 20, 20 30)"
+            ))
+        ]);
+
+        map.addLayers([layer1, layer2]);
+        map.zoomToMaxExtent();        
+        
+        var control = new OpenLayers.Control.Snapping({
+            layer: layer1,
+            targets: [layer1, layer2],
+            defaults: {tolerance: 4}
+        });
+        control.activate();
+        map.addControl(control);
+        
+        // log beforesnap, snap, and unsnap events
+        var events = [];
+        function listener(event) {
+            events.push(event);
+        }
+        control.events.on({
+            beforesnap: listener,
+            snap: listener,
+            unsnap: listener
+        });
+        
+        // create a vertex and a convenience method for mocking the drag
+        var vertex = new OpenLayers.Geometry.Point(-100, -100);
+        function drag(x, y) {
+            var px = map.getPixelFromLonLat(new OpenLayers.LonLat(x, y));
+            layer1.events.triggerEvent("vertexmodified", {
+                vertex: vertex, pixel: px
+            });
+        }
+
+        // mock up drag far from features
+        drag(-100, -100);
+        t.eq(events.length, 0, "no snapping");
+        
+        // mock up drag near first node of first feature
+        drag(0, 1);
+        t.eq(events.length, 2, "[a] 2 events triggered");
+        t.eq(events[0].type, "beforesnap", "[a] beforesnap triggered");
+        t.eq(events[0].snapType, "node", "[a] beforesnap triggered for node");
+        t.ok(events[0].point === vertex, "[a] beforesnap triggered with vertex");
+        t.eq(events[0].x, 0, "[a] beforesnap triggered correct x");
+        t.eq(events[0].y, 0, "[a] beforesnap triggered with correct y");
+        t.eq(events[1].type, "snap", "[a] snap triggered");
+        t.eq(events[1].snapType, "node", "[a] snap triggered for node");
+        t.ok(events[1].point === vertex, "[a] snap triggered with point");
+        t.eq(events[1].distance, 1, "[a] snap triggered correct distance");
+        t.ok(events[1].layer === layer1, "[a] snap triggered with correct target layer");
+        t.eq(vertex.x, 0, "[a] vertex x modified");
+        t.eq(vertex.y, 0, "[a] vertex y modified");
+        events = [];
+        
+        // mock up drag that unsnaps
+        drag(-100, -50);
+        t.eq(events.length, 1, "[b] 1 event triggered");
+        t.eq(events[0].type, "unsnap", "[b] unsnap triggered");
+        t.ok(events[0].point === vertex, "[b] unsnap triggered with vertex");
+        t.eq(vertex.x, -100, "[b] vertex x unsnapped");
+        t.eq(vertex.y, -50, "[b] vertex y unsnapped");
+        events = [];
+        
+        // drag near node of second feature in first layer to demonstrate precedence of node snapping
+        drag(9, 10);
+        t.eq(events.length, 2, "[c] 2 events triggered");
+        t.eq(events[0].type, "beforesnap", "[c] beforesnap triggered first");
+        t.eq(events[1].type, "snap", "[c] snap triggered second");
+        t.eq(events[1].snapType, "node", "[c] snap to node");
+        // unsnap & reset
+        drag(-100, -50);
+        events = [];
+        
+        // drag near node of second feature in second layer to demonstrate greedy property
+        // with greedy true (default) the best target from the first layer with eligible targets is used
+        drag(22, 10);
+        t.eq(events.length, 2, "[d] 2 events triggered");
+        t.eq(events[1].type, "snap", "[d] snap triggered second");
+        t.eq(events[1].snapType, "vertex", "[d] snap to vertex");
+        t.ok(events[1].layer === layer1, "[d] snap to vertex in first layer");
+        t.eq(vertex.x, 20, "[d] vertex x modified");
+        t.eq(vertex.y, 10, "[d] vertex y modified");
+        // unsnap & reset
+        drag(-100, -50);
+        events = [];
+        
+        // do the same drag but with greedy false - this will look for best target in all layers
+        control.greedy = false;
+        drag(22, 10);
+        t.eq(events.length, 2, "[d] 2 events triggered");
+        t.eq(events[1].type, "snap", "[d] snap triggered second");
+        t.eq(events[1].snapType, "node", "[d] snap to node");
+        t.ok(events[1].layer === layer2, "[d] snap to node in second layer");
+        // unsnap & reset        
+        drag(-100, -50);
+        control.greedy = true;
+        events = [];        
+        
+        // demonstrate snapping on sketchstarted
+        var p = new OpenLayers.Geometry.Point(0, 1);
+        layer1.events.triggerEvent("sketchstarted", {
+            vertex: p,
+            feature: new OpenLayers.Feature.Vector(p)
+        });
+        t.eq(events.length, 2, "[sketchstarted] 2 events triggered");
+        t.eq(events[0].type, "beforesnap", "[sketchstarted] beforesnap triggered");
+        t.eq(events[0].snapType, "node", "[sketchstarted] beforesnap triggered for node");
+        t.ok(events[0].point === p, "[sketchstarted] beforesnap triggered with vertex");
+        t.eq(events[0].x, 0, "[sketchstarted] beforesnap triggered correct x");
+        t.eq(events[0].y, 0, "[sketchstarted] beforesnap triggered with correct y");
+        t.eq(events[1].type, "snap", "[sketchstarted] snap triggered");
+        t.eq(events[1].snapType, "node", "[sketchstarted] snap triggered for node");
+        t.ok(events[1].point === p, "[sketchstarted] snap triggered with point");
+        t.eq(events[1].distance, 1, "[sketchstarted] snap triggered correct distance");
+        t.ok(events[1].layer === layer1, "[sketchstarted] snap triggered with correct target layer");
+        t.eq(p.x, 0, "[sketchstarted] vertex x modified");
+        t.eq(p.y, 0, "[sketchstarted] vertex y modified");
+        // reset
+        events = [];        
+        
+        map.destroy();
+
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 100px; height: 100px;"></div>
+</body>
+</html>
diff --git a/tests/Control/Split.html b/tests/Control/Split.html
new file mode 100644
index 0000000..0e4df0b
--- /dev/null
+++ b/tests/Control/Split.html
@@ -0,0 +1,296 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        
+        t.plan(4);
+
+        var layer = new OpenLayers.Layer.Vector();
+        var control;
+        
+        // construct with nothing
+        control = new OpenLayers.Control.Split();
+        t.ok(control instanceof OpenLayers.Control, "instanceof OpenLayers.Control");
+        t.ok(control instanceof OpenLayers.Control, "instanceof OpenLayers.Control.Split")
+        control.destroy();
+        
+        // construct with a single target layer
+        control = new OpenLayers.Control.Split({
+            layer: layer
+        });        
+        t.ok(control.layer === layer, "target layer properly set");
+        control.destroy();
+        
+        // construct with same target and source
+        control = new OpenLayers.Control.Split({
+            layer: layer,
+            source: layer
+        });        
+        t.ok(control.source === layer, "source layer properly set");
+        control.destroy();
+    }
+    
+    function test_setSource(t) {
+        t.plan(5);
+        
+        var layer1 = new OpenLayers.Layer.Vector();
+        var layer2 = new OpenLayers.Layer.Vector();
+        
+        var control = new OpenLayers.Control.Split({layer: layer1});
+
+        var map = new OpenLayers.Map("map");
+        map.addLayers([layer1, layer2]);
+        map.addControl(control);
+        control.activate();
+        
+        // confirm sketch hander created
+        t.ok(control.handler, "sketch handler created");
+        t.eq(control.handler.active, true, "sketch handler active");
+        
+        control.setSource(layer1);
+        t.ok(control.source === layer1, "layer1 properly set");
+        t.ok(!control.handler, "no more sketch handler");
+        
+        // activate and switch to new source layer
+        control.setSource(layer2);
+        t.ok(control.source === layer2, "layer2 properly set");
+        
+        map.destroy();
+        
+    }
+    
+    function test_activate(t) {
+        t.plan(8);
+        
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.Split({layer: layer});
+        var map = new OpenLayers.Map("map");
+        map.addLayer(layer);
+        map.addControl(control);
+        
+        // test activation with no source layer
+        control.activate();
+        t.eq(control.active, true, "control is active");
+        t.ok(control.handler instanceof OpenLayers.Handler.Path, "line sketch handler created");
+        t.ok(control.handler.callbacks.done, "done callback set on sketch handler");
+        t.eq(control.handler.active, true, "sketch handler is active");
+        
+        // change the source layer - this should call activate again
+        control.setSource(layer);
+        
+        t.eq(control.active, true, "control is still active");
+        t.ok(control.source === layer, "source layer set");
+        t.ok(layer.events.listeners.sketchcomplete, "sketchcomplete listener registered");
+        t.ok(layer.events.listeners.afterfeaturemodified, "afterfeaturemodified listener registered");
+        
+        map.destroy();
+        
+    }
+    
+    function test_deactivate(t) {
+        
+        t.plan(7);
+        
+        var layer = new OpenLayers.Layer.Vector();
+        var control = new OpenLayers.Control.Split({layer: layer});
+        var map = new OpenLayers.Map("map");
+        map.addLayer(layer);
+        map.addControl(control);
+        
+        // activate and check sketch handler
+        control.activate();
+        t.ok(control.handler, "sketch handler present");
+        t.eq(control.handler.active, true, "sketch handler active");
+        
+        // deactivate and check sketch handler
+        control.deactivate();
+        t.eq(control.handler.active, false, "sketch handler deactivated");
+        
+        // set a source layer
+        control.setSource(layer);
+
+        // activate and check that listeners are registered
+        control.activate();
+        t.ok(layer.events.listeners.sketchcomplete, "sketchcomplete listener registered");
+        t.ok(layer.events.listeners.afterfeaturemodified, "afterfeaturemodified listener registered");
+
+        // deactivate and confirm no draw related events
+        control.deactivate();
+        t.eq(layer.events.listeners.sketchcomplete.length, 0, "no sketchcomplete listeners");
+        t.eq(layer.events.listeners.afterfeaturemodified.length, 0, "no afterfeaturemodified listeners");
+        
+        map.destroy();
+    }
+    
+    function test_isEligible(t) {
+        
+        t.plan(9);
+        
+        var control = new OpenLayers.Control.Split();
+        var geometry = OpenLayers.Geometry.fromWKT("LINESTRING(0 1, 1 2)");
+        var feature = new OpenLayers.Feature.Vector(
+            geometry,
+            {foo: "bar"}
+        );
+        
+        t.eq(control.isEligible(feature), true, "plain old feature is eligible");
+        
+        feature.state = OpenLayers.State.DELETE;
+        t.eq(control.isEligible(feature), false, "feature slated for deletion is not eligible");
+        delete feature.state;
+        t.eq(control.isEligible(feature), true, "feature with no state is eligible");
+        
+        feature.geometry = new OpenLayers.Geometry.Point(1, 1);
+        t.eq(control.isEligible(feature), false, "feature with point geometry is not eligible");
+        feature.geometry = new OpenLayers.Geometry.MultiLineString([geometry]);
+        t.eq(control.isEligible(feature), true, "feature with multilinestring geometry is eligible");
+        
+        control.feature = feature;
+        t.eq(control.isEligible(feature), false, "source feature is not eligible as target");
+        control.feature = new OpenLayers.Feature.Vector();
+        t.eq(control.isEligible(feature), true, "feature is eligible if different than source feature");
+        
+        control.targetFilter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+            property: "foo",
+            value: "bar"
+        });
+        t.eq(control.isEligible(feature), false, "feature is not eligible unless it matches filter");
+        control.targetFilter.value = "baz";
+        t.eq(control.isEligible(feature), true, "feature is eligible if it matches filter");
+        
+        control.destroy();
+        
+    }
+    
+    function test_considerSplit(t) {
+
+        var layer = new OpenLayers.Layer.Vector();
+        
+        var wkt = OpenLayers.Geometry.fromWKT;
+        var geoms = {
+            abc: wkt("LINESTRING(0 0, 2 2)"),
+            ab: wkt("LINESTRING(0 0, 1 1)"),
+            bc: wkt("LINESTRING(1 1, 2 2)"),
+            dbe: wkt("LINESTRING(2 0, 0 2)"),
+            db: wkt("LINESTRING(2 0, 1 1)"),
+            be: wkt("LINESTRING(1 1, 0 2)")
+        };
+        
+        var Feature = OpenLayers.Feature.Vector;
+        var feats = {
+            abc: new Feature(geoms.abc),
+            ab: new Feature(geoms.ab),
+            bc: new Feature(geoms.bc),
+            dbe: new Feature(geoms.dbe),
+            db: new Feature(geoms.db),
+            be: new Feature(geoms.be)
+        };
+        
+        function feature(id, options) {
+            var f = OpenLayers.Util.extend(feats[id].clone(), options);
+            // for testing, we want to check when features are destroyed
+            f.destroy = function() {
+                f.state = "destroyed";
+            }
+            return f;
+        }
+        var DELETE = OpenLayers.State.DELETE;
+        var INSERT = OpenLayers.State.INSERT;
+        var UPDATE = OpenLayers.State.UPDATE;
+        
+        var cases = [{
+            targets: [
+                feature("abc")
+            ],
+            source: feature("dbe"),
+            splits: [{
+                original: feature("abc", {state: "destroyed"}),
+                features: [feature("ab", {state: INSERT}), feature("bc", {state: INSERT})]
+            }, {
+                original: feature("dbe", {state: "destroyed"}),
+                features: [feature("db", {state: INSERT}), feature("be", {state: INSERT})]
+            }]
+        }, {
+            options: {deferDelete: true},
+            targets: [
+                feature("abc", {state: INSERT})
+            ],
+            source: feature("dbe"),
+            splits: [{
+                original: feature("abc", {state: "destroyed"}),
+                features: [feature("ab", {state: INSERT}), feature("bc", {state: INSERT})]
+            }, {
+                original: feature("dbe", {state: DELETE}),
+                features: [feature("db", {state: INSERT}), feature("be", {state: INSERT})]
+            }]
+        }, {
+            options: {deferDelete: true},
+            targets: [
+                feature("abc", {state: UPDATE})
+            ],
+            source: feature("dbe", {state: INSERT}),
+            splits: [{
+                original: feature("abc", {state: DELETE}),
+                features: [feature("ab", {state: INSERT}), feature("bc", {state: INSERT})]
+            }, {
+                original: feature("dbe", {state: "destroyed"}),
+                features: [feature("db", {state: INSERT}), feature("be", {state: INSERT})]
+            }]
+        }];
+        
+        var count = 0;
+        var c, control, options, log, event, split;
+        for(var i=0; i<cases.length; ++i) {
+            c = cases[i];
+            ++count; // test number of splits
+            for(var j=0; j<c.splits.length; ++j) {
+                split = c.splits[j];
+                ++count; // test original state
+                ++count; // test original geometry
+                ++count; // test number of parts
+                for(var k=0; k<split.features.length; ++k) {
+                    ++count; // test part state
+                    ++count; // test part geometry
+                }
+            }
+        }
+        t.plan(count);
+
+        for(var i=0; i<cases.length; ++i) {
+            c = cases[i];
+            log = {events: []};
+            options = OpenLayers.Util.extend({layer: layer, source: layer}, c.options);
+            control = new OpenLayers.Control.Split(options);
+            control.events.on({
+                split: function(e) {
+                    log.events.push(e);
+                }
+            });
+            layer.features = c.targets;
+            control.considerSplit(c.source);
+            t.eq(log.events.length, c.splits.length, "case " + i + ": correct number of split events");
+            for(var j=0; j<log.events.length; ++j) {
+                event = log.events[j];
+                split = c.splits[j];
+                t.eq(event.original.state, split.original.state, "case " + i + " split " + j + ": correct original state");
+                t.geom_eq(event.original.geometry, split.original.geometry, "case " + i + " split " + j + ": correct original geometry");
+                t.eq(event.features.length, split.features.length, "case " + i + " split " + j + ": correct number of parts");
+                for(var k=0; k<split.features.length; ++k) {
+                    t.eq(event.features[k].state, split.features[k].state, "case " + i + " split " + j + " feature " + k + ": correct state");
+                    t.geom_eq(event.features[k].geometry, split.features[k].geometry, "case " + i + " split " + j + " feature " + k + ": correct geometry");
+                }
+            }
+            control.destroy();
+        }
+        
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 100px; height: 100px;"></div>
+</body>
+</html>
diff --git a/tests/Control/TransformFeature.html b/tests/Control/TransformFeature.html
new file mode 100644
index 0000000..44a53e1
--- /dev/null
+++ b/tests/Control/TransformFeature.html
@@ -0,0 +1,83 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(6);
+        var layer = "foo";
+        var control = new OpenLayers.Control.TransformFeature(layer);
+        
+        t.ok(control.layer == layer,
+             "constructor sets layer correctly");
+        t.ok(control.dragControl instanceof OpenLayers.Control.DragFeature,
+             "constructor sets the drag control correctly");
+        t.ok(control.box instanceof OpenLayers.Feature.Vector,
+             "box feature created");
+        t.eq(control.handles.length, 8, "8 handles created");
+        t.eq(control.rotationHandles.length, 4, "4 rotation handles created")
+        t.eq(typeof control.rotationHandleSymbolizer, "object",
+            "rotationHandleSymbolizer initialized");
+        control.destroy();
+    }
+
+    function test_destroy(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.TransformFeature(layer);
+        control.dragControl.destroy = function() {
+            t.ok(true,
+                 "control.destroy calls destroy on drag control");
+        };
+        control.destroy();
+        map.destroy();
+    }
+    
+    function test_activate(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector();
+        map.addLayer(layer);
+        var control = new OpenLayers.Control.TransformFeature(layer);
+        map.addControl(control);
+        
+        t.ok(!control.dragControl.active,
+             "drag control is not active prior to activating control");
+        control.activate();
+        t.ok(control.dragControl.active,
+             "drag control is active after activating control");
+        t.ok(control.box.layer === layer, "box added to layer");
+
+        map.destroy();
+    }
+    
+    function test_setFeature(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map("map", {allOverlays: true});
+        var layer = new OpenLayers.Layer.Vector();
+        var feature = new OpenLayers.Feature.Vector(
+            OpenLayers.Geometry.fromWKT("POLYGON((-1 -1, 1 -1, 1 1, -1 1))"));
+        layer.addFeatures([feature]);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0, 0), 18);
+        var control = new OpenLayers.Control.TransformFeature(layer);
+        map.addControl(control);
+        control.setFeature(feature);
+        
+        t.ok(control.active, "control activated on setFeature");
+        t.ok(feature.geometry.getBounds().equals(control.box.geometry.getBounds()), "box positioned correctly");
+        t.geom_eq(control.handles[0].geometry, control.box.geometry.components[0], "handle positioned with box");
+        
+        var center = new OpenLayers.LonLat(1, 1);
+        control.box.move(center);
+        t.geom_eq(control.handles[0].geometry, control.box.geometry.components[0], "handle moved with box");
+    }
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Control/WMSGetFeatureInfo.html b/tests/Control/WMSGetFeatureInfo.html
new file mode 100644
index 0000000..c566f90
--- /dev/null
+++ b/tests/Control/WMSGetFeatureInfo.html
@@ -0,0 +1,511 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(5);
+
+        var options = {
+            url: 'http://localhost/wms',
+            layers: ["foo"],
+            formatOptions: {
+                foo: "bar"
+            }
+        };
+        var control = new OpenLayers.Control.WMSGetFeatureInfo(options);
+        t.ok(control instanceof OpenLayers.Control.WMSGetFeatureInfo,
+             "new OpenLayers.Control.WMSGetFeatureInfo returns an instance");
+        t.eq(control.url, 'http://localhost/wms',
+             "constructor sets url correctly");
+        t.eq(control.layers, ["foo"],
+             "constructor layers"
+            );
+        t.ok(control.format instanceof OpenLayers.Format.WMSGetFeatureInfo, "format created");
+        t.eq(control.format.foo, "bar", "format options used")
+    }
+
+    function test_clickCallBack_option(t) {
+        t.plan(9);
+
+        var control;
+
+        control = new OpenLayers.Control.WMSGetFeatureInfo({
+            hover: true
+        });
+        t.ok(control.handler instanceof OpenLayers.Handler.Hover,
+             'constructor creates hover handler');
+        t.ok(control.handler.callbacks["move"] === control.cancelHover,
+             'constructor registers proper "move" callback in handler');
+        t.ok(control.handler.callbacks["pause"] === control.getInfoForHover,
+             'constructor registers proper "pause" callback in handler');
+
+        control = new OpenLayers.Control.WMSGetFeatureInfo();
+        t.ok(control.handler instanceof OpenLayers.Handler.Click,
+             'constructor creates click handler');
+        t.ok(control.handler.callbacks["click"] === control.getInfoForClick,
+             'constructor registers proper "click" callback in handler');
+
+        control = new OpenLayers.Control.WMSGetFeatureInfo({
+            clickCallback: "rightclick"
+        });
+        t.ok(control.handler.callbacks["rightclick"] === control.getInfoForClick,
+             'constructor registers proper "rightclick" callback in handler');
+
+        control = new OpenLayers.Control.WMSGetFeatureInfo({
+            clickCallback: "dblclick",
+            handlerOptions: {
+                click: {
+                    "single": false,
+                    "double": true
+                }
+            }
+        });
+        t.ok(control.handler.callbacks["dblclick"] === control.getInfoForClick,
+             'constructor registers proper "dblclick" callback in handler');
+        t.eq(control.handler["single"], false,
+             'constructor sets "single" to false in handler');
+        t.eq(control.handler["double"], true,
+             'constructor sets "double" to true in handler');
+     }
+
+    function test_destroy(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var click = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            layers: ["foo"]
+        });
+
+        var hover = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            layers: ["foo"],
+            hover: true
+        });
+
+        click.handler.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on click handler");
+        };
+        hover.handler.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on hover handler");
+        };
+        click.destroy();
+        hover.destroy();
+    }
+
+    function test_click(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map('map');
+
+        // mock up active control
+        var control = new OpenLayers.Control.WMSGetFeatureInfo();
+        map.addControl(control);
+        control.activate();
+
+        control.request = function(position) {
+            t.eq(position.x, 50,
+                 "x position is as expected");
+            t.eq(position.y, 50,
+                 "y position is as expected");
+        };
+
+        control.getInfoForClick({xy: {x: 50, y: 50}});
+        control.getInfoForHover({xy: {x: 50, y: 50}});
+    }
+
+    function test_beforegetfeatureinfo_event(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+
+        var xy, mode;
+
+        // mock up active control
+        var control = new OpenLayers.Control.WMSGetFeatureInfo({
+            request: function(position) {},
+            eventListeners: {
+                beforegetfeatureinfo: function(evt) {
+                    t.eq(evt.xy, xy,
+                         "beforegetfeatureinfo listener gets " +
+                         "expected xy (" + mode + ")");
+                }
+            }
+        });
+        map.addControl(control);
+        control.activate();
+
+        // 1 test
+        mode = "click";
+        xy = {x: 50, y: 50};
+        control.getInfoForClick({xy: xy});
+
+        // 1 test
+        mode = "hover";
+        xy = {x: 70, y: 70};
+        control.getInfoForHover({xy: xy});
+    }
+
+    function test_nogetfeatureinfo_event(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        // mock up active control
+        var control = new OpenLayers.Control.WMSGetFeatureInfo({
+            eventListeners: {
+                nogetfeatureinfo: function(evt) {
+                    t.ok((evt.type == "nogetfeatureinfo"), "nogetfeatureinfo listener gets called when there are no queryable layers");
+                }
+            }
+        });
+        map.addControl(control);
+        control.activate();
+
+        // 1 test
+        mode = "click";
+        xy = {x: 50, y: 50};
+        control.getInfoForClick({xy: xy});
+    }
+
+    function test_activate(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map("map");
+        var click = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            featureType: 'type',
+            featureNS: 'http://localhost/ns',
+            layers: 'ns:type'
+        });
+        var hover = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            featureType: 'type',
+            featureNS: 'http://localhost/ns',
+            layers: 'ns:type',
+            hover: true
+        });
+        map.addControl(click);
+        map.addControl(hover);
+        t.ok(!click.handler.active,
+             "click handler is not active prior to activating control");
+        t.ok(!hover.handler.active,
+             "hover handler is not active prior to activating control");
+        click.activate();
+        hover.activate();
+        t.ok(click.handler.active,
+             "click handler is active after activating control");
+        t.ok(hover.handler.active,
+             "hover handler is active after activating control");
+    }
+
+    function test_deactivate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var click = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            featureType: 'type',
+            featureNS: 'http://localhost/ns',
+            layers: 'ns:type'
+        });
+        var hover = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            featureType: 'type',
+            featureNS: 'http://localhost/ns',
+            layers: 'ns:type'
+        });
+        map.addControl(click);
+        map.addControl(hover);
+        click.activate();
+        hover.activate();
+
+        click.handler.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on click handler");
+            OpenLayers.Handler.Click.prototype.deactivate.apply(this, arguments);
+        };
+        hover.handler.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on hover handler");
+            OpenLayers.Handler.Hover.prototype.deactivate.apply(this, arguments);
+        };
+        click.deactivate();
+        hover.deactivate();
+    }
+
+    // Verify that things work all right when we combine different types for the STYLES and LAYERS
+    // params in the WMS Layers involved
+    function test_mixedParams(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map("map", {
+            getExtent: function() {return(new OpenLayers.Bounds(-180,-90,180,90));}
+            }
+        );
+
+        var a = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+            layers: "a,b,c,d",
+            styles: "a,b,c,d"
+        });
+
+        var b = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+            layers: ["a","b","c","d"],
+            styles: ["a","b","c","d"]
+        });
+
+        var c = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+            layers: ["a","b","c","d"]
+        });
+
+        var d = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+            layers: "a,b,c,d"
+        });
+
+        var click = new OpenLayers.Control.WMSGetFeatureInfo({
+            featureType: 'type',
+            featureNS: 'ns',
+            layers: [a, b, c, d]
+        });
+
+        map.addControl(click);
+
+        var log = {};
+        var _request = OpenLayers.Request.GET;
+        OpenLayers.Request.GET = function(options) {
+            log.options = options;
+        };
+        click.activate();
+        click.getInfoForClick({xy: {x: 50, y: 50}});
+        OpenLayers.Request.GET = _request;
+
+        t.eq(
+            log.options && log.options.url,
+            "http://localhost/wms",
+            "url from first layer used"
+        );
+        t.eq(
+            log.options && log.options.params.STYLES.join(","),
+            "a,b,c,d,a,b,c,d,,,,,,,,",
+            "Styles merged correctly"
+        );
+
+        t.eq(
+            log.options && log.options.params.FORMAT,
+            "image/jpeg",
+            "Required 'format' parameter included"
+ 	    );
+
+    }
+
+    function test_urlMatches(t) {
+
+        t.plan(5);
+
+        var control = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: "http://host/wms?one=1&two=2"
+        });
+
+        t.ok(!control.urlMatches("foo"), "doesn't match garbage");
+        t.ok(control.urlMatches("http://host:80/wms?two=2&one=1"), "matches equivalent url");
+
+        // give the control more urls to match from
+        control.layerUrls = ["http://a.host/wms", "http://b.host/wms"];
+
+        t.ok(control.urlMatches("http://host:80/wms?two=2&one=1"), "still matches equivalent url");
+        t.ok(control.urlMatches("http://a.host:80/wms"), "matches equivalent of first of layerUrls");
+        t.ok(control.urlMatches("http://b.host:80/wms"), "matches equivalent of second of layerUrls");
+
+    }
+
+    function test_layerUrls(t) {
+
+        t.plan(4);
+        var map = new OpenLayers.Map({
+            div: "map",
+            getExtent: function() {
+                return new OpenLayers.Bounds(-180,-90,180,90);
+            }
+        });
+
+        var a = new OpenLayers.Layer.WMS(
+            null, "http://a.mirror/wms", {layers: "a"}
+        );
+        var b = new OpenLayers.Layer.WMS(
+            null, "http://b.mirror/wms", {layers: "b"}
+        );
+        var c = new OpenLayers.Layer.WMS(
+            null, ["http://c.mirror/wms", "http://d.mirror/wms"], {layers: "c"}
+        );
+
+        var control = new OpenLayers.Control.WMSGetFeatureInfo({
+            url: "http://host/wms",
+            layers: [a, b, c]
+        });
+        map.addControl(control);
+        control.activate();
+
+        // log calls to GET
+        var log;
+        var _request = OpenLayers.Request.GET;
+        OpenLayers.Request.GET = function(options) {
+            log.options = options;
+        };
+
+        // control url doesn't match layer urls, no request issued
+        log = {};
+        control.getInfoForClick({xy: {x: 50, y: 50}});
+        t.ok(!log.options, "no url match, no request issued");
+
+        // give control a list of urls to match
+        log = {};
+        control.layerUrls = ["http://a.mirror/wms", "http://b.mirror/wms"];
+        control.getInfoForClick({xy: {x: 50, y: 50}});
+        t.eq(log.options && log.options.url, "http://host/wms", "some match, request issued");
+        t.eq(log.options && log.options.params["QUERY_LAYERS"].join(","), "a,b", "selected layers queried");
+
+        // show that a layer can be matched if it has a urls array itself (first needs to be matched)
+        log = {};
+        control.layerUrls = ["http://c.mirror/wms"];
+        control.getInfoForClick({xy: {x: 50, y: 50}});
+        t.eq(log.options && log.options.params["QUERY_LAYERS"].join(","), "c", "layer with urls array can be queried");
+
+        // clean up
+        OpenLayers.Request.GET = _request;
+        map.destroy();
+
+    }
+    
+    function test_hover(t) {
+        
+        t.plan(2);
+        
+        var map = new OpenLayers.Map({
+            div: "map",
+            layers: [
+                new OpenLayers.Layer.WMS(null, "/dummywms", {layers: "one"})
+            ],
+            center: new OpenLayers.LonLat(0, 0),
+            zoom: 1
+        });
+        
+        var control = new OpenLayers.Control.WMSGetFeatureInfo({
+            hover: true
+        });
+        map.addControl(control);
+        control.activate();
+        
+        // mock up a mousemove
+        control.getInfoForHover({xy: new OpenLayers.Pixel(10, 10)});
+        t.ok(!!control.hoverRequest, "hoverRequest set");
+        
+        // confirm that request is canceled on next move
+        var called = 0;
+        control.hoverRequest.abort = function() {
+            ++called;
+        };
+        control.handler.px = null;
+        control.handler.mousemove({xy: new OpenLayers.Pixel(20, 20)});
+        t.eq(called, 1, "hover request aborted");
+        
+        map.destroy();
+        
+    }
+
+    function test_drillDown(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map("map", {
+            getExtent: function() {return(new OpenLayers.Bounds(-180,-90,180,90));}
+            }
+        );
+
+        var a = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+            layers: "a"
+        });
+
+        var b = new OpenLayers.Layer.WMS("dummy","http://localhost/wms", {
+            layers: "c"
+        });
+
+        var c = new OpenLayers.Layer.WMS("dummy","http://myhost/wms", {
+            layers: "x"
+        });
+
+        map.addLayers([a, b, c]);
+
+        var click = new OpenLayers.Control.WMSGetFeatureInfo({
+            drillDown: true
+        });
+
+        map.addControl(click);
+
+        var count = 0;
+        var _request = OpenLayers.Request.GET;
+        OpenLayers.Request.GET = function(options) {
+            count++;
+            if (count == 1) {
+                t.eq(options.params["QUERY_LAYERS"].join(","), "a,c", "Layers should be grouped by service url");
+                t.eq(options.url, "http://localhost/wms", "Correct url used for first request");
+            } else if (count == 2) {
+                t.eq(options.url, "http://myhost/wms", "Correct url used for second request");
+            }
+        };
+        click.activate();
+        click.getInfoForClick({xy: {x: 50, y: 50}});
+        OpenLayers.Request.GET = _request;
+        t.eq(count, 2, "We expect 2 requests to go off");
+        map.destroy();
+    }
+
+    function test_GetFeatureInfo_WMS13(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map("map", {
+            getExtent: function() {return(new OpenLayers.Bounds(-180,-90,180,90));}
+            }
+        );
+
+        var a = new OpenLayers.Layer.WMS(null, "http://localhost/wms", {
+            layers: "a",
+            version: "1.3.0"
+        });
+        map.addLayer(a);
+
+        var click = new OpenLayers.Control.WMSGetFeatureInfo({
+        });
+
+        map.addControl(click);
+        var log = {};
+        var _request = OpenLayers.Request.GET;
+        OpenLayers.Request.GET = function(options) {
+            log.options = options;
+        };
+        click.activate();
+        click.getInfoForClick({xy: {x: 50, y: 60}});
+        OpenLayers.Request.GET = _request;
+        t.eq(
+            log.options && log.options.params.CRS,
+            "EPSG:4326",
+            "Since it is WMS 1.3 use CRS parameter instead of SRS in the GetFeatureInfo request"
+        );
+
+        t.eq(
+            log.options && log.options.params.I,
+            50,
+            "Since it is WMS 1.3 use I parameter instead of X in the GetFeatureInfo request"
+        );
+
+        t.eq(
+            log.options && log.options.params.J,
+            60,
+            "Since it is WMS 1.3 use J parameter instead of Y in the GetFeatureInfo request"
+        );
+
+        t.eq(
+            log.options && log.options.params.BBOX,
+            "-90,-180,90,180",
+            "Since it is WMS 1.3 the BBOX should respect axis order"
+        );
+
+    }
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Control/WMTSGetFeatureInfo.html b/tests/Control/WMTSGetFeatureInfo.html
new file mode 100644
index 0000000..14597d5
--- /dev/null
+++ b/tests/Control/WMTSGetFeatureInfo.html
@@ -0,0 +1,334 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(4);
+
+        var options = {
+            url: "http://localhost/wmts",
+            layers: ["foo"],
+            formatOptions: {
+                foo: "bar"
+            }
+        };
+        var control = new OpenLayers.Control.WMTSGetFeatureInfo(options);
+        t.ok(control instanceof OpenLayers.Control.WMTSGetFeatureInfo,
+             "new OpenLayers.Control.WMTSGetFeatureInfo returns an instance");
+        t.eq(control.layers, ["foo"],
+             "constructor layers"
+            );
+        t.ok(control.format instanceof OpenLayers.Format.WMSGetFeatureInfo, "format created");
+        t.eq(control.format.foo, "bar", "format options used")
+    }
+
+    function test_clickCallBack_option(t) {
+        t.plan(9);
+
+        var control;
+
+        control = new OpenLayers.Control.WMTSGetFeatureInfo({
+            hover: true
+        });
+        t.ok(control.handler instanceof OpenLayers.Handler.Hover,
+             'constructor creates hover handler');
+        t.ok(control.handler.callbacks["move"] === control.cancelHover,
+             'constructor registers proper "move" callback in handler');
+        t.ok(control.handler.callbacks["pause"] === control.getInfoForHover,
+             'constructor registers proper "pause" callback in handler');
+
+        control = new OpenLayers.Control.WMTSGetFeatureInfo();
+        t.ok(control.handler instanceof OpenLayers.Handler.Click,
+             'constructor creates click handler');
+        t.ok(control.handler.callbacks["click"] === control.getInfoForClick,
+             'constructor registers proper "click" callback in handler');
+
+        control = new OpenLayers.Control.WMTSGetFeatureInfo({
+            clickCallback: "rightclick"
+        });
+        t.ok(control.handler.callbacks["rightclick"] === control.getInfoForClick,
+             'constructor registers proper "rightclick" callback in handler');
+
+        control = new OpenLayers.Control.WMTSGetFeatureInfo({
+            clickCallback: "dblclick",
+            handlerOptions: {
+                click: {
+                    "single": false,
+                    "double": true
+                }
+            }
+        });
+        t.ok(control.handler.callbacks["dblclick"] === control.getInfoForClick,
+             'constructor registers proper "dblclick" callback in handler');
+        t.eq(control.handler["single"], false,
+             'constructor sets "single" to false in handler');
+        t.eq(control.handler["double"], true,
+             'constructor sets "double" to true in handler');
+     }
+
+    function test_destroy(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var click = new OpenLayers.Control.WMTSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            layers: ["foo"]
+        });
+
+        var hover = new OpenLayers.Control.WMTSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            layers: ["foo"],
+            hover: true
+        });
+
+        click.handler.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on click handler");
+        };
+        hover.handler.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on hover handler");
+        };
+        click.destroy();
+        hover.destroy();
+    }
+
+    function test_click(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map('map');
+
+        // mock up active control
+        var control = new OpenLayers.Control.WMTSGetFeatureInfo();
+        map.addControl(control);
+        control.activate();
+
+        control.request = function(position) {
+            t.eq(position.x, 200,
+                 "x position is as expected");
+            t.eq(position.y, 125,
+                 "y position is as expected");
+        };
+
+        control.getInfoForClick({xy: {x: 200, y: 125}});
+        control.getInfoForHover({xy: {x: 200, y: 125}});
+    }
+
+    function test_beforegetfeatureinfo_event(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map({
+            div: "map",
+            allOverlays: true,
+            layers: [
+                new OpenLayers.Layer.WMTS({
+                    name: "Test WMTS 1", 
+                    url: "/testwmts/",
+                    layer: "test1",
+                    style: "",
+                    matrixSet: "set-id",
+                    isBaseLayer: false
+                }),
+                new OpenLayers.Layer.WMTS({
+                    name: "Test WMTS 2", 
+                    url: "/testwmts/",
+                    layer: "test2",
+                    style: "",
+                    matrixSet: "set-id",
+                    isBaseLayer: false
+                })
+            ],
+            center: new OpenLayers.LonLat(0, 0),
+            zoom: 0
+        });
+
+        var log = [];
+
+        // test click
+        var click = new OpenLayers.Control.WMTSGetFeatureInfo({
+            drillDown: true,
+            eventListeners: {
+                beforegetfeatureinfo: function(evt) {
+                    log.push({xy: evt.xy});
+                }
+            }
+        });
+        map.addControl(click);
+        click.activate();
+        click.getInfoForClick({xy: {x: 200, y: 125}});
+        t.eq(log.length, 2, "click: beforegetfeatureinfo triggered twice");
+        log = [];
+        click.deactivate();
+
+        // test hover
+        var hover = new OpenLayers.Control.WMTSGetFeatureInfo({
+            hover: true,
+            eventListeners: {
+                beforegetfeatureinfo: function(evt) {
+                    log.push({xy: evt.xy});
+                }
+            }
+        });
+        map.addControl(hover);
+        hover.activate();
+        xy = {x: 70, y: 70};
+        hover.getInfoForHover({xy: {x: 70, y: 70}});
+        t.eq(log.length, 1, "hover: beforegetfeatureinfo triggered once");
+        log = [];
+        hover.deactivate();
+        
+        map.destroy();
+    }
+
+    function test_activate(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map("map");
+        var click = new OpenLayers.Control.WMTSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            layers: ['ns:type']
+        });
+        var hover = new OpenLayers.Control.WMTSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            featureType: 'type',
+            featureNS: 'http://localhost/ns',
+            layers: 'ns:type',
+            hover: true
+        });
+        map.addControl(click);
+        map.addControl(hover);
+        t.ok(!click.handler.active,
+             "click handler is not active prior to activating control");
+        t.ok(!hover.handler.active,
+             "hover handler is not active prior to activating control");
+        click.activate();
+        hover.activate();
+        t.ok(click.handler.active,
+             "click handler is active after activating control");
+        t.ok(hover.handler.active,
+             "hover handler is active after activating control");
+    }
+
+    function test_deactivate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var click = new OpenLayers.Control.WMTSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            featureType: 'type',
+            featureNS: 'http://localhost/ns',
+            layers: 'ns:type'
+        });
+        var hover = new OpenLayers.Control.WMTSGetFeatureInfo({
+            url: 'http://localhost/wms',
+            featureType: 'type',
+            featureNS: 'http://localhost/ns',
+            layers: 'ns:type'
+        });
+        map.addControl(click);
+        map.addControl(hover);
+        click.activate();
+        hover.activate();
+
+        click.handler.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on click handler");
+            OpenLayers.Handler.Click.prototype.deactivate.apply(this, arguments);
+        };
+        hover.handler.deactivate = function() {
+            t.ok(true,
+                 "control.deactivate calls deactivate on hover handler");
+            OpenLayers.Handler.Hover.prototype.deactivate.apply(this, arguments);
+        };
+        click.deactivate();
+        hover.deactivate();
+    }
+
+    function test_getInfoForClick(t) {
+
+        t.plan(13);
+        var map = new OpenLayers.Map({
+            div: "map",
+            getExtent: function() {
+                return new OpenLayers.Bounds(-180,-90,180,90);
+            }
+        });
+
+        var a = new OpenLayers.Layer.WMTS({
+            url: "http://a.example.com/wmts",
+            layer: "a",
+            matrixSet: "bar",
+            style: "default"
+        });
+
+        var b = new OpenLayers.Layer.WMTS({
+            url: "http://b.example.com/wmts",
+            layer: "b",
+            matrixSet: "bar",
+            style: "default",
+            isBaseLayer: false
+        });
+
+        var c = new OpenLayers.Layer.WMTS({
+            url: ["http://c1.example.com/wmts", "http://c2.example.com"],
+            layer: "c",
+            matrixSet: "bar",
+            style: "default",
+            isBaseLayer: false
+        });
+        map.addLayers([a, b, c]);
+        map.zoomToMaxExtent();
+
+        var control = new OpenLayers.Control.WMTSGetFeatureInfo({
+            layers: [a, b, c]
+        });
+        map.addControl(control);
+        control.activate();
+
+        // log calls to GET
+        var log;
+        var _request = OpenLayers.Request.GET;
+        OpenLayers.Request.GET = function(options) {
+            log.push(options);
+        };
+
+        // query first layer (drillDown false)
+        log = [];
+        control.drillDown = false;
+        control.queryVisible = false;
+        control.getInfoForClick({xy: {x: 200, y: 125}});
+        t.eq(log.length, 1, "one requests issued");
+        t.eq(log[0].url, "http://c1.example.com/wmts", "{drillDown: false} correct url");
+        t.eq(log[0].params["LAYER"], "c", "{drillDown: false} correct layer parameter");
+
+        // query all layers
+        log = [];
+        control.drillDown = true;
+        control.queryVisible = false;
+        control.getInfoForClick({xy: {x: 200, y: 125}});
+        t.eq(log.length, 3, "three requests issued");
+        t.eq(log[0].url, "http://c1.example.com/wmts", "[c] correct url");
+        t.eq(log[0].params["LAYER"], "c", "[c] correct layer parameter");
+        t.eq(log[1].url, "http://b.example.com/wmts", "[b] correct url");
+        t.eq(log[1].params["LAYER"], "b", "[b] correct layer parameter");
+        t.eq(log[2].url, "http://a.example.com/wmts", "[a] correct url");
+        t.eq(log[2].params["LAYER"], "a", "[a] correct layer parameter");
+
+        // query only visible layers
+        log = [];
+        control.drillDown = true;
+        control.queryVisible = true;
+        b.setVisibility(false);
+        control.getInfoForClick({xy: {x: 200, y: 125}});
+        t.eq(log.length, 2, "two requests issued");
+        t.eq(log[0].url, "http://c1.example.com/wmts", "correct url for second visible layer");
+        t.eq(log[1].url, "http://a.example.com/wmts", "correct url for first visible layer");
+
+        // clean up
+        OpenLayers.Request.GET = _request;
+        map.destroy();
+
+    }
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 250px;"/>
+</body>
+</html>
diff --git a/tests/Events.html b/tests/Events.html
new file mode 100644
index 0000000..24bed69
--- /dev/null
+++ b/tests/Events.html
@@ -0,0 +1,457 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var map; 
+    var a;
+    
+    function test_Events_constructor (t) {
+        var mapDiv = OpenLayers.Util.getElement('map');
+        var obj = {result: 0};
+        var eventTypes = ["doThingA", "doThingB", "doThingC"];
+        var browserTypes = OpenLayers.Events.prototype.BROWSER_EVENTS;
+
+        var totalTests = 4 + 2*eventTypes.length + 2*browserTypes.length;
+
+        t.plan( totalTests );
+
+        events = new OpenLayers.Events(obj, mapDiv, eventTypes);
+
+        t.ok( events instanceof OpenLayers.Events, "new OpenLayers.Control returns object" );
+
+        t.ok(events.object ==obj, " 'object' property correctly set");
+        t.ok(events.element == mapDiv, " 'element' property correctly set");
+
+
+        for (var i = 0; i < browserTypes.length; i++) {
+            var type = browserTypes[i];
+            t.ok( events.listeners[type] instanceof Array, "browser event: " + type + " correctly registered" );
+            t.ok( OpenLayers.Util.indexOf(events.eventTypes, type) != -1, "browser type " + type + "' correctly added to eventTypes array");
+        }
+        for (var i = 0; i < eventTypes.length; i++) {
+            var type = eventTypes[i];
+            t.ok( events.listeners[type] instanceof Array, "custom event: " + type + " correctly registered");
+            t.ok( OpenLayers.Util.indexOf(events.eventTypes, type) != -1, "eventType " + type + "' correctly added to eventTypes array");
+        }
+
+        // default/nulls
+        events = new OpenLayers.Events(null, null, null);
+        t.ok( events.listeners != null,
+              "init of Events with null object/element/eventTypes still creates listeners array" );
+    }
+
+    function test_Events_register(t){
+        t.plan(4);
+
+        var ev = {
+            'object': {},
+            'listeners': {
+                'listenerA': { 
+                    'push': function(options){
+                                gObjA = options.obj;
+                                gFuncA = options.func;
+                            }
+                },
+                'listenerB': { 
+                    'push': function(options){
+                                gObjB = options.obj;
+                                gFuncB = options.func;
+                            }
+                }
+            },
+            'eventTypes': ['listenerA', 'listenerB']
+        };
+
+        var type = null;
+        var object = null;
+        var func = null;
+
+      //func null
+        gObjA = null; gFuncA = null; gObjB = null; gFuncB = null;
+        OpenLayers.Events.prototype.register.apply(ev, [type, object, func]);
+        t.ok((gObjA == null) && (gFuncA == null) && 
+             (gObjB == null) && (gFuncB == null), "no push called func null"); 
+
+      //valid func, type not in ev.eventTypes
+        func = function() {};
+        gObjA = null; gFuncA = null; gObjB = null; gFuncB = null;
+        OpenLayers.Events.prototype.register.apply(ev, [type, object, func]);
+        t.ok((gObjA == null) && (gFuncA == null) && 
+             (gObjB == null) && (gFuncB == null), "no push called func null"); 
+
+      //valid func, type in ev.eventTypes, null obj
+        type = 'listenerA';
+        gObjA = null; gFuncA = null; gObjB = null; gFuncB = null;
+        OpenLayers.Events.prototype.register.apply(ev, [type, object, func]);
+        t.ok((gObjA == ev.object) && (gFuncA == func) && 
+             (gObjB == null) && (gFuncB == null), "push called on listenerA's mock array when type passed in 'listenerA'. events.object taken since obj is null."); 
+        
+      //valid func, type in ev.eventTypes, valid obj
+        type = 'listenerB';
+        object = {};
+        gObjA = null; gFuncA = null; gObjB = null; gFuncB = null;
+        OpenLayers.Events.prototype.register.apply(ev, [type, object, func]);
+        t.ok((gObjA == null) && (gFuncA == null) && 
+             (gObjB == object) && (gFuncB == func), "push called on listenerB's mock array when type passed in 'listenerB'."); 
+        
+    }
+
+    function test_Events_register_unregister(t) {
+ 
+        t.plan( 18 );
+ 
+        var mapDiv = OpenLayers.Util.getElement('map');
+        var obj = {result: 0};
+        var eventTypes = ["doThingA", "doThingB", "doThingC"];
+        
+        events = new OpenLayers.Events(obj, mapDiv, eventTypes);
+        
+        var func = function () { this.result++ }
+        events.register( "doThingA", obj, func );
+
+        var listenerList = events.listeners["doThingA"];
+        t.eq( listenerList.length, 1, "register correctly adds to event.listeners" );
+        t.ok( listenerList[0].obj == obj, "obj property correctly registered");
+        t.ok( listenerList[0].func == func, "func property correctly registered");
+
+        var func2 = function () { this.result-- }
+        events.register( "doThingA", obj, func2 );
+
+        var listenerList = events.listeners["doThingA"];
+        t.eq( listenerList.length, 2, "register correctly appends new callback to event.listeners[doThingA]" );
+        t.ok( listenerList[1].obj == obj, "obj property correctly registered");
+        t.ok( listenerList[1].func == func2, "func property correctly registered");
+
+        var func3 = function () { this.result = this.result + 3; }
+        events.register( "doThingA", null, func3 );
+
+        var listenerList = events.listeners["doThingA"];
+        t.eq( listenerList.length, 3, "register correctly appends new callback to event.listeners[doThingA] even when obj passed in is null" );
+        t.ok( listenerList[2].obj == obj, "obj is correctly set to Events.object default when null is passed in.");
+        t.ok( listenerList[2].func == func3, "func property correctly registered");
+
+        events.register( "doThingA", obj, null);
+
+        var listenerList = events.listeners["doThingA"];
+        t.eq( listenerList.length, 3, "register correctly does not append null callback to event.listeners[doThingA] even when obj passed in is null" );
+
+        events.register( "chicken", obj, func);
+        t.ok( events.listeners["chicken"] == null, "register() does nothing on attempt to register un-enabled event");
+
+        events.unregister("doThingA", obj, null);
+        var listenerList = events.listeners["doThingA"];
+        t.eq( listenerList.length, 3, "trying to unregister a null callback does nothing -- but doesnt crash :-)" );
+    
+        events.unregister("doThingA", obj, func);
+        var found = false;
+        for (var i = 0; i < listenerList.length; i++) {
+            var listener = listenerList[i];
+            if (listener.obj == obj && listener.func == func) {
+                found = true;
+            }
+        }                
+        t.ok( (listenerList.length == 2) && !found, "unregister correctly removes callback" );
+
+        events.unregister("doThingA", null, func3);
+        var found = false;
+        for (var i = 0; i < listenerList.length; i++) {
+            var listener = listenerList[i];
+            if (listener.obj == obj && listener.func == func) {
+                found = true;
+            }
+        }                
+        t.ok( (listenerList.length == 1) && !found, "unregister correctly removes callback when no obj specified" );
+        
+        var func4 = function () { this.result = "chicken"; }
+        events.unregister("doThingA", obj, func4);
+        t.ok( (listenerList.length == 1), "unregister does not bomb if you try to remove an unregistered callback" );
+
+        var obj2 = { chicken: 151 };
+        events.unregister("doThingA", obj2, func2);
+        t.ok( (listenerList.length == 1), "unregister does not bomb or accidntally remove if you try to remove a valid callback on a valid event type, but with the wrong context object" );
+
+        events.unregister("doThingA", obj, null);
+        t.ok( (listenerList.length == 1), "unregister does not bomb if you try to remove a null callback" );
+
+        events.unregister("chicken", null, func3);
+        t.ok( events.listeners["chicken"] == null, "unregistering an event that is not enabled does not wierdly enable it -- or cause a script error")
+
+
+    }
+
+    function test_Events_remove(t) {
+
+        t.plan( 2 );
+ 
+        var mapDiv = OpenLayers.Util.getElement('map');
+        var obj = {result: 0};
+        var eventTypes = ["doThingA", "doThingB", "doThingC"];
+        
+        events = new OpenLayers.Events(obj, mapDiv, eventTypes);
+        
+        var func = function () { this.result++ }
+        var func2 = function () { this.result-- }
+        var func3 = function () { this.result = this.result + 3; }
+
+        events.register( "doThingA", obj, func );
+        events.register( "doThingA", obj, func2 );
+        events.register( "doThingA", null, func3 );
+
+        events.remove("doThingA");
+
+        t.eq( events.listeners["doThingA"].length, 0, "remove() correctly clears the event listeners" );
+
+        events.remove("chicken");
+        t.ok( events.listeners["chicken"] == null, "remove on non-enabled event does not break or accidentally enable the event");
+
+    }
+
+    function test_Events_triggerEvent(t) {
+    
+        t.plan(13);
+ 
+        var mapDiv = OpenLayers.Util.getElement('map');
+        var obj = {result: 0};
+        var eventTypes = ["doThingA", "doThingB", "doThingC"];
+        
+        events = new OpenLayers.Events(obj, mapDiv, eventTypes);
+        
+        
+        var func = function () { this.result++ }
+        events.register( "doThingA", obj, func );
+
+        events.triggerEvent("doThingA", {});
+        t.eq( obj.result, 1, "result is 1 after we call triggerEvent" );
+        events.triggerEvent("doThingA");
+        t.eq( obj.result, 2, "result is 2 after we call triggerEvent with no event" );
+
+        var funcB = function() { this.FUNK = "B"; return false; }
+        events.register( "doThingA", obj, funcB);
+
+        events.triggerEvent("doThingA");
+        t.ok ((obj.result == 3) && (obj.FUNK == "B"), "executing multiple callbacks works")
+
+        var funcZ = function() { this.FUNK = "Z"; }
+        events.register( "doThingA", obj, funcZ);
+
+        events.triggerEvent("doThingA");
+        t.ok ((obj.result == 4) && (obj.FUNK == "B"), "executing multiple callbacks works, and when one returns false, it stops chain correctly")
+
+
+        var func2 = function() { this.result = this.result + 10; }
+        events.register( "doThingB", null, func2);
+        
+        events.triggerEvent("doThingB");
+        t.eq( obj.result, 14, "passing a null object default gets set correctly");
+        
+        //no specific t.ok for this one, but if it breaks, you will know it.
+        events.triggerEvent("chicken");
+
+        events = new OpenLayers.Events(null, mapDiv, eventTypes);
+        
+        // a is global variable (context-irrelevant)
+        a = 0;
+        var func = function () { a = 5; }
+        events.register( "doThingC", null, func );
+        events.triggerEvent("doThingC");
+
+        t.eq(a, 5, "if Events has no object set and an event is registered also with no object, triggerEvent() calls it without trying to set the context to null");
+        
+        // trigger events with additional arguments
+        eventTypes = ["something"];
+        events = new OpenLayers.Events(null, null, eventTypes);
+        var instance = {id: Math.random()};
+        var listener = function(obj) {
+            t.eq(this.id, instance.id,
+                 "listener called with proper scope");
+            t.eq(arguments.length, 1,
+                 "listener called with a single argument");
+            t.eq(typeof arguments, "object",
+                 "listener called with an object");
+            t.eq(obj.foo, evt.foo,
+                 "foo property set on the layer");
+        };
+        events.register("something", instance, listener);        
+        var evt = {
+            id: Math.random(),
+            "foo": "bar"
+        };
+        events.triggerEvent("something", evt);
+        events.unregister("something", instance, listener);
+        
+        // test return from triggerEvent
+        var listener1 = function() {
+            return "foo";
+        }
+        var listener2 = function() {
+            return false;
+        }
+        var listener3 = function() {
+            t.fail("never call me again!");
+        }
+        events.register("something", instance, listener1);
+        var ret = events.triggerEvent("something", evt);
+        t.eq(ret, "foo", "correct return from single listener");
+        
+        events.register("something", instance, listener2);
+        ret = events.triggerEvent("something", evt);
+        t.eq(ret, false, "correct return for two listeners");
+        
+        events.register("something", instance, listener3);
+        ret = events.triggerEvent("something", evt);
+        t.eq(ret, false, "correct return for three listeners where second cancels");
+        
+        events.unregister("something", instance, listener1);
+        events.unregister("something", instance, listener2);
+        events.unregister("something", instance, listener3);
+        
+    }
+
+    function test_Events_destroy (t) {
+        t.plan(2);
+
+        var div   = OpenLayers.Util.getElement('test');
+        var obj   = {};
+        var events = new OpenLayers.Events(obj, div);
+
+        // +1 because of blocking dragstart in attachToElement()
+        t.eq(OpenLayers.Event.observers[div._eventCacheID].length,
+             OpenLayers.Events.prototype.BROWSER_EVENTS.length + 1,
+             "construction creates new arrayin hash, registers appropriate events");
+             
+        events.destroy();
+        events = null;
+        t.eq(OpenLayers.Event.observers["test"], null,
+             "destruction removes the event observer from hash");
+    }
+    
+    function test_Event(t) {
+        t.plan(24);
+        
+        var div   = OpenLayers.Util.getElement('test');
+        var name = "mouseover";
+        var func = function() {};
+
+      //1st elem 1st listener        
+        OpenLayers.Event.observe(div, name, func);
+
+        var cacheID = div._eventCacheID;
+        t.ok(cacheID, "element given new cache id");
+        
+        var elementObservers = OpenLayers.Event.observers[cacheID];
+        
+        t.ok(elementObservers, "new cache bucket made for event");
+        t.eq(elementObservers.length, 1, "one listener registered");        
+        
+        var listener = elementObservers[0];
+        
+        t.ok(listener.element == div, "element registered");
+        t.eq(listener.name, name, "name registered");
+        t.ok(listener.observer == func, "function registered");
+        t.eq(listener.useCapture, false, "useCapture defaults to false");
+
+      //1st elem 2nd listener        
+        name = "mouseout";
+        var newFunc = function() {};
+      
+        OpenLayers.Event.observe(div, name, newFunc, true);
+        var newCacheID = div._eventCacheID;
+        t.eq(newCacheID, cacheID, "element's cache id not overridden");
+        
+        t.eq(elementObservers.length, 2, "listener added to existing bucket");        
+        
+        var listener = elementObservers[1];
+        
+        t.ok(listener.element == div, "element registered");
+        t.eq(listener.name, name, "name registered");
+        t.ok(listener.observer == newFunc, "function registered");
+        t.eq(listener.useCapture, true, "useCapture correctly registered");
+
+      //2st elem 1st listener        
+        div = OpenLayers.Util.getElement('test2'); 
+        OpenLayers.Event.observe(div, name, func);
+
+        var cacheID = div._eventCacheID;
+        t.ok(cacheID, "new element given new cache id");
+        t.ok(cacheID != newCacheID, "new cache id is unique");
+        
+        elementObservers = OpenLayers.Event.observers[cacheID];
+        
+        t.ok(elementObservers, "new cache bucket made for event");
+        t.eq(elementObservers.length, 1, "one listener registered");        
+        
+        var listener = elementObservers[0];
+        
+        t.ok(listener.element == div, "element registered");
+        t.eq(listener.name, name, "name registered");
+        t.ok(listener.observer == func, "function registered");
+        t.eq(listener.useCapture, false, "useCapture defaults to false");
+
+      //stopObservingElement by element
+        OpenLayers.Event.stopObservingElement(div);
+        elementObservers = OpenLayers.Event.observers[cacheID];
+        t.ok(elementObservers == null, "stopObservingElement by elem works");
+
+      //stopObservingElement by id
+        OpenLayers.Event.stopObservingElement("test");
+        elementObservers = OpenLayers.Event.observers[newCacheID];
+        t.ok(elementObservers == null, "stopObservingElement by id works");
+
+
+      //unloadCache by element
+        OpenLayers.Event.observe(div, name, func);
+        
+        OpenLayers.Event.unloadCache();
+
+        elementObservers = OpenLayers.Event.observers[cacheID];
+        t.ok(elementObservers == null, "stopObservingElement by elem works");
+
+        
+    }
+
+    function test_Events_addEventType(t) {
+
+        t.plan( 8 );
+ 
+        var mapDiv = OpenLayers.Util.getElement('map');
+        var obj = {result: 0};
+        var eventTypes = ["doThingA", "doThingB"];
+
+        events = new OpenLayers.Events(obj, mapDiv, eventTypes);
+
+
+        t.eq( events.listeners["doThingA"].length, 0, "event type passed as passed as param to OpenLayers.Events constructor correctly set up" );
+        t.eq( events.listeners["doThingB"].length, 0, "event type passed as passed as param to OpenLayers.Events constructor correctly set up" );
+
+        var newEventType = "onFoo";
+        t.ok( events.listeners[newEventType] == null, "event type not yet registered has null entry in listeners array");
+        t.ok( OpenLayers.Util.indexOf(events.eventTypes, newEventType) == -1, "event type not yet registered not in eventTypes array");
+
+        events.addEventType(newEventType);
+        t.eq( events.listeners[newEventType].length, 0, "event type passed to addEventType correctly set up" );
+        t.ok( OpenLayers.Util.indexOf(events.eventTypes, newEventType) != -1, "event type passed to addEventType in eventTypes array");
+        
+        var func = function () {};
+        events.register( "doThingA", obj, func );
+        t.eq( events.listeners["doThingA"].length, 1, "listener correctly registered" );
+
+        events.addEventType("doThingsA");
+        t.eq( events.listeners["doThingA"].length, 1, "event type passed to addEventType correctly does nothing if clashes with already defined event type" );
+    }
+
+    /** HACK HACK HACK Deprecated This test should be removed in 3.0 **/
+    function test_Events_globalEventObject(t) {
+        t.plan(1);
+        t.ok(Event.stop, "a stop() function exists on the global JS Event object, if indeed it exists. This is legacy deprecated and will be gone in 3.0");
+    }
+   
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+    <div id="test"></div>
+    <div id="test2"></div>
+</body>
+</html>
diff --git a/tests/Extras.html b/tests/Extras.html
new file mode 100644
index 0000000..38ed2b7
--- /dev/null
+++ b/tests/Extras.html
@@ -0,0 +1,21 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var map;
+    
+    // Ensure that we continue to work if silly Javascript frameworks
+    // extend object.
+    Object.prototype.foo = function() { }
+    function test_Events_Object_Extension(t) {
+        t.plan(1)
+        map = new OpenLayers.Map("map");
+        t.ok(true, "Map created if object prototype is extended.");
+    }
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 600px; height: 300px;"/>
+</body>
+</html>
diff --git a/tests/Feature.html b/tests/Feature.html
new file mode 100644
index 0000000..ca65888
--- /dev/null
+++ b/tests/Feature.html
@@ -0,0 +1,200 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var map; 
+    var feature, layer; 
+    
+    function test_Feature_constructor (t) {
+        t.plan( 7 );
+
+        var layer = {};
+        var lonlat = new OpenLayers.LonLat(2,1);
+        var iconURL = 'http://boston.openguides.org/features/ORANGE.png';
+        var iconSize = new OpenLayers.Size(12, 17);
+        var data =  { iconURL: iconURL,
+                      iconSize: iconSize 
+                    };
+        
+        feature = new OpenLayers.Feature(layer, lonlat, data);
+
+        t.ok( feature instanceof OpenLayers.Feature, "new OpenLayers.Feature returns Feature object" );
+        t.eq( feature.layer, layer, "feature.layer set correctly" );
+        t.ok(OpenLayers.String.startsWith(feature.id, "OpenLayers.Feature_"),
+             "feature.id set correctly");
+        t.ok( feature.lonlat.equals(lonlat), "feature.lonlat set correctly" );
+        t.eq( feature.data.iconURL, iconURL, "feature.data.iconURL set correctly" );
+        t.ok( feature.data.iconSize.equals(iconSize), "feature.data.iconSize set correctly" );
+        t.ok( feature.popupClass == OpenLayers.Popup.AnchoredBubble, "default popupClass is AnchoredBubble");
+    }
+    
+    function test_Feature_createPopup (t) {
+        t.plan(1);
+        var layer = {};
+        var lonlat = new OpenLayers.LonLat(2,1);
+        var iconURL = 'http://boston.openguides.org/features/ORANGE.png';
+        var iconSize = new OpenLayers.Size(12, 17);
+        var data =  { iconURL: iconURL,
+                      iconSize: iconSize,
+                      'overflow':'auto'
+                    };
+        
+        feature = new OpenLayers.Feature(layer, lonlat, data);
+        popup = feature.createPopup(); 
+        //Safari 3 separates style overflow into overflow-x and overflow-y
+        var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+        t.eq(popup.contentDiv.style[prop], "auto", 'overflow on popup is correct');
+    }    
+    function test_Feature_createMarker (t) {
+        t.plan(1);
+        t.ok(true);
+/*
+
+        t.plan( 11 );
+        feature = new OpenLayers.Feature("myfeature", new OpenLayers.LonLat(2,1), 
+               {
+                iconURL:'http://boston.openguides.org/features/ORANGE.png',
+                iconW: 12,
+                iconH: 17
+               });
+        layer = new OpenLayers.Layer.Markers('Marker Layer');
+        t.ok( feature instanceof OpenLayers.Feature, "new OpenLayers.Feature returns Feature object" );
+        t.ok( layer instanceof OpenLayers.Layer.Markers, "Layer is a marker layer" );
+        feature.createMarker(layer);
+        
+        t.ok( feature.marker instanceof OpenLayers.Marker, 
+              "createMarker sets a marker property to a marker" );
+        t.ok( layer.markers[0] === feature.marker, 
+              "First marker in layer is the feature marker" );
+        
+        t.ok( feature.marker.lonlat instanceof OpenLayers.LonLat, 
+              "createMarker sets a marker lontlat property to a lonlat" );
+        t.ok( layer.markers[0].lonlat === feature.lonlat, 
+              "First marker in the layer matches feature lonlat" );
+        
+        t.ok( feature.marker.icon instanceof OpenLayers.Icon, 
+              "createMarker sets a marker icon property to an icon" );
+        
+        t.eq( feature.marker.icon.url, 
+              "http://boston.openguides.org/features/ORANGE.png", 
+              "createMarker sets marker url correctly" );
+       
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+        t.ok( map.layers[0] == layer,
+              "Marker layer added to map okay." );
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( map.layers[0].div.firstChild instanceof HTMLImageElement,
+                  "layer div firstChild is an image" );
+        t.eq( map.layers[0].div.firstChild.src,
+              "http://boston.openguides.org/features/ORANGE.png", 
+              "Layer div img contains correct url" );
+*/
+    }
+    
+    function test_Feature_onScreen(t) {
+        t.plan( 2 );
+
+        var map = new OpenLayers.Map("map");
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        var wms = new OpenLayers.Layer.WMS(name, url);
+
+        map.addLayer(wms);
+
+        var layer = new OpenLayers.Layer("foo");
+        map.addLayer(layer);
+        
+        map.zoomToExtent(new OpenLayers.Bounds(-50,-50,50,50));
+
+        //onscreen feature
+        var feature1 = new OpenLayers.Feature(layer, 
+                                              new OpenLayers.LonLat(0,0));
+        t.ok( feature1.onScreen(), "feature knows it's onscreen" );
+
+        //onscreen feature
+        var feature2 = new OpenLayers.Feature(layer, 
+                                              new OpenLayers.LonLat(100,100));
+        t.ok( !feature2.onScreen(), "feature knows it's offscreen" );
+    }
+
+    function test_Feature_createPopup(t) {
+        t.plan(11);
+
+    //no lonlat        
+        var f = {
+            'popup': null
+        };
+        
+        var ret = OpenLayers.Feature.prototype.createPopup.apply(f, []);
+        t.ok((ret == f.popup) && (f.popup == null), "if no 'lonlat' set on feature, still returns reference to this.popup (though it is null)");
+
+
+
+        f.popupClass = OpenLayers.Class({
+            initialize: function(id, lonlat, size, contentHTML, anchor, closeBox) {
+                t.eq(id, "Campion_popup", "correctly generates new popup id from feature's id");
+                t.eq(lonlat, f.lonlat, "correctly passes feature's lonlat to popup constructor");
+                t.eq(size, f.data.popupSize, "correctly passes feature's data.popupSize to popup constructor");
+                t.eq(contentHTML, f.data.popupContentHTML, "correctly passes feature's data.popupContentHTML to popup constructor");
+                t.eq(anchor, g_ExpectedAnchor, "passes correct anchor to popup constructor");
+                t.eq(closeBox, g_CloseBox, "correctly relays closeBox argument to popup constructor");
+            }
+        });
+        
+
+    //valid lonlat but no anchor    
+        f.popup = null;
+        
+        f.id = "Campion";
+        f.lonlat = {};
+        f.data = {
+            'popupSize': {},
+            'popupContentHTML': {}
+        };
+        g_ExpectedAnchor = null;
+        g_CloseBox = {};
+
+        ret = OpenLayers.Feature.prototype.createPopup.apply(f, [g_CloseBox]);
+        
+        t.ok((ret == f.popup) && (f.popup != null), "a valid popup has been set and returned")
+        t.ok( f.popup.feature == f, "popup's 'feature' property correctly set");
+
+    
+    //valid lonlat with anchor    
+
+        f.marker = {
+            'icon': {}
+        };
+        g_ExpectedAnchor = f.marker.icon;
+        ret = OpenLayers.Feature.prototype.createPopup.apply(f, [g_CloseBox]);
+        t.ok((ret == f.popup) && (f.popup != null), "a valid popup has been set and returned")
+        t.ok( f.popup.feature == f, "popup's 'feature' property correctly set");
+    }
+
+    function test_Feature_destroyPopup(t) {
+        t.plan(2);
+
+        var f = {
+            'popup': {
+                'feature': {},
+                'destroy': function() {
+                    t.ok(true, "default destroyPopup() calls popup.destroy");
+                }
+            }
+        };
+        
+        OpenLayers.Feature.prototype.destroyPopup.apply(f, []);
+        t.ok(f.popup == null, "popup property nullified on destroy");
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width: 500px; height: 300px;"></div>
+</body>
+</html>
diff --git a/tests/Feature/Vector.html b/tests/Feature/Vector.html
new file mode 100644
index 0000000..2cf0d18
--- /dev/null
+++ b/tests/Feature/Vector.html
@@ -0,0 +1,170 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var map; 
+    var feature; 
+    
+    function test_Feature_Vector_constructor(t) {
+        t.plan(3);
+        
+        var geometry = new OpenLayers.Geometry();
+        geometry.id = Math.random();
+        var style = {foo: "bar"};
+        var attributes = {bar: "foo"};
+
+        feature = new OpenLayers.Feature.Vector(geometry, attributes, style);
+
+        t.ok(feature instanceof OpenLayers.Feature.Vector,
+             "new OpenLayers.Feature.Vector returns Feature.Vector object" );
+        t.eq(feature.attributes, attributes,
+             "attributes property set properly" );
+        t.eq(feature.geometry.id, geometry.id,
+             "geometry.property set properly" );
+    }
+    
+    function test_Feature_onScreen(t) {
+        t.plan(6);
+        var line = new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(0, 0),
+            new OpenLayers.Geometry.Point(10, 20)
+        ]);
+        var feature = new OpenLayers.Feature.Vector(line);
+        feature.layer = {
+            map: {
+                getExtent: function() {
+                    return new OpenLayers.Bounds(5, 5, 10, 10);
+                }
+            }
+        };
+        t.eq(feature.onScreen(), true,
+             "intersecting feature returns true for intersection");
+        t.eq(feature.onScreen(true), true,
+             "intersecting feature returns true for bounds only");
+        
+        // move the line so only the bounds intersects
+        line.move(0, 5);
+        t.eq(feature.onScreen(), false,
+             "bounds-only feature returns false for intersection");
+        t.eq(feature.onScreen(true), true,
+             "bounds-only feature returns true for bounds only");
+
+        // move the line so bounds does not intersect
+        line.move(0, 10);
+        t.eq(feature.onScreen(), false,
+             "off-screen feature returns false for intersection");
+        t.eq(feature.onScreen(true), false,
+             "off-screen feature returns false for bounds only");
+        
+    }
+    
+    function test_Feature_getVisibility(t) {
+        t.plan(5);
+        var feature = new OpenLayers.Feature.Vector();
+        feature.layer = {
+            getVisibility: function() {return true}
+        };
+
+        t.ok(feature.getVisibility(),
+             "returns true in a not specific case");
+
+        feature.style = {display: 'none'};
+        t.eq(feature.getVisibility(), false,
+             "returns false when feature style display property is set to 'none'");
+
+        feature.style = null;
+        feature.layer.styleMap = {
+            createSymbolizer: function() {
+                return {display: 'none'}
+            }
+        }
+        t.eq(feature.getVisibility(), false,
+             "returns false when layer styleMap is configured so that the feature" +
+              "should not be displayed");
+
+        delete feature.layer.styleMap;
+        feature.layer.getVisibility = function() {return false}
+        t.eq(feature.getVisibility(), false,
+             "returns false when layer it belongs to is not visible");
+        
+        feature.layer = null;
+        t.eq(feature.getVisibility(), false,
+             "returns false when it doesn't belong to any layer");
+    }
+    
+    function test_Feature_Vector_clone(t) {
+        t.plan(6);
+
+        var geometry = new OpenLayers.Geometry.Point(Math.random(),
+                                                     Math.random());
+        var style = {foo: "bar"};
+        var attributes = {bar: "foo"};
+
+        feature = new OpenLayers.Feature.Vector(geometry, attributes, style);
+        var clone = feature.clone();
+
+        t.ok(clone instanceof OpenLayers.Feature.Vector,
+             "new OpenLayers.Feature.Vector returns Feature.Vector object");
+        t.eq(clone.attributes, attributes,
+             "attributes property set properly");
+        t.eq(clone.style, style,
+             "style property set properly");
+        t.eq(clone.geometry.x, geometry.x,
+             "geometry.x property set properly");
+        t.eq(clone.geometry.y, geometry.y,
+             "geometry.y property set properly");
+
+        feature = new OpenLayers.Feature.Vector();
+        clone = feature.clone();
+        t.ok(clone instanceof OpenLayers.Feature.Vector,
+             "clone can clone geometry-less features");
+    }
+        
+    function test_Feature_Vector_move(t) {
+        t.plan(3);
+
+        var oldx = 26;
+        var oldy = 14;
+        var newx = 6;
+        var newy = 4;
+        var res = 10;
+
+        var geometry = new OpenLayers.Geometry.Point(oldx,
+                                                     oldy);
+
+        var drawn = false;
+
+        feature = new OpenLayers.Feature.Vector(geometry);
+
+        feature.layer = {
+            getViewPortPxFromLonLat : function(lonlat){
+                return new OpenLayers.Pixel(lonlat.lon,lonlat.lat);
+            },
+            map: {
+                getResolution: function(){
+                    return res;
+                }
+            },
+            drawFeature: function(){
+                drawn = true;
+            }
+        }
+
+        var pixel = new OpenLayers.Pixel(newx,newy)
+
+        feature.move(pixel);
+
+        geometry = feature.geometry;
+
+        t.ok(drawn, "The feature is redrawn after the move");
+        t.eq(geometry.x, res * (newx - oldx) + oldx, "New geometry has proper x coordinate");
+        t.eq(geometry.y, res * (oldy - newy) + oldy, "New geometry has proper y coordinate");
+    }
+        
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width: 500px; height: 300px;"></div>
+</body>
+</html>
diff --git a/tests/Filter.html b/tests/Filter.html
new file mode 100644
index 0000000..b981d20
--- /dev/null
+++ b/tests/Filter.html
@@ -0,0 +1,21 @@
+<html> 
+<head> 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_initialize(t) { 
+        t.plan(3); 
+         
+        var options = {'foo': 'bar'}; 
+        var filter = new OpenLayers.Filter(options); 
+        t.ok(filter instanceof OpenLayers.Filter, 
+             "new OpenLayers.Filter returns object" ); 
+        t.eq(filter.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 
+    }
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Filter/Comparison.html b/tests/Filter/Comparison.html
new file mode 100644
index 0000000..b9505db
--- /dev/null
+++ b/tests/Filter/Comparison.html
@@ -0,0 +1,317 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_initialize(t) { 
+        t.plan(3); 
+         
+        var options = {'foo': 'bar'}; 
+        var filter = new OpenLayers.Filter.Comparison(options); 
+        t.ok(filter instanceof OpenLayers.Filter.Comparison, 
+             "new OpenLayers.Filter.Comparison returns object" ); 
+        t.eq(filter.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 
+    }
+
+    function test_destroy(t) {
+        t.plan(1);
+        
+        var filter = new OpenLayers.Filter.Comparison();
+        filter.destroy();
+        t.eq(filter.symbolizer, null, "symbolizer hash nulled properly");
+    }
+    
+    function test_value2regex(t) {
+        t.plan(4);
+        
+        var filter = new OpenLayers.Filter.Comparison({
+                property: "foo",
+                value: "*b?r\\*\\?*",
+                type: OpenLayers.Filter.Comparison.LIKE});
+        filter.value2regex("*", "?", "\\");
+        t.eq(filter.value, ".*b.r\\*\\?.*", "Regular expression generated correctly.");
+        
+        filter.value = "%b.r!%!.%";
+        filter.value2regex("%", ".", "!");
+        t.eq(filter.value, ".*b.r\\%\\..*", "Regular expression with different wildcard and escape chars generated correctly.");
+    
+        filter.value = "!!";
+        filter.value2regex();
+        t.eq(filter.value, "\\!", "!! successfully unescaped to \\!");
+        
+        // Big one.
+        filter.value = "!!c!!!d!e";
+        filter.value2regex();
+        t.eq(filter.value, "\\!c\\!\\d\\e", "!!c!!!d!e successfully unescaped to \\!c\\!\\d\\e");
+    }
+    
+    function test_regex2value(t) {
+        t.plan(8);
+        
+        function r2v(regex) {
+            return OpenLayers.Filter.Comparison.prototype.regex2value.call(
+                {value: regex}
+            );
+        }
+        
+        t.eq(r2v("foo"), "foo", "doesn't change string without special chars");
+        t.eq(r2v("foo.*foo"), "foo*foo", "wildCard replaced");
+        t.eq(r2v("foo.foo"), "foo.foo", "singleChar replaced");
+        t.eq(r2v("foo\\\\foo"), "foo\\foo", "escape removed");
+        t.eq(r2v("foo!foo"), "foo!!foo", "escapes !");
+        t.eq(r2v("foo\\*foo"), "foo!*foo", "replaces escape on *");
+        t.eq(r2v("foo\\.foo"), "foo!.foo", "replaces escape on .");
+        t.eq(r2v("foo\\\\.foo"), "foo\\.foo", "unescapes only \\ before .");
+        
+    }
+    
+    function test_evaluate(t) {
+        
+        var cases = [{
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: {area: 999},
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: {area: 1000},
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: {area: 4999},
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: {area: 5000},
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: {area: 999},
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                property: "prop",
+                value: "Foo"
+            }),
+            context: {prop: "Foo"},
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                property: "prop",
+                value: "Foo"
+            }),
+            context: {prop: "foo"},
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                matchCase: true,
+                property: "prop",
+                value: "Foo"
+            }),
+            context: {prop: "foo"},
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                property: "prop",
+                value: "foo"
+            }),
+            context: {prop: "FOO"},
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                matchCase: true,
+                property: "prop",
+                value: "foo"
+            }),
+            context: {prop: "FOO"},
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                matchCase: false,
+                property: "prop",
+                value: "foo"
+            }),
+            context: {prop: "FOO"},
+            expect: false
+        }];
+        
+        t.plan(cases.length);
+        
+        var c;
+        for(var i=0; i<cases.length; ++i) {
+            c = cases[i];
+            t.eq(c.filter.evaluate(c.context), c.expect, "case " + i + ": " + c.filter.type);
+        }
+        
+    }
+
+    function test_evaluate_feature(t) {
+        
+        var cases = [{
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: new OpenLayers.Feature.Vector(null, {area: 999}),
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: new OpenLayers.Feature.Vector(null, {area: 1000}),
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: new OpenLayers.Feature.Vector(null, {area: 4999}),
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: new OpenLayers.Feature.Vector(null, {area: 5000}),
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.BETWEEN,
+                property: "area",
+                lowerBoundary: 1000,
+                upperBoundary: 4999
+            }),
+            context: new OpenLayers.Feature.Vector(null, {area: 999}),
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                property: "prop",
+                value: "Foo"
+            }),
+            context: new OpenLayers.Feature.Vector(null, {prop: "Foo"}),
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                property: "prop",
+                value: "Foo"
+            }),
+            context: new OpenLayers.Feature.Vector(null, {prop: "foo"}),
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                matchCase: true,
+                property: "prop",
+                value: "Foo"
+            }),
+            context: new OpenLayers.Feature.Vector(null, {prop: "foo"}),
+            expect: false
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                property: "prop",
+                value: "foo"
+            }),
+            context: {prop: "FOO"},
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                matchCase: true,
+                property: "prop",
+                value: "foo"
+            }),
+            context: new OpenLayers.Feature.Vector(null, {prop: "FOO"}),
+            expect: true
+        }, {
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                matchCase: false,
+                property: "prop",
+                value: "foo"
+            }),
+            context: new OpenLayers.Feature.Vector(null, {prop: "FOO"}),
+            expect: false
+        }];
+        
+        t.plan(cases.length);
+
+        var c;
+        for(var i=0; i<cases.length; ++i) {
+            c = cases[i];
+            t.eq(c.filter.evaluate(c.context), c.expect, "case " + i + ": " + c.filter.type);
+        }
+        
+    }
+        
+    function test_clone(t) {
+        
+        t.plan(3);
+        
+        var filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.EQUAL_TO,
+            property: "prop",
+            value: "val"
+        });
+        
+        var clone = filter.clone();
+        
+        // modify the original
+        filter.type = OpenLayers.Filter.Comparison.NOT_EQUAL_TO;
+        
+        t.eq(clone.type, OpenLayers.Filter.Comparison.EQUAL_TO, "clone has proper type");
+        t.eq(clone.property, "prop", "clone has proper property");
+        t.eq(clone.value, "val", "clone has proper value");
+        
+        filter.destroy();
+
+    }
+
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Filter/FeatureId.html b/tests/Filter/FeatureId.html
new file mode 100644
index 0000000..0adeba7
--- /dev/null
+++ b/tests/Filter/FeatureId.html
@@ -0,0 +1,67 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_initialize(t) { 
+        t.plan(3); 
+         
+        var options = {'foo': 'bar'}; 
+        var filter = new OpenLayers.Filter.FeatureId(options); 
+        t.ok(filter instanceof OpenLayers.Filter.FeatureId, 
+             "new OpenLayers.Filter.FeatureId returns object" ); 
+        t.eq(filter.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 
+    }
+
+    function test_destroy(t) {
+        t.plan(1);
+        
+        var filter = new OpenLayers.Filter.FeatureId();
+        filter.destroy();
+        t.eq(filter.symbolizer, null, "symbolizer hash nulled properly");
+    }
+    
+    function test_evaluate(t) {
+        t.plan(3);
+        
+        var filter = new OpenLayers.Filter.FeatureId(
+                {fids: ["fid_1", "fid_3"]});
+
+        var filterResults = {
+                "fid_1" : true,
+                "fid_2" : false,
+                "fid_3" : true};
+        for (var i in filterResults) {
+            var feature = new OpenLayers.Feature.Vector();
+            feature.fid = i;
+            var result = filter.evaluate(feature);
+            t.eq(result, filterResults[i], "feature "+i+" evaluates to "+result.toString()+" correctly.");
+            feature.destroy();
+        }
+    }
+
+    function test_clone(t) {
+        
+        t.plan(1);
+        
+        var filter = new OpenLayers.Filter.FeatureId({
+            fids: [1, 2, 3]
+        });
+        
+        var clone = filter.clone();
+        
+        // modify the original
+        filter.fids.push(4);
+        
+        t.eq(clone.fids.length, 3, "clone has proper fids length");
+        
+        filter.destroy();
+
+    }
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Filter/Logical.html b/tests/Filter/Logical.html
new file mode 100644
index 0000000..cfbc93b
--- /dev/null
+++ b/tests/Filter/Logical.html
@@ -0,0 +1,144 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_initialize(t) { 
+        t.plan(3); 
+         
+        var options = {'foo': 'bar'}; 
+        var filter = new OpenLayers.Filter.Logical(options); 
+        t.ok(filter instanceof OpenLayers.Filter.Logical, 
+             "new OpenLayers.Filter.Logical returns object" ); 
+        t.eq(filter.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 
+    }
+
+    function test_destroy(t) {
+        t.plan(1);
+        
+        var filter = new OpenLayers.Filter.Logical();
+        filter.destroy();
+        t.eq(filter.filters, null, "filters array nulled properly");
+    }
+    
+    function test_evaluate(t) {
+        t.plan(1);
+        
+        var filter = new OpenLayers.Filter.Logical({
+                type: OpenLayers.Filter.Logical.NOT});
+        filter.filters.push(new OpenLayers.Filter());
+        
+        var feature = new OpenLayers.Feature.Vector();
+
+        t.eq(filter.evaluate(feature.attributes), false,
+                "feature evaluates to false correctly.");
+    }
+
+    function test_evaluate_feature(t) {
+        t.plan(6);
+        
+        var feature = new OpenLayers.Feature.Vector(null, {
+            pop: 200,
+            name: "foo"
+        });
+        
+        var smallPop = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.LESS_THAN,
+            property: "pop",
+            value: 120
+        });
+        
+        var bigPop = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.GREATER_THAN,
+            property: "pop",
+            value: 120
+        });
+        
+        var namedFoo = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.EQUAL_TO,
+            property: "name",
+            value: "foo"
+        });
+        
+        var filter;
+        
+        // test simple not
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.NOT,
+            filters: [smallPop]
+        });
+        t.eq(filter.evaluate(feature), true, "not smallPop");
+
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.NOT,
+            filters: [bigPop]
+        });
+        t.eq(filter.evaluate(feature), false, "not bigPop");
+
+        // test or
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.OR,
+            filters: [smallPop, namedFoo]
+        });
+        t.eq(filter.evaluate(feature), true, "smallPop or namedFoo");
+
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.OR,
+            filters: [bigPop, namedFoo]
+        });
+        t.eq(filter.evaluate(feature), true, "bigPop or namedFoo");
+
+        // test and
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: [smallPop, namedFoo]
+        });
+        t.eq(filter.evaluate(feature), false, "smallPop and namedFoo");
+
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: [bigPop, namedFoo]
+        });
+        t.eq(filter.evaluate(feature), true, "bigPop and namedFoo");
+
+    }
+
+    function test_clone(t) {
+        
+        t.plan(2);
+        
+        var filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: [
+                new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                    property: "prop1",
+                    value: "val1"
+                }),
+                new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+                    property: "prop2",
+                    value: "val2"
+                })
+            ]
+        });
+
+        var clone = filter.clone();
+        
+        // modify the original
+        filter.type = OpenLayers.Filter.Logical.OR;
+        filter.filters[0].value = "nada";
+        
+        t.eq(clone.type, OpenLayers.Filter.Logical.AND, "clone has proper type");
+        t.eq(clone.filters[0].value, "val1", "clone has cloned child filters");
+        
+        filter.destroy();
+
+    }
+    
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Filter/Spatial.html b/tests/Filter/Spatial.html
new file mode 100644
index 0000000..69ed1f2
--- /dev/null
+++ b/tests/Filter/Spatial.html
@@ -0,0 +1,112 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(3); 
+         
+        var options = {'foo': 'bar'}; 
+        var filter = new OpenLayers.Filter.Spatial(options); 
+        t.ok(filter instanceof OpenLayers.Filter.Spatial, 
+             "new OpenLayers.Filter.Spatial returns object" ); 
+        t.eq(filter.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof filter.evaluate, "function", "filter has an evaluate function"); 
+    }
+
+    function test_destroy(t) {
+        t.plan(1);
+        
+        var filter = new OpenLayers.Filter.Spatial();
+        filter.destroy();
+        t.eq(filter.symbolizer, null, "symbolizer hash nulled properly");
+    }
+    
+    function test_evaluate(t) {
+        t.plan(8);
+        
+        var filer, feature, res, geom, bounds;
+
+        bounds = new OpenLayers.Bounds(0, 0, 10, 10);
+        filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value: bounds
+        });
+
+        var not = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.NOT,
+            filters: [filter]
+        });
+
+        feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(2, 2));
+        res = filter.evaluate(feature);
+        t.eq(res, true,
+            "evaluates returns correct value when feature intersects bounds");
+        t.eq(not.evaluate(feature), !res, "not bbox");
+        
+        feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(20, 20));
+        res = filter.evaluate(feature);
+        t.eq(res, false,
+            "evaluates returns correct value when feature does not intersect bounds");
+        t.eq(not.evaluate(feature), !res, "not outside bbox");
+
+        geom = bounds.toGeometry();
+        feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(2, 2));
+        filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.INTERSECTS,
+            value: geom
+        });
+        res = filter.evaluate(feature);
+        t.eq(res, true,
+            "evaluates returns correct value when feature intersects bounds");
+        not.filters = [filter];
+        t.eq(not.evaluate(feature), !res, "not intersection");
+
+        geom = bounds.toGeometry();
+        feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(20, 20));
+        filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.INTERSECTS,
+            value: geom
+        });
+        not.filters = [filter];
+        res = filter.evaluate(feature);
+        t.eq(res, false,
+            "evaluates returns correct value when feature does not intersect bounds");
+        t.eq(not.evaluate(feature), !res, "not non-intersection");
+
+
+    }
+    
+    function test_clone(t) {
+        
+        t.plan(2);
+        
+        var bounds = new OpenLayers.Bounds(0, 0, 10, 10);
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value: bounds
+        });
+        
+        var clone = filter.clone();
+        
+        // modify the original
+        filter.value.bottom = -100;
+        
+        t.eq(clone.type, OpenLayers.Filter.Spatial.BBOX, "clone has proper type");
+        t.eq(clone.value.toBBOX(), "0,0,10,10", "clone has proper value");
+        
+        filter.destroy();
+        clone.destroy();
+
+    }
+
+    
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format.html b/tests/Format.html
new file mode 100644
index 0000000..9c761df
--- /dev/null
+++ b/tests/Format.html
@@ -0,0 +1,23 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_Format_constructor(t) {
+        t.plan(5);
+    
+        var options = {'foo': 'bar'};
+        var format = new OpenLayers.Format(options);
+        t.ok(format instanceof OpenLayers.Format,
+             "new OpenLayers.Format returns object" );
+        t.eq(format.foo, "bar", "constructor sets options correctly");
+        t.eq(typeof format.read, "function", "format has a read function");
+        t.eq(typeof format.write, "function", "format has a write function");
+        t.eq(format.options, options, "format.options correctly set");
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Format/ArcXML.html b/tests/Format/ArcXML.html
new file mode 100644
index 0000000..6298e7c
--- /dev/null
+++ b/tests/Format/ArcXML.html
@@ -0,0 +1,277 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    var axl_image_response = '<?xml version="1.0" encoding="UTF-8"?><ARCXML version="1.1"><RESPONSE><IMAGE><ENVELOPE minx="-2471.42857142857" miny="0" maxx="105671.428571429" maxy="75700" /><OUTPUT url="http://localhost/output/364826560.png" /></IMAGE></RESPONSE></ARCXML>';
+    var axl_feature_response = '<?xml version="1.0" encoding="Cp1252"?><ARCXML version="1.1"><RESPONSE><FEATURES><FEATURE><FIELDS><FIELD name="UNIQUE_ID" value="514504b5-0458-461d-b540-8e18a454f619" /><FIELD name="LABEL" value="LIBRARY" /><FIELD name="Y_COORD" value="39.57" /><FIELD name="X_COORD" value="-104.24" /><FIELD name="#SHAPE#" value="[Geometry]" /><FIELD name="OBJECTID" value="1" /><FIELD name="shape.area" value="0" /><FIELD name="shape.len" value="0" /></FIELDS></FEATURE><FEAT [...]
+
+    //
+    // creating a new arcxml format creates an object that has a read and write function
+    //
+    function test_Format_ArcXML_constructor1(t) {
+        t.plan(4); 
+         
+        var format = new OpenLayers.Format.ArcXML(); 
+        t.ok(format instanceof OpenLayers.Format.ArcXML, 
+             "new OpenLayers.Format.ArcXML returns object" ); 
+
+        t.ok(format.request, null, "no options creates a null request");
+
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+
+    //
+    // creating a new arcxml format with a set of options for an image request
+    // creates a request child object, and a get_image grandchild.
+    //
+    function test_Format_ArcXML_constructor2(t) { 
+        t.plan(6); 
+        
+        var options = {
+          requesttype:'image',
+          envelope: new OpenLayers.Bounds( -180, -90, 180, 90 ).toArray(),
+          layers: [],
+          tileSize: new OpenLayers.Size( 256,256 ),
+          featureCoordSys: '4326',
+          filterCoordSys: '4326'
+        };
+        
+        var format = new OpenLayers.Format.ArcXML( options );
+        t.ok(format instanceof OpenLayers.Format.ArcXML, 
+             "new OpenLayers.Format.ArcXML returns object" ); 
+    		 
+        t.ok(format.request instanceof OpenLayers.Format.ArcXML.Request, 
+            "constructor with 'image' requesttype generates a request");
+        t.ok( format.request.get_image !== null, "get_image property exists" );
+        t.ok( format.request.get_feature === null, "get_feature property does not exists" );        
+
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+
+    //
+    // creating a new arcxml format with a set of options for a feature request
+    // creates a request child object, and a get_feature grandchild
+    //
+    function test_Format_ArcXML_constructor3(t) { 
+        t.plan(6); 
+         
+        var options = {
+          requesttype:'feature'
+        };
+        
+        var format = new OpenLayers.Format.ArcXML( options ); 
+        t.ok(format instanceof OpenLayers.Format.ArcXML, 
+             "new OpenLayers.Format.ArcXML returns object" ); 
+    		 
+        t.ok(format.request instanceof OpenLayers.Format.ArcXML.Request, 
+            "constructor with 'feature' requesttype generates a request");
+        t.ok( format.request.get_feature !== null, "get_feature property exists" );
+        t.ok( format.request.get_image === null, "get_image property does not exists" );        
+
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+
+    //
+    // read in a known good axl image response
+    //
+    function test_Format_ArcXML_read1(t) {
+        t.plan(4);
+        var f = new OpenLayers.Format.ArcXML();
+        var response = f.read(axl_image_response);
+        
+        t.ok(response !== null, "get_image response object is not null" );
+        t.ok(response.image !== null, "get_image image tag is not null");
+        t.ok(response.image.envelope !== null, "get_image image envelope tag is not null");
+        t.ok(response.image.output !== null, "get_image image output tag is not null");
+    }
+
+    //
+    // read in a known good axl feature response
+    //
+    function test_Format_ArcXML_read2(t) {
+        t.plan(10);
+        var f = new OpenLayers.Format.ArcXML();
+        var response = f.read(axl_feature_response);
+        
+        t.ok(response !== null, "get_feature response object is not null" );
+        t.ok(response.features !== null, "get_feature features tag is not null");
+        t.ok(response.features.envelope !== null, "get_feature envelope tag is not null");
+        t.eq(response.features.featurecount, "2", "feature count is 2" );
+        
+        // test the second feature parsed
+        // <FIELD name="UNIQUE_ID" value="514504b5-0458-461d-b540-8e81a454f619" />
+        // <FIELD name="LABEL" value="LIBRARY2" />
+        // <FIELD name="Y_COORD" value="39.75" />
+        // <FIELD name="X_COORD" value="-104.42" />
+        // <FIELD name="#SHAPE#" value="[Geometry]" />
+        // <FIELD name="OBJECTID" value="2" />
+        // <FIELD name="shape.area" value="0" />
+        // <FIELD name="shape.len" value="0" />
+        t.eq( response.features.feature[1].attributes['UNIQUE_ID'], "514504b5-0458-461d-b540-8e81a454f619", "field 1 for feature 2 is correct" );
+        t.eq( response.features.feature[1].attributes['LABEL'], "LIBRARY2", "field 2 for feature 2 is correct" );
+        t.eq( response.features.feature[1].attributes['Y_COORD'], "39.75", "field 3 for feature 2 is correct" );
+        t.eq( response.features.feature[1].attributes['X_COORD'], "-104.42", "field 4 for feature 2 is correct" );
+        t.eq( response.features.feature[1].attributes['#SHAPE#'], "[Geometry]", "field 5 for feature 2 is correct" );
+        t.eq( response.features.feature[1].attributes['OBJECTID'], "2", "field 6 for feature 2 is correct" );
+    }
+
+    //
+    // cause an error by parsing bad axl
+    //
+    function test_Format_ArcXML_parseerror(t) {
+        t.plan(1);
+        var f = new OpenLayers.Format.ArcXML();
+        
+        try {
+            f.read( '<?xml version="1.0" encoding="Cp1252"?><ARCXML version="1.1"><NO END TAG>' );
+            t.fail("parsing failed to fail")
+        } catch (ex) {
+            t.ok( true, "Exception message indicates parsing error." );
+        }
+    }
+
+    //
+    // create an arcxml image request, and verify that it matches a known image request
+    //
+    function test_format_ArcXML_write1(t) {
+        var options = {
+            requesttype:'image',
+            envelope: new OpenLayers.Bounds( -180, -90, 180, 90 ).toArray(),
+            layers: [],
+            tileSize: new OpenLayers.Size( 256,256 ),
+            featureCoordSys: '4326',
+            filterCoordSys: '4326'
+        };
+        var truth = '<ARCXML version="1.1"><REQUEST><GET_IMAGE><PROPERTIES><FEATURECOORDSYS id="4326"/><FILTERCOORDSYS id="4326"/><ENVELOPE minx="-180" miny="-90" maxx="180" maxy="90"/><IMAGESIZE height="256" width="256"/></PROPERTIES></GET_IMAGE></REQUEST></ARCXML>';
+        axl_write(t,options,truth);
+    }
+
+    //
+    // create an arcxml image request that specifies layer visibilities, and
+    // verify that it matches a known image request
+    //
+    function test_format_ArcXML_write2(t) {
+        var options = {
+            requesttype:'image',
+            envelope: new OpenLayers.Bounds( -180, -90, 180, 90 ).toArray(),
+            layers: [{
+                id: "0",
+                visible: "true"
+            }],
+            tileSize: new OpenLayers.Size( 256,256 ),
+            featureCoordSys: '4326',
+            filterCoordSys: '4326'
+        };
+        var truth = '<ARCXML version="1.1"><REQUEST><GET_IMAGE><PROPERTIES><FEATURECOORDSYS id="4326"/><FILTERCOORDSYS id="4326"/><ENVELOPE minx="-180" miny="-90" maxx="180" maxy="90"/><IMAGESIZE height="256" width="256"/><LAYERLIST><LAYERDEF id="0" visible="true"/></LAYERLIST></PROPERTIES></GET_IMAGE></REQUEST></ARCXML>';
+        axl_write(t, options, truth );
+    }
+
+    //
+    // create an arcxml image request that performs a query for thematic mapping,
+    // and verify that it matches a known image request
+    //
+    function test_format_ArcXML_write3(t) {
+        var options = {
+            requesttype:'image',
+            envelope: new OpenLayers.Bounds( -180, -90, 180, 90 ).toArray(),
+            layers: [{
+                id: "0",
+                visible: "true",
+                query: {
+                    where: "COMPANY='AVENCIA'"
+                }
+            }],
+            tileSize: new OpenLayers.Size( 256,256 ),
+            featureCoordSys: '4326',
+            filterCoordSys: '4326'
+        };
+        var truth = '<ARCXML version="1.1"><REQUEST><GET_IMAGE><PROPERTIES><FEATURECOORDSYS id="4326"/><FILTERCOORDSYS id="4326"/><ENVELOPE minx="-180" miny="-90" maxx="180" maxy="90"/><IMAGESIZE height="256" width="256"/><LAYERLIST><LAYERDEF id="0" visible="true"><QUERY where="COMPANY=\'AVENCIA\'"/></LAYERDEF></LAYERLIST></PROPERTIES></GET_IMAGE></REQUEST></ARCXML>';
+        axl_write(t, options, truth );
+    }
+
+    //
+    // create an arcxml image request that performs a spatial query for thematic mapping,
+    // and verify that it matches a known image request
+    //
+    function test_format_ArcXML_write4(t) {
+        var options = {
+            requesttype:'image',
+            envelope: new OpenLayers.Bounds( -180, -90, 180, 90 ).toArray(),
+            layers: [{
+                id: "0",
+                visible: "true",
+                query: {
+                    spatialfilter: true,
+                    where: "COMPANY='AVENCIA'"
+                }
+            }],
+            tileSize: new OpenLayers.Size( 256,256 ),
+            featureCoordSys: '4326',
+            filterCoordSys: '4326'
+        };
+        var truth = '<ARCXML version="1.1"><REQUEST><GET_IMAGE><PROPERTIES><FEATURECOORDSYS id="4326"/><FILTERCOORDSYS id="4326"/><ENVELOPE minx="-180" miny="-90" maxx="180" maxy="90"/><IMAGESIZE height="256" width="256"/><LAYERLIST><LAYERDEF id="0" visible="true"><SPATIALQUERY where="COMPANY=\'AVENCIA\'"/></LAYERDEF></LAYERLIST></PROPERTIES></GET_IMAGE></REQUEST></ARCXML>';
+        axl_write(t, options, truth );
+    }
+
+    //
+    // create an arcxml image request that performs a thematic map request, and
+    // verify that it matches a known image request.
+    //
+    function test_format_ArcXML_write5(t) {
+        var options = {
+            requesttype:'image',
+            envelope: new OpenLayers.Bounds( -180, -90, 180, 90 ).toArray(),
+            layers: [{
+                id: "0",
+                visible: "true",
+                query: {
+                    spatialfilter: true,
+                    where: "COMPANY='AVENCIA'"
+                },
+                renderer: {
+                    type: 'valuemap',
+                    lookupfield: 'lookup',
+                    ranges: [{
+                        lower: 0,
+                        upper: 10,
+                        symbol: {
+                            type: 'simplepolygon',
+                            fillcolor: '0,0,0'
+                        }
+                    },{
+                        lower: 10,
+                        upper: 20,
+                        symbol: {
+                            type: 'simplepolygon',
+                            fillcolor: '255,255,255'
+                        }
+                    }]
+                }
+            }],
+            tileSize: new OpenLayers.Size( 256,256 ),
+            featureCoordSys: '4326',
+            filterCoordSys: '4326'
+        };
+        var truth = '<ARCXML version="1.1"><REQUEST><GET_IMAGE><PROPERTIES><FEATURECOORDSYS id="4326"/><FILTERCOORDSYS id="4326"/><ENVELOPE minx="-180" miny="-90" maxx="180" maxy="90"/><IMAGESIZE height="256" width="256"/><LAYERLIST><LAYERDEF id="0" visible="true"><SPATIALQUERY where="COMPANY=\'AVENCIA\'"/><VALUEMAPRENDERER lookupfield="lookup"><RANGE lower="0" upper="10"><SIMPLEPOLYGONSYMBOL fillcolor="0,0,0"/></RANGE><RANGE lower="10" upper="20"><SIMPLEPOLYGONSYMBOL fillcolor="255,255, [...]
+        axl_write(t, options, truth );
+    }
+
+    //
+    // helper function to write some axl, and compare it against a truth axl string
+    //
+    function axl_write(t, options, truth) {
+        t.plan(1);
+        
+        var f = new OpenLayers.Format.ArcXML( options );
+        var arcxml = f.write();
+        t.eq( arcxml, truth, "ArcXML request is correct.");
+    }
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/ArcXML/Features.html b/tests/Format/ArcXML/Features.html
new file mode 100644
index 0000000..d971017
--- /dev/null
+++ b/tests/Format/ArcXML/Features.html
@@ -0,0 +1,69 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    var axl_feature_response = '<?xml version="1.0" encoding="Cp1252"?><ARCXML version="1.1"><RESPONSE><FEATURES><FEATURE><FIELDS><FIELD name="UNIQUE_ID" value="514504b5-0458-461d-b540-8e18a454f619" /><FIELD name="LABEL" value="LIBRARY" /><FIELD name="Y_COORD" value="39.57" /><FIELD name="X_COORD" value="-104.24" /><FIELD name="#SHAPE#" value="[Geometry]" /><FIELD name="OBJECTID" value="1" /><FIELD name="shape.area" value="0" /><FIELD name="shape.len" value="0" /></FIELDS></FEATURE><FEAT [...]
+    
+    //
+    // creating a new arcxml features format creates an object that has a read and write function
+    //
+    function test_initialize(t) { 
+        t.plan(3); 
+         
+        var format = new OpenLayers.Format.ArcXML.Features(); 
+        t.ok(format instanceof OpenLayers.Format.ArcXML.Features, 
+             "new OpenLayers.Format.ArcXML.Features returns object" ); 
+						 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+    
+    //
+    // read in a known good axl feature response
+    //
+    function test_read1(t) {
+        t.plan(8);
+        var f = new OpenLayers.Format.ArcXML.Features();
+        var features = f.read(axl_feature_response);
+        
+        t.ok(features !== null, "features are not null" );
+        t.eq(features.length, 2, "feature count is 2" );
+        
+        // test the second feature parsed
+        // <FIELD name="UNIQUE_ID" value="514504b5-0458-461d-b540-8e81a454f619" />
+        // <FIELD name="LABEL" value="LIBRARY2" />
+        // <FIELD name="Y_COORD" value="39.75" />
+        // <FIELD name="X_COORD" value="-104.42" />
+        // <FIELD name="#SHAPE#" value="[Geometry]" />
+        // <FIELD name="OBJECTID" value="2" />
+        // <FIELD name="shape.area" value="0" />
+        // <FIELD name="shape.len" value="0" />
+        t.eq( features[1].attributes['UNIQUE_ID'], "514504b5-0458-461d-b540-8e81a454f619", "field 1 for feature 2 is correct" );
+        t.eq( features[1].attributes['LABEL'], "LIBRARY2", "field 2 for feature 2 is correct" );
+        t.eq( features[1].attributes['Y_COORD'], "39.75", "field 3 for feature 2 is correct" );
+        t.eq( features[1].attributes['X_COORD'], "-104.42", "field 4 for feature 2 is correct" );
+        t.eq( features[1].attributes['#SHAPE#'], "[Geometry]", "field 5 for feature 2 is correct" );
+        t.eq( features[1].attributes['OBJECTID'], "2", "field 6 for feature 2 is correct" );
+    }
+    
+    //
+    // cause an error by parsing bad axl
+    //
+    function test_parseerror(t) {
+        t.plan(1);
+        var f = new OpenLayers.Format.ArcXML.Features();
+        
+        try {
+            f.read( '<?xml version="1.0" encoding="Cp1252"?><ARCXML version="1.1"><NO END TAG>' );
+            t.fail("reading didn't fail");
+        }  catch (ex) {
+            t.eq( ex.message, "Error parsing the ArcXML request", "Exception message indicates parsing error." );
+        }
+    }
+    
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/Atom.html b/tests/Format/Atom.html
new file mode 100644
index 0000000..52ee265
--- /dev/null
+++ b/tests/Format/Atom.html
@@ -0,0 +1,450 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(4); 
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.Atom(options); 
+        t.ok(format instanceof OpenLayers.Format.Atom, 
+             "new OpenLayers.Format.GeoRSS returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+
+    /* Reading tests */
+
+    function test_reproject_null(t) { 
+        t.plan(1);
+        var parser = new OpenLayers.Format.Atom({'internalProjection':new OpenLayers.Projection("EPSG:4326"), 'externalProjection': new OpenLayers.Projection("EPSG:4326")});
+        var data = parser.read(
+          // begin document
+          '<feed xmlns="http://www.w3.org/2005/Atom">'  +
+          '<entry></entry>'                             +
+          '</feed>'
+          // end document
+          );
+        t.eq(
+          data.length, 1, 
+          "Parsing items with null geometry and reprojection doesn't fail"
+          );
+    }
+
+    // read entry 1: basic entry, no categories or persons
+    function test_readentry1(t) { 
+        t.plan(10);
+        var parser = new OpenLayers.Format.Atom();
+        var data = parser.read(
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'                 +
+          '  <id>urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed</id>'    +
+          '  <link href="http://example.com/blog/1" rel="alternate"/>'  +
+          '  <summary>An Atom testing entry</summary>'                  +
+          '  <title>Atom test</title>'                                  +
+          '  <updated>2009-06-02T10:00:00Z</updated>'                   +
+          '</entry>'
+          // end document
+          );
+        t.ok(data instanceof Array, "Read features");
+        var fx = data[0];
+        t.ok(fx instanceof OpenLayers.Feature.Vector, "Read feature");
+        t.eq(fx.geometry, null, "Geometry is null");
+        t.eq(
+            fx.fid, 
+            "urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed", 
+            "Read fid"
+            );
+        var attrib = fx.attributes;
+        t.eq(attrib.title, "Atom test", "Correct title attribute");
+        t.eq(
+            attrib.description, 
+            "An Atom testing entry", 
+            "Correct description attribute"
+            );
+        var atomAttrib = attrib.atom;
+        t.eq(
+            atomAttrib.links, 
+            [{href: "http://example.com/blog/1", rel: "alternate"}], 
+            "Correct links in atom namespace"
+            );
+        t.eq(
+            atomAttrib.summary, 
+            "An Atom testing entry", 
+            "Correct summary in atom namespace"
+            );
+        t.eq(
+            atomAttrib.title, 
+            "Atom test", 
+            "Correct title in atom namespace"
+            );
+        t.eq(
+            atomAttrib.updated, 
+            "2009-06-02T10:00:00Z", 
+            "Correct timestamp in atom namespace"
+            );
+    }
+
+    // read entry 2: with georss:where
+    function test_readentry2(t) { 
+        t.plan(5);
+        var parser = new OpenLayers.Format.Atom();
+        var data = parser.read(
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'                   +
+          '  <id>urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed</id>'      +
+          '  <georss:where xmlns:georss="http://www.georss.org/georss">'  +
+          '    <gml:Point xmlns:gml="http://www.opengis.net/gml">'        +
+          '      <gml:pos>45.68 -111.04</gml:pos>'                        +
+          '    </gml:Point>'                                              +
+          '  </georss:where>'                                             +
+          '</entry>'
+          // end document
+          );
+        t.ok(data instanceof Array, "Read features");
+        var fx = data[0];
+        t.ok(fx instanceof OpenLayers.Feature.Vector, "Read feature");
+        t.ok(fx.geometry instanceof OpenLayers.Geometry.Point, "Read geometry");
+        t.eq(fx.geometry.x, -111.04, "Read x");
+        t.eq(fx.geometry.y, 45.68, "Read y");
+    }
+
+    // read entry 3: with georss:point
+    function test_readentry3(t) { 
+        t.plan(5);
+        var parser = new OpenLayers.Format.Atom();
+        var data = parser.read(
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'                   +
+          '  <id>urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed</id>'      +
+          '  <georss:point xmlns:georss="http://www.georss.org/georss">45.68 -111.04</georss:point>'                                                   +
+          '</entry>'
+          // end document
+          );
+        t.ok(data instanceof Array, "Read features");
+        var fx = data[0];
+        t.ok(fx instanceof OpenLayers.Feature.Vector, "Read feature");
+        t.ok(fx.geometry instanceof OpenLayers.Geometry.Point, "Read geometry");
+        t.eq(fx.geometry.x, -111.04, "Read x");
+        t.eq(fx.geometry.y, 45.68, "Read y");
+    }
+
+    // read entry 4: basic entry, text content
+    function test_readentry4(t) { 
+        t.plan(3);
+        var parser = new OpenLayers.Format.Atom();
+        var data = parser.read(
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'                 +
+          '  <id>urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed</id>'    +
+          '  <link href="http://example.com/blog/1" rel="alternate"/>'  +
+          '  <summary>An Atom testing entry</summary>'                  +
+          '  <title>Atom test</title>'                                  +
+          '  <updated>2009-06-02T10:00:00Z</updated>'                   +
+          '  <content type="text">Blah, blah, blah</content>'           +
+          '</entry>'
+          // end document
+          );
+        t.ok(data instanceof Array, "Read features");
+        var fx = data[0];
+        var attrib = fx.attributes;
+        var atomAttrib = attrib.atom;
+        t.eq(
+            atomAttrib.content.type, 
+            "text", 
+            "Correct content.type in atom namespace"
+            );
+        t.eq(
+            atomAttrib.content.value, 
+            "Blah, blah, blah", 
+            "Correct content.value in atom namespace"
+            );
+    }
+
+    // read entry 5: basic entry, KML content
+    function test_readentry5(t) { 
+        t.plan(3);
+        var parser = new OpenLayers.Format.Atom();
+        var data = parser.read(
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'                 +
+          '  <id>urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed</id>'    +
+          '  <link href="http://example.com/blog/1" rel="alternate"/>'  +
+          '  <summary>An Atom testing entry</summary>'                  +
+          '  <title>Atom test</title>'                                  +
+          '  <updated>2009-06-02T10:00:00Z</updated>'                   +
+          '  <content type="application/vnd.google-earth.kml+xml"><kml xmlns="http://earth.google.com/kml/2.0"><Folder><name>A folder</name><description>It\'s a folder</description></Folder></kml></content>'                          +
+          '</entry>'
+          // end document
+          );
+        t.ok(data instanceof Array, "Read features");
+        var fx = data[0];
+        var attrib = fx.attributes;
+        var atomAttrib = attrib.atom;
+        t.eq(
+            atomAttrib.content.type, 
+            "application/vnd.google-earth.kml+xml", 
+            "Correct content.type in atom namespace"
+            );
+        var node = atomAttrib.content.value;
+        var name = node.localName || node.nodeName.split(":").pop();
+        t.eq(
+            name, 
+            "kml", 
+            "Correct content.value in atom namespace"
+            );
+    }
+    
+    // read feed 1
+    function test_readfeed1(t) { 
+        t.plan(2);
+        var parser = new OpenLayers.Format.Atom();
+        var data = parser.read(
+          // begin document
+          '<feed xmlns="http://www.w3.org/2005/Atom">'                  +
+          '  <entry>'                                                   +
+          '    <id>urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed</id>'  +
+          '  </entry>'                                                  +
+          '</feed>'
+          // end document
+          );
+        t.ok(data instanceof Array, "Read features");
+        var fx = data[0];
+        t.ok(fx instanceof OpenLayers.Feature.Vector, "Read feature");
+    }
+    
+    /* Writing tests */
+  
+    // write entry 1: null geometry, no attributes
+    function test_writeentry1(t) { 
+        t.plan(1);
+        var writer = new OpenLayers.Format.Atom();
+        var feature = new OpenLayers.Feature.Vector(null, {});
+        feature.fid = '1';
+        var data = writer.write(feature);
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">' +
+          '<id>1</id>'                                  +
+          '<title>untitled</title>'                     +
+          '</entry>',
+          // end document 
+          'Writes an entry doc with id, no attributes'
+          );
+    }
+
+    // write entry 2: null geometry, well-known attributes
+    function test_writeentry2(t) { 
+        t.plan(1);
+        var writer = new OpenLayers.Format.Atom();
+        var feature = new OpenLayers.Feature.Vector(null, {title: "Test", description: "A testing feature"});
+        feature.fid = '1';
+        var data = writer.write(feature);
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">' +
+          '<id>1</id>'                                  +
+          '<summary>A testing feature</summary>'        +
+          '<title>Test</title>'                         +
+          '</entry>',
+          // end document
+          'Writes an entry doc with id, well-known attributes'
+          );
+    }
+
+    // write entry 3: null geometry, Atom constructs to override 
+    // well-known attributes
+    function test_writeentry3(t) { 
+        t.plan(1);
+        var writer = new OpenLayers.Format.Atom();
+        var feature = new OpenLayers.Feature.Vector(null, {title: "Test", description: "A testing feature", atom: {title: "Atom test", summary: "An Atom testing feature", updated: "2009-06-02T10:00:00Z"}});
+        feature.fid = '1';
+        var data = writer.write(feature);
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">' +
+          '<id>1</id>'                                  +
+          '<summary>An Atom testing feature</summary>'  +
+          '<title>Atom test</title>'                    +
+          '<updated>2009-06-02T10:00:00Z</updated>'     +
+          '</entry>',
+          // end document
+          'Writes an entry doc with Atom constructs overriding well-known atts'
+          );
+    }
+
+    // write entry 4: Atom categories
+    function test_writeentry4(t) { 
+        t.plan(1);
+        var writer = new OpenLayers.Format.Atom();
+        var feature = new OpenLayers.Feature.Vector(null, {title: "Test", description: "A testing feature", atom: {title: "Atom test", summary: "An Atom testing feature", updated: "2009-06-02T10:00:00Z", categories: [{term: "blog", scheme: "http://example.com/terms", label: "A blog post"}]}});
+        feature.fid = '1';
+        var data = writer.write(feature);
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">' +
+          '<category term="blog" scheme="http://example.com/terms" label="A blog post"/>'                                           +
+          '<id>1</id>'                                  +
+          '<summary>An Atom testing feature</summary>'  +
+          '<title>Atom test</title>'                    +
+          '<updated>2009-06-02T10:00:00Z</updated>'     +
+          '</entry>',
+          // end document
+          'Writes an entry doc with Atom constructs and categories'
+          );
+    }
+
+    // write entry 5: Atom authors, contributors
+    function test_writeentry5(t) { 
+        t.plan(1);
+        var writer = new OpenLayers.Format.Atom();
+        var feature = new OpenLayers.Feature.Vector(null, {title: "Test", description: "A testing feature", atom: {title: "Atom test", summary: "An Atom testing feature", updated: "2009-06-02T10:00:00Z", authors: [{name: "John Doe", uri: "http://example.com/people/jdoe", email: "jdoe at example.com"}], contributors: [{name: "Pikov Andropov", uri: "http://example.com/people/pandropov", email: "pandropov at example.com"}]}});
+        feature.fid = '1';
+        var data = writer.write(feature);
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">' +
+          '<author>'                                    +
+          '  <name>John Doe</name>'                     +
+          '  <uri>http://example.com/people/jdoe</uri>' +
+          '  <email>jdoe at example.com</email>'           +
+          '</author>'                                   +
+          '<contributor>'                               +
+          '  <name>Pikov Andropov</name>'               +
+          '  <uri>http://example.com/people/pandropov</uri>' +
+          '  <email>pandropov at example.com</email>'      +
+          '</contributor>'                              +
+          '<id>1</id>'                                  +
+          '<summary>An Atom testing feature</summary>'  +
+          '<title>Atom test</title>'                    +
+          '<updated>2009-06-02T10:00:00Z</updated>'     +
+          '</entry>',
+          // end document
+          'Writes an entry doc with Atom constructs and persons'
+          );
+    }
+
+    // write entry 6: Atom links
+    function test_writeentry6(t) { 
+        t.plan(1);
+        
+        // Feature attributes in Atom namespace
+        var atomAttrib = {
+              title: "Atom test", 
+              summary: "An Atom testing feature", 
+              updated: "2009-06-02T10:00:00Z", 
+              links: [
+                { href: "http://example.com/blog/1", rel: "alternate" }
+                ]
+              };
+        var fx = new OpenLayers.Feature.Vector(null, {atom: atomAttrib});
+        fx.fid = 'urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed';
+        
+        var writer = new OpenLayers.Format.Atom();
+        var data = writer.write(fx);
+        
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'               +
+          '<id>urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed</id>'    +
+          '<link href="http://example.com/blog/1" rel="alternate"/>'  +
+          '<summary>An Atom testing feature</summary>'                +
+          '<title>Atom test</title>'                                  +
+          '<updated>2009-06-02T10:00:00Z</updated>'                   +
+          '</entry>',
+          // end document
+          'Writes an entry doc with Atom constructs and links'
+          );
+    }
+
+    // write out point -- just enough to see that we're getting the
+    // georss:where element with a Point. We'll trust GML.v3 to get the
+    // details right.
+    function test_writepoint(t) { 
+        t.plan(1);
+
+        var point = new OpenLayers.Geometry.Point(-111.04, 45.68);  
+        var fx = new OpenLayers.Feature.Vector(point, {});
+        fx.fid = 'urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed';
+        
+        var writer = new OpenLayers.Format.Atom();
+        var data = writer.write(fx);
+        
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'                 +
+          '<id>urn:uuid:82ede847-b31a-4e3d-b773-7471bad154ed</id>'      +
+          '<title>untitled</title>'                                     +
+          '<georss:where xmlns:georss="http://www.georss.org/georss">'  +
+          '  <gml:Point xmlns:gml="http://www.opengis.net/gml">'        +
+          '    <gml:pos>45.68 -111.04</gml:pos>'                        +
+          '  </gml:Point>'                                              +
+          '</georss:where>'                                             +
+          '</entry>',
+          // end document
+          'Writes an entry doc with a point location'
+          );
+    }
+
+    // write entry 7: text type content
+    function test_writeentry7(t) { 
+        t.plan(1);
+        var writer = new OpenLayers.Format.Atom();
+        var feature = new OpenLayers.Feature.Vector(null, {title: "Test", description: "A testing feature", atom: {title: "Atom test", summary: "An Atom testing feature", updated: "2009-06-02T10:00:00Z", content: {type: "text", value: "Blah, blah, blah"}}});
+        feature.fid = '1';
+        var data = writer.write(feature);
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'     +
+          '<content type="text">Blah, blah, blah</content>' +
+          '<id>1</id>'                                      +
+          '<summary>An Atom testing feature</summary>'      +
+          '<title>Atom test</title>'                        +
+          '<updated>2009-06-02T10:00:00Z</updated>'         +
+          '</entry>',
+          // end document
+          'Writes an entry doc with Atom constructs overriding well-known atts'
+          );
+    }
+
+    // write entry 8: +xml type content
+    function test_writeentry8(t) { 
+        t.plan(1);
+        var kml = new OpenLayers.Format.KML();
+        kml.foldersName = "A folder";
+        kml.foldersDesc = "It's a folder";
+        var kmlDoc = kml.createElementNS(kml.kmlns, "kml");
+        var kmlFolder = kml.createFolderXML();
+        kmlDoc.appendChild(kmlFolder);
+        var writer = new OpenLayers.Format.Atom();
+        var feature = new OpenLayers.Feature.Vector(null, {title: "Test", description: "A testing feature", atom: {title: "Atom test", summary: "An Atom testing feature", updated: "2009-06-02T10:00:00Z", content: {type: "application/vnd.google-earth.kml+xml", value: kmlDoc}}});
+        feature.fid = '1';
+        var data = writer.write(feature);
+        t.xml_eq(
+          data,
+          // begin document
+          '<entry xmlns="http://www.w3.org/2005/Atom">'     +
+          '<content type="application/vnd.google-earth.kml+xml"><kml xmlns="http://earth.google.com/kml/2.0"><Folder><name>A folder</name><description>It\'s a folder</description></Folder></kml></content>' +
+          '<id>1</id>'                                      +
+          '<summary>An Atom testing feature</summary>'      +
+          '<title>Atom test</title>'                        +
+          '<updated>2009-06-02T10:00:00Z</updated>'         +
+          '</entry>',
+          // end document
+          'Writes an entry doc with Atom constructs overriding well-known atts'
+          );
+    }
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/CSWGetDomain.html b/tests/Format/CSWGetDomain.html
new file mode 100644
index 0000000..852989f
--- /dev/null
+++ b/tests/Format/CSWGetDomain.html
@@ -0,0 +1,23 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(2);
+
+        var format = new OpenLayers.Format.CSWGetDomain();
+        t.ok(format instanceof OpenLayers.Format.CSWGetDomain.v2_0_2, "constructor returns instance with default versioned format");
+
+        format = new OpenLayers.Format.CSWGetDomain({
+            version: "2.0.2"
+        });
+        t.ok(format instanceof OpenLayers.Format.CSWGetDomain.v2_0_2, "constructor returns instance with custom versioned format");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+</body>
+</html>
diff --git a/tests/Format/CSWGetDomain/v2_0_2.html b/tests/Format/CSWGetDomain/v2_0_2.html
new file mode 100644
index 0000000..81c51c5
--- /dev/null
+++ b/tests/Format/CSWGetDomain/v2_0_2.html
@@ -0,0 +1,56 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script src="v2_0_2.js"></script>
+    <script type="text/javascript">
+
+    var format = new OpenLayers.Format.CSWGetDomain();
+    
+    function test_write(t) {
+
+        t.plan(1);
+
+        var options = {
+            PropertyName: "type"
+        };
+
+        var result = format.write(options);
+
+        t.eq(result, csw_request, "check value returned by format " +
+                "CSWGetDomain: write method");
+
+    }
+
+    
+    function test_read(t) {
+        
+        t.plan(9);
+        
+        var obj = format.read(csw_response);
+        
+        var domainValues = obj.DomainValues;
+        // test getRecordsResponse object
+        t.ok(domainValues, "object contains DomainValues property");
+
+        // test DomainValues
+        t.eq(domainValues.length, 1, "object contains 1 object in DomainValues");
+        var domainValue = domainValues[0];
+        t.eq(domainValue.type, "csw:Record", "check value for attribute type");
+        t.eq(domainValue.PropertyName, "type", "check value for element PropertyName");
+        t.ok(domainValue.ListOfValues, "object contains ListOfValues property");
+
+        // test ListOfValues
+        t.eq(domainValue.ListOfValues.length, 2, "object contains 2 objects " +
+                "in ListOfValues");
+        var val = domainValue.ListOfValues[0];
+        t.ok(val.Value, "object contains Value property");
+        t.eq(val.Value.my_attr, "my_value", "check value for attribute my_attr");
+        t.eq(val.Value.value, "dataset", "check value for element Value");
+        
+    }
+    
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/CSWGetDomain/v2_0_2.js b/tests/Format/CSWGetDomain/v2_0_2.js
new file mode 100644
index 0000000..19e1ad0
--- /dev/null
+++ b/tests/Format/CSWGetDomain/v2_0_2.js
@@ -0,0 +1,18 @@
+var csw_request = 
+'<csw:GetDomain xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" service="CSW" version="2.0.2">' +
+  '<csw:PropertyName>type</csw:PropertyName>' +
+'</csw:GetDomain>';
+
+var csw_response = 
+'<?xml version="1.0" encoding="UTF-8"?>' +
+'<csw:GetDomainResponse xmlns:csw="http://www.opengis.net/cat/csw/2.0.2">' +
+  '<csw:DomainValues type="csw:Record">' +
+    '<csw:PropertyName>type</csw:PropertyName>' +
+    '<csw:ListOfValues>' +
+      '<csw:Value my_attr="my_value">dataset</csw:Value>' +
+      '<csw:Value>service</csw:Value>' +
+    '</csw:ListOfValues>' +
+  '</csw:DomainValues>' +
+'</csw:GetDomainResponse>'
+;
+
diff --git a/tests/Format/CSWGetRecords.html b/tests/Format/CSWGetRecords.html
new file mode 100644
index 0000000..f2f183b
--- /dev/null
+++ b/tests/Format/CSWGetRecords.html
@@ -0,0 +1,23 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(2);
+
+        var format = new OpenLayers.Format.CSWGetRecords();
+        t.ok(format instanceof OpenLayers.Format.CSWGetRecords.v2_0_2, "constructor returns instance with default versioned format");
+
+        format = new OpenLayers.Format.CSWGetRecords({
+            version: "2.0.2"
+        });
+        t.ok(format instanceof OpenLayers.Format.CSWGetRecords.v2_0_2, "constructor returns instance with custom versioned format");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+</body>
+</html>
diff --git a/tests/Format/CSWGetRecords/v2_0_2.html b/tests/Format/CSWGetRecords/v2_0_2.html
new file mode 100644
index 0000000..e32383e
--- /dev/null
+++ b/tests/Format/CSWGetRecords/v2_0_2.html
@@ -0,0 +1,81 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script src="v2_0_2.js"></script>
+    <script type="text/javascript">
+
+    var format = new OpenLayers.Format.CSWGetRecords();
+    
+    function test_write(t) {
+
+        t.plan(1);
+
+        var filter =  new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.LIKE,
+            property: "my_prop",
+            value: "my_prop_value"
+        });
+
+        var options = {
+            "resultType": "results",
+            "startPosition": "10",
+            "maxRecords": "20",
+            "Query": {
+                "ElementSetName": {
+                    "value": "brief"
+                },
+                "Constraint": {
+                    "version": "1.1.0",
+                    "Filter": filter
+                }
+            }
+        };
+
+        var result = format.write(options);
+
+        t.eq(result, csw_request, "check value returned by format " +
+                "CSWGetRecords: write method");
+
+    }
+
+    
+    function test_read(t) {
+        
+        t.plan(14);
+        
+        var obj = format.read(csw_response);
+        
+        var searchStatus = obj.SearchStatus;
+        var searchResults = obj.SearchResults;
+        var records = obj.records;
+        // test getRecordsResponse object
+        t.ok(searchStatus, "object contains SearchStatus property");
+        t.ok(searchResults, "object contains SearchResults property");
+        t.ok(records, "object contains records property");
+
+        // test SearchResults attributes
+        t.eq(searchResults.numberOfRecordsMatched, 10, "check value for SearchResults.numberOfRecordsMatched");
+        t.eq(searchResults.numberOfRecordsReturned, 2, "check value for SearchResults.numberOfRecordsReturned");
+        t.eq(searchResults.elementSet, "brief", "check value for SearchResults.elementSet");
+        t.eq(searchResults.nextRecord, 3, "check value for SearchResults.nextRecord");
+
+        // test records
+        t.eq(records.length, 2, "object contains 10 records");
+        var testRecord = records[0];
+        t.eq(testRecord.type, "BriefRecord", "check value for record.type");
+        t.eq(testRecord.title, [{value:"Sample title"}], "check value for record.title");
+
+        //test bbox
+        t.eq(testRecord.BoundingBox.length, 2, "object contains 2 BoundingBoxes");
+        var bbox = testRecord.BoundingBox[0];
+        t.ok(bbox, "object contains BoundingBox properties");
+        t.eq(bbox.crs, "::Lambert Azimuthal Projection", "check value for BoundingBox.crs");
+        t.eq(bbox.value, [156, -3, 37, 83], "check value for record.BoundingBox");
+        
+    }
+    
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/CSWGetRecords/v2_0_2.js b/tests/Format/CSWGetRecords/v2_0_2.js
new file mode 100644
index 0000000..c5fe31b
--- /dev/null
+++ b/tests/Format/CSWGetRecords/v2_0_2.js
@@ -0,0 +1,44 @@
+var csw_request = 
+'<csw:GetRecords xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" service="CSW" version="2.0.2" resultType="results" startPosition="10" maxRecords="20">' +
+  '<csw:Query typeNames="csw:Record">' +
+    '<csw:ElementSetName>brief</csw:ElementSetName>' +
+    '<csw:Constraint version="1.1.0">' +
+      '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+        '<ogc:PropertyIsLike wildCard="*" singleChar="." escapeChar="!">' +
+          '<ogc:PropertyName>my_prop</ogc:PropertyName>' +
+          '<ogc:Literal>my_prop_value</ogc:Literal>' +
+        '</ogc:PropertyIsLike>' +
+      '</ogc:Filter>' +
+    '</csw:Constraint>' +
+  '</csw:Query>' +
+'</csw:GetRecords>';
+
+var csw_response = 
+'<?xml version="1.0" encoding="UTF-8"?>' +
+'<csw:GetRecordsResponse xmlns:csw="http://www.opengis.net/cat/csw/2.0.2">' +
+  '<csw:SearchStatus timestamp="2009-06-08T12:03:34" />' +
+  '<csw:SearchResults numberOfRecordsMatched="10" numberOfRecordsReturned="2" elementSet="brief" nextRecord="3">' +
+    '<csw:BriefRecord xmlns:geonet="http://www.fao.org/geonetwork" xmlns:ows="http://www.opengis.net/ows" xmlns:dc="http://purl.org/dc/elements/1.1/">' +
+      '<dc:identifier>895ac38b-7aef-4a21-b593-b35a6fc7bba9</dc:identifier>' +
+      '<dc:title>Sample title</dc:title>' +
+      '<ows:BoundingBox crs="::Lambert Azimuthal Projection">' +
+        '<ows:LowerCorner>156 -3</ows:LowerCorner>' +
+        '<ows:UpperCorner>37 83</ows:UpperCorner>' +
+      '</ows:BoundingBox>' +
+      '<ows:BoundingBox crs="::WGS 1984">' +
+        '<ows:LowerCorner>51.1 -34.6</ows:LowerCorner>' +
+        '<ows:UpperCorner>-17.3 38.2</ows:UpperCorner>' +
+      '</ows:BoundingBox>' +
+    '</csw:BriefRecord>' +
+    '<csw:BriefRecord xmlns:geonet="http://www.fao.org/geonetwork" xmlns:ows="http://www.opengis.net/ows" xmlns:dc="http://purl.org/dc/elements/1.1/">' +
+      '<dc:identifier>8a7245c3-8546-42de-8e6f-8fb8b5fd1bc3</dc:identifier>' +
+      '<dc:title>Second record : sample title</dc:title>' +
+      '<ows:BoundingBox crs="::WGS 1984">' +
+        '<ows:LowerCorner>51.1 -34.6</ows:LowerCorner>' +
+        '<ows:UpperCorner>-17.3 38.2</ows:UpperCorner>' +
+      '</ows:BoundingBox>' +
+    '</csw:BriefRecord>' +
+  '</csw:SearchResults>' +
+'</csw:GetRecordsResponse>'
+;
+
diff --git a/tests/Format/Filter.html b/tests/Format/Filter.html
new file mode 100644
index 0000000..08866bd
--- /dev/null
+++ b/tests/Format/Filter.html
@@ -0,0 +1,21 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_initialize(t) { 
+        t.plan(3); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.Filter(options); 
+        t.ok(format instanceof OpenLayers.Format.Filter, 
+             "new OpenLayers.Format.Filter returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+    }
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/Filter/v1.html b/tests/Format/Filter/v1.html
new file mode 100644
index 0000000..f2bdbb7
--- /dev/null
+++ b/tests/Format/Filter/v1.html
@@ -0,0 +1,174 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_PropertyIsBetween(t) {
+
+        t.plan(6);
+
+        var test_wml, parser, xml;
+
+        parser = new OpenLayers.Format.Filter.v1();
+        xml = new OpenLayers.Format.XML();
+
+        test_xml =
+            '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                '<ogc:PropertyIsBetween>' +
+                    '<ogc:PropertyName>number</ogc:PropertyName>' +
+                    '<ogc:LowerBoundary>' +
+                        '<ogc:Literal>0</ogc:Literal>' +
+                    '</ogc:LowerBoundary>' +
+                    '<ogc:UpperBoundary>' +
+                        '<ogc:Literal>100</ogc:Literal>' +
+                    '</ogc:UpperBoundary>' +
+                '</ogc:PropertyIsBetween>' +
+            '</ogc:Filter>';
+
+        var filter = parser.read(xml.read(test_xml).documentElement);
+        t.eq(filter.type, OpenLayers.Filter.Comparison.BETWEEN,
+             "[0] read correct type");
+        t.eq(filter.lowerBoundary, 0,
+             "[0] record correct lower boundary value");
+        t.eq(filter.upperBoundary, 100,
+             "[0] record correct upper boundary value");
+
+        test_xml =
+            '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                '<ogc:PropertyIsBetween>' +
+                    '<ogc:PropertyName>number</ogc:PropertyName>' +
+                    '<ogc:LowerBoundary>0</ogc:LowerBoundary>' +
+                    '<ogc:UpperBoundary>100</ogc:UpperBoundary>' +
+                '</ogc:PropertyIsBetween>' +
+            '</ogc:Filter>';
+
+        var filter = parser.read(xml.read(test_xml).documentElement);
+        t.eq(filter.type, OpenLayers.Filter.Comparison.BETWEEN,
+             "[1] read correct type");
+        t.eq(filter.lowerBoundary, 0,
+             "[1] record correct lower boundary value");
+        t.eq(filter.upperBoundary, 100,
+             "[1] record correct upper boundary value");
+    }
+
+
+    function test_Intersects(t) {
+        
+        t.plan(4);
+        
+        var str =
+            '<Filter xmlns="http://www.opengis.net/ogc">' +
+                '<Intersects>' +
+                    '<PropertyName>Geometry</PropertyName>' +
+                    '<gml:Polygon xmlns:gml="http://www.opengis.net/gml">' +
+                        '<gml:outerBoundaryIs>' +
+                            '<gml:LinearRing>' +
+                                '<gml:coordinates decimal="." cs="," ts=" ">2488789,289552 2588789,289552 2588789,389552 2488789,389552 2488789,289552</gml:coordinates>' +
+                            '</gml:LinearRing>' +
+                        '</gml:outerBoundaryIs>' +
+                    '</gml:Polygon>' +
+                '</Intersects>' +
+            '</Filter>';
+
+        var format = new OpenLayers.Format.Filter.v1_0_0();
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.INTERSECTS,
+            property: "Geometry",
+            value: OpenLayers.Geometry.fromWKT("POLYGON((2488789 289552, 2588789 289552, 2588789 389552, 2488789 389552, 2488789 289552))")
+        });
+        
+        // test writing
+        var node = format.write(filter);
+        t.xml_eq(node, str, "filter correctly written");
+        
+        // test reading
+        var doc = (new OpenLayers.Format.XML).read(str);
+        var got = format.read(doc.firstChild);
+        t.eq(got.type, filter.type, "read correct type");
+        t.eq(got.property, filter.property, "read correct property");
+        t.geom_eq(got.value, filter.value, "read correct value");
+
+    }
+
+    function test_Within(t) {
+        
+        t.plan(4);
+        
+        var str =
+            '<Filter xmlns="http://www.opengis.net/ogc">' +
+                '<Within>' +
+                    '<PropertyName>Geometry</PropertyName>' +
+                    '<gml:Polygon xmlns:gml="http://www.opengis.net/gml">' +
+                        '<gml:outerBoundaryIs>' +
+                            '<gml:LinearRing>' +
+                                '<gml:coordinates decimal="." cs="," ts=" ">2488789,289552 2588789,289552 2588789,389552 2488789,389552 2488789,289552</gml:coordinates>' +
+                            '</gml:LinearRing>' +
+                        '</gml:outerBoundaryIs>' +
+                    '</gml:Polygon>' +
+                '</Within>' +
+            '</Filter>';
+
+        var format = new OpenLayers.Format.Filter.v1_0_0();
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.WITHIN,
+            property: "Geometry",
+            value: OpenLayers.Geometry.fromWKT("POLYGON((2488789 289552, 2588789 289552, 2588789 389552, 2488789 389552, 2488789 289552))")
+        });
+        
+        // test writing
+        var node = format.write(filter);
+        t.xml_eq(node, str, "filter correctly written");
+        
+        // test reading
+        var doc = (new OpenLayers.Format.XML).read(str);
+        var got = format.read(doc.firstChild);
+        t.eq(got.type, filter.type, "read correct type");
+        t.eq(got.property, filter.property, "read correct property");
+        t.geom_eq(got.value, filter.value, "read correct value");
+
+    }
+
+    function test_Contains(t) {
+        
+        t.plan(4);
+        
+        var str =
+            '<Filter xmlns="http://www.opengis.net/ogc">' +
+                '<Contains>' +
+                    '<PropertyName>Geometry</PropertyName>' +
+                    '<gml:Polygon xmlns:gml="http://www.opengis.net/gml">' +
+                        '<gml:outerBoundaryIs>' +
+                            '<gml:LinearRing>' +
+                                '<gml:coordinates decimal="." cs="," ts=" ">2488789,289552 2588789,289552 2588789,389552 2488789,389552 2488789,289552</gml:coordinates>' +
+                            '</gml:LinearRing>' +
+                        '</gml:outerBoundaryIs>' +
+                    '</gml:Polygon>' +
+                '</Contains>' +
+            '</Filter>';
+
+        var format = new OpenLayers.Format.Filter.v1_0_0();
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.CONTAINS,
+            property: "Geometry",
+            value: OpenLayers.Geometry.fromWKT("POLYGON((2488789 289552, 2588789 289552, 2588789 389552, 2488789 389552, 2488789 289552))")
+        });
+        
+        // test writing
+        var node = format.write(filter);
+        t.xml_eq(node, str, "filter correctly written");
+        
+        // test reading
+        var doc = (new OpenLayers.Format.XML).read(str);
+        var got = format.read(doc.firstChild);
+        t.eq(got.type, filter.type, "read correct type");
+        t.eq(got.property, filter.property, "read correct property");
+        t.geom_eq(got.value, filter.value, "read correct value");
+
+    }
+
+
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/Filter/v1_0_0.html b/tests/Format/Filter/v1_0_0.html
new file mode 100644
index 0000000..8aab3d7
--- /dev/null
+++ b/tests/Format/Filter/v1_0_0.html
@@ -0,0 +1,160 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    var test_xml =
+        '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+            '<ogc:Or>' +
+                '<ogc:PropertyIsBetween>' +
+                    '<ogc:PropertyName>number</ogc:PropertyName>' +
+                    '<ogc:LowerBoundary>' +
+                        '<ogc:Literal>1064866676</ogc:Literal>' +
+                    '</ogc:LowerBoundary>' +
+                    '<ogc:UpperBoundary>' +
+                        '<ogc:Literal>1065512599</ogc:Literal>' +
+                    '</ogc:UpperBoundary>' +
+                '</ogc:PropertyIsBetween>' +
+                '<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">' +
+                    '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                    '<ogc:Literal>*dog.food!*good</ogc:Literal>' +
+                '</ogc:PropertyIsLike>' +
+                '<ogc:Not>' +
+                    '<ogc:PropertyIsLessThanOrEqualTo>' +
+                        '<ogc:PropertyName>FOO</ogc:PropertyName>' +
+                        '<ogc:Literal>5000</ogc:Literal>' +
+                    '</ogc:PropertyIsLessThanOrEqualTo>' +
+                '</ogc:Not>' +
+            '</ogc:Or>' +
+        '</ogc:Filter>';
+
+    function test_read(t) {
+        t.plan(3);
+
+        var parser = new OpenLayers.Format.Filter.v1_0_0();
+        var xml = new OpenLayers.Format.XML();
+        var filter = parser.read(xml.read(test_xml).documentElement);
+
+        t.ok(filter instanceof OpenLayers.Filter.Logical, "instance of correct class");
+        t.eq(filter.type, OpenLayers.Filter.Logical.OR, "correct type");
+        t.eq(filter.filters.length, 3, "correct number of child filters");
+    }
+    
+    function test_write(t) {
+        t.plan(1);
+
+        // read first - testing that write produces the ogc:Filter element above
+        var parser = new OpenLayers.Format.Filter.v1_0_0();
+        var xml = new OpenLayers.Format.XML();
+        var filter = parser.read(xml.read(test_xml).documentElement);
+        
+        var node = parser.write(filter);
+        t.xml_eq(node, test_xml, "filter correctly written");
+        
+    }
+    
+    function test_BBOX(t) {
+        t.plan(1);
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            property: "the_geom",
+            value: new OpenLayers.Bounds(-180, -90, 180, 90),
+            projection: "EPSG:4326"
+        });
+        
+        var out =
+            '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                '<ogc:BBOX>' +
+                    '<ogc:PropertyName>the_geom</ogc:PropertyName>' +
+                    '<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">' +
+                        '<gml:coordinates decimal="." cs="," ts=" ">-180,-90 180,90</gml:coordinates>' +
+                    '</gml:Box>' +
+                '</ogc:BBOX>' +
+            '</ogc:Filter>';
+        
+        var parser = new OpenLayers.Format.Filter.v1_0_0();
+        var node = parser.write(filter);
+        
+        t.xml_eq(node, out, "bbox correctly written");
+    }
+
+    function test_DWithin(t) {
+        
+        t.plan(6);
+        
+        var str =
+            '<Filter xmlns="http://www.opengis.net/ogc">' +
+                '<DWithin>' +
+                    '<PropertyName>Geometry</PropertyName>' +
+                    '<gml:Point xmlns:gml="http://www.opengis.net/gml">' +
+                        '<gml:coordinates decimal="." cs="," ts=" ">2488789,289552</gml:coordinates>' +
+                    '</gml:Point>' +
+                    '<Distance units="m">1000</Distance>' +
+                '</DWithin>' +
+            '</Filter>';
+
+        var format = new OpenLayers.Format.Filter.v1_0_0();
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.DWITHIN,
+            property: "Geometry",
+            value: new OpenLayers.Geometry.Point(2488789,289552),
+            distance: 1000,
+            distanceUnits: "m"
+        });
+        
+        // test writing
+        var node = format.write(filter);
+        t.xml_eq(node, str, "filter correctly written");
+        
+        // test reading
+        var doc = (new OpenLayers.Format.XML).read(str);
+        var got = format.read(doc.firstChild);
+        t.eq(got.type, filter.type, "read correct type");
+        t.eq(got.property, filter.property, "read correct property");
+        t.geom_eq(got.value, filter.value, "read correct value");
+        t.eq(got.distance, filter.distance, "read correct distance");
+        t.eq(got.distanceUnits, filter.distanceUnits, "read correct distance units");
+
+    }
+
+    function test_Intersects(t) {
+        
+        t.plan(4);
+        
+        var str =
+            '<Filter xmlns="http://www.opengis.net/ogc">' +
+                '<Intersects>' +
+                    '<PropertyName>Geometry</PropertyName>' +
+                    '<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">' +
+                        '<gml:coordinates decimal="." cs="," ts=" ">-180,-90 180,90</gml:coordinates>' +
+                    '</gml:Box>' +
+                '</Intersects>' +
+            '</Filter>';
+
+        var format = new OpenLayers.Format.Filter.v1_0_0();
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.INTERSECTS,
+            property: "Geometry",
+            value: new OpenLayers.Bounds(-180, -90, 180, 90),
+            projection: "EPSG:4326"
+        });
+        
+        // test writing
+        var node = format.write(filter);
+        t.xml_eq(node, str, "filter correctly written");
+        
+        // test reading
+        var doc = (new OpenLayers.Format.XML).read(str);
+        var got = format.read(doc.firstChild);
+        t.eq(got.type, filter.type, "read correct type");
+        t.eq(got.property, filter.property, "read correct property");
+        t.eq(got.value.toArray(), filter.value.toArray(), "read correct value");
+
+    }
+
+
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/Filter/v1_1_0.html b/tests/Format/Filter/v1_1_0.html
new file mode 100644
index 0000000..796a903
--- /dev/null
+++ b/tests/Format/Filter/v1_1_0.html
@@ -0,0 +1,210 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    var test_xml =
+        '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+            '<ogc:Or>' +
+                '<ogc:PropertyIsBetween>' +
+                    '<ogc:PropertyName>number</ogc:PropertyName>' +
+                    '<ogc:LowerBoundary>' +
+                        '<ogc:Literal>1064866676</ogc:Literal>' +
+                    '</ogc:LowerBoundary>' +
+                    '<ogc:UpperBoundary>' +
+                        '<ogc:Literal>1065512599</ogc:Literal>' +
+                    '</ogc:UpperBoundary>' +
+                '</ogc:PropertyIsBetween>' +
+                '<ogc:PropertyIsLike wildCard="*" singleChar="." escapeChar="!">' +
+                    '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                    '<ogc:Literal>*dog.food!*good</ogc:Literal>' +
+                '</ogc:PropertyIsLike>' +
+                '<ogc:Not>' +
+                    '<ogc:PropertyIsLessThanOrEqualTo>' +
+                        '<ogc:PropertyName>FOO</ogc:PropertyName>' +
+                        '<ogc:Literal>5000</ogc:Literal>' +
+                    '</ogc:PropertyIsLessThanOrEqualTo>' +
+                '</ogc:Not>' +
+                '<ogc:PropertyIsEqualTo matchCase="true">' +
+                    '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                    '<ogc:Literal>dog</ogc:Literal>' +
+                '</ogc:PropertyIsEqualTo>' +
+                '<ogc:PropertyIsEqualTo matchCase="false">' +
+                    '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                    '<ogc:Literal>dog</ogc:Literal>' +
+                '</ogc:PropertyIsEqualTo>' +
+            '</ogc:Or>' +
+        '</ogc:Filter>';
+
+    function test_read(t) {
+        t.plan(3);
+
+        var parser = new OpenLayers.Format.Filter.v1_1_0();
+        var xml = new OpenLayers.Format.XML();
+        var filter = parser.read(xml.read(test_xml).documentElement);
+
+        t.ok(filter instanceof OpenLayers.Filter.Logical, "instance of correct class");
+        t.eq(filter.type, OpenLayers.Filter.Logical.OR, "correct type");
+        t.eq(filter.filters.length, 5, "correct number of child filters");
+    }
+    
+    function test_write(t) {
+        t.plan(1);
+
+        // read first - testing that write produces the ogc:Filter element above
+        var parser = new OpenLayers.Format.Filter.v1_1_0();
+        var xml = new OpenLayers.Format.XML();
+        var filter = parser.read(xml.read(test_xml).documentElement);
+        
+        var node = parser.write(filter);
+        t.xml_eq(node, test_xml, "filter correctly written");
+        
+    }
+    
+    function test_matchCase(t) {
+        var parser = new OpenLayers.Format.Filter.v1_1_0();
+        var xml = new OpenLayers.Format.XML();
+        
+        var cases = [{
+            str:
+                '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                    '<ogc:PropertyIsEqualTo>' +
+                        '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                        '<ogc:Literal>dog</ogc:Literal>' +
+                    '</ogc:PropertyIsEqualTo>' +
+                '</ogc:Filter>',
+            exp: true
+        }, {
+            str:
+                '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                    '<ogc:PropertyIsEqualTo matchCase="1">' +
+                        '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                        '<ogc:Literal>dog</ogc:Literal>' +
+                    '</ogc:PropertyIsEqualTo>' +
+                '</ogc:Filter>',
+            exp: true
+        }, {
+            str:
+                '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                    '<ogc:PropertyIsEqualTo matchCase="true">' +
+                        '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                        '<ogc:Literal>dog</ogc:Literal>' +
+                    '</ogc:PropertyIsEqualTo>' +
+                '</ogc:Filter>',
+            exp: true
+        }, {
+            str:
+                '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                    '<ogc:PropertyIsEqualTo matchCase="0">' +
+                        '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                        '<ogc:Literal>dog</ogc:Literal>' +
+                    '</ogc:PropertyIsEqualTo>' +
+                '</ogc:Filter>',
+            exp: false
+        }, {
+            str:
+                '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                    '<ogc:PropertyIsEqualTo matchCase="0">' +
+                        '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                        '<ogc:Literal>dog</ogc:Literal>' +
+                    '</ogc:PropertyIsEqualTo>' +
+                '</ogc:Filter>',
+            exp: false
+        }, {
+            str:
+                '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                    '<ogc:PropertyIsNotEqualTo matchCase="true">' +
+                        '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                        '<ogc:Literal>dog</ogc:Literal>' +
+                    '</ogc:PropertyIsNotEqualTo>' +
+                '</ogc:Filter>',
+            exp: true
+        }, {
+            str:
+                '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                    '<ogc:PropertyIsNotEqualTo matchCase="false">' +
+                        '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                        '<ogc:Literal>dog</ogc:Literal>' +
+                    '</ogc:PropertyIsNotEqualTo>' +
+                '</ogc:Filter>',
+            exp: false
+        }];
+        
+        t.plan(cases.length);
+        
+        var filter, c;
+        for(var i=0; i<cases.length; ++i) {
+            c = cases[i];
+            filter = parser.read(xml.read(c.str).documentElement);
+            t.eq(filter.matchCase, c.exp, "case " + i);
+        }
+        
+    }
+
+    function test_BBOX(t) {
+        t.plan(1);
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            property: "the_geom",
+            value: new OpenLayers.Bounds(-180, -90, 180, 90),
+            projection: "EPSG:4326"
+        });
+        
+        var out =
+            '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                '<ogc:BBOX>' +
+                    '<ogc:PropertyName>the_geom</ogc:PropertyName>' +
+                    '<gml:Envelope xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">' +
+                        '<gml:lowerCorner>-180 -90</gml:lowerCorner>' +
+                        '<gml:upperCorner>180 90</gml:upperCorner>' +
+                    '</gml:Envelope>' +
+                '</ogc:BBOX>' +
+            '</ogc:Filter>';
+        
+        var parser = new OpenLayers.Format.Filter.v1_1_0();
+        var node = parser.write(filter);
+        
+        t.xml_eq(node, out, "bbox correctly written");
+    }
+    
+    function test_Intersects(t) {
+        
+        t.plan(4);
+        
+        var str =
+            '<Filter xmlns="http://www.opengis.net/ogc">' +
+                '<Intersects>' +
+                    '<PropertyName>Geometry</PropertyName>' +
+                    '<gml:Envelope xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">' +
+                        '<gml:lowerCorner>-180 -90</gml:lowerCorner>' +
+                        '<gml:upperCorner>180 90</gml:upperCorner>' +
+                    '</gml:Envelope>' +
+                '</Intersects>' +
+            '</Filter>';
+
+        var format = new OpenLayers.Format.Filter.v1_1_0();
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.INTERSECTS,
+            property: "Geometry",
+            value: new OpenLayers.Bounds(-180, -90, 180, 90),
+            projection: "EPSG:4326"
+        });
+        
+        // test writing
+        var node = format.write(filter);
+        t.xml_eq(node, str, "filter correctly written");
+        
+        // test reading
+        var doc = (new OpenLayers.Format.XML).read(str);
+        var got = format.read(doc.firstChild);
+        t.eq(got.type, filter.type, "read correct type");
+        t.eq(got.property, filter.property, "read correct property");
+        t.eq(got.value.toArray(), filter.value.toArray(), "read correct value");
+
+    }
+
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/GML.html b/tests/Format/GML.html
new file mode 100644
index 0000000..d899dfb
--- /dev/null
+++ b/tests/Format/GML.html
@@ -0,0 +1,462 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_Format_GML_constructor(t) { 
+        t.plan(4); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.GML(options); 
+        t.ok(format instanceof OpenLayers.Format.GML, 
+             "new OpenLayers.Format.GML returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    } 
+    function test_Format_GML_getFid(t) { 
+        t.plan(2);
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(test_content[1]);
+        t.eq(data[0].fid, '221', 'fid on polygons set correctly (with whitespace)');
+        t.eq(data[1].fid, '8', 'fid on linestrings set correctly with whitespace'); 
+    }
+    function test_Format_GML_no_clobber(t) { 
+        t.plan(1); 
+        var parser = new OpenLayers.Format.GML(); 
+        data = parser.read(test_content[1]); 
+        t.eq(window.i, undefined,
+             "i is undefined in window scope after reading."); 
+    }
+    function test_Format_GML_read_3d(t) {
+        t.plan(2);
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(test_content[0]);
+        t.eq(data[0].geometry.getBounds().toBBOX(), "-1254041.389712,250906.951598,-634517.119991,762236.29408", "Reading 3d content returns geometry with correct bounds (no 0,0)");
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "Reading 3d content returns polygon geometry");
+    }   
+    function test_Format_GML_write_geoms(t) {
+        t.plan(5);
+        var parser = new OpenLayers.Format.GML();
+        
+        var point = shell_start + serialize_geoms['point'] + shell_end;
+        data = parser.read(point);
+        var output = parser.write(data);
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, point, "Point geometry round trips correctly.");
+        
+        var linestring = shell_start + serialize_geoms['linestring'] + shell_end;
+        data = parser.read(linestring);
+        var output = parser.write(data);
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, linestring, "Line geometry round trips correctly.");
+        
+        var polygon = shell_start + serialize_geoms['polygon'] + shell_end;
+        data = parser.read(polygon);
+        var output = parser.write(data);
+        output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, polygon, "Poly geometry round trips correctly.");
+        
+        var multipoint = shell_start + serialize_geoms['multipoint'] + shell_end;
+        data = parser.read(multipoint);
+        var output = parser.write(data);
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, multipoint, "MultiPoint geometry round trips correctly.");
+        
+        var multilinestring = shell_start + serialize_geoms['multilinestring'] + shell_end;
+        data = parser.read(multilinestring);
+        var output = parser.write(data);
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, multilinestring, "MultiLine geometry round trips correctly.");
+
+    }    
+    function test_Format_GML_read_point_geom(t) {
+        t.plan(3);
+        
+        var point = shell_start + geoms['point'] + shell_end;
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(point);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Point", "Point GML returns correct classname");
+        t.eq(data[0].geometry.x, 1, "x coord correct");
+        t.eq(data[0].geometry.y, 2, "y coord correct");
+    }
+    function test_Format_GML_read_linestring_geom(t) {
+        t.plan(5);
+        
+        var line = shell_start + geoms['linestring'] + shell_end;
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(line);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.LineString", "LineString GML returns correct classname");
+        t.eq(data[0].geometry.components[0].x, 1, "first x coord correct");
+        t.eq(data[0].geometry.components[0].y, 2, "first y coord correct");
+        t.eq(data[0].geometry.components[1].x, 4, "second x coord correct");
+        t.eq(data[0].geometry.components[1].y, 5, "second y coord correct");
+    }    
+    function test_Format_GML_read_polygon_geom(t) {
+        t.plan(7);
+        
+        var polygon = shell_start + geoms['polygon'] + shell_end;
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(polygon);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "Polygon GML returns correct classname");
+        t.eq(data[0].geometry.components[0].components[0].x, 1, "first x coord correct");
+        t.eq(data[0].geometry.components[0].components[0].y, 2, "first y coord correct");
+        t.eq(data[0].geometry.components[0].components[1].x, 4, "second x coord correct");
+        t.eq(data[0].geometry.components[0].components[1].y, 5, "second y coord correct");
+        t.eq(data[0].geometry.components[0].components.length, 4, "coords length correct");
+        t.eq(data[0].geometry.components.length, 1, "rings length correct");
+    }   
+    function test_Format_GML_read_multipoint_geom(t) {
+        t.plan(6);
+        
+        var multipoint = shell_start + geoms['multipoint'] + shell_end;
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(multipoint);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.MultiPoint", "MultiPoint GML returns correct classname");
+        t.eq(data[0].geometry.components[0].x, 1, "x coord correct");
+        t.eq(data[0].geometry.components[0].y, 2, "y coord correct");
+        t.eq(data[0].geometry.components.length, 2, "length correct");
+        t.eq(data[0].geometry.components[1].x, 4, "x coord correct");
+        t.eq(data[0].geometry.components[1].y, 5, "y coord correct");
+    }    
+    function test_Format_GML_read_multilinestring_geom(t) {
+        t.plan(6);
+        
+        var multilinestring = shell_start + geoms['multilinestring'] + shell_end;
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(multilinestring);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.MultiLineString", "MultiLineString GML returns correct classname");
+        t.eq(data[0].geometry.components[0].components[0].x, 1, "x coord correct");
+        t.eq(data[0].geometry.components[0].components[0].y, 2, "y coord correct");
+        t.eq(data[0].geometry.components[0].components.length, 2, "length correct");
+        t.eq(data[0].geometry.components[0].components[1].x, 4, "x coord correct");
+        t.eq(data[0].geometry.components[0].components[1].y, 5, "y coord correct");
+        
+    }    
+    function test_Format_GML_read_polygon_with_holes_geom(t) {
+        t.plan(12);
+        
+        var polygon_with_holes = shell_start + geoms['polygon_with_holes'] + shell_end;
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(polygon_with_holes);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "Polygon GML returns correct classname");
+        t.eq(data[0].geometry.components[0].components[0].x, 1, "first x coord correct");
+        t.eq(data[0].geometry.components[0].components[0].y, 2, "first y coord correct");
+        t.eq(data[0].geometry.components[0].components[1].x, 4, "second x coord correct");
+        t.eq(data[0].geometry.components[0].components[1].y, 5, "second y coord correct");
+        t.eq(data[0].geometry.components[0].components.length, 4, "coords length correct");
+        t.eq(data[0].geometry.components[1].components[0].x, 11, "first x coord correct");
+        t.eq(data[0].geometry.components[1].components[0].y, 12, "first y coord correct");
+        t.eq(data[0].geometry.components[1].components[1].x, 14, "second x coord correct");
+        t.eq(data[0].geometry.components[1].components[1].y, 15, "second y coord correct");
+        t.eq(data[0].geometry.components[1].components.length, 4, "coords length correct");
+        t.eq(data[0].geometry.components.length, 2, "rings length correct");
+    }
+    function test_Format_GML_read_attributes(t) {
+        t.plan(3);
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(test_content[0]);
+        t.eq(data[0].attributes['NAME'], "WY", "Simple Attribute data is read correctly.");
+        t.eq(data[0].attributes['LONGNAME'], "Wyoming", "Attribute data is read from CDATA node correctly.");
+        t.ok(data[0].attributes['EMPTYATTR'] === null, "Attribute set to null for empty element.");
+    }
+    function test_Format_GML_read_envelope_geom(t) {
+        t.plan(13);
+        
+        var envelope = shell_start + geoms['envelope'] + shell_end;
+        var parser = new OpenLayers.Format.GML();
+        data = parser.read(envelope);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "Envelope GML returns correct classname");
+        t.eq(data[0].geometry.components[0].components[0].x, 0, "first x coord correct");
+        t.eq(data[0].geometry.components[0].components[0].y, 1, "first y coord correct");
+        t.eq(data[0].geometry.components[0].components[1].x, 20, "second x coord correct");
+        t.eq(data[0].geometry.components[0].components[1].y, 1, "second y coord correct");
+        t.eq(data[0].geometry.components[0].components[2].x, 20, "third x coord correct");
+        t.eq(data[0].geometry.components[0].components[2].y, 21, "third y coord correct");
+        t.eq(data[0].geometry.components[0].components[3].x, 0, "fouth x coord correct");
+        t.eq(data[0].geometry.components[0].components[3].y, 21, "fourth y coord correct");
+        t.eq(data[0].geometry.components[0].components[4].x, 0, "fifth x coord correct");
+        t.eq(data[0].geometry.components[0].components[4].y, 1, "fifth y coord correct");
+        t.eq(data[0].geometry.components[0].components.length, 5, "coords length correct");
+        t.eq(data[0].geometry.components.length, 1, "rings length correct");
+    }    
+    ///////////////////////////////////////////////////////////////
+    // tests the y x order of gml point
+    /////////////////////////////////////////////////////////////
+    function test_Format_GML_read_point_geom_yx(t) {
+        t.plan(3);
+        
+        var point = shell_start + geoms_yx['point'] + shell_end;
+        var parser = new OpenLayers.Format.GML({'xy':false});
+        data = parser.read(point);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Point", "Point GML returns correct classname");
+        t.eq(data[0].geometry.x, 1, "x coord correct");
+        t.eq(data[0].geometry.y, 2, "y coord correct");
+    } 
+    function test_Format_GML_read_linestring_geom_yx(t) {
+        t.plan(5);
+        
+        var line = shell_start + geoms_yx['linestring'] + shell_end;
+        var parser = new OpenLayers.Format.GML({'xy':false});
+        data = parser.read(line);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.LineString", "LineString GML returns correct classname");
+        t.eq(data[0].geometry.components[0].x, 1, "first x coord correct");
+        t.eq(data[0].geometry.components[0].y, 2, "first y coord correct");
+        t.eq(data[0].geometry.components[1].x, 4, "second x coord correct");
+        t.eq(data[0].geometry.components[1].y, 5, "second y coord correct");
+    }    
+    function test_Format_GML_read_polygon_geom_yx(t) {
+        t.plan(7);
+        
+        var polygon = shell_start + geoms_yx['polygon'] + shell_end;
+        var parser = new OpenLayers.Format.GML({'xy':false});
+        data = parser.read(polygon);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "Polygon GML returns correct classname");
+        t.eq(data[0].geometry.components[0].components[0].x, 1, "first x coord correct");
+        t.eq(data[0].geometry.components[0].components[0].y, 2, "first y coord correct");
+        t.eq(data[0].geometry.components[0].components[1].x, 4, "second x coord correct");
+        t.eq(data[0].geometry.components[0].components[1].y, 5, "second y coord correct");
+        t.eq(data[0].geometry.components[0].components.length, 4, "coords length correct");
+        t.eq(data[0].geometry.components.length, 1, "rings length correct");
+    }   
+    function test_Format_GML_read_multipoint_geom_yx(t) {
+        t.plan(6);
+        
+        var multipoint = shell_start + geoms_yx['multipoint'] + shell_end;
+        var parser = new OpenLayers.Format.GML({'xy':false});
+        data = parser.read(multipoint);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.MultiPoint", "MultiPoint GML returns correct classname");
+        t.eq(data[0].geometry.components[0].x, 1, "x coord correct");
+        t.eq(data[0].geometry.components[0].y, 2, "y coord correct");
+        t.eq(data[0].geometry.components.length, 2, "length correct");
+        t.eq(data[0].geometry.components[1].x, 4, "x coord correct");
+        t.eq(data[0].geometry.components[1].y, 5, "y coord correct");
+    }    
+    function test_Format_GML_read_multilinestring_geom_yx(t) {
+        t.plan(6);
+        
+        var multilinestring = shell_start + geoms_yx['multilinestring'] + shell_end;
+        var parser = new OpenLayers.Format.GML({'xy':false});
+        data = parser.read(multilinestring);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.MultiLineString", "MultiLineString GML returns correct classname");
+        t.eq(data[0].geometry.components[0].components[0].x, 1, "x coord correct");
+        t.eq(data[0].geometry.components[0].components[0].y, 2, "y coord correct");
+        t.eq(data[0].geometry.components[0].components.length, 2, "length correct");
+        t.eq(data[0].geometry.components[0].components[1].x, 4, "x coord correct");
+        t.eq(data[0].geometry.components[0].components[1].y, 5, "y coord correct");
+        
+    }    
+    function test_Format_GML_read_polygon_with_holes_geom_yx(t) {
+        t.plan(12);
+        
+        var polygon_with_holes = shell_start + geoms_yx['polygon_with_holes'] + shell_end;
+        var parser = new OpenLayers.Format.GML({'xy':false});
+        data = parser.read(polygon_with_holes);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "Polygon GML returns correct classname");
+        t.eq(data[0].geometry.components[0].components[0].x, 1, "first x coord correct");
+        t.eq(data[0].geometry.components[0].components[0].y, 2, "first y coord correct");
+        t.eq(data[0].geometry.components[0].components[1].x, 4, "second x coord correct");
+        t.eq(data[0].geometry.components[0].components[1].y, 5, "second y coord correct");
+        t.eq(data[0].geometry.components[0].components.length, 4, "coords length correct");
+        t.eq(data[0].geometry.components[1].components[0].x, 11, "first x coord correct");
+        t.eq(data[0].geometry.components[1].components[0].y, 12, "first y coord correct");
+        t.eq(data[0].geometry.components[1].components[1].x, 14, "second x coord correct");
+        t.eq(data[0].geometry.components[1].components[1].y, 15, "second y coord correct");
+        t.eq(data[0].geometry.components[1].components.length, 4, "coords length correct");
+        t.eq(data[0].geometry.components.length, 2, "rings length correct");
+    }
+
+    function test_Format_GML_read_envelope_geom_yx(t) {
+        t.plan(13);
+        
+        var envelope = shell_start + geoms_yx['envelope'] + shell_end;
+        var parser = new OpenLayers.Format.GML({'xy':false});
+        data = parser.read(envelope);
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "Envelope GML returns correct classname");
+        t.eq(data[0].geometry.components[0].components[0].x, 0, "first x coord correct");
+        t.eq(data[0].geometry.components[0].components[0].y, 1, "first y coord correct");
+        t.eq(data[0].geometry.components[0].components[1].x, 20, "second x coord correct");
+        t.eq(data[0].geometry.components[0].components[1].y, 1, "second y coord correct");
+        t.eq(data[0].geometry.components[0].components[2].x, 20, "third x coord correct");
+        t.eq(data[0].geometry.components[0].components[2].y, 21, "third y coord correct");
+        t.eq(data[0].geometry.components[0].components[3].x, 0, "fouth x coord correct");
+        t.eq(data[0].geometry.components[0].components[3].y, 21, "fourth y coord correct");
+        t.eq(data[0].geometry.components[0].components[4].x, 0, "fifth x coord correct");
+        t.eq(data[0].geometry.components[0].components[4].y, 1, "fifth y coord correct");
+        t.eq(data[0].geometry.components[0].components.length, 5, "coords length correct");
+        t.eq(data[0].geometry.components.length, 1, "rings length correct");
+    }
+    
+    function test_Format_GML_write_geoms_yx(t) {
+        t.plan(5);
+        var parser = new OpenLayers.Format.GML({'xy':false});
+        
+        var point_xy = shell_start + serialize_geoms['point'] + shell_end;
+        var point = shell_start + serialize_geoms_yx['point'] + shell_end;
+        data = parser.read(point);
+        var output = parser.write(data);
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, point_xy, "Point geometry round trips correctly.");
+        
+        var linestring_xy = shell_start + serialize_geoms['linestring'] + shell_end;
+        var linestring = shell_start + serialize_geoms_yx['linestring'] + shell_end;
+        data = parser.read(linestring);
+        var output = parser.write(data);
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, linestring_xy, "Line geometry round trips correctly.");
+        
+        var polygon_xy = shell_start + serialize_geoms['polygon'] + shell_end;
+        var polygon = shell_start + serialize_geoms_yx['polygon'] + shell_end;
+        data = parser.read(polygon);
+        var output = parser.write(data);
+        output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, polygon_xy, "Poly geometry round trips correctly.");
+        
+        var multipoint_xy = shell_start + serialize_geoms['multipoint'] + shell_end;
+        var multipoint = shell_start + serialize_geoms_yx['multipoint'] + shell_end;
+        data = parser.read(multipoint);
+        var output = parser.write(data);
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, multipoint_xy, "MultiPoint geometry round trips correctly.");
+        
+        var multilinestring_xy = shell_start + serialize_geoms['multilinestring'] + shell_end;
+        var multilinestring = shell_start + serialize_geoms_yx['multilinestring'] + shell_end;
+        data = parser.read(multilinestring);
+        var output = parser.write(data);
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, multilinestring_xy, "MultiLine geometry round trips correctly.");
+    }
+    
+    function test_buildGeometryNode_bounds(t) {
+        t.plan(1);
+        var parser = new OpenLayers.Format.GML();
+        var bounds = new OpenLayers.Bounds(-180, -90, 180, 90);
+        var output, expect;
+        
+        // test that bounds are written as gml:Box
+        var output = parser.buildGeometryNode(bounds);
+        var expect = '<gml:Box xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="." cs="," ts=" ">-180,-90 180,90</gml:coordinates></gml:Box>';
+        t.xml_eq(output, expect, "[xy true] Bounds correctly written as gml:Box");
+    }
+    
+    function test_parseFeatureBox(t) {
+        t.plan(8); 
+        var parser = new OpenLayers.Format.GML();
+        var xmlparser = new OpenLayers.Format.XML();
+
+        var data = xmlparser.read(test_box[0]);
+        var feature = parser.parseFeature(data);
+        t.ok(feature.bounds instanceof OpenLayers.Bounds, 
+             "got bounds object for feature.bounds when with boundedBy Box, without geometry");
+        t.eq(feature.geometry, null, 'geometry is null for a feature with boundedBy Box, but no geometry');
+
+        var data = xmlparser.read(test_box[1]);
+        feature = parser.parseFeature(data);
+        t.eq(feature.bounds, null,
+             "feature is null when without boundedBy Box, with Box geometry");
+        t.ok(feature.geometry instanceof OpenLayers.Geometry.Polygon,
+             "got polygon object for feature.geometry when without boundedBy Box, with Box geometry");
+
+        data = xmlparser.read(test_box[2]);
+        feature = parser.parseFeature(data);
+        t.eq(feature.bounds, null, 
+             "feature.bounds is null when without boundedBy Box, without geometry");
+        t.eq(feature.geometry, null, 'geometry is null when without boundedBy Box, without geometry');
+
+        data = xmlparser.read(test_box[3]);
+        feature = parser.parseFeature(data);
+        t.ok(feature.bounds instanceof OpenLayers.Bounds, 
+             "got bounds object for feature.bounds when with boundedBy Box, with Box geometry");
+        t.ok(feature.geometry instanceof OpenLayers.Geometry.Polygon,
+             "got polygon object for feature.geometry when with boundedBy Box, with Box geometry");
+    }
+    
+    var test_box = [
+        // with boundedBy Box, without geometry
+        '<Sentiers_littoraux_feature><gml:boundedBy xmlns:gml="http://www.opengis.net/gml"><gml:Box srsName="EPSG:2154"><gml:coordinates>143564.081753,6817901.121957 144209.641321,6819104.781451</gml:coordinates></gml:Box></gml:boundedBy><DEPARTEMENT>Finistère</DEPARTEMENT></Sentiers_littoraux_feature>',
+        // without boundedBy Box, with Box geometry
+        '<Sentiers_littoraux_feature><msGeometry><gml:Box srsName="EPSG:2154" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates>143564.081753,6817901.121957 144209.641321,6819104.781451</gml:coordinates></gml:Box></msGeometry><DEPARTEMENT>Finistère</DEPARTEMENT></Sentiers_littoraux_feature>',
+        // without boundedBy, without geometry
+        '<Sentiers_littoraux_feature><DEPARTEMENT>Finistère</DEPARTEMENT></Sentiers_littoraux_feature>',
+        // with boundedBy Box, with Box geometry
+        '<Sentiers_littoraux_feature><msGeometry><gml:Box srsName="EPSG:2154" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates>143564.081753,6817901.121957 144209.641321,6819104.781451</gml:coordinates></gml:Box></msGeometry><gml:boundedBy xmlns:gml="http://www.opengis.net/gml"><gml:Box srsName="EPSG:2154"><gml:coordinates>143564.081753,6817901.121957 144209.641321,6819104.781451</gml:coordinates></gml:Box></gml:boundedBy><DEPARTEMENT>Finistère</DEPARTEMENT></Sentiers_littoraux_fe [...]
+
+    var test_content = ['<?xml version="1.0" encoding="utf-8" ?>\n<ogr:FeatureCollection\n     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n     xsi:schemaLocation="http://ogr.maptools.org/ testoutput.xsd"\n     xmlns:ogr="http://ogr.maptools.org/"\n     xmlns:gml="http://www.opengis.net/gml">\n  <gml:boundedBy>\n    <gml:Box>\n      <gml:coord><gml:X>-1254041.389711702</gml:X><gml:Y>250906.9515983529</gml:Y></gml:coord>\n      <gml:coord><gml:X>-634517.1199908922</gml:X><gml:Y [...]
+ '<wfs:FeatureCollection' + 
+ '   xmlns:fs="http://example.com/featureserver"' + 
+ '   xmlns:wfs="http://www.opengis.net/wfs"' + 
+ '   xmlns:gml="http://www.opengis.net/gml"' + 
+ '   xmlns:ogc="http://www.opengis.net/ogc"' + 
+ '   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' + 
+ '   xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-basic.xsd">' + 
+ '        ' + 
+ '' + 
+ '        <gml:featureMember>' + 
+ '  \n<fs:scribble fid="221">' + 
+ '        <fs:geometry>' + 
+ '        <gml:Polygon>' + 
+ '              ' + 
+ '              <gml:outerBoundaryIs><gml:LinearRing>' + 
+ '              <gml:coordinates>149.105072021,-35.1816558838 149.100608826,-35.1844024658 149.098892212,-35.1898956299  149.105072021,-35.1816558838</gml:coordinates>' + 
+ '              </gml:LinearRing></gml:outerBoundaryIs>' + 
+ '             ' + 
+ '              </gml:Polygon>' + 
+ '        </fs:geometry>' + 
+ '        <fs:title>random test features</fs:title>' + 
+ '        </fs:scribble>' + 
+ '</gml:featureMember> ' +
+ ' <gml:featureMember><fs:scribble fid="8">    <fs:geometry>        <gml:Point><gml:coordinates>-81.38671875,27.0703125</gml:coordinates></gml:Point>         </fs:geometry> ' +
+ '        <fs:down>south</fs:down><fs:title>Florida</fs:title>        </fs:scribble></gml:featureMember>' + 
+ '</wfs:FeatureCollection>'
+ ];
+   
+    var shell_start = '<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs"><gml:featureMember xmlns:gml="http://www.opengis.net/gml"><feature:features xmlns:feature="http://mapserver.gis.umn.edu/mapserver" fid="221"><feature:geometry>'; 
+    if (OpenLayers.Util.getBrowserName() == "opera") {
+        shell_start = '<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs"><gml:featureMember xmlns:gml="http://www.opengis.net/gml"><feature:features fid="221" xmlns:feature="http://mapserver.gis.umn.edu/mapserver"><feature:geometry>'; 
+    }    
+    var shell_end = '</feature:geometry></feature:features></gml:featureMember></wfs:FeatureCollection>';
+    var serialize_geoms = {
+        'point': '<gml:Point><gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates></gml:Point>',
+        'linestring': '<gml:LineString><gml:coordinates decimal="." cs="," ts=" ">1,2 4,5</gml:coordinates></gml:LineString>',
+        'polygon': '<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates decimal="." cs="," ts=" ">1,2 4,5 3,6 1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>',
+        'multipoint': '<gml:MultiPoint><gml:pointMember><gml:Point><gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates decimal="." cs="," ts=" ">4,5</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint>',
+        'multilinestring': '<gml:MultiLineString><gml:lineStringMember><gml:LineString><gml:coordinates decimal="." cs="," ts=" ">1,2 4,5</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates decimal="." cs="," ts=" ">11,12 14,15</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString>'
+    };
+    var geoms = {
+        'point': '<gml:Point><gml:coordinates>1,2,3</gml:coordinates></gml:Point>',
+        'linestring': '<gml:LineString><gml:coordinates>1,2,3 4,5,6</gml:coordinates></gml:LineString>',
+        'polygon': '<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>1,2 4,5 3,6 1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>',
+        'polygon_with_holes': '<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>1,2 4,5 3,6 1,2</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>11,12 14,15 13,16 11,12</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs></gml:Polygon>',
+        'multipoint': '<gml:MultiPoint><gml:Point><gml:coordinates>1,2,3</gml:coordinates></gml:Point><gml:Point><gml:coordinates>4,5,6</gml:coordinates></gml:Point></gml:MultiPoint>',
+        'multilinestring': '<gml:MultiLineString><gml:LineString><gml:coordinates>1,2,3 4,5,6</gml:coordinates></gml:LineString><gml:LineString><gml:coordinates>11,12,13 14,15,16</gml:coordinates></gml:LineString></gml:MultiLineString>',
+        'envelope': '<gml:Envelope><gml:lowerCorner>0 1</gml:lowerCorner><gml:upperCorner>20 21</gml:upperCorner></gml:Envelope>' // ,
+        // 'multipolygon_with_holes': '<gml:MultiPolygon><gml:Polygon><gml:outerBoundaryIs>1,2 4,5 3,6 1,2</gml:outerBoundaryIs><gml:innerBoundaryIs>11,12 14,15 13,16 11,12</gml:innerBoundaryIs></gml:Polygon><gml:Polygon><gml:outerBoundaryIs>101,102 104,105 103,106 101,102</gml:outerBoundaryIs><gml:innerBoundaryIs>111,112 114,115 113,116 111,112</gml:innerBoundaryIs></gml:Polygon></gml:MultiPolygon>'
+    };
+
+
+//
+// The following data has the (x y) reordered to (y x), in 3 dimensions it goes from (x y z) to (y x z)
+//
+    
+    var serialize_geoms_yx = {
+        'point': '<gml:Point><gml:coordinates decimal="." cs="," ts=" ">2,1</gml:coordinates></gml:Point>',
+        'linestring': '<gml:LineString><gml:coordinates decimal="." cs="," ts=" ">2,1 5,4</gml:coordinates></gml:LineString>',
+        'polygon': '<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates decimal="." cs="," ts=" ">2,1 5,4 6,3 2,1</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>',
+        'multipoint': '<gml:MultiPoint><gml:pointMember><gml:Point><gml:coordinates decimal="." cs="," ts=" ">2,1</gml:coordinates></gml:Point></gml:pointMember><gml:pointMember><gml:Point><gml:coordinates decimal="." cs="," ts=" ">5,4</gml:coordinates></gml:Point></gml:pointMember></gml:MultiPoint>',
+        'multilinestring': '<gml:MultiLineString><gml:lineStringMember><gml:LineString><gml:coordinates decimal="." cs="," ts=" ">2,1 5,4</gml:coordinates></gml:LineString></gml:lineStringMember><gml:lineStringMember><gml:LineString><gml:coordinates decimal="." cs="," ts=" ">12,11 15,14</gml:coordinates></gml:LineString></gml:lineStringMember></gml:MultiLineString>'
+    };
+    var geoms_yx = {
+        'point': '<gml:Point><gml:coordinates>2,1,3</gml:coordinates></gml:Point>',
+        'linestring': '<gml:LineString><gml:coordinates>2,1,3 5,4,6</gml:coordinates></gml:LineString>',
+        'polygon': '<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>2,1 5,4 6,3 2,1</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>',
+        'polygon_with_holes': '<gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>2,1 5,4 6,3 2,1</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs><gml:innerBoundaryIs><gml:LinearRing><gml:coordinates>12,11 15,14 16,13 12,11</gml:coordinates></gml:LinearRing></gml:innerBoundaryIs></gml:Polygon>',
+        'multipoint': '<gml:MultiPoint><gml:Point><gml:coordinates>2,1,3</gml:coordinates></gml:Point><gml:Point><gml:coordinates>5,4,6</gml:coordinates></gml:Point></gml:MultiPoint>',
+        'multilinestring': '<gml:MultiLineString><gml:LineString><gml:coordinates>2,1,3 5,4,6</gml:coordinates></gml:LineString><gml:LineString><gml:coordinates>12,11,13 15,14,16</gml:coordinates></gml:LineString></gml:MultiLineString>',
+        'envelope': '<gml:Envelope><gml:lowerCorner>1 0</gml:lowerCorner><gml:upperCorner>21 20</gml:upperCorner></gml:Envelope>'
+    };
+    
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/GML/cases.js b/tests/Format/GML/cases.js
new file mode 100644
index 0000000..258c570
--- /dev/null
+++ b/tests/Format/GML/cases.js
@@ -0,0 +1,227 @@
+var xml = new OpenLayers.Format.XML(); 
+function readXML(file) {
+    return xml.read(document.getElementById(file).firstChild.nodeValue);
+}
+
+var cases = {
+
+    "v2/point-coord.xml": new OpenLayers.Geometry.Point(1, 2),
+
+    "v2/point-coordinates.xml": new OpenLayers.Geometry.Point(1, 2),
+
+    "v2/linestring-coord.xml": new OpenLayers.Geometry.LineString([
+        new OpenLayers.Geometry.Point(1, 2),
+        new OpenLayers.Geometry.Point(3, 4)
+    ]),
+    
+    "v2/linestring-coordinates.xml": new OpenLayers.Geometry.LineString([
+        new OpenLayers.Geometry.Point(1, 2),
+        new OpenLayers.Geometry.Point(3, 4)
+    ]),
+    
+    "v2/linearring-coord.xml": new OpenLayers.Geometry.LinearRing([
+        new OpenLayers.Geometry.Point(1, 2),
+        new OpenLayers.Geometry.Point(3, 4),
+        new OpenLayers.Geometry.Point(5, 6),
+        new OpenLayers.Geometry.Point(1, 2)
+    ]),
+    
+    "v2/linearring-coordinates.xml": new OpenLayers.Geometry.LinearRing([
+        new OpenLayers.Geometry.Point(1, 2),
+        new OpenLayers.Geometry.Point(3, 4),
+        new OpenLayers.Geometry.Point(5, 6),
+        new OpenLayers.Geometry.Point(1, 2)
+    ]),
+    
+    "v2/polygon-coord.xml": new OpenLayers.Geometry.Polygon([
+        new OpenLayers.Geometry.LinearRing([
+            new OpenLayers.Geometry.Point(1, 2),
+            new OpenLayers.Geometry.Point(3, 4),
+            new OpenLayers.Geometry.Point(5, 6),
+            new OpenLayers.Geometry.Point(1, 2)
+        ]),
+        new OpenLayers.Geometry.LinearRing([
+            new OpenLayers.Geometry.Point(2, 3),
+            new OpenLayers.Geometry.Point(4, 5),
+            new OpenLayers.Geometry.Point(6, 7),
+            new OpenLayers.Geometry.Point(2, 3)
+        ]),
+        new OpenLayers.Geometry.LinearRing([
+            new OpenLayers.Geometry.Point(3, 4),
+            new OpenLayers.Geometry.Point(5, 6),
+            new OpenLayers.Geometry.Point(7, 8),
+            new OpenLayers.Geometry.Point(3, 4)
+        ])
+    ]),
+    
+    "v2/polygon-coordinates.xml": new OpenLayers.Geometry.Polygon([
+        new OpenLayers.Geometry.LinearRing([
+            new OpenLayers.Geometry.Point(1, 2),
+            new OpenLayers.Geometry.Point(3, 4),
+            new OpenLayers.Geometry.Point(5, 6),
+            new OpenLayers.Geometry.Point(1, 2)
+        ]),
+        new OpenLayers.Geometry.LinearRing([
+            new OpenLayers.Geometry.Point(2, 3),
+            new OpenLayers.Geometry.Point(4, 5),
+            new OpenLayers.Geometry.Point(6, 7),
+            new OpenLayers.Geometry.Point(2, 3)
+        ]),
+        new OpenLayers.Geometry.LinearRing([
+            new OpenLayers.Geometry.Point(3, 4),
+            new OpenLayers.Geometry.Point(5, 6),
+            new OpenLayers.Geometry.Point(7, 8),
+            new OpenLayers.Geometry.Point(3, 4)
+        ])
+    ]),
+    
+    "v2/multipoint-coord.xml": new OpenLayers.Geometry.MultiPoint([
+        new OpenLayers.Geometry.Point(1, 2),
+        new OpenLayers.Geometry.Point(2, 3),
+        new OpenLayers.Geometry.Point(3, 4)
+    ]),
+    
+    "v2/multipoint-coordinates.xml": new OpenLayers.Geometry.MultiPoint([
+        new OpenLayers.Geometry.Point(1, 2),
+        new OpenLayers.Geometry.Point(2, 3),
+        new OpenLayers.Geometry.Point(3, 4)
+    ]),
+    
+    "v2/multilinestring-coord.xml": new OpenLayers.Geometry.MultiLineString([
+        new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(1, 2),
+            new OpenLayers.Geometry.Point(2, 3)
+        ]),
+        new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(3, 4),
+            new OpenLayers.Geometry.Point(4, 5)
+        ])
+    ]),
+    
+    "v2/multilinestring-coordinates.xml": new OpenLayers.Geometry.MultiLineString([
+        new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(1, 2),
+            new OpenLayers.Geometry.Point(2, 3)
+        ]),
+        new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(3, 4),
+            new OpenLayers.Geometry.Point(4, 5)
+        ])
+    ]),
+    
+    "v2/multipolygon-coord.xml": new OpenLayers.Geometry.MultiPolygon([
+        new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(1, 2),
+                new OpenLayers.Geometry.Point(3, 4),
+                new OpenLayers.Geometry.Point(5, 6),
+                new OpenLayers.Geometry.Point(1, 2)
+            ]),
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(2, 3),
+                new OpenLayers.Geometry.Point(4, 5),
+                new OpenLayers.Geometry.Point(6, 7),
+                new OpenLayers.Geometry.Point(2, 3)
+            ]),
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(3, 4),
+                new OpenLayers.Geometry.Point(5, 6),
+                new OpenLayers.Geometry.Point(7, 8),
+                new OpenLayers.Geometry.Point(3, 4)
+            ])
+        ]),
+        new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(1, 2),
+                new OpenLayers.Geometry.Point(3, 4),
+                new OpenLayers.Geometry.Point(5, 6),
+                new OpenLayers.Geometry.Point(1, 2)
+            ])
+        ])
+    ]),
+    
+    "v2/multipolygon-coordinates.xml": new OpenLayers.Geometry.MultiPolygon([
+        new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(1, 2),
+                new OpenLayers.Geometry.Point(3, 4),
+                new OpenLayers.Geometry.Point(5, 6),
+                new OpenLayers.Geometry.Point(1, 2)
+            ]),
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(2, 3),
+                new OpenLayers.Geometry.Point(4, 5),
+                new OpenLayers.Geometry.Point(6, 7),
+                new OpenLayers.Geometry.Point(2, 3)
+            ]),
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(3, 4),
+                new OpenLayers.Geometry.Point(5, 6),
+                new OpenLayers.Geometry.Point(7, 8),
+                new OpenLayers.Geometry.Point(3, 4)
+            ])
+        ]),
+        new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(1, 2),
+                new OpenLayers.Geometry.Point(3, 4),
+                new OpenLayers.Geometry.Point(5, 6),
+                new OpenLayers.Geometry.Point(1, 2)
+            ])
+        ])
+    ]),
+    
+    "v2/geometrycollection-coordinates.xml": new OpenLayers.Geometry.Collection([
+        new OpenLayers.Geometry.Point(1, 2),
+        new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(1, 2),
+            new OpenLayers.Geometry.Point(3, 4)
+        ]),
+        new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(1, 2),
+                new OpenLayers.Geometry.Point(3, 4),
+                new OpenLayers.Geometry.Point(5, 6),
+                new OpenLayers.Geometry.Point(1, 2)
+            ]),
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(2, 3),
+                new OpenLayers.Geometry.Point(4, 5),
+                new OpenLayers.Geometry.Point(6, 7),
+                new OpenLayers.Geometry.Point(2, 3)
+            ]),
+            new OpenLayers.Geometry.LinearRing([
+                new OpenLayers.Geometry.Point(3, 4),
+                new OpenLayers.Geometry.Point(5, 6),
+                new OpenLayers.Geometry.Point(7, 8),
+                new OpenLayers.Geometry.Point(3, 4)
+            ])
+        ])
+    ]),
+
+    "v2/box-coord.xml": new OpenLayers.Bounds(1, 2, 3, 4),
+    
+    "v2/box-coordinates.xml": new OpenLayers.Bounds(1, 2, 3, 4)
+    
+};
+
+// cases for v3 use the same geometries
+OpenLayers.Util.extend(cases, {
+    "v3/point.xml": cases["v2/point-coordinates.xml"],
+    "v3/linestring.xml": cases["v2/linestring-coordinates.xml"],
+    "v3/curve.xml": cases["v2/linestring-coordinates.xml"],
+    "v3/polygon.xml": cases["v2/polygon-coordinates.xml"],
+    "v3/surface.xml": cases["v2/polygon-coordinates.xml"],
+    "v3/multipoint-singular.xml": cases["v2/multipoint-coordinates.xml"],
+    "v3/multipoint-plural.xml": cases["v2/multipoint-coordinates.xml"],
+    "v3/multilinestring-singular.xml": cases["v2/multilinestring-coordinates.xml"],
+    "v3/multilinestring-plural.xml": cases["v2/multilinestring-coordinates.xml"],
+    "v3/multicurve-singular.xml": cases["v2/multilinestring-coordinates.xml"],
+    "v3/multicurve-curve.xml": cases["v2/multilinestring-coordinates.xml"],
+    "v3/multipolygon-singular.xml": cases["v2/multipolygon-coordinates.xml"],
+    "v3/multipolygon-plural.xml": cases["v2/multipolygon-coordinates.xml"],
+    "v3/multisurface-singular.xml": cases["v2/multipolygon-coordinates.xml"],
+    "v3/multisurface-plural.xml": cases["v2/multipolygon-coordinates.xml"],
+    "v3/multisurface-surface.xml": cases["v2/multipolygon-coordinates.xml"],
+    "v3/envelope.xml": cases["v2/box-coordinates.xml"]
+});
\ No newline at end of file
diff --git a/tests/Format/GML/v2.html b/tests/Format/GML/v2.html
new file mode 100644
index 0000000..48f6abe
--- /dev/null
+++ b/tests/Format/GML/v2.html
@@ -0,0 +1,668 @@
+<?xml version="1.0" encoding="utf-8"?>
+<html xmlns="http://www.w3.org/1999/xhtml"> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script src="cases.js"></script>
+    <script type="text/javascript">
+
+    function test_readNode_geometry(t) {
+        var files = [
+            "v2/point-coord.xml", "v2/point-coordinates.xml",
+            "v2/linestring-coord.xml", "v2/linestring-coordinates.xml",
+            "v2/polygon-coord.xml", "v2/polygon-coordinates.xml",
+            "v2/multipoint-coord.xml", "v2/multipoint-coordinates.xml",
+            "v2/multilinestring-coord.xml", "v2/multilinestring-coordinates.xml",
+            "v2/multipolygon-coord.xml", "v2/multipolygon-coordinates.xml",
+            "v2/geometrycollection-coordinates.xml"
+        ];
+
+        var len = files.length;
+        t.plan(len);
+
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: "feature",
+            featureNS: "http://example.com/feature"
+        });
+        var file, doc, expect, out;
+        for(var i=0; i<len; ++i) {
+            file = files[i];
+            expect = cases[file];
+            if(expect) {
+                doc = readXML(file);
+                if(doc && doc.documentElement) {
+                    out = format.readNode(doc.documentElement);
+                    if(out.components && out.components.length == 1) {
+                        t.geom_eq(out.components[0], expect, "[" + file + "] geometry read");
+                    } else {
+                        t.fail("[" + file + "] gml parsing");
+                    }
+                } else {
+                    t.fail("[" + file + "] xml parsing");
+                }
+            } else {
+                t.fail("[" + file + "] case not found");
+            }
+        }
+        
+    }
+    
+    function test_readNode_bounds(t) {
+        var files = ["v2/box-coord.xml", "v2/box-coordinates.xml"];
+
+        var len = files.length;
+        t.plan(len);
+        
+        var file, doc, expect, got;
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: "feature",
+            featureNS: "http://example.com/feature"
+        });
+        for(var i=0; i<len; ++i) {
+            file = files[i];
+            expect = cases[file];
+            if(expect) {
+                doc = readXML(file);
+                if(doc && doc.documentElement) {
+                    out = format.readNode(doc.documentElement);
+                    if(out.components && out.components.length == 1) {
+                        got = out.components[0];
+                        if(got instanceof OpenLayers.Bounds) {
+                            t.ok(out.components[0].equals(expect), "[" + file + "] bounds read")
+                        } else {
+                            t.fail("[" + file + "] expected a bounds, got " + got);
+                        }
+                    } else {
+                        t.fail("[" + file + "] gml parsing");
+                    }
+                } else {
+                    t.fail("[" + file + "] xml parsing");
+                }
+            } else {
+                t.fail("[" + file + "] case not found");
+            }
+        }
+        
+    }
+    
+    function test_writeNode_geometry(t) {
+        // we only care to write the 'coordinates' variant of GML 2
+        var files = [
+            "v2/point-coordinates.xml",
+            "v2/linestring-coordinates.xml",
+            "v2/polygon-coordinates.xml",
+            "v2/multipoint-coordinates.xml",
+            "v2/multilinestring-coordinates.xml",
+            "v2/multipolygon-coordinates.xml",
+            "v2/geometrycollection-coordinates.xml"
+        ];
+
+        var len = files.length;
+        t.plan(len);
+
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: "feature",
+            featureNS: "http://example.com/feature",
+            srsName: "foo" // GML geometry collections require srsName, we only write if provided
+        });
+        var file, geom, doc, node;
+        for(var i=0; i<len; ++i) {
+            file = files[i];
+            geom = cases[file];
+            if(geom) {
+                doc = readXML(file);
+                if(doc && doc.documentElement) {
+                    node = format.writeNode("feature:_geometry", geom);
+                    t.xml_eq(node.firstChild, doc.documentElement, "[" + file + "] geometry written");
+                } else {
+                    t.fail("[" + file + "] xml parsing");
+                }
+            } else {
+                t.fail("[" + file + "] case not found");
+            }
+        }
+    }
+
+    function test_writeNode_bounds(t) {
+        // we only care to write the 'coordinates' variant of GML 2
+        var files = [
+            "v2/box-coordinates.xml"
+        ];
+
+        var len = files.length;
+        t.plan(len);
+
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: "feature",
+            featureNS: "http://example.com/feature",
+            srsName: "foo" // GML box does not require srsName, we only write if provided
+        });
+        var file, bounds, doc, node;
+        for(var i=0; i<len; ++i) {
+            file = files[i];
+            bounds = cases[file];
+            if(bounds) {
+                doc = readXML(file);
+                if(doc && doc.documentElement) {
+                    node = format.writeNode("gml:Box", bounds);
+                    t.xml_eq(node, doc.documentElement, "[" + file + "] bounds written");
+                } else {
+                    t.fail("[" + file + "] xml parsing");
+                }
+            } else {
+                t.fail("[" + file + "] case not found");
+            }
+        }
+    }
+    
+    function test_read(t) {
+        t.plan(8);
+        var doc = readXML("v2/topp-states.xml");
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp",
+            geometryName: "the_geom"
+        });
+        var features = format.read(doc.documentElement);
+        
+        t.eq(features.length, 3, "read 3 features");
+        var feature = features[0];
+        t.eq(feature.fid, "states.1", "read fid");
+        t.eq(feature.geometry.CLASS_NAME, "OpenLayers.Geometry.MultiPolygon",
+             "read multipolygon geometry");
+        var attributes = feature.attributes;
+        t.eq(attributes["STATE_NAME"], "Illinois", "read STATE_NAME");
+        t.eq(attributes["STATE_FIPS"], "17", "read STATE_FIPS");
+        t.eq(attributes["SUB_REGION"], "E N Cen", "read SUB_REGION");
+        t.eq(attributes["STATE_ABBR"], "IL", "read STATE_ABBR");
+        t.eq(attributes["LAND_KM"], "143986.61", "read LAND_KM");
+    }
+
+    function test_boundedBy(t) {
+        t.plan(5);
+        
+        var doc = readXML("v2/boundedBy.xml");
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp",
+            geometryName: "the_geom",
+            xy: false
+        });
+        var features = format.read(doc.documentElement);
+        var bounds = features[0].bounds;
+
+        t.ok(bounds instanceof OpenLayers.Bounds, "feature given a bounds");
+        t.eq(bounds.left.toFixed(2), "-91.52", "bounds left correct");
+        t.eq(bounds.bottom.toFixed(2), "36.99", "bounds bottom correct");
+        t.eq(bounds.right.toFixed(2), "-87.51", "bounds right correct");
+        t.eq(bounds.top.toFixed(2), "42.51", "bounds top correct");
+    }
+    
+    function test_write(t) {
+        t.plan(1);
+        var doc = readXML("v2/topp-states.xml");
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp",
+            geometryName: "the_geom",
+            schemaLocation: "http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.0.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma.openplans.org:80/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd",
+            srsName: "http://www.opengis.net/gml/srs/epsg.xml#4326"
+        });
+        var features = format.read(doc.documentElement);
+        
+        var got = format.write(features);
+        t.xml_eq(got, doc.documentElement, "wfs:FeatureCollection round trip");
+        
+    }
+
+    function test_multipleTypenames(t) {
+        t.plan(5);
+        var doc = readXML("v2/multipletypenames.xml");
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: ["LKUNSTWERK", "PKUNSTWERK", "VKUNSTWERK"],
+            featureNS: "http://mapserver.gis.umn.edu/mapserver",
+            geometry_name: "geometry"
+        });
+        var features = format.read(doc.documentElement);
+        t.eq(features.length, 3, "Expected 3 features from GML containing multiple typenames");
+        t.eq(features[0].type, "VKUNSTWERK", "First feature type is from the VKUNSTWERK typename");
+        t.eq(features[1].type, "LKUNSTWERK", "Second feature type is from the LKUNSTWERK typename");
+        t.eq(features[2].type, "PKUNSTWERK", "Third feature type is from the PKUNSTWERK typename");
+        t.eq(features[0].namespace, "http://mapserver.gis.umn.edu/mapserver", "Namespace is set correctly on feature");
+    }
+
+    function test_noGeom(t) {
+        t.plan(7);
+        var doc = readXML("v2/nogeom.xml");
+        var format = new OpenLayers.Format.GML.v2({
+            featureType: "DEPARTEMENT",
+            featureNS: "http://server.fr/geoserver/loc"
+        });
+        var features = format.read(doc.documentElement);
+        t.eq(features.length, 2, "Expected 2 features from GML with no geom");
+        var feature = features[0];
+        t.ok(feature.geometry == null, "feature 0 has no geometry");
+        var bounds = feature.bounds;
+        t.ok(bounds && (bounds instanceof OpenLayers.Bounds), "feature 0 has been assigned bounds");
+        t.eq(bounds.left, 209565, "bounds left correct");
+        t.eq(bounds.bottom, 6785323, "bounds bottom correct");
+        t.eq(bounds.right, 337568, "bounds right correct");
+        t.eq(bounds.top, 6885985, "bounds top correct");
+    }
+   </script>
+</head>
+<body>
+<div id="v2/point-coord.xml"><!--
+<gml:Point xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coord>
+    <gml:X>1</gml:X>
+    <gml:Y>2</gml:Y>
+  </gml:coord>
+</gml:Point>
+--></div>
+<div id="v2/point-coordinates.xml"><!--
+<gml:Point xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates>
+</gml:Point>
+--></div>
+<div id="v2/linestring-coord.xml"><!--
+<gml:LineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coord>
+    <gml:X>1</gml:X>
+    <gml:Y>2</gml:Y>
+  </gml:coord>
+  <gml:coord>
+    <gml:X>3</gml:X>
+    <gml:Y>4</gml:Y>
+  </gml:coord>
+</gml:LineString>
+--></div>
+<div id="v2/linestring-coordinates.xml"><!--
+<gml:LineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4</gml:coordinates>
+</gml:LineString>
+--></div>
+<div id="v2/polygon-coord.xml"><!--
+<gml:Polygon xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:outerBoundaryIs>
+        <gml:LinearRing>
+            <gml:coord>
+                <gml:X>1</gml:X>
+                <gml:Y>2</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>3</gml:X>
+                <gml:Y>4</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>5</gml:X>
+                <gml:Y>6</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>1</gml:X>
+                <gml:Y>2</gml:Y>
+            </gml:coord>
+        </gml:LinearRing>
+    </gml:outerBoundaryIs>
+    <gml:innerBoundaryIs>
+        <gml:LinearRing>
+            <gml:coord>
+                <gml:X>2</gml:X>
+                <gml:Y>3</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>4</gml:X>
+                <gml:Y>5</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>6</gml:X>
+                <gml:Y>7</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>2</gml:X>
+                <gml:Y>3</gml:Y>
+            </gml:coord>
+        </gml:LinearRing>
+    </gml:innerBoundaryIs>    
+    <gml:innerBoundaryIs>
+        <gml:LinearRing>
+            <gml:coord>
+                <gml:X>3</gml:X>
+                <gml:Y>4</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>5</gml:X>
+                <gml:Y>6</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>7</gml:X>
+                <gml:Y>8</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>3</gml:X>
+                <gml:Y>4</gml:Y>
+            </gml:coord>
+        </gml:LinearRing>
+    </gml:innerBoundaryIs>    
+</gml:Polygon>
+--></div>
+<div id="v2/polygon-coordinates.xml"><!--
+<gml:Polygon xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:outerBoundaryIs>
+        <gml:LinearRing>
+            <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4 5,6 1,2</gml:coordinates>
+        </gml:LinearRing>
+    </gml:outerBoundaryIs>
+    <gml:innerBoundaryIs>
+        <gml:LinearRing>
+            <gml:coordinates decimal="." cs="," ts=" ">2,3 4,5 6,7 2,3</gml:coordinates>
+        </gml:LinearRing>
+    </gml:innerBoundaryIs>    
+    <gml:innerBoundaryIs>
+        <gml:LinearRing>
+            <gml:coordinates decimal="." cs="," ts=" ">3,4 5,6 7,8 3,4</gml:coordinates>
+        </gml:LinearRing>
+    </gml:innerBoundaryIs>    
+</gml:Polygon>
+--></div>
+<div id="v2/multipoint-coord.xml"><!--
+<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coord>
+                <gml:X>1</gml:X>
+                <gml:Y>2</gml:Y>
+            </gml:coord>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coord>
+                <gml:X>2</gml:X>
+                <gml:Y>3</gml:Y>
+            </gml:coord>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coord>
+                <gml:X>3</gml:X>
+                <gml:Y>4</gml:Y>
+            </gml:coord>
+        </gml:Point>
+    </gml:pointMember>
+</gml:MultiPoint>
+--></div>
+<div id="v2/multipoint-coordinates.xml"><!--
+<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coordinates decimal="." cs="," ts=" ">2,3</gml:coordinates>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coordinates decimal="." cs="," ts=" ">3,4</gml:coordinates>
+        </gml:Point>
+    </gml:pointMember>
+</gml:MultiPoint>
+--></div>
+<div id="v2/multilinestring-coord.xml"><!--
+<gml:MultiLineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:coord>
+                <gml:X>1</gml:X>
+                <gml:Y>2</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>2</gml:X>
+                <gml:Y>3</gml:Y>
+            </gml:coord>
+        </gml:LineString>
+    </gml:lineStringMember>
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:coord>
+                <gml:X>3</gml:X>
+                <gml:Y>4</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>4</gml:X>
+                <gml:Y>5</gml:Y>
+            </gml:coord>
+        </gml:LineString>
+    </gml:lineStringMember>
+</gml:MultiLineString>
+--></div>
+<div id="v2/multilinestring-coordinates.xml"><!--
+<gml:MultiLineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:coordinates decimal="." cs="," ts=" ">1,2 2,3</gml:coordinates>
+        </gml:LineString>
+    </gml:lineStringMember>
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:coordinates decimal="." cs="," ts=" ">3,4 4,5</gml:coordinates>
+        </gml:LineString>
+    </gml:lineStringMember>
+</gml:MultiLineString>
+--></div>
+<div id="v2/multipolygon-coord.xml"><!--
+<gml:MultiPolygon xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:polygonMember>
+        <gml:Polygon>
+            <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coord>
+                        <gml:X>1</gml:X>
+                        <gml:Y>2</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>3</gml:X>
+                        <gml:Y>4</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>5</gml:X>
+                        <gml:Y>6</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>1</gml:X>
+                        <gml:Y>2</gml:Y>
+                    </gml:coord>
+                </gml:LinearRing>
+            </gml:outerBoundaryIs>
+            <gml:innerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coord>
+                        <gml:X>2</gml:X>
+                        <gml:Y>3</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>4</gml:X>
+                        <gml:Y>5</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>6</gml:X>
+                        <gml:Y>7</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>2</gml:X>
+                        <gml:Y>3</gml:Y>
+                    </gml:coord>
+                </gml:LinearRing>
+            </gml:innerBoundaryIs>    
+            <gml:innerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coord>
+                        <gml:X>3</gml:X>
+                        <gml:Y>4</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>5</gml:X>
+                        <gml:Y>6</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>7</gml:X>
+                        <gml:Y>8</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>3</gml:X>
+                        <gml:Y>4</gml:Y>
+                    </gml:coord>
+                </gml:LinearRing>
+            </gml:innerBoundaryIs>    
+        </gml:Polygon>
+    </gml:polygonMember>
+    <gml:polygonMember>
+        <gml:Polygon>
+            <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coord>
+                        <gml:X>1</gml:X>
+                        <gml:Y>2</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>3</gml:X>
+                        <gml:Y>4</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>5</gml:X>
+                        <gml:Y>6</gml:Y>
+                    </gml:coord>
+                    <gml:coord>
+                        <gml:X>1</gml:X>
+                        <gml:Y>2</gml:Y>
+                    </gml:coord>
+                </gml:LinearRing>
+            </gml:outerBoundaryIs>
+        </gml:Polygon>
+    </gml:polygonMember>
+</gml:MultiPolygon>
+--></div>
+<div id="v2/multipolygon-coordinates.xml"><!--
+<gml:MultiPolygon xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:polygonMember>
+        <gml:Polygon>
+            <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4 5,6 1,2</gml:coordinates>
+                </gml:LinearRing>
+            </gml:outerBoundaryIs>
+            <gml:innerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coordinates decimal="." cs="," ts=" ">2,3 4,5 6,7 2,3</gml:coordinates>
+                </gml:LinearRing>
+            </gml:innerBoundaryIs>    
+            <gml:innerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coordinates decimal="." cs="," ts=" ">3,4 5,6 7,8 3,4</gml:coordinates>
+                </gml:LinearRing>
+            </gml:innerBoundaryIs>    
+        </gml:Polygon>
+    </gml:polygonMember>
+    <gml:polygonMember>
+        <gml:Polygon>
+            <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4 5,6 1,2</gml:coordinates>
+                </gml:LinearRing>
+            </gml:outerBoundaryIs>
+        </gml:Polygon>
+    </gml:polygonMember>
+</gml:MultiPolygon>
+--></div>
+<div id="v2/geometrycollection-coordinates.xml"><!--
+<gml:GeometryCollection xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:geometryMember>
+        <gml:Point srsName="foo">
+          <gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates>
+        </gml:Point>
+    </gml:geometryMember>
+    <gml:geometryMember>
+        <gml:LineString srsName="foo">
+          <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4</gml:coordinates>
+        </gml:LineString>
+    </gml:geometryMember>
+    <gml:geometryMember>
+        <gml:Polygon srsName="foo">
+            <gml:outerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4 5,6 1,2</gml:coordinates>
+                </gml:LinearRing>
+            </gml:outerBoundaryIs>
+            <gml:innerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coordinates decimal="." cs="," ts=" ">2,3 4,5 6,7 2,3</gml:coordinates>
+                </gml:LinearRing>
+            </gml:innerBoundaryIs>    
+            <gml:innerBoundaryIs>
+                <gml:LinearRing>
+                    <gml:coordinates decimal="." cs="," ts=" ">3,4 5,6 7,8 3,4</gml:coordinates>
+                </gml:LinearRing>
+            </gml:innerBoundaryIs>    
+        </gml:Polygon>
+    </gml:geometryMember>
+</gml:GeometryCollection>
+--></div>
+<div id="v2/box-coord.xml"><!--
+<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coord>
+    <gml:X>1</gml:X>
+    <gml:Y>2</gml:Y>
+  </gml:coord>
+  <gml:coord>
+    <gml:X>3</gml:X>
+    <gml:Y>4</gml:Y>
+  </gml:coord>
+</gml:Box>
+--></div>
+<div id="v2/box-coordinates.xml"><!--
+<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4</gml:coordinates>
+</gml:Box>
+--></div>
+<div id="v2/linearring-coord.xml"><!--
+<gml:LinearRing xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:coord>
+        <gml:X>1</gml:X>
+        <gml:Y>2</gml:Y>
+    </gml:coord>
+    <gml:coord>
+        <gml:X>3</gml:X>
+        <gml:Y>4</gml:Y>
+    </gml:coord>
+    <gml:coord>
+        <gml:X>5</gml:X>
+        <gml:Y>6</gml:Y>
+    </gml:coord>
+    <gml:coord>
+        <gml:X>1</gml:X>
+        <gml:Y>2</gml:Y>
+    </gml:coord>
+</gml:LinearRing>
+--></div>
+<div id="v2/linearring-coordinates.xml"><!--
+<gml:LinearRing xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4 5,6 1,2</gml:coordinates>
+</gml:LinearRing>
+--></div>
+<div id="v2/topp-states.xml"><!--
+<?xml version="1.0" encoding="UTF-8"?><wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.0.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma. [...]
+--></div>
+<div id="v2/boundedBy.xml"><!--
+<?xml version="1.0" encoding="UTF-8"?><wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openplans.org/topp http://publicus.opengeo.org:80/geoserver/wfs?service=WFS&version=1.0.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://publi [...]
+--></div>
+<div id="v2/multipletypenames.xml"><!--
+<?xml version='1.0' encoding="ISO-8859-1" ?><wfs:FeatureCollection   xmlns:rws="http://mapserver.gis.umn.edu/mapserver"   xmlns:wfs="http://www.opengis.net/wfs"   xmlns:gml="http://www.opengis.net/gml"   xmlns:ogc="http://www.opengis.net/ogc"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd                        http://mapserver.gis.umn.edu/mapserver http://intranet.rijkswaterstaat [...]
+--></div>
+<div id="v2/nogeom.xml"><!--
+<?xml version="1.0" encoding="UTF-8"?><wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:loc="http://server.fr/geoserver/loc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://server.fr:80/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd http://server.fr/geoserver/loc http://server.fr:80/geoserver/wfs?service=WFS&version=1.0.0&request=Descr [...]
+--></div>
+</body>
+</html>
diff --git a/tests/Format/GML/v3.html b/tests/Format/GML/v3.html
new file mode 100644
index 0000000..4d452fc
--- /dev/null
+++ b/tests/Format/GML/v3.html
@@ -0,0 +1,790 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script src="cases.js"></script>
+    <script type="text/javascript">
+
+    function test_readNode_geometry(t) {
+        var files = [
+            "v2/point-coord.xml", "v2/point-coordinates.xml",
+            "v2/linestring-coord.xml", "v2/linestring-coordinates.xml",
+            "v2/multipoint-coord.xml", "v2/multipoint-coordinates.xml",
+            "v2/multilinestring-coord.xml", "v2/multilinestring-coordinates.xml",
+            "v3/point.xml", "v3/linestring.xml", "v3/curve.xml",
+            "v3/polygon.xml", "v3/surface.xml",
+            "v3/multipoint-singular.xml", "v3/multipoint-plural.xml",
+            "v3/multilinestring-singular.xml", "v3/multilinestring-plural.xml",
+            "v3/multicurve-singular.xml", "v3/multicurve-curve.xml",
+            "v3/multipolygon-singular.xml", "v3/multipolygon-plural.xml",
+            "v3/multisurface-singular.xml", "v3/multisurface-plural.xml",
+            "v3/multisurface-surface.xml"
+        ];
+
+        var len = files.length;
+        t.plan(len);
+
+        var format = new OpenLayers.Format.GML.v3({
+            featureType: "feature",
+            featureNS: "http://example.com/feature"
+        });
+        var file, doc, expect, out;
+        for(var i=0; i<len; ++i) {
+            file = files[i];
+            expect = cases[file];
+            if(expect) {
+                doc = readXML(file);
+                if(doc && doc.documentElement) {
+                    out = format.readNode(doc.documentElement);
+                    if(out.components && out.components.length == 1) {
+                        t.geom_eq(out.components[0], expect, "[" + file + "] geometry read");
+                    } else {
+                        t.fail("[" + file + "] gml parsing");
+                    }
+                } else {
+                    t.fail("[" + file + "] xml parsing");
+                }
+            } else {
+                t.fail("[" + file + "] case not found");
+            }
+        }
+        
+    }
+
+    function test_readNode_bounds(t) {
+        var files = ["v3/envelope.xml"];
+
+        var len = files.length;
+        t.plan(len);
+        
+        var file, doc, expect, got;
+        var format = new OpenLayers.Format.GML.v3({
+            featureType: "feature",
+            featureNS: "http://example.com/feature"
+        });
+        for(var i=0; i<len; ++i) {
+            file = files[i];
+            expect = cases[file];
+            if(expect) {
+                doc = readXML(file);
+                if(doc && doc.documentElement) {
+                    out = format.readNode(doc.documentElement);
+                    if(out.components && out.components.length == 1) {
+                        got = out.components[0];
+                        if(got instanceof OpenLayers.Bounds) {
+                            t.ok(out.components[0].equals(expect), "[" + file + "] bounds read")
+                        } else {
+                            t.fail("[" + file + "] expected a bounds, got " + got);
+                        }
+                    } else {
+                        t.fail("[" + file + "] gml parsing");
+                    }
+                } else {
+                    t.fail("[" + file + "] xml parsing");
+                }
+            } else {
+                t.fail("[" + file + "] case not found");
+            }
+        }
+        
+    }
+
+    function test_writeNode_geometry(t) {
+        // we only care to write the 'pos' and 'posList' variants of GML 3 - conforming with simple features profile
+        var files = [
+            {path: "v3/point.xml"},
+            {path: "v3/linestring.xml"},
+            {path: "v3/curve.xml", options: {curve: true}},
+            {path: "v3/polygon.xml"},
+            {path: "v3/surface.xml", options: {surface: true}},
+            {path: "v3/multipoint-singular.xml"},
+            {path: "v3/multilinestring-singular.xml", options: {multiCurve: false}},
+            {path: "v3/multicurve-singular.xml"},
+            {path: "v3/multicurve-curve.xml", options: {curve: true}},
+            {path: "v3/multipolygon-singular.xml", options: {multiSurface: false}},
+            {path: "v3/multisurface-singular.xml"},
+            {path: "v3/multisurface-surface.xml", options: {surface: true}}
+        ];
+
+        var len = files.length;
+        t.plan(len);
+
+        var defaults = {
+            featureType: "feature",
+            featureNS: "http://example.com/feature",
+            srsName: "foo" // GML geometry collections require srsName, we only write if provided
+        };
+
+        var format, options, file, geom, doc, node;
+        for(var i=0; i<len; ++i) {
+            file = files[i].path;
+            geom = cases[file];
+            if(geom) {
+                doc = readXML(file);
+                if(doc && doc.documentElement) {
+                    options = OpenLayers.Util.extend({}, defaults);
+                    if(files[i].options) {
+                        OpenLayers.Util.extend(options, files[i].options);
+                    }
+                    format = new OpenLayers.Format.GML.v3(options);
+                    node = format.writeNode("feature:_geometry", geom);
+                    t.xml_eq(node.firstChild, doc.documentElement, "[" + file + "] geometry written");
+                } else {
+                    t.fail("[" + file + "] xml parsing");
+                }
+            } else {
+                t.fail("[" + file + "] case not found");
+            }
+        }
+    }
+
+    function test_writeNode_bounds(t) {
+        var files = [
+            "v3/envelope.xml"
+        ];
+
+        var len = files.length;
+        t.plan(len);
+
+        var format = new OpenLayers.Format.GML.v3({
+            featureType: "feature",
+            featureNS: "http://example.com/feature",
+            srsName: "foo" // GML envelopes require srsName, we only write if provided
+        });
+        var file, bounds, doc, node;
+        for(var i=0; i<len; ++i) {
+            file = files[i];
+            bounds = cases[file];
+            if(bounds) {
+                doc = readXML(file);
+                if(doc && doc.documentElement) {
+                    node = format.writeNode("gml:Envelope", bounds);
+                    t.xml_eq(node, doc.documentElement, "[" + file + "] bounds written");
+                } else {
+                    t.fail("[" + file + "] xml parsing");
+                }
+            } else {
+                t.fail("[" + file + "] case not found");
+            }
+        }
+    }
+    
+    function test_boundedBy(t) {
+        t.plan(5);
+        
+        var doc = readXML("v3/topp-states-wfs.xml");
+        var format = new OpenLayers.Format.GML.v3({
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp",
+            geometryName: "the_geom",
+            xy: false
+        });
+        var features = format.read(doc.documentElement);
+        var bounds = features[0].bounds;
+
+        t.ok(bounds instanceof OpenLayers.Bounds, "feature given a bounds");
+        t.eq(bounds.left.toFixed(2), "-91.52", "bounds left correct");
+        t.eq(bounds.bottom.toFixed(2), "36.99", "bounds bottom correct");
+        t.eq(bounds.right.toFixed(2), "-87.51", "bounds right correct");
+        t.eq(bounds.top.toFixed(2), "42.51", "bounds top correct");
+    }
+
+    function test_read(t) {
+        t.plan(8);
+        var doc = readXML("v3/topp-states-wfs.xml");
+        var format = new OpenLayers.Format.GML.v3({
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp",
+            geometryName: "the_geom",
+            xy: false
+        });
+        var features = format.read(doc.documentElement);
+        
+        t.eq(features.length, 3, "read 3 features");
+        var feature = features[0];
+        t.eq(feature.fid, "states.1", "read fid");
+        t.eq(feature.geometry.CLASS_NAME, "OpenLayers.Geometry.MultiPolygon",
+             "read multipolygon geometry");
+        var attributes = feature.attributes;
+        t.eq(attributes["STATE_NAME"], "Illinois", "read STATE_NAME");
+        t.eq(attributes["STATE_FIPS"], "17", "read STATE_FIPS");
+        t.eq(attributes["SUB_REGION"], "E N Cen", "read SUB_REGION");
+        t.eq(attributes["STATE_ABBR"], "IL", "read STATE_ABBR");
+        t.eq(attributes["LAND_KM"], "143986.61", "read LAND_KM");
+    }
+    
+    function test_emptyAttribute(t) {
+        t.plan(4);
+        var str =
+            '<gml:featureMembers xmlns:gml="http://www.opengis.net/gml">' +
+                '<topp:gnis_pop gml:id="gnis_pop.148604" xmlns:topp="http://www.openplans.org/topp">' +
+                    '<gml:name>Aflu</gml:name>' +
+                    '<topp:the_geom>' +
+                        '<gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+                            '<gml:pos>34.12 2.09</gml:pos>' +
+                        '</gml:Point>' +
+                    '</topp:the_geom>' +
+                    '<topp:population>84683</topp:population>' +
+                    '<topp:country>Algeria</topp:country>' +
+                    '<topp:type>place</topp:type>' +
+                    '<topp:name>Aflu</topp:name>' +
+                    '<topp:empty></topp:empty>' +
+                '</topp:gnis_pop>' +
+            '</gml:featureMembers>';
+
+        var format = new OpenLayers.Format.GML.v3({
+            featureType: "gnis_pop",
+            featureNS: "http://www.openplans.org/topp",
+            geometryName: "the_geom"
+        });
+        
+        var features = format.read(str);
+        t.eq(features.length, 1, "read one feature");
+        var attr = features[0].attributes;
+        t.eq(attr.name, "Aflu", "correctly read attribute value");
+        t.eq(attr.foo, undefined, "bogus attribute is undefined");
+        t.eq(attr.empty, "", "empty attribute value is empty string");
+    }
+    
+    function test_repeatedName(t) {
+        // test that if an attribute name matches the featureType, all goes well
+        t.plan(2);
+        var doc = readXML("v3/repeated-name.xml");
+        var format = new OpenLayers.Format.GML.v3({
+            featureType: "zoning",
+            featureNS: "http://opengeo.org/#medford",
+            geometryName: "the_geom",
+            xy: false
+        });
+        var features = format.read(doc.documentElement);
+        
+        t.eq(features.length, 1, "read one feature");
+        var atts = features[0].attributes;
+        t.eq(atts.zoning, "I-L", "correct zoning attribute on zoning feature type");
+
+    }
+
+    function test_write(t) {
+        t.plan(1);
+        var doc = readXML("v3/topp-states-gml.xml");
+        var format = new OpenLayers.Format.GML.v3({
+            featureType: "states",
+            featureNS: "http://www.openplans.org/topp",
+            geometryName: "the_geom",
+            srsName: "urn:x-ogc:def:crs:EPSG:4326",
+            xy: false,
+            schemaLocation: "http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/gml http://schemas.opengis.net/gml/3.2.1/gml.xsd"
+        });
+        var features = format.read(doc.documentElement);
+        
+        var got = format.write(features);
+        t.xml_eq(got, doc.documentElement, "gml:featureMembers round trip");
+    }
+
+   </script>
+</head>
+<body>
+<div id="v3/envelope.xml"><!--
+<gml:Envelope xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:lowerCorner>1 2</gml:lowerCorner>
+    <gml:upperCorner>3 4</gml:upperCorner>
+</gml:Envelope>
+--></div>
+<div id="v3/linearring.xml"><!--
+<gml:LinearRing xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+</gml:LinearRing>
+--></div>
+<div id="v3/linestring.xml"><!--
+<gml:LineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:posList>1 2 3 4</gml:posList>
+</gml:LineString>
+--></div>
+<div id="v3/curve.xml"><!--
+<gml:Curve xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:segments>
+        <gml:LineStringSegment>
+            <gml:posList>1 2 3 4</gml:posList>
+        </gml:LineStringSegment>
+    </gml:segments>
+</gml:Curve>
+--></div>
+<div id="v3/multilinestring-plural.xml"><!--
+<gml:MultiLineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:lineStringMembers>
+        <gml:LineString>
+            <gml:posList>1 2 2 3</gml:posList>
+        </gml:LineString>
+        <gml:LineString>
+            <gml:posList>3 4 4 5</gml:posList>
+        </gml:LineString>
+    </gml:lineStringMembers>
+</gml:MultiLineString>
+--></div>
+<div id="v3/multilinestring-singular.xml"><!--
+<gml:MultiLineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:posList>1 2 2 3</gml:posList>
+        </gml:LineString>
+    </gml:lineStringMember>
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:posList>3 4 4 5</gml:posList>
+        </gml:LineString>
+    </gml:lineStringMember>
+</gml:MultiLineString>
+--></div>
+<div id="v3/multicurve-singular.xml"><!--
+<gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:curveMember>
+        <gml:LineString>
+            <gml:posList>1 2 2 3</gml:posList>
+        </gml:LineString>
+    </gml:curveMember>
+    <gml:curveMember>
+        <gml:LineString>
+            <gml:posList>3 4 4 5</gml:posList>
+        </gml:LineString>
+    </gml:curveMember>
+</gml:MultiCurve>
+--></div>
+<div id="v3/multicurve-curve.xml"><!--
+<gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:curveMember>
+        <gml:Curve>
+            <gml:segments>
+                <gml:LineStringSegment>
+                    <gml:posList>1 2 2 3</gml:posList>
+                </gml:LineStringSegment>
+            </gml:segments>
+        </gml:Curve>
+    </gml:curveMember>
+    <gml:curveMember>
+        <gml:Curve>
+            <gml:segments>
+                <gml:LineStringSegment>
+                    <gml:posList>3 4 4 5</gml:posList>
+                </gml:LineStringSegment>
+            </gml:segments>
+        </gml:Curve>
+    </gml:curveMember>
+</gml:MultiCurve>
+--></div>
+<div id="v3/multipoint-plural.xml"><!--
+<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:pointMembers>
+        <gml:Point>
+            <gml:pos>1 2</gml:pos>
+        </gml:Point>
+        <gml:Point>
+            <gml:pos>2 3</gml:pos>
+        </gml:Point>
+        <gml:Point>
+            <gml:pos>3 4</gml:pos>
+        </gml:Point>
+    </gml:pointMembers>
+</gml:MultiPoint>
+--></div>
+<div id="v3/multipoint-singular.xml"><!--
+<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:pointMember>
+        <gml:Point>
+            <gml:pos>1 2</gml:pos>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:pos>2 3</gml:pos>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:pos>3 4</gml:pos>
+        </gml:Point>
+    </gml:pointMember>
+</gml:MultiPoint>
+--></div>
+<div id="v3/multipolygon-plural.xml"><!--
+<gml:MultiPolygon xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:polygonMembers>
+        <gml:Polygon>
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>2 3 4 5 6 7 2 3</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>    
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>3 4 5 6 7 8 3 4</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>
+        </gml:Polygon>
+        <gml:Polygon>
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+        </gml:Polygon>
+    </gml:polygonMembers>
+</gml:MultiPolygon>
+--></div>
+<div id="v3/multipolygon-singular.xml"><!--
+<gml:MultiPolygon xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:polygonMember>
+        <gml:Polygon>
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>2 3 4 5 6 7 2 3</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>    
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>3 4 5 6 7 8 3 4</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>
+        </gml:Polygon>
+    </gml:polygonMember>
+    <gml:polygonMember>
+        <gml:Polygon>
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+        </gml:Polygon>
+    </gml:polygonMember>
+</gml:MultiPolygon>
+--></div>
+<div id="v3/multisurface-plural.xml"><!--
+<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:surfaceMembers>
+        <gml:Polygon>
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>2 3 4 5 6 7 2 3</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>    
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>3 4 5 6 7 8 3 4</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>
+        </gml:Polygon>
+        <gml:Polygon>
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+        </gml:Polygon>
+    </gml:surfaceMembers>
+</gml:MultiSurface>
+--></div>
+<div id="v3/multisurface-singular.xml"><!--
+<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:surfaceMember>
+        <gml:Polygon>
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>2 3 4 5 6 7 2 3</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>    
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>3 4 5 6 7 8 3 4</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>
+        </gml:Polygon>
+    </gml:surfaceMember>
+    <gml:surfaceMember>
+        <gml:Polygon>
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+        </gml:Polygon>
+    </gml:surfaceMember>
+</gml:MultiSurface>
+--></div>
+<div id="v3/multisurface-surface.xml"><!--
+<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:surfaceMember>
+        <gml:Surface>
+            <gml:patches>
+                <gml:PolygonPatch interpolation="planar">
+                    <gml:exterior>
+                        <gml:LinearRing>
+                            <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                        </gml:LinearRing>
+                    </gml:exterior>
+                    <gml:interior>
+                        <gml:LinearRing>
+                            <gml:posList>2 3 4 5 6 7 2 3</gml:posList>
+                        </gml:LinearRing>
+                    </gml:interior>    
+                    <gml:interior>
+                        <gml:LinearRing>
+                            <gml:posList>3 4 5 6 7 8 3 4</gml:posList>
+                        </gml:LinearRing>
+                    </gml:interior>
+                </gml:PolygonPatch>
+            </gml:patches>
+        </gml:Surface>
+    </gml:surfaceMember>
+    <gml:surfaceMember>
+        <gml:Surface>
+            <gml:patches>
+                <gml:PolygonPatch interpolation="planar">
+                    <gml:exterior>
+                        <gml:LinearRing>
+                            <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                        </gml:LinearRing>
+                    </gml:exterior>
+                </gml:PolygonPatch>
+            </gml:patches>
+        </gml:Surface>
+    </gml:surfaceMember>
+</gml:MultiSurface>
+--></div>
+<div id="v3/point.xml"><!--
+<gml:Point xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:pos>1 2</gml:pos>
+</gml:Point>
+--></div>
+<div id="v3/polygon.xml"><!--
+<gml:Polygon xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:exterior>
+        <gml:LinearRing>
+            <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+        </gml:LinearRing>
+    </gml:exterior>
+    <gml:interior>
+        <gml:LinearRing>
+            <gml:posList>2 3 4 5 6 7 2 3</gml:posList>
+        </gml:LinearRing>
+    </gml:interior>    
+    <gml:interior>
+        <gml:LinearRing>
+            <gml:posList>3 4 5 6 7 8 3 4</gml:posList>
+        </gml:LinearRing>
+    </gml:interior>    
+</gml:Polygon>
+--></div>
+<div id="v3/surface.xml"><!--
+<gml:Surface xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:patches>
+        <gml:PolygonPatch interpolation="planar">
+            <gml:exterior>
+                <gml:LinearRing>
+                    <gml:posList>1 2 3 4 5 6 1 2</gml:posList>
+                </gml:LinearRing>
+            </gml:exterior>
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>2 3 4 5 6 7 2 3</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>    
+            <gml:interior>
+                <gml:LinearRing>
+                    <gml:posList>3 4 5 6 7 8 3 4</gml:posList>
+                </gml:LinearRing>
+            </gml:interior>
+        </gml:PolygonPatch>
+    </gml:patches>
+</gml:Surface>
+--></div>
+<div id="v3/topp-states-gml.xml"><!--
+<?xml version="1.0" encoding="UTF-8"?>
+<gml:featureMembers xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/gml http://schemas.opengis.net/gml/3.2.1/gml.xsd" xmlns:topp="http://www.openplans.org/topp" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml"><topp:states fid="states.1"><topp:the_geom><gml:MultiSurface srsName="urn:x-ogc:de [...]
+--></div>
+<div id="v3/topp-states-wfs.xml"><!--
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="3" timeStamp="2008-09-12T00:24:21.013-04:00" xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma.openplans.org:80/geoserver/schemas/wfs/1.1.0/wfs.xsd" xmlns:ogc="http://www.opengis.net/ogc" xmlns:opengeo="http://open-geo.com" xmlns:tiger="http://www.census.gov" xmlns:wfs="http://ww [...]
+--></div>
+<div id="v2/point-coord.xml"><!--
+<gml:Point xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coord>
+    <gml:X>1</gml:X>
+    <gml:Y>2</gml:Y>
+  </gml:coord>
+</gml:Point>
+--></div>
+<div id="v2/point-coordinates.xml"><!--
+<gml:Point xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates>
+</gml:Point>
+--></div>
+<div id="v2/linestring-coord.xml"><!--
+<gml:LineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coord>
+    <gml:X>1</gml:X>
+    <gml:Y>2</gml:Y>
+  </gml:coord>
+  <gml:coord>
+    <gml:X>3</gml:X>
+    <gml:Y>4</gml:Y>
+  </gml:coord>
+</gml:LineString>
+--></div>
+<div id="v2/linestring-coordinates.xml"><!--
+<gml:LineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+  <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4</gml:coordinates>
+</gml:LineString>
+--></div>
+<div id="v2/multipoint-coord.xml"><!--
+<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coord>
+                <gml:X>1</gml:X>
+                <gml:Y>2</gml:Y>
+            </gml:coord>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coord>
+                <gml:X>2</gml:X>
+                <gml:Y>3</gml:Y>
+            </gml:coord>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coord>
+                <gml:X>3</gml:X>
+                <gml:Y>4</gml:Y>
+            </gml:coord>
+        </gml:Point>
+    </gml:pointMember>
+</gml:MultiPoint>
+--></div>
+<div id="v2/multipoint-coordinates.xml"><!--
+<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coordinates decimal="." cs="," ts=" ">2,3</gml:coordinates>
+        </gml:Point>
+    </gml:pointMember>
+    <gml:pointMember>
+        <gml:Point>
+            <gml:coordinates decimal="." cs="," ts=" ">3,4</gml:coordinates>
+        </gml:Point>
+    </gml:pointMember>
+</gml:MultiPoint>
+--></div>
+<div id="v2/multilinestring-coord.xml"><!--
+<gml:MultiLineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:coord>
+                <gml:X>1</gml:X>
+                <gml:Y>2</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>2</gml:X>
+                <gml:Y>3</gml:Y>
+            </gml:coord>
+        </gml:LineString>
+    </gml:lineStringMember>
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:coord>
+                <gml:X>3</gml:X>
+                <gml:Y>4</gml:Y>
+            </gml:coord>
+            <gml:coord>
+                <gml:X>4</gml:X>
+                <gml:Y>5</gml:Y>
+            </gml:coord>
+        </gml:LineString>
+    </gml:lineStringMember>
+</gml:MultiLineString>
+--></div>
+<div id="v2/multilinestring-coordinates.xml"><!--
+<gml:MultiLineString xmlns:gml="http://www.opengis.net/gml" srsName="foo">
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:coordinates decimal="." cs="," ts=" ">1,2 2,3</gml:coordinates>
+        </gml:LineString>
+    </gml:lineStringMember>
+    <gml:lineStringMember>
+        <gml:LineString>
+            <gml:coordinates decimal="." cs="," ts=" ">3,4 4,5</gml:coordinates>
+        </gml:LineString>
+    </gml:lineStringMember>
+</gml:MultiLineString>
+--></div>
+<div id="v3/repeated-name.xml"><!--
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="1" timeStamp="2010-01-29T15:10:38.921-07:00"
+        xsi:schemaLocation="http://medford.opengeo.org http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=medford%3Azoning http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"
+        xmlns:ogc="http://www.opengis.net/ogc"
+        xmlns:wfs="http://www.opengis.net/wfs"
+        xmlns:medford="http://opengeo.org/#medford"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns:ows="http://www.opengis.net/ows"
+        xmlns:gml="http://www.opengis.net/gml"
+        xmlns:xlink="http://www.w3.org/1999/xlink">
+    <gml:featureMembers>
+        <medford:zoning gml:id="zoning.1">
+            <medford:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>42.397027571297585 -122.88465674265922 42.39702893980587 -122.88509730796012 42.397029086785146 -122.88511582432085 42.39702379767053 -122.88528111596624 42.39748517484964 -122.88529300380065 42.39748473847452 -122.88509914138723 42.39748482219041 -122.8849959517568 42.397485082635576 -122.8846741899541 42.3974853307826 -122.88436529392652 42.39702663751206 -122.88435664014142 42.397027571297585 -122.88465674265922</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </medford:the_geom>
+            <medford:objectid>1</medford:objectid>
+            <medford:cityzone>YES</medford:cityzone>
+            <medford:zoning>I-L</medford:zoning>
+            <medford:revdate>2004-04-12T00:00:00-06:00</medford:revdate>
+            <medford:finord></medford:finord>
+            <medford:filenum></medford:filenum>
+            <medford:acres>0.95741118624</medford:acres>
+            <medford:misc></medford:misc>
+            <medford:shape_leng>835.705330224</medford:shape_leng>
+            <medford:perimeter>835.705330224</medford:perimeter>
+            <medford:area>41704.8312728</medford:area>
+            <medford:shape_le_1>835.705330224</medford:shape_le_1>
+            <medford:shape_area>41704.8312728</medford:shape_area>
+            <medford:hectares>0.38745056079</medford:hectares>
+        </medford:zoning>
+    </gml:featureMembers>
+</wfs:FeatureCollection>
+-->
+</body>
+</html>
diff --git a/tests/Format/GPX.html b/tests/Format/GPX.html
new file mode 100644
index 0000000..7bf56ec
--- /dev/null
+++ b/tests/Format/GPX.html
@@ -0,0 +1,41 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    var gpx_data = '<?xml version="1.0" encoding="ISO-8859-1"?><gpx version="1.1" creator="Memory-Map 5.1.3.715 http://www.memory-map.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"><wpt lat="51.3697845627" lon="-0.1853562259"><name>Mark</name><sym><![CDATA[Flag]]></sym><type><![CDATA[Marks]]></type></wpt><rte><name><![CDATA[Route8]]></name [...]
+    
+    function test_Format_GPX_constructor(t) { 
+        t.plan(5); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.GPX(options); 
+        t.ok(format instanceof OpenLayers.Format.GPX, 
+             "new OpenLayers.Format.GPX returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+        t.eq(format.externalProjection.getCode(), "EPSG:4326", 
+             "default external projection is EPSG:4326"); 
+    }
+    function test_Format_GPX_read(t) {
+        t.plan(4);
+        var f = new OpenLayers.Format.GPX();
+        var features = f.read(gpx_data);
+        t.eq(features.length, 3, "Number of features read is correct");
+        t.eq(features[2].geometry.toString(), "POINT(-0.1853562259 51.3697845627)", "waypoint feature correctly created");
+        t.eq(features[0].geometry.toString(), "LINESTRING(-0.1721292044 51.3768216433,-0.1649230916 51.370833767,-0.1736741378 51.3644368725,-0.166259525 51.3576354272)", "track feature correctly created");
+        t.eq(features[1].geometry.toString(), "LINESTRING(-0.1829991904 51.3761803674,-0.1758887005 51.3697894659,-0.1833202965 51.3639790884,-0.1751119509 51.3567607069)", "route feature correctly created");
+    }
+    function test_format_GPX_read_attributes(t) {
+        t.plan(2);
+        var f = new OpenLayers.Format.GPX();
+        var features = f.read(gpx_data);
+        t.eq(features[2].attributes['name'], "Mark", "Text attribute node read correctly.");
+        t.eq(features[2].attributes['sym'], "Flag", "CDATA attribute node read correctly.");
+    }
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/GeoJSON.html b/tests/Format/GeoJSON.html
new file mode 100644
index 0000000..db3dd7c
--- /dev/null
+++ b/tests/Format/GeoJSON.html
@@ -0,0 +1,428 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    var poly_content = '{"type": "FeatureCollection", "features": [{"geometry": {"type": "Polygon", "coordinates": [[[-131.484375, -5.9765625], [-112.5, -58.0078125], [-32.34375, -50.2734375], [-114.609375, 52.3828125], [-167.34375, -35.5078125], [-146.953125, -57.3046875], [-139.921875, -34.1015625], [-131.484375, -5.9765625]]]}, "type": "Feature", "id": 562, "properties": {"strokeColor": "red", "title": "Feature 2", "author": "Your Name Here"}}]}'; 
+    var null_geom_feature = '{"type":"Feature","id":573,"properties":{"strokeColor":"blue","title":"Feature 5","author":"Your Name Here"},"geometry":null}';
+    var point_feature = '{"geometry": {"type": "Point", "coordinates": [94.21875, 72.94921875]}, "type": "Feature", "id": 573, "properties": {"strokeColor": "blue", "title": "Feature 5", "author": "Your Name Here"}}';
+    var line_feature = '{"type": "FeatureCollection", "features": [{"geometry": {"type": "LineString", "coordinates": [[-27.0703125, 59.4140625], [-77.6953125, 20.7421875], [30.5859375, -36.2109375], [67.1484375, 34.8046875]]}, "type": "Feature", "id": 559, "properties": {"strokeColor": "red", "title": "Feature 1", "author": "Your Name Here"}}]}';
+    var multiple_features = '{"type": "FeatureCollection", "features": [{"geometry": {"type": "Point", "coordinates": [-91.0546875, 43.9453125]}, "type": "Feature", "id": 577, "properties": {"strokeColor": "red", "title": "Feature 2", "image": "foo.gif", "author": "Your Name Here"}}, {"geometry": {"type": "LineString", "coordinates": [[91.40625, -1.40625], [116.015625, -42.890625], [153.28125, -28.125], [108.984375, 11.25], [75.234375, 8.4375], [76.640625, 9.140625], [67.5, -36.5625], [6 [...]
+    var parser = new OpenLayers.Format.GeoJSON();
+    var data;
+
+    function test_Format_GeoJSON_constructor(t) { 
+        t.plan(4); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.GeoJSON(options); 
+        t.ok(format instanceof OpenLayers.Format.GeoJSON, 
+             "new OpenLayers.Format.GeoJSON returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+
+    function test_Format_GeoJSON_null_geom(t) {
+        t.plan(2);
+        var f = new OpenLayers.Format.GeoJSON();
+        var fs = f.read(null_geom_feature);
+        t.ok(fs[0].geometry == null, "Reading feature with null geom works okay");
+        t.eq(f.write(fs[0]), null_geom_feature, "round trip null okay"); 
+
+    }   
+    function test_Format_GeoJSON_valid_type(t) { 
+        t.plan(14);
+
+        OpenLayers.Console.error = function(error) { window.global_error = error;};
+        var types = ["Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon", "Box", "GeometryCollection"];
+        for (var i = 0; i < types.length; i++) {
+            t.ok(parser.isValidType({'type':types[i]}, "Geometry"), "Geometry with type " + types[i] + " is valid");
+        }
+        t.ok(!parser.isValidType({'type':"foo"}, "Geometry"), "Geometry with type foo is not valid");
+        t.eq(global_error, "Unsupported geometry type: foo", "error message set correctly for 'foo' geom.");
+        t.ok(parser.isValidType({}, "FeatureCollection"), "Feature collection type is always valid"); 
+        t.ok(parser.isValidType({'type':"GeometryCollection"}, "GeometryCollection"), "Geometry Collection type is valid"); 
+        t.ok(!parser.isValidType({'type':"GeometryCollection2"}, "GeometryCollection"), "Geometry Collection 2 type is invalid"); 
+        t.eq(global_error, "Cannot convert types from GeometryCollection2 to GeometryCollection", "error message set correctly for bad geometrycollection type");
+    }
+
+    function test_Format_GeoJSON_point(t) { 
+        t.plan(3);
+
+        data = parser.read(point_feature);
+        t.eq(data[0].fid, 573, "Fid is correct on point feature"); 
+        t.eq(data[0].geometry.x, 94.21875, 'Reading point feature gives correct x');
+        data = parser.read(point_feature, "Feature");
+        t.eq(data.fid, 573, 'Reading point feature with type gives feature instead of array of features ');
+    }
+
+    function test_Format_GeoJSON_line(t) { 
+        t.plan(5);
+
+        data = parser.read(line_feature);
+        t.eq(data[0].fid, 559, "Fid is correct on line feature"); 
+        t.eq(data[0].geometry.components.length, 4, 'Reading line feature gives correct length');
+        t.eq(data[0].geometry.CLASS_NAME, 'OpenLayers.Geometry.LineString', 'Reading line feature gives correct class');
+        t.eq(data[0].geometry.components[0].x, -27.0703125, 'Reading line feature gives correct x');
+        t.eq(data[0].geometry.components[0].y, 59.4140625, 'Reading line feature gives correct y');
+    }
+
+    function test_Format_GeoJSON_poly(t) { 
+        t.plan(2);
+
+        data = parser.read(poly_content);
+        t.eq(data[0].fid, 562, "poly id is correct");
+        t.eq(data[0].geometry.components[0].components.length, 8, 
+                'Reading polygon first ring  on feature from featurecollection gives correct length');
+    }
+
+    function test_Format_GeoJSON_multipoint(t) { 
+        t.plan(5);
+
+        var multipoint = {
+           "type": "MultiPoint",
+           "coordinates": [
+               [100.0, 0.0], [101.0, 1.0]
+           ]
+        };
+        data = parser.read(multipoint, "Geometry");
+        t.eq(data.components.length, 2, 
+            "Right number of components");
+        t.eq(data.components[0].CLASS_NAME, "OpenLayers.Geometry.Point", "First component is point");    
+        t.eq(data.components[1].CLASS_NAME, "OpenLayers.Geometry.Point", "Second component is point");    
+        t.eq(data.components[1].x, 101, "x of second component is right");    
+        t.eq(data.components[1].y, 1, "y of second component is right");    
+    }
+
+    function test_Format_GeoJSON_multiline(t) {
+        t.plan(3);
+
+        var multiline = {
+           "type": "MultiLineString",
+           "coordinates": [
+               [ [100.0, 0.0], [101.0, 1.0] ],
+               [ [102.0, 2.0], [103.0, 3.0] ]
+           ]
+        };
+        data = parser.read(multiline, "Geometry");
+        t.eq(data.CLASS_NAME, "OpenLayers.Geometry.MultiLineString", "Correct class retrieved");
+        t.eq(data.components[0].components[0].CLASS_NAME, "OpenLayers.Geometry.Point", "correct type of components");
+        t.eq(data.components[0].CLASS_NAME, "OpenLayers.Geometry.LineString", "correct type of components");
+    }
+
+    function test_Format_GeoJSON_multipol(t) {
+        t.plan(2);
+
+        var multipol = {
+            "type": "MultiPolygon",
+            "coordinates": [
+                [
+                    [ [102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0] ]
+                ],
+                [
+                    [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ],
+                    [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ]
+                ]
+            ]
+        };
+        OpenLayers.Console.error = function(error) { window.global_error = error; };
+        data = parser.read(multipol, "Geometry");
+        t.eq(data.CLASS_NAME, "OpenLayers.Geometry.MultiPolygon", "Correct class retrieved");
+        t.eq(data.components[1].components[0].components[0].CLASS_NAME, "OpenLayers.Geometry.Point", "correct type of components");
+    }
+
+    function test_Format_GeoJSON_box(t) {
+        t.plan(6);
+
+        var box = {
+            "type": "Box",
+            "coordinates": [[100.0, 0.0], [101.0, 1.0]]
+        };
+        var poly = parser.read(box, "Geometry");
+        t.eq(poly.CLASS_NAME, "OpenLayers.Geometry.Polygon", "Box creates polygon"); 
+        t.eq(poly.components[0].components[1].x, 101, "x of lower right is correct");
+        t.eq(poly.components[0].components[1].y, 0, "y of lower right is correct");
+        t.eq(poly.components[0].components[3].x, 100, "x of upper left is correct");
+        t.eq(poly.components[0].components[3].y, 1, "y of upper left is correct");
+        box = parser.write(poly );
+        t.ok(box.search("Polygon") != -1 , "Serializes back to polygon");
+    }
+
+    // This test is from the geom_collection example on geojson spec.
+    function test_Format_GeoJSON_collection(t) {
+       t.plan(12);
+
+       var geomcol = {
+           "type": "GeometryCollection",
+           "geometries": [
+               {
+                   "type": "Point",
+                   "coordinates": [100.0, 0.0]
+               },
+               {
+                   "type": "LineString",
+                   "coordinates": [
+                       [101.0, 0.0], [102.0, 1.0]
+                   ]
+               }
+           ]
+        };
+        data = parser.read(geomcol, "Geometry");
+        t.eq(data.CLASS_NAME, "OpenLayers.Geometry.Collection",
+             "GeometryCollection deserialized into geometry.collection");  
+        t.eq(data.components[0].CLASS_NAME, "OpenLayers.Geometry.Point",
+             "First geom is correct type");  
+        t.eq(data.components[0].x, 100,
+             "First geom in geom collection has correct x");  
+        t.eq(data.components[0].y, 0,
+             "First geom in geom collection has correct x");  
+        
+        t.eq(data.components[1].CLASS_NAME, "OpenLayers.Geometry.LineString",
+             "Second geom in geom collection is point linestring");  
+        t.eq(data.components[1].components.length, 2,
+             "linestring is correct length");
+        t.eq(data.components[1].components[1].x, 102,
+             "linestring is correct x end");
+        t.eq(data.components[1].components[1].y, 1,
+             "linestring is correct y end");
+
+        data = parser.read(geomcol, "FeatureCollection");
+        t.eq(data[0].CLASS_NAME, "OpenLayers.Feature.Vector",
+             "GeometryCollection can be read in as a feature collection");
+        t.eq(data[0].geometry.CLASS_NAME, "OpenLayers.Geometry.Collection",
+             "feature contains the correct geometry type");
+        var feature = {
+           "type": "Feature",
+           "geometry": {
+              "type": "GeometryCollection",
+              "geometries": [
+                  {
+                    "type": "Point",
+                    "coordinates": [100.0, 0.0]
+                  },
+                  {
+                    "type": "LineString",
+                    "coordinates": [
+                        [101.0, 0.0], [102.0, 1.0]
+                    ]
+                  }
+              ]
+           },
+           "properties": {
+               "prop0": "value0",
+               "prop1": "value1"
+           }
+        };
+        data = parser.read(feature, "Feature");
+        t.eq(data.geometry.CLASS_NAME, "OpenLayers.Geometry.Collection", "Geometry of feature is a collection");
+        var l = new OpenLayers.Layer.Vector();
+        l.addFeatures(data);
+        t.ok(true, "adding a feature with geomcollection to layer doesn't cause error."); 
+    }
+
+    function test_Format_GeoJSON_multipleFeatures(t) {
+        t.plan(2);
+
+        var feats = parser.read(multiple_features);
+        t.eq(feats.length, 19, "parsing a feature collection returns the correct number of features.");
+        var types = {'Point':0, 'LineString':0, 'Polygon':0};
+        for(var i = 0; i < feats.length; i++) {
+            var type = feats[i].geometry.CLASS_NAME.replace("OpenLayers.Geometry.", "");
+            types[type]++;
+        }
+        t.eq(types, {'Point':15, 'Polygon': 2, 'LineString':2}, "Correct number of each type"); 
+    }
+
+    function test_Format_GeoJSON_writeWithCRS(t) {
+        t.plan(2);
+        var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,2));
+        feature.fid = 0;
+        var output = '{"type":"Feature","id":0,"properties":{},"geometry":{"type":"Point","coordinates":[1,2]},"crs":{"type":"OGC","properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}';
+        var layer = new OpenLayers.Layer.Vector();
+        layer.projection = "EPSG:4326";
+        feature.layer = layer;
+        var parser = new OpenLayers.Format.GeoJSON();
+        var test_out = parser.write(feature);
+        t.eq(test_out, output, "Output is equal for vector with layer in EPSG:4326 ");
+        feature.layer.projection = "EPSG:2805";
+        output = '{"type":"Feature","id":0,"properties":{},"geometry":{"type":"Point","coordinates":[1,2]},"crs":{"type":"EPSG","properties":{"code":2805}}}';
+        test_out = parser.write(feature);
+        t.eq(test_out, output, "Output is equal for vector with point");
+    }    
+        
+    function test_Format_GeoJSON_write(t) {
+        t.plan(10);
+
+        var line_object = {
+            "type": "FeatureCollection", 
+            "features": [
+                {
+                    "geometry": {
+                        "type": "LineString", 
+                        "coordinates": [
+                            [-27.0703125, 59.4140625], 
+                            [-77.6953125, 20.7421875], 
+                            [30.5859375, -36.2109375], 
+                            [67.1484375, 34.8046875]
+                        ]
+                    },
+                    "type": "Feature", 
+                    "id": 559, 
+                    "properties": {
+                        "strokeColor": "red", 
+                        "title": "Feature 1", 
+                        "author": "Your Name Here"
+                    }
+                }
+            ]
+        };
+        data = parser.read(line_object);
+        out = parser.write(data);
+        serialized = '{"type":"FeatureCollection","features":[{"type":"Feature","id":559,"properties":{"strokeColor":"red","title":"Feature 1","author":"Your Name Here"},"geometry":{"type":"LineString","coordinates":[[-27.0703125,59.4140625],[-77.6953125,20.7421875],[30.5859375,-36.2109375],[67.1484375,34.8046875]]}}]}';
+        t.eq(out, serialized, "input and output on line collections are the same");
+        
+        var serialize_tests = [
+            [
+                new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,2)),
+                '{"type":"Feature","id":0,"properties":{},"geometry":{"type":"Point","coordinates":[1,2]}}'
+            ],
+            [
+                new OpenLayers.Geometry.Point(1,2), 
+                '{"type":"Point","coordinates":[1,2]}'
+            ], 
+            [
+                new OpenLayers.Geometry.MultiPoint([
+                    new OpenLayers.Geometry.Point(1,2)
+                ]),
+                '{"type":"MultiPoint","coordinates":[[1,2]]}'
+            ],
+            [
+                new OpenLayers.Geometry.LineString([
+                    new OpenLayers.Geometry.Point(1,2), 
+                    new OpenLayers.Geometry.Point(3,4)
+                ]),
+                '{"type":"LineString","coordinates":[[1,2],[3,4]]}'
+            ], 
+            [
+                new OpenLayers.Geometry.Polygon([
+                    new OpenLayers.Geometry.LinearRing([
+                        new OpenLayers.Geometry.Point(1,2), 
+                        new OpenLayers.Geometry.Point(3,4), 
+                        new OpenLayers.Geometry.Point(5,6)
+                    ])
+                ]), 
+                '{"type":"Polygon","coordinates":[[[1,2],[3,4],[5,6],[1,2]]]}'
+            ],
+            [
+                new OpenLayers.Geometry.Collection([
+                    new OpenLayers.Geometry.Polygon([
+                        new OpenLayers.Geometry.LinearRing([
+                            new OpenLayers.Geometry.Point(1,2), 
+                            new OpenLayers.Geometry.Point(3,4), 
+                            new OpenLayers.Geometry.Point(5,6)
+                        ])
+                    ]), 
+                    new OpenLayers.Geometry.LineString([
+                        new OpenLayers.Geometry.Point(1,2), 
+                        new OpenLayers.Geometry.Point(3,4)
+                    ]),
+                    new OpenLayers.Geometry.Point(1,2)
+                ]),
+                '{"type":"GeometryCollection","geometries":[{"type":"Polygon","coordinates":[[[1,2],[3,4],[5,6],[1,2]]]},{"type":"LineString","coordinates":[[1,2],[3,4]]},{"type":"Point","coordinates":[1,2]}]}'
+            ]
+        ];
+        serialize_tests[0][0].fid = 0;
+        multiline = new OpenLayers.Geometry.MultiLineString([serialize_tests[3][0], serialize_tests[3][0]]);
+        serialize_tests.push([multiline, '{"type":"MultiLineString","coordinates":[[[1,2],[3,4]],[[1,2],[3,4]]]}']);
+        multipolygon = new OpenLayers.Geometry.MultiPolygon([serialize_tests[4][0],  serialize_tests[4][0]]);
+        serialize_tests.push([multipolygon, '{"type":"MultiPolygon","coordinates":[[[[1,2],[3,4],[5,6],[1,2]]],[[[1,2],[3,4],[5,6],[1,2]]]]}']);
+        serialize_tests.push([ [ serialize_tests[0][0] ], '{"type":"FeatureCollection","features":[{"type":"Feature","id":0,"properties":{},"geometry":{"type":"Point","coordinates":[1,2]}}]}' ]);
+        for (var i = 0; i < serialize_tests.length; i++) {
+            var input = serialize_tests[i][0];
+            var output = serialize_tests[i][1];
+            test_out = parser.write(input);
+            t.eq(test_out, output, "Serializing " + input.toString() + " saved correctly.");
+        }
+    }
+
+    function test_Format_GeoJSON_read_object(t) {
+        t.plan(1);
+
+        var line_object = {
+            "type": "FeatureCollection", 
+            "features": [
+                {
+                    "geometry": {
+                        "type": "LineString", 
+                        "coordinates": [
+                            [-27.0703125, 59.4140625], 
+                            [-77.6953125, 20.7421875], 
+                            [30.5859375, -36.2109375], 
+                            [67.1484375, 34.8046875]
+                        ]
+                    }, 
+                    "type": "Feature", 
+                    "id": 559, 
+                    "properties": {
+                        "strokeColor": "red", 
+                        "title": "Feature 1", 
+                        "author": "Your Name Here"
+                    }
+                }
+            ]
+        };
+        data = parser.read(line_object);
+        t.eq(data[0].fid, 559, "Can read data from an object correctly.");
+    }
+
+    function test_Format_GeoJSON_read_attributes(t) {
+        t.plan(3);
+
+        var parser = new OpenLayers.Format.GeoJSON();
+        data = parser.read(line_feature);
+        t.eq(data[0].attributes['strokeColor'], 'red', 'read strokeColor attribute properly'); 
+        t.eq(data[0].attributes['title'], 'Feature 1', 'read title attribute properly'); 
+        t.eq(data[0].attributes['author'], 'Your Name Here', 'read author attribute properly'); 
+    }
+
+    function test_read_bbox(t) {
+        t.plan(8);
+
+        var f;
+        parser = new OpenLayers.Format.GeoJSON();
+
+        // 4 tests
+        f = '{"geometry": {"type": "Point", "coordinates": [94.21875, 72.94921875], "bbox": [94.21875, 72.94921875, 94.21875, 72.94921875]}, "type": "Feature", "id": 573, "properties": {}, "bbox": [95.0, 73.0]}';
+        data = parser.read(f);
+        t.eq(data[0].bounds.left, 94.21875, "read left bound is correct");
+        t.eq(data[0].bounds.bottom, 72.94921875, "read bottom left bound is correct");
+        t.eq(data[0].bounds.right, 94.21875, "read right bound is correct");
+        t.eq(data[0].bounds.top, 72.94921875, "read top left bound is correct");
+
+        // 4 tests
+        f = '{"geometry": {"type": "Point", "coordinates": [94.21875, 72.94921875]}, "type": "Feature", "id": 573, "properties": {}, "bbox": [95.0, 73.0, 96.0, 74.0]}';
+        data = parser.read(f);
+        t.eq(data[0].bounds.left, 95.0, "read left bound is correct");
+        t.eq(data[0].bounds.bottom, 73.0, "read bottom left bound is correct");
+        t.eq(data[0].bounds.right, 96.0, "read right bound is correct");
+        t.eq(data[0].bounds.top, 74.0, "read top left bound is correct");
+    }
+
+    function test_Format_GeoJSON_point_extradims(t) { 
+        t.plan(3);
+        var point_feature_3d = '{"geometry": {"type": "Point", "coordinates": [94.21875, 72.94921875, 0.0]}, "type": "Feature", "id": 573, "properties": {"strokeColor": "blue", "title": "Feature 5", "author": "Your Name Here"}}';
+        p = new OpenLayers.Format.GeoJSON({"ignoreExtraDims": true});
+        data = p.read(point_feature_3d);
+        t.eq(data[0].fid, 573, "Fid is correct on point feature"); 
+        t.eq(data[0].geometry.x, 94.21875, 'Reading point feature gives correct x');
+        data = p.read(point_feature_3d, "Feature");
+        t.eq(data.fid, 573, 'Reading point feature with type gives feature instead of array of features ');
+    }
+
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/GeoRSS.html b/tests/Format/GeoRSS.html
new file mode 100644
index 0000000..8a4665a
--- /dev/null
+++ b/tests/Format/GeoRSS.html
@@ -0,0 +1,105 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_Format_GeoRSS_constructor(t) { 
+        t.plan(4); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.GeoRSS(options); 
+        t.ok(format instanceof OpenLayers.Format.GeoRSS, 
+             "new OpenLayers.Format.GeoRSS returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+
+    function test_Format_GeoRSS_serializeline(t) { 
+        t.plan(1);
+
+        var parser = new OpenLayers.Format.GeoRSS();
+        var point = new OpenLayers.Geometry.Point(-111.04, 45.68);  
+        var point2 = new OpenLayers.Geometry.Point(-112.04, 45.68); 
+        var l = new OpenLayers.Geometry.LineString([point, point2]);
+        var f = new OpenLayers.Feature.Vector(l);
+        var data = parser.write([f]);
+        t.xml_eq(data, '<rss xmlns="http://backend.userland.com/rss2"><item><title></title><description></description><georss:line xmlns:georss="http://www.georss.org/georss">45.68 -111.04 45.68 -112.04</georss:line></item></rss>', 'GeoRSS serializes a line correctly');
+    }
+    function test_Format_GeoRSS_box(t) {
+        t.plan(4);
+        var xml = '<rss xmlns="http://backend.userland.com/rss2"><item><title></title><description></description><georss:box xmlns:georss="http://www.georss.org/georss">45.68 -112.04 47.68 -111.04</georss:box></item></rss>';
+        var format = new OpenLayers.Format.GeoRSS();
+        var features = format.read(xml);
+        t.eq(features.length, 1, "one feature returned");
+        t.eq(features[0].geometry.components[0].components.length, 5, "polygon returned");
+        t.eq(features[0].geometry.components[0].components[0].x, -112.04, "polygon returned with correct first x");
+        t.eq(features[0].geometry.components[0].components[0].y, 45.68, "polygon returned with correct first y");
+    }
+    function test_Format_GeoRSS_w3cgeo(t) { 
+        t.plan(2);
+
+        var parser = new OpenLayers.Format.GeoRSS();
+        var data = parser.read('<rss xmlns="http://backend.userland.com/rss2" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"><item><geo:long>-1</geo:long><geo:lat>1</geo:lat></item></rss>');
+        t.eq(data[0].geometry.x, -1, "w3c geo x read correctly"); 
+        t.eq(data[0].geometry.y, 1, "w3c geo y read correctly"); 
+    }
+    function test_Format_GeoRSS_reproject_null(t) { 
+        t.plan(1);
+
+        var parser = new OpenLayers.Format.GeoRSS({'internalProjection':new OpenLayers.Projection("EPSG:4326"), 'externalProjection': new OpenLayers.Projection("EPSG:4326")});
+        var data = parser.read('<rss xmlns="http://backend.userland.com/rss2" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"><item></item></rss>');
+        t.eq(data.length, 1, "Parsing items with null geometry and reprojection doesn't fail");
+    }
+    function test_Format_GeoRSS_roundtrip(t) {
+        t.plan(input.length);
+        var parser = new OpenLayers.Format.GeoRSS();
+        for(var i=0; i < input.length; i++) {
+            var feed = shell_start+input[i]+shell_end;
+            var data = parser.read(feed);
+            var out = parser.write(data);
+            var expected_result = output[i];
+            t.xml_eq(out, expected_result, "Output gave expected value");
+        }
+    }
+    function test_Format_GeoRSS_gml_roundtrip(t) {
+        t.plan(input_gml.length);
+        var parser = new OpenLayers.Format.GeoRSS();
+        for(var i=0; i < input_gml.length; i++) {
+            var feed = shell_start_gml+input_gml[i]+shell_end_gml;
+            var data = parser.read(feed);
+            var out = parser.write(data);
+            var expected_result = output_gml[i];
+            t.xml_eq(out, expected_result, "Output gave expected value");
+        }
+    }
+             
+    var shell_start = '<feed xmlns="http://www.w3.org/2005/Atom" \n              xmlns:georss="http://www.georss.org/georss">\n              <title>scribble</title>\n              <id>http://featureserver.org/featureserver.cgi/scribble?format=atom</id>\n              <author><name>FeatureServer</name></author>\n';             
+    var shell_end = '</feed>'; 
+    var input = ['<entry><id>http://featureserver.org/featureserver.cgi/scribble/562.atom</id><link href="http://featureserver.org/featureserver.cgi/scribble/562.atom"/><title>Feature 2</title><content type="html"><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</content><georss:polygon>-5.9765625 -131.484375 -58.0078125 -112.5 -50.2734375 -32.34375 52.3828125 -114.609375 -35.5078125 -167.34375 -57.304 [...]
+    '<entry><id>http://featureserver.org/featureserver.cgi/scribble/796.atom</id><link href="http://featureserver.org/featureserver.cgi/scribble/796.atom"/><title>Feature 2</title><content type="html"><b>strokeColor</b>: 00ccff<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</content><georss:point>75.5859375 15.46875</georss:point></entry>',
+    '<entry><id>http://featureserver.org/featureserver.cgi/scribble/794.atom</id><link href="http://featureserver.org/featureserver.cgi/scribble/794.atom"/><title>Feature 5</title><content type="html"><b>strokeColor</b>: red<br /><b>title</b>: Feature 5<br /><b>author</b>: Your Name Here</content><georss:line>28.828125 32.6953125 49.921875 34.8046875 39.375 58.0078125 39.375 58.0078125 40.078125 58.0078125 41.484375 58.0078125 43.59375 58.0 [...]
+    ];
+    var output= ['<rss xmlns="http://backend.userland.com/rss2"><item><title>Feature 2</title><description><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</description><link>http://featureserver.org/featureserver.cgi/scribble/562.atom</link><georss:polygon xmlns:georss="http://www.georss.org/georss">-5.9765625 -131.484375 -58.0078125 -112.5 -50.2734375 -32.34375 52.3828125 -114.609375 -35.5078125 -167 [...]
+       '<rss xmlns="http://backend.userland.com/rss2"><item><title>Feature 2</title><description><b>strokeColor</b>: 00ccff<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</description><link>http://featureserver.org/featureserver.cgi/scribble/796.atom</link><georss:point xmlns:georss="http://www.georss.org/georss">75.5859375 15.46875</georss:point></item></rss>',
+       '<rss xmlns="http://backend.userland.com/rss2"><item><title>Feature 5</title><description><b>strokeColor</b>: red<br /><b>title</b>: Feature 5<br /><b>author</b>: Your Name Here</description><link>http://featureserver.org/featureserver.cgi/scribble/794.atom</link><georss:line xmlns:georss="http://www.georss.org/georss">28.828125 32.6953125 49.921875 34.8046875 39.375 58.0078125 39.375 58.0078125 40.078125 58.0078125 41.484375 58.0078 [...]
+   ];
+   
+    var shell_start_gml = '<feed xmlns="http://www.w3.org/2005/Atom" xmlns:gml="http://www.opengis.net/gml" xmlns:georss="http://www.georss.org/georss"> <title>scribble</title><id>http://featureserver.org/featureserver.cgi/scribble?format=atom</id><author><name>FeatureServer</name></author>';
+       var shell_end_gml = '</feed>';
+       var input_gml = ['<entry><id>http://featureserver.org/featureserver.cgi/scribble/111.atom</id><link href="http://featureserver.org/featureserver.cgi/scribble/111.atom"/><title>Feature 2</title><content type="html"><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</content><georss:where><gml:Point><gml:pos>0 10</gml:pos></gml:Point></georss:where></entry>',
+           '<entry><id>http://featureserver.org/featureserver.cgi/scribble/111.atom</id><link href="http://featureserver.org/featureserver.cgi/scribble/111.atom"/><title>Feature 2</title><content type="html"><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</content><georss:where><gml:Polygon><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>110,-50 110,-10 155,-10 155,-50 110,-50</gml:coordinates>< [...]
+           '<entry><id>http://featureserver.org/featureserver.cgi/scribble/111.atom</id><link href="http://featureserver.org/featureserver.cgi/scribble/111.atom"/><title>Feature 2</title><content type="html"><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</content><georss:where><gml:LineString><gml:coordinates>0,10 10,20</gml:coordinates></gml:LineString></georss:where></entry>',
+           '<entry><id>http://featureserver.org/featureserver.cgi/scribble/111.atom</id><link href="http://featureserver.org/featureserver.cgi/scribble/111.atom"/><title>Feature 2</title><content type="html"><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</content><georss:where><gml:Envelope><gml:lowerCorner>0 1</gml:lowerCorner><gml:upperCorner>20 21</gml:upperCorner></gml:Envelope></georss:where></entry>'
+       ];
+       var output_gml = ['<rss xmlns="http://backend.userland.com/rss2"><item><title>Feature 2</title><description><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</description><link>http://featureserver.org/featureserver.cgi/scribble/111.atom</link><georss:point xmlns:georss="http://www.georss.org/georss">0 10</georss:point></item></rss>',
+           '<rss xmlns="http://backend.userland.com/rss2"><item><title>Feature 2</title><description><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</description><link>http://featureserver.org/featureserver.cgi/scribble/111.atom</link><georss:polygon xmlns:georss="http://www.georss.org/georss">110 -50 110 -10 155 -10 155 -50 110 -50</georss:polygon></item></rss>',
+           '<rss xmlns="http://backend.userland.com/rss2"><item><title>Feature 2</title><description><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</description><link>http://featureserver.org/featureserver.cgi/scribble/111.atom</link><georss:line xmlns:georss="http://www.georss.org/georss">0 10 10 20</georss:line></item></rss>',
+           '<rss xmlns="http://backend.userland.com/rss2"><item><title>Feature 2</title><description><b>strokeColor</b>: red<br /><b>title</b>: Feature 2<br /><b>author</b>: Your Name Here</description><link>http://featureserver.org/featureserver.cgi/scribble/111.atom</link><georss:polygon xmlns:georss="http://www.georss.org/georss">0 1 0 21 20 21 20 1 0 1</georss:polygon></item></rss>'
+       ];
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/JSON.html b/tests/Format/JSON.html
new file mode 100644
index 0000000..0bdbb6f
--- /dev/null
+++ b/tests/Format/JSON.html
@@ -0,0 +1,53 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_Format_JSON_constructor(t) { 
+        t.plan(4); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.JSON(options); 
+        t.ok(format instanceof OpenLayers.Format.JSON, 
+             "new OpenLayers.Format.JSON returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+
+    function test_Format_JSON_parser(t) { 
+        t.plan(2); 
+         
+        var format = new OpenLayers.Format.JSON(); 
+        var data = format.read('{"a":["b"], "c":1}');
+        var obj = {"a":["b"], "c":1};
+        t.eq(obj['a'], data['a'], "element with array parsed correctly.");  
+        t.eq(obj['c'], data['c'], "element with number parsed correctly.");  
+    }
+
+    function test_Format_JSON_writer(t) { 
+        t.plan(1); 
+         
+        var format = new OpenLayers.Format.JSON(); 
+        var data = format.write({"a":["b"], "c":1});
+        var obj = '{"a":["b"],"c":1}';
+        t.eq(data, obj, "writing data to json works.");
+    }
+
+
+    function test_keepData(t) { 
+        t.plan(2);
+
+        var options = {'keepData': true};
+        var format = new OpenLayers.Format.JSON(options); 
+        format.read('{"a":["b"], "c":1}');
+
+        t.ok(format.data != null, 'data property is not null after read with keepData=true');
+        t.eq(format.data.c,1,'keepData keeps the right data');
+    }
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/KML.html b/tests/Format/KML.html
new file mode 100644
index 0000000..018aaed
--- /dev/null
+++ b/tests/Format/KML.html
@@ -0,0 +1,1215 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    var test_content = '<kml xmlns="http://earth.google.com/kml/2.0"><Folder><name>OpenLayers export</name><description>Vector geometries from OpenLayers</description><Placemark id="KML.Polygon"><name>OpenLayers.Feature.Vector_344</name><description>A KLM Polygon</description><Polygon><outerBoundaryIs><LinearRing><coordinates>5.001370157823406,49.26855713824488 8.214706453896161,49.630662409673505 8.397385910100951,48.45172350357396 5.001370157823406,49.26855713824488</coordinates></Line [...]
+    var test_style = '<kml xmlns="http://earth.google.com/kml/2.0"> <Placemark>    <Style> <LineStyle> <color>870000ff</color> <width>10</width> </LineStyle> </Style>  <LineString> <coordinates> -112,36 -113,37 </coordinates> </LineString> </Placemark></kml>';
+    var test_style_fill = '<kml xmlns="http://earth.google.com/kml/2.0"> <Placemark>    <Style> <PolyStyle> <fill>1</fill> <color>870000ff</color> <width>10</width> </PolyStyle> </Style>  <LineString> <coordinates> -112,36 -113,37 </coordinates> </LineString> </Placemark><Placemark>    <Style> <PolyStyle> <fill>0</fill> <color>870000ff</color> <width>10</width> </PolyStyle> </Style>  <LineString> <coordinates> -112,36 -113,37 </coordinates> </LineString> </Placemark></kml>';
+    var test_style_outline = '<kml xmlns="http://earth.google.com/kml/2.0"> <Placemark>    <Style> <PolyStyle> <outline>0</outline> <color>870000ff</color> <width>10</width> </PolyStyle> </Style>  <LineString> <coordinates> -112,36 -113,37 </coordinates> </LineString> </Placemark></kml>';
+    var test_style_font = '<kml xmlns="http://earth.google.com/kml/2.0"> <Placemark><Style><LabelStyle><color>870000ff</color><scale>1.5</scale></LabelStyle></Style><LineString><coordinates> -112,36 -113,37 </coordinates></LineString></Placemark></kml>';
+    var test_nl = '<kml xmlns="http://earth.google.com/kml/2.2"> <Document> <NetworkLink> <Link> <href>http://maker.geocommons.com/maps/1717/overlays/0</href> </Link> </NetworkLink> </Document></kml>';
+
+    function test_Format_KML_constructor(t) { 
+        t.plan(5); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.KML(options); 
+        t.ok(format instanceof OpenLayers.Format.KML, 
+             "new OpenLayers.Format.KML returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function");
+        t.eq(format.externalProjection.getCode(), "EPSG:4326", 
+             "default external projection is EPSG:4326"); 
+    }
+
+    function test_Format_KML_read(t) {
+        t.plan(5);
+        var features = (new OpenLayers.Format.KML()).read(this.test_content);
+        t.eq(features.length, 4, "Number of features read is correct");
+        t.ok(features[0].geometry.toString() == "POLYGON((5.001370157823406 49.26855713824488,8.214706453896161 49.630662409673505,8.397385910100951 48.45172350357396,5.001370157823406 49.26855713824488))", "polygon feature geometry correctly created");
+        t.ok(features[1].geometry.toString() == "LINESTRING(5.838523393080493 49.74814616928052,5.787079558782349 48.410795432216574,8.91427702008381 49.28932499608202)", "linestring feature geometry correctly created");
+        t.ok(features[2].geometry.toString() == "POINT(6.985073041685488 49.8682250149058)", "point feature geometry correctly created");
+        t.ok(features[3].geometry.CLASS_NAME == "OpenLayers.Geometry.Collection",
+             "read geometry collection");
+    }
+
+    function test_Format_KML_readCdataAttributes_20(t) {
+        t.plan(2);
+        var cdata = '<kml xmlns="http://earth.google.com/kml/2.0"><Document><Placemark><name><![CDATA[Pezinok]]> </name><description><![CDATA[Full of text.]]></description><styleUrl>#rel1.0</styleUrl><Point> <coordinates>17.266666, 48.283333</coordinates></Point></Placemark></Document></kml>';
+        var features = (new OpenLayers.Format.KML()).read(cdata);
+        t.eq(features[0].attributes.description, "Full of text.", "Description attribute in cdata read correctly");
+        t.eq(features[0].attributes.name, "Pezinok", "title attribute in cdata read correctly");
+        
+    }
+    
+    function test_Format_KML_networklink(t) {
+        t.plan(1);
+        var f = new OpenLayers.Format.KML({'maxDepth':1});
+        f.fetchLink = function(url) {
+            t.eq(url, "http://maker.geocommons.com/maps/1717/overlays/0", "network link fetched a link correctly.");
+            return '';
+        }
+        f.read(test_nl);
+    }
+    function test_Format_KML_readCdataAttributes_21(t) {
+        t.plan(2);
+        var cdata = '<kml xmlns="http://earth.google.com/kml/2.1"><Document><Placemark><name><![CDATA[Pezinok]]></name><description><![CDATA[Full of text.]]></description><styleUrl>#rel1.0</styleUrl><Point> <coordinates>17.266666, 48.283333</coordinates></Point></Placemark></Document></kml>';
+        var features = (new OpenLayers.Format.KML()).read(cdata);
+        t.eq(features[0].attributes.description, "Full of text.", "Description attribute in cdata read correctly");
+        t.eq(features[0].attributes.name, "Pezinok", "title attribute in cdata read correctly");
+        
+    }
+    
+    function test_Format_KML_write(t) {
+        // make sure id, name, and description are preserved
+        t.plan(1);
+        var kmlExpected = this.test_content;
+        var options = {
+            foldersName: "OpenLayers export",
+            foldersDesc: "Vector geometries from OpenLayers"
+        };
+
+        var format = new OpenLayers.Format.KML(options);
+        var features = format.read(kmlExpected);
+        var kmlOut = format.write(features);
+        var kmlOut = kmlOut.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(kmlOut, kmlExpected, "correctly writes an KML doc string");
+    }
+
+    function test_Format_KML_write_noNameDesc(t) {
+        t.plan(1);
+        var format = new OpenLayers.Format.KML({
+            foldersName: null,
+            foldersDesc: null
+        });
+        var geom = new OpenLayers.Geometry.Point(0, 0)
+        var feature = new OpenLayers.Feature.Vector(geom);
+        feature.id = 42;
+        var kmlOut = format.write(feature);
+        var expected = '<kml xmlns="http://earth.google.com/kml/2.0"><Folder><Placemark><name>42</name><description>No description available</description><Point><coordinates>0,0</coordinates></Point></Placemark></Folder></kml>'
+        t.eq(kmlOut, expected, "null foldersName or foldersDesc don't create elements");
+    }
+    
+    function test_Format_KML_write_multis(t) {
+        /**
+         * KML doesn't have a representation for multi geometries of a
+         * specific type.  KML MultiGeometry maps to OL Geometry.Collection.
+         * Because of this, multi-geometries in OL can't make a round trip
+         * through KML (an OL MultiPoint maps to a KML MultiGeometry
+         * containing points, which maps back to an OL Collection containing
+         * points).  So we need to acceptance tests for the writing of
+         * multi-geometries specifically instead of relying on the round-trip
+         * write test above.
+         */
+        t.plan(3);
+        var format = new OpenLayers.Format.KML({foldersDesc: "test output"});
+        var multi, feature, output, expected;
+        
+        // test multipoint
+        var multi = new OpenLayers.Geometry.MultiPoint([
+            new OpenLayers.Geometry.Point(0, 1)
+        ]);
+        feature = new OpenLayers.Feature.Vector(multi, {name: "test name"});
+        output = format.write(feature);
+        expected = '<kml xmlns="http://earth.google.com/kml/2.0"><Folder><name>OpenLayers export</name><description>test output</description><Placemark><name>test name</name><description>No description available</description><MultiGeometry><Point><coordinates>0,1</coordinates></Point></MultiGeometry></Placemark></Folder></kml>';
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, expected, "multipoint correctly written");
+        
+        // test multilinestring
+        var multi = new OpenLayers.Geometry.MultiLineString([
+            new OpenLayers.Geometry.LineString([
+                new OpenLayers.Geometry.Point(1, 0),
+                new OpenLayers.Geometry.Point(0, 1)
+            ])
+        ]);
+        feature = new OpenLayers.Feature.Vector(multi, {name: "test name"});
+        output = format.write(feature);
+        expected = '<kml xmlns="http://earth.google.com/kml/2.0"><Folder><name>OpenLayers export</name><description>test output</description><Placemark><name>test name</name><description>No description available</description><MultiGeometry><LineString><coordinates>1,0 0,1</coordinates></LineString></MultiGeometry></Placemark></Folder></kml>';
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, expected, "multilinestring correctly written");
+
+        // test multipolygon
+        var multi = new OpenLayers.Geometry.MultiPolygon([
+            new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(0, 0),
+                    new OpenLayers.Geometry.Point(1, 0),
+                    new OpenLayers.Geometry.Point(0, 1)
+                ])
+            ])
+        ]);
+        feature = new OpenLayers.Feature.Vector(multi, {name: "test name"});
+        output = format.write(feature);
+        expected = '<kml xmlns="http://earth.google.com/kml/2.0"><Folder><name>OpenLayers export</name><description>test output</description><Placemark><name>test name</name><description>No description available</description><MultiGeometry><Polygon><outerBoundaryIs><LinearRing><coordinates>0,0 1,0 0,1 0,0</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry></Placemark></Folder></kml>';
+        var output = output.replace(/<\?[^>]*\?>/, ''); // Remove XML Prolog
+        t.eq(output, expected, "multilinestring correctly written");
+
+    }
+    function test_Format_KML_extractStyle(t) {
+        t.plan(1);
+        var f = new OpenLayers.Format.KML();
+        var features = f.read(test_style);    
+        t.ok(features[0].style == undefined, "KML Feature has no style with extractStyle false");        
+    } 
+    function test_Format_KML_extractStyleFill(t) {
+        t.plan(2);
+        var f = new OpenLayers.Format.KML({extractStyles: true});
+        var features = f.read(test_style_fill);    
+        t.eq(features[0].style.fillColor, "#ff0000", "default fill is set");  
+        t.eq(features[1].style.fillColor, "none", "KML Feature has none fill");        
+    } 
+    function test_Format_KML_extractStyleOutline(t) {
+        t.plan(2);
+        var f = new OpenLayers.Format.KML({extractStyles: true});
+        var features = f.read(test_style);
+        t.eq(features[0].style.strokeWidth, "10", "default stroke is set");
+        var features = f.read(test_style_outline);
+        t.eq(features[0].style.strokeWidth, "0", "KML Feature has no outline");
+    } 
+    function test_Format_KML_extractStyleFont(t) {
+        t.plan(2);
+        var f = new OpenLayers.Format.KML({extractStyles: true});
+        var features = f.read(test_style_font);
+        t.eq(features[0].style.fontColor, "#ff0000", "font color is set");
+        t.eq(features[0].style.fontOpacity, parseInt('87', 16) / 255, "font opacity is set");
+    } 
+    function test_Format_KML_getStyle(t) {
+        t.plan(1);
+        var style = {t: true};
+        var f = new OpenLayers.Format.KML();
+        f.styles = {test: style};
+        var gotStyle = f.getStyle('test');
+        gotStyle.t = false;
+        t.ok(style.t, "getStyle returns copy of style rather than reference");
+    }
+    function test_Format_KML_extendedData(t) {
+        t.plan(2);
+        var f = new OpenLayers.Format.KML();
+        var features = f.read(OpenLayers.Util.getElement("kml_extendeddata").value);
+        t.eq(features[0].attributes.all_bridges.value, "3030", "read value from extendeddata correctly.");
+        t.eq(features[0].attributes.all_bridges.displayName, "all bridges", "read displayName from extendeddata correctly.");
+    }
+
+    function test_Format_KML_extendedData_SchemaData(t) {
+        t.plan(4);
+        var f = new OpenLayers.Format.KML();
+        var features = f.read(OpenLayers.Util.getElement("kml_extendeddata2").value);
+        t.eq(features[0].attributes.TrailHeadName.value, "Pi in the sky", "read value from extendeddata (schema data) correctly.");
+        t.eq(features[0].attributes.TrailHeadName.displayName, "TrailHeadName", "read displayName from extendeddata correctly");
+        t.eq(features[0].attributes.ElevationGain.value, "10", "read value from extendeddata (schema data) correctly.");
+        t.eq(features[0].attributes.ElevationGain.displayName, "ElevationGain", "read displayName from extendeddata correctly");
+    }
+
+    function test_Format_KML_placemarkName(t) {
+        t.plan(3);
+        
+        var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
+        var f = new OpenLayers.Format.KML();
+
+        t.eq(f.read(f.write(feature))[0].attributes.name, feature.id, "placemark name from feature.id");
+
+        feature.attributes.name = "placemark name from attributes.name";
+        t.eq(f.read(f.write(feature))[0].attributes.name, feature.attributes.name, "placemark name from attributes.name");
+        feature.style = {
+            label: "placemark name from style.label"
+        };
+        t.eq(f.read(f.write(feature))[0].attributes.name, feature.style.label, "placemark name from style.label");
+    }
+    
+    function test_extractTracks(t) {
+        
+        t.plan(12);
+        
+        var xml = new OpenLayers.Format.XML(); 
+        var doc = xml.read(document.getElementById("macnoise.kml").firstChild.nodeValue);
+        
+        var format = new OpenLayers.Format.KML({
+            extractTracks: true,
+            trackAttributes: ["speed"] // additional custom attributes
+        });
+        
+        var features = format.read(doc.documentElement);
+        t.eq(features.length, 170, "got 170 features");
+        
+        var attr = features[4].attributes;
+        
+        // standard track point attributes
+        t.ok(attr.when instanceof Date, "features have when attribute");
+        t.eq(attr.when.getTime(), 1272736815000, "correct time for fifth feature");
+        t.eq(attr.altitude, 1006, "altitude parsed");
+        t.eq(attr.heading, 230, "heading parsed");
+        t.eq(attr.tilt, 0, "tilt parsed");
+        t.eq(attr.roll, 0, "roll parsed");
+        
+        // custom track attributes (all features acquire from the placemark)
+        t.eq(attr.name, "B752", "correct name");
+        t.eq(attr.adflag, "A", "correct adflag");
+        t.eq(attr.flightid, "DAL2973", "correct flightid");
+        
+        // additional per point attributes (determined by trackAttributes property)
+        t.eq(attr.speed, "166", "correct speed");
+        
+        var exp = new OpenLayers.Geometry.Point(-93.0753620391713, 44.9879724110872);
+        exp.z = 1006;
+        t.geom_eq(features[4].geometry, exp, "correct geometry");
+        
+    }
+    
+
+    </script> 
+</head> 
+<body> 
+    <textarea id="kml_extendeddata" style="display:none">
+<kml xmlns="http://earth.google.com/kml/2.2">
+<Document>
+        <Placemark>
+            <styleUrl>#default</styleUrl>
+
+
+
+
+            <ExtendedData>
+                                    <Data name='all_bridges'>
+                        <displayName><![CDATA[all bridges]]></displayName>
+                        <value><![CDATA[3030]]></value>
+                    </Data>
+                                    <Data name='latitude'>
+                        <displayName><![CDATA[latitude]]></displayName>
+                        <value><![CDATA[43]]></value>
+                    </Data>
+                                    <Data name='longitude'>
+                        <displayName><![CDATA[longitude]]></displayName>
+                        <value><![CDATA[-107.55]]></value>
+                    </Data>
+                                    <Data name='functionally_obsolete__percent'>
+                        <displayName><![CDATA[functionally obsolete, percent]]></displayName>
+                        <value><![CDATA[8]]></value>
+                    </Data>
+                                    <Data name='structurally_deficient__percent'>
+                        <displayName><![CDATA[structurally deficient, percent]]></displayName>
+                        <value><![CDATA[13]]></value>
+                    </Data>
+                                    <Data name='state'>
+                        <displayName><![CDATA[state]]></displayName>
+                        <value><![CDATA[Wyoming]]></value>
+                    </Data>
+                            </ExtendedData>
+
+
+              <Point>
+<coordinates>-107.55,43.0</coordinates>
+</Point>
+
+
+        </Placemark>
+</Document>
+</kml>
+</textarea>
+    <textarea id="kml_extendeddata2" style="display:none">
+<kml xmlns="http://earth.google.com/kml/2.2">
+<Document>
+<Placemark>
+  <name>Easy trail</name>
+  <ExtendedData>
+    <SchemaData schemaUrl="#TrailHeadTypeId">
+      <SimpleData name="TrailHeadName">Pi in the sky</SimpleData>
+      <SimpleData name="TrailLength">3.14159</SimpleData>
+      <SimpleData name="ElevationGain">10</SimpleData>
+    </SchemaData>
+    </ExtendedData>
+    <Point>
+      <coordinates>-122.000,37.002</coordinates>
+    </Point>
+</Placemark>
+<Placemark>
+  <name>Difficult trail</name>
+  <ExtendedData>
+    <SchemaData schemaUrl="#TrailHeadTypeId">
+      <SimpleData name="TrailHeadName">Mount Everest</SimpleData>
+      <SimpleData name="TrailLength">347.45</SimpleData>
+      <SimpleData name="ElevationGain">10000</SimpleData>
+    </SchemaData>
+  </ExtendedData>
+  <Point>
+    <coordinates>-122.000,37.002</coordinates>
+  </Point>
+</Placemark>
+</Document>
+</kml>
+</textarea>
+
+<div id="macnoise.kml"><!--
+<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
+<Document>
+<Camera>
+  <gx:TimeStamp>
+    <when>2010-05-01T13:00:00-05:00</when>
+  </gx:TimeStamp>
+  <longitude>-93.2207</longitude>
+  <latitude>44.882</latitude>
+  <altitude>50000</altitude>
+  <heading>0</heading>
+  <tilt>0</tilt>
+</Camera>
+<Style id="arrival">
+  <IconStyle>
+    <Icon>
+      <href>http://maps.macnoise.com/scripts/plane.png</href>
+    </Icon>
+  </IconStyle>
+  <LineStyle>
+    <color>ff0000ff</color>
+    <width>3</width>
+  </LineStyle>
+  <PolyStyle>
+    <color>7fffffff</color>
+  </PolyStyle>
+</Style>
+<Style id="departure">
+  <IconStyle>
+    <Icon>
+      <href>http://maps.macnoise.com/scripts/plane.png</href>
+    </Icon>
+  </IconStyle>
+  <LineStyle>
+    <color>ff00ff00</color>
+    <width>3</width>
+  </LineStyle>
+  <PolyStyle>
+    <color>7fffffff</color>
+  </PolyStyle>
+</Style>
+<Style id="overflight">
+  <IconStyle>
+    <Icon>
+      <href>http://maps.macnoise.com/scripts/plane.png</href>
+    </Icon>
+  </IconStyle>
+  <LineStyle>
+    <color>ff222222</color>
+    <width>3</width>
+  </LineStyle>
+  <PolyStyle>
+    <color>7fffffff</color>
+  </PolyStyle>
+</Style>
+<Style id='rmt'>
+  <LabelStyle>
+    <color>ff0000cc</color>
+    <colorMode>normal</colorMode>
+    <scale>1</scale>
+  </LabelStyle>
+</Style>
+
+<name>Flight Tracks</name>
+<Folder>
+  <name>Arrivals</name>
+<Placemark>
+  <name>B752</name>
+  <adflag>A</adflag>
+  <flightid>DAL2973</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:01-05</when>
+    <when>2010-05-01T13:00:06-05</when>
+    <when>2010-05-01T13:00:10-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:33-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:47-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-93.0658625188843 44.9949645987875 1036</gx:coord>
+    <gx:coord>-93.0664690096445 44.9945424635331 1036</gx:coord>
+    <gx:coord>-93.0694347065378 44.9923936108644 1036</gx:coord>
+    <gx:coord>-93.0722946883822 44.9901649091109 1006</gx:coord>
+    <gx:coord>-93.0753620391713 44.9879724110872 1006</gx:coord>
+    <gx:coord>-93.078638650624 44.985904678007 975</gx:coord>
+    <gx:coord>-93.0817463907976 44.9836868456013 975</gx:coord>
+    <gx:coord>-93.0847749343212 44.9813998515538 945</gx:coord>
+    <gx:coord>-93.0879207383429 44.9791066547511 914</gx:coord>
+    <gx:coord>-93.091282218058 44.976822731273 914</gx:coord>
+    <gx:coord>-93.0945882606646 44.9745372955479 884</gx:coord>
+    <gx:coord>-93.0979053364864 44.9722421846492 884</gx:coord>
+    <gx:coord>-93.1012678619471 44.9698451058525 853</gx:coord>
+    <gx:coord>-93.1044570741037 44.967424293466 853</gx:coord>
+    <gx:coord>-93.1068079756418 44.9657037851018 853</gx:coord>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <speed>162</speed>
+    <speed>160</speed>
+    <speed>159</speed>
+    <speed>165</speed>
+    <speed>166</speed>
+    <speed>174</speed>
+    <speed>170</speed>
+    <speed>172</speed>
+    <speed>180</speed>
+    <speed>176</speed>
+    <speed>177</speed>
+    <speed>177</speed>
+    <speed>180</speed>
+    <speed>184</speed>
+    <speed>177</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>E170</name>
+  <adflag>A</adflag>
+  <flightid>TCF7521</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:04-05</when>
+    <when>2010-05-01T13:00:09-05</when>
+    <when>2010-05-01T13:00:13-05</when>
+    <when>2010-05-01T13:00:18-05</when>
+    <when>2010-05-01T13:00:23-05</when>
+    <when>2010-05-01T13:00:27-05</when>
+    <when>2010-05-01T13:00:32-05</when>
+    <when>2010-05-01T13:00:37-05</when>
+    <when>2010-05-01T13:00:41-05</when>
+    <when>2010-05-01T13:00:46-05</when>
+    <when>2010-05-01T13:00:51-05</when>
+    <when>2010-05-01T13:00:55-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-93.3806146339391 44.8823651507134 2743</gx:coord>
+    <gx:coord>-93.3773041814209 44.887531728655 2743</gx:coord>
+    <gx:coord>-93.3742856469083 44.8942041806778 2743</gx:coord>
+    <gx:coord>-93.3722375106026 44.9009231720158 2743</gx:coord>
+    <gx:coord>-93.3711934089417 44.9077495987718 2712</gx:coord>
+    <gx:coord>-93.3707288919852 44.9145219645156 2712</gx:coord>
+    <gx:coord>-93.3703882714439 44.921240089024 2682</gx:coord>
+    <gx:coord>-93.3700882719793 44.9278850664392 2682</gx:coord>
+    <gx:coord>-93.369810041597 44.934389356737 2651</gx:coord>
+    <gx:coord>-93.3696836566166 44.9408553642446 2651</gx:coord>
+    <gx:coord>-93.3695425129226 44.9473561165969 2621</gx:coord>
+    <gx:coord>-93.3693185423471 44.9537360442564 2621</gx:coord>
+    <gx:coord>-93.3693194298816 44.9599975904123 2590</gx:coord>
+    <gx:coord>-93.3694031671108 44.9661411653607 2590</gx:coord>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>20 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>360 0 0</gx:angles>
+    <speed>376</speed>
+    <speed>367</speed>
+    <speed>361</speed>
+    <speed>371</speed>
+    <speed>367</speed>
+    <speed>363</speed>
+    <speed>359</speed>
+    <speed>356</speed>
+    <speed>352</speed>
+    <speed>347</speed>
+    <speed>343</speed>
+    <speed>347</speed>
+    <speed>334</speed>
+    <speed>337</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>BE33</name>
+  <adflag>A</adflag>
+  <flightid>N38175</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:02-05</when>
+    <when>2010-05-01T13:00:07-05</when>
+    <when>2010-05-01T13:00:12-05</when>
+    <when>2010-05-01T13:00:16-05</when>
+    <when>2010-05-01T13:00:21-05</when>
+    <when>2010-05-01T13:00:25-05</when>
+    <when>2010-05-01T13:00:30-05</when>
+    <when>2010-05-01T13:00:35-05</when>
+    <when>2010-05-01T13:00:39-05</when>
+    <when>2010-05-01T13:00:44-05</when>
+    <when>2010-05-01T13:00:49-05</when>
+    <when>2010-05-01T13:00:53-05</when>
+    <when>2010-05-01T13:00:58-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-93.0144637208028 44.6541474764804 1006</gx:coord>
+    <gx:coord>-93.0162681345228 44.6547274296664 1006</gx:coord>
+    <gx:coord>-93.0196734868835 44.6559915702004 975</gx:coord>
+    <gx:coord>-93.0231899415297 44.657188463998 945</gx:coord>
+    <gx:coord>-93.0267619421777 44.6582849847887 945</gx:coord>
+    <gx:coord>-93.0302021384369 44.6594728216183 914</gx:coord>
+    <gx:coord>-93.0338776768471 44.6606515995762 914</gx:coord>
+    <gx:coord>-93.0375866343814 44.6618806707998 884</gx:coord>
+    <gx:coord>-93.0411146687035 44.6632657982455 884</gx:coord>
+    <gx:coord>-93.0447829038862 44.6646495821585 884</gx:coord>
+    <gx:coord>-93.0486933143218 44.6659856209571 914</gx:coord>
+    <gx:coord>-93.0525604964428 44.6672664774449 884</gx:coord>
+    <gx:coord>-93.0559892061682 44.6686325276705 884</gx:coord>
+    <gx:coord>-93.0595122787868 44.6700360197293 884</gx:coord>
+    <gx:coord>-93.0610274392619 44.6706087373734 884</gx:coord>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>290 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <gx:angles>300 0 0</gx:angles>
+    <speed>150</speed>
+    <speed>156</speed>
+    <speed>152</speed>
+    <speed>156</speed>
+    <speed>151</speed>
+    <speed>152</speed>
+    <speed>160</speed>
+    <speed>157</speed>
+    <speed>159</speed>
+    <speed>158</speed>
+    <speed>158</speed>
+    <speed>160</speed>
+    <speed>155</speed>
+    <speed>155</speed>
+    <speed>156</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>A319</name>
+  <adflag>A</adflag>
+  <flightid>DAL1588</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:04-05</when>
+    <when>2010-05-01T13:00:08-05</when>
+    <when>2010-05-01T13:00:13-05</when>
+    <when>2010-05-01T13:00:18-05</when>
+    <when>2010-05-01T13:00:22-05</when>
+    <when>2010-05-01T13:00:27-05</when>
+    <when>2010-05-01T13:00:31-05</when>
+    <when>2010-05-01T13:00:36-05</when>
+    <when>2010-05-01T13:00:41-05</when>
+    <when>2010-05-01T13:00:45-05</when>
+    <when>2010-05-01T13:00:50-05</when>
+    <when>2010-05-01T13:00:55-05</when>
+    <when>2010-05-01T13:00:59-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-93.6927825194056 44.7952011849485 3011</gx:coord>
+    <gx:coord>-93.6850156681578 44.7968042586582 2987</gx:coord>
+    <gx:coord>-93.6752785488692 44.7990458605003 2956</gx:coord>
+    <gx:coord>-93.6657083011645 44.8014897663497 2926</gx:coord>
+    <gx:coord>-93.6560029615388 44.803768841381 2865</gx:coord>
+    <gx:coord>-93.6462045264035 44.8058749817725 2834</gx:coord>
+    <gx:coord>-93.6365671200126 44.8080848199989 2804</gx:coord>
+    <gx:coord>-93.6269933807039 44.8102767000109 2773</gx:coord>
+    <gx:coord>-93.6175405757462 44.8123960709083 2743</gx:coord>
+    <gx:coord>-93.6082528975965 44.8146455509748 2743</gx:coord>
+    <gx:coord>-93.599077315807 44.816765612372 2743</gx:coord>
+    <gx:coord>-93.5899428762254 44.8186933623744 2743</gx:coord>
+    <gx:coord>-93.5809104439923 44.8205403457841 2743</gx:coord>
+    <gx:coord>-93.5720785209701 44.8224608846058 2743</gx:coord>
+    <gx:coord>-93.5703603013364 44.8228739543212 2743</gx:coord>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <gx:angles>70 0 0</gx:angles>
+    <speed>390</speed>
+    <speed>383</speed>
+    <speed>397</speed>
+    <speed>390</speed>
+    <speed>405</speed>
+    <speed>388</speed>
+    <speed>386</speed>
+    <speed>397</speed>
+    <speed>377</speed>
+    <speed>373</speed>
+    <speed>367</speed>
+    <speed>362</speed>
+    <speed>365</speed>
+    <speed>350</speed>
+    <speed>354</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>E145</name>
+  <adflag>A</adflag>
+  <flightid>CHQ1453</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:01-05</when>
+    <when>2010-05-01T13:00:06-05</when>
+    <when>2010-05-01T13:00:11-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:48-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-92.5727580977974 45.0236058844647 2530</gx:coord>
+    <gx:coord>-92.5742776202954 45.0237913896498 2530</gx:coord>
+    <gx:coord>-92.5803397933112 45.0241784662561 2499</gx:coord>
+    <gx:coord>-92.5865075192046 45.0247891381303 2469</gx:coord>
+    <gx:coord>-92.5926877928765 45.0257073410966 2469</gx:coord>
+    <gx:coord>-92.5986546763805 45.0261844476041 2438</gx:coord>
+    <gx:coord>-92.6046737535477 45.0267206733977 2438</gx:coord>
+    <gx:coord>-92.6106885874739 45.0275061986719 2438</gx:coord>
+    <gx:coord>-92.616359210337 45.027935793162 2438</gx:coord>
+    <gx:coord>-92.6220735719954 45.028379077688 2438</gx:coord>
+    <gx:coord>-92.6280403097635 45.0290552550566 2438</gx:coord>
+    <gx:coord>-92.6341725652711 45.029824064212 2438</gx:coord>
+    <gx:coord>-92.640279209769 45.0304963952702 2438</gx:coord>
+    <gx:coord>-92.6463747377703 45.0311129317319 2438</gx:coord>
+    <gx:coord>-92.650043383232 45.0314890298388 2438</gx:coord>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <speed>235</speed>
+    <speed>246</speed>
+    <speed>239</speed>
+    <speed>244</speed>
+    <speed>234</speed>
+    <speed>232</speed>
+    <speed>238</speed>
+    <speed>227</speed>
+    <speed>228</speed>
+    <speed>229</speed>
+    <speed>229</speed>
+    <speed>232</speed>
+    <speed>228</speed>
+    <speed>232</speed>
+    <speed>236</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>E170</name>
+  <adflag>A</adflag>
+  <flightid>CPZ5695</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:11-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:25-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:48-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-92.3689380245182 45.0389467469425 2804</gx:coord>
+    <gx:coord>-92.3759530819834 45.0380951007958 2773</gx:coord>
+    <gx:coord>-92.3831159633175 45.0369957486846 2712</gx:coord>
+    <gx:coord>-92.3901362714549 45.0355238496347 2651</gx:coord>
+    <gx:coord>-92.3970814910858 45.0339385808083 2621</gx:coord>
+    <gx:coord>-92.4043121546626 45.032585906621 2560</gx:coord>
+    <gx:coord>-92.4118367565321 45.0319048652958 2499</gx:coord>
+    <gx:coord>-92.419078934653 45.030875157485 2469</gx:coord>
+    <gx:coord>-92.4262095560369 45.0291153314744 2438</gx:coord>
+    <gx:coord>-92.4335237384463 45.0273941113051 2438</gx:coord>
+    <gx:coord>-92.4408178608932 45.0260076351757 2438</gx:coord>
+    <gx:coord>-92.4451575746228 45.0254275529773 2438</gx:coord>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>250 0 0</gx:angles>
+    <gx:angles>260 0 0</gx:angles>
+    <speed>277</speed>
+    <speed>288</speed>
+    <speed>283</speed>
+    <speed>291</speed>
+    <speed>283</speed>
+    <speed>284</speed>
+    <speed>298</speed>
+    <speed>288</speed>
+    <speed>288</speed>
+    <speed>278</speed>
+    <speed>283</speed>
+    <speed>288</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>DC95</name>
+  <adflag>A</adflag>
+  <flightid>DAL2858</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:03-05</when>
+    <when>2010-05-01T13:00:07-05</when>
+    <when>2010-05-01T13:00:12-05</when>
+    <when>2010-05-01T13:00:17-05</when>
+    <when>2010-05-01T13:00:21-05</when>
+    <when>2010-05-01T13:00:26-05</when>
+    <when>2010-05-01T13:00:30-05</when>
+    <when>2010-05-01T13:00:35-05</when>
+    <when>2010-05-01T13:00:40-05</when>
+    <when>2010-05-01T13:00:44-05</when>
+    <when>2010-05-01T13:00:49-05</when>
+    <when>2010-05-01T13:00:54-05</when>
+    <when>2010-05-01T13:00:58-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-93.1962465696187 44.4584257162471 3078</gx:coord>
+    <gx:coord>-93.1954858158128 44.462643897726 3078</gx:coord>
+    <gx:coord>-93.1945524569257 44.4696206853623 3048</gx:coord>
+    <gx:coord>-93.1935347734104 44.4765680167011 3048</gx:coord>
+    <gx:coord>-93.1921548885013 44.4834366892852 3048</gx:coord>
+    <gx:coord>-93.1912787899895 44.4902740201102 3048</gx:coord>
+    <gx:coord>-93.190869393024 44.496999598511 3048</gx:coord>
+    <gx:coord>-93.190355669541 44.503701889363 3048</gx:coord>
+    <gx:coord>-93.1899042890233 44.510392533924 3048</gx:coord>
+    <gx:coord>-93.1894352972433 44.5171043633827 3048</gx:coord>
+    <gx:coord>-93.1887272976791 44.523838031578 3017</gx:coord>
+    <gx:coord>-93.1882343860587 44.5305421014878 2987</gx:coord>
+    <gx:coord>-93.1878483537445 44.5373007218153 2987</gx:coord>
+    <gx:coord>-93.187206305476 44.5440099500882 2956</gx:coord>
+    <gx:coord>-93.1870547021374 44.5466877366242 2956</gx:coord>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>10 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <gx:angles>0 0 0</gx:angles>
+    <speed>378</speed>
+    <speed>370</speed>
+    <speed>381</speed>
+    <speed>373</speed>
+    <speed>384</speed>
+    <speed>367</speed>
+    <speed>365</speed>
+    <speed>377</speed>
+    <speed>362</speed>
+    <speed>362</speed>
+    <speed>362</speed>
+    <speed>362</speed>
+    <speed>368</speed>
+    <speed>355</speed>
+    <speed>362</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>B737</name>
+  <adflag>A</adflag>
+  <flightid>SWA1488</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:01-05</when>
+    <when>2010-05-01T13:00:06-05</when>
+    <when>2010-05-01T13:00:11-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:48-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-92.7436038977339 45.0176449723009 2438</gx:coord>
+    <gx:coord>-92.745419752639 45.0178405701636 2438</gx:coord>
+    <gx:coord>-92.7525586927583 45.0181852080204 2438</gx:coord>
+    <gx:coord>-92.7599978682742 45.0189437491361 2438</gx:coord>
+    <gx:coord>-92.7673964649616 45.0200176804669 2438</gx:coord>
+    <gx:coord>-92.7743047878147 45.0206512321095 2438</gx:coord>
+    <gx:coord>-92.7812211106102 45.0212438545962 2438</gx:coord>
+    <gx:coord>-92.7880905786106 45.0219352711124 2438</gx:coord>
+    <gx:coord>-92.7948110303679 45.0225135550872 2438</gx:coord>
+    <gx:coord>-92.8016256231407 45.0231539091809 2377</gx:coord>
+    <gx:coord>-92.808436321378 45.0237782407713 2316</gx:coord>
+    <gx:coord>-92.8153060032773 45.0245123996427 2255</gx:coord>
+    <gx:coord>-92.8220950756464 45.0250388052127 2194</gx:coord>
+    <gx:coord>-92.8289929014999 45.0256725515916 2164</gx:coord>
+    <gx:coord>-92.8342709686589 45.0263726025032 2118.25</gx:coord>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <gx:angles>280 0 0</gx:angles>
+    <speed>280</speed>
+    <speed>293</speed>
+    <speed>284</speed>
+    <speed>288</speed>
+    <speed>274</speed>
+    <speed>272</speed>
+    <speed>279</speed>
+    <speed>263</speed>
+    <speed>263</speed>
+    <speed>262</speed>
+    <speed>262</speed>
+    <speed>275</speed>
+    <speed>270</speed>
+    <speed>277</speed>
+    <speed>287</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>A318</name>
+  <adflag>A</adflag>
+  <flightid>FFT106</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:05-05</when>
+    <when>2010-05-01T13:00:09-05</when>
+    <when>2010-05-01T13:00:14-05</when>
+    <when>2010-05-01T13:00:19-05</when>
+    <when>2010-05-01T13:00:23-05</when>
+    <when>2010-05-01T13:00:28-05</when>
+    <when>2010-05-01T13:00:33-05</when>
+    <when>2010-05-01T13:00:37-05</when>
+    <when>2010-05-01T13:00:42-05</when>
+    <when>2010-05-01T13:00:47-05</when>
+    <when>2010-05-01T13:00:51-05</when>
+    <when>2010-05-01T13:00:56-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-93.2974568508014 45.0687622602847 1432</gx:coord>
+    <gx:coord>-93.2934457905393 45.0660257042941 1371</gx:coord>
+    <gx:coord>-93.2902010482642 45.0627382200457 1341</gx:coord>
+    <gx:coord>-93.2880735868205 45.0592062737728 1280</gx:coord>
+    <gx:coord>-93.2866251180089 45.0556538417996 1280</gx:coord>
+    <gx:coord>-93.2855706436895 45.0521555770546 1249</gx:coord>
+    <gx:coord>-93.2848929213344 45.0486326683558 1249</gx:coord>
+    <gx:coord>-93.284149302237 45.0450445279501 1219</gx:coord>
+    <gx:coord>-93.2832681542582 45.0414770478452 1219</gx:coord>
+    <gx:coord>-93.2822163760078 45.0378266141909 1219</gx:coord>
+    <gx:coord>-93.2810695206555 45.0339762188888 1249</gx:coord>
+    <gx:coord>-93.2800852709943 45.0300242656845 1249</gx:coord>
+    <gx:coord>-93.2789451826991 45.026165428423 1249</gx:coord>
+    <gx:coord>-93.2776553627852 45.0222881273358 1219</gx:coord>
+    <gx:angles>140 0 0</gx:angles>
+    <gx:angles>150 0 0</gx:angles>
+    <gx:angles>150 0 0</gx:angles>
+    <gx:angles>160 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <gx:angles>170 0 0</gx:angles>
+    <speed>212</speed>
+    <speed>205</speed>
+    <speed>208</speed>
+    <speed>203</speed>
+    <speed>201</speed>
+    <speed>196</speed>
+    <speed>196</speed>
+    <speed>197</speed>
+    <speed>202</speed>
+    <speed>205</speed>
+    <speed>216</speed>
+    <speed>215</speed>
+    <speed>222</speed>
+    <speed>231</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name></name>
+  <adflag>A</adflag>
+  <flightid></flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:05-05</when>
+    <when>2010-05-01T13:00:10-05</when>
+    <when>2010-05-01T13:00:14-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:33-05</when>
+    <when>2010-05-01T13:00:37-05</when>
+    <when>2010-05-01T13:00:42-05</when>
+    <when>2010-05-01T13:00:47-05</when>
+    <when>2010-05-01T13:00:51-05</when>
+    <when>2010-05-01T13:00:56-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-93.5287325331323 45.3502794027397 731</gx:coord>
+    <gx:coord>-93.5305174337715 45.3463816209029 731</gx:coord>
+    <gx:coord>-93.532323089283 45.3433065196778 731</gx:coord>
+    <gx:coord>-93.5344374505075 45.3397938806867 731</gx:coord>
+    <gx:coord>-93.5365879669744 45.3355152994798 731</gx:coord>
+    <gx:coord>-93.538455345577 45.3317693717468 731</gx:coord>
+    <gx:coord>-93.5402440337749 45.3288175816964 731</gx:coord>
+    <gx:coord>-93.5420054353005 45.3261482119682 701</gx:coord>
+    <gx:coord>-93.5437972875724 45.3236486426325 701</gx:coord>
+    <gx:coord>-93.5449025453586 45.3213557809437 670</gx:coord>
+    <gx:coord>-93.5460939368394 45.3190373998605 670</gx:coord>
+    <gx:coord>-93.5479457332637 45.3165177805485 670</gx:coord>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <gx:angles>200 0 0</gx:angles>
+    <speed>202</speed>
+    <speed>180</speed>
+    <speed>166</speed>
+    <speed>171</speed>
+    <speed>162</speed>
+    <speed>157</speed>
+    <speed>143</speed>
+    <speed>145</speed>
+    <speed>156</speed>
+    <speed>147</speed>
+    <speed>147</speed>
+    <speed>150</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>CRJ2</name>
+  <adflag>A</adflag>
+  <flightid>SKW4805</flightid>
+  <styleUrl>#arrival</styleUrl>
+</Placemark>
+<Placemark>
+  <name>CRJ2</name>
+  <adflag>A</adflag>
+  <flightid>FLG4092</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:01-05</when>
+    <when>2010-05-01T13:00:06-05</when>
+    <when>2010-05-01T13:00:10-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:44-05</when>
+    <when>2010-05-01T13:00:49-05</when>
+    <when>2010-05-01T13:00:54-05</when>
+    <gx:coord>-93.1836067392297 44.9110362339843 432.2</gx:coord>
+    <gx:coord>-93.1841170614853 44.910663862492 426</gx:coord>
+    <gx:coord>-93.1867007876887 44.908842129317 426</gx:coord>
+    <gx:coord>-93.1893728799637 44.9069842219291 396</gx:coord>
+    <gx:coord>-93.1919479660705 44.9051548529609 365</gx:coord>
+    <gx:coord>-93.1944798212107 44.9032897679148 365</gx:coord>
+    <gx:coord>-93.197164452306 44.9014210542153 335</gx:coord>
+    <gx:coord>-93.1996234874761 44.8995719817206 335</gx:coord>
+    <gx:coord>-93.2021701211426 44.8975674983317 304</gx:coord>
+    <gx:coord>-93.2050345971567 44.8955942303701 304</gx:coord>
+    <gx:coord>-93.2075455037487 44.8938556558558 304</gx:coord>
+    <gx:coord>-93.2100820128846 44.8918590963212 304</gx:coord>
+    <gx:coord>-93.2127524858241 44.89000250047 256</gx:coord>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>230 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <gx:angles>220 0 0</gx:angles>
+    <speed>141</speed>
+    <speed>138</speed>
+    <speed>136</speed>
+    <speed>141</speed>
+    <speed>141</speed>
+    <speed>142</speed>
+    <speed>143</speed>
+    <speed>139</speed>
+    <speed>140</speed>
+    <speed>134</speed>
+    <speed>136</speed>
+    <speed>136</speed>
+    <speed>123</speed>
+</gx:Track></Placemark>
+<Placemark>
+  <name>E170</name>
+  <adflag>A</adflag>
+  <flightid>CPZ5667</flightid>
+  <styleUrl>#arrival</styleUrl>
+<gx:Track>
+    <altitudeMode>absolute</altitudeMode>
+    <extrude>1</extrude>
+    <when>2010-05-01T13:00:00-05</when>
+    <when>2010-05-01T13:00:01-05</when>
+    <when>2010-05-01T13:00:06-05</when>
+    <when>2010-05-01T13:00:10-05</when>
+    <when>2010-05-01T13:00:15-05</when>
+    <when>2010-05-01T13:00:20-05</when>
+    <when>2010-05-01T13:00:24-05</when>
+    <when>2010-05-01T13:00:29-05</when>
+    <when>2010-05-01T13:00:34-05</when>
+    <when>2010-05-01T13:00:38-05</when>
+    <when>2010-05-01T13:00:43-05</when>
+    <when>2010-05-01T13:00:47-05</when>
+    <when>2010-05-01T13:00:52-05</when>
+    <when>2010-05-01T13:00:57-05</when>
+    <when>2010-05-01T13:01:00-05</when>
+    <gx:coord>-92.9496238812799 45.0117549407746 1438.2</gx:coord>
+    <gx:coord>-92.9507065768732 45.0116702587604 1432</gx:coord>
+    <gx:coord>-92.9563739191926 45.0116271226204 1432</gx:coord>
+    <gx:coord>-92.9620225732021 45.0115639668496 1432</gx:coord>
+    <gx:coord>-92.9673675587699 45.0113432900049 1402</gx:coord>
+    <gx:coord>-92.9725115032188 45.0111442254373 1402</gx:coord>
+    <gx:coord>-92.9778810091229 45.0112050922639 1371</gx:coord>
+    <gx:coord>-92.9832227114571 45.0112143826731 1371</gx:coord>
+    <gx:coord>-92.9884546803523 45.0110418166788 1341</gx:coord>
+    <gx:coord>-92.9938268606229 45.0109652220709 1341</gx:coord>
+    <gx:coord>-92.9991151069756 45.010802144845 1310</gx:coord>
+    <gx:coord>-93.0041467584036 45.0105516668541 1310</gx:coord>
+    <gx:coord>-93.0090742909164 45.0105233046799 1280</gx:coord>
+    <gx:coord>-93.0139435770527 45.0106265340001 1280</gx:coord>
+    <gx:coord>-93.0174882575928 45.0106328449121 1256.75</gx:coord>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <gx:angles>270 0 0</gx:angles>
+    <speed>214</speed>
+    <speed>207</speed>
+    <speed>202</speed>
+    <speed>208</speed>
+    <speed>207</speed>
+    <speed>205</speed>
+    <speed>203</speed>
+    <speed>202</speed>
+    <speed>209</speed>
+    <speed>199</speed>
+    <speed>196</speed>
+    <speed>200</speed>
+    <speed>193</speed>
+    <speed>194</speed>
+    <speed>185</speed>
+</gx:Track></Placemark>
+</Folder>
+<Folder>
+  <name>Departures</name>
+</Folder>
+<Folder>
+  <name>Overflights</name>
+</Folder>
+</Document>
+</kml>
+--></div>
+
+</body> 
+</html> 
diff --git a/tests/Format/OSM.html b/tests/Format/OSM.html
new file mode 100644
index 0000000..1c3c9f9
--- /dev/null
+++ b/tests/Format/OSM.html
@@ -0,0 +1,103 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script src="../data/osm.js"></script> 
+    <script type="text/javascript">
+    
+    function test_Format_OSM_constructor(t) { 
+        t.plan(5); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.OSM(options); 
+        t.ok(format instanceof OpenLayers.Format.OSM, 
+             "new OpenLayers.Format.OSM returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+        t.eq(format.externalProjection.getCode(), "EPSG:4326", 
+             "default external projection is EPSG:4326"); 
+    } 
+    function test_Format_OSM_node(t) {
+        t.plan(4);
+        var f = new OpenLayers.Format.OSM();
+        var features = f.read(osm_test_data['node']);
+        var feat = features[0];
+        t.eq(feat.attributes, {}, "attributes is empty");
+        t.eq(feat.osm_id, 200545, "internal osm_id property set correctly");
+        t.eq(feat.geometry.x, -1.8166417, "lon is correct"); 
+        t.eq(feat.geometry.y, 52.5503033, "lat is correct"); 
+    }
+    function test_Format_OSM_node_with_tags(t) {
+        t.plan(5);
+        var f = new OpenLayers.Format.OSM();
+        var features = f.read(osm_test_data['node_with_tags']);
+        var feat = features[0];
+        t.eq(feat.attributes, {'a':'b'}, "attributes match");
+        t.eq(feat.osm_id, 200545, "internal osm_id property set correctly");
+        t.eq(feat.fid, "node.200545", "OSM-based FID set correctly.");
+        t.eq(feat.geometry.x, -1.8166417, "lon is correct"); 
+        t.eq(feat.geometry.y, 52.5503033, "lat is correct"); 
+    }
+    function test_Format_OSM_way(t) {
+        t.plan(8);
+        var f = new OpenLayers.Format.OSM();
+        var features = f.read(osm_test_data['way']);
+        t.eq(features.length, 1, "One feature");
+        var feat = features[0];
+        t.eq(feat.osm_id, 4685537, "OSM ID set correctly.");
+        t.eq(feat.fid, "way.4685537", "OSM-based FID set correctly.");
+        t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "returned as polygon");
+        t.eq(feat.geometry.components[0].components.length, 11, "Correct number of components"); 
+        t.eq(feat.geometry.components[0].components[0].osm_id, 29783472, "OSM ID set on components");
+        t.eq(feat.geometry.toString(), "POLYGON((-1.8164007 52.5501836,-1.8170311 52.5506035,-1.8164092 52.5509559,-1.8169385 52.5513103,-1.8159626 52.5517893,-1.8145067 52.5518461,-1.8143197 52.5511883,-1.8141177 52.5506446,-1.8151451 52.5501275,-1.8157703 52.5505521,-1.8164007 52.5501836))", "WKT of feature is correct");
+        t.eq(feat.attributes.landuse, "school", "landuse attribute correct");
+    }
+    
+    function test_Format_OSM_node_way(t) {
+        t.plan(5)
+        var f = new OpenLayers.Format.OSM();
+        var features = f.read(osm_test_data['node_way']);
+        t.eq(features.length, 1, "One feature");
+        var feat = features[0];
+        t.eq(feat.osm_id, 21329267, "OSM ID set correctly");
+        t.eq(feat.attributes.highway, "unclassified", "highway attribute is correct."); 
+        t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.LineString", "returned as linestring");
+        t.eq(feat.geometry.components.length, 12, "correct number of segments");
+    }
+    
+    function test_Format_OSM_node_way_checkTags(t) {
+        t.plan(9)
+        var f = new OpenLayers.Format.OSM({'checkTags': true});
+        var features = f.read(osm_test_data['node_way']);
+        t.eq(features.length, 3, "multiple features");
+        
+        var feat = features[1];
+        t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.Point", "point class");
+        t.ok(feat.attributes != {}, "feature has attributes");
+        
+        var feat = features[2];
+        t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.Point", "point class");
+        t.ok(feat.attributes != {}, "feature has attributes");
+        
+        feat = features[0];
+        t.eq(feat.osm_id, 21329267, "OSM ID set correctly");
+        t.eq(feat.attributes.highway, "unclassified", "highway attribute is correct."); 
+        t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.LineString", "returned as linestring");
+        t.eq(feat.geometry.components.length, 12, "correct number of segments");
+    }
+
+    function test_Format_OSM_serialize(t) {
+        t.plan(4);
+        var f = new OpenLayers.Format.OSM({'checkTags': true});
+        for (var key in osm_serialized_data) {
+            var input = f.read(osm_test_data[key]);
+            var output = f.write(input);
+            output = output.replace(/<\?[^>]*\?>/, '');
+            t.eq(output, osm_serialized_data[key], key + " serialized correctly");
+        }
+    }    
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/OWSContext/v0_3_1.html b/tests/Format/OWSContext/v0_3_1.html
new file mode 100644
index 0000000..cc7d1dc
--- /dev/null
+++ b/tests/Format/OWSContext/v0_3_1.html
@@ -0,0 +1,240 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_read_wmswfs(t) {
+        t.plan(16);
+        // taken from http://www.ogcnetwork.net/schemas/owc/0.3.1/context_nested.xml
+        // adapted: add an extra slash (roads/railways) in the Title of the WMS layer to test nesting
+        var text = '<?xml version="1.0" encoding="UTF-8"?>' +
+            '<OWSContext version="0.3.1" id="ows-context-ex-1-v3" xmlns="http://www.opengis.net/ows-context"' +
+            '	xmlns:gml="http://www.opengis.net/gml" xmlns:kml="http://www.opengis.net/kml/2.2"' +
+            '	xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows"' +
+            '	xmlns:sld="http://www.opengis.net/sld" xmlns:xlink="http://www.w3.org/1999/xlink"' +
+            '	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            '	xsi:schemaLocation="http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd">' +
+            '	<General>' +
+            '		<ows:BoundingBox crs="EPSG:4326">' +
+            '			<ows:LowerCorner>-117 32</ows:LowerCorner>' +
+            '			<ows:UpperCorner>-116 33</ows:UpperCorner>' +
+            '		</ows:BoundingBox>' +
+            '		<ows:Title>OWS Context version 0.3.1 showing nested layers</ows:Title>' +
+            '	</General>' +
+            '	<ResourceList>' +
+            '		<!-- WMS Example -->' +
+            '		<Layer name="topp:major_roads" queryable="1" hidden="1">' +
+            '			<ows:Title>Tiger 2005fe major roads/railways</ows:Title>' +
+            '			<ows:OutputFormat>image/png</ows:OutputFormat>' +
+            '			<Server service="urn:ogc:serviceType:WMS" version="1.1.1">' +
+            '				<OnlineResource' +
+            '					xlink:href="http://sigma.openplans.org:8080/geoserver/wms?SERVICE=WMS"/>' +
+            '			</Server>' +
+            '			<!-- WFS Example -->' +
+            '			<Layer name="topp:gnis_pop" hidden="0">' +
+            '				<ows:Title>GNIS Population</ows:Title>' +
+            '				<Server service="urn:ogc:serviceType:WFS" version="1.0.0">' +
+            '					<OnlineResource xlink:href="http://sigma.openplans.org:8080/geoserver/wfs?"/>' +
+            '				</Server>' +
+            '			</Layer>' +
+            '		</Layer>' +
+            '	</ResourceList>' +
+            '</OWSContext>';
+        var parser = new OpenLayers.Format.OWSContext();
+        var map = new OpenLayers.Map('map', {allOverlays: true, fractionalZoom: true});
+        var context = parser.read(text, {map: map});
+        t.eq(context.layers.length, 2, "2 layers parsed from OWSContext document");
+        t.eq(context.layers[1].metadata.nestingPath[0], "Tiger 2005fe major roads/railways", "Nesting path correctly set");
+        t.ok(context.layers[0] instanceof OpenLayers.Layer.WMS, "First layer is a WMS layer"); 
+        t.ok(context.layers[1] instanceof OpenLayers.Layer.Vector, "Second layer is a vector layer");
+        t.eq(context.layers[0].params.LAYERS, "topp:major_roads", "WMS layer name correctly read");
+        t.eq(context.layers[0].params.FORMAT, "image/png", "WMS format correctly read");
+        t.eq(context.layers[0].url, "http://sigma.openplans.org:8080/geoserver/wms?SERVICE=WMS", "Layer url correctly read");
+        t.eq(context.layers[0].getVisibility(), false, "WMS Layer is hidden");
+        t.ok(context.layers[0].queryable, "WMS layer is queryable");
+        t.eq(context.layers[0].name, "Tiger 2005fe major roads/railways", "Title correctly set");
+        t.ok(context.layers[1].protocol instanceof OpenLayers.Protocol.WFS.v1_0_0, "Vector layer configured with a WFS Protocol");
+        t.eq(context.layers[1].protocol.url, "http://sigma.openplans.org:8080/geoserver/wfs?", "WFS url set correctly");
+        t.ok(context.layers[1].strategies[0] instanceof OpenLayers.Strategy.BBOX, "BBOX strategy configured correctly");
+        t.eq(context.layers[1].name, "GNIS Population", "Title of second layer correctly set");
+        t.eq(context.layers[1].getVisibility(), true, "Second layer is visible");
+        map.zoomToExtent(new OpenLayers.Bounds(-117, 32, -116, 33));
+        var owc = parser.write(map, {id: 'ows-context-ex-1-v3', title: 'OWS Context version 0.3.1 showing nested layers'});
+        t.xml_eq(text, owc, "Can we roundtrip this nested OWSContext with a WMS and WFS layer?");
+    }
+
+    function test_write_wmswfs(t) {
+        t.plan(1);
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map = new OpenLayers.Map( 'map' );
+        var layer = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://labs.metacarta.com/wms/vmap0",
+            {layers: 'basic'},
+            {singleTile: true}
+        );
+        var wfs = new OpenLayers.Layer.Vector("myroads", {
+            strategies: [new OpenLayers.Strategy.BBOX()],
+            protocol: new OpenLayers.Protocol.WFS({
+                url:  "http://foo/wfs",
+                featureType: "roads",
+                featureNS: "http://foo/myns"
+            })
+        });
+        map.addLayers([layer, wfs]);
+        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+
+        var owc = new OpenLayers.Format.OWSContext();
+        var output = owc.write(map, {id: 'foo'});
+        var expected = '<OWSContext xmlns="http://www.opengis.net/ows-context" version="0.3.1" id="foo" xsi:schemaLocation="http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><ows:BoundingBox xmlns:ows="http://www.opengis.net/ows" crs="EPSG:4326"><ows:LowerCorner>-5.986328125 29.013671875</ows:LowerCorner><ows:UpperCorner>15.986328125 50.986328125</ows:UpperCorner></ows:BoundingBox> [...]
+        t.xml_eq(output, expected, "OWSContext with a WMS and a WFS layer generated correctly");
+    }
+
+    function test_write_wmsinlinegml(t) {
+        t.plan(1);
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map = new OpenLayers.Map( 'map' );
+        var layer = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://labs.metacarta.com/wms/vmap0",
+            {layers: 'basic'},
+            {singleTile: true}
+        );
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+
+        var vector = new OpenLayers.Layer.Vector();
+        map.addLayer(vector);
+        var feature1 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,1));
+        var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,0));
+        vector.addFeatures(feature1);
+        vector.addFeatures(feature2);
+        var owc = new OpenLayers.Format.OWSContext();
+        var output = owc.write(map, {id: 'foo'});
+        var expected = '<OWSContext xmlns="http://www.opengis.net/ows-context" version="0.3.1" id="foo" xsi:schemaLocation="http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><ows:BoundingBox xmlns:ows="http://www.opengis.net/ows" crs="EPSG:4326"><ows:LowerCorner>-5.986328125 29.013671875</ows:LowerCorner><ows:UpperCorner>15.986328125 50.986328125</ows:UpperCorner></ows:BoundingBox> [...]
+        t.xml_eq(output, expected, "OWSContext with a WMS and an inline GML vector layer generated correctly");
+    }
+
+    function test_read_inline(t) {
+        t.plan(10);
+        var text = '<?xml version="1.0" encoding="UTF-8"?><OWSContext xmlns="http://www.opengis.net/ows-context" xmlns:gml="http://www.opengis.net/gml" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:sld="http://www.opengis.net/sld" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="0.3.1" id="ows-context-ex-1-v3" xsi:schemaLocation="http://www.opengis.net [...]
+        var parser = new OpenLayers.Format.OWSContext();
+        var context = parser.read(text, {map: 'map'});
+        t.ok(context.layers[1] instanceof OpenLayers.Layer.Vector, "Inline KML results in a vector layer");
+        t.eq(context.layers[1].features.length, 1, "Inline KML layer has one feature");
+        t.ok(context.layers[1].features[0].geometry instanceof OpenLayers.Geometry.Point, "KML feature is a point");
+        t.eq(context.layers[1].features[0].attributes.description, "Signature Rock Description", "KML Description correctly parsed");
+        t.eq(context.layers[1].features[0].fid, "archsites.1", "KML feature id correctly parsed");
+        t.eq(context.layers[1].features[0].style.externalGraphic, "http://maps.google.com/mapfiles/kml/pal4/icon25.png", "Style url for KML feature correctly parsed");
+        t.ok(context.layers[2] instanceof OpenLayers.Layer.Vector, "Inline GML results in a vector layer");
+        t.eq(context.layers[2].features.length, 2, "Inline GML layer has two features");
+        t.ok(context.layers[2].features[0].geometry instanceof OpenLayers.Geometry.Polygon, "GML feature is a polygon");
+        t.eq(context.layers[2].features[0].attributes.MERGE, "1", "GML attribute read correctly");
+    }
+
+    function test_read_gml(t) {
+        t.plan(5);
+        var text = '<?xml version="1.0" encoding="UTF-8"?><OWSContext version="0.3.0" id="ows-context-ex-1-v3" xmlns="http://www.opengis.net/ows-context" xmlns:gml="http://www.opengis.net/gml" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows" xmlns:sld="http://www.opengis.net/sld" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net [...]
+        var parser = new OpenLayers.Format.OWSContext();
+        var context = parser.read(text, {map: 'map'});
+        t.ok(context.layers[1].protocol instanceof OpenLayers.Protocol.HTTP, "serviceType GML is translated into an HTTP Protocol");
+        t.eq(context.layers[1].protocol.url, "http://www.cadcorpdev.co.uk/gml/MassGIS/LandUse.gml", "Url of GML file correctly set");
+        t.ok(context.layers[1].protocol.format instanceof OpenLayers.Format.GML, "GML Format associated with protocol");
+        t.eq(Math.round(context.layers[1].minScale), 50000, "Minscale correctly read");
+        t.eq(Math.round(context.layers[1].maxScale), 5000, "Maxscale correctly read");
+    }
+
+    function test_read_kml(t) {
+        t.plan(3);
+        var text = '<OWSContext xmlns="http://www.opengis.net/ows-context" version="0.3.1" id="foo" xsi:schemaLocation="http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><ows:BoundingBox xmlns:ows="http://www.opengis.net/ows" crs="EPSG:4326"><ows:LowerCorner>-5.986328125 27.9150390625</ows:LowerCorner><ows:UpperCorner>15.986328125 52.0849609375</ows:UpperCorner></ows:BoundingBox><o [...]
+        var parser = new OpenLayers.Format.OWSContext();
+        var context = parser.read(text, {map: 'map'});
+        t.ok(context.layers[1].protocol instanceof OpenLayers.Protocol.HTTP, "serviceType KML is translated into an HTTP Protocol");
+        t.eq(context.layers[1].protocol.url, "http://foo/sundials.kml", "Url of KML file correctly set");
+        t.ok(context.layers[1].protocol.format instanceof OpenLayers.Format.KML, "KML Format associated with protocol");
+    }
+
+    function test_write_gml(t) {
+        t.plan(1);
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map = new OpenLayers.Map( 'map' );
+        var layer = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://labs.metacarta.com/wms/vmap0",
+            {layers: 'basic'},
+            {singleTile: true}
+        );
+        var sundials = new OpenLayers.Layer.Vector("GML", {
+            projection: map.displayProjection,
+            strategies: [new OpenLayers.Strategy.Fixed()],
+            protocol: new OpenLayers.Protocol.HTTP({
+                url: "http://foo/sundials.gml",
+                format: new OpenLayers.Format.GML()
+            })
+        });
+        map.addLayers([layer, sundials]);
+        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+
+        var owc = new OpenLayers.Format.OWSContext();
+        var output = owc.write(map, {id: 'foo'});
+        var expected = '<OWSContext xmlns="http://www.opengis.net/ows-context" version="0.3.1" id="foo" xsi:schemaLocation="http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><ows:BoundingBox xmlns:ows="http://www.opengis.net/ows" crs="EPSG:4326"><ows:LowerCorner>-5.986328125 29.013671875</ows:LowerCorner><ows:UpperCorner>15.986328125 50.986328125</ows:UpperCorner></ows:BoundingBox> [...]
+        t.xml_eq(output, expected, "OWSContext with a WMS and a GML vector layer generated correctly");
+    }
+
+    function test_write_kml(t) {
+        t.plan(1);
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map = new OpenLayers.Map( 'map' );
+        var layer = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://labs.metacarta.com/wms/vmap0",
+            {layers: 'basic'},
+            {singleTile: true}
+        );
+        var sundials = new OpenLayers.Layer.Vector("KML", {
+            projection: map.displayProjection,
+            strategies: [new OpenLayers.Strategy.Fixed()],
+            protocol: new OpenLayers.Protocol.HTTP({
+                url: "http://foo/sundials.kml",
+                format: new OpenLayers.Format.KML({
+                    extractStyles: true
+                })
+            })
+        });
+        map.addLayers([layer, sundials]);
+        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+
+        var owc = new OpenLayers.Format.OWSContext();
+        var output = owc.write(map, {id: 'foo'});
+        var expected = '<OWSContext xmlns="http://www.opengis.net/ows-context" version="0.3.1" id="foo" xsi:schemaLocation="http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><ows:BoundingBox xmlns:ows="http://www.opengis.net/ows" crs="EPSG:4326"><ows:LowerCorner>-5.986328125 29.013671875</ows:LowerCorner><ows:UpperCorner>15.986328125 50.986328125</ows:UpperCorner></ows:BoundingBox> [...]
+        t.xml_eq(output, expected, "OWSContext with a WMS and a KML vector layer generated correctly");
+    }
+
+    function test_nested(t) {
+        t.plan(4);
+        var text = '<OWSContext xmlns="http://www.opengis.net/ows-context" version="0.3.1" id="machu" xsi:schemaLocation="http://www.opengis.net/ows-context http://www.ogcnetwork.net/schemas/owc/0.3.1/owsContext.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><ows:BoundingBox xmlns:ows="http://www.opengis.net/ows" crs="EPSG:4326"><ows:LowerCorner>-40 30</ows:LowerCorner><ows:UpperCorner>55 125</ows:UpperCorner></ows:BoundingBox><ows:Title xmlns:ows="http://www.opengis [...]
+        var parser = new OpenLayers.Format.OWSContext();
+        var map = new OpenLayers.Map('map', {allOverlays: true, fractionalZoom: true});
+        var context = parser.read(text, {map: map});
+        t.eq(map.layers.length, 13, "13 layers parsed from document");
+        t.eq(map.layers[0].metadata.nestingPath.join("/"), "General Bathymetric Chart/GEBCO", "Category layers read correctly");
+        t.eq(map.layers[0].metadata.styles[0].legend.url, "http://foo/services/geoservices/legends/machu/gebco.png", "Legend url correctly parsed");
+        map.zoomToExtent(new OpenLayers.Bounds(-40, 30, 55, 125));
+        var owc = parser.write(map, {id: 'machu'});
+        t.xml_eq(text, owc, "Can we roundtrip nested OWSContext successfully?");
+    }
+
+    </script> 
+</head>
+<body>
+<div id="map" style="width:500px;height:500px"></div>
+</body>
+</html>
diff --git a/tests/Format/SLD.html b/tests/Format/SLD.html
new file mode 100644
index 0000000..d63798b
--- /dev/null
+++ b/tests/Format/SLD.html
@@ -0,0 +1,36 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    var test_content = '<sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"><sld:NamedLayer><sld:Name>TestLayer</sld:Name><sld:UserStyle><sld:Name>foo</sld:Name><sld:FeatureTypeStyle><sld:Rule><sld:Name>bar</sld:Name><ogc:Filter></ogc:Filter><sld:PolygonSymbolizer><sld:Fill><sld:CssParameter name="fill"><ogc:Literal>blue</ogc:Literal></sld:CssParameter></sld:Fill></sld:PolygonSymbolizer></sld:Rule [...]
+
+    function test_Format_SLD_constructor(t) { 
+        t.plan(3); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.SLD(options); 
+        t.ok(format instanceof OpenLayers.Format.SLD, 
+             "new OpenLayers.Format.SLD returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+    }
+
+    function test_Format_SLD_read(t) {
+        t.plan(4);
+        var sld = new OpenLayers.Format.SLD().read(this.test_content);
+        
+        var testLayer = sld.namedLayers["TestLayer"];
+        var userStyles = testLayer.userStyles;
+        
+        t.eq(userStyles[0].name, "foo", "SLD correctly reads a UserStyle named 'foo'");
+        t.eq(userStyles[0].rules.length, 1, "The number of rules for the UserStyle is correct");
+        t.eq(userStyles[0].rules[0].name, "bar", "The first rule's name is 'bar'");
+        t.eq(userStyles[0].rules[0].symbolizer.Polygon.fillColor, "blue", "The fillColor for the Polygon symbolizer is correct");
+    }
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/SLD/v1_0_0.html b/tests/Format/SLD/v1_0_0.html
new file mode 100644
index 0000000..6cb604b
--- /dev/null
+++ b/tests/Format/SLD/v1_0_0.html
@@ -0,0 +1,865 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    var xml = new OpenLayers.Format.XML(); 
+    function readXML(id) {
+        return xml.read(document.getElementById(id).firstChild.nodeValue);
+    }
+    
+    var sld =
+        '<StyledLayerDescriptor version="1.0.0" ' +
+            'xmlns="http://www.opengis.net/sld" ' +
+            'xmlns:gml="http://www.opengis.net/gml" ' +
+            'xmlns:ogc="http://www.opengis.net/ogc" ' +
+            'xmlns:xlink="http://www.w3.org/1999/xlink" ' +
+            'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
+            'xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd">' +
+            '<NamedLayer>' + 
+                '<Name>AAA161</Name>' + 
+                '<UserStyle>' + 
+                    '<FeatureTypeStyle>' + 
+                        '<Rule>' + 
+                            '<Name>stortsteen</Name>' + 
+                            '<ogc:Filter>' +
+                                '<ogc:PropertyIsEqualTo>' +
+                                    '<ogc:PropertyName>CTE</ogc:PropertyName>' +
+                                    '<ogc:Literal>V0305</ogc:Literal>' +
+                                '</ogc:PropertyIsEqualTo>' +
+                            '</ogc:Filter>' + 
+                            '<MaxScaleDenominator>50000</MaxScaleDenominator>' + 
+                            '<PolygonSymbolizer>' + 
+                                '<Fill>' + 
+                                    '<CssParameter name="fill">#ffffff</CssParameter>' + 
+                                '</Fill>' + 
+                                '<Stroke>' + 
+                                    '<CssParameter name="stroke">#000000</CssParameter>' + 
+                                '</Stroke>' + 
+                            '</PolygonSymbolizer>' + 
+                            '<TextSymbolizer>' + 
+                                '<Label>' + 
+                                    '<ogc:PropertyName>FOO</ogc:PropertyName>' +
+                                '</Label>' +
+                                '<Font>' +
+                                    '<CssParameter name="font-family">Arial</CssParameter>' + 
+                                    '<CssParameter name="font-size">14</CssParameter>' + 
+                                    '<CssParameter name="font-weight">bold</CssParameter>' + 
+                                    '<CssParameter name="font-style">normal</CssParameter>' + 
+                                '</Font>' +
+                                '<Halo>' +
+                                    '<Radius>3</Radius>' +
+                                    '<Fill>' +
+                                        '<CssParameter name="fill">#ffffff</CssParameter>' + 
+                                    '</Fill>' +
+                                '</Halo>' +
+                                '<Fill>' +
+                                    '<CssParameter name="fill">#000000</CssParameter>' + 
+                                '</Fill>' +
+                            '</TextSymbolizer>' + 
+                        '</Rule>' + 
+                        '<Rule>' + 
+                            '<Name>betonbekleding</Name>' + 
+                            '<ogc:Filter>' +
+                                '<ogc:PropertyIsLessThan>' +
+                                    '<ogc:PropertyName>CTE</ogc:PropertyName>' +
+                                    '<ogc:Literal>1000</ogc:Literal>' +
+                                '</ogc:PropertyIsLessThan>' +
+                            '</ogc:Filter>' + 
+                            '<MaxScaleDenominator>50000</MaxScaleDenominator>' + 
+                            '<PolygonSymbolizer>' + 
+                                '<Fill>' + 
+                                    '<CssParameter name="fill">#ffff00</CssParameter>' + 
+                                '</Fill>' + 
+                                '<Stroke>' + 
+                                    '<CssParameter name="stroke">#0000ff</CssParameter>' + 
+                                '</Stroke>' + 
+                            '</PolygonSymbolizer>' + 
+                        '</Rule>' + 
+                    '</FeatureTypeStyle>' + 
+                '</UserStyle>' + 
+            '</NamedLayer>' + 
+            '<NamedLayer>' + 
+                '<Name>Second Layer</Name>' + 
+                '<UserStyle>' + 
+                    '<FeatureTypeStyle>' + 
+                        '<Rule>' + 
+                            '<Name>first rule second layer</Name>' + 
+                            '<ogc:Filter>' +
+                                '<ogc:Or>' +
+                                    '<ogc:PropertyIsBetween>' +
+                                        '<ogc:PropertyName>number</ogc:PropertyName>' +
+                                        '<ogc:LowerBoundary>' +
+                                            '<ogc:Literal>1064866676</ogc:Literal>' +
+                                        '</ogc:LowerBoundary>' +
+                                        '<ogc:UpperBoundary>' +
+                                            '<ogc:Literal>1065512599</ogc:Literal>' +
+                                        '</ogc:UpperBoundary>' +
+                                    '</ogc:PropertyIsBetween>' +
+                                    '<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">' +
+                                        '<ogc:PropertyName>cat</ogc:PropertyName>' +
+                                        '<ogc:Literal>*dog.food!*good</ogc:Literal>' +
+                                    '</ogc:PropertyIsLike>' +
+                                    '<ogc:Not>' +
+                                        '<ogc:PropertyIsLessThanOrEqualTo>' +
+                                            '<ogc:PropertyName>FOO</ogc:PropertyName>' +
+                                            '<ogc:Literal>5000</ogc:Literal>' +
+                                        '</ogc:PropertyIsLessThanOrEqualTo>' +
+                                    '</ogc:Not>' +
+                                '</ogc:Or>' +
+                            '</ogc:Filter>' + 
+                            '<MaxScaleDenominator>10000</MaxScaleDenominator>' + 
+                            '<PointSymbolizer>' +
+                                '<Graphic>' +
+                                    '<Mark>' +
+                                        '<WellKnownName>star</WellKnownName>' +
+                                        '<Fill>' + 
+                                            '<CssParameter name="fill">lime</CssParameter>' + 
+                                        '</Fill>' + 
+                                        '<Stroke>' + 
+                                            '<CssParameter name="stroke">olive</CssParameter>' + 
+                                            '<CssParameter name="stroke-width">2</CssParameter>' +
+                                        '</Stroke>' + 
+                                    '</Mark>' + 
+                                '</Graphic>' +
+                            '</PointSymbolizer>' +
+                        '</Rule>' + 
+                    '</FeatureTypeStyle>' + 
+                '</UserStyle>' + 
+            '</NamedLayer>' +
+        '</StyledLayerDescriptor>';
+
+    function test_read(t) {
+        t.plan(22);
+        
+        var xml = new OpenLayers.Format.XML();
+        var sldxml = xml.read(sld);
+        
+        // test that format options are considered in read
+        var parser = new OpenLayers.Format.SLD({
+            version: "1.0.0",
+            namedLayersAsArray: true
+        });
+        var obj = parser.read(sldxml);
+        t.ok(obj.namedLayers instanceof Array, "namedLayersAsArray option for read works");
+        
+        parser = new OpenLayers.Format.SLD.v1_0_0();
+        var obj = parser.read(sldxml, {namedLayersAsArray: true});
+        t.ok(obj.namedLayers instanceof Array, "namedLayersAsArray option for read works");
+        var arrayLen = obj.namedLayers.length;
+        
+        var obj = parser.read(sldxml);
+        t.eq(typeof obj.namedLayers, "object", "read returns a namedLayers object by default");
+        // test the named layer count
+        var count = 0;
+        for(var key in obj.namedLayers) {
+            ++count;
+        }        
+        t.eq(count, arrayLen, "number of named layers in array equals number of named layers in object");
+        
+        var layer, style, rule;
+        
+        // check the first named layer
+        layer = obj.namedLayers["AAA161"];
+        t.ok(layer, "first named layer exists");
+        t.ok(layer.userStyles instanceof Array, "(AAA161) layer has array of user styles");
+        t.eq(layer.userStyles.length, 1, "(AAA161) first layer has a single user style");
+        t.eq(layer.userStyles[0].rules.length, 2, "(AAA161) first style has two rules");
+        var rule = layer.userStyles[0].rules[0];
+        t.ok(rule.filter, "(AAA161) first rule has a filter");
+        var symbolizer = rule.symbolizer;
+        t.ok(symbolizer, "(AAA161) first rule has a symbolizer");
+        var poly = symbolizer["Polygon"];
+        t.eq(poly.fillColor, "#ffffff", "(AAA161) first rule has proper fill");
+        t.eq(poly.strokeColor, "#000000", "(AAA161) first rule has proper stroke");
+        var text = symbolizer["Text"];
+        t.eq(text.label, "${FOO}", "(AAA161) first rule has proper text label");
+        t.eq(layer.userStyles[0].propertyStyles["label"], true, "label added to propertyStyles");
+        t.eq(text.fontFamily, "Arial", "(AAA161) first rule has proper font family");
+        t.eq(text.fillColor, "#000000", "(AAA161) first rule has proper text fill");
+        t.eq(text.haloRadius, "3", "(AAA161) first rule has proper halo radius");
+        t.eq(text.haloColor, "#ffffff", "(AAA161) first rule has proper halo color");
+        
+        
+        // check the first user style
+        style = layer.userStyles[0];
+        t.ok(style instanceof OpenLayers.Style, "(AAA161,0) user style is instance of OpenLayers.Style");
+        t.eq(style.rules.length, 2, "(AAA161,0) user style has 2 rules");
+        
+        // check the second rule
+        rule = style.rules[1];
+        var feature = {
+            layer: {
+                map: {
+                    getScale: function(){
+                        return 40000; 
+                    }
+                }
+            },
+            attributes: {
+                CTE: "900"
+            }
+        };
+        t.ok(typeof rule.maxScaleDenominator == "number", "MaxScaleDenominator is a number");
+        t.eq(rule.evaluate(feature), true, "numeric filter comparison evaluates correctly");
+        
+        // etc.  I'm convinced read works, really wanted to test write (since examples don't test that)
+        // I'll add more tests here later.        
+
+    }
+    
+    function test_write(t) {
+        t.plan(3);
+
+        // read first - testing that write produces the SLD aboce
+        var parser = new OpenLayers.Format.SLD.v1_0_0();
+        var xml = new OpenLayers.Format.XML();
+        var sldxml = xml.read(sld);
+        var obj = parser.read(sldxml);
+        
+        var node = parser.write(obj);
+        t.xml_eq(node, sld, "SLD correctly written");
+        
+        obj = parser.read(sldxml, {namedLayersAsArray: true});
+        node = parser.write(obj);
+        t.xml_eq(node, sld, "SLD from namedLayers array correctly written");
+        
+        // test that 0 fill opacity gets written
+        var symbolizer = {
+            fillColor: "red",
+            fillOpacity: 0
+        };
+        var root = parser.createElementNSPlus("PolygonSymbolizer");
+        var got = parser.writeNode("Fill", symbolizer, root);
+        var expect =
+            '<Fill xmlns="http://www.opengis.net/sld">' +
+                '<CssParameter name="fill">red</CssParameter>' + 
+                '<CssParameter name="fill-opacity">0</CssParameter>' + 
+            '</Fill>';
+        t.xml_eq(got, expect, "zero fill opacity written");
+    }
+    
+    function test_writePointSymbolizer(t) {
+
+        t.plan(3);
+
+        var parser = new OpenLayers.Format.SLD.v1_0_0();
+        var symbolizer, node, exp;
+        
+        // test symbolizer with fill color only
+        symbolizer = {
+            "fillColor": "blue"
+        };
+        node = parser.writeNode("sld:PointSymbolizer", symbolizer);
+        exp =
+            '<PointSymbolizer xmlns="http://www.opengis.net/sld">' +
+                '<Graphic>' +
+                    '<Mark>' +
+                        '<Fill>' +
+                            '<CssParameter name="fill">blue</CssParameter>' +
+                        '</Fill>' +
+                        '<Stroke/>' +
+                    '</Mark>' +
+                '</Graphic>' +
+            '</PointSymbolizer>';        
+        t.xml_eq(node, exp, "fillColor only written");
+
+        // test symbolizer with stroke color only
+        symbolizer = {
+            "strokeColor": "blue"
+        };
+        node = parser.writeNode("sld:PointSymbolizer", symbolizer);
+        exp =
+            '<PointSymbolizer xmlns="http://www.opengis.net/sld">' +
+                '<Graphic>' +
+                    '<Mark>' +
+                        '<Fill/>' +
+                        '<Stroke>' +
+                            '<CssParameter name="stroke">blue</CssParameter>' +
+                        '</Stroke>' +
+                    '</Mark>' +
+                '</Graphic>' +
+            '</PointSymbolizer>';        
+        t.xml_eq(node, exp, "strokeColor only written");
+        
+        // test symbolizer with graphic name only
+        symbolizer = {
+            "graphicName": "star"
+        };
+        node = parser.writeNode("sld:PointSymbolizer", symbolizer);
+        exp =
+            '<PointSymbolizer xmlns="http://www.opengis.net/sld">' +
+                '<Graphic>' +
+                    '<Mark>' +
+                        '<WellKnownName>star</WellKnownName>' +
+                        '<Fill/>' +
+                        '<Stroke/>' +
+                    '</Mark>' +
+                '</Graphic>' +
+            '</PointSymbolizer>';        
+        t.xml_eq(node, exp, "graphicName only written");
+        
+
+    }
+    
+    
+    function test_writeLineSymbolizer(t) {
+
+        t.plan(1);
+
+        var parser = new OpenLayers.Format.SLD.v1_0_0();
+        var symbolizer, node, exp;
+        
+        // test symbolizer with fill color only
+        symbolizer = {
+            strokeDashstyle: "4 4",
+            strokeLinecap: "round",
+            strokeColor: "#0000ff",
+            strokeWidth: 2
+        };
+        node = parser.writeNode("sld:LineSymbolizer", symbolizer);
+        exp =
+            '<LineSymbolizer xmlns="http://www.opengis.net/sld">' +
+                '<Stroke>' +
+                    '<CssParameter name="stroke">#0000ff</CssParameter>' +
+                    '<CssParameter name="stroke-width">2</CssParameter>' +
+                    '<CssParameter name="stroke-dasharray">4 4</CssParameter>' +
+                    '<CssParameter name="stroke-linecap">round</CssParameter>' +
+                '</Stroke>' +
+            '</LineSymbolizer>';
+        t.xml_eq(node, exp, "line symbolizer correctly written");
+        
+
+    }
+    
+    function test_writeTextSymbolizer(t) {
+        t.plan(1);
+        var parser = new OpenLayers.Format.SLD.v1_0_0();
+        var symbolizer = {
+            "Text": {
+                "label": "This is the ${city} in ${state}.",
+                "fontFamily": "Arial",
+                "fontSize": 10,
+                "fillColor": "blue",
+                "fontWeight": "bold",
+                "fontStyle": "normal",
+                "haloRadius": 2,
+                "haloColor": "white"
+            }
+        };
+        var node = parser.writers["sld"]["TextSymbolizer"].apply(
+            parser, [symbolizer["Text"]]
+        );
+        
+        var expected =
+            '<TextSymbolizer xmlns="http://www.opengis.net/sld">' +
+                '<Label>' +
+                    'This is the ' +
+                    '<ogc:PropertyName xmlns:ogc="http://www.opengis.net/ogc">city</ogc:PropertyName>' +
+                    ' in ' +
+                    '<ogc:PropertyName xmlns:ogc="http://www.opengis.net/ogc">state</ogc:PropertyName>' +
+                    '.' +
+                '</Label>' +
+                '<Font>' +
+                    '<CssParameter name="font-family">Arial</CssParameter>' +
+                    '<CssParameter name="font-size">10</CssParameter>' +
+                    '<CssParameter name="font-weight">bold</CssParameter>' + 
+                    '<CssParameter name="font-style">normal</CssParameter>' + 
+                '</Font>' +
+                '<Halo>' +
+                    '<Radius>2</Radius>' +
+                    '<Fill>' +
+                        '<CssParameter name="fill">white</CssParameter>' + 
+                    '</Fill>' +
+                '</Halo>' +
+                '<Fill>' +
+                    '<CssParameter name="fill">blue</CssParameter>' +
+                '</Fill>' + 
+            '</TextSymbolizer>';
+        
+        t.xml_eq(node, expected, "TextSymbolizer correctly written");
+        
+    }
+    
+    function test_writeSpatialFilter(t) {
+        
+        t.plan(1);
+        
+        var format = new OpenLayers.Format.SLD.v1_0_0();
+        
+        var rule = new OpenLayers.Rule({
+            name: "test",
+            filter: new OpenLayers.Filter.Spatial({
+                type: OpenLayers.Filter.Spatial.BBOX,
+                value: new OpenLayers.Bounds(0, 0, 10, 10)
+            })
+        });
+        
+        var sld = format.writeNode("sld:Rule", rule);
+        
+        var expect =
+            '<Rule xmlns="http://www.opengis.net/sld">' +
+                '<Name>test</Name>' +
+                '<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+                    '<ogc:BBOX>' +
+                        '<ogc:PropertyName/>' +
+                        '<gml:Box xmlns:gml="http://www.opengis.net/gml">' +
+                            '<gml:coordinates decimal="." cs="," ts=" ">0,0 10,10</gml:coordinates>' +
+                        '</gml:Box>' +
+                    '</ogc:BBOX>' +
+                '</ogc:Filter>' +
+            '</Rule>';
+        
+        t.xml_eq(sld, expect, "rule with spatial filter correctly written");
+        
+    }
+    
+    function test_RasterSymbolizer(t) {
+        t.plan(4);
+        
+        var format = new OpenLayers.Format.SLD.v1_0_0();
+
+        var snippet =
+            '<sld:RasterSymbolizer xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc">' +
+                '<sld:Geometry>' +
+                    '<ogc:PropertyName>geom</ogc:PropertyName>' +
+                '</sld:Geometry>' +
+                '<sld:Opacity>1</sld:Opacity>' +
+                '<sld:ColorMap>' +
+                    '<sld:ColorMapEntry color="#000000" opacity="0.5" quantity="0" label="nodata"/>' +
+                    '<sld:ColorMapEntry color="#00FFFF" quantity="1" label="values"/>' +
+                    '<sld:ColorMapEntry color="#FF0000" quantity="1000" label="values"/>' +
+                '</sld:ColorMap>' +
+            '</sld:RasterSymbolizer>';
+        var expected = new OpenLayers.Format.XML().read(snippet).documentElement;
+    
+        var symbolizer = {};
+        format.readNode(expected, {symbolizer: symbolizer});
+        
+        t.eq(symbolizer.Raster.colorMap[0].quantity, 0, "quantity set correctly");
+        t.eq(symbolizer.Raster.colorMap[0].opacity, 0.5, "opacity set correctly");
+        t.eq(symbolizer.Raster.colorMap[1].opacity, undefined, "non-existent opacity results in undefined");
+        
+        var got = format.writeNode("sld:RasterSymbolizer", symbolizer["Raster"]);
+        
+        t.xml_eq(got, expected, "Successfully round tripped RasterSymbolizer");
+    }
+    
+    function test_zIndex(t) {
+        t.plan(1);
+        
+        var format = new OpenLayers.Format.SLD.v1_0_0({
+            multipleSymbolizers: true
+        });
+        
+        // three zIndex values -> three FeatureTypeStyle elements
+        var style = new OpenLayers.Style2({
+            rules: [
+                new OpenLayers.Rule({
+                    filter: new OpenLayers.Filter.Comparison({
+                        type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                        property: "foo",
+                        value: "bar"
+                    }),
+                    minScaleDenominator: 100000,
+                    maxScaleDenominator: 200000,
+                    symbolizers: [
+                        new OpenLayers.Symbolizer.Line({
+                            strokeColor: "green",
+                            strokeWidth: 2,
+                            zIndex: 2
+                        }),
+                        new OpenLayers.Symbolizer.Line({
+                            strokeColor: "red",
+                            strokeWidth: 3,
+                            zIndex: -1
+                        }),
+                        new OpenLayers.Symbolizer.Line({
+                            strokeColor: "blue",
+                            strokeWidth: 1,
+                            zIndex: 5
+                        })
+                    ]
+                }),
+                new OpenLayers.Rule({
+                    filter: new OpenLayers.Filter.Comparison({
+                        type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                        property: "foo",
+                        value: "baz"
+                    }),                    
+                    symbolizers: [
+                        new OpenLayers.Symbolizer.Line({
+                            strokeColor: "#000000",
+                            strokeWidth: 2,
+                            zIndex: 2
+                        })
+                    ]
+                })
+            ]
+        });
+        
+        var got = format.writeNode("sld:UserStyle", style);
+        var exp = readXML("zindex_test.sld").documentElement;
+        t.xml_eq(got, exp, "duplicated rules to write zIndex as FeatureTypeStyle elements");
+        
+    }
+    
+    function test_read_FeatureTypeStyles(t) {
+        
+        t.plan(13);
+        
+        var format = new OpenLayers.Format.SLD.v1_0_0({
+            multipleSymbolizers: true,
+            namedLayersAsArray: true
+        });
+        var doc = readXML("line_linewithborder.sld");
+        
+        var obj = format.read(doc);
+
+        t.eq(obj.namedLayers.length, 1, "got one named layer");
+        var namedLayer = obj.namedLayers[0];
+        
+        t.eq(namedLayer.userStyles.length, 1, "got one user style");
+        var userStyle = namedLayer.userStyles[0];
+        t.ok(userStyle instanceof OpenLayers.Style2, "user style represented with OpenLayers.Style2");
+        
+        // check rules and symbolizers
+        var rule, symbolizer;
+        
+        t.eq(userStyle.rules.length, 2, "pulled two rules (from two FeatureTypeStyle elements)");
+        rule = userStyle.rules[0];
+        t.ok(rule instanceof OpenLayers.Rule, "first rule is an OpenLayers.Rule");
+        
+        t.eq(rule.symbolizers && rule.symbolizers.length, 1, "first rule has one symbolizer");
+        symbolizer = rule.symbolizers[0];
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer, "first symbolizer in first rule is an OpenLayers.Symbolizer");
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "first symbolizer in first rule is an OpenLayers.Symbolizer.Line");
+        t.eq(symbolizer.zIndex, 0, "symbolizer from first FeatureTypeStyle element has zIndex 0");
+        
+        rule = userStyle.rules[1];
+        t.eq(rule.symbolizers && rule.symbolizers.length, 1, "second rule has one symbolizer");
+        symbolizer = rule.symbolizers[0];
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer, "first symbolizer in second rule is an OpenLayers.Symbolizer");
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "first symbolizer in second rule is an OpenLayers.Symbolizer.Line");
+        t.eq(symbolizer.zIndex, 1, "symbolizer from second FeatureTypeStyle element has zIndex 1");
+        
+    }
+
+    function test_roundtrip(t) {
+        
+        t.plan(5);
+        
+        var format = new OpenLayers.Format.SLD.v1_0_0({
+            multipleSymbolizers: true,
+            namedLayersAsArray: true
+        });
+        var doc, out;
+        
+        // two FeatureTypeStyle elements and line symbolizers
+        doc = readXML("line_linewithborder.sld");
+        out = format.write(format.read(doc));
+        t.xml_eq(out, doc.documentElement, "round-tripped line_linewithborder.sld");
+
+        // three FeatureTypeStyle elements and line symbolizers
+        doc = readXML("line_attributebasedline.sld");
+        out = format.write(format.read(doc));
+        t.xml_eq(out, doc.documentElement, "round-tripped line_attributebasedline.sld");
+        
+        // point symbolizer and text symbolizer
+        doc = readXML("point_pointwithdefaultlabel.sld");
+        out = format.write(format.read(doc));
+        t.xml_eq(out, doc.documentElement, "round-tripped point_pointwithdefaultlabel.sld");
+        
+        // polygon symbolizer with fill only 
+        doc = readXML("polygon_simplepolygon.sld");
+        out = format.write(format.read(doc));
+        t.xml_eq(out, doc.documentElement, "round-tripped polygon_simplepolygon.sld");
+
+        // polygon symbolizer and text symbolizer with halo
+        doc = readXML("polygon_labelhalo.sld");
+        out = format.write(format.read(doc));
+        t.xml_eq(out, doc.documentElement, "round-tripped polygon_labelhalo.sld");
+
+    }
+
+    </script> 
+</head> 
+<body>
+<div id="line_linewithborder.sld"><!--
+<StyledLayerDescriptor version="1.0.0" 
+    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" 
+    xmlns="http://www.opengis.net/sld" 
+    xmlns:ogc="http://www.opengis.net/ogc" 
+    xmlns:xlink="http://www.w3.org/1999/xlink" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <NamedLayer>
+    <Name>Line with border</Name>
+    <UserStyle>
+    <Title>SLD Cook Book: Line w2th border</Title>
+      <FeatureTypeStyle>
+         <Rule>
+          <LineSymbolizer>
+            <Stroke>
+              <CssParameter name="stroke">#333333</CssParameter>                           
+              <CssParameter name="stroke-width">5</CssParameter>    
+              <CssParameter name="stroke-linecap">round</CssParameter>    
+            </Stroke> 
+          </LineSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+      <FeatureTypeStyle>
+         <Rule>
+          <LineSymbolizer>
+          <Stroke>
+              <CssParameter name="stroke">#6699FF</CssParameter>                           
+              <CssParameter name="stroke-width">3</CssParameter> 
+              <CssParameter name="stroke-linecap">round</CssParameter>  
+            </Stroke>
+          </LineSymbolizer>                                          
+         </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
+--></div>
+<div id="line_attributebasedline.sld"><!--
+<StyledLayerDescriptor version="1.0.0" 
+    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" 
+    xmlns="http://www.opengis.net/sld" 
+    xmlns:ogc="http://www.opengis.net/ogc" 
+    xmlns:xlink="http://www.w3.org/1999/xlink" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <NamedLayer>
+    <Name>Attribute-based line</Name>
+    <UserStyle>
+      <Title>SLD Cook Book: Attribute-based line</Title>
+      <FeatureTypeStyle>
+        <Rule>
+          <Name>local-road</Name>
+          <ogc:Filter>
+            <ogc:PropertyIsEqualTo>
+              <ogc:PropertyName>type</ogc:PropertyName>
+              <ogc:Literal>local-road</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <LineSymbolizer>
+            <Stroke>
+              <CssParameter name="stroke">#009933</CssParameter>
+              <CssParameter name="stroke-width">2</CssParameter>
+            </Stroke>
+          </LineSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+      <FeatureTypeStyle>
+        <Rule>
+          <Name>secondary</Name>
+          <ogc:Filter>
+            <ogc:PropertyIsEqualTo>
+              <ogc:PropertyName>type</ogc:PropertyName>
+              <ogc:Literal>secondary</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <LineSymbolizer>
+            <Stroke>
+              <CssParameter name="stroke">#0055CC</CssParameter>
+              <CssParameter name="stroke-width">3</CssParameter>
+            </Stroke>
+          </LineSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+      <FeatureTypeStyle>
+        <Rule>
+        <Name>highway</Name>
+          <ogc:Filter>
+            <ogc:PropertyIsEqualTo>
+              <ogc:PropertyName>type</ogc:PropertyName>
+              <ogc:Literal>highway</ogc:Literal>
+            </ogc:PropertyIsEqualTo>
+          </ogc:Filter>
+          <LineSymbolizer>
+            <Stroke>
+              <CssParameter name="stroke">#FF0000</CssParameter>
+              <CssParameter name="stroke-width">6</CssParameter>
+            </Stroke>
+          </LineSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor> 
+--></div>
+<div id="point_pointwithdefaultlabel.sld"><!--
+<StyledLayerDescriptor version="1.0.0" 
+    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" 
+    xmlns="http://www.opengis.net/sld" 
+    xmlns:ogc="http://www.opengis.net/ogc" 
+    xmlns:xlink="http://www.w3.org/1999/xlink" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <NamedLayer>
+    <Name>Point with default label</Name>
+    <UserStyle>
+      <Title>GeoServer SLD Cook Book: Point with default label</Title>
+      <FeatureTypeStyle>
+        <Rule>
+          <PointSymbolizer>
+            <Graphic>
+              <Mark>
+                <WellKnownName>circle</WellKnownName>
+                <Fill>
+                  <CssParameter name="fill">#FF0000</CssParameter>
+                </Fill>
+              </Mark>
+              <Size>6</Size>
+            </Graphic>
+          </PointSymbolizer>
+          <TextSymbolizer>
+            <Label>
+              <ogc:PropertyName>name</ogc:PropertyName>
+            </Label>
+            <Fill>
+              <CssParameter name="fill">#000000</CssParameter>
+            </Fill>
+          </TextSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
+--></div>
+<div id="polygon_simplepolygon.sld"><!--
+<StyledLayerDescriptor version="1.0.0" 
+    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" 
+    xmlns="http://www.opengis.net/sld" 
+    xmlns:ogc="http://www.opengis.net/ogc" 
+    xmlns:xlink="http://www.w3.org/1999/xlink" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <NamedLayer>
+    <Name>Simple polygon</Name>
+    <UserStyle>
+      <Title>SLD Cook Book: Simple polygon</Title>
+      <FeatureTypeStyle>
+        <Rule>
+          <PolygonSymbolizer>
+            <Fill>
+              <CssParameter name="fill">#000080</CssParameter>
+            </Fill>
+          </PolygonSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
+--></div>
+<div id="polygon_labelhalo.sld"><!--
+<StyledLayerDescriptor version="1.0.0" 
+    xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" 
+    xmlns="http://www.opengis.net/sld" 
+    xmlns:ogc="http://www.opengis.net/ogc" 
+    xmlns:xlink="http://www.w3.org/1999/xlink" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <NamedLayer>
+    <Name>Label halo</Name>
+    <UserStyle>
+      <Title>SLD Cook Book: Label halo</Title>
+      <FeatureTypeStyle>
+        <Rule>
+          <PolygonSymbolizer>
+            <Fill>
+              <CssParameter name="fill">#40FF40</CssParameter>
+            </Fill>
+            <Stroke>
+              <CssParameter name="stroke">#FFFFFF</CssParameter>
+              <CssParameter name="stroke-width">2</CssParameter>
+            </Stroke>
+          </PolygonSymbolizer>        
+          <TextSymbolizer>
+            <Label>
+              <ogc:PropertyName>name</ogc:PropertyName>
+            </Label>
+            <Halo>
+              <Radius>3</Radius>
+              <Fill>
+                <CssParameter name="fill">#FFFFFF</CssParameter>
+              </Fill>
+            </Halo>
+          </TextSymbolizer>
+        </Rule>
+      </FeatureTypeStyle>
+    </UserStyle>
+  </NamedLayer>
+</StyledLayerDescriptor>
+--></div>
+<div id="zindex_test.sld"><!--
+<sld:UserStyle xmlns:sld="http://www.opengis.net/sld">
+    <sld:FeatureTypeStyle>
+        <sld:Rule>
+            <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+                <ogc:PropertyIsEqualTo>
+                    <ogc:PropertyName>foo</ogc:PropertyName>
+                    <ogc:Literal>bar</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+            </ogc:Filter>
+            <sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
+            <sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
+            <sld:LineSymbolizer>
+                <sld:Stroke>
+                    <sld:CssParameter name="stroke">red</sld:CssParameter>
+                    <sld:CssParameter name="stroke-width">3</sld:CssParameter>
+                </sld:Stroke>
+            </sld:LineSymbolizer>
+        </sld:Rule>
+    </sld:FeatureTypeStyle>
+    <sld:FeatureTypeStyle>
+        <sld:Rule>
+            <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+                <ogc:PropertyIsEqualTo>
+                    <ogc:PropertyName>foo</ogc:PropertyName>
+                    <ogc:Literal>bar</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+            </ogc:Filter>
+            <sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
+            <sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
+            <sld:LineSymbolizer>
+                <sld:Stroke>
+                    <sld:CssParameter name="stroke">green</sld:CssParameter>
+                    <sld:CssParameter name="stroke-width">2</sld:CssParameter>
+                </sld:Stroke>
+            </sld:LineSymbolizer>
+        </sld:Rule>
+        <sld:Rule>
+            <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+                <ogc:PropertyIsEqualTo>
+                    <ogc:PropertyName>foo</ogc:PropertyName>
+                    <ogc:Literal>baz</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+            </ogc:Filter>
+            <sld:LineSymbolizer>
+                <sld:Stroke>
+                    <sld:CssParameter name="stroke">#000000</sld:CssParameter>
+                    <sld:CssParameter name="stroke-width">2</sld:CssParameter>
+                </sld:Stroke>
+            </sld:LineSymbolizer>
+        </sld:Rule>
+    </sld:FeatureTypeStyle>
+    <sld:FeatureTypeStyle>
+        <sld:Rule>
+            <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+                <ogc:PropertyIsEqualTo>
+                    <ogc:PropertyName>foo</ogc:PropertyName>
+                    <ogc:Literal>bar</ogc:Literal>
+                </ogc:PropertyIsEqualTo>
+            </ogc:Filter>
+            <sld:MinScaleDenominator>100000</sld:MinScaleDenominator>
+            <sld:MaxScaleDenominator>200000</sld:MaxScaleDenominator>
+            <sld:LineSymbolizer>
+                <sld:Stroke>
+                    <sld:CssParameter name="stroke">blue</sld:CssParameter>
+                    <sld:CssParameter name="stroke-width">1</sld:CssParameter>
+                </sld:Stroke>
+            </sld:LineSymbolizer>
+        </sld:Rule>
+    </sld:FeatureTypeStyle>
+</sld:UserStyle>
+--></div>
+</body> 
+</html> 
diff --git a/tests/Format/SOSCapabilities/v1_0_0.html b/tests/Format/SOSCapabilities/v1_0_0.html
new file mode 100644
index 0000000..7b13185
--- /dev/null
+++ b/tests/Format/SOSCapabilities/v1_0_0.html
@@ -0,0 +1,80 @@
+<html>
+<head>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script src="v1_0_0.js"></script>
+    <script type="text/javascript">
+
+    function test_read(t) {
+
+        t.plan(41);
+
+        var format = new OpenLayers.Format.SOSCapabilities();
+        var obj = format.read(doc);
+
+        t.eq(obj.version, "1.0.0", "Version parsed correctly");
+
+        // service identification (from OWSCommon)
+        t.eq(obj.serviceIdentification.abstract, "WeatherSOS (stable) at IfGI, Muenster, Germany. For more info: http://ifgipedia.uni-muenster.de/kms/documentation/swsl/sos/", "Abstract parsed correctly");
+        t.eq(obj.serviceIdentification.accessConstraints, "NONE", "AccessConstraints parsed correctly");
+        t.eq(obj.serviceIdentification.fees, "NONE", "Fees parsed correctly");
+        for (var key in obj.serviceIdentification.keywords) {
+            t.eq(key, "rain gauge, radiation, pressure, windspeed, winddirection, temperature", "Keywords parsed correctly");
+        }
+        t.eq(obj.serviceIdentification.serviceType.codeSpace, "http://opengeospatial.net", "codeSpace correctly parsed");
+        t.eq(obj.serviceIdentification.serviceType.value, "OGC:SOS", "ServiceType correctly parsed");
+        t.eq(obj.serviceIdentification.serviceTypeVersion, "1.0.0", "ServiceTypeVersion correctly parsed");
+        t.eq(obj.serviceIdentification.title, "IFGI WeatherSOS (stable)", "Title correctly parsed");
+
+        // service provider (from OWSCommon)
+        t.eq(obj.serviceProvider.providerName, "Institute for Geoinformatics, University of Muenster", "ProviderName correctly parsed");
+        t.eq(obj.serviceProvider.providerSite, "http://ifgi.uni-muenster.de", "ProviderSite correctly parsed");
+        t.eq(obj.serviceProvider.serviceContact.individualName, "Eike Hinderk Juerrens", "IndividualName parsed correctly");
+        t.eq(obj.serviceProvider.serviceContact.positionName, "Student Associate", "PositionName parsed correctly");
+        t.eq(obj.serviceProvider.serviceContact.role, "", "Role parsed correctly");
+        t.eq(obj.serviceProvider.serviceContact.contactInfo.address.administrativeArea, "NRW", "AdministrativeArea correctly parsed");
+        t.eq(obj.serviceProvider.serviceContact.contactInfo.address.city, "Muenster", "City correctly parsed");
+        t.eq(obj.serviceProvider.serviceContact.contactInfo.address.country, "Germany", "Country correctly parsed");
+        t.eq(obj.serviceProvider.serviceContact.contactInfo.address.deliveryPoint, "Weselerstrasse 253", "DeliveryPoint correctly parsed");
+        t.eq(obj.serviceProvider.serviceContact.contactInfo.address.electronicMailAddress, "ehjuerrens at uni-muenster.de", "ElectronicMailAddress correctly parsed");
+        t.eq(obj.serviceProvider.serviceContact.contactInfo.address.postalCode, "48149", "Postalcode correctly parsed");
+        t.eq(obj.serviceProvider.serviceContact.contactInfo.phone.voice, "+49-251-83-30088", "Voice phone correctly parsed");
+
+        // operationsMetadata (from OWSCommon)
+        t.eq(obj.operationsMetadata.DescribeSensor.dcp.http.post, "http://v-swe.uni-muenster.de:8080/WeatherSOS/sos", "POST url for DescribeSensor correctly parsed");
+        var counter = 0;
+        for (var key in obj.operationsMetadata.DescribeSensor.parameters.procedure.allowedValues) {
+            if (counter == 0) {
+                t.eq(key, "urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111", "Allowed value (1) for procedure parameter in DescribeSensor request correctly parsed");
+            } else if (counter == 1) {
+                t.eq(key, "urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93", "Allowed value (2) for procedure parameter in DescribeSensor request correctly parsed");
+            }
+            counter++;
+        }
+        t.eq(obj.operationsMetadata.GetFeatureOfInterest.parameters.location.anyValue, true, "AnyValue parsed correctly");
+
+        t.eq(obj.operationsMetadata.GetObservation.parameters.eventTime.allowedValues.range.maxValue, "2009-11-04T14:45:00+01", "Range maxValue parsed correctly");
+        t.eq(obj.operationsMetadata.GetObservation.parameters.eventTime.allowedValues.range.minValue, "2008-02-14T11:03:02+01", "Range minValue parsed correctly");
+
+        // Contents (from SOS)
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.name, "Pressure of the atmosphere", "Name of offering correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.observedProperties[0], "urn:x-ogc:def:property:OGC::BarometricPressure", "ObservedProperty correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.featureOfInterestIds[0], "urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93", "Allowed value (1) for featureOfInterest correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.featureOfInterestIds[1], "urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111", "Allowed value (2) for featureOfInterest correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.procedures[0], "urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93", "Allowed value (1) for procedures correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.procedures[1], "urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111", "Allowed value (2) for procedures correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.responseFormats[0], 'text/xml;subtype="om/1.0.0"', "Allowed value (1) for responseFormats correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.responseFormats[1], "application/zip", "Allowed value (2) for responseFormats correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.responseModes[0], "inline", "Allowed value (1) for responseModes correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.responseModes[1], "resultTemplate", "Allowed value (2) for responseModes correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.resultModels[0], "ns:Measurement", "Allowed value (1) for resultModels correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.resultModels[1], "ns:Observation", "Allowed value (2) for resultModels correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.time.timePeriod.beginPosition, "2008-12-20T02:29:27+01:00", "TimePeriod beginPosition correctly parsed");
+        t.eq(obj.contents.offeringList.ATMOSPHERIC_PRESSURE.time.timePeriod.endPosition, "2009-11-04T14:45:00+01:00", "TimePeriod endPosition correctly parsed");
+
+    }
+
+    </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Format/SOSCapabilities/v1_0_0.js b/tests/Format/SOSCapabilities/v1_0_0.js
new file mode 100644
index 0000000..78556f5
--- /dev/null
+++ b/tests/Format/SOSCapabilities/v1_0_0.js
@@ -0,0 +1,484 @@
+var doc = new OpenLayers.Format.XML().read(
+'<?xml version="1.0" encoding="UTF-8"?>' +
+'<sos:Capabilities version="1.0.0" updateSequence="2005-12-14T10:12:39+01" xsi:schemaLocation="http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd" xmlns:sos="http://www.opengis.net/sos/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">' +
+  '<ows:ServiceIdentification xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:om="http://www.opengis.net/om/1.0" xmlns:swe="http://www.opengis.net/swe/1.0">' +
+    '<ows:Title>IFGI WeatherSOS (stable)</ows:Title>' +
+    '<ows:Abstract>WeatherSOS (stable) at IfGI, Muenster, Germany. For more info: http://ifgipedia.uni-muenster.de/kms/documentation/swsl/sos/</ows:Abstract>' +
+    '<ows:Keywords>' +
+      '<ows:Keyword>rain gauge, radiation, pressure, windspeed, winddirection, temperature</ows:Keyword>' +
+    '</ows:Keywords>' +
+    '<ows:ServiceType codeSpace="http://opengeospatial.net">OGC:SOS</ows:ServiceType>' +
+    '<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>' +
+    '<ows:Fees>NONE</ows:Fees>' +
+    '<ows:AccessConstraints>NONE</ows:AccessConstraints>' +
+  '</ows:ServiceIdentification>' +
+  '<ows:ServiceProvider xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:om="http://www.opengis.net/om/1.0" xmlns:swe="http://www.opengis.net/swe/1.0">' +
+    '<ows:ProviderName>Institute for Geoinformatics, University of Muenster</ows:ProviderName>' +
+    '<ows:ProviderSite xlink:href="http://ifgi.uni-muenster.de"/>' +
+    '<ows:ServiceContact>' +
+      '<ows:IndividualName>Eike Hinderk Juerrens</ows:IndividualName>' +
+      '<ows:PositionName>Student Associate</ows:PositionName>' +
+      '<ows:ContactInfo>' +
+        '<ows:Phone>' +
+          '<ows:Voice>+49-251-83-30088</ows:Voice>' +
+        '</ows:Phone>' +
+        '<ows:Address>' +
+          '<ows:DeliveryPoint>Weselerstrasse 253</ows:DeliveryPoint>' +
+          '<ows:City>Muenster</ows:City>' +
+          '<ows:AdministrativeArea>NRW</ows:AdministrativeArea>' +
+          '<ows:PostalCode>48149</ows:PostalCode>' +
+          '<ows:Country>Germany</ows:Country>' +
+          '<ows:ElectronicMailAddress>ehjuerrens at uni-muenster.de</ows:ElectronicMailAddress>' +
+        '</ows:Address>' +
+      '</ows:ContactInfo>' +
+      '<ows:Role/>' +
+    '</ows:ServiceContact>' +
+  '</ows:ServiceProvider>' +
+  '<ows:OperationsMetadata xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:om="http://www.opengis.net/om/1.0" xmlns:swe="http://www.opengis.net/swe/1.0">' +
+    '<ows:Operation name="GetCapabilities">' +
+      '<ows:DCP>' +
+        '<ows:HTTP>' +
+          '<ows:Get xlink:href="http://v-swe.uni-muenster.de:8080/WeatherSOS/sos?"/>' +
+          '<ows:Post xlink:href="http://v-swe.uni-muenster.de:8080/WeatherSOS/sos"/>' +
+        '</ows:HTTP>' +
+      '</ows:DCP>' +
+      '<ows:Parameter name="service">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>SOS</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="updateSequence">' +
+        '<ows:AnyValue/>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="AcceptVersions">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>1.0.0</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="Sections">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>ServiceIdentification</ows:Value>' +
+          '<ows:Value>ServiceProvider</ows:Value>' +
+          '<ows:Value>OperationsMetadata</ows:Value>' +
+          '<ows:Value>Contents</ows:Value>' +
+          '<ows:Value>All</ows:Value>' +
+          '<ows:Value>Filter_Capabilities</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="AcceptFormats">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>text/xml</ows:Value>' +
+          '<ows:Value>application/zip</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+    '</ows:Operation>' +
+    '<ows:Operation name="GetObservation">' +
+      '<ows:DCP>' +
+        '<ows:HTTP>' +
+          '<ows:Post xlink:href="http://v-swe.uni-muenster.de:8080/WeatherSOS/sos"/>' +
+        '</ows:HTTP>' +
+      '</ows:DCP>' +
+      '<ows:Parameter name="version">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>1.0.0</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="service">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>SOS</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="srsName">' +
+        '<ows:AnyValue/>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="offering">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>ATMOSPHERIC_TEMPERATURE</ows:Value>' +
+          '<ows:Value>RAIN_GAUGE</ows:Value>' +
+          '<ows:Value>WIND_DIRECTION</ows:Value>' +
+          '<ows:Value>WIND_SPEED</ows:Value>' +
+          '<ows:Value>HUMIDITY</ows:Value>' +
+          '<ows:Value>LUMINANCE</ows:Value>' +
+          '<ows:Value>ATMOSPHERIC_PRESSURE</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="eventTime">' +
+        '<ows:AllowedValues>' +
+          '<ows:Range>' +
+            '<ows:MinimumValue>2008-02-14T11:03:02+01</ows:MinimumValue>' +
+            '<ows:MaximumValue>2009-11-04T14:45:00+01</ows:MaximumValue>' +
+          '</ows:Range>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="procedure">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111</ows:Value>' +
+          '<ows:Value>urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="observedProperty">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>urn:x-ogc:def:property:OGC::Temperature</ows:Value>' +
+          '<ows:Value>urn:x-ogc:def:property:OGC::Precipitation1Hour</ows:Value>' +
+          '<ows:Value>urn:x-ogc:def:property:OGC::WindDirection</ows:Value>' +
+          '<ows:Value>urn:x-ogc:def:property:OGC::WindSpeed</ows:Value>' +
+          '<ows:Value>urn:x-ogc:def:property:OGC::RelativeHumidity</ows:Value>' +
+          '<ows:Value>urn:x-ogc:def:property:OGC::Luminance</ows:Value>' +
+          '<ows:Value>urn:x-ogc:def:property:OGC::BarometricPressure</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="featureOfInterest">' +
+        '<ows:AnyValue/>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="result">' +
+        '<ows:AnyValue/>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="responseFormat">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>text/xml;subtype="OM/1.0.0"</ows:Value>' +
+          '<ows:Value>application/zip</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="resultModel">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>om:Observation</ows:Value>' +
+          '<ows:Value>om:CategoryObservation</ows:Value>' +
+          '<ows:Value>om:Measurement</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="responseMode">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>resultTemplate</ows:Value>' +
+          '<ows:Value>inline</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+    '</ows:Operation>' +
+    '<ows:Operation name="GetObservationById">' +
+      '<ows:DCP>' +
+        '<ows:HTTP>' +
+          '<ows:Post xlink:href="http://v-swe.uni-muenster.de:8080/WeatherSOS/sos"/>' +
+        '</ows:HTTP>' +
+      '</ows:DCP>' +
+      '<ows:Parameter name="version">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>1.0.0</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="service">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>SOS</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="srsName">' +
+        '<ows:AnyValue/>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="ObservationId">' +
+        '<ows:AnyValue/>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="responseFormat">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>text/xml;subtype="OM/1.0.0"</ows:Value>' +
+          '<ows:Value>application/zip</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="resultModel">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>om:Observation</ows:Value>' +
+          '<ows:Value>om:CategoryObservation</ows:Value>' +
+          '<ows:Value>om:Measurement</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="responseMode">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>inline</ows:Value>' +
+          '<ows:Value>resultTemplate</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+    '</ows:Operation>' +
+    '<ows:Operation name="DescribeSensor">' +
+      '<ows:DCP>' +
+        '<ows:HTTP>' +
+          '<ows:Post xlink:href="http://v-swe.uni-muenster.de:8080/WeatherSOS/sos"/>' +
+        '</ows:HTTP>' +
+      '</ows:DCP>' +
+      '<ows:Parameter name="version">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>1.0.0</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="service">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>SOS</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="outputFormat">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>text/xml;subtype="sensorML/1.0.1"</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="procedure">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111</ows:Value>' +
+          '<ows:Value>urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+    '</ows:Operation>' +
+    '<ows:Operation name="GetFeatureOfInterest">' +
+      '<ows:DCP>' +
+        '<ows:HTTP>' +
+          '<ows:Post xlink:href="http://v-swe.uni-muenster.de:8080/WeatherSOS/sos"/>' +
+        '</ows:HTTP>' +
+      '</ows:DCP>' +
+      '<ows:Parameter name="service">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>SOS</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="version">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>1.0.0</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="featureOfInterestId">' +
+        '<ows:AllowedValues>' +
+          '<ows:Value>urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93</ows:Value>' +
+          '<ows:Value>urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111</ows:Value>' +
+        '</ows:AllowedValues>' +
+      '</ows:Parameter>' +
+      '<ows:Parameter name="location">' +
+        '<ows:AnyValue/>' +
+      '</ows:Parameter>' +
+    '</ows:Operation>' +
+  '</ows:OperationsMetadata>' +
+  '<sos:Filter_Capabilities xmlns:ogc="http://www.opengis.net/ogc" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:om="http://www.opengis.net/om/1.0" xmlns:swe="http://www.opengis.net/swe/1.0">' +
+    '<ogc:Spatial_Capabilities>' +
+      '<ogc:GeometryOperands>' +
+        '<ogc:GeometryOperand>gml:Envelope</ogc:GeometryOperand>' +
+        '<ogc:GeometryOperand>gml:Polygon</ogc:GeometryOperand>' +
+        '<ogc:GeometryOperand>gml:Point</ogc:GeometryOperand>' +
+        '<ogc:GeometryOperand>gml:LineString</ogc:GeometryOperand>' +
+      '</ogc:GeometryOperands>' +
+      '<ogc:SpatialOperators>' +
+        '<ogc:SpatialOperator name="BBOX"/>' +
+        '<ogc:SpatialOperator name="Contains"/>' +
+        '<ogc:SpatialOperator name="Intersects"/>' +
+        '<ogc:SpatialOperator name="Overlaps"/>' +
+      '</ogc:SpatialOperators>' +
+    '</ogc:Spatial_Capabilities>' +
+    '<ogc:Temporal_Capabilities>' +
+      '<ogc:TemporalOperands>' +
+        '<ogc:TemporalOperand>gml:TimeInstant</ogc:TemporalOperand>' +
+        '<ogc:TemporalOperand>gml:TimePeriod</ogc:TemporalOperand>' +
+      '</ogc:TemporalOperands>' +
+      '<ogc:TemporalOperators>' +
+        '<ogc:TemporalOperator name="TM_During"/>' +
+        '<ogc:TemporalOperator name="TM_Equals"/>' +
+        '<ogc:TemporalOperator name="TM_After"/>' +
+        '<ogc:TemporalOperator name="TM_Before"/>' +
+      '</ogc:TemporalOperators>' +
+    '</ogc:Temporal_Capabilities>' +
+    '<ogc:Scalar_Capabilities>' +
+      '<ogc:ComparisonOperators>' +
+        '<ogc:ComparisonOperator>Between</ogc:ComparisonOperator>' +
+        '<ogc:ComparisonOperator>EqualTo</ogc:ComparisonOperator>' +
+        '<ogc:ComparisonOperator>NotEqualTo</ogc:ComparisonOperator>' +
+        '<ogc:ComparisonOperator>LessThan</ogc:ComparisonOperator>' +
+        '<ogc:ComparisonOperator>LessThanEqualTo</ogc:ComparisonOperator>' +
+        '<ogc:ComparisonOperator>GreaterThan</ogc:ComparisonOperator>' +
+        '<ogc:ComparisonOperator>GreaterThanEqualTo</ogc:ComparisonOperator>' +
+        '<ogc:ComparisonOperator>Like</ogc:ComparisonOperator>' +
+      '</ogc:ComparisonOperators>' +
+    '</ogc:Scalar_Capabilities>' +
+    '<ogc:Id_Capabilities>' +
+      '<ogc:FID/>' +
+      '<ogc:EID/>' +
+    '</ogc:Id_Capabilities>' +
+  '</sos:Filter_Capabilities>' +
+  '<sos:Contents>' +
+    '<sos:ObservationOfferingList>' +
+      '<sos:ObservationOffering gml:id="ATMOSPHERIC_TEMPERATURE">' +
+        '<gml:name>Temperature of the atmosphere</gml:name>' +
+        '<gml:boundedBy>' +
+          '<gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326">' +
+            '<gml:lowerCorner>46.611644 7.6103</gml:lowerCorner>' +
+            '<gml:upperCorner>51.9412 13.883498</gml:upperCorner>' +
+          '</gml:Envelope>' +
+        '</gml:boundedBy>' +
+        '<sos:time>' +
+          '<gml:TimePeriod xsi:type="gml:TimePeriodType">' +
+            '<gml:beginPosition>2008-11-20T15:20:22+01:00</gml:beginPosition>' +
+            '<gml:endPosition>2009-11-04T14:45:00+01:00</gml:endPosition>' +
+          '</gml:TimePeriod>' +
+        '</sos:time>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:observedProperty xlink:href="urn:x-ogc:def:property:OGC::Temperature"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:responseFormat>text/xml;subtype="om/1.0.0"</sos:responseFormat>' +
+        '<sos:responseFormat>application/zip</sos:responseFormat>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Measurement</sos:resultModel>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Observation</sos:resultModel>' +
+        '<sos:responseMode>inline</sos:responseMode>' +
+        '<sos:responseMode>resultTemplate</sos:responseMode>' +
+      '</sos:ObservationOffering>' +
+      '<sos:ObservationOffering gml:id="RAIN_GAUGE">' +
+        '<gml:name>Rain</gml:name>' +
+        '<gml:boundedBy>' +
+          '<gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326">' +
+            '<gml:lowerCorner>46.611644 7.6103</gml:lowerCorner>' +
+            '<gml:upperCorner>51.9412 13.883498</gml:upperCorner>' +
+          '</gml:Envelope>' +
+        '</gml:boundedBy>' +
+        '<sos:time>' +
+          '<gml:TimePeriod xsi:type="gml:TimePeriodType">' +
+            '<gml:beginPosition>2008-11-20T15:35:22+01:00</gml:beginPosition>' +
+            '<gml:endPosition>2009-11-04T14:45:00+01:00</gml:endPosition>' +
+          '</gml:TimePeriod>' +
+        '</sos:time>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:observedProperty xlink:href="urn:x-ogc:def:property:OGC::Precipitation1Hour"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:responseFormat>text/xml;subtype="om/1.0.0"</sos:responseFormat>' +
+        '<sos:responseFormat>application/zip</sos:responseFormat>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Measurement</sos:resultModel>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Observation</sos:resultModel>' +
+        '<sos:responseMode>inline</sos:responseMode>' +
+        '<sos:responseMode>resultTemplate</sos:responseMode>' +
+      '</sos:ObservationOffering>' +
+      '<sos:ObservationOffering gml:id="WIND_DIRECTION">' +
+        '<gml:name>Direction of the wind</gml:name>' +
+        '<gml:boundedBy>' +
+          '<gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326">' +
+            '<gml:lowerCorner>46.611644 7.6103</gml:lowerCorner>' +
+            '<gml:upperCorner>51.9412 13.883498</gml:upperCorner>' +
+          '</gml:Envelope>' +
+        '</gml:boundedBy>' +
+        '<sos:time>' +
+          '<gml:TimePeriod xsi:type="gml:TimePeriodType">' +
+            '<gml:beginPosition>2008-11-20T15:20:22+01:00</gml:beginPosition>' +
+            '<gml:endPosition>2009-11-04T14:45:00+01:00</gml:endPosition>' +
+          '</gml:TimePeriod>' +
+        '</sos:time>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:observedProperty xlink:href="urn:x-ogc:def:property:OGC::WindDirection"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:responseFormat>text/xml;subtype="om/1.0.0"</sos:responseFormat>' +
+        '<sos:responseFormat>application/zip</sos:responseFormat>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Measurement</sos:resultModel>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Observation</sos:resultModel>' +
+        '<sos:responseMode>inline</sos:responseMode>' +
+        '<sos:responseMode>resultTemplate</sos:responseMode>' +
+      '</sos:ObservationOffering>' +
+      '<sos:ObservationOffering gml:id="WIND_SPEED">' +
+        '<gml:name>Speed of the wind</gml:name>' +
+        '<gml:boundedBy>' +
+          '<gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326">' +
+            '<gml:lowerCorner>46.611644 7.6103</gml:lowerCorner>' +
+            '<gml:upperCorner>51.9412 13.883498</gml:upperCorner>' +
+          '</gml:Envelope>' +
+        '</gml:boundedBy>' +
+        '<sos:time>' +
+          '<gml:TimePeriod xsi:type="gml:TimePeriodType">' +
+            '<gml:beginPosition>2008-11-20T15:20:22+01:00</gml:beginPosition>' +
+            '<gml:endPosition>2009-11-04T14:45:00+01:00</gml:endPosition>' +
+          '</gml:TimePeriod>' +
+        '</sos:time>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:observedProperty xlink:href="urn:x-ogc:def:property:OGC::WindSpeed"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:responseFormat>text/xml;subtype="om/1.0.0"</sos:responseFormat>' +
+        '<sos:responseFormat>application/zip</sos:responseFormat>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Measurement</sos:resultModel>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Observation</sos:resultModel>' +
+        '<sos:responseMode>inline</sos:responseMode>' +
+        '<sos:responseMode>resultTemplate</sos:responseMode>' +
+      '</sos:ObservationOffering>' +
+      '<sos:ObservationOffering gml:id="HUMIDITY">' +
+        '<gml:name>Humidity of the atmosphere</gml:name>' +
+        '<gml:boundedBy>' +
+          '<gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326">' +
+            '<gml:lowerCorner>46.611644 7.6103</gml:lowerCorner>' +
+            '<gml:upperCorner>51.9412 13.883498</gml:upperCorner>' +
+          '</gml:Envelope>' +
+        '</gml:boundedBy>' +
+        '<sos:time>' +
+          '<gml:TimePeriod xsi:type="gml:TimePeriodType">' +
+            '<gml:beginPosition>2008-02-14T11:03:02+01:00</gml:beginPosition>' +
+            '<gml:endPosition>2009-11-04T14:45:00+01:00</gml:endPosition>' +
+          '</gml:TimePeriod>' +
+        '</sos:time>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:observedProperty xlink:href="urn:x-ogc:def:property:OGC::RelativeHumidity"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:responseFormat>text/xml;subtype="om/1.0.0"</sos:responseFormat>' +
+        '<sos:responseFormat>application/zip</sos:responseFormat>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Measurement</sos:resultModel>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Observation</sos:resultModel>' +
+        '<sos:responseMode>inline</sos:responseMode>' +
+        '<sos:responseMode>resultTemplate</sos:responseMode>' +
+      '</sos:ObservationOffering>' +
+      '<sos:ObservationOffering gml:id="LUMINANCE">' +
+        '<gml:name>Luminance</gml:name>' +
+        '<gml:boundedBy>' +
+          '<gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326">' +
+            '<gml:lowerCorner>46.611644 7.6103</gml:lowerCorner>' +
+            '<gml:upperCorner>51.9412 13.883498</gml:upperCorner>' +
+          '</gml:Envelope>' +
+        '</gml:boundedBy>' +
+        '<sos:time>' +
+          '<gml:TimePeriod xsi:type="gml:TimePeriodType">' +
+            '<gml:beginPosition>2008-11-20T15:20:22+01:00</gml:beginPosition>' +
+            '<gml:endPosition>2009-11-04T14:45:00+01:00</gml:endPosition>' +
+          '</gml:TimePeriod>' +
+        '</sos:time>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:observedProperty xlink:href="urn:x-ogc:def:property:OGC::Luminance"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:responseFormat>text/xml;subtype="om/1.0.0"</sos:responseFormat>' +
+        '<sos:responseFormat>application/zip</sos:responseFormat>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Measurement</sos:resultModel>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Observation</sos:resultModel>' +
+        '<sos:responseMode>inline</sos:responseMode>' +
+        '<sos:responseMode>resultTemplate</sos:responseMode>' +
+      '</sos:ObservationOffering>' +
+      '<sos:ObservationOffering gml:id="ATMOSPHERIC_PRESSURE">' +
+        '<gml:name>Pressure of the atmosphere</gml:name>' +
+        '<gml:boundedBy>' +
+          '<gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326">' +
+            '<gml:lowerCorner>46.611644 7.6103</gml:lowerCorner>' +
+            '<gml:upperCorner>51.9412 13.883498</gml:upperCorner>' +
+          '</gml:Envelope>' +
+        '</gml:boundedBy>' +
+        '<sos:time>' +
+          '<gml:TimePeriod xsi:type="gml:TimePeriodType">' +
+            '<gml:beginPosition>2008-12-20T02:29:27+01:00</gml:beginPosition>' +
+            '<gml:endPosition>2009-11-04T14:45:00+01:00</gml:endPosition>' +
+          '</gml:TimePeriod>' +
+        '</sos:time>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:observedProperty xlink:href="urn:x-ogc:def:property:OGC::BarometricPressure"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93"/>' +
+        '<sos:featureOfInterest xlink:href="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111"/>' +
+        '<sos:responseFormat>text/xml;subtype="om/1.0.0"</sos:responseFormat>' +
+        '<sos:responseFormat>application/zip</sos:responseFormat>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Measurement</sos:resultModel>' +
+        '<sos:resultModel xmlns:ns="http://www.opengis.net/om/1.0">ns:Observation</sos:resultModel>' +
+        '<sos:responseMode>inline</sos:responseMode>' +
+        '<sos:responseMode>resultTemplate</sos:responseMode>' +
+      '</sos:ObservationOffering>' +
+    '</sos:ObservationOfferingList>' +
+  '</sos:Contents>' +
+'</sos:Capabilities>'
+);
\ No newline at end of file
diff --git a/tests/Format/SOSGetFeatureOfInterest.html b/tests/Format/SOSGetFeatureOfInterest.html
new file mode 100644
index 0000000..87b4509
--- /dev/null
+++ b/tests/Format/SOSGetFeatureOfInterest.html
@@ -0,0 +1,80 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_read_SOSGetFeatureOfInterest_single(t) {
+        t.plan(6);
+
+        var parser = new OpenLayers.Format.SOSGetFeatureOfInterest();
+        var text =
+            '<?xml version="1.0" encoding="UTF-8"?>' +
+            '<sa:SamplingPoint xmlns:sa="http://www.opengis.net/sampling/1.0" xmlns:gml="http://www.opengis.net/gml" gml:id="urn:ogc:object:feature:OSIRIS-HWS:4fc335bc-06d7-4d5e-a72a-1ac73b9f3b56">' +
+            '<gml:name>Roof of the IfGI</gml:name>' +
+            '<sa:position>' +
+            '<gml:Point>' +
+            '<gml:pos srsName="urn:ogc:def:crs:EPSG:4326">52.1524 5.3722</gml:pos>' +
+            '</gml:Point>' +
+            '</sa:position>' +
+            '</sa:SamplingPoint>';
+
+        var res = parser.read(text);
+        t.eq(res.length, 1, "One feature parsed from response");
+        t.eq(res[0].attributes.id, "urn:ogc:object:feature:OSIRIS-HWS:4fc335bc-06d7-4d5e-a72a-1ac73b9f3b56", "gml:id correctly parsed");
+        t.eq(res[0].attributes.name, "Roof of the IfGI", "gml:name correctly parsed");
+        t.eq(res[0].geometry instanceof OpenLayers.Geometry.Point, true, "Geometry is a point geometry");
+        t.eq(res[0].geometry.x, 5.3722, "Geometry x coordinate correctly parsed");
+        t.eq(res[0].geometry.y, 52.1524, "Geometry y coordinate correctly parsed");
+    }
+
+    function test_read_SOSGetFeatureOfInterest_multiple(t) {
+        t.plan(6);
+
+        var parser = new OpenLayers.Format.SOSGetFeatureOfInterest();
+        var text =
+            '<?xml version="1.0" encoding="UTF-8"?>' +
+            '<gml:FeatureCollection xmlns:gml="http://www.opengis.net/gml" xmlns:sa="http://www.opengis.net/sampling/1.0">' +
+            '<gml:featureMember>' +
+            '<sa:SamplingPoint gml:id="urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93">' +
+            '<gml:name>weather @ roof of the ifgi, MS, Germany</gml:name>' +
+            '<sa:position>' +
+            '<gml:Point>' +
+            '<gml:pos srsName="urn:ogc:def:crs:EPSG:4326">51.9412 7.6103</gml:pos>' +
+            '</gml:Point>' +
+            '</sa:position>' +
+            '</sa:SamplingPoint>' +
+            '</gml:featureMember>' +
+            '<gml:featureMember>' +
+            '<sa:SamplingPoint gml:id="urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111">' +
+            '<gml:name>waether @ roof of the FH Kaernten, Villach, Austria</gml:name>' +
+            '<sa:position>' +
+            '<gml:Point>' +
+            '<gml:pos srsName="urn:ogc:def:crs:EPSG:4326">46.611644 13.883498</gml:pos>' +
+            '</gml:Point>' +
+            '</sa:position>' +
+            '</sa:SamplingPoint>' +
+            '</gml:featureMember>' +
+            '</gml:FeatureCollection>';
+
+        var res = parser.read(text);
+        t.eq(res.length, 2, "Two features parsed from response");
+        t.eq(res[0].attributes.id, "urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93", "gml:id correctly parsed");
+        t.eq(res[1].attributes.name, "waether @ roof of the FH Kaernten, Villach, Austria", "gml:name correctly parsed");
+        t.eq(res[1].geometry instanceof OpenLayers.Geometry.Point, true, "Geometry is a point geometry");
+        t.eq(res[1].geometry.x, 13.883498, "Geometry x coordinate correctly parsed");
+        t.eq(res[1].geometry.y, 46.611644, "Geometry y coordinate correctly parsed");
+    }
+
+    function test_write_SOSGetFeatureOfInterest(t) {
+        t.plan(1);
+        var expect = '<GetFeatureOfInterest xmlns="http://www.opengis.net/sos/1.0" version="1.0.0" service="SOS" xsi:schemaLocation="http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><FeatureOfInterestId>urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93</FeatureOfInterestId><FeatureOfInterestId>urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111</FeatureOfInterestId [...]
+        var format = new OpenLayers.Format.SOSGetFeatureOfInterest();
+        var output = format.writeNode("sos:GetFeatureOfInterest", {fois: ['urn:ogc:object:feature:OSIRIS-HWS:3d3b239f-7696-4864-9d07-15447eae2b93', 'urn:ogc:object:feature:OSIRIS-HWS:efeb807b-bd24-4128-a920-f6729bcdd111']});
+        t.xml_eq(output, expect, "Request XML is written out correctly");
+    }
+
+    </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Format/SOSGetObservation.html b/tests/Format/SOSGetObservation.html
new file mode 100644
index 0000000..978c09a
--- /dev/null
+++ b/tests/Format/SOSGetObservation.html
@@ -0,0 +1,68 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_read_SOSGetObservation(t) {
+        t.plan(7);
+
+        var parser = new OpenLayers.Format.SOSGetObservation();
+        var text =
+            '<?xml version="1.0" encoding="UTF-8"?>' +
+            '<om:ObservationCollection xmlns:om="http://www.opengis.net/om/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sa="http://www.opengis.net/sampling/1.0" gml:id="oc_0" xsi:schemaLocation="http://www.opengis.net/om/1.0 http://schemas.opengis.net/om/1.0.0/om.xsd http://www.opengis.net/sampling/1.0 http://schemas.opengis.net/sampling/1.0.0/sampling.xsd">' +
+            '<gml:boundedBy>' +
+            '<gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326">' +
+            '<gml:lowerCorner>52.1524 5.3722</gml:lowerCorner>' +
+            '<gml:upperCorner>52.1524 5.3722</gml:upperCorner>' +
+            '</gml:Envelope>' +
+            '</gml:boundedBy>' +
+            '<om:member>' +
+            '<om:Measurement gml:id="o_51082">' +
+            '<om:samplingTime>' +
+            '<gml:TimeInstant xsi:type="gml:TimeInstantType">' +
+            '<gml:timePosition>2009-12-02T10:35:00.000+01:00</gml:timePosition>' +
+            '</gml:TimeInstant>' +
+            '</om:samplingTime>' +
+            '<om:procedure xlink:href="urn:ogc:object:feature:OSIRIS-HWS:4fc335bc-06d7-4d5e-a72a-1ac73b9f3b56"/>' +
+            '<om:observedProperty xlink:href="urn:x-ogc:def:property:OGC::Temperature"/>' +
+            '<om:featureOfInterest>' +
+            '<sa:SamplingPoint gml:id="urn:ogc:object:feature:OSIRIS-HWS:4fc335bc-06d7-4d5e-a72a-1ac73b9f3b56">' +
+            '<gml:name>Roof of the IfGI</gml:name>' +
+            '<sa:position>' +
+            '<gml:Point>' +
+            '<gml:pos srsName="urn:ogc:def:crs:EPSG:4326">52.1524 5.3722</gml:pos>' +
+            '</gml:Point>' +
+            '</sa:position>' +
+            '</sa:SamplingPoint>' +
+            '</om:featureOfInterest>' +
+            '<om:result uom="Cel">4.9</om:result>' +
+            '</om:Measurement>' +
+            '</om:member>' +
+            '</om:ObservationCollection>';
+
+        var res = parser.read(text);
+        t.eq(res.measurements.length, 1, "One measurement parsed");
+        t.eq(res.id, "oc_0", "Observation collection id correctly parsed");
+        var measurement = res.measurements[0];
+        t.eq(measurement.observedProperty, "urn:x-ogc:def:property:OGC::Temperature", "Observed property correctly parsed");
+        t.eq(measurement.procedure, "urn:ogc:object:feature:OSIRIS-HWS:4fc335bc-06d7-4d5e-a72a-1ac73b9f3b56", "Procedure correctly parsed");
+        t.eq(measurement.result.uom, "Cel", "Units of measurement correctly parsed");
+        t.eq(measurement.result.value, "4.9", "Value correctly parsed");
+        t.eq(measurement.samplingTime.timeInstant.timePosition, "2009-12-02T10:35:00.000+01:00", "Sampling time correctly parsed");
+    }
+
+    function test_write_SOSGetObservation(t) {
+        t.plan(1);
+        var expect = '<GetObservation xmlns="http://www.opengis.net/sos/1.0" version="1.0.0" service="SOS" xsi:schemaLocation="http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosGetObservation.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><offering>TEMPERATURE</offering><eventTime><ogc:TM_Equals xmlns:ogc="http://www.opengis.net/ogc"><ogc:PropertyName>urn:ogc:data:time:iso8601</ogc:PropertyName><gml:TimeInstant xmlns:gml="http://www.opengis.net/gml"><gml: [...]
+        var format = new OpenLayers.Format.SOSGetObservation();
+        var output = format.write({eventTime: 'latest', resultModel: 'Measurement', responseMode: 'inline',
+            procedure: 'urn:ogc:object:feature:OSIRIS-HWS:4fc335bc-06d7-4d5e-a72a-1ac73b9f3b56', responseFormat: 'text/xml;subtype="om/1.0.0"',
+            offering: 'TEMPERATURE', observedProperty: 'urn:x-ogc:def:property:OGC::Temperature'});
+        t.xml_eq(output, expect, "Request XML is written out correctly");
+    }
+
+    </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Format/Text.html b/tests/Format/Text.html
new file mode 100644
index 0000000..2b46ced
--- /dev/null
+++ b/tests/Format/Text.html
@@ -0,0 +1,49 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+    function test_basic(t) {
+        t.plan(5);
+        var format = new OpenLayers.Format.Text({extractStyles: true});
+        var features = format.read(OpenLayers.Util.getElement("content").value);
+        t.eq(features[0].style.externalGraphic, format.defaultStyle.externalGraphic, "style is set to defaults if no style props set in text file");
+        var features = format.read(OpenLayers.Util.getElement("contentMarker").value);
+        t.eq(features[0].style.externalGraphic, "../../img/marker.png", "marker set correctly by default.");
+        
+        var features = format.read(OpenLayers.Util.getElement("content2").value);
+        t.eq(features.length, 2, "two features read");
+        t.eq(features[0].style.externalGraphic, "marker.png", "marker set correctly from data.");
+        // t.eq(format.defaultStyle.externalGraphic, "../../img/marker.png", "defaultStyle externalGraphic not changed by pulling from data");
+
+        var format = new OpenLayers.Format.Text({extractStyles: false});
+        var features = format.read(OpenLayers.Util.getElement("content2").value);
+        t.eq(features[0].style, null, "extractStyles: false results in null style property, even with style properties used");
+    }
+	function test_extra(t) {
+        t.plan(1);
+        var format = new OpenLayers.Format.Text();
+        var features = format.read(OpenLayers.Util.getElement("content3").value);
+        t.eq(features[0].attributes.whee, "chicken", "extra attributes are stored for later use");
+	}
+    </script>
+</head>
+<body>
+<textarea id="content">
+point
+5,5
+</textarea>
+<textarea id="contentMarker">
+point	iconSize
+5,5	8,8
+</textarea>
+<textarea id="content2">
+point	icon
+5,5	marker.png
+10,10	marker2.png
+</textarea>
+<textarea id="content3">
+point	whee
+5,5	chicken	
+</textarea>
+</body>
+</html>
diff --git a/tests/Format/WFS.html b/tests/Format/WFS.html
new file mode 100644
index 0000000..113e219
--- /dev/null
+++ b/tests/Format/WFS.html
@@ -0,0 +1,81 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script>  
+    function test_wfs_update_node(t) {
+        t.plan(2);
+        var expected = readXML("Update");
+        var updateFeature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(1,2),
+            {foo: "bar"});
+        updateFeature.fid = "fid.42";
+        updateFeature.state = OpenLayers.State.UPDATE;
+        var format = new OpenLayers.Format.WFS({
+            'featureNS':'http://www.openplans.org/topp',
+            'featureName': 'states',
+            'geometryName': 'the_geom',
+            'featurePrefix': 'topp'
+        }, {options:{}});
+        var updateNode = format.update(updateFeature);
+        t.xml_eq(updateNode, expected, "update node matches expected XML value.");
+        var format = new OpenLayers.Format.WFS({
+            'featurePrefix': 'topp'
+        }, {options:{typename: 'states', 'featureNS': 'http://www.openplans.org/topp', 'geometry_column': 'the_geom' }});
+        var updateNode = format.update(updateFeature);
+        t.xml_eq(updateNode, expected, "update node matches expected XML value.");
+    }
+    function test_wfs_delete_node(t) {
+        t.plan(2);
+        var expected = readXML("Delete");
+        var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
+        feature.state = OpenLayers.State.DELETE;
+        feature.fid = "fid.37";
+        var format = new OpenLayers.Format.WFS({
+            'featureNS':'http://www.openplans.org/topp',
+            'featureName': 'states',
+            'featurePrefix': 'topp'
+        }, {options:{}});
+        var deleteNode = format.remove(feature);
+        t.xml_eq(deleteNode, expected, "delete node matches expected XML value.");
+        var format = new OpenLayers.Format.WFS({
+            'featurePrefix': 'topp'
+        }, {options:{typename: 'states', 'featureNS': 'http://www.openplans.org/topp'}});
+        var deleteNode = format.remove(feature);
+        t.xml_eq(deleteNode, expected, "delete node matches expected XML value.");
+    }
+    function readXML(id) {
+        var xml = document.getElementById(id).firstChild.nodeValue;
+        return new OpenLayers.Format.XML().read(xml).documentElement;        
+    }
+
+  </script>
+</head>
+<body>
+<div id="Update"><!--
+<wfs:Update xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+    <wfs:Property>
+        <wfs:Name>the_geom</wfs:Name>
+        <wfs:Value>
+            <gml:Point xmlns:gml="http://www.opengis.net/gml">
+                <gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates>
+            </gml:Point>
+        </wfs:Value>
+    </wfs:Property>
+    <wfs:Property>
+        <wfs:Name>foo</wfs:Name>
+        <wfs:Value>bar</wfs:Value>
+    </wfs:Property>
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+        <ogc:FeatureId fid="fid.42"/>
+    </ogc:Filter>
+</wfs:Update>
+--></div>
+<div id="Delete"><!--
+<wfs:Delete xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+        <ogc:FeatureId fid="fid.37"/>
+    </ogc:Filter>
+</wfs:Delete>
+--></div>
+</body>
+</html>
diff --git a/tests/Format/WFSCapabilities.html b/tests/Format/WFSCapabilities.html
new file mode 100644
index 0000000..7de3397
--- /dev/null
+++ b/tests/Format/WFSCapabilities.html
@@ -0,0 +1,43 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_read(t) {
+        t.plan(4);
+       
+        var _v1_0_0 = OpenLayers.Format.WFSCapabilities.v1_0_0.prototype.read;
+        var _v1_1_0 = OpenLayers.Format.WFSCapabilities.v1_1_0.prototype.read;
+
+        var parser = new OpenLayers.Format.WFSCapabilities();
+
+        // version 1.0.0
+        var text =
+            '<?xml version="1.0" encoding="UTF-8"?>' +
+            '<wfs:WFS_Capabilities version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs"></wfs:WFS_Capabilities>';
+        OpenLayers.Format.WFSCapabilities.v1_0_0.prototype.read = function() {
+            t.ok(true, "Version 1.0.0 detected");
+            return {};
+        }
+        var res = parser.read(text);
+        t.eq(res.version, "1.0.0", "version 1.0.0 written to result object");
+        OpenLayers.Format.WFSCapabilities.v1_1_0.prototype.read = _v1_1_0;
+
+        // version 1.1.0
+        var text =
+            '<?xml version="1.0" encoding="UTF-8"?>' +
+            '<wfs:WFS_Capabilities version="1.1.0" xmlns:wfs="http://www.opengis.net/wfs"></wfs:WFS_Capabilities>';
+        OpenLayers.Format.WFSCapabilities.v1_1_0.prototype.read = function() {
+            t.ok(true, "Version 1.1.0 detected");
+            return {};
+        }
+        var res = parser.read(text);
+        t.eq(res.version, "1.1.0", "version 1.1.0 written to result object");
+        OpenLayers.Format.WFSCapabilities.v1_1_0.prototype.read = _v1_1_0;
+    }
+
+    </script> 
+</head> 
+<body>
+</body> 
+</html>
\ No newline at end of file
diff --git a/tests/Format/WFSCapabilities/v1.html b/tests/Format/WFSCapabilities/v1.html
new file mode 100644
index 0000000..a22f03a
--- /dev/null
+++ b/tests/Format/WFSCapabilities/v1.html
@@ -0,0 +1,153 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_read(t) {
+        t.plan(30);
+       
+        var parser = new OpenLayers.Format.WFSCapabilities();
+
+        // GeoServer, v1.1.0
+        var text = '<?xml version="1.0" encoding="UTF-8"?><wfs:WFS_Capabilities version="1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ows="http://www.opengis.net/ows" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/wfs http://localhost:80/geoserver/schemas/wfs/1.1.0/wfs.xsd" xmln [...]
+        var res = parser.read(text);
+        var ft = res.featureTypeList.featureTypes;
+        t.eq(ft.length, 14, "number of feature types correct");
+        t.eq(ft[0]["abstract"], "Manhattan landmarks, identifies water, lakes, parks, interesting buildilngs", "abstract of first feature type correct");
+        t.eq(ft[0]["title"], "Manhattan (NY) landmarks", "title of first feature type correct");
+        t.eq(ft[0]["name"], "poly_landmarks", "name of first feature type correct");
+        t.eq(ft[0]["featureNS"], "http://www.census.gov", "ns of first feature type correct");
+
+        // GeoServer, v1.0.0
+        text = '<?xml version="1.0" encoding="UTF-8"?><WFS_Capabilities version="1.0.0" xmlns="http://www.opengis.net/wfs" xmlns:it.geosolutions="http://www.geo-solutions.it" xmlns:cite="http://www.opengeospatial.net/cite" xmlns:tiger="http://www.census.gov" xmlns:sde="http://geoserver.sf.net" xmlns:topp="http://www.openplans.org/topp" xmlns:sf="http://www.openplans.org/spearfish" xmlns:nurc="http://www.nurc.nato.int" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/20 [...]
+        res = parser.read(text);
+        ft = res.featureTypeList.featureTypes;
+        t.eq(ft.length, 14, "number of feature types correct");
+        t.eq(ft[0]["abstract"], "Manhattan landmarks, identifies water, lakes, parks, interesting buildilngs", "abstract of first feature type correct");
+        t.eq(ft[0]["title"], "Manhattan (NY) landmarks", "title of first feature type correct");
+        t.eq(ft[0]["name"], "poly_landmarks", "name of first feature type correct");
+        t.eq(ft[0]["featureNS"], "http://www.census.gov", "ns of first feature type correct");
+
+        var service = res.service;
+        t.eq(service.name, 'WFS', "service name correct");
+        t.eq(service.title, 'GeoServer Web Feature Service', "service title correct");
+        t.eq(service.abstract, 'This is the reference implementation of WFS 1.0.0 and WFS 1.1.0, supports all WFS operations including Transaction.', "service title correct");
+        t.eq(service.keywords[0], 'WFS', "service keyword [0] correct");
+        t.eq(service.keywords[2], 'GEOSERVER', "service keyword [2] correct");
+        t.eq(service.onlineResource, 'http://localhost:80/geoserver/wfs', "service onlineresource correct");
+        t.ok(typeof service.fees == 'undefined', "service fees correct");
+        t.ok(typeof service.accessConstraints == 'undefined', "service accessconstraints correct");
+        
+        t.eq(res.capability.request.getfeature.href.post, "http://localhost:80/geoserver/wfs?", "getfeature request post href correct");
+        t.eq(res.capability.request.getfeature.href.get, "http://localhost:80/geoserver/wfs?request=GetFeature", "getfeature request get href correct");
+        
+        t.eq(res.capability.request.getfeature.formats[0], "GML2", "getfeature response format [0] correct");
+        t.eq(res.capability.request.getfeature.formats[4], "GML3", "getfeature response format [4] correct");
+        
+        // UMN Mapserer, v1.0.0
+        text =
+            '<?xml version="1.0" encoding="ISO-8859-1" ?>' +
+            '<WFS_Capabilities' +
+            '   version="1.0.0"' +
+            '   updateSequence="0"' +
+            '   xmlns="http://www.opengis.net/wfs"' +
+            '   xmlns:ogc="http://www.opengis.net/ogc"' +
+            '   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            '   xsi:schemaLocation="http://www.opengis.net/wfs http://ogc.dmsolutions.ca/wfs/1.0.0/WFS-capabilities.xsd">' +
+            '' +
+            '<!-- MapServer version 4.0 (development) OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=PDF OUTPUT=SWF SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE -->' +
+            '' +
+            '<Service>' +
+            '  <Name>MapServer WFS</Name>' +
+            '  <Title>GMap WMS Demo Server</Title>' +
+            '  <OnlineResource>http://127.0.0.1/cgi-bin/mapserv_40?map=/msroot/apache/htdocs/gmap/htdocs/gmap75_wfs.map&service=WFS&</OnlineResource>' +
+            '</Service>' +
+            '' +
+            '<Capability>' +
+            '  <Request>' +
+            '    <GetCapabilities>' +
+            '      <DCPType>' +
+            '        <HTTP>' +
+            '          <Get onlineResource="http://127.0.0.1/cgi-bin/mapserv_40?map=/msroot/apache/htdocs/gmap/htdocs/gmap75_wfs.map&service=WFS&" />' +
+            '        </HTTP>' +
+            '      </DCPType>' +
+            '    </GetCapabilities>' +
+            '' +
+            '    <DescribeFeatureType>' +
+            '      <SchemaDescriptionLanguage>' +
+            '        <XMLSCHEMA/>' +
+            '      </SchemaDescriptionLanguage>' +
+            '      <DCPType>' +
+            '        <HTTP>' +
+            '          <Get onlineResource="http://127.0.0.1/cgi-bin/mapserv_40?map=/msroot/apache/htdocs/gmap/htdocs/gmap75_wfs.map&service=WFS&" />' +
+            '        </HTTP>' +
+            '      </DCPType>' +
+            '' +
+            '    </DescribeFeatureType>' +
+            '    <GetFeature>' +
+            '      <ResultFormat>' +
+            '        <GML2/>' +
+            '      </ResultFormat>' +
+            '      <DCPType>' +
+            '        <HTTP>' +
+            '          <Get onlineResource="http://127.0.0.1/cgi-bin/mapserv_40?map=/msroot/apache/htdocs/gmap/htdocs/gmap75_wfs.map&service=WFS&" />' +
+            '        </HTTP>' +
+            '' +
+            '      </DCPType>' +
+            '    </GetFeature>' +
+            '  </Request>' +
+            '</Capability>' +
+            '' +
+            '<FeatureTypeList>' +
+            '  <Operations>' +
+            '    <Query/>' +
+            '  </Operations>' +
+            '    <FeatureType>' +
+            '' +
+            '        <Name>park</Name>' +
+            '        <Title>Parks</Title>' +
+            '        <SRS>EPSG:42304</SRS>' +
+            '        <LatLongBoundingBox minx="-173.433" miny="41.4271" maxx="-13.3643" maxy="83.7466" />' +
+            '    </FeatureType>' +
+            '    <FeatureType>' +
+            '        <Name>popplace</Name>' +
+            '' +
+            '        <Title>Cities</Title>' +
+            '        <SRS>EPSG:42304</SRS>' +
+            '        <LatLongBoundingBox minx="-172.301" miny="36.3541" maxx="-12.9698" maxy="83.4832" />' +
+            '    </FeatureType>' +
+            '</FeatureTypeList>' +
+            '' +
+            '<ogc:Filter_Capabilities>' +
+            '  <ogc:Spatial_Capabilities>' +
+            '    <ogc:Spatial_Operators>' +
+            '' +
+            '      <ogc:BBOX/>' +
+            '    </ogc:Spatial_Operators>' +
+            '  </ogc:Spatial_Capabilities>' +
+            '  <!-- Provide some ScalarCapabilties just for the XML to validate against the schema even if we don\'t support any.  (Yes this is stupid!) -->' +
+            '  <ogc:Scalar_Capabilities>' +
+            '    <ogc:Logical_Operators />' +
+            '  </ogc:Scalar_Capabilities>' +
+            '</ogc:Filter_Capabilities>' +
+            '' +
+            '</WFS_Capabilities>';
+        res = parser.read(text);
+        var ft = res.featureTypeList.featureTypes;
+        t.eq(ft.length, 2, "number of feature types correct");
+        t.eq(ft[0]["title"], "Parks", "title of first feature type correct");
+        t.eq(ft[0]["name"], "park", "name of first feature type correct");
+        
+        var service = res.service;
+        t.eq(service.name, 'MapServer WFS', "service name correct");
+        t.eq(service.title, 'GMap WMS Demo Server', "service title correct");
+        t.eq(service.onlineResource, 'http://127.0.0.1/cgi-bin/mapserv_40?map=/msroot/apache/htdocs/gmap/htdocs/gmap75_wfs.map&service=WFS&', "service onlineresource correct");
+        t.eq(res.capability.request.getfeature.href.get, "http://127.0.0.1/cgi-bin/mapserv_40?map=/msroot/apache/htdocs/gmap/htdocs/gmap75_wfs.map&service=WFS&", "getfeature request get href correct");
+        t.eq(res.capability.request.getfeature.formats[0], "GML2", "getfeature response format [0] correct");        
+    }
+
+    </script> 
+</head> 
+<body>
+</body> 
+</html>
diff --git a/tests/Format/WFSDescribeFeatureType.html b/tests/Format/WFSDescribeFeatureType.html
new file mode 100644
index 0000000..d191d4f
--- /dev/null
+++ b/tests/Format/WFSDescribeFeatureType.html
@@ -0,0 +1,381 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_read_WFSDescribeFeatureType(t) {
+        t.plan(39);
+       
+        var parser = new OpenLayers.Format.WFSDescribeFeatureType();
+
+        // single typeName from UMN Mapserver
+        var text = 
+            '<?xml version="1.0" encoding="ISO-8859-1" ?>' +
+            '<schema' +
+            '   targetNamespace="http://mapserver.gis.umn.edu/mapserver" ' +
+            '   xmlns:rws="http://mapserver.gis.umn.edu/mapserver" ' +
+            '   xmlns:ogc="http://www.opengis.net/ogc"' +
+            '   xmlns:xsd="http://www.w3.org/2001/XMLSchema"' +
+            '   xmlns="http://www.w3.org/2001/XMLSchema"' +
+            '   xmlns:gml="http://www.opengis.net/gml"' +
+            '   elementFormDefault="qualified" version="0.1" >' +
+            '  <import namespace="http://www.opengis.net/gml"' +
+            '          schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />' +
+            '  <element name="AAA64" ' +
+            '           type="rws:AAA64Type" ' +
+            '           substitutionGroup="gml:_Feature" />' +
+            '  <complexType name="AAA64Type">' +
+            '    <complexContent>' +
+            '      <extension base="gml:AbstractFeatureType">' +
+            '        <sequence>' +
+            '          <element name="geometry" type="gml:MultiLineStringPropertyType" minOccurs="0" maxOccurs="1"/>' +
+            '          <element name="OBJECTID" type="string"/>' +
+            '          <element name="ROUTE" type="string"/>' +
+            '          <element name="ROUTE_CH" type="string"/>' +
+            '          <element name="COUNT" type="string"/>' +
+            '          <element name="BEHEERDER" type="string"/>' +
+            '          <element name="LENGTH" type="string"/>' +
+            '          <element name="SHAPE" type="string"/>' +
+            '          <element name="SE_ANNO_CAD_DATA" type="string"/>' +
+            '        </sequence>' +
+            '      </extension>' +
+            '    </complexContent>' +
+            '  </complexType>' +
+            '</schema>';
+        var res = parser.read(text);
+
+        t.eq(res.featureTypes.length, 1,
+            "There is only 1 typename, so length should be 1");
+
+        t.eq(res.featureTypes[0].properties[0].type, 'gml:MultiLineStringPropertyType',
+            "The first attribute is of type multi line string");
+
+        t.eq(res.featureTypes[0].properties[2].name, 'ROUTE',
+            "The third attribute is named ROUTE");
+
+        t.eq(res.featureTypes[0].properties[2].type, 'string',
+            "The third attribute is of type string");
+
+        // three typeNames in one response from UMN Mapserver
+        text = 
+            '<?xml version="1.0" encoding="ISO-8859-1" ?>' +
+            '<schema' +
+            '   targetNamespace="http://mapserver.gis.umn.edu/mapserver" ' +
+            '   xmlns:rws="http://mapserver.gis.umn.edu/mapserver" ' +
+            '   xmlns:ogc="http://www.opengis.net/ogc"' +
+            '   xmlns:xsd="http://www.w3.org/2001/XMLSchema"' +
+            '   xmlns="http://www.w3.org/2001/XMLSchema"' +
+            '   xmlns:gml="http://www.opengis.net/gml"' +
+            '   elementFormDefault="qualified" version="0.1" >' +
+            '  <import namespace="http://www.opengis.net/gml"' +
+            '          schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd" />' +
+            '  <element name="KGNAT.VKUNSTWERK" ' +
+            '           type="rws:KGNAT.VKUNSTWERKType" ' +
+            '           substitutionGroup="gml:_Feature" />' +
+            '  <complexType name="KGNAT.VKUNSTWERKType">' +
+            '    <complexContent>' +
+            '      <extension base="gml:AbstractFeatureType">' +
+            '        <sequence>' +
+            '          <element name="geometry" type="gml:MultiPolygonPropertyType" minOccurs="0" maxOccurs="1"/>' +
+            '          <element name="OBJECTID" type="string"/>' +
+            '          <element name="OBJECTSUBCATEGORIE" type="string"/>' +
+            '          <element name="DIENSTCODE" type="string"/>' +
+            '          <element name="DISTRICTNAAM" type="string"/>' +
+            '          <element name="CODEBPN" type="string"/>' +
+            '          <element name="WSD" type="string"/>' +
+            '          <element name="SUBCAT" type="string"/>' +
+            '          <element name="ZIJDE" type="string"/>' +
+            '          <element name="KM" type="string"/>' +
+            '          <element name="ELEMENTCODE" type="string"/>' +
+            '          <element name="COMPLEXCODE" type="string"/>' +
+            '          <element name="BEHEEROBJECTCODE" type="string"/>' +
+            '          <element name="BEGINDATUM" type="string"/>' +
+            '          <element name="NAAMCONTACTPERSOON" type="string"/>' +
+            '          <element name="KMTOT" type="string"/>' +
+            '          <element name="HOOFDWATERSYSTEEM" type="string"/>' +
+            '          <element name="WATERSYSTEEMNAAM" type="string"/>' +
+            '          <element name="OBJECTNAAM" type="string"/>' +
+            '          <element name="HERKOMST" type="string"/>' +
+            '          <element name="BEHEERSREGIME" type="string"/>' +
+            '          <element name="VERSIE" type="string"/>' +
+            '          <element name="KWALITEITSNIVEAU" type="string"/>' +
+            '          <element name="STICHTINGSJAAR" type="string"/>' +
+            '          <element name="OBJECTTYPE" type="string"/>' +
+            '          <element name="OPMERKING" type="string"/>' +
+            '          <element name="OPPERVLAKTE" type="string"/>' +
+            '          <element name="SE_ANNO_CAD_DATA" type="string"/>' +
+            '          <element name="SHAPE" type="string"/>' +
+            '        </sequence>' +
+            '      </extension>' +
+            '    </complexContent>' +
+            '  </complexType>' +
+            '  <element name="KGNAT.LKUNSTWERK" ' +
+            '           type="rws:KGNAT.LKUNSTWERKType" ' +
+            '           substitutionGroup="gml:_Feature" />' +
+            '  <complexType name="KGNAT.LKUNSTWERKType">' +
+            '    <complexContent>' +
+            '      <extension base="gml:AbstractFeatureType">' +
+            '        <sequence>' +
+            '          <element name="geometry" type="gml:MultiLineStringPropertyType" minOccurs="0" maxOccurs="1"/>' +
+            '          <element name="OBJECTID" type="string"/>' +
+            '          <element name="OBJECTSUBCATEGORIE" type="string"/>' +
+            '          <element name="DIENSTCODE" type="string"/>' +
+            '          <element name="DISTRICTNAAM" type="string"/>' +
+            '          <element name="CODEBPN" type="string"/>' +
+            '          <element name="WSD" type="string"/>' +
+            '          <element name="SUBCAT" type="string"/>' +
+            '          <element name="ZIJDE" type="string"/>' +
+            '          <element name="KM" type="string"/>' +
+            '          <element name="ELEMENTCODE" type="string"/>' +
+            '          <element name="COMPLEXCODE" type="string"/>' +
+            '          <element name="BEHEEROBJECTCODE" type="string"/>' +
+            '          <element name="BEGINDATUM" type="string"/>' +
+            '          <element name="NAAMCONTACTPERSOON" type="string"/>' +
+            '          <element name="KMTOT" type="string"/>' +
+            '          <element name="HOOFDWATERSYSTEEM" type="string"/>' +
+            '          <element name="WATERSYSTEEMNAAM" type="string"/>' +
+            '          <element name="OBJECTNAAM" type="string"/>' +
+            '          <element name="HERKOMST" type="string"/>' +
+            '          <element name="BEHEERSREGIME" type="string"/>' +
+            '          <element name="VERSIE" type="string"/>' +
+            '          <element name="KWALITEITSNIVEAU" type="string"/>' +
+            '          <element name="STICHTINGSJAAR" type="string"/>' +
+            '          <element name="OBJECTTYPE" type="string"/>' +
+            '          <element name="OPMERKING" type="string"/>' +
+            '          <element name="LENGTE" type="string"/>' +
+            '          <element name="SE_ANNO_CAD_DATA" type="string"/>' +
+            '          <element name="SHAPE" type="string"/>' +
+            '        </sequence>' +
+            '      </extension>' +
+            '    </complexContent>' +
+            '  </complexType>' +
+            '  <element name="KGNAT.PKUNSTWERK" ' +
+            '           type="rws:KGNAT.PKUNSTWERKType" ' +
+            '           substitutionGroup="gml:_Feature" />' +
+            '  <complexType name="KGNAT.PKUNSTWERKType">' +
+            '    <complexContent>' +
+            '      <extension base="gml:AbstractFeatureType">' +
+            '        <sequence>' +
+            '          <element name="geometry" type="gml:MultiPointPropertyType" minOccurs="0" maxOccurs="1"/>' +
+            '          <element name="OBJECTID" type="string"/>' +
+            '          <element name="OBJECTSUBCATEGORIE" type="string"/>' +
+            '          <element name="DIENSTCODE" type="string"/>' +
+            '          <element name="DISTRICTNAAM" type="string"/>' +
+            '          <element name="CODEBPN" type="string"/>' +
+            '          <element name="WSD" type="string"/>' +
+            '          <element name="SUBCAT" type="string"/>' +
+            '          <element name="ZIJDE" type="string"/>' +
+            '          <element name="KM" type="string"/>' +
+            '          <element name="ELEMENTCODE" type="string"/>' +
+            '          <element name="COMPLEXCODE" type="string"/>' +
+            '          <element name="BEHEEROBJECTCODE" type="string"/>' +
+            '          <element name="BEGINDATUM" type="string"/>' +
+            '          <element name="NAAMCONTACTPERSOON" type="string"/>' +
+            '          <element name="KMTOT" type="string"/>' +
+            '          <element name="HOOFDWATERSYSTEEM" type="string"/>' +
+            '          <element name="WATERSYSTEEMNAAM" type="string"/>' +
+            '          <element name="OBJECTNAAM" type="string"/>' +
+            '          <element name="HERKOMST" type="string"/>' +
+            '          <element name="BEHEERSREGIME" type="string"/>' +
+            '          <element name="VERSIE" type="string"/>' +
+            '          <element name="KWALITEITSNIVEAU" type="string"/>' +
+            '          <element name="STICHTINGSJAAR" type="string"/>' +
+            '          <element name="OBJECTTYPE" type="string"/>' +
+            '          <element name="OPMERKING" type="string"/>' +
+            '          <element name="X" type="string"/>' +
+            '          <element name="Y" type="string"/>' +
+            '          <element name="SE_ANNO_CAD_DATA" type="string"/>' +
+            '          <element name="SHAPE" type="string"/>' +
+            '        </sequence>' +
+            '      </extension>' +
+            '    </complexContent>' +
+            '  </complexType>' +
+            '</schema>';
+
+        parser = new OpenLayers.Format.WFSDescribeFeatureType();
+        res = parser.read(text);
+
+        t.eq(res.featureTypes.length, 3,
+            "There are 3 typenames, so length should be 3");
+
+        t.eq(res.featureTypes[0].typeName, 'KGNAT.VKUNSTWERK',
+            "There name of the first typename is KGNAT.VKUNSTWERK");
+
+        t.eq(res.featureTypes[2].properties.length, 30,
+            "We expect 30 attributes in the third typename");
+
+        t.eq(res.featureTypes[2].properties[1].name, 'OBJECTID',
+            "The second attribute has name OBJECTID");
+
+        t.eq(res.featureTypes[2].properties[1].type, 'string',
+            "The second attribute has type string");
+
+        t.eq(res.targetNamespace, 'http://mapserver.gis.umn.edu/mapserver',
+            "The targetNamespace should be http://mapserver.gis.umn.edu/mapserver");
+
+        t.eq(res.targetPrefix, 'rws', "the targetPrefix should be rws");
+
+        // response from Ionic WFS, taken from:
+        // http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA?service=WFS&request=DescribeFeatureType&version=1.0.0&typename=wfs:highways
+        text =
+            "<?xml version='1.0' encoding='utf-8' ?>" +
+            '  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:wfs="http://www.ionicsoft.com/wfs" targetNamespace="http://www.ionicsoft.com/wfs" xmlns:xlink="http://www.w3.org/1999/xlink" elementFormDefault="qualified" version="0.1">' +
+            '    <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/2.1.2/feature.xsd"/>' +
+            '    <xsd:element name="highways" substitutionGroup="gml:_Feature" type="wfs:highways"/>' +
+            '    <xsd:complexType name="highways">' +
+            '      <xsd:complexContent>' +
+            '        <xsd:extension base="gml:AbstractFeatureType">' +
+            '          <xsd:sequence>' +
+            '            <xsd:element name="ROUTE_" minOccurs="0" nillable="true" type="xsd:int"/>' +
+            '            <xsd:element name="ROUTE_ID" minOccurs="0" nillable="true" type="xsd:int"/>' +
+            '            <xsd:element name="RT_NUMBER" minOccurs="0" nillable="true" type="xsd:string"/>' +
+            '            <xsd:element name="GEOMETRY" minOccurs="0" nillable="true" type="gml:GeometryAssociationType"/>' +
+            '          </xsd:sequence>' +
+            '        </xsd:extension>' +
+            '      </xsd:complexContent>' +
+            '    </xsd:complexType>' +
+            '  </xsd:schema>';
+
+        parser = new OpenLayers.Format.WFSDescribeFeatureType();
+        res = parser.read(text);
+
+        t.eq(res.featureTypes.length, 1,
+            "There is 1 typename, so length should be 1");
+
+        t.eq(res.featureTypes[0].typeName, "highways",
+            "The name of the typename is highways");
+
+        t.eq(res.featureTypes[0].properties.length, 4,
+            "We expect 4 attributes in the first typename");
+
+        t.eq(res.featureTypes[0].properties[1].name, 'ROUTE_ID',
+            "The second attribute has name ROUTE_ID");
+
+        t.eq(res.featureTypes[0].properties[1].type, 'xsd:int',
+            "The second attribute has type integer");
+
+        t.eq(parseInt(res.featureTypes[0].properties[1].minOccurs), 0,
+            "The second attribute has minOccurs 0");
+
+        t.eq(res.targetNamespace, 'http://www.ionicsoft.com/wfs',
+            "The targetNamespace should be http://www.ionicsoft.com/wfs");
+
+        t.eq(res.targetPrefix, 'wfs', "the targetPrefix should be wfs");
+
+
+        // GeoServer tests
+        
+        function geoServerTests(text) {
+            parser = new OpenLayers.Format.WFSDescribeFeatureType();
+            res = parser.read(text);
+    
+            t.eq(res.featureTypes.length, 1,
+                "There is 1 typename, so length should be 1");
+    
+            t.eq(res.featureTypes[0].typeName, "railroads",
+                "The name of the typeName is railroads");
+    
+            t.eq(res.featureTypes[0].properties.length, 2,
+                "We expect 2 attributes in the typename");
+    
+            t.eq(res.featureTypes[0].properties[0].name, 'cat',
+                "The first attribute has name cat");
+    
+            t.eq(res.featureTypes[0].properties[0].type.split(":")[1], 'long',
+                "The first attribute has type long with a prefix");
+
+            t.eq(res.featureTypes[0].properties[0].localType, 'long',
+                "The first attribute has localType long");
+    
+            t.eq(res.targetNamespace, 'http://opengeo.org',
+                "The targetNamespace should be http://opengeo.org");
+    
+            t.eq(res.targetPrefix, 'opengeo', "the targetPrefix should be opengeo");
+        }
+        
+
+        // Read Geoserver WFS 1.0.0 response
+        // Taken from: http://demo.opengeo.org/geoserver/wfs?service=WFS&request=DescribeFeatureType&typename=opengeo:railroads&version=1.0.0
+        text = 
+            '<?xml version="1.0" encoding="UTF-8"?>' +
+            '<xs:schema  targetNamespace="http://opengeo.org"  xmlns:opengeo="http://opengeo.org" xmlns:gml="http://www.opengis.net/gml" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">' +
+            '  <xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://demo.opengeo.org:80/geoserver/schemas/gml/2.1.2.1/feature.xsd"/>' + 
+            '  <xs:complexType xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" name="railroads_Type">' +
+            '    <xs:complexContent>' +
+            '      <xs:extension base="gml:AbstractFeatureType">' +
+            '        <xs:sequence>' +
+            '          <xs:element name="cat" minOccurs="0" nillable="true" type="xs:long"/>' +
+            '          <xs:element name="the_geom" minOccurs="0" nillable="true" type="gml:MultiLineStringPropertyType"/>' +
+            '        </xs:sequence>' +
+            '      </xs:extension>' +
+            '    </xs:complexContent>' +
+            '  </xs:complexType>' +
+            '  <xs:element name="railroads" type="opengeo:railroads_Type" substitutionGroup="gml:_Feature"/>' +
+            '</xs:schema>';
+
+        geoServerTests(text);
+        
+
+        // Read GeoServer WFS 1.1.0 response
+        // taken from http://demo.opengeo.org/geoserver/wfs?service=WFS&request=DescribeFeatureType&typename=opengeo:railroads&version=1.1.0
+        text = 
+            '<?xml version="1.0" encoding="UTF-8"?>' +
+            '   <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:opengeo="http://opengeo.org" elementFormDefault="qualified" targetNamespace="http://opengeo.org">' +
+            '     <xsd:import namespace="http://www.opengis.net/gml" schemaLocation="http://demo.opengeo.org:80/geoserver/wfs/schemas/gml/3.1.1/base/gml.xsd"/>' +
+            '     <xsd:complexType name="railroadsType">' +
+            '       <xsd:complexContent>' +
+            '         <xsd:extension base="gml:AbstractFeatureType">' +
+            '           <xsd:sequence>' +
+            '             <xsd:element maxOccurs="1" minOccurs="0" name="cat" nillable="true" type="xsd:long"/>' +
+            '             <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiLineStringPropertyType"/>' +
+            '           </xsd:sequence>' +
+            '         </xsd:extension>' +
+            '       </xsd:complexContent>' +
+            '     </xsd:complexType>' +
+            '     <xsd:element name="railroads" substitutionGroup="gml:_Feature" type="opengeo:railroadsType"/>' +
+            '   </xsd:schema>';
+        
+        geoServerTests(text);
+        
+        // Another GeoServer response with type restrictions
+        // taken from http://sigma.openplans.org/geoserver/wfs?service=WFS&request=DescribeFeatureType&typename=topp:states&version=1.0.0
+        text = '<?xml version="1.0" encoding="UTF-8"?><xs:schema  targetNamespace="http://www.openplans.org/topp"  xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0"><xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://sigma.openplans.org:80/geoserver/schemas/gml/2.1.2.1/feature.xsd"/><xs:complexType xmlns:xs="http: [...]
+
+        parser = new OpenLayers.Format.WFSDescribeFeatureType();
+        res = parser.read(text);
+
+        t.eq(res.featureTypes[0].properties[1].name, "STATE_NAME",
+            "name of 2nd property of 1st featureType should be 'STATE_NAME'");
+        
+        t.eq(res.featureTypes[0].properties[1].type, "xs:string",
+            "type of 2nd property of 1st featureType should be 'xs:string'");
+
+        t.eq(res.featureTypes[0].properties[1].localType, "string",
+            "localType of 2nd property of 1st featureType should be 'string'");
+        
+        t.eq(res.featureTypes[0].properties[1].restriction.maxLength, "25",
+            "the maxLength restriction should be 25");
+    }
+    
+    function test_readRestriction(t) {
+        t.plan(2);
+        var text =
+            '<restriction xmlns="http://www.w3.org/2001/XMLSchema" base="xs:string">' +
+            '  <enumeration value="One"/>' +
+            '  <enumeration value="Two"/>' +
+            '</restriction>';
+        var doc = OpenLayers.Format.XML.prototype.read(text).documentElement;
+        var obj = {};
+        new OpenLayers.Format.WFSDescribeFeatureType().readRestriction(doc, obj);
+        
+        t.eq(obj.enumeration.length, 2, "enumeration has a length of 2");
+        t.eq(obj.enumeration[1], "Two", "2nd enumeration value is 'Two'");
+        // other functionality of readRestriction already tested in the last
+        // GeoServer example above
+    }
+
+    </script> 
+</head> 
+<body>
+</body> 
+</html>
\ No newline at end of file
diff --git a/tests/Format/WFST.html b/tests/Format/WFST.html
new file mode 100644
index 0000000..e6793c0
--- /dev/null
+++ b/tests/Format/WFST.html
@@ -0,0 +1,23 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(2);
+
+        var format = new OpenLayers.Format.WFST();
+        t.ok(format instanceof OpenLayers.Format.WFST.v1_0_0, "constructor returns instance with default versioned format");
+
+        format = new OpenLayers.Format.WFST({
+            version: "1.1.0"
+        });
+        t.ok(format instanceof OpenLayers.Format.WFST.v1_1_0, "constructor returns instance with custom versioned format");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+</body>
+</html>
diff --git a/tests/Format/WFST/v1.html b/tests/Format/WFST/v1.html
new file mode 100644
index 0000000..9ec5d17
--- /dev/null
+++ b/tests/Format/WFST/v1.html
@@ -0,0 +1,236 @@
+<html>
+<head>
+  <script src="../../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_read(t) {
+        t.plan(1);
+
+        var data = readXML("FeatureCollection");
+        var format = new OpenLayers.Format.WFST({
+            featureNS: "http://www.openplans.org/topp",
+            featureType: "states"
+        });
+        var features = format.read(data);
+
+        t.eq(features.length, 1, "number of features read from FeatureCollection is correct");
+    }
+
+    function test_write(t) {
+
+        var format = new OpenLayers.Format.WFST({
+            featureNS: "http://www.openplans.org/topp",
+            featureType: "states",
+            featurePrefix: "topp",
+            geometryName: "the_geom"
+        });
+
+        var feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(1,2),
+            {foo: "bar"}
+        );
+
+        var insertFeature = feature.clone();
+        // null value does not show up in insert
+        insertFeature.attributes.nul = null;
+        insertFeature.state = OpenLayers.State.INSERT;
+        var updateFeature = feature.clone();
+        // undefined value means don't create a Property element
+        updateFeature.attributes.unwritten = undefined;
+        // null value gets Property element with no Value
+        updateFeature.attributes.nul = null;
+        updateFeature.fid = "fid.42";
+        updateFeature.state = OpenLayers.State.UPDATE;
+        var deleteFeature = feature.clone();
+        deleteFeature.state = OpenLayers.State.DELETE;
+        deleteFeature.fid = "fid.37";
+
+        t.plan(5);
+        var snippets = {
+            "GetFeature": {maxFeatures: 1, outputFormat: 'json'},
+            "Transaction": null,
+            "Insert": insertFeature,
+            "Update": updateFeature,
+            "Delete": deleteFeature
+        }
+
+        var arg;
+        for(var snippet in snippets) {
+            arg = snippets[snippet]
+            var expected = readXML(snippet);
+            var got = format.writers["wfs"][snippet].apply(format, [arg]);
+            t.xml_eq(got, expected, snippet + " request created correctly");
+        }
+    }
+
+    function test_write_no_geometry(t) {
+        var format = new OpenLayers.Format.WFST({
+            featureNS: "http://www.openplans.org/topp",
+            featureType: "states",
+            featurePrefix: "topp",
+            geometryName: null
+        });
+
+        var feature = new OpenLayers.Feature.Vector(null, {foo: "bar"});
+        feature.state = OpenLayers.State.UPDATE;
+        feature.fid = "fid.36";
+
+        t.plan(1);
+        var snippets = {
+            "UpdateNoGeometry": feature
+        }
+
+        var arg;
+        for(var snippet in snippets) {
+            arg = snippets[snippet]
+            var expected = readXML(snippet);
+            var got = format.writers["wfs"]["Update"].apply(format, [arg]);
+            t.xml_eq(got, expected, snippet + " request without geometry created correctly");
+        }
+    }
+
+    function test_write_multiple(t) {
+
+        var format = new OpenLayers.Format.WFST({
+            featureNS: "http://www.openplans.org/topp",
+            featureType: ["states", "cities"],
+            featurePrefix: "topp",
+            geometryName: "the_geom"
+        });
+
+        t.plan(1);
+        var snippets = {
+            "GetFeatureMultiple": {}
+        }
+        
+        var arg;
+        for(var snippet in snippets) {
+            arg = snippets[snippet]
+            var expected = readXML(snippet);
+            var got = format.writers["wfs"]["GetFeature"].apply(format, [arg]);
+            t.xml_eq(got, expected, snippet + " request created correctly with multiple typenames");
+        }
+    }
+
+    function readXML(id) {
+        var xml = document.getElementById(id).firstChild.nodeValue;
+        return new OpenLayers.Format.XML().read(xml).documentElement;
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+
+<div id="FeatureCollection"><!--
+<wfs:FeatureCollection xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml">
+    <gml:featureMember>
+        <topp:states fid="states.3">
+            <topp:the_geom>
+                <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
+                    <gml:polygonMember>
+                        <gml:Polygon>
+                            <gml:outerBoundaryIs>
+                                <gml:LinearRing>
+                                    <gml:coordinates decimal="." cs="," ts=" ">-75.70742,38.557476 -75.71106,38.649551 -75.724937,38.83017 -75.752922,39.141548 -75.761658,39.247753 -75.764664,39.295849 -75.772697,39.383007 -75.791435,39.723755 -75.775269,39.724442 -75.745934,39.774818 -75.695114,39.820347 -75.644341,39.838196 -75.583794,39.840008 -75.470345,39.826435 -75.42083,39.79887 -75.412117,39.789658 -75.428009,39.77813 -75.460754,39.763248 -75.475128,39.741718 -75.476334,39.719971 [...]
+                                </gml:LinearRing>
+                            </gml:outerBoundaryIs>
+                        </gml:Polygon>
+                    </gml:polygonMember>
+                </gml:MultiPolygon>
+            </topp:the_geom>
+            <topp:STATE_NAME>Delaware</topp:STATE_NAME>
+            <topp:STATE_FIPS>10</topp:STATE_FIPS>
+            <topp:SUB_REGION>S Atl</topp:SUB_REGION>
+            <topp:STATE_ABBR>DE</topp:STATE_ABBR>
+            <topp:LAND_KM>5062.456</topp:LAND_KM>
+            <topp:WATER_KM>1385.022</topp:WATER_KM>
+            <topp:PERSONS>666168.0</topp:PERSONS>
+            <topp:FAMILIES>175867.0</topp:FAMILIES>
+            <topp:HOUSHOLD>247497.0</topp:HOUSHOLD>
+            <topp:MALE>322968.0</topp:MALE>
+            <topp:FEMALE>343200.0</topp:FEMALE>
+            <topp:WORKERS>247566.0</topp:WORKERS>
+            <topp:DRVALONE>258087.0</topp:DRVALONE>
+            <topp:CARPOOL>42968.0</topp:CARPOOL>
+            <topp:PUBTRANS>8069.0</topp:PUBTRANS>
+            <topp:EMPLOYED>335147.0</topp:EMPLOYED>
+            <topp:UNEMPLOY>13945.0</topp:UNEMPLOY>
+            <topp:SERVICE>87973.0</topp:SERVICE>
+            <topp:MANUAL>44140.0</topp:MANUAL>
+            <topp:P_MALE>0.485</topp:P_MALE>
+            <topp:P_FEMALE>0.515</topp:P_FEMALE>
+            <topp:SAMP_POP>102776.0</topp:SAMP_POP>
+        </topp:states>
+    </gml:featureMember>
+</wfs:FeatureCollection>
+--></div>
+
+<div id="GetFeature"><!--
+<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" outputFormat="json" maxFeatures="1" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <wfs:Query typeName="topp:states" xmlns:topp="http://www.openplans.org/topp"/>
+</wfs:GetFeature>
+--></div>
+<div id="GetFeatureMultiple"><!--
+<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <wfs:Query typeName="topp:states" xmlns:topp="http://www.openplans.org/topp"/>
+    <wfs:Query typeName="topp:cities" xmlns:topp="http://www.openplans.org/topp"/>
+</wfs:GetFeature>
+--></div>
+<div id="Transaction"><!--
+<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0"/>
+--></div>
+<div id="Insert"><!--
+<wfs:Insert xmlns:wfs="http://www.opengis.net/wfs">
+    <feature:states xmlns:feature="http://www.openplans.org/topp">
+        <feature:the_geom>
+            <gml:Point xmlns:gml="http://www.opengis.net/gml">
+                <gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates>
+            </gml:Point>
+        </feature:the_geom>
+        <feature:foo>bar</feature:foo>
+    </feature:states>
+</wfs:Insert>
+--></div>
+<div id="Update"><!--
+<wfs:Update xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+    <wfs:Property>
+        <wfs:Name>the_geom</wfs:Name>
+        <wfs:Value>
+            <gml:Point xmlns:gml="http://www.opengis.net/gml">
+                <gml:coordinates decimal="." cs="," ts=" ">1,2</gml:coordinates>
+            </gml:Point>
+        </wfs:Value>
+    </wfs:Property>
+    <wfs:Property>
+        <wfs:Name>foo</wfs:Name>
+        <wfs:Value>bar</wfs:Value>
+    </wfs:Property>
+    <wfs:Property>
+        <wfs:Name>nul</wfs:Name>
+    </wfs:Property>
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+        <ogc:FeatureId fid="fid.42"/>
+    </ogc:Filter>
+</wfs:Update>
+--></div>
+<div id="Delete"><!--
+<wfs:Delete xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+        <ogc:FeatureId fid="fid.37"/>
+    </ogc:Filter>
+</wfs:Delete>
+--></div>
+<div id="UpdateNoGeometry"><!--
+<wfs:Update xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+    <wfs:Property>
+        <wfs:Name>foo</wfs:Name>
+        <wfs:Value>bar</wfs:Value>
+    </wfs:Property>
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+        <ogc:FeatureId fid="fid.36"/>
+    </ogc:Filter>
+</wfs:Update>
+--></div>
+</body>
+</html>
diff --git a/tests/Format/WFST/v1_0_0.html b/tests/Format/WFST/v1_0_0.html
new file mode 100644
index 0000000..6f807fd
--- /dev/null
+++ b/tests/Format/WFST/v1_0_0.html
@@ -0,0 +1,122 @@
+<html>
+<head>
+  <script src="../../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(1);
+
+        var format = new OpenLayers.Format.WFST.v1_0_0({});
+        t.ok(format instanceof OpenLayers.Format.WFST.v1_0_0, "constructor returns instance");
+    }
+    
+    function test_read(t) {
+        t.plan(2);
+        
+        var data = readXML("Transaction_Response");        
+        var format = new OpenLayers.Format.WFST.v1_0_0({
+            featureNS: "http://www.openplans.org/topp",
+            featureType: "states"
+        });
+        var result = format.read(data);
+        t.eq(result.insertIds[0], "none", "InsertIds read correctly");
+        t.eq(result.success, true, "Success read correctly");
+    }
+    
+    function test_write(t) {
+
+        var format = new OpenLayers.Format.WFST.v1_0_0({
+            featureNS: "http://www.openplans.org/topp",
+            featureType: "states",
+            featurePrefix: "topp",
+            geometryName: "the_geom"
+        });
+
+        var cases = [{
+            id: "query0",
+            writer: "wfs:Query",
+            arg: {
+                filter: new OpenLayers.Filter.Spatial({
+                    type: OpenLayers.Filter.Spatial.BBOX,
+                    value: new OpenLayers.Bounds (1,2,3,4)
+                })
+            }
+        }, {
+            id: "query1",
+            writer: "wfs:Query",
+            arg: {
+                srsNameInQuery: true,
+                srsName: "EPSG:900913"
+            }
+        }, {
+            id: "getfeature0",
+            writer: "wfs:GetFeature",
+            arg: {
+                propertyNames: ["STATE_NAME", "STATE_FIPS", "STATE_ABBR"]
+            }
+        }];
+        
+        t.plan(cases.length);
+        
+        var test, got, exp;
+        for(var i=0; i<cases.length; ++i) {
+            test = cases[i];
+            exp = readXML(test.id);
+            got = format.writeNode(test.writer, test.arg);
+            t.xml_eq(got, exp, test.id + ": correct request");
+        }
+
+    }
+
+    var xmlFormat = new OpenLayers.Format.XML();
+    function readXML(id) {
+        var xml = document.getElementById(id).firstChild.nodeValue;
+        return xmlFormat.read(xml).documentElement;        
+    }
+
+  </script>
+</head>
+<body>
+<div id="Transaction_Response"><!--
+<wfs:WFS_TransactionResponse version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc">
+    <wfs:InsertResult>
+        <ogc:FeatureId fid="none"/>
+    </wfs:InsertResult>
+    <wfs:TransactionResult>
+        <wfs:Status>
+            <wfs:SUCCESS/>
+        </wfs:Status>
+    </wfs:TransactionResult>
+</wfs:WFS_TransactionResponse>
+--></div>
+<div id="query0"><!--
+<wfs:Query xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+        <ogc:BBOX>
+            <ogc:PropertyName>the_geom</ogc:PropertyName>
+            <gml:Box xmlns:gml="http://www.opengis.net/gml">
+                <gml:coordinates decimal="." cs="," ts=" ">1,2 3,4</gml:coordinates>
+            </gml:Box>
+        </ogc:BBOX>
+    </ogc:Filter>
+</wfs:Query>
+--></div>
+<div id="query1"><!--
+<wfs:Query xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" srsName="EPSG:900913" xmlns:topp="http://www.openplans.org/topp">
+</wfs:Query>
+--></div>
+<div id="getfeature0"><!--
+<wfs:GetFeature service="WFS" version="1.0.0" xmlns:topp="http://www.openplans.org/topp"
+                xmlns:wfs="http://www.opengis.net/wfs"
+                xmlns:ogc="http://www.opengis.net/ogc"
+                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd">
+    <wfs:Query xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+        <ogc:PropertyName>STATE_NAME</ogc:PropertyName>
+        <ogc:PropertyName>STATE_FIPS</ogc:PropertyName>
+        <ogc:PropertyName>STATE_ABBR</ogc:PropertyName>
+    </wfs:Query>
+</wfs:GetFeature>
+--></div>
+</body>
+</html>
diff --git a/tests/Format/WFST/v1_1_0.html b/tests/Format/WFST/v1_1_0.html
new file mode 100644
index 0000000..9678d58
--- /dev/null
+++ b/tests/Format/WFST/v1_1_0.html
@@ -0,0 +1,138 @@
+<html>
+<head>
+  <script src="../../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(1);
+
+        var format = new OpenLayers.Format.WFST.v1_1_0({});
+        t.ok(format instanceof OpenLayers.Format.WFST.v1_1_0, "constructor returns instance");
+    }
+    
+    function test_read(t) {
+        t.plan(2);
+        
+        var data = readXML("TransactionResponse");        
+        var format = new OpenLayers.Format.WFST.v1_1_0({
+            featureNS: "http://www.openplans.org/topp",
+            featureType: "states"
+        });
+        var result = format.read(data);
+        t.eq(result.insertIds[0], "none", "InsertIds read correctly");
+        t.eq(result.success, true, "Success read correctly");
+    }
+
+    function test_read_hits(t) {
+        t.plan(1);
+        var data = readXML("NumberOfFeatures");
+        var format = new OpenLayers.Format.WFST.v1_1_0({
+            featureNS: "http://mapserver.gis.umn.edu/mapserver",
+            featureType: "AAA64"
+        });
+        var result = format.read(data, {output: "object"});
+        t.eq(result.numberOfFeatures, 625, "numberOfFeatures of FeatureCollection correctly read");
+    }
+
+    function test_write(t) {
+
+        var format = new OpenLayers.Format.WFST.v1_1_0({
+            featureNS: "http://www.openplans.org/topp",
+            featureType: "states",
+            featurePrefix: "topp",
+            geometryName: "the_geom"
+        });
+
+        var cases = [{
+            id: "query0",
+            writer: "wfs:Query",
+            arg: {
+                filter: new OpenLayers.Filter.Spatial({
+                    type: OpenLayers.Filter.Spatial.BBOX,
+                    value: new OpenLayers.Bounds (1,2,3,4)
+                })
+            }
+        }, {
+            id: "getfeature0",
+            writer: "wfs:GetFeature",
+            arg: {
+                resultType: "hits",
+                propertyNames: ["STATE_NAME", "STATE_FIPS", "STATE_ABBR"]
+            }
+        }];
+        
+        t.plan(cases.length);
+        
+        var test, got, exp;
+        for(var i=0; i<cases.length; ++i) {
+            test = cases[i];
+            exp = readXML(test.id);
+            got = format.writeNode(test.writer, test.arg);
+            t.xml_eq(got, exp, test.id + ": correct request");
+        }
+    }
+
+    var xmlFormat = new OpenLayers.Format.XML();
+    function readXML(id) {
+        var xml = document.getElementById(id).firstChild.nodeValue;
+        return xmlFormat.read(xml).documentElement;        
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+<div id="NumberOfFeatures"><!--
+<?xml version='1.0' encoding="ISO-8859-1" ?>
+<wfs:FeatureCollection
+   xmlns:rws="http://mapserver.gis.umn.edu/mapserver"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://intranet.rijkswaterstaat.nl/services/geoservices/nwb_wegen?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=feature:AAA64&OUTPUTFORMAT=text/xml; subtype=gml/3.1.1  http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" numberOfFeatures="625">
+</wfs:FeatureCollection>
+--></div>
+<div id="TransactionResponse"><!--
+<wfs:TransactionResponse version="1.1.0" xmlns:ogc="http://www.opengis.net/ogc" xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:sf="http://www.openplans.org/spearfish" xmlns:ows="http://www.opengis.net/ows" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <wfs:TransactionSummary>
+        <wfs:totalInserted>0</wfs:totalInserted>
+        <wfs:totalUpdated>1</wfs:totalUpdated>
+        <wfs:totalDeleted>0</wfs:totalDeleted>
+    </wfs:TransactionSummary>
+    <wfs:TransactionResults/>
+    <wfs:InsertResults>
+        <wfs:Feature>
+            <ogc:FeatureId fid="none"/>
+        </wfs:Feature>
+    </wfs:InsertResults>
+</wfs:TransactionResponse>
+--></div>
+<div id="query0"><!--
+<wfs:Query xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+    <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+        <ogc:BBOX>
+            <ogc:PropertyName>the_geom</ogc:PropertyName>
+            <gml:Envelope xmlns:gml="http://www.opengis.net/gml">
+                <gml:lowerCorner>1 2</gml:lowerCorner>
+                <gml:upperCorner>3 4</gml:upperCorner>
+            </gml:Envelope>
+        </ogc:BBOX>
+    </ogc:Filter>
+</wfs:Query>
+--></div>
+<div id="getfeature0"><!--
+<wfs:GetFeature service="WFS" version="1.1.0" resultType="hits" xmlns:topp="http://www.openplans.org/topp"
+                xmlns:wfs="http://www.opengis.net/wfs"
+                xmlns:ogc="http://www.opengis.net/ogc"
+                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
+    <wfs:Query xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+        <wfs:PropertyName>STATE_NAME</wfs:PropertyName>
+        <wfs:PropertyName>STATE_FIPS</wfs:PropertyName>
+        <wfs:PropertyName>STATE_ABBR</wfs:PropertyName>
+    </wfs:Query>
+</wfs:GetFeature>
+--></div>
+</body>
+</html>
diff --git a/tests/Format/WKT.html b/tests/Format/WKT.html
new file mode 100644
index 0000000..a7deee7
--- /dev/null
+++ b/tests/Format/WKT.html
@@ -0,0 +1,244 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+     
+    var points = []; 
+    for(var i=0; i<12; ++i) { 
+        points.push(new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(Math.random() * 100,
+                                          Math.random() * 100))
+        ); 
+    } 
+    var multipoint = new OpenLayers.Feature.Vector(
+        new OpenLayers.Geometry.MultiPoint([ 
+            points[0].geometry, 
+            points[1].geometry, 
+            points[2].geometry
+        ])
+    ); 
+     
+    var linestrings = [ 
+        new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.LineString([
+                points[0].geometry, 
+                points[1].geometry, 
+                points[2].geometry
+            ])
+        ),
+        new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.LineString([
+                points[3].geometry, 
+                points[4].geometry, 
+                points[5].geometry
+            ])
+        )
+    ]; 
+     
+    var multilinestring = new OpenLayers.Feature.Vector(
+        new OpenLayers.Geometry.MultiLineString([ 
+            linestrings[0].geometry, 
+            linestrings[1].geometry
+        ])
+    ); 
+ 
+    var rings = [ 
+        new OpenLayers.Geometry.LinearRing([
+            points[0].geometry, 
+            points[1].geometry, 
+            points[2].geometry
+        ]), 
+        new OpenLayers.Geometry.LinearRing([
+            points[3].geometry, 
+            points[4].geometry, 
+            points[5].geometry
+        ]), 
+        new OpenLayers.Geometry.LinearRing([
+            points[6].geometry, 
+            points[7].geometry, 
+            points[8].geometry
+        ]), 
+        new OpenLayers.Geometry.LinearRing([
+            points[9].geometry, 
+            points[10].geometry, 
+            points[11].geometry
+        ]) 
+    ]; 
+ 
+    var polygons = [ 
+        new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Polygon([rings[0], rings[1]])
+        ), 
+        new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Polygon([rings[2], rings[3]])
+        )
+    ]; 
+     
+    var multipolygon = new OpenLayers.Feature.Vector(
+        new OpenLayers.Geometry.MultiPolygon([ 
+            polygons[0].geometry, 
+            polygons[1].geometry 
+        ])
+    ); 
+     
+    var collection = [points[0], linestrings[0]]; 
+     
+    function test_Format_WKT_constructor(t) { 
+        t.plan(4); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.WKT(options); 
+        t.ok(format instanceof OpenLayers.Format.WKT, 
+             "new OpenLayers.Format.WKT returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function"); 
+    }
+
+    function test_Format_WKT_write(t) { 
+        t.plan(7); 
+
+        var format = new OpenLayers.Format.WKT(); 
+
+        // test a point 
+        
+        t.eq(format.write(points[0]), 
+             "POINT(" + points[0].geometry.x + " " + points[0].geometry.y + ")", 
+             "format correctly writes Point WKT"); 
+ 
+        // test a multipoint 
+        t.eq(format.write(multipoint), 
+             "MULTIPOINT((" + points[0].geometry.x + " " + points[0].geometry.y + "),(" + 
+                              points[1].geometry.x + " " + points[1].geometry.y + "),(" + 
+                              points[2].geometry.x + " " + points[2].geometry.y + "))", 
+             "format correctly writes MultiPoint WKT"); 
+ 
+        // test a linestring 
+        t.eq(format.write(linestrings[0]), 
+             "LINESTRING(" + points[0].geometry.x + " " + points[0].geometry.y + "," + 
+                             points[1].geometry.x + " " + points[1].geometry.y + "," + 
+                             points[2].geometry.x + " " + points[2].geometry.y + ")", 
+             "format correctly writes LineString WKT"); 
+ 
+        // test a multilinestring 
+        t.eq(format.write(multilinestring), 
+             "MULTILINESTRING((" + points[0].geometry.x + " " + points[0].geometry.y + "," + 
+                                   points[1].geometry.x + " " + points[1].geometry.y + "," + 
+                                   points[2].geometry.x + " " + points[2].geometry.y + ")," + 
+                             "(" + points[3].geometry.x + " " + points[3].geometry.y + "," + 
+                                   points[4].geometry.x + " " + points[4].geometry.y + "," + 
+                                   points[5].geometry.x + " " + points[5].geometry.y + "))", 
+             "format correctly writes MultiLineString WKT"); 
+ 
+        // test a polygon 
+        t.eq(format.write(polygons[0]), 
+             "POLYGON((" + points[0].geometry.x + " " + points[0].geometry.y + "," + 
+                           points[1].geometry.x + " " + points[1].geometry.y + "," + 
+                           points[2].geometry.x + " " + points[2].geometry.y + "," + 
+                           points[0].geometry.x + " " + points[0].geometry.y + ")," + 
+                     "(" + points[3].geometry.x + " " + points[3].geometry.y + "," + 
+                           points[4].geometry.x + " " + points[4].geometry.y + "," + 
+                           points[5].geometry.x + " " + points[5].geometry.y + "," + 
+                           points[3].geometry.x + " " + points[3].geometry.y + "))", 
+             "format correctly writes Polygon WKT"); 
+ 
+        // test a multipolygon 
+        t.eq(format.write(multipolygon), 
+             "MULTIPOLYGON(((" + points[0].geometry.x + " " + points[0].geometry.y + "," + 
+                                 points[1].geometry.x + " " + points[1].geometry.y + "," + 
+                                 points[2].geometry.x + " " + points[2].geometry.y + "," + 
+                                 points[0].geometry.x + " " + points[0].geometry.y + ")," + 
+                           "(" + points[3].geometry.x + " " + points[3].geometry.y + "," + 
+                                 points[4].geometry.x + " " + points[4].geometry.y + "," + 
+                                 points[5].geometry.x + " " + points[5].geometry.y + "," + 
+                                 points[3].geometry.x + " " + points[3].geometry.y + "))," + 
+                          "((" + points[6].geometry.x + " " + points[6].geometry.y + "," + 
+                                 points[7].geometry.x + " " + points[7].geometry.y + "," + 
+                                 points[8].geometry.x + " " + points[8].geometry.y + "," + 
+                                 points[6].geometry.x + " " + points[6].geometry.y + ")," + 
+                           "(" + points[9].geometry.x + " " + points[9].geometry.y + "," + 
+                                 points[10].geometry.x + " " + points[10].geometry.y + "," + 
+                                 points[11].geometry.x + " " + points[11].geometry.y + "," + 
+                                 points[9].geometry.x + " " + points[9].geometry.y + ")))", 
+             "format correctly writes MultiPolygon WKT"); 
+         
+        // test a geometrycollection 
+        t.eq(format.write(collection), 
+             "GEOMETRYCOLLECTION(POINT(" + points[0].geometry.x + " " + points[0].geometry.y + ")," + 
+                                "LINESTRING(" + points[0].geometry.x + " " + points[0].geometry.y + "," + 
+                                                points[1].geometry.x + " " + points[1].geometry.y + "," + 
+                                                points[2].geometry.x + " " + points[2].geometry.y + "))", 
+             "format correctly writes GeometryCollection WKT"); 
+ 
+    }
+
+    function test_Format_WKT_read(t) { 
+        t.plan(7); 
+
+        var format = new OpenLayers.Format.WKT(); 
+         
+        /** 
+         * Since we're explicitly testing calls to write, the read tests 
+         * just make sure that geometry can make a round trip from read to write. 
+         */ 
+ 
+        // test a point 
+        t.ok(points[0].geometry.equals(format.read(format.write(points[0])).geometry), 
+             "format correctly reads Point WKT"); 
+
+        // test a multipoint 
+        t.ok(multipoint.geometry.equals(format.read(format.write(multipoint)).geometry), 
+             "format correctly reads MultiPoint WKT"); 
+ 
+        // test a linestring 
+        t.ok(linestrings[0].geometry.equals(format.read(format.write(linestrings[0])).geometry), 
+             "format correctly reads LineString WKT"); 
+ 
+        // test a multilinestring 
+        t.ok(multilinestring.geometry.equals(format.read(format.write(multilinestring)).geometry), 
+             "format correctly reads MultiLineString WKT"); 
+ 
+        // test a polygon 
+        t.ok(polygons[0].geometry.equals(format.read(format.write(polygons[0])).geometry), 
+             "format correctly reads Polygon WKT"); 
+ 
+        // test a multipolygon 
+        t.ok(multipolygon.geometry.equals(format.read(format.write(multipolygon)).geometry), 
+             "format correctly reads MultiPolygon WKT"); 
+         
+        // test a geometrycollection 
+        t.eq(format.write(collection), 
+             "GEOMETRYCOLLECTION(POINT(" + points[0].geometry.x + " " + points[0].geometry.y + ")," + 
+                                "LINESTRING(" + points[0].geometry.x + " " + points[0].geometry.y + "," + 
+                                                points[1].geometry.x + " " + points[1].geometry.y + "," + 
+                                                points[2].geometry.x + " " + points[2].geometry.y + "))", 
+             "format correctly writes GeometryCollection WKT"); 
+ 
+    }
+
+    function test_Format_WKT_read_projection(t) {
+        t.plan(1);
+
+        var projections = {
+            src:  new OpenLayers.Projection("EPSG:4326"),
+            dest: new OpenLayers.Projection("EPSG:900913")
+        };
+
+        var points = {
+            src:  new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(-87.9, 41.9)),
+            dest: new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(-9784983.2393667, 5146011.6785665))
+        };
+
+        var format = new OpenLayers.Format.WKT({
+            externalProjection: projections["src"],
+            internalProjection: projections["dest"]
+        });
+        var feature = format.read("GEOMETRYCOLLECTION(POINT(" + points["src"].geometry.x + " " + points["src"].geometry.y + "))")[0];
+        t.eq(feature.geometry.toString(), points["dest"].geometry.toString(), 
+            "Geometry collections aren't transformed twice when reprojection.");
+    }
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Format/WMC.html b/tests/Format/WMC.html
new file mode 100644
index 0000000..218d9f6
--- /dev/null
+++ b/tests/Format/WMC.html
@@ -0,0 +1,153 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    var v1_0_0 = '<ViewContext xmlns="http://www.opengis.net/context" version="1.0.0" id="OpenLayers_Context_233" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.0.0/context.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><Window width="512" height="256"/><BoundingBox minx="-109.9709708" miny="27.01451459" maxx="-80.02902918" maxy="41.98548541" SRS="EPSG:4326"/><Title/><Extension><ol:maxExtent xmlns:ol="http://openlayers.org/con [...]
+    var v1_1_0 = '<ViewContext xmlns="http://www.opengis.net/context" version="1.1.0" id="OpenLayers_Context_232" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.1.0/context.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><Window width="512" height="256"/><BoundingBox minx="-109.9709708" miny="27.01451459" maxx="-80.02902918" maxy="41.98548541" SRS="EPSG:4326"/><Title/><Extension><ol:maxExtent xmlns:ol="http://openlayers.org/con [...]
+
+    function test_Format_WMC_read(t) {
+        t.plan(36);
+
+        var format = new OpenLayers.Format.WMC();        
+        var map, layer;
+        
+        // test v1.0.0
+        map = format.read(v1_0_0, {map: "map"});
+        t.eq(map.center.lon.toPrecision(6), (-95).toPrecision(6), "(v1.0.0) map center correctly set");
+        t.eq(map.center.lat.toPrecision(6), (34.5).toPrecision(6), "(v1.0.0) map center correctly set");
+        t.eq(map.maxExtent.left.toPrecision(6), (-130).toPrecision(6), "(v1.0.0) map maxExtent correctly set");
+        t.eq(map.layers.length, 4, "(v1.0.0) correct number of layers");
+        t.eq(map.projection, "EPSG:4326", "(v1.0.0) map projection set correctly");
+        // check out first base layer
+        layer = map.layers[0];
+        t.eq(layer.queryable, true, "(1.0.0) Layer is queryable");    
+        t.ok(layer instanceof OpenLayers.Layer.WMS,
+             "(v1.0.0) wms layer correctly instantiated");
+        t.eq(layer.url, "http://t1.hypercube.telascience.org/cgi-bin/landsat7",
+             "(v1.0.0) layer url correctly set");
+        t.eq(layer.maxExtent.right.toPrecision(6), (-60).toPrecision(6),
+             "(v1.0.0) layer maxExtent correctly set");
+        t.eq(layer.numZoomLevels, 4,
+             "(v1.0.0) layer numZoomLevels correctly set");
+        t.eq(layer.isBaseLayer, true,
+             "(v1.0.0) layer isBaseLayer correctly set for base layer");
+        t.eq(layer.tileSize.w, 512, 
+             "(v1.0.0) layer tileSize width correctly set");
+        t.eq(layer.tileSize.h, 1024, 
+             "(v1.0.0) layer tileSize height correctly set");
+        // check out layer not in switcher
+        layer = map.layers[2];
+        t.eq(layer.displayInLayerSwitcher, false, 
+             "(v1.0.0) layer displayInLayerSwitcher correctly set");
+        t.eq(layer.params["TRANSPARENT"], "TRUE", 
+             "(v1.0.0) layer param.transparent correctly set");
+        t.eq(layer.isBaseLayer, false,
+             "(v1.0.0) layer isBaseLayer correctly set for overlay");
+        // check out single tile overlay
+        layer = map.layers[3];
+        t.eq(layer.singleTile, true, 
+             "(v1.0.0) layer singleTile correctly set");
+        t.eq(layer.opacity, 0.8, 
+             "(v1.0.0) layer opacity correctly set");
+        map.destroy();
+        
+        // test v1.1.0
+        var map = format.read(v1_1_0, {map: "map"});
+        t.eq(map.center.lon.toPrecision(6), (-95).toPrecision(6), "(v1.1.0) map center correctly set");
+        t.eq(map.center.lat.toPrecision(6), (34.5).toPrecision(6), "(v1.1.0) map center correctly set");
+        t.eq(map.maxExtent.left.toPrecision(6), (-130).toPrecision(6), "(v1.1.0) map maxExtent correctly set");
+        t.eq(map.layers.length, 4, "(v1.1.0) correct number of layers");
+        t.eq(map.projection, "EPSG:4326", "(v1.1.0) map projection set correctly");
+        // check out first baseLayer
+        layer = map.layers[0];
+        t.ok(layer instanceof OpenLayers.Layer.WMS,
+             "(v1.1.0) wms layer correctly instantiated");
+        t.eq(layer.url, "http://t1.hypercube.telascience.org/cgi-bin/landsat7",
+             "(v1.1.0) layer url correctly set");
+        t.eq(layer.maxExtent.right.toPrecision(6), (-60).toPrecision(6),
+             "(v1.1.0) layer maxExtent correctly set");
+        t.eq(layer.numZoomLevels, 4,
+             "(v1.1.0) layer numZoomLevels correctly set");
+        t.eq(layer.isBaseLayer, true,
+             "(v1.1.0) layer isBaseLayer correctly set for overlay");
+        // check out layer not in switcher
+        layer = map.layers[2];
+        t.eq(layer.displayInLayerSwitcher, false, 
+             "(v1.1.0) layer displayInLayerSwitcher correctly set");
+        t.eq(layer.params["TRANSPARENT"], "TRUE", 
+             "(v1.1.0) layer param.transparent correctly set");
+        t.eq(layer.isBaseLayer, false,
+             "(v1.1.0) layer isBaseLayer correctly set for overlay");
+        t.eq(layer.minScale.toPrecision(6), (32000000).toPrecision(6), 
+             "(v1.1.0) layer minScale correctly set");
+        t.eq(layer.maxScale.toPrecision(6), (6200000).toPrecision(6), 
+             "(v1.1.0) layer maxScale correctly set");
+        // check out single tile overlay
+        layer = map.layers[3];
+        t.eq(layer.singleTile, true, 
+             "(v1.1.0) layer singleTile correctly set");
+        t.eq(layer.opacity, 0.8, 
+             "(v1.1.0) layer opacity correctly set");
+        map.destroy();
+
+        // test mapOptions
+        var map = format.read(v1_1_0, {map: {foo: 'bar', div: 'map'}});
+        t.eq(map.foo, "bar",
+            "mapOptions correctly passed to the created map object");
+        map.destroy();
+        
+    }
+    
+    function test_Format_WMC_write(t) {
+        
+        var format = new OpenLayers.Format.WMC();        
+        var map = format.read(v1_1_0, {map: "map"});
+        var wmc;
+        
+        function sanitize(str) {
+            // id is unique so we don't expect it to be the same
+            str = str.replace(/OpenLayers_Context_\d+/, "foo");
+            // FF and IE differ on ordering of attribute nodes
+            // a better way to compare xml would be nice
+            str = str.replace(/\s*xsi:schemaLocation=".*?"/, "");
+            str = str.replace(/\s*xmlns:xlink=".*?"/g, "");
+            // and of course floating point precision is an issue
+            str = str.replace(/(-?\d+\.\d+)/g, function(m) {return parseFloat(m).toPrecision(6)});
+            return str;
+        }
+
+        /**
+         * Version 1.0.0 doesn't make the round trip because min/max resolutions
+         * are not stored.  Version 1.1.0 introduced minScaleDenominator and
+         * maxScaleDenominator.  The parser still writes valid WMC v1.0.0, you
+         * just need a validator to prove it.
+         *
+         * The wmc.html example can be used to produce WMC docs for validation.
+         * Prior to validation, the Extension tags need to be removed unless someone
+         * cares to write and maintain some XSD.  Both version 1.0.0 and 1.1.0
+         * validate on http://www.validome.org/xml/.
+         */
+
+        // test v1.1.0
+        if(OpenLayers.Util.getBrowserName()== "opera") {
+            t.plan(0);
+            t.debug_print("WMC writing works but is not tested in Opera");
+        } else {
+            t.plan(1);
+
+            map = format.read(v1_1_0, {map: "map"});
+            wmc = format.write(map);
+            t.eq(sanitize(wmc), sanitize(v1_1_0),
+                 "(v1.1.0) write gives what read got");
+            map.destroy();
+
+        }
+    }
+
+    </script> 
+</head> 
+<body>
+    <div id="map" style="width: 512px; height: 256px;"></div>
+</body> 
+</html> 
diff --git a/tests/Format/WMC/v1.html b/tests/Format/WMC/v1.html
new file mode 100644
index 0000000..840cfc9
--- /dev/null
+++ b/tests/Format/WMC/v1.html
@@ -0,0 +1,207 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_write_wmc_StyleList(t) {
+        t.plan(3);
+        
+        var layer, layerContext, got, expected;
+        
+        var format = new OpenLayers.Format.WMC();
+        var parser = format.getParser("1");
+        var name = "test";
+        var url = "http://foo";
+
+        // test named style
+        layer = new OpenLayers.Layer.WMS(name, url, {
+            styles: "mystyle"
+        });
+        layerContext = format.layerToContext(layer);
+        got = parser.write_wmc_StyleList(layerContext);
+        expected = 
+            "<StyleList xmlns='http://www.opengis.net/context'>" +
+                "<Style current='1'>" +
+                    "<Name>mystyle</Name><Title>Default</Title>" +
+                "</Style>" +
+            "</StyleList>";
+        
+        t.xml_eq(got, expected, "named style correctly written");
+        layer.destroy();
+        
+        // test linked style
+        layer = new OpenLayers.Layer.WMS(name, url, {
+            sld: "http://linked.sld"
+        });
+        layerContext = format.layerToContext(layer);
+        got = parser.write_wmc_StyleList(layerContext);
+        expected = 
+            "<StyleList xmlns='http://www.opengis.net/context'>" +
+                "<Style current='1'>" +
+                    "<SLD>" + 
+                        "<OnlineResource xmlns:xlink='http://www.w3.org/1999/xlink' "+
+                                        "xlink:type='simple' " +
+                                        "xlink:href='http://linked.sld' />" +
+                        "<Name></Name><Title>Default</Title>" +
+                    "</SLD>" + 
+                "</Style>" +
+            "</StyleList>";
+            
+        t.xml_eq(got, expected, "linked style correctly written");
+        layer.destroy();
+        
+        // test inline style
+        layer = new OpenLayers.Layer.WMS(name, url, {
+            sld_body:
+                "<sld:StyledLayerDescriptor version='1.0.0' " +
+                    "xmlns:ogc='http://www.opengis.net/ogc' " +
+                    "xmlns:sld='http://www.opengis.net/sld' " +
+                    "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
+                    "xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd'>" +
+                    "<sld:NamedLayer>" +
+                        "<sld:Name>AAA212</sld:Name>" +
+                        "<sld:UserStyle>" +
+                            "<sld:FeatureTypeStyle>" +
+                                "<sld:Rule>" +
+                                    "<sld:TextSymbolizer>" +
+                                        "<sld:Label>" +
+                                            "<ogc:PropertyName>ZONENR</ogc:PropertyName>" +
+                                        "</sld:Label>" +
+                                        "<sld:Font>" +
+                                            "<sld:CssParameter name='font-family'>Arial</sld:CssParameter>" +
+                                            "<sld:CssParameter name='font-size'>10</sld:CssParameter>" +
+                                        "</sld:Font>" +
+                                        "<sld:Fill>" +
+                                            "<sld:CssParameter name='fill'>#FF9900</sld:CssParameter>" +
+                                        "</sld:Fill>" +
+                                    "</sld:TextSymbolizer>" +
+                                "</sld:Rule>" +
+                            "</sld:FeatureTypeStyle>" +
+                        "</sld:UserStyle>" +
+                    "</sld:NamedLayer>" +
+                "</sld:StyledLayerDescriptor>"
+        });
+        
+        layerContext = format.layerToContext(layer);
+        got = parser.write_wmc_StyleList(layerContext);
+        expected =
+            "<StyleList xmlns='http://www.opengis.net/context'>" +
+                "<Style current='1'>" +
+                    "<SLD>" + 
+                        "<sld:StyledLayerDescriptor version='1.0.0' " +
+                            "xmlns:sld='http://www.opengis.net/sld' " +
+                            "xmlns:ogc='http://www.opengis.net/ogc' " +
+                            "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
+                            "xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd'>" +
+                            "<sld:NamedLayer>" +
+                                "<sld:Name>AAA212</sld:Name>" +
+                                "<sld:UserStyle>" +
+                                    "<sld:FeatureTypeStyle>" +
+                                        "<sld:Rule>" +
+                                            "<sld:TextSymbolizer>" +
+                                                "<sld:Label>" +
+                                                    "<ogc:PropertyName>ZONENR</ogc:PropertyName>" +
+                                                "</sld:Label>" +
+                                                "<sld:Font>" +
+                                                    "<sld:CssParameter name='font-family'>Arial</sld:CssParameter>" +
+                                                    "<sld:CssParameter name='font-size'>10</sld:CssParameter>" +
+                                                "</sld:Font>" +
+                                                "<sld:Fill>" +
+                                                    "<sld:CssParameter name='fill'>#FF9900</sld:CssParameter>" +
+                                                "</sld:Fill>" +
+                                            "</sld:TextSymbolizer>" +
+                                        "</sld:Rule>" +
+                                    "</sld:FeatureTypeStyle>" +
+                                "</sld:UserStyle>" +
+                            "</sld:NamedLayer>" +
+                        "</sld:StyledLayerDescriptor>" +
+                        "<Name></Name><Title>Default</Title>" +
+                    "</SLD>" +
+                "</Style>" + 
+            "</StyleList>";
+        
+        t.xml_eq(got, expected, "inline style correctly written");
+        layer.destroy();
+    }
+    
+    function test_read_wmc_StyleList(t) {
+        t.plan(3);
+        
+        var xml = new OpenLayers.Format.XML();
+        var format = new OpenLayers.Format.WMC();
+        var parser = format.getParser("1");
+        var node, text, layerContext, layer;
+
+        // test named style
+        text = 
+            "<StyleList xmlns='http://www.opengis.net/context'>" +
+                "<Style current='1'>" +
+                    "<Name>mystyle</Name><Title>Default</Title>" +
+                "</Style>" +
+            "</StyleList>";
+        node = xml.read(text).documentElement;
+        layerContext = {
+            styles: []
+        };
+        parser.read_wmc_StyleList(layerContext, node);
+        layer = format.getLayerFromContext(layerContext);
+        t.eq(layer.params.STYLES, "mystyle", "named style correctly read");
+        
+        // test linked style
+        text = 
+            "<StyleList xmlns='http://www.opengis.net/context'>" +
+                "<Style current='1'>" +
+                    "<SLD>" + 
+                        "<OnlineResource xmlns:xlink='http://www.w3.org/1999/xlink' "+
+                                        "xlink:type='simple' " +
+                                        "xlink:href='http://linked.sld' />" +
+                    "</SLD>" + 
+                "</Style>" +
+            "</StyleList>";
+        node = xml.read(text).documentElement;
+        layerContext = {
+            styles: []
+        };
+        parser.read_wmc_StyleList(layerContext, node);
+        layer = format.getLayerFromContext(layerContext);
+        t.eq(layer.params.SLD, "http://linked.sld", "linked style correctly read");        
+        
+        // test inline style
+        // any valid xml under the StyledLayerDescriptor node should make the
+        // round trip from string to node and back
+        text = 
+            "<StyleList xmlns='http://www.opengis.net/context'>" +
+                "<Style current='1'>" +
+                    "<SLD>" + 
+                        "<sld:StyledLayerDescriptor version='1.0.0' " +
+                            "xmlns:sld='http://www.opengis.net/sld' " +
+                            "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
+                            "xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd'>" +
+                            "<foo>bar<more/></foo>" + 
+                        "</sld:StyledLayerDescriptor>" + 
+                    "</SLD>" + 
+                "</Style>" +
+            "</StyleList>";
+        node = xml.read(text).documentElement;
+        layerContext = {
+            styles: []
+        };
+        parser.read_wmc_StyleList(layerContext, node);        
+        layer = format.getLayerFromContext(layerContext);
+        var expected = 
+            "<sld:StyledLayerDescriptor version='1.0.0' " +
+                "xmlns:sld='http://www.opengis.net/sld' " +
+                "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
+                "xsi:schemaLocation='http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd'>" +
+                "<foo xmlns='http://www.opengis.net/context'>bar<more/></foo>" + 
+            "</sld:StyledLayerDescriptor>";
+        t.xml_eq(layer.params.SLD_BODY, expected, "inline style correctly read");
+
+    }
+    
+
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/WMC/v1_1_0.html b/tests/Format/WMC/v1_1_0.html
new file mode 100644
index 0000000..203e849
--- /dev/null
+++ b/tests/Format/WMC/v1_1_0.html
@@ -0,0 +1,86 @@
+<html>
+<head>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_write_wmc_Layer(t) {
+        if (OpenLayers.Util.getBrowserName() == "safari") {
+            t.plan(0);
+            t.debug_print("Safari has wierd behavior with getElementsByTagNameNS: the result is that we can't run these tests there. Patches welcome.");
+            return;
+        }
+        t.plan(12);
+
+        // direct construction of a parser for a unit test
+        var format = new OpenLayers.Format.WMC();
+        var parser = format.getParser("1_1_0");
+        var sldNS = parser.namespaces["sld"];
+
+        // test that Min/MaxScaleDenominator is not written out when no
+        // resolution related options are set
+        var layer = new OpenLayers.Layer.WMS(
+            "test", "http://foo", {},
+            {maxExtent: new OpenLayers.Bounds(1, 2, 3, 4)}
+        );
+        var layerContext = format.layerToContext(layer);
+        var node = parser.write_wmc_Layer(layerContext);
+        var minList = parser.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator");
+        t.eq(minList.length, 0, "(none) node not written with MinScaleDenominator");
+        var maxList = parser.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator");
+        t.eq(maxList.length, 0, "(none) node not written with MaxScaleDenominator");
+
+        // test that Min/MaxScaleDenominator is written out for explicit
+        // resolutions array
+        layer = new OpenLayers.Layer.WMS(
+            "test", "http://foo", {},
+            {resolutions: [4, 2, 1], maxExtent: new OpenLayers.Bounds(1, 2, 3, 4)}
+        );
+        layer.minScale = Math.random();
+        layer.maxScale = Math.random();
+        sldNS = parser.namespaces["sld"];
+        layerContext = format.layerToContext(layer);
+        node = parser.write_wmc_Layer(layerContext);
+        minList = parser.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator");
+        t.eq(minList.length, 1, "(resolutions) node written with MinScaleDenominator");
+        t.eq(layer.maxScale.toPrecision(16), parser.getChildValue(minList[0]),
+             "(resolutions) node written with correct MinScaleDenominator value");
+        maxList = parser.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator");
+        t.eq(maxList.length, 1, "(resolutions) node written with MaxScaleDenominator");
+        t.eq(layer.minScale.toPrecision(16), parser.getChildValue(maxList[0]),
+             "(resolutions) node written with correct MaxScaleDenominator value");
+
+        layer = new OpenLayers.Layer.WMS(
+            "test", "http://foo", {},
+            {scales: [4, 2, 1], maxExtent: new OpenLayers.Bounds(1, 2, 3, 4)}
+        );
+        layer.minScale = Math.random();
+        layer.maxScale = Math.random();
+        layerContext = format.layerToContext(layer);
+        node = parser.write_wmc_Layer(layerContext);
+        minList = parser.getElementsByTagNameNS(node, sldNS, "MinScaleDenominator");
+        var f = new OpenLayers.Format.XML();
+        t.eq(minList.length, 1, "(scales) node written with MinScaleDenominator");
+        t.eq(layer.maxScale.toPrecision(16), parser.getChildValue(minList[0]),
+             "(scales) node written with correct MinScaleDenominator value");
+        maxList = parser.getElementsByTagNameNS(node, sldNS, "MaxScaleDenominator");
+        t.eq(maxList.length, 1, "(scales) node written with MaxScaleDenominator");
+        t.eq(layer.minScale.toPrecision(16), parser.getChildValue(maxList[0]),
+             "(scales) node written with correct MaxScaleDenominator value");
+
+        layer.metadataURL = 'http://foo';
+        layerContext = format.layerToContext(layer);
+        node = parser.write_wmc_Layer(layerContext);
+        t.eq(node.childNodes[3].localName || node.childNodes[3].nodeName.split(":").pop(),
+            'MetadataURL', "MinScaleDenominator is written after MetadataURL, so third node should be MetadataURL");
+        t.eq(node.childNodes[4].localName || node.childNodes[4].nodeName.split(":").pop(),
+            'MinScaleDenominator', "MinScaleDenominator is written after MetadataURL, so fourth node should be MinScaleDenominator");
+
+    }
+
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 512px; height: 256px;"></div>
+</body>
+</html>
diff --git a/tests/Format/WMSCapabilities.html b/tests/Format/WMSCapabilities.html
new file mode 100644
index 0000000..3dbce9d
--- /dev/null
+++ b/tests/Format/WMSCapabilities.html
@@ -0,0 +1,20 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_initialize(t) {
+        
+        t.plan(1);
+        var format = new OpenLayers.Format.WMSCapabilities({
+            version: "foo"
+        });
+        t.eq(format.version, "foo", "version set on format");
+        
+    }
+    
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/WMSCapabilities/v1_1_1.html b/tests/Format/WMSCapabilities/v1_1_1.html
new file mode 100644
index 0000000..0c40927
--- /dev/null
+++ b/tests/Format/WMSCapabilities/v1_1_1.html
@@ -0,0 +1,5140 @@
+<html> 
+<head> 
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_read(t) {
+        
+        t.plan(15);
+
+        var xml = document.getElementById("gssample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+        var format = new OpenLayers.Format.WMSCapabilities();
+        var obj = format.read(doc);
+        
+        var capability = obj.capability;
+        t.ok(capability, "object contains capability property");
+        
+        var getmap = capability.request.getmap;
+        t.eq(getmap.formats.length, 28, "getmap formats parsed");
+        t.eq(
+            getmap.href,
+            "http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&",
+            "getmap href parsed"
+        );
+        
+        t.ok(capability.layers, "layers parsed");
+        t.eq(capability.layers.length, 22, "correct number of layers parsed");
+        
+        var layer = capability.layers[2];
+        t.eq(layer.name, "tiger:tiger_roads", "[2] correct layer name");
+        t.eq(layer.prefix, "tiger", "[2] correct layer prefix");
+        t.eq(layer.title, "Manhattan (NY) roads", "[2] correct layer title");
+        t.eq(
+            layer["abstract"],
+            "Highly simplified road layout of Manhattan in New York..",
+            "[2] correct layer abstract"
+        );
+        t.eq(
+            layer.llbbox,
+            [-74.08769307536667, 40.660618924633326, -73.84653192463333, 40.90178007536667],
+            "[2] correct layer bbox"
+        );
+        t.eq(layer.styles.length, 1, "[2] correct styles length");
+        t.eq(layer.styles[0].name, "tiger_roads", "[2] correct style name");
+        t.eq(
+            layer.styles[0].legend.href,
+            "http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:tiger_roads",
+            "[2] correct legend url"
+        );
+        t.eq(
+            layer.styles[0].legend.format, "image/png",
+            "[2] correct legend format"
+        );
+        t.eq(layer.queryable, true, "[2] correct queryable attribute");
+        
+
+    }
+
+    function test_layers(t) {
+
+        t.plan(22);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var capability = obj.capability;
+
+        var layers = {};
+        for (var i=0, len=capability.layers.length; i<len; i++) {
+            if ("name" in capability.layers[i]) {
+                layers[ capability.layers[i].name ] = capability.layers[i];
+            }
+        }
+
+        var rootlayer = capability.layers[ capability.layers.length - 1];
+
+        t.eq(rootlayer.srs, 
+             {"EPSG:4326": true},
+             "SRS parsed correctly for root layer");
+        t.eq(layers["ROADS_RIVERS"].srs,
+             {"EPSG:4326": true, "EPSG:26986": true},
+             "Inheritance of SRS handled correctly when adding SRSes");
+        t.eq(layers["Temperature"].srs,
+             {"EPSG:4326": true},
+             "Inheritance of SRS handled correctly when redeclaring an inherited SRS");
+
+        var bbox = layers["ROADS_RIVERS"].bbox["EPSG:26986"];
+        t.eq(bbox.bbox,
+             [189000, 834000, 285000, 962000],
+             "Correct bbox from BoundingBox");
+        t.eq(bbox.res, {x: 1, y: 1}, "Correct resolution");
+
+        bbox = layers["ROADS_1M"].bbox["EPSG:26986"];
+        t.eq(bbox.bbox,
+             [189000, 834000, 285000, 962000],
+             "Correctly inherited bbox");
+        t.eq(bbox.res, {x: 1, y: 1}, "Correctly inherited resolution");
+
+
+        var identifiers = layers["ROADS_RIVERS"].identifiers;
+        var authorities = layers["ROADS_RIVERS"].authorityURLs;
+
+        t.ok(identifiers, "got identifiers from layer ROADS_RIVERS");
+        t.ok("DIF_ID" in identifiers,
+             "authority attribute from Identifiers parsed correctly");
+        t.eq(identifiers["DIF_ID"],
+             "123456",
+             "Identifier value parsed correctly");
+        t.ok("DIF_ID" in authorities,
+             "AuthorityURLs parsed and inherited correctly");
+        t.eq(authorities["DIF_ID"],
+             "http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html",
+             "OnlineResource in AuthorityURLs parsed correctly");
+
+        var featurelist = layers["ROADS_RIVERS"].featureListURL;
+        t.ok(featurelist, "layer has FeatureListURL");
+        t.eq(featurelist.format,
+             "application/vnd.ogc.se_xml",
+             "FeatureListURL format parsed correctly");
+        t.eq(featurelist.href,
+             "http://www.university.edu/data/roads_rivers.gml",
+             "FeatureListURL OnlineResource parsed correctly");
+
+        t.eq(layers["Pressure"].queryable,
+             true,
+             "queryable property inherited correctly");
+        t.eq(layers["ozone_image"].queryable,
+             false,
+             "queryable property has correct default value");
+        t.eq(layers["population"].cascaded,
+             1,
+             "cascaded property parsed correctly");
+        t.eq(layers["ozone_image"].fixedWidth,
+             512,
+             "fixedWidth property correctly parsed");
+        t.eq(layers["ozone_image"].fixedHeight,
+             256,
+             "fixedHeight property correctly parsed");
+        t.eq(layers["ozone_image"].opaque,
+             true,
+             "opaque property parsed correctly");
+        t.eq(layers["ozone_image"].noSubsets,
+             true,
+             "noSubsets property parsed correctly");
+
+
+    }
+
+    function test_dimensions(t) {
+
+        t.plan(8);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var capability = obj.capability;
+
+        var layers = {};
+        for (var i=0, len=capability.layers.length; i<len; i++) {
+            if ("name" in capability.layers[i]) {
+                layers[ capability.layers[i].name ] = capability.layers[i];
+            }
+        }
+
+        var time = layers["Clouds"].dimensions.time;
+        t.eq(time["default"], "2000-08-22", "Default time value parsed correctly");
+        t.eq(time.values.length, 1, "Currect number of time extent values/periods");
+        t.eq(time.values[0], "1999-01-01/2000-08-22/P1D", "Time extent values parsed correctly");
+
+        var elevation = layers["Pressure"].dimensions.elevation;
+        t.eq(elevation.units, "EPSG:5030", "Dimension units parsed correctly");
+        t.eq(elevation["default"], "0", "Default elevation value parsed correctly");
+        t.eq(elevation.nearestVal, true, "NearestValue parsed correctly");
+        t.eq(elevation.multipleVal, false, "Absense of MultipleValues handled correctly");
+        t.eq(elevation.values,
+             ["0","1000","3000","5000","10000"],
+             "Parsing of comma-separated values done correctly");
+
+
+    }
+
+    function test_contactinfo(t) {
+        t.plan(15);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var service = obj.service;
+
+        var contactinfo = service.contactInformation;
+        t.ok(contactinfo, "object contains contactInformation property");
+
+        var personPrimary = contactinfo.personPrimary;
+        t.ok(personPrimary, "object contains personPrimary property");
+
+        t.eq(personPrimary.person, "Jeff deLaBeaujardiere", "ContactPerson parsed correctly");
+        t.eq(personPrimary.organization, "NASA", "ContactOrganization parsed correctly");
+
+        t.eq(contactinfo.position,
+             "Computer Scientist",
+             "ContactPosition parsed correctly");
+
+
+        var addr = contactinfo.contactAddress;
+        t.ok(addr, "object contains contactAddress property");
+
+        t.eq(addr.type, "postal", "AddressType parsed correctly");
+        t.eq(addr.address,
+             "NASA Goddard Space Flight Center, Code 933",
+             "Address parsed correctly");
+        t.eq(addr.city, "Greenbelt", "City parsed correctly");
+        t.eq(addr.stateOrProvince, "MD", "StateOrProvince parsed correctly");
+        t.eq(addr.postcode, "20771", "PostCode parsed correctly");
+        t.eq(addr.country, "USA", "Country parsed correctly");
+
+        t.eq(contactinfo.phone,
+             "+1 301 286-1569",
+             "ContactVoiceTelephone parsed correctly");
+        t.eq(contactinfo.fax,
+             "+1 301 286-1777",
+             "ContactFacsimileTelephone parsed correctly");
+        t.eq(contactinfo.email,
+             "delabeau at iniki.gsfc.nasa.gov",
+             "ContactElectronicMailAddress parsed correctly");
+    }
+    
+    function test_feesAndConstraints(t) {
+        t.plan(2);
+
+        var xml = document.getElementById("gssample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var service = obj.service;
+
+        t.ok(! ("fees" in service), "Fees=none handled correctly");
+        t.ok(! ("accessConstraints" in service), "AccessConstraints=none handled correctly");
+    }
+
+    function test_requests(t) {
+        t.plan(13);
+
+        var xml = document.getElementById("gssample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var request = obj.capability.request;
+
+        t.ok(request, "request property exists");
+        t.ok("getmap" in request, "got GetMap request");
+
+        t.ok("getfeatureinfo" in request, "got GetFeatureInfo request");
+        t.eq(request.getfeatureinfo.formats,
+             ["text/plain", "text/html", "application/vnd.ogc.gml"],
+             "GetFeatureInfo formats correctly parsed");
+
+        t.ok("describelayer" in request, "got DescribeLayer request");
+
+        t.ok("getlegendgraphic" in request, "got GetLegendGraphic request");
+
+        var exception = obj.capability.exception;
+        t.ok(exception, "exception property exists");
+        t.eq(exception.formats,
+             ["application/vnd.ogc.se_xml"],
+             "Exception Format parsed");
+
+        var userSymbols = obj.capability.userSymbols;
+        t.ok(userSymbols, "userSymbols property exists");
+        t.eq(userSymbols.supportSLD, true, "supportSLD parsed");
+        t.eq(userSymbols.userLayer,  true, "userLayer parsed");
+        t.eq(userSymbols.userStyle,  true, "userStyle parsed");
+        t.eq(userSymbols.remoteWFS,  true, "remoteWFS parsed");
+
+    }
+    function test_ogc(t) {
+        t.plan(14)
+
+        /*
+         * Set up
+         */
+        
+        // needed for the minScale/maxScale test, see below
+        var dpi = OpenLayers.DOTS_PER_INCH;
+        OpenLayers.DOTS_PER_INCH = 90.71;
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var capability = obj.capability;
+
+        /*
+         * Test
+         */
+        
+        var attribution = capability.layers[2].attribution;
+        t.eq(attribution.title, "State College University", "attribution title parsed correctly.");
+        t.eq(attribution.href, "http://www.university.edu/", "attribution href parsed correctly.")
+        t.eq(attribution.logo.href, "http://www.university.edu/icons/logo.gif", "attribution logo url parsed correctly.");
+        t.eq(attribution.logo.format, "image/gif", "attribution logo format parsed correctly.");
+        t.eq(attribution.logo.width, "100", "attribution logo width parsed correctly.");
+        t.eq(attribution.logo.height, "100", "attribution logo height parsed correctly.");
+        
+        var keywords = capability.layers[0].keywords;
+        t.eq(keywords.length, 3, "layer has 3 keywords.");
+        t.eq(keywords[0], "road", "1st keyword parsed correctly.");
+        
+        var metadataURLs = capability.layers[0].metadataURLs;
+        t.eq(metadataURLs.length, 2, "layer has 2 metadata urls.");
+        t.eq(metadataURLs[0].type, "FGDC", "type parsed correctly.");
+        t.eq(metadataURLs[0].format, "text/plain", "format parsed correctly.");
+        t.eq(metadataURLs[0].href, "http://www.university.edu/metadata/roads.txt", "href parsed correctly.");
+
+        /*
+        Test minScale and maxScale
+
+        For Mapserver
+
+        <ScaleHint min="0.395998292216226" max="98.9995730540565" />
+
+        corresponds to (RESOLUTION keyword in MAP file has value of 90.71):
+
+        MAXSCALE 250000
+        MINSCALE 1000
+
+        */
+        t.eq(capability.layers[0].minScale, 250000, "layer.minScale is correct");
+        t.eq(capability.layers[0].maxScale, 1000, "layer.maxScale is correct");
+
+        /*
+         * Tear down
+         */
+
+        OpenLayers.DOTS_PER_INCH = dpi;
+    }
+    
+    </script> 
+</head> 
+<body>
+
+<!--
+OGC example below taken from
+http://schemas.opengis.net/wms/1.1.1/capabilities_1_1_1.xml
+Copyright © 1994-2008 Open Geospatial Consortium, Inc. All Rights Reserved.
+http://www.opengeospatial.org/ogc/document
+Changes:
+* fixed DTD URL
+* removed comments
+-->
+<div id="ogcsample"><!--
+<?xml version='1.0' encoding="UTF-8" standalone="no" ?>
+<!DOCTYPE WMT_MS_Capabilities SYSTEM
+ "http://schemas.opengis.net/wms/1.1.1/capabilities_1_1_1.dtd"
+ [
+ <!ELEMENT VendorSpecificCapabilities EMPTY>
+ ]>
+
+<WMT_MS_Capabilities version="1.1.1" updateSequence="0">
+<Service>
+
+  <Name>OGC:WMS</Name>
+  <Title>Acme Corp. Map Server</Title>
+  <Abstract>WMT Map Server maintained by Acme Corporation.  Contact: webmaster at wmt.acme.com.  High-quality maps showing roadrunner nests and possible ambush locations.</Abstract>
+  <KeywordList>
+
+    <Keyword>bird</Keyword>
+    <Keyword>roadrunner</Keyword>
+    <Keyword>ambush</Keyword>
+  </KeywordList>
+  <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+   xlink:href="http://hostname/" />
+
+  <ContactInformation>
+    <ContactPersonPrimary>
+      <ContactPerson>Jeff deLaBeaujardiere</ContactPerson>
+      <ContactOrganization>NASA</ContactOrganization>
+    </ContactPersonPrimary>
+    <ContactPosition>Computer Scientist</ContactPosition>
+    <ContactAddress>
+
+      <AddressType>postal</AddressType>
+      <Address>NASA Goddard Space Flight Center, Code 933</Address>
+      <City>Greenbelt</City>
+      <StateOrProvince>MD</StateOrProvince>
+      <PostCode>20771</PostCode>
+      <Country>USA</Country>
+
+    </ContactAddress>
+    <ContactVoiceTelephone>+1 301 286-1569</ContactVoiceTelephone>
+    <ContactFacsimileTelephone>+1 301 286-1777</ContactFacsimileTelephone>
+    <ContactElectronicMailAddress>delabeau at iniki.gsfc.nasa.gov</ContactElectronicMailAddress>
+  </ContactInformation>
+  <Fees>none</Fees>
+
+  <AccessConstraints>none</AccessConstraints>
+</Service>
+<Capability>
+  <Request>
+    <GetCapabilities>
+      <Format>application/vnd.ogc.wms_xml</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname:port/path" />
+          </Get>
+          <Post>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname:port/path" />
+          </Post>
+        </HTTP>
+      </DCPType>
+
+    </GetCapabilities>
+    <GetMap>
+      <Format>image/gif</Format>
+      <Format>image/png</Format>
+      <Format>image/jpeg</Format>
+      <DCPType>
+        <HTTP>
+
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname:port/path" />
+          </Get>
+        </HTTP>
+      </DCPType>
+    </GetMap>
+    <GetFeatureInfo>
+      <Format>application/vnd.ogc.gml</Format>
+
+      <Format>text/plain</Format>
+      <Format>text/html</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname:port/path" />
+          </Get>
+        </HTTP>
+
+      </DCPType>
+    </GetFeatureInfo>
+    <DescribeLayer>
+      <Format>application/vnd.ogc.gml</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname:port/path" />
+
+          </Get>
+        </HTTP>
+      </DCPType>
+    </DescribeLayer>
+  </Request>
+  <Exception>
+    <Format>application/vnd.ogc.se_xml</Format>
+    <Format>application/vnd.ogc.se_inimage</Format>
+
+    <Format>application/vnd.ogc.se_blank</Format>
+  </Exception>
+  <VendorSpecificCapabilities />
+  <UserDefinedSymbolization SupportSLD="1" UserLayer="1" UserStyle="1"
+    RemoteWFS="1" />
+
+  <Layer>
+    <Title>Acme Corp. Map Server</Title>
+    <SRS>EPSG:4326</SRS>
+    <AuthorityURL name="DIF_ID">
+      <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+       xlink:href="http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html" />
+    </AuthorityURL>
+
+
+    <Layer>
+      <Name>ROADS_RIVERS</Name> 
+      <Title>Roads and Rivers</Title>
+      <SRS>EPSG:26986</SRS> 
+      <LatLonBoundingBox minx="-71.63" miny="41.75" maxx="-70.78" maxy="42.90"/>
+      <BoundingBox SRS="EPSG:4326"
+       minx="-71.63" miny="41.75" maxx="-70.78" maxy="42.90" resx="0.01" resy="0.01"/>
+
+      <BoundingBox SRS="EPSG:26986"
+       minx="189000" miny="834000" maxx="285000" maxy="962000" resx="1" resy="1" />
+      <Attribution>
+        <Title>State College University</Title>
+        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+         xlink:href="http://www.university.edu/" />
+        <LogoURL width="100" height="100">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/icons/logo.gif" />
+
+        </LogoURL>
+      </Attribution>
+      <Identifier authority="DIF_ID">123456</Identifier>
+      <FeatureListURL>
+        <Format>application/vnd.ogc.se_xml</Format>
+        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+         xlink:href="http://www.university.edu/data/roads_rivers.gml" />
+      </FeatureListURL>
+
+      <Style>
+        <Name>USGS</Name>
+        <Title>USGS Topo Map Style</Title>
+        <Abstract>Features are shown in a style like that used in USGS topographic maps.</Abstract>
+        <LegendURL width="72" height="72">
+          <Format>image/gif</Format>
+
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/legends/usgs.gif" />
+        </LegendURL>
+        <StyleSheetURL>
+          <Format>text/xsl</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/stylesheets/usgs.xsl" />
+        </StyleSheetURL>
+      </Style>
+
+      <ScaleHint min="4000" max="35000"></ScaleHint>
+
+
+      <Layer queryable="1">
+    <Name>ROADS_1M</Name> 
+    <Title>Roads at 1:1M scale</Title>
+    <Abstract>Roads at a scale of 1 to 1 million.</Abstract>
+    <KeywordList>
+          <Keyword>road</Keyword>
+
+          <Keyword>transportation</Keyword>
+          <Keyword>atlas</Keyword>
+    </KeywordList>
+    <Identifier authority="DIF_ID">123456</Identifier>
+    <MetadataURL type="FGDC">
+          <Format>text/plain</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/metadata/roads.txt" />
+        </MetadataURL>
+    <MetadataURL type="FGDC">
+           <Format>text/xml</Format>
+           <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+            xlink:type="simple"
+            xlink:href="http://www.university.edu/metadata/roads.xml" />
+        </MetadataURL>
+    <Style>
+
+      <Name>ATLAS</Name>
+      <Title>Road atlas style</Title>
+      <Abstract>Roads are shown in a style like that used in a commercial road atlas.</Abstract>
+        <LegendURL width="72" height="72">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/legends/atlas.gif" />
+        </LegendURL>
+
+    </Style>
+      <ScaleHint min="0.395998292216226" max="98.9995730540565" />
+      </Layer>
+      <Layer queryable="1">
+    <Name>RIVERS_1M</Name>
+    <Title>Rivers at 1:1M scale</Title>
+    <Abstract>Rivers at a scale of 1 to 1 million.</Abstract>
+    <KeywordList>
+
+          <Keyword>river</Keyword>
+          <Keyword>canal</Keyword>
+          <Keyword>waterway</Keyword>
+    </KeywordList>
+      </Layer>
+    </Layer>
+    <Layer queryable="1">
+
+      <Title>Weather Forecast Data</Title>
+      <SRS>EPSG:4326</SRS>
+      <LatLonBoundingBox minx="-180" miny="-90" maxx="180" maxy="90" />
+      <Dimension name="time" units="ISO8601" />
+      <Extent name="time" default="2000-08-22">1999-01-01/2000-08-22/P1D</Extent>
+
+      <Layer>
+    <Name>Clouds</Name> 
+    <Title>Forecast cloud cover</Title>
+      </Layer>
+
+      <Layer>
+    <Name>Temperature</Name> 
+    <Title>Forecast temperature</Title>
+      </Layer>
+
+      <Layer>
+    <Name>Pressure</Name> 
+    <Title>Forecast barometric pressure</Title>
+         <Dimension name="time" units="ISO8601" />
+         <Dimension name="elevation" units="EPSG:5030" />
+         <Extent name="time" default="2000-08-22">1999-01-01/2000-08-22/P1D</Extent>
+         <Extent name="elevation" default="0" nearestValue="1">0,1000,3000,5000,10000</Extent>
+      </Layer>
+
+    </Layer>
+
+    <Layer opaque="1" noSubsets="1" fixedWidth="512" fixedHeight="256">
+      <Name>ozone_image</Name>
+      <Title>Global ozone distribution (1992)</Title>
+      <LatLonBoundingBox minx="-180" miny="-90" maxx="180" maxy="90" />
+      <Extent name="time" default="1992">1992</Extent>
+    </Layer>
+
+    <Layer cascaded="1">
+      <Name>population</Name>
+      <Title>World population, annual</Title>
+      <LatLonBoundingBox minx="-180" miny="-90" maxx="180" maxy="90" />
+      <Extent name="time" default="2000">1990/2000/P1Y</Extent>
+    </Layer>
+
+  </Layer>
+
+
+</Capability>
+</WMT_MS_Capabilities>
+--></div>
+<!--
+GeoServer example below taken from
+http://publicus.opengeo.org/geoserver/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities
+Changes:
+* fixed DTD URL (publicus is no longer available)
+* removed comments
+-->
+<div id="gssample"><!--
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE WMT_MS_Capabilities SYSTEM "http://schemas.opengis.net/wms/1.1.1/capabilities_1_1_1.dtd">
+<WMT_MS_Capabilities version="1.1.1" updateSequence="57">
+  <Service>
+    <Name>OGC:WMS</Name>
+    <Title>GeoServer Web Map Service</Title>
+    <Abstract>A compliant implementation of WMS 1.1.1 plus most of the SLD 1.0 extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS</Abstract>
+    <KeywordList>
+      <Keyword>WFS</Keyword>
+      <Keyword>WMS</Keyword>
+      <Keyword>GEOSERVER</Keyword>
+    </KeywordList>
+    <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms"/>
+    <ContactInformation>
+      <ContactPersonPrimary>
+        <ContactPerson>Claudius Ptolomaeus</ContactPerson>
+        <ContactOrganization>The ancient geographes INC</ContactOrganization>
+      </ContactPersonPrimary>
+      <ContactPosition>Chief geographer</ContactPosition>
+      <ContactAddress>
+        <AddressType>Work</AddressType>
+        <Address/>
+        <City>Alexandria</City>
+        <StateOrProvince/>
+        <PostCode/>
+        <Country>Egypt</Country>
+      </ContactAddress>
+      <ContactVoiceTelephone/>
+      <ContactFacsimileTelephone/>
+      <ContactElectronicMailAddress>claudius.ptolomaeus at gmail.com</ContactElectronicMailAddress>
+    </ContactInformation>
+    <Fees>NONE</Fees>
+    <AccessConstraints>NONE</AccessConstraints>
+  </Service>
+  <Capability>
+    <Request>
+      <GetCapabilities>
+        <Format>application/vnd.ogc.wms_xml</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+            <Post>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&"/>
+            </Post>
+          </HTTP>
+        </DCPType>
+      </GetCapabilities>
+      <GetMap>
+        <Format>image/png</Format>
+        <Format>application/atom xml</Format>
+        <Format>application/atom+xml</Format>
+        <Format>application/openlayers</Format>
+        <Format>application/pdf</Format>
+        <Format>application/rss xml</Format>
+        <Format>application/rss+xml</Format>
+        <Format>application/vnd.google-earth.kml</Format>
+        <Format>application/vnd.google-earth.kml xml</Format>
+        <Format>application/vnd.google-earth.kml+xml</Format>
+        <Format>application/vnd.google-earth.kmz</Format>
+        <Format>application/vnd.google-earth.kmz xml</Format>
+        <Format>application/vnd.google-earth.kmz+xml</Format>
+        <Format>atom</Format>
+        <Format>image/geotiff</Format>
+        <Format>image/geotiff8</Format>
+        <Format>image/gif</Format>
+        <Format>image/jpeg</Format>
+        <Format>image/png8</Format>
+        <Format>image/svg</Format>
+        <Format>image/svg xml</Format>
+        <Format>image/svg+xml</Format>
+        <Format>image/tiff</Format>
+        <Format>image/tiff8</Format>
+        <Format>kml</Format>
+        <Format>kmz</Format>
+        <Format>openlayers</Format>
+        <Format>rss</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+          </HTTP>
+        </DCPType>
+      </GetMap>
+      <GetFeatureInfo>
+        <Format>text/plain</Format>
+        <Format>text/html</Format>
+        <Format>application/vnd.ogc.gml</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+            <Post>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&"/>
+            </Post>
+          </HTTP>
+        </DCPType>
+      </GetFeatureInfo>
+      <DescribeLayer>
+        <Format>application/vnd.ogc.wms_xml</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+          </HTTP>
+        </DCPType>
+      </DescribeLayer>
+      <GetLegendGraphic>
+        <Format>image/png</Format>
+        <Format>image/jpeg</Format>
+        <Format>image/gif</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+          </HTTP>
+        </DCPType>
+      </GetLegendGraphic>
+    </Request>
+    <Exception>
+      <Format>application/vnd.ogc.se_xml</Format>
+    </Exception>
+    <UserDefinedSymbolization SupportSLD="1" UserLayer="1" UserStyle="1" RemoteWFS="1"/>
+    <Layer>
+      <Title>GeoServer Web Map Service</Title>
+      <Abstract>A compliant implementation of WMS 1.1.1 plus most of the SLD 1.0 extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS</Abstract>
+      <SRS>EPSG:WGS84(DD)</SRS>
+      <SRS>EPSG:2000</SRS>
+      <SRS>EPSG:2001</SRS>
+      <SRS>EPSG:2002</SRS>
+      <SRS>EPSG:2003</SRS>
+      <SRS>EPSG:2004</SRS>
+      <SRS>EPSG:2005</SRS>
+      <SRS>EPSG:2006</SRS>
+      <SRS>EPSG:2007</SRS>
+      <SRS>EPSG:2008</SRS>
+      <SRS>EPSG:2009</SRS>
+      <SRS>EPSG:2010</SRS>
+      <SRS>EPSG:2011</SRS>
+      <SRS>EPSG:2012</SRS>
+      <SRS>EPSG:2013</SRS>
+      <SRS>EPSG:2014</SRS>
+      <SRS>EPSG:2015</SRS>
+      <SRS>EPSG:2016</SRS>
+      <SRS>EPSG:2017</SRS>
+      <SRS>EPSG:2018</SRS>
+      <SRS>EPSG:2019</SRS>
+      <SRS>EPSG:2020</SRS>
+      <SRS>EPSG:2021</SRS>
+      <SRS>EPSG:2022</SRS>
+      <SRS>EPSG:2023</SRS>
+      <SRS>EPSG:2024</SRS>
+      <SRS>EPSG:2025</SRS>
+      <SRS>EPSG:2026</SRS>
+      <SRS>EPSG:2027</SRS>
+      <SRS>EPSG:2028</SRS>
+      <SRS>EPSG:2029</SRS>
+      <SRS>EPSG:2030</SRS>
+      <SRS>EPSG:2031</SRS>
+      <SRS>EPSG:2032</SRS>
+      <SRS>EPSG:2033</SRS>
+      <SRS>EPSG:2034</SRS>
+      <SRS>EPSG:2035</SRS>
+      <SRS>EPSG:2036</SRS>
+      <SRS>EPSG:2037</SRS>
+      <SRS>EPSG:2038</SRS>
+      <SRS>EPSG:2039</SRS>
+      <SRS>EPSG:2040</SRS>
+      <SRS>EPSG:2041</SRS>
+      <SRS>EPSG:2042</SRS>
+      <SRS>EPSG:2043</SRS>
+      <SRS>EPSG:2044</SRS>
+      <SRS>EPSG:2045</SRS>
+      <SRS>EPSG:2046</SRS>
+      <SRS>EPSG:2047</SRS>
+      <SRS>EPSG:2048</SRS>
+      <SRS>EPSG:2049</SRS>
+      <SRS>EPSG:2050</SRS>
+      <SRS>EPSG:2051</SRS>
+      <SRS>EPSG:2052</SRS>
+      <SRS>EPSG:2053</SRS>
+      <SRS>EPSG:2054</SRS>
+      <SRS>EPSG:2055</SRS>
+      <SRS>EPSG:2056</SRS>
+      <SRS>EPSG:2057</SRS>
+      <SRS>EPSG:2058</SRS>
+      <SRS>EPSG:2059</SRS>
+      <SRS>EPSG:2060</SRS>
+      <SRS>EPSG:2061</SRS>
+      <SRS>EPSG:2062</SRS>
+      <SRS>EPSG:2063</SRS>
+      <SRS>EPSG:2064</SRS>
+      <SRS>EPSG:2065</SRS>
+      <SRS>EPSG:2066</SRS>
+      <SRS>EPSG:2067</SRS>
+      <SRS>EPSG:2068</SRS>
+      <SRS>EPSG:2069</SRS>
+      <SRS>EPSG:2070</SRS>
+      <SRS>EPSG:2071</SRS>
+      <SRS>EPSG:2072</SRS>
+      <SRS>EPSG:2073</SRS>
+      <SRS>EPSG:2074</SRS>
+      <SRS>EPSG:2075</SRS>
+      <SRS>EPSG:2076</SRS>
+      <SRS>EPSG:2077</SRS>
+      <SRS>EPSG:2078</SRS>
+      <SRS>EPSG:2079</SRS>
+      <SRS>EPSG:2080</SRS>
+      <SRS>EPSG:2081</SRS>
+      <SRS>EPSG:2082</SRS>
+      <SRS>EPSG:2083</SRS>
+      <SRS>EPSG:2084</SRS>
+      <SRS>EPSG:2085</SRS>
+      <SRS>EPSG:2086</SRS>
+      <SRS>EPSG:2087</SRS>
+      <SRS>EPSG:2088</SRS>
+      <SRS>EPSG:2089</SRS>
+      <SRS>EPSG:2090</SRS>
+      <SRS>EPSG:2091</SRS>
+      <SRS>EPSG:2092</SRS>
+      <SRS>EPSG:2093</SRS>
+      <SRS>EPSG:2094</SRS>
+      <SRS>EPSG:2095</SRS>
+      <SRS>EPSG:2096</SRS>
+      <SRS>EPSG:2097</SRS>
+      <SRS>EPSG:2098</SRS>
+      <SRS>EPSG:2099</SRS>
+      <SRS>EPSG:2100</SRS>
+      <SRS>EPSG:2101</SRS>
+      <SRS>EPSG:2102</SRS>
+      <SRS>EPSG:2103</SRS>
+      <SRS>EPSG:2104</SRS>
+      <SRS>EPSG:2105</SRS>
+      <SRS>EPSG:2106</SRS>
+      <SRS>EPSG:2107</SRS>
+      <SRS>EPSG:2108</SRS>
+      <SRS>EPSG:2109</SRS>
+      <SRS>EPSG:2110</SRS>
+      <SRS>EPSG:2111</SRS>
+      <SRS>EPSG:2112</SRS>
+      <SRS>EPSG:2113</SRS>
+      <SRS>EPSG:2114</SRS>
+      <SRS>EPSG:2115</SRS>
+      <SRS>EPSG:2116</SRS>
+      <SRS>EPSG:2117</SRS>
+      <SRS>EPSG:2118</SRS>
+      <SRS>EPSG:2119</SRS>
+      <SRS>EPSG:2120</SRS>
+      <SRS>EPSG:2121</SRS>
+      <SRS>EPSG:2122</SRS>
+      <SRS>EPSG:2123</SRS>
+      <SRS>EPSG:2124</SRS>
+      <SRS>EPSG:2125</SRS>
+      <SRS>EPSG:2126</SRS>
+      <SRS>EPSG:2127</SRS>
+      <SRS>EPSG:2128</SRS>
+      <SRS>EPSG:2129</SRS>
+      <SRS>EPSG:2130</SRS>
+      <SRS>EPSG:2131</SRS>
+      <SRS>EPSG:2132</SRS>
+      <SRS>EPSG:2133</SRS>
+      <SRS>EPSG:2134</SRS>
+      <SRS>EPSG:2135</SRS>
+      <SRS>EPSG:2136</SRS>
+      <SRS>EPSG:2137</SRS>
+      <SRS>EPSG:2138</SRS>
+      <SRS>EPSG:2139</SRS>
+      <SRS>EPSG:2140</SRS>
+      <SRS>EPSG:2141</SRS>
+      <SRS>EPSG:2142</SRS>
+      <SRS>EPSG:2143</SRS>
+      <SRS>EPSG:2144</SRS>
+      <SRS>EPSG:2145</SRS>
+      <SRS>EPSG:2146</SRS>
+      <SRS>EPSG:2147</SRS>
+      <SRS>EPSG:2148</SRS>
+      <SRS>EPSG:2149</SRS>
+      <SRS>EPSG:2150</SRS>
+      <SRS>EPSG:2151</SRS>
+      <SRS>EPSG:2152</SRS>
+      <SRS>EPSG:2153</SRS>
+      <SRS>EPSG:2154</SRS>
+      <SRS>EPSG:2155</SRS>
+      <SRS>EPSG:2156</SRS>
+      <SRS>EPSG:2157</SRS>
+      <SRS>EPSG:2158</SRS>
+      <SRS>EPSG:2159</SRS>
+      <SRS>EPSG:2160</SRS>
+      <SRS>EPSG:2161</SRS>
+      <SRS>EPSG:2162</SRS>
+      <SRS>EPSG:2163</SRS>
+      <SRS>EPSG:2164</SRS>
+      <SRS>EPSG:2165</SRS>
+      <SRS>EPSG:2166</SRS>
+      <SRS>EPSG:2167</SRS>
+      <SRS>EPSG:2168</SRS>
+      <SRS>EPSG:2169</SRS>
+      <SRS>EPSG:2170</SRS>
+      <SRS>EPSG:2171</SRS>
+      <SRS>EPSG:2172</SRS>
+      <SRS>EPSG:2173</SRS>
+      <SRS>EPSG:2174</SRS>
+      <SRS>EPSG:2175</SRS>
+      <SRS>EPSG:2176</SRS>
+      <SRS>EPSG:2177</SRS>
+      <SRS>EPSG:2178</SRS>
+      <SRS>EPSG:2179</SRS>
+      <SRS>EPSG:2180</SRS>
+      <SRS>EPSG:2188</SRS>
+      <SRS>EPSG:2189</SRS>
+      <SRS>EPSG:2190</SRS>
+      <SRS>EPSG:2191</SRS>
+      <SRS>EPSG:2192</SRS>
+      <SRS>EPSG:2193</SRS>
+      <SRS>EPSG:2194</SRS>
+      <SRS>EPSG:2195</SRS>
+      <SRS>EPSG:2196</SRS>
+      <SRS>EPSG:2197</SRS>
+      <SRS>EPSG:2198</SRS>
+      <SRS>EPSG:2199</SRS>
+      <SRS>EPSG:2200</SRS>
+      <SRS>EPSG:2201</SRS>
+      <SRS>EPSG:2202</SRS>
+      <SRS>EPSG:2203</SRS>
+      <SRS>EPSG:2204</SRS>
+      <SRS>EPSG:2205</SRS>
+      <SRS>EPSG:2206</SRS>
+      <SRS>EPSG:2207</SRS>
+      <SRS>EPSG:2208</SRS>
+      <SRS>EPSG:2209</SRS>
+      <SRS>EPSG:2210</SRS>
+      <SRS>EPSG:2211</SRS>
+      <SRS>EPSG:2212</SRS>
+      <SRS>EPSG:2213</SRS>
+      <SRS>EPSG:2214</SRS>
+      <SRS>EPSG:2215</SRS>
+      <SRS>EPSG:2216</SRS>
+      <SRS>EPSG:2217</SRS>
+      <SRS>EPSG:2218</SRS>
+      <SRS>EPSG:2219</SRS>
+      <SRS>EPSG:2220</SRS>
+      <SRS>EPSG:2221</SRS>
+      <SRS>EPSG:2222</SRS>
+      <SRS>EPSG:2223</SRS>
+      <SRS>EPSG:2224</SRS>
+      <SRS>EPSG:2225</SRS>
+      <SRS>EPSG:2226</SRS>
+      <SRS>EPSG:2227</SRS>
+      <SRS>EPSG:2228</SRS>
+      <SRS>EPSG:2229</SRS>
+      <SRS>EPSG:2230</SRS>
+      <SRS>EPSG:2231</SRS>
+      <SRS>EPSG:2232</SRS>
+      <SRS>EPSG:2233</SRS>
+      <SRS>EPSG:2234</SRS>
+      <SRS>EPSG:2235</SRS>
+      <SRS>EPSG:2236</SRS>
+      <SRS>EPSG:2237</SRS>
+      <SRS>EPSG:2238</SRS>
+      <SRS>EPSG:2239</SRS>
+      <SRS>EPSG:2240</SRS>
+      <SRS>EPSG:2241</SRS>
+      <SRS>EPSG:2242</SRS>
+      <SRS>EPSG:2243</SRS>
+      <SRS>EPSG:2244</SRS>
+      <SRS>EPSG:2245</SRS>
+      <SRS>EPSG:2246</SRS>
+      <SRS>EPSG:2247</SRS>
+      <SRS>EPSG:2248</SRS>
+      <SRS>EPSG:2249</SRS>
+      <SRS>EPSG:2250</SRS>
+      <SRS>EPSG:2251</SRS>
+      <SRS>EPSG:2252</SRS>
+      <SRS>EPSG:2253</SRS>
+      <SRS>EPSG:2254</SRS>
+      <SRS>EPSG:2255</SRS>
+      <SRS>EPSG:2256</SRS>
+      <SRS>EPSG:2257</SRS>
+      <SRS>EPSG:2258</SRS>
+      <SRS>EPSG:2259</SRS>
+      <SRS>EPSG:2260</SRS>
+      <SRS>EPSG:2261</SRS>
+      <SRS>EPSG:2262</SRS>
+      <SRS>EPSG:2263</SRS>
+      <SRS>EPSG:2264</SRS>
+      <SRS>EPSG:2265</SRS>
+      <SRS>EPSG:2266</SRS>
+      <SRS>EPSG:2267</SRS>
+      <SRS>EPSG:2268</SRS>
+      <SRS>EPSG:2269</SRS>
+      <SRS>EPSG:2270</SRS>
+      <SRS>EPSG:2271</SRS>
+      <SRS>EPSG:2272</SRS>
+      <SRS>EPSG:2273</SRS>
+      <SRS>EPSG:2274</SRS>
+      <SRS>EPSG:2275</SRS>
+      <SRS>EPSG:2276</SRS>
+      <SRS>EPSG:2277</SRS>
+      <SRS>EPSG:2278</SRS>
+      <SRS>EPSG:2279</SRS>
+      <SRS>EPSG:2280</SRS>
+      <SRS>EPSG:2281</SRS>
+      <SRS>EPSG:2282</SRS>
+      <SRS>EPSG:2283</SRS>
+      <SRS>EPSG:2284</SRS>
+      <SRS>EPSG:2285</SRS>
+      <SRS>EPSG:2286</SRS>
+      <SRS>EPSG:2287</SRS>
+      <SRS>EPSG:2288</SRS>
+      <SRS>EPSG:2289</SRS>
+      <SRS>EPSG:2290</SRS>
+      <SRS>EPSG:2291</SRS>
+      <SRS>EPSG:2292</SRS>
+      <SRS>EPSG:2294</SRS>
+      <SRS>EPSG:2295</SRS>
+      <SRS>EPSG:2296</SRS>
+      <SRS>EPSG:2297</SRS>
+      <SRS>EPSG:2298</SRS>
+      <SRS>EPSG:2299</SRS>
+      <SRS>EPSG:2300</SRS>
+      <SRS>EPSG:2301</SRS>
+      <SRS>EPSG:2302</SRS>
+      <SRS>EPSG:2303</SRS>
+      <SRS>EPSG:2304</SRS>
+      <SRS>EPSG:2305</SRS>
+      <SRS>EPSG:2306</SRS>
+      <SRS>EPSG:2307</SRS>
+      <SRS>EPSG:2308</SRS>
+      <SRS>EPSG:2309</SRS>
+      <SRS>EPSG:2310</SRS>
+      <SRS>EPSG:2311</SRS>
+      <SRS>EPSG:2312</SRS>
+      <SRS>EPSG:2313</SRS>
+      <SRS>EPSG:2314</SRS>
+      <SRS>EPSG:2315</SRS>
+      <SRS>EPSG:2316</SRS>
+      <SRS>EPSG:2317</SRS>
+      <SRS>EPSG:2318</SRS>
+      <SRS>EPSG:2319</SRS>
+      <SRS>EPSG:2320</SRS>
+      <SRS>EPSG:2321</SRS>
+      <SRS>EPSG:2322</SRS>
+      <SRS>EPSG:2323</SRS>
+      <SRS>EPSG:2324</SRS>
+      <SRS>EPSG:2325</SRS>
+      <SRS>EPSG:2326</SRS>
+      <SRS>EPSG:2327</SRS>
+      <SRS>EPSG:2328</SRS>
+      <SRS>EPSG:2329</SRS>
+      <SRS>EPSG:2330</SRS>
+      <SRS>EPSG:2331</SRS>
+      <SRS>EPSG:2332</SRS>
+      <SRS>EPSG:2333</SRS>
+      <SRS>EPSG:2334</SRS>
+      <SRS>EPSG:2335</SRS>
+      <SRS>EPSG:2336</SRS>
+      <SRS>EPSG:2337</SRS>
+      <SRS>EPSG:2338</SRS>
+      <SRS>EPSG:2339</SRS>
+      <SRS>EPSG:2340</SRS>
+      <SRS>EPSG:2341</SRS>
+      <SRS>EPSG:2342</SRS>
+      <SRS>EPSG:2343</SRS>
+      <SRS>EPSG:2344</SRS>
+      <SRS>EPSG:2345</SRS>
+      <SRS>EPSG:2346</SRS>
+      <SRS>EPSG:2347</SRS>
+      <SRS>EPSG:2348</SRS>
+      <SRS>EPSG:2349</SRS>
+      <SRS>EPSG:2350</SRS>
+      <SRS>EPSG:2351</SRS>
+      <SRS>EPSG:2352</SRS>
+      <SRS>EPSG:2353</SRS>
+      <SRS>EPSG:2354</SRS>
+      <SRS>EPSG:2355</SRS>
+      <SRS>EPSG:2356</SRS>
+      <SRS>EPSG:2357</SRS>
+      <SRS>EPSG:2358</SRS>
+      <SRS>EPSG:2359</SRS>
+      <SRS>EPSG:2360</SRS>
+      <SRS>EPSG:2361</SRS>
+      <SRS>EPSG:2362</SRS>
+      <SRS>EPSG:2363</SRS>
+      <SRS>EPSG:2364</SRS>
+      <SRS>EPSG:2365</SRS>
+      <SRS>EPSG:2366</SRS>
+      <SRS>EPSG:2367</SRS>
+      <SRS>EPSG:2368</SRS>
+      <SRS>EPSG:2369</SRS>
+      <SRS>EPSG:2370</SRS>
+      <SRS>EPSG:2371</SRS>
+      <SRS>EPSG:2372</SRS>
+      <SRS>EPSG:2373</SRS>
+      <SRS>EPSG:2374</SRS>
+      <SRS>EPSG:2375</SRS>
+      <SRS>EPSG:2376</SRS>
+      <SRS>EPSG:2377</SRS>
+      <SRS>EPSG:2378</SRS>
+      <SRS>EPSG:2379</SRS>
+      <SRS>EPSG:2380</SRS>
+      <SRS>EPSG:2381</SRS>
+      <SRS>EPSG:2382</SRS>
+      <SRS>EPSG:2383</SRS>
+      <SRS>EPSG:2384</SRS>
+      <SRS>EPSG:2385</SRS>
+      <SRS>EPSG:2386</SRS>
+      <SRS>EPSG:2387</SRS>
+      <SRS>EPSG:2388</SRS>
+      <SRS>EPSG:2389</SRS>
+      <SRS>EPSG:2390</SRS>
+      <SRS>EPSG:2391</SRS>
+      <SRS>EPSG:2392</SRS>
+      <SRS>EPSG:2393</SRS>
+      <SRS>EPSG:2394</SRS>
+      <SRS>EPSG:2395</SRS>
+      <SRS>EPSG:2396</SRS>
+      <SRS>EPSG:2397</SRS>
+      <SRS>EPSG:2398</SRS>
+      <SRS>EPSG:2399</SRS>
+      <SRS>EPSG:2400</SRS>
+      <SRS>EPSG:2401</SRS>
+      <SRS>EPSG:2402</SRS>
+      <SRS>EPSG:2403</SRS>
+      <SRS>EPSG:2404</SRS>
+      <SRS>EPSG:2405</SRS>
+      <SRS>EPSG:2406</SRS>
+      <SRS>EPSG:2407</SRS>
+      <SRS>EPSG:2408</SRS>
+      <SRS>EPSG:2409</SRS>
+      <SRS>EPSG:2410</SRS>
+      <SRS>EPSG:2411</SRS>
+      <SRS>EPSG:2412</SRS>
+      <SRS>EPSG:2413</SRS>
+      <SRS>EPSG:2414</SRS>
+      <SRS>EPSG:2415</SRS>
+      <SRS>EPSG:2416</SRS>
+      <SRS>EPSG:2417</SRS>
+      <SRS>EPSG:2418</SRS>
+      <SRS>EPSG:2419</SRS>
+      <SRS>EPSG:2420</SRS>
+      <SRS>EPSG:2421</SRS>
+      <SRS>EPSG:2422</SRS>
+      <SRS>EPSG:2423</SRS>
+      <SRS>EPSG:2424</SRS>
+      <SRS>EPSG:2425</SRS>
+      <SRS>EPSG:2426</SRS>
+      <SRS>EPSG:2427</SRS>
+      <SRS>EPSG:2428</SRS>
+      <SRS>EPSG:2429</SRS>
+      <SRS>EPSG:2430</SRS>
+      <SRS>EPSG:2431</SRS>
+      <SRS>EPSG:2432</SRS>
+      <SRS>EPSG:2433</SRS>
+      <SRS>EPSG:2434</SRS>
+      <SRS>EPSG:2435</SRS>
+      <SRS>EPSG:2436</SRS>
+      <SRS>EPSG:2437</SRS>
+      <SRS>EPSG:2438</SRS>
+      <SRS>EPSG:2439</SRS>
+      <SRS>EPSG:2440</SRS>
+      <SRS>EPSG:2441</SRS>
+      <SRS>EPSG:2442</SRS>
+      <SRS>EPSG:2443</SRS>
+      <SRS>EPSG:2444</SRS>
+      <SRS>EPSG:2445</SRS>
+      <SRS>EPSG:2446</SRS>
+      <SRS>EPSG:2447</SRS>
+      <SRS>EPSG:2448</SRS>
+      <SRS>EPSG:2449</SRS>
+      <SRS>EPSG:2450</SRS>
+      <SRS>EPSG:2451</SRS>
+      <SRS>EPSG:2452</SRS>
+      <SRS>EPSG:2453</SRS>
+      <SRS>EPSG:2454</SRS>
+      <SRS>EPSG:2455</SRS>
+      <SRS>EPSG:2456</SRS>
+      <SRS>EPSG:2457</SRS>
+      <SRS>EPSG:2458</SRS>
+      <SRS>EPSG:2459</SRS>
+      <SRS>EPSG:2460</SRS>
+      <SRS>EPSG:2461</SRS>
+      <SRS>EPSG:2462</SRS>
+      <SRS>EPSG:2463</SRS>
+      <SRS>EPSG:2464</SRS>
+      <SRS>EPSG:2465</SRS>
+      <SRS>EPSG:2466</SRS>
+      <SRS>EPSG:2467</SRS>
+      <SRS>EPSG:2468</SRS>
+      <SRS>EPSG:2469</SRS>
+      <SRS>EPSG:2470</SRS>
+      <SRS>EPSG:2471</SRS>
+      <SRS>EPSG:2472</SRS>
+      <SRS>EPSG:2473</SRS>
+      <SRS>EPSG:2474</SRS>
+      <SRS>EPSG:2475</SRS>
+      <SRS>EPSG:2476</SRS>
+      <SRS>EPSG:2477</SRS>
+      <SRS>EPSG:2478</SRS>
+      <SRS>EPSG:2479</SRS>
+      <SRS>EPSG:2480</SRS>
+      <SRS>EPSG:2481</SRS>
+      <SRS>EPSG:2482</SRS>
+      <SRS>EPSG:2483</SRS>
+      <SRS>EPSG:2484</SRS>
+      <SRS>EPSG:2485</SRS>
+      <SRS>EPSG:2486</SRS>
+      <SRS>EPSG:2487</SRS>
+      <SRS>EPSG:2488</SRS>
+      <SRS>EPSG:2489</SRS>
+      <SRS>EPSG:2490</SRS>
+      <SRS>EPSG:2491</SRS>
+      <SRS>EPSG:2492</SRS>
+      <SRS>EPSG:2493</SRS>
+      <SRS>EPSG:2494</SRS>
+      <SRS>EPSG:2495</SRS>
+      <SRS>EPSG:2496</SRS>
+      <SRS>EPSG:2497</SRS>
+      <SRS>EPSG:2498</SRS>
+      <SRS>EPSG:2499</SRS>
+      <SRS>EPSG:2500</SRS>
+      <SRS>EPSG:2501</SRS>
+      <SRS>EPSG:2502</SRS>
+      <SRS>EPSG:2503</SRS>
+      <SRS>EPSG:2504</SRS>
+      <SRS>EPSG:2505</SRS>
+      <SRS>EPSG:2506</SRS>
+      <SRS>EPSG:2507</SRS>
+      <SRS>EPSG:2508</SRS>
+      <SRS>EPSG:2509</SRS>
+      <SRS>EPSG:2510</SRS>
+      <SRS>EPSG:2511</SRS>
+      <SRS>EPSG:2512</SRS>
+      <SRS>EPSG:2513</SRS>
+      <SRS>EPSG:2514</SRS>
+      <SRS>EPSG:2515</SRS>
+      <SRS>EPSG:2516</SRS>
+      <SRS>EPSG:2517</SRS>
+      <SRS>EPSG:2518</SRS>
+      <SRS>EPSG:2519</SRS>
+      <SRS>EPSG:2520</SRS>
+      <SRS>EPSG:2521</SRS>
+      <SRS>EPSG:2522</SRS>
+      <SRS>EPSG:2523</SRS>
+      <SRS>EPSG:2524</SRS>
+      <SRS>EPSG:2525</SRS>
+      <SRS>EPSG:2526</SRS>
+      <SRS>EPSG:2527</SRS>
+      <SRS>EPSG:2528</SRS>
+      <SRS>EPSG:2529</SRS>
+      <SRS>EPSG:2530</SRS>
+      <SRS>EPSG:2531</SRS>
+      <SRS>EPSG:2532</SRS>
+      <SRS>EPSG:2533</SRS>
+      <SRS>EPSG:2534</SRS>
+      <SRS>EPSG:2535</SRS>
+      <SRS>EPSG:2536</SRS>
+      <SRS>EPSG:2537</SRS>
+      <SRS>EPSG:2538</SRS>
+      <SRS>EPSG:2539</SRS>
+      <SRS>EPSG:2540</SRS>
+      <SRS>EPSG:2541</SRS>
+      <SRS>EPSG:2542</SRS>
+      <SRS>EPSG:2543</SRS>
+      <SRS>EPSG:2544</SRS>
+      <SRS>EPSG:2545</SRS>
+      <SRS>EPSG:2546</SRS>
+      <SRS>EPSG:2547</SRS>
+      <SRS>EPSG:2548</SRS>
+      <SRS>EPSG:2549</SRS>
+      <SRS>EPSG:2550</SRS>
+      <SRS>EPSG:2551</SRS>
+      <SRS>EPSG:2552</SRS>
+      <SRS>EPSG:2553</SRS>
+      <SRS>EPSG:2554</SRS>
+      <SRS>EPSG:2555</SRS>
+      <SRS>EPSG:2556</SRS>
+      <SRS>EPSG:2557</SRS>
+      <SRS>EPSG:2558</SRS>
+      <SRS>EPSG:2559</SRS>
+      <SRS>EPSG:2560</SRS>
+      <SRS>EPSG:2561</SRS>
+      <SRS>EPSG:2562</SRS>
+      <SRS>EPSG:2563</SRS>
+      <SRS>EPSG:2564</SRS>
+      <SRS>EPSG:2565</SRS>
+      <SRS>EPSG:2566</SRS>
+      <SRS>EPSG:2567</SRS>
+      <SRS>EPSG:2568</SRS>
+      <SRS>EPSG:2569</SRS>
+      <SRS>EPSG:2570</SRS>
+      <SRS>EPSG:2571</SRS>
+      <SRS>EPSG:2572</SRS>
+      <SRS>EPSG:2573</SRS>
+      <SRS>EPSG:2574</SRS>
+      <SRS>EPSG:2575</SRS>
+      <SRS>EPSG:2576</SRS>
+      <SRS>EPSG:2577</SRS>
+      <SRS>EPSG:2578</SRS>
+      <SRS>EPSG:2579</SRS>
+      <SRS>EPSG:2580</SRS>
+      <SRS>EPSG:2581</SRS>
+      <SRS>EPSG:2582</SRS>
+      <SRS>EPSG:2583</SRS>
+      <SRS>EPSG:2584</SRS>
+      <SRS>EPSG:2585</SRS>
+      <SRS>EPSG:2586</SRS>
+      <SRS>EPSG:2587</SRS>
+      <SRS>EPSG:2588</SRS>
+      <SRS>EPSG:2589</SRS>
+      <SRS>EPSG:2590</SRS>
+      <SRS>EPSG:2591</SRS>
+      <SRS>EPSG:2592</SRS>
+      <SRS>EPSG:2593</SRS>
+      <SRS>EPSG:2594</SRS>
+      <SRS>EPSG:2595</SRS>
+      <SRS>EPSG:2596</SRS>
+      <SRS>EPSG:2597</SRS>
+      <SRS>EPSG:2598</SRS>
+      <SRS>EPSG:2599</SRS>
+      <SRS>EPSG:2600</SRS>
+      <SRS>EPSG:2601</SRS>
+      <SRS>EPSG:2602</SRS>
+      <SRS>EPSG:2603</SRS>
+      <SRS>EPSG:2604</SRS>
+      <SRS>EPSG:2605</SRS>
+      <SRS>EPSG:2606</SRS>
+      <SRS>EPSG:2607</SRS>
+      <SRS>EPSG:2608</SRS>
+      <SRS>EPSG:2609</SRS>
+      <SRS>EPSG:2610</SRS>
+      <SRS>EPSG:2611</SRS>
+      <SRS>EPSG:2612</SRS>
+      <SRS>EPSG:2613</SRS>
+      <SRS>EPSG:2614</SRS>
+      <SRS>EPSG:2615</SRS>
+      <SRS>EPSG:2616</SRS>
+      <SRS>EPSG:2617</SRS>
+      <SRS>EPSG:2618</SRS>
+      <SRS>EPSG:2619</SRS>
+      <SRS>EPSG:2620</SRS>
+      <SRS>EPSG:2621</SRS>
+      <SRS>EPSG:2622</SRS>
+      <SRS>EPSG:2623</SRS>
+      <SRS>EPSG:2624</SRS>
+      <SRS>EPSG:2625</SRS>
+      <SRS>EPSG:2626</SRS>
+      <SRS>EPSG:2627</SRS>
+      <SRS>EPSG:2628</SRS>
+      <SRS>EPSG:2629</SRS>
+      <SRS>EPSG:2630</SRS>
+      <SRS>EPSG:2631</SRS>
+      <SRS>EPSG:2632</SRS>
+      <SRS>EPSG:2633</SRS>
+      <SRS>EPSG:2634</SRS>
+      <SRS>EPSG:2635</SRS>
+      <SRS>EPSG:2636</SRS>
+      <SRS>EPSG:2637</SRS>
+      <SRS>EPSG:2638</SRS>
+      <SRS>EPSG:2639</SRS>
+      <SRS>EPSG:2640</SRS>
+      <SRS>EPSG:2641</SRS>
+      <SRS>EPSG:2642</SRS>
+      <SRS>EPSG:2643</SRS>
+      <SRS>EPSG:2644</SRS>
+      <SRS>EPSG:2645</SRS>
+      <SRS>EPSG:2646</SRS>
+      <SRS>EPSG:2647</SRS>
+      <SRS>EPSG:2648</SRS>
+      <SRS>EPSG:2649</SRS>
+      <SRS>EPSG:2650</SRS>
+      <SRS>EPSG:2651</SRS>
+      <SRS>EPSG:2652</SRS>
+      <SRS>EPSG:2653</SRS>
+      <SRS>EPSG:2654</SRS>
+      <SRS>EPSG:2655</SRS>
+      <SRS>EPSG:2656</SRS>
+      <SRS>EPSG:2657</SRS>
+      <SRS>EPSG:2658</SRS>
+      <SRS>EPSG:2659</SRS>
+      <SRS>EPSG:2660</SRS>
+      <SRS>EPSG:2661</SRS>
+      <SRS>EPSG:2662</SRS>
+      <SRS>EPSG:2663</SRS>
+      <SRS>EPSG:2664</SRS>
+      <SRS>EPSG:2665</SRS>
+      <SRS>EPSG:2666</SRS>
+      <SRS>EPSG:2667</SRS>
+      <SRS>EPSG:2668</SRS>
+      <SRS>EPSG:2669</SRS>
+      <SRS>EPSG:2670</SRS>
+      <SRS>EPSG:2671</SRS>
+      <SRS>EPSG:2672</SRS>
+      <SRS>EPSG:2673</SRS>
+      <SRS>EPSG:2674</SRS>
+      <SRS>EPSG:2675</SRS>
+      <SRS>EPSG:2676</SRS>
+      <SRS>EPSG:2677</SRS>
+      <SRS>EPSG:2678</SRS>
+      <SRS>EPSG:2679</SRS>
+      <SRS>EPSG:2680</SRS>
+      <SRS>EPSG:2681</SRS>
+      <SRS>EPSG:2682</SRS>
+      <SRS>EPSG:2683</SRS>
+      <SRS>EPSG:2684</SRS>
+      <SRS>EPSG:2685</SRS>
+      <SRS>EPSG:2686</SRS>
+      <SRS>EPSG:2687</SRS>
+      <SRS>EPSG:2688</SRS>
+      <SRS>EPSG:2689</SRS>
+      <SRS>EPSG:2690</SRS>
+      <SRS>EPSG:2691</SRS>
+      <SRS>EPSG:2692</SRS>
+      <SRS>EPSG:2693</SRS>
+      <SRS>EPSG:2694</SRS>
+      <SRS>EPSG:2695</SRS>
+      <SRS>EPSG:2696</SRS>
+      <SRS>EPSG:2697</SRS>
+      <SRS>EPSG:2698</SRS>
+      <SRS>EPSG:2699</SRS>
+      <SRS>EPSG:2700</SRS>
+      <SRS>EPSG:2701</SRS>
+      <SRS>EPSG:2702</SRS>
+      <SRS>EPSG:2703</SRS>
+      <SRS>EPSG:2704</SRS>
+      <SRS>EPSG:2705</SRS>
+      <SRS>EPSG:2706</SRS>
+      <SRS>EPSG:2707</SRS>
+      <SRS>EPSG:2708</SRS>
+      <SRS>EPSG:2709</SRS>
+      <SRS>EPSG:2710</SRS>
+      <SRS>EPSG:2711</SRS>
+      <SRS>EPSG:2712</SRS>
+      <SRS>EPSG:2713</SRS>
+      <SRS>EPSG:2714</SRS>
+      <SRS>EPSG:2715</SRS>
+      <SRS>EPSG:2716</SRS>
+      <SRS>EPSG:2717</SRS>
+      <SRS>EPSG:2718</SRS>
+      <SRS>EPSG:2719</SRS>
+      <SRS>EPSG:2720</SRS>
+      <SRS>EPSG:2721</SRS>
+      <SRS>EPSG:2722</SRS>
+      <SRS>EPSG:2723</SRS>
+      <SRS>EPSG:2724</SRS>
+      <SRS>EPSG:2725</SRS>
+      <SRS>EPSG:2726</SRS>
+      <SRS>EPSG:2727</SRS>
+      <SRS>EPSG:2728</SRS>
+      <SRS>EPSG:2729</SRS>
+      <SRS>EPSG:2730</SRS>
+      <SRS>EPSG:2731</SRS>
+      <SRS>EPSG:2732</SRS>
+      <SRS>EPSG:2733</SRS>
+      <SRS>EPSG:2734</SRS>
+      <SRS>EPSG:2735</SRS>
+      <SRS>EPSG:2736</SRS>
+      <SRS>EPSG:2737</SRS>
+      <SRS>EPSG:2738</SRS>
+      <SRS>EPSG:2739</SRS>
+      <SRS>EPSG:2740</SRS>
+      <SRS>EPSG:2741</SRS>
+      <SRS>EPSG:2742</SRS>
+      <SRS>EPSG:2743</SRS>
+      <SRS>EPSG:2744</SRS>
+      <SRS>EPSG:2745</SRS>
+      <SRS>EPSG:2746</SRS>
+      <SRS>EPSG:2747</SRS>
+      <SRS>EPSG:2748</SRS>
+      <SRS>EPSG:2749</SRS>
+      <SRS>EPSG:2750</SRS>
+      <SRS>EPSG:2751</SRS>
+      <SRS>EPSG:2752</SRS>
+      <SRS>EPSG:2753</SRS>
+      <SRS>EPSG:2754</SRS>
+      <SRS>EPSG:2755</SRS>
+      <SRS>EPSG:2756</SRS>
+      <SRS>EPSG:2757</SRS>
+      <SRS>EPSG:2758</SRS>
+      <SRS>EPSG:2759</SRS>
+      <SRS>EPSG:2760</SRS>
+      <SRS>EPSG:2761</SRS>
+      <SRS>EPSG:2762</SRS>
+      <SRS>EPSG:2763</SRS>
+      <SRS>EPSG:2764</SRS>
+      <SRS>EPSG:2765</SRS>
+      <SRS>EPSG:2766</SRS>
+      <SRS>EPSG:2767</SRS>
+      <SRS>EPSG:2768</SRS>
+      <SRS>EPSG:2769</SRS>
+      <SRS>EPSG:2770</SRS>
+      <SRS>EPSG:2771</SRS>
+      <SRS>EPSG:2772</SRS>
+      <SRS>EPSG:2773</SRS>
+      <SRS>EPSG:2774</SRS>
+      <SRS>EPSG:2775</SRS>
+      <SRS>EPSG:2776</SRS>
+      <SRS>EPSG:2777</SRS>
+      <SRS>EPSG:2778</SRS>
+      <SRS>EPSG:2779</SRS>
+      <SRS>EPSG:2780</SRS>
+      <SRS>EPSG:2781</SRS>
+      <SRS>EPSG:2782</SRS>
+      <SRS>EPSG:2783</SRS>
+      <SRS>EPSG:2784</SRS>
+      <SRS>EPSG:2785</SRS>
+      <SRS>EPSG:2786</SRS>
+      <SRS>EPSG:2787</SRS>
+      <SRS>EPSG:2788</SRS>
+      <SRS>EPSG:2789</SRS>
+      <SRS>EPSG:2790</SRS>
+      <SRS>EPSG:2791</SRS>
+      <SRS>EPSG:2792</SRS>
+      <SRS>EPSG:2793</SRS>
+      <SRS>EPSG:2794</SRS>
+      <SRS>EPSG:2795</SRS>
+      <SRS>EPSG:2796</SRS>
+      <SRS>EPSG:2797</SRS>
+      <SRS>EPSG:2798</SRS>
+      <SRS>EPSG:2799</SRS>
+      <SRS>EPSG:2800</SRS>
+      <SRS>EPSG:2801</SRS>
+      <SRS>EPSG:2802</SRS>
+      <SRS>EPSG:2803</SRS>
+      <SRS>EPSG:2804</SRS>
+      <SRS>EPSG:2805</SRS>
+      <SRS>EPSG:2806</SRS>
+      <SRS>EPSG:2807</SRS>
+      <SRS>EPSG:2808</SRS>
+      <SRS>EPSG:2809</SRS>
+      <SRS>EPSG:2810</SRS>
+      <SRS>EPSG:2811</SRS>
+      <SRS>EPSG:2812</SRS>
+      <SRS>EPSG:2813</SRS>
+      <SRS>EPSG:2814</SRS>
+      <SRS>EPSG:2815</SRS>
+      <SRS>EPSG:2816</SRS>
+      <SRS>EPSG:2817</SRS>
+      <SRS>EPSG:2818</SRS>
+      <SRS>EPSG:2819</SRS>
+      <SRS>EPSG:2820</SRS>
+      <SRS>EPSG:2821</SRS>
+      <SRS>EPSG:2822</SRS>
+      <SRS>EPSG:2823</SRS>
+      <SRS>EPSG:2824</SRS>
+      <SRS>EPSG:2825</SRS>
+      <SRS>EPSG:2826</SRS>
+      <SRS>EPSG:2827</SRS>
+      <SRS>EPSG:2828</SRS>
+      <SRS>EPSG:2829</SRS>
+      <SRS>EPSG:2830</SRS>
+      <SRS>EPSG:2831</SRS>
+      <SRS>EPSG:2832</SRS>
+      <SRS>EPSG:2833</SRS>
+      <SRS>EPSG:2834</SRS>
+      <SRS>EPSG:2835</SRS>
+      <SRS>EPSG:2836</SRS>
+      <SRS>EPSG:2837</SRS>
+      <SRS>EPSG:2838</SRS>
+      <SRS>EPSG:2839</SRS>
+      <SRS>EPSG:2840</SRS>
+      <SRS>EPSG:2841</SRS>
+      <SRS>EPSG:2842</SRS>
+      <SRS>EPSG:2843</SRS>
+      <SRS>EPSG:2844</SRS>
+      <SRS>EPSG:2845</SRS>
+      <SRS>EPSG:2846</SRS>
+      <SRS>EPSG:2847</SRS>
+      <SRS>EPSG:2848</SRS>
+      <SRS>EPSG:2849</SRS>
+      <SRS>EPSG:2850</SRS>
+      <SRS>EPSG:2851</SRS>
+      <SRS>EPSG:2852</SRS>
+      <SRS>EPSG:2853</SRS>
+      <SRS>EPSG:2854</SRS>
+      <SRS>EPSG:2855</SRS>
+      <SRS>EPSG:2856</SRS>
+      <SRS>EPSG:2857</SRS>
+      <SRS>EPSG:2858</SRS>
+      <SRS>EPSG:2859</SRS>
+      <SRS>EPSG:2860</SRS>
+      <SRS>EPSG:2861</SRS>
+      <SRS>EPSG:2862</SRS>
+      <SRS>EPSG:2863</SRS>
+      <SRS>EPSG:2864</SRS>
+      <SRS>EPSG:2865</SRS>
+      <SRS>EPSG:2866</SRS>
+      <SRS>EPSG:2867</SRS>
+      <SRS>EPSG:2868</SRS>
+      <SRS>EPSG:2869</SRS>
+      <SRS>EPSG:2870</SRS>
+      <SRS>EPSG:2871</SRS>
+      <SRS>EPSG:2872</SRS>
+      <SRS>EPSG:2873</SRS>
+      <SRS>EPSG:2874</SRS>
+      <SRS>EPSG:2875</SRS>
+      <SRS>EPSG:2876</SRS>
+      <SRS>EPSG:2877</SRS>
+      <SRS>EPSG:2878</SRS>
+      <SRS>EPSG:2879</SRS>
+      <SRS>EPSG:2880</SRS>
+      <SRS>EPSG:2881</SRS>
+      <SRS>EPSG:2882</SRS>
+      <SRS>EPSG:2883</SRS>
+      <SRS>EPSG:2884</SRS>
+      <SRS>EPSG:2885</SRS>
+      <SRS>EPSG:2886</SRS>
+      <SRS>EPSG:2887</SRS>
+      <SRS>EPSG:2888</SRS>
+      <SRS>EPSG:2889</SRS>
+      <SRS>EPSG:2890</SRS>
+      <SRS>EPSG:2891</SRS>
+      <SRS>EPSG:2892</SRS>
+      <SRS>EPSG:2893</SRS>
+      <SRS>EPSG:2894</SRS>
+      <SRS>EPSG:2895</SRS>
+      <SRS>EPSG:2896</SRS>
+      <SRS>EPSG:2897</SRS>
+      <SRS>EPSG:2898</SRS>
+      <SRS>EPSG:2899</SRS>
+      <SRS>EPSG:2900</SRS>
+      <SRS>EPSG:2901</SRS>
+      <SRS>EPSG:2902</SRS>
+      <SRS>EPSG:2903</SRS>
+      <SRS>EPSG:2904</SRS>
+      <SRS>EPSG:2905</SRS>
+      <SRS>EPSG:2906</SRS>
+      <SRS>EPSG:2907</SRS>
+      <SRS>EPSG:2908</SRS>
+      <SRS>EPSG:2909</SRS>
+      <SRS>EPSG:2910</SRS>
+      <SRS>EPSG:2911</SRS>
+      <SRS>EPSG:2912</SRS>
+      <SRS>EPSG:2913</SRS>
+      <SRS>EPSG:2914</SRS>
+      <SRS>EPSG:2915</SRS>
+      <SRS>EPSG:2916</SRS>
+      <SRS>EPSG:2917</SRS>
+      <SRS>EPSG:2918</SRS>
+      <SRS>EPSG:2919</SRS>
+      <SRS>EPSG:2920</SRS>
+      <SRS>EPSG:2921</SRS>
+      <SRS>EPSG:2922</SRS>
+      <SRS>EPSG:2923</SRS>
+      <SRS>EPSG:2924</SRS>
+      <SRS>EPSG:2925</SRS>
+      <SRS>EPSG:2926</SRS>
+      <SRS>EPSG:2927</SRS>
+      <SRS>EPSG:2928</SRS>
+      <SRS>EPSG:2929</SRS>
+      <SRS>EPSG:2930</SRS>
+      <SRS>EPSG:2931</SRS>
+      <SRS>EPSG:2932</SRS>
+      <SRS>EPSG:2933</SRS>
+      <SRS>EPSG:2934</SRS>
+      <SRS>EPSG:2935</SRS>
+      <SRS>EPSG:2936</SRS>
+      <SRS>EPSG:2937</SRS>
+      <SRS>EPSG:2938</SRS>
+      <SRS>EPSG:2939</SRS>
+      <SRS>EPSG:2940</SRS>
+      <SRS>EPSG:2941</SRS>
+      <SRS>EPSG:2942</SRS>
+      <SRS>EPSG:2943</SRS>
+      <SRS>EPSG:2944</SRS>
+      <SRS>EPSG:2945</SRS>
+      <SRS>EPSG:2946</SRS>
+      <SRS>EPSG:2947</SRS>
+      <SRS>EPSG:2948</SRS>
+      <SRS>EPSG:2949</SRS>
+      <SRS>EPSG:2950</SRS>
+      <SRS>EPSG:2951</SRS>
+      <SRS>EPSG:2952</SRS>
+      <SRS>EPSG:2953</SRS>
+      <SRS>EPSG:2954</SRS>
+      <SRS>EPSG:2955</SRS>
+      <SRS>EPSG:2956</SRS>
+      <SRS>EPSG:2957</SRS>
+      <SRS>EPSG:2958</SRS>
+      <SRS>EPSG:2959</SRS>
+      <SRS>EPSG:2960</SRS>
+      <SRS>EPSG:2961</SRS>
+      <SRS>EPSG:2962</SRS>
+      <SRS>EPSG:2963</SRS>
+      <SRS>EPSG:2964</SRS>
+      <SRS>EPSG:2965</SRS>
+      <SRS>EPSG:2966</SRS>
+      <SRS>EPSG:2967</SRS>
+      <SRS>EPSG:2968</SRS>
+      <SRS>EPSG:2969</SRS>
+      <SRS>EPSG:2970</SRS>
+      <SRS>EPSG:2971</SRS>
+      <SRS>EPSG:2972</SRS>
+      <SRS>EPSG:2973</SRS>
+      <SRS>EPSG:2975</SRS>
+      <SRS>EPSG:2976</SRS>
+      <SRS>EPSG:2977</SRS>
+      <SRS>EPSG:2978</SRS>
+      <SRS>EPSG:2979</SRS>
+      <SRS>EPSG:2980</SRS>
+      <SRS>EPSG:2981</SRS>
+      <SRS>EPSG:2982</SRS>
+      <SRS>EPSG:2983</SRS>
+      <SRS>EPSG:2984</SRS>
+      <SRS>EPSG:2985</SRS>
+      <SRS>EPSG:2986</SRS>
+      <SRS>EPSG:2987</SRS>
+      <SRS>EPSG:2988</SRS>
+      <SRS>EPSG:2989</SRS>
+      <SRS>EPSG:2990</SRS>
+      <SRS>EPSG:2991</SRS>
+      <SRS>EPSG:2992</SRS>
+      <SRS>EPSG:2993</SRS>
+      <SRS>EPSG:2994</SRS>
+      <SRS>EPSG:2995</SRS>
+      <SRS>EPSG:2996</SRS>
+      <SRS>EPSG:2997</SRS>
+      <SRS>EPSG:2998</SRS>
+      <SRS>EPSG:2999</SRS>
+      <SRS>EPSG:3000</SRS>
+      <SRS>EPSG:3001</SRS>
+      <SRS>EPSG:3002</SRS>
+      <SRS>EPSG:3003</SRS>
+      <SRS>EPSG:3004</SRS>
+      <SRS>EPSG:3005</SRS>
+      <SRS>EPSG:3006</SRS>
+      <SRS>EPSG:3007</SRS>
+      <SRS>EPSG:3008</SRS>
+      <SRS>EPSG:3009</SRS>
+      <SRS>EPSG:3010</SRS>
+      <SRS>EPSG:3011</SRS>
+      <SRS>EPSG:3012</SRS>
+      <SRS>EPSG:3013</SRS>
+      <SRS>EPSG:3014</SRS>
+      <SRS>EPSG:3015</SRS>
+      <SRS>EPSG:3016</SRS>
+      <SRS>EPSG:3017</SRS>
+      <SRS>EPSG:3018</SRS>
+      <SRS>EPSG:3019</SRS>
+      <SRS>EPSG:3020</SRS>
+      <SRS>EPSG:3021</SRS>
+      <SRS>EPSG:3022</SRS>
+      <SRS>EPSG:3023</SRS>
+      <SRS>EPSG:3024</SRS>
+      <SRS>EPSG:3025</SRS>
+      <SRS>EPSG:3026</SRS>
+      <SRS>EPSG:3027</SRS>
+      <SRS>EPSG:3028</SRS>
+      <SRS>EPSG:3029</SRS>
+      <SRS>EPSG:3030</SRS>
+      <SRS>EPSG:3031</SRS>
+      <SRS>EPSG:3032</SRS>
+      <SRS>EPSG:3033</SRS>
+      <SRS>EPSG:3034</SRS>
+      <SRS>EPSG:3035</SRS>
+      <SRS>EPSG:3036</SRS>
+      <SRS>EPSG:3037</SRS>
+      <SRS>EPSG:3038</SRS>
+      <SRS>EPSG:3039</SRS>
+      <SRS>EPSG:3040</SRS>
+      <SRS>EPSG:3041</SRS>
+      <SRS>EPSG:3042</SRS>
+      <SRS>EPSG:3043</SRS>
+      <SRS>EPSG:3044</SRS>
+      <SRS>EPSG:3045</SRS>
+      <SRS>EPSG:3046</SRS>
+      <SRS>EPSG:3047</SRS>
+      <SRS>EPSG:3048</SRS>
+      <SRS>EPSG:3049</SRS>
+      <SRS>EPSG:3050</SRS>
+      <SRS>EPSG:3051</SRS>
+      <SRS>EPSG:3052</SRS>
+      <SRS>EPSG:3053</SRS>
+      <SRS>EPSG:3054</SRS>
+      <SRS>EPSG:3055</SRS>
+      <SRS>EPSG:3056</SRS>
+      <SRS>EPSG:3057</SRS>
+      <SRS>EPSG:3058</SRS>
+      <SRS>EPSG:3059</SRS>
+      <SRS>EPSG:3060</SRS>
+      <SRS>EPSG:3061</SRS>
+      <SRS>EPSG:3062</SRS>
+      <SRS>EPSG:3063</SRS>
+      <SRS>EPSG:3064</SRS>
+      <SRS>EPSG:3065</SRS>
+      <SRS>EPSG:3066</SRS>
+      <SRS>EPSG:3067</SRS>
+      <SRS>EPSG:3068</SRS>
+      <SRS>EPSG:3069</SRS>
+      <SRS>EPSG:3070</SRS>
+      <SRS>EPSG:3071</SRS>
+      <SRS>EPSG:3072</SRS>
+      <SRS>EPSG:3073</SRS>
+      <SRS>EPSG:3074</SRS>
+      <SRS>EPSG:3075</SRS>
+      <SRS>EPSG:3076</SRS>
+      <SRS>EPSG:3077</SRS>
+      <SRS>EPSG:3078</SRS>
+      <SRS>EPSG:3079</SRS>
+      <SRS>EPSG:3080</SRS>
+      <SRS>EPSG:3081</SRS>
+      <SRS>EPSG:3082</SRS>
+      <SRS>EPSG:3083</SRS>
+      <SRS>EPSG:3084</SRS>
+      <SRS>EPSG:3085</SRS>
+      <SRS>EPSG:3086</SRS>
+      <SRS>EPSG:3087</SRS>
+      <SRS>EPSG:3088</SRS>
+      <SRS>EPSG:3089</SRS>
+      <SRS>EPSG:3090</SRS>
+      <SRS>EPSG:3091</SRS>
+      <SRS>EPSG:3092</SRS>
+      <SRS>EPSG:3093</SRS>
+      <SRS>EPSG:3094</SRS>
+      <SRS>EPSG:3095</SRS>
+      <SRS>EPSG:3096</SRS>
+      <SRS>EPSG:3097</SRS>
+      <SRS>EPSG:3098</SRS>
+      <SRS>EPSG:3099</SRS>
+      <SRS>EPSG:3100</SRS>
+      <SRS>EPSG:3101</SRS>
+      <SRS>EPSG:3102</SRS>
+      <SRS>EPSG:3103</SRS>
+      <SRS>EPSG:3104</SRS>
+      <SRS>EPSG:3105</SRS>
+      <SRS>EPSG:3106</SRS>
+      <SRS>EPSG:3107</SRS>
+      <SRS>EPSG:3108</SRS>
+      <SRS>EPSG:3109</SRS>
+      <SRS>EPSG:3110</SRS>
+      <SRS>EPSG:3111</SRS>
+      <SRS>EPSG:3112</SRS>
+      <SRS>EPSG:3113</SRS>
+      <SRS>EPSG:3114</SRS>
+      <SRS>EPSG:3115</SRS>
+      <SRS>EPSG:3116</SRS>
+      <SRS>EPSG:3117</SRS>
+      <SRS>EPSG:3118</SRS>
+      <SRS>EPSG:3119</SRS>
+      <SRS>EPSG:3120</SRS>
+      <SRS>EPSG:3121</SRS>
+      <SRS>EPSG:3122</SRS>
+      <SRS>EPSG:3123</SRS>
+      <SRS>EPSG:3124</SRS>
+      <SRS>EPSG:3125</SRS>
+      <SRS>EPSG:3126</SRS>
+      <SRS>EPSG:3127</SRS>
+      <SRS>EPSG:3128</SRS>
+      <SRS>EPSG:3129</SRS>
+      <SRS>EPSG:3130</SRS>
+      <SRS>EPSG:3131</SRS>
+      <SRS>EPSG:3132</SRS>
+      <SRS>EPSG:3133</SRS>
+      <SRS>EPSG:3134</SRS>
+      <SRS>EPSG:3135</SRS>
+      <SRS>EPSG:3136</SRS>
+      <SRS>EPSG:3137</SRS>
+      <SRS>EPSG:3138</SRS>
+      <SRS>EPSG:3139</SRS>
+      <SRS>EPSG:3140</SRS>
+      <SRS>EPSG:3141</SRS>
+      <SRS>EPSG:3142</SRS>
+      <SRS>EPSG:3143</SRS>
+      <SRS>EPSG:3144</SRS>
+      <SRS>EPSG:3145</SRS>
+      <SRS>EPSG:3146</SRS>
+      <SRS>EPSG:3147</SRS>
+      <SRS>EPSG:3148</SRS>
+      <SRS>EPSG:3149</SRS>
+      <SRS>EPSG:3150</SRS>
+      <SRS>EPSG:3151</SRS>
+      <SRS>EPSG:3152</SRS>
+      <SRS>EPSG:3153</SRS>
+      <SRS>EPSG:3154</SRS>
+      <SRS>EPSG:3155</SRS>
+      <SRS>EPSG:3156</SRS>
+      <SRS>EPSG:3157</SRS>
+      <SRS>EPSG:3158</SRS>
+      <SRS>EPSG:3159</SRS>
+      <SRS>EPSG:3160</SRS>
+      <SRS>EPSG:3161</SRS>
+      <SRS>EPSG:3162</SRS>
+      <SRS>EPSG:3163</SRS>
+      <SRS>EPSG:3164</SRS>
+      <SRS>EPSG:3165</SRS>
+      <SRS>EPSG:3166</SRS>
+      <SRS>EPSG:3167</SRS>
+      <SRS>EPSG:3168</SRS>
+      <SRS>EPSG:3169</SRS>
+      <SRS>EPSG:3170</SRS>
+      <SRS>EPSG:3171</SRS>
+      <SRS>EPSG:3172</SRS>
+      <SRS>EPSG:3173</SRS>
+      <SRS>EPSG:3174</SRS>
+      <SRS>EPSG:3175</SRS>
+      <SRS>EPSG:3176</SRS>
+      <SRS>EPSG:3177</SRS>
+      <SRS>EPSG:3178</SRS>
+      <SRS>EPSG:3179</SRS>
+      <SRS>EPSG:3180</SRS>
+      <SRS>EPSG:3181</SRS>
+      <SRS>EPSG:3182</SRS>
+      <SRS>EPSG:3183</SRS>
+      <SRS>EPSG:3184</SRS>
+      <SRS>EPSG:3185</SRS>
+      <SRS>EPSG:3186</SRS>
+      <SRS>EPSG:3187</SRS>
+      <SRS>EPSG:3188</SRS>
+      <SRS>EPSG:3189</SRS>
+      <SRS>EPSG:3190</SRS>
+      <SRS>EPSG:3191</SRS>
+      <SRS>EPSG:3192</SRS>
+      <SRS>EPSG:3193</SRS>
+      <SRS>EPSG:3194</SRS>
+      <SRS>EPSG:3195</SRS>
+      <SRS>EPSG:3196</SRS>
+      <SRS>EPSG:3197</SRS>
+      <SRS>EPSG:3198</SRS>
+      <SRS>EPSG:3199</SRS>
+      <SRS>EPSG:3200</SRS>
+      <SRS>EPSG:3201</SRS>
+      <SRS>EPSG:3202</SRS>
+      <SRS>EPSG:3203</SRS>
+      <SRS>EPSG:3204</SRS>
+      <SRS>EPSG:3205</SRS>
+      <SRS>EPSG:3206</SRS>
+      <SRS>EPSG:3207</SRS>
+      <SRS>EPSG:3208</SRS>
+      <SRS>EPSG:3209</SRS>
+      <SRS>EPSG:3210</SRS>
+      <SRS>EPSG:3211</SRS>
+      <SRS>EPSG:3212</SRS>
+      <SRS>EPSG:3213</SRS>
+      <SRS>EPSG:3214</SRS>
+      <SRS>EPSG:3215</SRS>
+      <SRS>EPSG:3216</SRS>
+      <SRS>EPSG:3217</SRS>
+      <SRS>EPSG:3218</SRS>
+      <SRS>EPSG:3219</SRS>
+      <SRS>EPSG:3220</SRS>
+      <SRS>EPSG:3221</SRS>
+      <SRS>EPSG:3222</SRS>
+      <SRS>EPSG:3223</SRS>
+      <SRS>EPSG:3224</SRS>
+      <SRS>EPSG:3225</SRS>
+      <SRS>EPSG:3226</SRS>
+      <SRS>EPSG:3227</SRS>
+      <SRS>EPSG:3228</SRS>
+      <SRS>EPSG:3229</SRS>
+      <SRS>EPSG:3230</SRS>
+      <SRS>EPSG:3231</SRS>
+      <SRS>EPSG:3232</SRS>
+      <SRS>EPSG:3233</SRS>
+      <SRS>EPSG:3234</SRS>
+      <SRS>EPSG:3235</SRS>
+      <SRS>EPSG:3236</SRS>
+      <SRS>EPSG:3237</SRS>
+      <SRS>EPSG:3238</SRS>
+      <SRS>EPSG:3239</SRS>
+      <SRS>EPSG:3240</SRS>
+      <SRS>EPSG:3241</SRS>
+      <SRS>EPSG:3242</SRS>
+      <SRS>EPSG:3243</SRS>
+      <SRS>EPSG:3244</SRS>
+      <SRS>EPSG:3245</SRS>
+      <SRS>EPSG:3246</SRS>
+      <SRS>EPSG:3247</SRS>
+      <SRS>EPSG:3248</SRS>
+      <SRS>EPSG:3249</SRS>
+      <SRS>EPSG:3250</SRS>
+      <SRS>EPSG:3251</SRS>
+      <SRS>EPSG:3252</SRS>
+      <SRS>EPSG:3253</SRS>
+      <SRS>EPSG:3254</SRS>
+      <SRS>EPSG:3255</SRS>
+      <SRS>EPSG:3256</SRS>
+      <SRS>EPSG:3257</SRS>
+      <SRS>EPSG:3258</SRS>
+      <SRS>EPSG:3259</SRS>
+      <SRS>EPSG:3260</SRS>
+      <SRS>EPSG:3261</SRS>
+      <SRS>EPSG:3262</SRS>
+      <SRS>EPSG:3263</SRS>
+      <SRS>EPSG:3264</SRS>
+      <SRS>EPSG:3265</SRS>
+      <SRS>EPSG:3266</SRS>
+      <SRS>EPSG:3267</SRS>
+      <SRS>EPSG:3268</SRS>
+      <SRS>EPSG:3269</SRS>
+      <SRS>EPSG:3270</SRS>
+      <SRS>EPSG:3271</SRS>
+      <SRS>EPSG:3272</SRS>
+      <SRS>EPSG:3273</SRS>
+      <SRS>EPSG:3274</SRS>
+      <SRS>EPSG:3275</SRS>
+      <SRS>EPSG:3276</SRS>
+      <SRS>EPSG:3277</SRS>
+      <SRS>EPSG:3278</SRS>
+      <SRS>EPSG:3279</SRS>
+      <SRS>EPSG:3280</SRS>
+      <SRS>EPSG:3281</SRS>
+      <SRS>EPSG:3282</SRS>
+      <SRS>EPSG:3283</SRS>
+      <SRS>EPSG:3284</SRS>
+      <SRS>EPSG:3285</SRS>
+      <SRS>EPSG:3286</SRS>
+      <SRS>EPSG:3287</SRS>
+      <SRS>EPSG:3288</SRS>
+      <SRS>EPSG:3289</SRS>
+      <SRS>EPSG:3290</SRS>
+      <SRS>EPSG:3291</SRS>
+      <SRS>EPSG:3292</SRS>
+      <SRS>EPSG:3293</SRS>
+      <SRS>EPSG:3294</SRS>
+      <SRS>EPSG:3295</SRS>
+      <SRS>EPSG:3296</SRS>
+      <SRS>EPSG:3297</SRS>
+      <SRS>EPSG:3298</SRS>
+      <SRS>EPSG:3299</SRS>
+      <SRS>EPSG:3300</SRS>
+      <SRS>EPSG:3301</SRS>
+      <SRS>EPSG:3302</SRS>
+      <SRS>EPSG:3303</SRS>
+      <SRS>EPSG:3304</SRS>
+      <SRS>EPSG:3305</SRS>
+      <SRS>EPSG:3306</SRS>
+      <SRS>EPSG:3307</SRS>
+      <SRS>EPSG:3308</SRS>
+      <SRS>EPSG:3309</SRS>
+      <SRS>EPSG:3310</SRS>
+      <SRS>EPSG:3311</SRS>
+      <SRS>EPSG:3312</SRS>
+      <SRS>EPSG:3313</SRS>
+      <SRS>EPSG:3314</SRS>
+      <SRS>EPSG:3315</SRS>
+      <SRS>EPSG:3316</SRS>
+      <SRS>EPSG:3317</SRS>
+      <SRS>EPSG:3318</SRS>
+      <SRS>EPSG:3319</SRS>
+      <SRS>EPSG:3320</SRS>
+      <SRS>EPSG:3321</SRS>
+      <SRS>EPSG:3322</SRS>
+      <SRS>EPSG:3323</SRS>
+      <SRS>EPSG:3324</SRS>
+      <SRS>EPSG:3325</SRS>
+      <SRS>EPSG:3326</SRS>
+      <SRS>EPSG:3327</SRS>
+      <SRS>EPSG:3328</SRS>
+      <SRS>EPSG:3329</SRS>
+      <SRS>EPSG:3330</SRS>
+      <SRS>EPSG:3331</SRS>
+      <SRS>EPSG:3332</SRS>
+      <SRS>EPSG:3333</SRS>
+      <SRS>EPSG:3334</SRS>
+      <SRS>EPSG:3335</SRS>
+      <SRS>EPSG:3336</SRS>
+      <SRS>EPSG:3337</SRS>
+      <SRS>EPSG:3338</SRS>
+      <SRS>EPSG:3339</SRS>
+      <SRS>EPSG:3340</SRS>
+      <SRS>EPSG:3341</SRS>
+      <SRS>EPSG:3342</SRS>
+      <SRS>EPSG:3343</SRS>
+      <SRS>EPSG:3344</SRS>
+      <SRS>EPSG:3345</SRS>
+      <SRS>EPSG:3346</SRS>
+      <SRS>EPSG:3347</SRS>
+      <SRS>EPSG:3348</SRS>
+      <SRS>EPSG:3349</SRS>
+      <SRS>EPSG:3350</SRS>
+      <SRS>EPSG:3351</SRS>
+      <SRS>EPSG:3352</SRS>
+      <SRS>EPSG:3353</SRS>
+      <SRS>EPSG:3354</SRS>
+      <SRS>EPSG:3355</SRS>
+      <SRS>EPSG:3356</SRS>
+      <SRS>EPSG:3357</SRS>
+      <SRS>EPSG:3358</SRS>
+      <SRS>EPSG:3359</SRS>
+      <SRS>EPSG:3360</SRS>
+      <SRS>EPSG:3361</SRS>
+      <SRS>EPSG:3362</SRS>
+      <SRS>EPSG:3363</SRS>
+      <SRS>EPSG:3364</SRS>
+      <SRS>EPSG:3365</SRS>
+      <SRS>EPSG:3366</SRS>
+      <SRS>EPSG:3367</SRS>
+      <SRS>EPSG:3368</SRS>
+      <SRS>EPSG:3369</SRS>
+      <SRS>EPSG:3370</SRS>
+      <SRS>EPSG:3371</SRS>
+      <SRS>EPSG:3372</SRS>
+      <SRS>EPSG:3373</SRS>
+      <SRS>EPSG:3374</SRS>
+      <SRS>EPSG:3375</SRS>
+      <SRS>EPSG:3376</SRS>
+      <SRS>EPSG:3377</SRS>
+      <SRS>EPSG:3378</SRS>
+      <SRS>EPSG:3379</SRS>
+      <SRS>EPSG:3380</SRS>
+      <SRS>EPSG:3381</SRS>
+      <SRS>EPSG:3382</SRS>
+      <SRS>EPSG:3383</SRS>
+      <SRS>EPSG:3384</SRS>
+      <SRS>EPSG:3385</SRS>
+      <SRS>EPSG:3386</SRS>
+      <SRS>EPSG:3387</SRS>
+      <SRS>EPSG:3388</SRS>
+      <SRS>EPSG:3389</SRS>
+      <SRS>EPSG:3390</SRS>
+      <SRS>EPSG:3391</SRS>
+      <SRS>EPSG:3392</SRS>
+      <SRS>EPSG:3393</SRS>
+      <SRS>EPSG:3394</SRS>
+      <SRS>EPSG:3395</SRS>
+      <SRS>EPSG:3396</SRS>
+      <SRS>EPSG:3397</SRS>
+      <SRS>EPSG:3398</SRS>
+      <SRS>EPSG:3399</SRS>
+      <SRS>EPSG:3400</SRS>
+      <SRS>EPSG:3401</SRS>
+      <SRS>EPSG:3402</SRS>
+      <SRS>EPSG:3403</SRS>
+      <SRS>EPSG:3404</SRS>
+      <SRS>EPSG:3405</SRS>
+      <SRS>EPSG:3406</SRS>
+      <SRS>EPSG:3407</SRS>
+      <SRS>EPSG:3408</SRS>
+      <SRS>EPSG:3409</SRS>
+      <SRS>EPSG:3410</SRS>
+      <SRS>EPSG:3411</SRS>
+      <SRS>EPSG:3412</SRS>
+      <SRS>EPSG:3413</SRS>
+      <SRS>EPSG:3414</SRS>
+      <SRS>EPSG:3415</SRS>
+      <SRS>EPSG:3416</SRS>
+      <SRS>EPSG:3417</SRS>
+      <SRS>EPSG:3418</SRS>
+      <SRS>EPSG:3419</SRS>
+      <SRS>EPSG:3420</SRS>
+      <SRS>EPSG:3421</SRS>
+      <SRS>EPSG:3422</SRS>
+      <SRS>EPSG:3423</SRS>
+      <SRS>EPSG:3424</SRS>
+      <SRS>EPSG:3425</SRS>
+      <SRS>EPSG:3426</SRS>
+      <SRS>EPSG:3427</SRS>
+      <SRS>EPSG:3428</SRS>
+      <SRS>EPSG:3429</SRS>
+      <SRS>EPSG:3430</SRS>
+      <SRS>EPSG:3431</SRS>
+      <SRS>EPSG:3432</SRS>
+      <SRS>EPSG:3433</SRS>
+      <SRS>EPSG:3434</SRS>
+      <SRS>EPSG:3435</SRS>
+      <SRS>EPSG:3436</SRS>
+      <SRS>EPSG:3437</SRS>
+      <SRS>EPSG:3438</SRS>
+      <SRS>EPSG:3439</SRS>
+      <SRS>EPSG:3440</SRS>
+      <SRS>EPSG:3441</SRS>
+      <SRS>EPSG:3442</SRS>
+      <SRS>EPSG:3443</SRS>
+      <SRS>EPSG:3444</SRS>
+      <SRS>EPSG:3445</SRS>
+      <SRS>EPSG:3446</SRS>
+      <SRS>EPSG:3447</SRS>
+      <SRS>EPSG:3448</SRS>
+      <SRS>EPSG:3449</SRS>
+      <SRS>EPSG:3450</SRS>
+      <SRS>EPSG:3451</SRS>
+      <SRS>EPSG:3452</SRS>
+      <SRS>EPSG:3453</SRS>
+      <SRS>EPSG:3454</SRS>
+      <SRS>EPSG:3455</SRS>
+      <SRS>EPSG:3456</SRS>
+      <SRS>EPSG:3457</SRS>
+      <SRS>EPSG:3458</SRS>
+      <SRS>EPSG:3459</SRS>
+      <SRS>EPSG:3460</SRS>
+      <SRS>EPSG:3461</SRS>
+      <SRS>EPSG:3462</SRS>
+      <SRS>EPSG:3463</SRS>
+      <SRS>EPSG:3464</SRS>
+      <SRS>EPSG:3560</SRS>
+      <SRS>EPSG:3561</SRS>
+      <SRS>EPSG:3562</SRS>
+      <SRS>EPSG:3563</SRS>
+      <SRS>EPSG:3564</SRS>
+      <SRS>EPSG:3565</SRS>
+      <SRS>EPSG:3566</SRS>
+      <SRS>EPSG:3567</SRS>
+      <SRS>EPSG:3568</SRS>
+      <SRS>EPSG:3569</SRS>
+      <SRS>EPSG:3570</SRS>
+      <SRS>EPSG:3571</SRS>
+      <SRS>EPSG:3572</SRS>
+      <SRS>EPSG:3573</SRS>
+      <SRS>EPSG:3574</SRS>
+      <SRS>EPSG:3575</SRS>
+      <SRS>EPSG:3576</SRS>
+      <SRS>EPSG:3577</SRS>
+      <SRS>EPSG:3920</SRS>
+      <SRS>EPSG:3991</SRS>
+      <SRS>EPSG:3992</SRS>
+      <SRS>EPSG:3993</SRS>
+      <SRS>EPSG:4001</SRS>
+      <SRS>EPSG:4002</SRS>
+      <SRS>EPSG:4003</SRS>
+      <SRS>EPSG:4004</SRS>
+      <SRS>EPSG:4005</SRS>
+      <SRS>EPSG:4006</SRS>
+      <SRS>EPSG:4007</SRS>
+      <SRS>EPSG:4008</SRS>
+      <SRS>EPSG:4009</SRS>
+      <SRS>EPSG:4010</SRS>
+      <SRS>EPSG:4011</SRS>
+      <SRS>EPSG:4012</SRS>
+      <SRS>EPSG:4013</SRS>
+      <SRS>EPSG:4014</SRS>
+      <SRS>EPSG:4015</SRS>
+      <SRS>EPSG:4016</SRS>
+      <SRS>EPSG:4018</SRS>
+      <SRS>EPSG:4019</SRS>
+      <SRS>EPSG:4020</SRS>
+      <SRS>EPSG:4021</SRS>
+      <SRS>EPSG:4022</SRS>
+      <SRS>EPSG:4024</SRS>
+      <SRS>EPSG:4025</SRS>
+      <SRS>EPSG:4027</SRS>
+      <SRS>EPSG:4028</SRS>
+      <SRS>EPSG:4029</SRS>
+      <SRS>EPSG:4030</SRS>
+      <SRS>EPSG:4031</SRS>
+      <SRS>EPSG:4032</SRS>
+      <SRS>EPSG:4033</SRS>
+      <SRS>EPSG:4034</SRS>
+      <SRS>EPSG:4035</SRS>
+      <SRS>EPSG:4036</SRS>
+      <SRS>EPSG:4041</SRS>
+      <SRS>EPSG:4042</SRS>
+      <SRS>EPSG:4043</SRS>
+      <SRS>EPSG:4044</SRS>
+      <SRS>EPSG:4045</SRS>
+      <SRS>EPSG:4047</SRS>
+      <SRS>EPSG:4052</SRS>
+      <SRS>EPSG:4053</SRS>
+      <SRS>EPSG:4054</SRS>
+      <SRS>EPSG:4120</SRS>
+      <SRS>EPSG:4121</SRS>
+      <SRS>EPSG:4122</SRS>
+      <SRS>EPSG:4123</SRS>
+      <SRS>EPSG:4124</SRS>
+      <SRS>EPSG:4125</SRS>
+      <SRS>EPSG:4126</SRS>
+      <SRS>EPSG:4127</SRS>
+      <SRS>EPSG:4128</SRS>
+      <SRS>EPSG:4129</SRS>
+      <SRS>EPSG:4130</SRS>
+      <SRS>EPSG:4131</SRS>
+      <SRS>EPSG:4132</SRS>
+      <SRS>EPSG:4133</SRS>
+      <SRS>EPSG:4134</SRS>
+      <SRS>EPSG:4135</SRS>
+      <SRS>EPSG:4136</SRS>
+      <SRS>EPSG:4137</SRS>
+      <SRS>EPSG:4138</SRS>
+      <SRS>EPSG:4139</SRS>
+      <SRS>EPSG:4140</SRS>
+      <SRS>EPSG:4141</SRS>
+      <SRS>EPSG:4142</SRS>
+      <SRS>EPSG:4143</SRS>
+      <SRS>EPSG:4144</SRS>
+      <SRS>EPSG:4145</SRS>
+      <SRS>EPSG:4146</SRS>
+      <SRS>EPSG:4147</SRS>
+      <SRS>EPSG:4148</SRS>
+      <SRS>EPSG:4149</SRS>
+      <SRS>EPSG:4150</SRS>
+      <SRS>EPSG:4151</SRS>
+      <SRS>EPSG:4152</SRS>
+      <SRS>EPSG:4153</SRS>
+      <SRS>EPSG:4154</SRS>
+      <SRS>EPSG:4155</SRS>
+      <SRS>EPSG:4156</SRS>
+      <SRS>EPSG:4157</SRS>
+      <SRS>EPSG:4158</SRS>
+      <SRS>EPSG:4159</SRS>
+      <SRS>EPSG:4160</SRS>
+      <SRS>EPSG:4161</SRS>
+      <SRS>EPSG:4162</SRS>
+      <SRS>EPSG:4163</SRS>
+      <SRS>EPSG:4164</SRS>
+      <SRS>EPSG:4165</SRS>
+      <SRS>EPSG:4166</SRS>
+      <SRS>EPSG:4167</SRS>
+      <SRS>EPSG:4168</SRS>
+      <SRS>EPSG:4169</SRS>
+      <SRS>EPSG:4170</SRS>
+      <SRS>EPSG:4171</SRS>
+      <SRS>EPSG:4172</SRS>
+      <SRS>EPSG:4173</SRS>
+      <SRS>EPSG:4174</SRS>
+      <SRS>EPSG:4175</SRS>
+      <SRS>EPSG:4176</SRS>
+      <SRS>EPSG:4178</SRS>
+      <SRS>EPSG:4179</SRS>
+      <SRS>EPSG:4180</SRS>
+      <SRS>EPSG:4181</SRS>
+      <SRS>EPSG:4182</SRS>
+      <SRS>EPSG:4183</SRS>
+      <SRS>EPSG:4184</SRS>
+      <SRS>EPSG:4185</SRS>
+      <SRS>EPSG:4188</SRS>
+      <SRS>EPSG:4189</SRS>
+      <SRS>EPSG:4190</SRS>
+      <SRS>EPSG:4191</SRS>
+      <SRS>EPSG:4192</SRS>
+      <SRS>EPSG:4193</SRS>
+      <SRS>EPSG:4194</SRS>
+      <SRS>EPSG:4195</SRS>
+      <SRS>EPSG:4196</SRS>
+      <SRS>EPSG:4197</SRS>
+      <SRS>EPSG:4198</SRS>
+      <SRS>EPSG:4199</SRS>
+      <SRS>EPSG:4200</SRS>
+      <SRS>EPSG:4201</SRS>
+      <SRS>EPSG:4202</SRS>
+      <SRS>EPSG:4203</SRS>
+      <SRS>EPSG:4204</SRS>
+      <SRS>EPSG:4205</SRS>
+      <SRS>EPSG:4206</SRS>
+      <SRS>EPSG:4207</SRS>
+      <SRS>EPSG:4208</SRS>
+      <SRS>EPSG:4209</SRS>
+      <SRS>EPSG:4210</SRS>
+      <SRS>EPSG:4211</SRS>
+      <SRS>EPSG:4212</SRS>
+      <SRS>EPSG:4213</SRS>
+      <SRS>EPSG:4214</SRS>
+      <SRS>EPSG:4215</SRS>
+      <SRS>EPSG:4216</SRS>
+      <SRS>EPSG:4218</SRS>
+      <SRS>EPSG:4219</SRS>
+      <SRS>EPSG:4220</SRS>
+      <SRS>EPSG:4221</SRS>
+      <SRS>EPSG:4222</SRS>
+      <SRS>EPSG:4223</SRS>
+      <SRS>EPSG:4224</SRS>
+      <SRS>EPSG:4225</SRS>
+      <SRS>EPSG:4226</SRS>
+      <SRS>EPSG:4227</SRS>
+      <SRS>EPSG:4228</SRS>
+      <SRS>EPSG:4229</SRS>
+      <SRS>EPSG:4230</SRS>
+      <SRS>EPSG:4231</SRS>
+      <SRS>EPSG:4232</SRS>
+      <SRS>EPSG:4233</SRS>
+      <SRS>EPSG:4234</SRS>
+      <SRS>EPSG:4235</SRS>
+      <SRS>EPSG:4236</SRS>
+      <SRS>EPSG:4237</SRS>
+      <SRS>EPSG:4238</SRS>
+      <SRS>EPSG:4239</SRS>
+      <SRS>EPSG:4240</SRS>
+      <SRS>EPSG:4241</SRS>
+      <SRS>EPSG:4242</SRS>
+      <SRS>EPSG:4243</SRS>
+      <SRS>EPSG:4244</SRS>
+      <SRS>EPSG:4245</SRS>
+      <SRS>EPSG:4246</SRS>
+      <SRS>EPSG:4247</SRS>
+      <SRS>EPSG:4248</SRS>
+      <SRS>EPSG:4249</SRS>
+      <SRS>EPSG:4250</SRS>
+      <SRS>EPSG:4251</SRS>
+      <SRS>EPSG:4252</SRS>
+      <SRS>EPSG:4253</SRS>
+      <SRS>EPSG:4254</SRS>
+      <SRS>EPSG:4255</SRS>
+      <SRS>EPSG:4256</SRS>
+      <SRS>EPSG:4257</SRS>
+      <SRS>EPSG:4258</SRS>
+      <SRS>EPSG:4259</SRS>
+      <SRS>EPSG:4260</SRS>
+      <SRS>EPSG:4261</SRS>
+      <SRS>EPSG:4262</SRS>
+      <SRS>EPSG:4263</SRS>
+      <SRS>EPSG:4264</SRS>
+      <SRS>EPSG:4265</SRS>
+      <SRS>EPSG:4266</SRS>
+      <SRS>EPSG:4267</SRS>
+      <SRS>EPSG:4268</SRS>
+      <SRS>EPSG:4269</SRS>
+      <SRS>EPSG:4270</SRS>
+      <SRS>EPSG:4271</SRS>
+      <SRS>EPSG:4272</SRS>
+      <SRS>EPSG:4273</SRS>
+      <SRS>EPSG:4274</SRS>
+      <SRS>EPSG:4275</SRS>
+      <SRS>EPSG:4276</SRS>
+      <SRS>EPSG:4277</SRS>
+      <SRS>EPSG:4278</SRS>
+      <SRS>EPSG:4279</SRS>
+      <SRS>EPSG:4280</SRS>
+      <SRS>EPSG:4281</SRS>
+      <SRS>EPSG:4282</SRS>
+      <SRS>EPSG:4283</SRS>
+      <SRS>EPSG:4284</SRS>
+      <SRS>EPSG:4285</SRS>
+      <SRS>EPSG:4286</SRS>
+      <SRS>EPSG:4287</SRS>
+      <SRS>EPSG:4288</SRS>
+      <SRS>EPSG:4289</SRS>
+      <SRS>EPSG:4291</SRS>
+      <SRS>EPSG:4292</SRS>
+      <SRS>EPSG:4293</SRS>
+      <SRS>EPSG:4294</SRS>
+      <SRS>EPSG:4295</SRS>
+      <SRS>EPSG:4296</SRS>
+      <SRS>EPSG:4297</SRS>
+      <SRS>EPSG:4298</SRS>
+      <SRS>EPSG:4299</SRS>
+      <SRS>EPSG:4300</SRS>
+      <SRS>EPSG:4301</SRS>
+      <SRS>EPSG:4302</SRS>
+      <SRS>EPSG:4303</SRS>
+      <SRS>EPSG:4304</SRS>
+      <SRS>EPSG:4306</SRS>
+      <SRS>EPSG:4307</SRS>
+      <SRS>EPSG:4308</SRS>
+      <SRS>EPSG:4309</SRS>
+      <SRS>EPSG:4310</SRS>
+      <SRS>EPSG:4311</SRS>
+      <SRS>EPSG:4312</SRS>
+      <SRS>EPSG:4313</SRS>
+      <SRS>EPSG:4314</SRS>
+      <SRS>EPSG:4315</SRS>
+      <SRS>EPSG:4316</SRS>
+      <SRS>EPSG:4317</SRS>
+      <SRS>EPSG:4318</SRS>
+      <SRS>EPSG:4319</SRS>
+      <SRS>EPSG:4322</SRS>
+      <SRS>EPSG:4324</SRS>
+      <SRS>EPSG:4326</SRS>
+      <SRS>EPSG:4327</SRS>
+      <SRS>EPSG:4328</SRS>
+      <SRS>EPSG:4329</SRS>
+      <SRS>EPSG:4330</SRS>
+      <SRS>EPSG:4331</SRS>
+      <SRS>EPSG:4332</SRS>
+      <SRS>EPSG:4333</SRS>
+      <SRS>EPSG:4334</SRS>
+      <SRS>EPSG:4335</SRS>
+      <SRS>EPSG:4336</SRS>
+      <SRS>EPSG:4337</SRS>
+      <SRS>EPSG:4338</SRS>
+      <SRS>EPSG:4339</SRS>
+      <SRS>EPSG:4340</SRS>
+      <SRS>EPSG:4341</SRS>
+      <SRS>EPSG:4342</SRS>
+      <SRS>EPSG:4343</SRS>
+      <SRS>EPSG:4344</SRS>
+      <SRS>EPSG:4345</SRS>
+      <SRS>EPSG:4346</SRS>
+      <SRS>EPSG:4347</SRS>
+      <SRS>EPSG:4348</SRS>
+      <SRS>EPSG:4349</SRS>
+      <SRS>EPSG:4350</SRS>
+      <SRS>EPSG:4351</SRS>
+      <SRS>EPSG:4352</SRS>
+      <SRS>EPSG:4353</SRS>
+      <SRS>EPSG:4354</SRS>
+      <SRS>EPSG:4355</SRS>
+      <SRS>EPSG:4356</SRS>
+      <SRS>EPSG:4357</SRS>
+      <SRS>EPSG:4358</SRS>
+      <SRS>EPSG:4359</SRS>
+      <SRS>EPSG:4360</SRS>
+      <SRS>EPSG:4361</SRS>
+      <SRS>EPSG:4362</SRS>
+      <SRS>EPSG:4363</SRS>
+      <SRS>EPSG:4364</SRS>
+      <SRS>EPSG:4365</SRS>
+      <SRS>EPSG:4366</SRS>
+      <SRS>EPSG:4367</SRS>
+      <SRS>EPSG:4368</SRS>
+      <SRS>EPSG:4369</SRS>
+      <SRS>EPSG:4370</SRS>
+      <SRS>EPSG:4371</SRS>
+      <SRS>EPSG:4372</SRS>
+      <SRS>EPSG:4373</SRS>
+      <SRS>EPSG:4374</SRS>
+      <SRS>EPSG:4375</SRS>
+      <SRS>EPSG:4376</SRS>
+      <SRS>EPSG:4377</SRS>
+      <SRS>EPSG:4378</SRS>
+      <SRS>EPSG:4379</SRS>
+      <SRS>EPSG:4380</SRS>
+      <SRS>EPSG:4381</SRS>
+      <SRS>EPSG:4382</SRS>
+      <SRS>EPSG:4383</SRS>
+      <SRS>EPSG:4384</SRS>
+      <SRS>EPSG:4385</SRS>
+      <SRS>EPSG:4386</SRS>
+      <SRS>EPSG:4387</SRS>
+      <SRS>EPSG:4388</SRS>
+      <SRS>EPSG:4389</SRS>
+      <SRS>EPSG:4600</SRS>
+      <SRS>EPSG:4601</SRS>
+      <SRS>EPSG:4602</SRS>
+      <SRS>EPSG:4603</SRS>
+      <SRS>EPSG:4604</SRS>
+      <SRS>EPSG:4605</SRS>
+      <SRS>EPSG:4606</SRS>
+      <SRS>EPSG:4607</SRS>
+      <SRS>EPSG:4608</SRS>
+      <SRS>EPSG:4609</SRS>
+      <SRS>EPSG:4610</SRS>
+      <SRS>EPSG:4611</SRS>
+      <SRS>EPSG:4612</SRS>
+      <SRS>EPSG:4613</SRS>
+      <SRS>EPSG:4614</SRS>
+      <SRS>EPSG:4615</SRS>
+      <SRS>EPSG:4616</SRS>
+      <SRS>EPSG:4617</SRS>
+      <SRS>EPSG:4618</SRS>
+      <SRS>EPSG:4619</SRS>
+      <SRS>EPSG:4620</SRS>
+      <SRS>EPSG:4621</SRS>
+      <SRS>EPSG:4622</SRS>
+      <SRS>EPSG:4623</SRS>
+      <SRS>EPSG:4624</SRS>
+      <SRS>EPSG:4625</SRS>
+      <SRS>EPSG:4626</SRS>
+      <SRS>EPSG:4627</SRS>
+      <SRS>EPSG:4628</SRS>
+      <SRS>EPSG:4629</SRS>
+      <SRS>EPSG:4630</SRS>
+      <SRS>EPSG:4631</SRS>
+      <SRS>EPSG:4632</SRS>
+      <SRS>EPSG:4633</SRS>
+      <SRS>EPSG:4634</SRS>
+      <SRS>EPSG:4635</SRS>
+      <SRS>EPSG:4636</SRS>
+      <SRS>EPSG:4637</SRS>
+      <SRS>EPSG:4638</SRS>
+      <SRS>EPSG:4639</SRS>
+      <SRS>EPSG:4640</SRS>
+      <SRS>EPSG:4641</SRS>
+      <SRS>EPSG:4642</SRS>
+      <SRS>EPSG:4643</SRS>
+      <SRS>EPSG:4644</SRS>
+      <SRS>EPSG:4645</SRS>
+      <SRS>EPSG:4646</SRS>
+      <SRS>EPSG:4657</SRS>
+      <SRS>EPSG:4658</SRS>
+      <SRS>EPSG:4659</SRS>
+      <SRS>EPSG:4660</SRS>
+      <SRS>EPSG:4661</SRS>
+      <SRS>EPSG:4662</SRS>
+      <SRS>EPSG:4663</SRS>
+      <SRS>EPSG:4664</SRS>
+      <SRS>EPSG:4665</SRS>
+      <SRS>EPSG:4666</SRS>
+      <SRS>EPSG:4667</SRS>
+      <SRS>EPSG:4668</SRS>
+      <SRS>EPSG:4669</SRS>
+      <SRS>EPSG:4670</SRS>
+      <SRS>EPSG:4671</SRS>
+      <SRS>EPSG:4672</SRS>
+      <SRS>EPSG:4673</SRS>
+      <SRS>EPSG:4674</SRS>
+      <SRS>EPSG:4675</SRS>
+      <SRS>EPSG:4676</SRS>
+      <SRS>EPSG:4677</SRS>
+      <SRS>EPSG:4678</SRS>
+      <SRS>EPSG:4679</SRS>
+      <SRS>EPSG:4680</SRS>
+      <SRS>EPSG:4681</SRS>
+      <SRS>EPSG:4682</SRS>
+      <SRS>EPSG:4683</SRS>
+      <SRS>EPSG:4684</SRS>
+      <SRS>EPSG:4685</SRS>
+      <SRS>EPSG:4686</SRS>
+      <SRS>EPSG:4687</SRS>
+      <SRS>EPSG:4688</SRS>
+      <SRS>EPSG:4689</SRS>
+      <SRS>EPSG:4690</SRS>
+      <SRS>EPSG:4691</SRS>
+      <SRS>EPSG:4692</SRS>
+      <SRS>EPSG:4693</SRS>
+      <SRS>EPSG:4694</SRS>
+      <SRS>EPSG:4695</SRS>
+      <SRS>EPSG:4696</SRS>
+      <SRS>EPSG:4697</SRS>
+      <SRS>EPSG:4698</SRS>
+      <SRS>EPSG:4699</SRS>
+      <SRS>EPSG:4700</SRS>
+      <SRS>EPSG:4701</SRS>
+      <SRS>EPSG:4702</SRS>
+      <SRS>EPSG:4703</SRS>
+      <SRS>EPSG:4704</SRS>
+      <SRS>EPSG:4705</SRS>
+      <SRS>EPSG:4706</SRS>
+      <SRS>EPSG:4707</SRS>
+      <SRS>EPSG:4708</SRS>
+      <SRS>EPSG:4709</SRS>
+      <SRS>EPSG:4710</SRS>
+      <SRS>EPSG:4711</SRS>
+      <SRS>EPSG:4712</SRS>
+      <SRS>EPSG:4713</SRS>
+      <SRS>EPSG:4714</SRS>
+      <SRS>EPSG:4715</SRS>
+      <SRS>EPSG:4716</SRS>
+      <SRS>EPSG:4717</SRS>
+      <SRS>EPSG:4718</SRS>
+      <SRS>EPSG:4719</SRS>
+      <SRS>EPSG:4720</SRS>
+      <SRS>EPSG:4721</SRS>
+      <SRS>EPSG:4722</SRS>
+      <SRS>EPSG:4723</SRS>
+      <SRS>EPSG:4724</SRS>
+      <SRS>EPSG:4725</SRS>
+      <SRS>EPSG:4726</SRS>
+      <SRS>EPSG:4727</SRS>
+      <SRS>EPSG:4728</SRS>
+      <SRS>EPSG:4729</SRS>
+      <SRS>EPSG:4730</SRS>
+      <SRS>EPSG:4731</SRS>
+      <SRS>EPSG:4732</SRS>
+      <SRS>EPSG:4733</SRS>
+      <SRS>EPSG:4734</SRS>
+      <SRS>EPSG:4735</SRS>
+      <SRS>EPSG:4736</SRS>
+      <SRS>EPSG:4737</SRS>
+      <SRS>EPSG:4738</SRS>
+      <SRS>EPSG:4739</SRS>
+      <SRS>EPSG:4740</SRS>
+      <SRS>EPSG:4741</SRS>
+      <SRS>EPSG:4742</SRS>
+      <SRS>EPSG:4743</SRS>
+      <SRS>EPSG:4744</SRS>
+      <SRS>EPSG:4745</SRS>
+      <SRS>EPSG:4746</SRS>
+      <SRS>EPSG:4747</SRS>
+      <SRS>EPSG:4748</SRS>
+      <SRS>EPSG:4749</SRS>
+      <SRS>EPSG:4750</SRS>
+      <SRS>EPSG:4751</SRS>
+      <SRS>EPSG:4752</SRS>
+      <SRS>EPSG:4753</SRS>
+      <SRS>EPSG:4754</SRS>
+      <SRS>EPSG:4755</SRS>
+      <SRS>EPSG:4756</SRS>
+      <SRS>EPSG:4757</SRS>
+      <SRS>EPSG:4758</SRS>
+      <SRS>EPSG:4801</SRS>
+      <SRS>EPSG:4802</SRS>
+      <SRS>EPSG:4803</SRS>
+      <SRS>EPSG:4804</SRS>
+      <SRS>EPSG:4805</SRS>
+      <SRS>EPSG:4806</SRS>
+      <SRS>EPSG:4807</SRS>
+      <SRS>EPSG:4808</SRS>
+      <SRS>EPSG:4809</SRS>
+      <SRS>EPSG:4810</SRS>
+      <SRS>EPSG:4811</SRS>
+      <SRS>EPSG:4813</SRS>
+      <SRS>EPSG:4814</SRS>
+      <SRS>EPSG:4815</SRS>
+      <SRS>EPSG:4816</SRS>
+      <SRS>EPSG:4817</SRS>
+      <SRS>EPSG:4818</SRS>
+      <SRS>EPSG:4819</SRS>
+      <SRS>EPSG:4820</SRS>
+      <SRS>EPSG:4821</SRS>
+      <SRS>EPSG:4894</SRS>
+      <SRS>EPSG:4895</SRS>
+      <SRS>EPSG:4896</SRS>
+      <SRS>EPSG:4897</SRS>
+      <SRS>EPSG:4898</SRS>
+      <SRS>EPSG:4899</SRS>
+      <SRS>EPSG:4900</SRS>
+      <SRS>EPSG:4901</SRS>
+      <SRS>EPSG:4902</SRS>
+      <SRS>EPSG:4903</SRS>
+      <SRS>EPSG:4904</SRS>
+      <SRS>EPSG:4906</SRS>
+      <SRS>EPSG:4907</SRS>
+      <SRS>EPSG:4908</SRS>
+      <SRS>EPSG:4909</SRS>
+      <SRS>EPSG:4910</SRS>
+      <SRS>EPSG:4911</SRS>
+      <SRS>EPSG:4912</SRS>
+      <SRS>EPSG:4913</SRS>
+      <SRS>EPSG:4914</SRS>
+      <SRS>EPSG:4915</SRS>
+      <SRS>EPSG:4916</SRS>
+      <SRS>EPSG:4917</SRS>
+      <SRS>EPSG:4918</SRS>
+      <SRS>EPSG:4919</SRS>
+      <SRS>EPSG:4920</SRS>
+      <SRS>EPSG:4921</SRS>
+      <SRS>EPSG:4922</SRS>
+      <SRS>EPSG:4923</SRS>
+      <SRS>EPSG:4924</SRS>
+      <SRS>EPSG:4925</SRS>
+      <SRS>EPSG:4926</SRS>
+      <SRS>EPSG:4927</SRS>
+      <SRS>EPSG:4928</SRS>
+      <SRS>EPSG:4929</SRS>
+      <SRS>EPSG:4930</SRS>
+      <SRS>EPSG:4931</SRS>
+      <SRS>EPSG:4932</SRS>
+      <SRS>EPSG:4933</SRS>
+      <SRS>EPSG:4934</SRS>
+      <SRS>EPSG:4935</SRS>
+      <SRS>EPSG:4936</SRS>
+      <SRS>EPSG:4937</SRS>
+      <SRS>EPSG:4938</SRS>
+      <SRS>EPSG:4939</SRS>
+      <SRS>EPSG:4940</SRS>
+      <SRS>EPSG:4941</SRS>
+      <SRS>EPSG:4942</SRS>
+      <SRS>EPSG:4943</SRS>
+      <SRS>EPSG:4944</SRS>
+      <SRS>EPSG:4945</SRS>
+      <SRS>EPSG:4946</SRS>
+      <SRS>EPSG:4947</SRS>
+      <SRS>EPSG:4948</SRS>
+      <SRS>EPSG:4949</SRS>
+      <SRS>EPSG:4950</SRS>
+      <SRS>EPSG:4951</SRS>
+      <SRS>EPSG:4952</SRS>
+      <SRS>EPSG:4953</SRS>
+      <SRS>EPSG:4954</SRS>
+      <SRS>EPSG:4955</SRS>
+      <SRS>EPSG:4956</SRS>
+      <SRS>EPSG:4957</SRS>
+      <SRS>EPSG:4958</SRS>
+      <SRS>EPSG:4959</SRS>
+      <SRS>EPSG:4960</SRS>
+      <SRS>EPSG:4961</SRS>
+      <SRS>EPSG:4962</SRS>
+      <SRS>EPSG:4963</SRS>
+      <SRS>EPSG:4964</SRS>
+      <SRS>EPSG:4965</SRS>
+      <SRS>EPSG:4966</SRS>
+      <SRS>EPSG:4967</SRS>
+      <SRS>EPSG:4968</SRS>
+      <SRS>EPSG:4969</SRS>
+      <SRS>EPSG:4970</SRS>
+      <SRS>EPSG:4971</SRS>
+      <SRS>EPSG:4972</SRS>
+      <SRS>EPSG:4973</SRS>
+      <SRS>EPSG:4974</SRS>
+      <SRS>EPSG:4975</SRS>
+      <SRS>EPSG:4976</SRS>
+      <SRS>EPSG:4977</SRS>
+      <SRS>EPSG:4978</SRS>
+      <SRS>EPSG:4979</SRS>
+      <SRS>EPSG:4980</SRS>
+      <SRS>EPSG:4981</SRS>
+      <SRS>EPSG:4982</SRS>
+      <SRS>EPSG:4983</SRS>
+      <SRS>EPSG:4984</SRS>
+      <SRS>EPSG:4985</SRS>
+      <SRS>EPSG:4986</SRS>
+      <SRS>EPSG:4987</SRS>
+      <SRS>EPSG:4988</SRS>
+      <SRS>EPSG:4989</SRS>
+      <SRS>EPSG:4990</SRS>
+      <SRS>EPSG:4991</SRS>
+      <SRS>EPSG:4992</SRS>
+      <SRS>EPSG:4993</SRS>
+      <SRS>EPSG:4994</SRS>
+      <SRS>EPSG:4995</SRS>
+      <SRS>EPSG:4996</SRS>
+      <SRS>EPSG:4997</SRS>
+      <SRS>EPSG:4998</SRS>
+      <SRS>EPSG:4999</SRS>
+      <SRS>EPSG:5600</SRS>
+      <SRS>EPSG:5601</SRS>
+      <SRS>EPSG:5602</SRS>
+      <SRS>EPSG:5603</SRS>
+      <SRS>EPSG:5604</SRS>
+      <SRS>EPSG:5605</SRS>
+      <SRS>EPSG:5606</SRS>
+      <SRS>EPSG:5607</SRS>
+      <SRS>EPSG:5608</SRS>
+      <SRS>EPSG:5609</SRS>
+      <SRS>EPSG:5701</SRS>
+      <SRS>EPSG:5702</SRS>
+      <SRS>EPSG:5703</SRS>
+      <SRS>EPSG:5704</SRS>
+      <SRS>EPSG:5705</SRS>
+      <SRS>EPSG:5706</SRS>
+      <SRS>EPSG:5709</SRS>
+      <SRS>EPSG:5710</SRS>
+      <SRS>EPSG:5711</SRS>
+      <SRS>EPSG:5712</SRS>
+      <SRS>EPSG:5713</SRS>
+      <SRS>EPSG:5714</SRS>
+      <SRS>EPSG:5715</SRS>
+      <SRS>EPSG:5716</SRS>
+      <SRS>EPSG:5717</SRS>
+      <SRS>EPSG:5718</SRS>
+      <SRS>EPSG:5719</SRS>
+      <SRS>EPSG:5720</SRS>
+      <SRS>EPSG:5721</SRS>
+      <SRS>EPSG:5722</SRS>
+      <SRS>EPSG:5723</SRS>
+      <SRS>EPSG:5724</SRS>
+      <SRS>EPSG:5725</SRS>
+      <SRS>EPSG:5726</SRS>
+      <SRS>EPSG:5727</SRS>
+      <SRS>EPSG:5728</SRS>
+      <SRS>EPSG:5729</SRS>
+      <SRS>EPSG:5730</SRS>
+      <SRS>EPSG:5731</SRS>
+      <SRS>EPSG:5732</SRS>
+      <SRS>EPSG:5733</SRS>
+      <SRS>EPSG:5734</SRS>
+      <SRS>EPSG:5735</SRS>
+      <SRS>EPSG:5736</SRS>
+      <SRS>EPSG:5737</SRS>
+      <SRS>EPSG:5738</SRS>
+      <SRS>EPSG:5739</SRS>
+      <SRS>EPSG:5740</SRS>
+      <SRS>EPSG:5741</SRS>
+      <SRS>EPSG:5742</SRS>
+      <SRS>EPSG:5743</SRS>
+      <SRS>EPSG:5744</SRS>
+      <SRS>EPSG:5745</SRS>
+      <SRS>EPSG:5746</SRS>
+      <SRS>EPSG:5747</SRS>
+      <SRS>EPSG:5748</SRS>
+      <SRS>EPSG:5749</SRS>
+      <SRS>EPSG:5750</SRS>
+      <SRS>EPSG:5751</SRS>
+      <SRS>EPSG:5752</SRS>
+      <SRS>EPSG:5753</SRS>
+      <SRS>EPSG:5754</SRS>
+      <SRS>EPSG:5755</SRS>
+      <SRS>EPSG:5756</SRS>
+      <SRS>EPSG:5757</SRS>
+      <SRS>EPSG:5758</SRS>
+      <SRS>EPSG:5759</SRS>
+      <SRS>EPSG:5760</SRS>
+      <SRS>EPSG:5761</SRS>
+      <SRS>EPSG:5762</SRS>
+      <SRS>EPSG:5763</SRS>
+      <SRS>EPSG:5764</SRS>
+      <SRS>EPSG:5765</SRS>
+      <SRS>EPSG:5766</SRS>
+      <SRS>EPSG:5767</SRS>
+      <SRS>EPSG:5768</SRS>
+      <SRS>EPSG:5769</SRS>
+      <SRS>EPSG:5770</SRS>
+      <SRS>EPSG:5771</SRS>
+      <SRS>EPSG:5772</SRS>
+      <SRS>EPSG:5773</SRS>
+      <SRS>EPSG:5774</SRS>
+      <SRS>EPSG:5775</SRS>
+      <SRS>EPSG:5776</SRS>
+      <SRS>EPSG:5777</SRS>
+      <SRS>EPSG:5778</SRS>
+      <SRS>EPSG:5779</SRS>
+      <SRS>EPSG:5780</SRS>
+      <SRS>EPSG:5781</SRS>
+      <SRS>EPSG:5782</SRS>
+      <SRS>EPSG:5783</SRS>
+      <SRS>EPSG:5784</SRS>
+      <SRS>EPSG:5785</SRS>
+      <SRS>EPSG:5786</SRS>
+      <SRS>EPSG:5787</SRS>
+      <SRS>EPSG:5788</SRS>
+      <SRS>EPSG:5789</SRS>
+      <SRS>EPSG:5790</SRS>
+      <SRS>EPSG:5791</SRS>
+      <SRS>EPSG:5792</SRS>
+      <SRS>EPSG:5793</SRS>
+      <SRS>EPSG:5794</SRS>
+      <SRS>EPSG:5795</SRS>
+      <SRS>EPSG:5796</SRS>
+      <SRS>EPSG:5797</SRS>
+      <SRS>EPSG:5798</SRS>
+      <SRS>EPSG:5799</SRS>
+      <SRS>EPSG:5800</SRS>
+      <SRS>EPSG:5801</SRS>
+      <SRS>EPSG:5802</SRS>
+      <SRS>EPSG:5803</SRS>
+      <SRS>EPSG:5804</SRS>
+      <SRS>EPSG:5805</SRS>
+      <SRS>EPSG:5806</SRS>
+      <SRS>EPSG:5807</SRS>
+      <SRS>EPSG:5808</SRS>
+      <SRS>EPSG:5809</SRS>
+      <SRS>EPSG:5810</SRS>
+      <SRS>EPSG:5811</SRS>
+      <SRS>EPSG:5812</SRS>
+      <SRS>EPSG:5813</SRS>
+      <SRS>EPSG:5814</SRS>
+      <SRS>EPSG:5815</SRS>
+      <SRS>EPSG:5816</SRS>
+      <SRS>EPSG:5817</SRS>
+      <SRS>EPSG:5818</SRS>
+      <SRS>EPSG:7400</SRS>
+      <SRS>EPSG:7401</SRS>
+      <SRS>EPSG:7402</SRS>
+      <SRS>EPSG:7403</SRS>
+      <SRS>EPSG:7404</SRS>
+      <SRS>EPSG:7405</SRS>
+      <SRS>EPSG:7406</SRS>
+      <SRS>EPSG:7407</SRS>
+      <SRS>EPSG:7408</SRS>
+      <SRS>EPSG:7409</SRS>
+      <SRS>EPSG:7410</SRS>
+      <SRS>EPSG:7411</SRS>
+      <SRS>EPSG:7412</SRS>
+      <SRS>EPSG:7413</SRS>
+      <SRS>EPSG:7414</SRS>
+      <SRS>EPSG:7415</SRS>
+      <SRS>EPSG:7416</SRS>
+      <SRS>EPSG:7417</SRS>
+      <SRS>EPSG:7418</SRS>
+      <SRS>EPSG:7419</SRS>
+      <SRS>EPSG:7420</SRS>
+      <SRS>EPSG:20004</SRS>
+      <SRS>EPSG:20005</SRS>
+      <SRS>EPSG:20006</SRS>
+      <SRS>EPSG:20007</SRS>
+      <SRS>EPSG:20008</SRS>
+      <SRS>EPSG:20009</SRS>
+      <SRS>EPSG:20010</SRS>
+      <SRS>EPSG:20011</SRS>
+      <SRS>EPSG:20012</SRS>
+      <SRS>EPSG:20013</SRS>
+      <SRS>EPSG:20014</SRS>
+      <SRS>EPSG:20015</SRS>
+      <SRS>EPSG:20016</SRS>
+      <SRS>EPSG:20017</SRS>
+      <SRS>EPSG:20018</SRS>
+      <SRS>EPSG:20019</SRS>
+      <SRS>EPSG:20020</SRS>
+      <SRS>EPSG:20021</SRS>
+      <SRS>EPSG:20022</SRS>
+      <SRS>EPSG:20023</SRS>
+      <SRS>EPSG:20024</SRS>
+      <SRS>EPSG:20025</SRS>
+      <SRS>EPSG:20026</SRS>
+      <SRS>EPSG:20027</SRS>
+      <SRS>EPSG:20028</SRS>
+      <SRS>EPSG:20029</SRS>
+      <SRS>EPSG:20030</SRS>
+      <SRS>EPSG:20031</SRS>
+      <SRS>EPSG:20032</SRS>
+      <SRS>EPSG:20064</SRS>
+      <SRS>EPSG:20065</SRS>
+      <SRS>EPSG:20066</SRS>
+      <SRS>EPSG:20067</SRS>
+      <SRS>EPSG:20068</SRS>
+      <SRS>EPSG:20069</SRS>
+      <SRS>EPSG:20070</SRS>
+      <SRS>EPSG:20071</SRS>
+      <SRS>EPSG:20072</SRS>
+      <SRS>EPSG:20073</SRS>
+      <SRS>EPSG:20074</SRS>
+      <SRS>EPSG:20075</SRS>
+      <SRS>EPSG:20076</SRS>
+      <SRS>EPSG:20077</SRS>
+      <SRS>EPSG:20078</SRS>
+      <SRS>EPSG:20079</SRS>
+      <SRS>EPSG:20080</SRS>
+      <SRS>EPSG:20081</SRS>
+      <SRS>EPSG:20082</SRS>
+      <SRS>EPSG:20083</SRS>
+      <SRS>EPSG:20084</SRS>
+      <SRS>EPSG:20085</SRS>
+      <SRS>EPSG:20086</SRS>
+      <SRS>EPSG:20087</SRS>
+      <SRS>EPSG:20088</SRS>
+      <SRS>EPSG:20089</SRS>
+      <SRS>EPSG:20090</SRS>
+      <SRS>EPSG:20091</SRS>
+      <SRS>EPSG:20092</SRS>
+      <SRS>EPSG:20135</SRS>
+      <SRS>EPSG:20136</SRS>
+      <SRS>EPSG:20137</SRS>
+      <SRS>EPSG:20138</SRS>
+      <SRS>EPSG:20248</SRS>
+      <SRS>EPSG:20249</SRS>
+      <SRS>EPSG:20250</SRS>
+      <SRS>EPSG:20251</SRS>
+      <SRS>EPSG:20252</SRS>
+      <SRS>EPSG:20253</SRS>
+      <SRS>EPSG:20254</SRS>
+      <SRS>EPSG:20255</SRS>
+      <SRS>EPSG:20256</SRS>
+      <SRS>EPSG:20257</SRS>
+      <SRS>EPSG:20258</SRS>
+      <SRS>EPSG:20348</SRS>
+      <SRS>EPSG:20349</SRS>
+      <SRS>EPSG:20350</SRS>
+      <SRS>EPSG:20351</SRS>
+      <SRS>EPSG:20352</SRS>
+      <SRS>EPSG:20353</SRS>
+      <SRS>EPSG:20354</SRS>
+      <SRS>EPSG:20355</SRS>
+      <SRS>EPSG:20356</SRS>
+      <SRS>EPSG:20357</SRS>
+      <SRS>EPSG:20358</SRS>
+      <SRS>EPSG:20436</SRS>
+      <SRS>EPSG:20437</SRS>
+      <SRS>EPSG:20438</SRS>
+      <SRS>EPSG:20439</SRS>
+      <SRS>EPSG:20440</SRS>
+      <SRS>EPSG:20499</SRS>
+      <SRS>EPSG:20538</SRS>
+      <SRS>EPSG:20539</SRS>
+      <SRS>EPSG:20790</SRS>
+      <SRS>EPSG:20791</SRS>
+      <SRS>EPSG:20822</SRS>
+      <SRS>EPSG:20823</SRS>
+      <SRS>EPSG:20824</SRS>
+      <SRS>EPSG:20934</SRS>
+      <SRS>EPSG:20935</SRS>
+      <SRS>EPSG:20936</SRS>
+      <SRS>EPSG:21035</SRS>
+      <SRS>EPSG:21036</SRS>
+      <SRS>EPSG:21037</SRS>
+      <SRS>EPSG:21095</SRS>
+      <SRS>EPSG:21096</SRS>
+      <SRS>EPSG:21097</SRS>
+      <SRS>EPSG:21100</SRS>
+      <SRS>EPSG:21148</SRS>
+      <SRS>EPSG:21149</SRS>
+      <SRS>EPSG:21150</SRS>
+      <SRS>EPSG:21291</SRS>
+      <SRS>EPSG:21292</SRS>
+      <SRS>EPSG:21413</SRS>
+      <SRS>EPSG:21414</SRS>
+      <SRS>EPSG:21415</SRS>
+      <SRS>EPSG:21416</SRS>
+      <SRS>EPSG:21417</SRS>
+      <SRS>EPSG:21418</SRS>
+      <SRS>EPSG:21419</SRS>
+      <SRS>EPSG:21420</SRS>
+      <SRS>EPSG:21421</SRS>
+      <SRS>EPSG:21422</SRS>
+      <SRS>EPSG:21423</SRS>
+      <SRS>EPSG:21453</SRS>
+      <SRS>EPSG:21454</SRS>
+      <SRS>EPSG:21455</SRS>
+      <SRS>EPSG:21456</SRS>
+      <SRS>EPSG:21457</SRS>
+      <SRS>EPSG:21458</SRS>
+      <SRS>EPSG:21459</SRS>
+      <SRS>EPSG:21460</SRS>
+      <SRS>EPSG:21461</SRS>
+      <SRS>EPSG:21462</SRS>
+      <SRS>EPSG:21463</SRS>
+      <SRS>EPSG:21473</SRS>
+      <SRS>EPSG:21474</SRS>
+      <SRS>EPSG:21475</SRS>
+      <SRS>EPSG:21476</SRS>
+      <SRS>EPSG:21477</SRS>
+      <SRS>EPSG:21478</SRS>
+      <SRS>EPSG:21479</SRS>
+      <SRS>EPSG:21480</SRS>
+      <SRS>EPSG:21481</SRS>
+      <SRS>EPSG:21482</SRS>
+      <SRS>EPSG:21483</SRS>
+      <SRS>EPSG:21500</SRS>
+      <SRS>EPSG:21780</SRS>
+      <SRS>EPSG:21781</SRS>
+      <SRS>EPSG:21817</SRS>
+      <SRS>EPSG:21818</SRS>
+      <SRS>EPSG:21891</SRS>
+      <SRS>EPSG:21892</SRS>
+      <SRS>EPSG:21893</SRS>
+      <SRS>EPSG:21894</SRS>
+      <SRS>EPSG:21896</SRS>
+      <SRS>EPSG:21897</SRS>
+      <SRS>EPSG:21898</SRS>
+      <SRS>EPSG:21899</SRS>
+      <SRS>EPSG:22032</SRS>
+      <SRS>EPSG:22033</SRS>
+      <SRS>EPSG:22091</SRS>
+      <SRS>EPSG:22092</SRS>
+      <SRS>EPSG:22171</SRS>
+      <SRS>EPSG:22172</SRS>
+      <SRS>EPSG:22173</SRS>
+      <SRS>EPSG:22174</SRS>
+      <SRS>EPSG:22175</SRS>
+      <SRS>EPSG:22176</SRS>
+      <SRS>EPSG:22177</SRS>
+      <SRS>EPSG:22181</SRS>
+      <SRS>EPSG:22182</SRS>
+      <SRS>EPSG:22183</SRS>
+      <SRS>EPSG:22184</SRS>
+      <SRS>EPSG:22185</SRS>
+      <SRS>EPSG:22186</SRS>
+      <SRS>EPSG:22187</SRS>
+      <SRS>EPSG:22191</SRS>
+      <SRS>EPSG:22192</SRS>
+      <SRS>EPSG:22193</SRS>
+      <SRS>EPSG:22194</SRS>
+      <SRS>EPSG:22195</SRS>
+      <SRS>EPSG:22196</SRS>
+      <SRS>EPSG:22197</SRS>
+      <SRS>EPSG:22234</SRS>
+      <SRS>EPSG:22235</SRS>
+      <SRS>EPSG:22236</SRS>
+      <SRS>EPSG:22275</SRS>
+      <SRS>EPSG:22277</SRS>
+      <SRS>EPSG:22279</SRS>
+      <SRS>EPSG:22281</SRS>
+      <SRS>EPSG:22283</SRS>
+      <SRS>EPSG:22285</SRS>
+      <SRS>EPSG:22287</SRS>
+      <SRS>EPSG:22289</SRS>
+      <SRS>EPSG:22291</SRS>
+      <SRS>EPSG:22293</SRS>
+      <SRS>EPSG:22300</SRS>
+      <SRS>EPSG:22332</SRS>
+      <SRS>EPSG:22391</SRS>
+      <SRS>EPSG:22392</SRS>
+      <SRS>EPSG:22521</SRS>
+      <SRS>EPSG:22522</SRS>
+      <SRS>EPSG:22523</SRS>
+      <SRS>EPSG:22524</SRS>
+      <SRS>EPSG:22525</SRS>
+      <SRS>EPSG:22700</SRS>
+      <SRS>EPSG:22770</SRS>
+      <SRS>EPSG:22780</SRS>
+      <SRS>EPSG:22832</SRS>
+      <SRS>EPSG:22991</SRS>
+      <SRS>EPSG:22992</SRS>
+      <SRS>EPSG:22993</SRS>
+      <SRS>EPSG:22994</SRS>
+      <SRS>EPSG:23028</SRS>
+      <SRS>EPSG:23029</SRS>
+      <SRS>EPSG:23030</SRS>
+      <SRS>EPSG:23031</SRS>
+      <SRS>EPSG:23032</SRS>
+      <SRS>EPSG:23033</SRS>
+      <SRS>EPSG:23034</SRS>
+      <SRS>EPSG:23035</SRS>
+      <SRS>EPSG:23036</SRS>
+      <SRS>EPSG:23037</SRS>
+      <SRS>EPSG:23038</SRS>
+      <SRS>EPSG:23090</SRS>
+      <SRS>EPSG:23095</SRS>
+      <SRS>EPSG:23239</SRS>
+      <SRS>EPSG:23240</SRS>
+      <SRS>EPSG:23433</SRS>
+      <SRS>EPSG:23700</SRS>
+      <SRS>EPSG:23846</SRS>
+      <SRS>EPSG:23847</SRS>
+      <SRS>EPSG:23848</SRS>
+      <SRS>EPSG:23849</SRS>
+      <SRS>EPSG:23850</SRS>
+      <SRS>EPSG:23851</SRS>
+      <SRS>EPSG:23852</SRS>
+      <SRS>EPSG:23853</SRS>
+      <SRS>EPSG:23866</SRS>
+      <SRS>EPSG:23867</SRS>
+      <SRS>EPSG:23868</SRS>
+      <SRS>EPSG:23869</SRS>
+      <SRS>EPSG:23870</SRS>
+      <SRS>EPSG:23871</SRS>
+      <SRS>EPSG:23872</SRS>
+      <SRS>EPSG:23877</SRS>
+      <SRS>EPSG:23878</SRS>
+      <SRS>EPSG:23879</SRS>
+      <SRS>EPSG:23880</SRS>
+      <SRS>EPSG:23881</SRS>
+      <SRS>EPSG:23882</SRS>
+      <SRS>EPSG:23883</SRS>
+      <SRS>EPSG:23884</SRS>
+      <SRS>EPSG:23886</SRS>
+      <SRS>EPSG:23887</SRS>
+      <SRS>EPSG:23888</SRS>
+      <SRS>EPSG:23889</SRS>
+      <SRS>EPSG:23890</SRS>
+      <SRS>EPSG:23891</SRS>
+      <SRS>EPSG:23892</SRS>
+      <SRS>EPSG:23893</SRS>
+      <SRS>EPSG:23894</SRS>
+      <SRS>EPSG:23946</SRS>
+      <SRS>EPSG:23947</SRS>
+      <SRS>EPSG:23948</SRS>
+      <SRS>EPSG:24047</SRS>
+      <SRS>EPSG:24048</SRS>
+      <SRS>EPSG:24100</SRS>
+      <SRS>EPSG:24200</SRS>
+      <SRS>EPSG:24305</SRS>
+      <SRS>EPSG:24306</SRS>
+      <SRS>EPSG:24311</SRS>
+      <SRS>EPSG:24312</SRS>
+      <SRS>EPSG:24313</SRS>
+      <SRS>EPSG:24342</SRS>
+      <SRS>EPSG:24343</SRS>
+      <SRS>EPSG:24344</SRS>
+      <SRS>EPSG:24345</SRS>
+      <SRS>EPSG:24346</SRS>
+      <SRS>EPSG:24347</SRS>
+      <SRS>EPSG:24370</SRS>
+      <SRS>EPSG:24371</SRS>
+      <SRS>EPSG:24372</SRS>
+      <SRS>EPSG:24373</SRS>
+      <SRS>EPSG:24374</SRS>
+      <SRS>EPSG:24375</SRS>
+      <SRS>EPSG:24376</SRS>
+      <SRS>EPSG:24377</SRS>
+      <SRS>EPSG:24378</SRS>
+      <SRS>EPSG:24379</SRS>
+      <SRS>EPSG:24380</SRS>
+      <SRS>EPSG:24381</SRS>
+      <SRS>EPSG:24382</SRS>
+      <SRS>EPSG:24383</SRS>
+      <SRS>EPSG:24500</SRS>
+      <SRS>EPSG:24547</SRS>
+      <SRS>EPSG:24548</SRS>
+      <SRS>EPSG:24571</SRS>
+      <SRS>EPSG:24600</SRS>
+      <SRS>EPSG:24718</SRS>
+      <SRS>EPSG:24719</SRS>
+      <SRS>EPSG:24720</SRS>
+      <SRS>EPSG:24817</SRS>
+      <SRS>EPSG:24818</SRS>
+      <SRS>EPSG:24819</SRS>
+      <SRS>EPSG:24820</SRS>
+      <SRS>EPSG:24821</SRS>
+      <SRS>EPSG:24877</SRS>
+      <SRS>EPSG:24878</SRS>
+      <SRS>EPSG:24879</SRS>
+      <SRS>EPSG:24880</SRS>
+      <SRS>EPSG:24881</SRS>
+      <SRS>EPSG:24882</SRS>
+      <SRS>EPSG:24891</SRS>
+      <SRS>EPSG:24892</SRS>
+      <SRS>EPSG:24893</SRS>
+      <SRS>EPSG:25000</SRS>
+      <SRS>EPSG:25231</SRS>
+      <SRS>EPSG:25391</SRS>
+      <SRS>EPSG:25392</SRS>
+      <SRS>EPSG:25393</SRS>
+      <SRS>EPSG:25394</SRS>
+      <SRS>EPSG:25395</SRS>
+      <SRS>EPSG:25700</SRS>
+      <SRS>EPSG:25828</SRS>
+      <SRS>EPSG:25829</SRS>
+      <SRS>EPSG:25830</SRS>
+      <SRS>EPSG:25831</SRS>
+      <SRS>EPSG:25832</SRS>
+      <SRS>EPSG:25833</SRS>
+      <SRS>EPSG:25834</SRS>
+      <SRS>EPSG:25835</SRS>
+      <SRS>EPSG:25836</SRS>
+      <SRS>EPSG:25837</SRS>
+      <SRS>EPSG:25838</SRS>
+      <SRS>EPSG:25884</SRS>
+      <SRS>EPSG:25932</SRS>
+      <SRS>EPSG:26191</SRS>
+      <SRS>EPSG:26192</SRS>
+      <SRS>EPSG:26193</SRS>
+      <SRS>EPSG:26194</SRS>
+      <SRS>EPSG:26195</SRS>
+      <SRS>EPSG:26237</SRS>
+      <SRS>EPSG:26331</SRS>
+      <SRS>EPSG:26332</SRS>
+      <SRS>EPSG:26391</SRS>
+      <SRS>EPSG:26392</SRS>
+      <SRS>EPSG:26393</SRS>
+      <SRS>EPSG:26432</SRS>
+      <SRS>EPSG:26591</SRS>
+      <SRS>EPSG:26592</SRS>
+      <SRS>EPSG:26632</SRS>
+      <SRS>EPSG:26692</SRS>
+      <SRS>EPSG:26701</SRS>
+      <SRS>EPSG:26702</SRS>
+      <SRS>EPSG:26703</SRS>
+      <SRS>EPSG:26704</SRS>
+      <SRS>EPSG:26705</SRS>
+      <SRS>EPSG:26706</SRS>
+      <SRS>EPSG:26707</SRS>
+      <SRS>EPSG:26708</SRS>
+      <SRS>EPSG:26709</SRS>
+      <SRS>EPSG:26710</SRS>
+      <SRS>EPSG:26711</SRS>
+      <SRS>EPSG:26712</SRS>
+      <SRS>EPSG:26713</SRS>
+      <SRS>EPSG:26714</SRS>
+      <SRS>EPSG:26715</SRS>
+      <SRS>EPSG:26716</SRS>
+      <SRS>EPSG:26717</SRS>
+      <SRS>EPSG:26718</SRS>
+      <SRS>EPSG:26719</SRS>
+      <SRS>EPSG:26720</SRS>
+      <SRS>EPSG:26721</SRS>
+      <SRS>EPSG:26722</SRS>
+      <SRS>EPSG:26729</SRS>
+      <SRS>EPSG:26730</SRS>
+      <SRS>EPSG:26731</SRS>
+      <SRS>EPSG:26732</SRS>
+      <SRS>EPSG:26733</SRS>
+      <SRS>EPSG:26734</SRS>
+      <SRS>EPSG:26735</SRS>
+      <SRS>EPSG:26736</SRS>
+      <SRS>EPSG:26737</SRS>
+      <SRS>EPSG:26738</SRS>
+      <SRS>EPSG:26739</SRS>
+      <SRS>EPSG:26740</SRS>
+      <SRS>EPSG:26741</SRS>
+      <SRS>EPSG:26742</SRS>
+      <SRS>EPSG:26743</SRS>
+      <SRS>EPSG:26744</SRS>
+      <SRS>EPSG:26745</SRS>
+      <SRS>EPSG:26746</SRS>
+      <SRS>EPSG:26747</SRS>
+      <SRS>EPSG:26748</SRS>
+      <SRS>EPSG:26749</SRS>
+      <SRS>EPSG:26750</SRS>
+      <SRS>EPSG:26751</SRS>
+      <SRS>EPSG:26752</SRS>
+      <SRS>EPSG:26753</SRS>
+      <SRS>EPSG:26754</SRS>
+      <SRS>EPSG:26755</SRS>
+      <SRS>EPSG:26756</SRS>
+      <SRS>EPSG:26757</SRS>
+      <SRS>EPSG:26758</SRS>
+      <SRS>EPSG:26759</SRS>
+      <SRS>EPSG:26760</SRS>
+      <SRS>EPSG:26766</SRS>
+      <SRS>EPSG:26767</SRS>
+      <SRS>EPSG:26768</SRS>
+      <SRS>EPSG:26769</SRS>
+      <SRS>EPSG:26770</SRS>
+      <SRS>EPSG:26771</SRS>
+      <SRS>EPSG:26772</SRS>
+      <SRS>EPSG:26773</SRS>
+      <SRS>EPSG:26774</SRS>
+      <SRS>EPSG:26775</SRS>
+      <SRS>EPSG:26776</SRS>
+      <SRS>EPSG:26777</SRS>
+      <SRS>EPSG:26778</SRS>
+      <SRS>EPSG:26779</SRS>
+      <SRS>EPSG:26780</SRS>
+      <SRS>EPSG:26781</SRS>
+      <SRS>EPSG:26782</SRS>
+      <SRS>EPSG:26783</SRS>
+      <SRS>EPSG:26784</SRS>
+      <SRS>EPSG:26785</SRS>
+      <SRS>EPSG:26786</SRS>
+      <SRS>EPSG:26787</SRS>
+      <SRS>EPSG:26791</SRS>
+      <SRS>EPSG:26792</SRS>
+      <SRS>EPSG:26793</SRS>
+      <SRS>EPSG:26794</SRS>
+      <SRS>EPSG:26795</SRS>
+      <SRS>EPSG:26796</SRS>
+      <SRS>EPSG:26797</SRS>
+      <SRS>EPSG:26798</SRS>
+      <SRS>EPSG:26799</SRS>
+      <SRS>EPSG:26801</SRS>
+      <SRS>EPSG:26802</SRS>
+      <SRS>EPSG:26803</SRS>
+      <SRS>EPSG:26811</SRS>
+      <SRS>EPSG:26812</SRS>
+      <SRS>EPSG:26813</SRS>
+      <SRS>EPSG:26901</SRS>
+      <SRS>EPSG:26902</SRS>
+      <SRS>EPSG:26903</SRS>
+      <SRS>EPSG:26904</SRS>
+      <SRS>EPSG:26905</SRS>
+      <SRS>EPSG:26906</SRS>
+      <SRS>EPSG:26907</SRS>
+      <SRS>EPSG:26908</SRS>
+      <SRS>EPSG:26909</SRS>
+      <SRS>EPSG:26910</SRS>
+      <SRS>EPSG:26911</SRS>
+      <SRS>EPSG:26912</SRS>
+      <SRS>EPSG:26913</SRS>
+      <SRS>EPSG:26914</SRS>
+      <SRS>EPSG:26915</SRS>
+      <SRS>EPSG:26916</SRS>
+      <SRS>EPSG:26917</SRS>
+      <SRS>EPSG:26918</SRS>
+      <SRS>EPSG:26919</SRS>
+      <SRS>EPSG:26920</SRS>
+      <SRS>EPSG:26921</SRS>
+      <SRS>EPSG:26922</SRS>
+      <SRS>EPSG:26923</SRS>
+      <SRS>EPSG:26929</SRS>
+      <SRS>EPSG:26930</SRS>
+      <SRS>EPSG:26931</SRS>
+      <SRS>EPSG:26932</SRS>
+      <SRS>EPSG:26933</SRS>
+      <SRS>EPSG:26934</SRS>
+      <SRS>EPSG:26935</SRS>
+      <SRS>EPSG:26936</SRS>
+      <SRS>EPSG:26937</SRS>
+      <SRS>EPSG:26938</SRS>
+      <SRS>EPSG:26939</SRS>
+      <SRS>EPSG:26940</SRS>
+      <SRS>EPSG:26941</SRS>
+      <SRS>EPSG:26942</SRS>
+      <SRS>EPSG:26943</SRS>
+      <SRS>EPSG:26944</SRS>
+      <SRS>EPSG:26945</SRS>
+      <SRS>EPSG:26946</SRS>
+      <SRS>EPSG:26948</SRS>
+      <SRS>EPSG:26949</SRS>
+      <SRS>EPSG:26950</SRS>
+      <SRS>EPSG:26951</SRS>
+      <SRS>EPSG:26952</SRS>
+      <SRS>EPSG:26953</SRS>
+      <SRS>EPSG:26954</SRS>
+      <SRS>EPSG:26955</SRS>
+      <SRS>EPSG:26956</SRS>
+      <SRS>EPSG:26957</SRS>
+      <SRS>EPSG:26958</SRS>
+      <SRS>EPSG:26959</SRS>
+      <SRS>EPSG:26960</SRS>
+      <SRS>EPSG:26961</SRS>
+      <SRS>EPSG:26962</SRS>
+      <SRS>EPSG:26963</SRS>
+      <SRS>EPSG:26964</SRS>
+      <SRS>EPSG:26965</SRS>
+      <SRS>EPSG:26966</SRS>
+      <SRS>EPSG:26967</SRS>
+      <SRS>EPSG:26968</SRS>
+      <SRS>EPSG:26969</SRS>
+      <SRS>EPSG:26970</SRS>
+      <SRS>EPSG:26971</SRS>
+      <SRS>EPSG:26972</SRS>
+      <SRS>EPSG:26973</SRS>
+      <SRS>EPSG:26974</SRS>
+      <SRS>EPSG:26975</SRS>
+      <SRS>EPSG:26976</SRS>
+      <SRS>EPSG:26977</SRS>
+      <SRS>EPSG:26978</SRS>
+      <SRS>EPSG:26979</SRS>
+      <SRS>EPSG:26980</SRS>
+      <SRS>EPSG:26981</SRS>
+      <SRS>EPSG:26982</SRS>
+      <SRS>EPSG:26983</SRS>
+      <SRS>EPSG:26984</SRS>
+      <SRS>EPSG:26985</SRS>
+      <SRS>EPSG:26986</SRS>
+      <SRS>EPSG:26987</SRS>
+      <SRS>EPSG:26988</SRS>
+      <SRS>EPSG:26989</SRS>
+      <SRS>EPSG:26990</SRS>
+      <SRS>EPSG:26991</SRS>
+      <SRS>EPSG:26992</SRS>
+      <SRS>EPSG:26993</SRS>
+      <SRS>EPSG:26994</SRS>
+      <SRS>EPSG:26995</SRS>
+      <SRS>EPSG:26996</SRS>
+      <SRS>EPSG:26997</SRS>
+      <SRS>EPSG:26998</SRS>
+      <SRS>EPSG:27037</SRS>
+      <SRS>EPSG:27038</SRS>
+      <SRS>EPSG:27039</SRS>
+      <SRS>EPSG:27040</SRS>
+      <SRS>EPSG:27120</SRS>
+      <SRS>EPSG:27200</SRS>
+      <SRS>EPSG:27205</SRS>
+      <SRS>EPSG:27206</SRS>
+      <SRS>EPSG:27207</SRS>
+      <SRS>EPSG:27208</SRS>
+      <SRS>EPSG:27209</SRS>
+      <SRS>EPSG:27210</SRS>
+      <SRS>EPSG:27211</SRS>
+      <SRS>EPSG:27212</SRS>
+      <SRS>EPSG:27213</SRS>
+      <SRS>EPSG:27214</SRS>
+      <SRS>EPSG:27215</SRS>
+      <SRS>EPSG:27216</SRS>
+      <SRS>EPSG:27217</SRS>
+      <SRS>EPSG:27218</SRS>
+      <SRS>EPSG:27219</SRS>
+      <SRS>EPSG:27220</SRS>
+      <SRS>EPSG:27221</SRS>
+      <SRS>EPSG:27222</SRS>
+      <SRS>EPSG:27223</SRS>
+      <SRS>EPSG:27224</SRS>
+      <SRS>EPSG:27225</SRS>
+      <SRS>EPSG:27226</SRS>
+      <SRS>EPSG:27227</SRS>
+      <SRS>EPSG:27228</SRS>
+      <SRS>EPSG:27229</SRS>
+      <SRS>EPSG:27230</SRS>
+      <SRS>EPSG:27231</SRS>
+      <SRS>EPSG:27232</SRS>
+      <SRS>EPSG:27258</SRS>
+      <SRS>EPSG:27259</SRS>
+      <SRS>EPSG:27260</SRS>
+      <SRS>EPSG:27291</SRS>
+      <SRS>EPSG:27292</SRS>
+      <SRS>EPSG:27391</SRS>
+      <SRS>EPSG:27392</SRS>
+      <SRS>EPSG:27393</SRS>
+      <SRS>EPSG:27394</SRS>
+      <SRS>EPSG:27395</SRS>
+      <SRS>EPSG:27396</SRS>
+      <SRS>EPSG:27397</SRS>
+      <SRS>EPSG:27398</SRS>
+      <SRS>EPSG:27429</SRS>
+      <SRS>EPSG:27492</SRS>
+      <SRS>EPSG:27500</SRS>
+      <SRS>EPSG:27561</SRS>
+      <SRS>EPSG:27562</SRS>
+      <SRS>EPSG:27563</SRS>
+      <SRS>EPSG:27564</SRS>
+      <SRS>EPSG:27571</SRS>
+      <SRS>EPSG:27572</SRS>
+      <SRS>EPSG:27573</SRS>
+      <SRS>EPSG:27574</SRS>
+      <SRS>EPSG:27581</SRS>
+      <SRS>EPSG:27582</SRS>
+      <SRS>EPSG:27583</SRS>
+      <SRS>EPSG:27584</SRS>
+      <SRS>EPSG:27591</SRS>
+      <SRS>EPSG:27592</SRS>
+      <SRS>EPSG:27593</SRS>
+      <SRS>EPSG:27594</SRS>
+      <SRS>EPSG:27700</SRS>
+      <SRS>EPSG:28191</SRS>
+      <SRS>EPSG:28192</SRS>
+      <SRS>EPSG:28193</SRS>
+      <SRS>EPSG:28232</SRS>
+      <SRS>EPSG:28348</SRS>
+      <SRS>EPSG:28349</SRS>
+      <SRS>EPSG:28350</SRS>
+      <SRS>EPSG:28351</SRS>
+      <SRS>EPSG:28352</SRS>
+      <SRS>EPSG:28353</SRS>
+      <SRS>EPSG:28354</SRS>
+      <SRS>EPSG:28355</SRS>
+      <SRS>EPSG:28356</SRS>
+      <SRS>EPSG:28357</SRS>
+      <SRS>EPSG:28358</SRS>
+      <SRS>EPSG:28402</SRS>
+      <SRS>EPSG:28403</SRS>
+      <SRS>EPSG:28404</SRS>
+      <SRS>EPSG:28405</SRS>
+      <SRS>EPSG:28406</SRS>
+      <SRS>EPSG:28407</SRS>
+      <SRS>EPSG:28408</SRS>
+      <SRS>EPSG:28409</SRS>
+      <SRS>EPSG:28410</SRS>
+      <SRS>EPSG:28411</SRS>
+      <SRS>EPSG:28412</SRS>
+      <SRS>EPSG:28413</SRS>
+      <SRS>EPSG:28414</SRS>
+      <SRS>EPSG:28415</SRS>
+      <SRS>EPSG:28416</SRS>
+      <SRS>EPSG:28417</SRS>
+      <SRS>EPSG:28418</SRS>
+      <SRS>EPSG:28419</SRS>
+      <SRS>EPSG:28420</SRS>
+      <SRS>EPSG:28421</SRS>
+      <SRS>EPSG:28422</SRS>
+      <SRS>EPSG:28423</SRS>
+      <SRS>EPSG:28424</SRS>
+      <SRS>EPSG:28425</SRS>
+      <SRS>EPSG:28426</SRS>
+      <SRS>EPSG:28427</SRS>
+      <SRS>EPSG:28428</SRS>
+      <SRS>EPSG:28429</SRS>
+      <SRS>EPSG:28430</SRS>
+      <SRS>EPSG:28431</SRS>
+      <SRS>EPSG:28432</SRS>
+      <SRS>EPSG:28462</SRS>
+      <SRS>EPSG:28463</SRS>
+      <SRS>EPSG:28464</SRS>
+      <SRS>EPSG:28465</SRS>
+      <SRS>EPSG:28466</SRS>
+      <SRS>EPSG:28467</SRS>
+      <SRS>EPSG:28468</SRS>
+      <SRS>EPSG:28469</SRS>
+      <SRS>EPSG:28470</SRS>
+      <SRS>EPSG:28471</SRS>
+      <SRS>EPSG:28472</SRS>
+      <SRS>EPSG:28473</SRS>
+      <SRS>EPSG:28474</SRS>
+      <SRS>EPSG:28475</SRS>
+      <SRS>EPSG:28476</SRS>
+      <SRS>EPSG:28477</SRS>
+      <SRS>EPSG:28478</SRS>
+      <SRS>EPSG:28479</SRS>
+      <SRS>EPSG:28480</SRS>
+      <SRS>EPSG:28481</SRS>
+      <SRS>EPSG:28482</SRS>
+      <SRS>EPSG:28483</SRS>
+      <SRS>EPSG:28484</SRS>
+      <SRS>EPSG:28485</SRS>
+      <SRS>EPSG:28486</SRS>
+      <SRS>EPSG:28487</SRS>
+      <SRS>EPSG:28488</SRS>
+      <SRS>EPSG:28489</SRS>
+      <SRS>EPSG:28490</SRS>
+      <SRS>EPSG:28491</SRS>
+      <SRS>EPSG:28492</SRS>
+      <SRS>EPSG:28600</SRS>
+      <SRS>EPSG:28991</SRS>
+      <SRS>EPSG:28992</SRS>
+      <SRS>EPSG:29100</SRS>
+      <SRS>EPSG:29101</SRS>
+      <SRS>EPSG:29118</SRS>
+      <SRS>EPSG:29119</SRS>
+      <SRS>EPSG:29120</SRS>
+      <SRS>EPSG:29121</SRS>
+      <SRS>EPSG:29122</SRS>
+      <SRS>EPSG:29168</SRS>
+      <SRS>EPSG:29169</SRS>
+      <SRS>EPSG:29170</SRS>
+      <SRS>EPSG:29171</SRS>
+      <SRS>EPSG:29172</SRS>
+      <SRS>EPSG:29177</SRS>
+      <SRS>EPSG:29178</SRS>
+      <SRS>EPSG:29179</SRS>
+      <SRS>EPSG:29180</SRS>
+      <SRS>EPSG:29181</SRS>
+      <SRS>EPSG:29182</SRS>
+      <SRS>EPSG:29183</SRS>
+      <SRS>EPSG:29184</SRS>
+      <SRS>EPSG:29185</SRS>
+      <SRS>EPSG:29187</SRS>
+      <SRS>EPSG:29188</SRS>
+      <SRS>EPSG:29189</SRS>
+      <SRS>EPSG:29190</SRS>
+      <SRS>EPSG:29191</SRS>
+      <SRS>EPSG:29192</SRS>
+      <SRS>EPSG:29193</SRS>
+      <SRS>EPSG:29194</SRS>
+      <SRS>EPSG:29195</SRS>
+      <SRS>EPSG:29220</SRS>
+      <SRS>EPSG:29221</SRS>
+      <SRS>EPSG:29333</SRS>
+      <SRS>EPSG:29371</SRS>
+      <SRS>EPSG:29373</SRS>
+      <SRS>EPSG:29375</SRS>
+      <SRS>EPSG:29377</SRS>
+      <SRS>EPSG:29379</SRS>
+      <SRS>EPSG:29381</SRS>
+      <SRS>EPSG:29383</SRS>
+      <SRS>EPSG:29385</SRS>
+      <SRS>EPSG:29635</SRS>
+      <SRS>EPSG:29636</SRS>
+      <SRS>EPSG:29700</SRS>
+      <SRS>EPSG:29701</SRS>
+      <SRS>EPSG:29702</SRS>
+      <SRS>EPSG:29738</SRS>
+      <SRS>EPSG:29739</SRS>
+      <SRS>EPSG:29849</SRS>
+      <SRS>EPSG:29850</SRS>
+      <SRS>EPSG:29871</SRS>
+      <SRS>EPSG:29872</SRS>
+      <SRS>EPSG:29873</SRS>
+      <SRS>EPSG:29900</SRS>
+      <SRS>EPSG:29901</SRS>
+      <SRS>EPSG:29902</SRS>
+      <SRS>EPSG:29903</SRS>
+      <SRS>EPSG:30161</SRS>
+      <SRS>EPSG:30162</SRS>
+      <SRS>EPSG:30163</SRS>
+      <SRS>EPSG:30164</SRS>
+      <SRS>EPSG:30165</SRS>
+      <SRS>EPSG:30166</SRS>
+      <SRS>EPSG:30167</SRS>
+      <SRS>EPSG:30168</SRS>
+      <SRS>EPSG:30169</SRS>
+      <SRS>EPSG:30170</SRS>
+      <SRS>EPSG:30171</SRS>
+      <SRS>EPSG:30172</SRS>
+      <SRS>EPSG:30173</SRS>
+      <SRS>EPSG:30174</SRS>
+      <SRS>EPSG:30175</SRS>
+      <SRS>EPSG:30176</SRS>
+      <SRS>EPSG:30177</SRS>
+      <SRS>EPSG:30178</SRS>
+      <SRS>EPSG:30179</SRS>
+      <SRS>EPSG:30200</SRS>
+      <SRS>EPSG:30339</SRS>
+      <SRS>EPSG:30340</SRS>
+      <SRS>EPSG:30491</SRS>
+      <SRS>EPSG:30492</SRS>
+      <SRS>EPSG:30493</SRS>
+      <SRS>EPSG:30494</SRS>
+      <SRS>EPSG:30729</SRS>
+      <SRS>EPSG:30730</SRS>
+      <SRS>EPSG:30731</SRS>
+      <SRS>EPSG:30732</SRS>
+      <SRS>EPSG:30791</SRS>
+      <SRS>EPSG:30792</SRS>
+      <SRS>EPSG:30800</SRS>
+      <SRS>EPSG:31028</SRS>
+      <SRS>EPSG:31121</SRS>
+      <SRS>EPSG:31154</SRS>
+      <SRS>EPSG:31170</SRS>
+      <SRS>EPSG:31171</SRS>
+      <SRS>EPSG:31251</SRS>
+      <SRS>EPSG:31252</SRS>
+      <SRS>EPSG:31253</SRS>
+      <SRS>EPSG:31254</SRS>
+      <SRS>EPSG:31255</SRS>
+      <SRS>EPSG:31256</SRS>
+      <SRS>EPSG:31257</SRS>
+      <SRS>EPSG:31258</SRS>
+      <SRS>EPSG:31259</SRS>
+      <SRS>EPSG:31265</SRS>
+      <SRS>EPSG:31266</SRS>
+      <SRS>EPSG:31267</SRS>
+      <SRS>EPSG:31268</SRS>
+      <SRS>EPSG:31275</SRS>
+      <SRS>EPSG:31276</SRS>
+      <SRS>EPSG:31277</SRS>
+      <SRS>EPSG:31278</SRS>
+      <SRS>EPSG:31279</SRS>
+      <SRS>EPSG:31281</SRS>
+      <SRS>EPSG:31282</SRS>
+      <SRS>EPSG:31283</SRS>
+      <SRS>EPSG:31284</SRS>
+      <SRS>EPSG:31285</SRS>
+      <SRS>EPSG:31286</SRS>
+      <SRS>EPSG:31287</SRS>
+      <SRS>EPSG:31288</SRS>
+      <SRS>EPSG:31289</SRS>
+      <SRS>EPSG:31290</SRS>
+      <SRS>EPSG:31291</SRS>
+      <SRS>EPSG:31292</SRS>
+      <SRS>EPSG:31293</SRS>
+      <SRS>EPSG:31294</SRS>
+      <SRS>EPSG:31295</SRS>
+      <SRS>EPSG:31296</SRS>
+      <SRS>EPSG:31297</SRS>
+      <SRS>EPSG:31300</SRS>
+      <SRS>EPSG:31370</SRS>
+      <SRS>EPSG:31461</SRS>
+      <SRS>EPSG:31462</SRS>
+      <SRS>EPSG:31463</SRS>
+      <SRS>EPSG:31464</SRS>
+      <SRS>EPSG:31465</SRS>
+      <SRS>EPSG:31466</SRS>
+      <SRS>EPSG:31467</SRS>
+      <SRS>EPSG:31468</SRS>
+      <SRS>EPSG:31469</SRS>
+      <SRS>EPSG:31528</SRS>
+      <SRS>EPSG:31529</SRS>
+      <SRS>EPSG:31600</SRS>
+      <SRS>EPSG:31700</SRS>
+      <SRS>EPSG:31838</SRS>
+      <SRS>EPSG:31839</SRS>
+      <SRS>EPSG:31900</SRS>
+      <SRS>EPSG:31901</SRS>
+      <SRS>EPSG:31965</SRS>
+      <SRS>EPSG:31966</SRS>
+      <SRS>EPSG:31967</SRS>
+      <SRS>EPSG:31968</SRS>
+      <SRS>EPSG:31969</SRS>
+      <SRS>EPSG:31970</SRS>
+      <SRS>EPSG:31971</SRS>
+      <SRS>EPSG:31972</SRS>
+      <SRS>EPSG:31973</SRS>
+      <SRS>EPSG:31974</SRS>
+      <SRS>EPSG:31975</SRS>
+      <SRS>EPSG:31976</SRS>
+      <SRS>EPSG:31977</SRS>
+      <SRS>EPSG:31978</SRS>
+      <SRS>EPSG:31979</SRS>
+      <SRS>EPSG:31980</SRS>
+      <SRS>EPSG:31981</SRS>
+      <SRS>EPSG:31982</SRS>
+      <SRS>EPSG:31983</SRS>
+      <SRS>EPSG:31984</SRS>
+      <SRS>EPSG:31985</SRS>
+      <SRS>EPSG:31986</SRS>
+      <SRS>EPSG:31987</SRS>
+      <SRS>EPSG:31988</SRS>
+      <SRS>EPSG:31989</SRS>
+      <SRS>EPSG:31990</SRS>
+      <SRS>EPSG:31991</SRS>
+      <SRS>EPSG:31992</SRS>
+      <SRS>EPSG:31993</SRS>
+      <SRS>EPSG:31994</SRS>
+      <SRS>EPSG:31995</SRS>
+      <SRS>EPSG:31996</SRS>
+      <SRS>EPSG:31997</SRS>
+      <SRS>EPSG:31998</SRS>
+      <SRS>EPSG:31999</SRS>
+      <SRS>EPSG:32000</SRS>
+      <SRS>EPSG:32001</SRS>
+      <SRS>EPSG:32002</SRS>
+      <SRS>EPSG:32003</SRS>
+      <SRS>EPSG:32005</SRS>
+      <SRS>EPSG:32006</SRS>
+      <SRS>EPSG:32007</SRS>
+      <SRS>EPSG:32008</SRS>
+      <SRS>EPSG:32009</SRS>
+      <SRS>EPSG:32010</SRS>
+      <SRS>EPSG:32011</SRS>
+      <SRS>EPSG:32012</SRS>
+      <SRS>EPSG:32013</SRS>
+      <SRS>EPSG:32014</SRS>
+      <SRS>EPSG:32015</SRS>
+      <SRS>EPSG:32016</SRS>
+      <SRS>EPSG:32017</SRS>
+      <SRS>EPSG:32018</SRS>
+      <SRS>EPSG:32019</SRS>
+      <SRS>EPSG:32020</SRS>
+      <SRS>EPSG:32021</SRS>
+      <SRS>EPSG:32022</SRS>
+      <SRS>EPSG:32023</SRS>
+      <SRS>EPSG:32024</SRS>
+      <SRS>EPSG:32025</SRS>
+      <SRS>EPSG:32026</SRS>
+      <SRS>EPSG:32027</SRS>
+      <SRS>EPSG:32028</SRS>
+      <SRS>EPSG:32029</SRS>
+      <SRS>EPSG:32030</SRS>
+      <SRS>EPSG:32031</SRS>
+      <SRS>EPSG:32033</SRS>
+      <SRS>EPSG:32034</SRS>
+      <SRS>EPSG:32035</SRS>
+      <SRS>EPSG:32036</SRS>
+      <SRS>EPSG:32037</SRS>
+      <SRS>EPSG:32038</SRS>
+      <SRS>EPSG:32039</SRS>
+      <SRS>EPSG:32040</SRS>
+      <SRS>EPSG:32041</SRS>
+      <SRS>EPSG:32042</SRS>
+      <SRS>EPSG:32043</SRS>
+      <SRS>EPSG:32044</SRS>
+      <SRS>EPSG:32045</SRS>
+      <SRS>EPSG:32046</SRS>
+      <SRS>EPSG:32047</SRS>
+      <SRS>EPSG:32048</SRS>
+      <SRS>EPSG:32049</SRS>
+      <SRS>EPSG:32050</SRS>
+      <SRS>EPSG:32051</SRS>
+      <SRS>EPSG:32052</SRS>
+      <SRS>EPSG:32053</SRS>
+      <SRS>EPSG:32054</SRS>
+      <SRS>EPSG:32055</SRS>
+      <SRS>EPSG:32056</SRS>
+      <SRS>EPSG:32057</SRS>
+      <SRS>EPSG:32058</SRS>
+      <SRS>EPSG:32061</SRS>
+      <SRS>EPSG:32062</SRS>
+      <SRS>EPSG:32064</SRS>
+      <SRS>EPSG:32065</SRS>
+      <SRS>EPSG:32066</SRS>
+      <SRS>EPSG:32067</SRS>
+      <SRS>EPSG:32074</SRS>
+      <SRS>EPSG:32075</SRS>
+      <SRS>EPSG:32076</SRS>
+      <SRS>EPSG:32077</SRS>
+      <SRS>EPSG:32081</SRS>
+      <SRS>EPSG:32082</SRS>
+      <SRS>EPSG:32083</SRS>
+      <SRS>EPSG:32084</SRS>
+      <SRS>EPSG:32085</SRS>
+      <SRS>EPSG:32086</SRS>
+      <SRS>EPSG:32098</SRS>
+      <SRS>EPSG:32099</SRS>
+      <SRS>EPSG:32100</SRS>
+      <SRS>EPSG:32104</SRS>
+      <SRS>EPSG:32107</SRS>
+      <SRS>EPSG:32108</SRS>
+      <SRS>EPSG:32109</SRS>
+      <SRS>EPSG:32110</SRS>
+      <SRS>EPSG:32111</SRS>
+      <SRS>EPSG:32112</SRS>
+      <SRS>EPSG:32113</SRS>
+      <SRS>EPSG:32114</SRS>
+      <SRS>EPSG:32115</SRS>
+      <SRS>EPSG:32116</SRS>
+      <SRS>EPSG:32117</SRS>
+      <SRS>EPSG:32118</SRS>
+      <SRS>EPSG:32119</SRS>
+      <SRS>EPSG:32120</SRS>
+      <SRS>EPSG:32121</SRS>
+      <SRS>EPSG:32122</SRS>
+      <SRS>EPSG:32123</SRS>
+      <SRS>EPSG:32124</SRS>
+      <SRS>EPSG:32125</SRS>
+      <SRS>EPSG:32126</SRS>
+      <SRS>EPSG:32127</SRS>
+      <SRS>EPSG:32128</SRS>
+      <SRS>EPSG:32129</SRS>
+      <SRS>EPSG:32130</SRS>
+      <SRS>EPSG:32133</SRS>
+      <SRS>EPSG:32134</SRS>
+      <SRS>EPSG:32135</SRS>
+      <SRS>EPSG:32136</SRS>
+      <SRS>EPSG:32137</SRS>
+      <SRS>EPSG:32138</SRS>
+      <SRS>EPSG:32139</SRS>
+      <SRS>EPSG:32140</SRS>
+      <SRS>EPSG:32141</SRS>
+      <SRS>EPSG:32142</SRS>
+      <SRS>EPSG:32143</SRS>
+      <SRS>EPSG:32144</SRS>
+      <SRS>EPSG:32145</SRS>
+      <SRS>EPSG:32146</SRS>
+      <SRS>EPSG:32147</SRS>
+      <SRS>EPSG:32148</SRS>
+      <SRS>EPSG:32149</SRS>
+      <SRS>EPSG:32150</SRS>
+      <SRS>EPSG:32151</SRS>
+      <SRS>EPSG:32152</SRS>
+      <SRS>EPSG:32153</SRS>
+      <SRS>EPSG:32154</SRS>
+      <SRS>EPSG:32155</SRS>
+      <SRS>EPSG:32156</SRS>
+      <SRS>EPSG:32157</SRS>
+      <SRS>EPSG:32158</SRS>
+      <SRS>EPSG:32161</SRS>
+      <SRS>EPSG:32164</SRS>
+      <SRS>EPSG:32165</SRS>
+      <SRS>EPSG:32166</SRS>
+      <SRS>EPSG:32167</SRS>
+      <SRS>EPSG:32180</SRS>
+      <SRS>EPSG:32181</SRS>
+      <SRS>EPSG:32182</SRS>
+      <SRS>EPSG:32183</SRS>
+      <SRS>EPSG:32184</SRS>
+      <SRS>EPSG:32185</SRS>
+      <SRS>EPSG:32186</SRS>
+      <SRS>EPSG:32187</SRS>
+      <SRS>EPSG:32188</SRS>
+      <SRS>EPSG:32189</SRS>
+      <SRS>EPSG:32190</SRS>
+      <SRS>EPSG:32191</SRS>
+      <SRS>EPSG:32192</SRS>
+      <SRS>EPSG:32193</SRS>
+      <SRS>EPSG:32194</SRS>
+      <SRS>EPSG:32195</SRS>
+      <SRS>EPSG:32196</SRS>
+      <SRS>EPSG:32197</SRS>
+      <SRS>EPSG:32198</SRS>
+      <SRS>EPSG:32199</SRS>
+      <SRS>EPSG:32201</SRS>
+      <SRS>EPSG:32202</SRS>
+      <SRS>EPSG:32203</SRS>
+      <SRS>EPSG:32204</SRS>
+      <SRS>EPSG:32205</SRS>
+      <SRS>EPSG:32206</SRS>
+      <SRS>EPSG:32207</SRS>
+      <SRS>EPSG:32208</SRS>
+      <SRS>EPSG:32209</SRS>
+      <SRS>EPSG:32210</SRS>
+      <SRS>EPSG:32211</SRS>
+      <SRS>EPSG:32212</SRS>
+      <SRS>EPSG:32213</SRS>
+      <SRS>EPSG:32214</SRS>
+      <SRS>EPSG:32215</SRS>
+      <SRS>EPSG:32216</SRS>
+      <SRS>EPSG:32217</SRS>
+      <SRS>EPSG:32218</SRS>
+      <SRS>EPSG:32219</SRS>
+      <SRS>EPSG:32220</SRS>
+      <SRS>EPSG:32221</SRS>
+      <SRS>EPSG:32222</SRS>
+      <SRS>EPSG:32223</SRS>
+      <SRS>EPSG:32224</SRS>
+      <SRS>EPSG:32225</SRS>
+      <SRS>EPSG:32226</SRS>
+      <SRS>EPSG:32227</SRS>
+      <SRS>EPSG:32228</SRS>
+      <SRS>EPSG:32229</SRS>
+      <SRS>EPSG:32230</SRS>
+      <SRS>EPSG:32231</SRS>
+      <SRS>EPSG:32232</SRS>
+      <SRS>EPSG:32233</SRS>
+      <SRS>EPSG:32234</SRS>
+      <SRS>EPSG:32235</SRS>
+      <SRS>EPSG:32236</SRS>
+      <SRS>EPSG:32237</SRS>
+      <SRS>EPSG:32238</SRS>
+      <SRS>EPSG:32239</SRS>
+      <SRS>EPSG:32240</SRS>
+      <SRS>EPSG:32241</SRS>
+      <SRS>EPSG:32242</SRS>
+      <SRS>EPSG:32243</SRS>
+      <SRS>EPSG:32244</SRS>
+      <SRS>EPSG:32245</SRS>
+      <SRS>EPSG:32246</SRS>
+      <SRS>EPSG:32247</SRS>
+      <SRS>EPSG:32248</SRS>
+      <SRS>EPSG:32249</SRS>
+      <SRS>EPSG:32250</SRS>
+      <SRS>EPSG:32251</SRS>
+      <SRS>EPSG:32252</SRS>
+      <SRS>EPSG:32253</SRS>
+      <SRS>EPSG:32254</SRS>
+      <SRS>EPSG:32255</SRS>
+      <SRS>EPSG:32256</SRS>
+      <SRS>EPSG:32257</SRS>
+      <SRS>EPSG:32258</SRS>
+      <SRS>EPSG:32259</SRS>
+      <SRS>EPSG:32260</SRS>
+      <SRS>EPSG:32301</SRS>
+      <SRS>EPSG:32302</SRS>
+      <SRS>EPSG:32303</SRS>
+      <SRS>EPSG:32304</SRS>
+      <SRS>EPSG:32305</SRS>
+      <SRS>EPSG:32306</SRS>
+      <SRS>EPSG:32307</SRS>
+      <SRS>EPSG:32308</SRS>
+      <SRS>EPSG:32309</SRS>
+      <SRS>EPSG:32310</SRS>
+      <SRS>EPSG:32311</SRS>
+      <SRS>EPSG:32312</SRS>
+      <SRS>EPSG:32313</SRS>
+      <SRS>EPSG:32314</SRS>
+      <SRS>EPSG:32315</SRS>
+      <SRS>EPSG:32316</SRS>
+      <SRS>EPSG:32317</SRS>
+      <SRS>EPSG:32318</SRS>
+      <SRS>EPSG:32319</SRS>
+      <SRS>EPSG:32320</SRS>
+      <SRS>EPSG:32321</SRS>
+      <SRS>EPSG:32322</SRS>
+      <SRS>EPSG:32323</SRS>
+      <SRS>EPSG:32324</SRS>
+      <SRS>EPSG:32325</SRS>
+      <SRS>EPSG:32326</SRS>
+      <SRS>EPSG:32327</SRS>
+      <SRS>EPSG:32328</SRS>
+      <SRS>EPSG:32329</SRS>
+      <SRS>EPSG:32330</SRS>
+      <SRS>EPSG:32331</SRS>
+      <SRS>EPSG:32332</SRS>
+      <SRS>EPSG:32333</SRS>
+      <SRS>EPSG:32334</SRS>
+      <SRS>EPSG:32335</SRS>
+      <SRS>EPSG:32336</SRS>
+      <SRS>EPSG:32337</SRS>
+      <SRS>EPSG:32338</SRS>
+      <SRS>EPSG:32339</SRS>
+      <SRS>EPSG:32340</SRS>
+      <SRS>EPSG:32341</SRS>
+      <SRS>EPSG:32342</SRS>
+      <SRS>EPSG:32343</SRS>
+      <SRS>EPSG:32344</SRS>
+      <SRS>EPSG:32345</SRS>
+      <SRS>EPSG:32346</SRS>
+      <SRS>EPSG:32347</SRS>
+      <SRS>EPSG:32348</SRS>
+      <SRS>EPSG:32349</SRS>
+      <SRS>EPSG:32350</SRS>
+      <SRS>EPSG:32351</SRS>
+      <SRS>EPSG:32352</SRS>
+      <SRS>EPSG:32353</SRS>
+      <SRS>EPSG:32354</SRS>
+      <SRS>EPSG:32355</SRS>
+      <SRS>EPSG:32356</SRS>
+      <SRS>EPSG:32357</SRS>
+      <SRS>EPSG:32358</SRS>
+      <SRS>EPSG:32359</SRS>
+      <SRS>EPSG:32360</SRS>
+      <SRS>EPSG:32401</SRS>
+      <SRS>EPSG:32402</SRS>
+      <SRS>EPSG:32403</SRS>
+      <SRS>EPSG:32404</SRS>
+      <SRS>EPSG:32405</SRS>
+      <SRS>EPSG:32406</SRS>
+      <SRS>EPSG:32407</SRS>
+      <SRS>EPSG:32408</SRS>
+      <SRS>EPSG:32409</SRS>
+      <SRS>EPSG:32410</SRS>
+      <SRS>EPSG:32411</SRS>
+      <SRS>EPSG:32412</SRS>
+      <SRS>EPSG:32413</SRS>
+      <SRS>EPSG:32414</SRS>
+      <SRS>EPSG:32415</SRS>
+      <SRS>EPSG:32416</SRS>
+      <SRS>EPSG:32417</SRS>
+      <SRS>EPSG:32418</SRS>
+      <SRS>EPSG:32419</SRS>
+      <SRS>EPSG:32420</SRS>
+      <SRS>EPSG:32421</SRS>
+      <SRS>EPSG:32422</SRS>
+      <SRS>EPSG:32423</SRS>
+      <SRS>EPSG:32424</SRS>
+      <SRS>EPSG:32425</SRS>
+      <SRS>EPSG:32426</SRS>
+      <SRS>EPSG:32427</SRS>
+      <SRS>EPSG:32428</SRS>
+      <SRS>EPSG:32429</SRS>
+      <SRS>EPSG:32430</SRS>
+      <SRS>EPSG:32431</SRS>
+      <SRS>EPSG:32432</SRS>
+      <SRS>EPSG:32433</SRS>
+      <SRS>EPSG:32434</SRS>
+      <SRS>EPSG:32435</SRS>
+      <SRS>EPSG:32436</SRS>
+      <SRS>EPSG:32437</SRS>
+      <SRS>EPSG:32438</SRS>
+      <SRS>EPSG:32439</SRS>
+      <SRS>EPSG:32440</SRS>
+      <SRS>EPSG:32441</SRS>
+      <SRS>EPSG:32442</SRS>
+      <SRS>EPSG:32443</SRS>
+      <SRS>EPSG:32444</SRS>
+      <SRS>EPSG:32445</SRS>
+      <SRS>EPSG:32446</SRS>
+      <SRS>EPSG:32447</SRS>
+      <SRS>EPSG:32448</SRS>
+      <SRS>EPSG:32449</SRS>
+      <SRS>EPSG:32450</SRS>
+      <SRS>EPSG:32451</SRS>
+      <SRS>EPSG:32452</SRS>
+      <SRS>EPSG:32453</SRS>
+      <SRS>EPSG:32454</SRS>
+      <SRS>EPSG:32455</SRS>
+      <SRS>EPSG:32456</SRS>
+      <SRS>EPSG:32457</SRS>
+      <SRS>EPSG:32458</SRS>
+      <SRS>EPSG:32459</SRS>
+      <SRS>EPSG:32460</SRS>
+      <SRS>EPSG:32501</SRS>
+      <SRS>EPSG:32502</SRS>
+      <SRS>EPSG:32503</SRS>
+      <SRS>EPSG:32504</SRS>
+      <SRS>EPSG:32505</SRS>
+      <SRS>EPSG:32506</SRS>
+      <SRS>EPSG:32507</SRS>
+      <SRS>EPSG:32508</SRS>
+      <SRS>EPSG:32509</SRS>
+      <SRS>EPSG:32510</SRS>
+      <SRS>EPSG:32511</SRS>
+      <SRS>EPSG:32512</SRS>
+      <SRS>EPSG:32513</SRS>
+      <SRS>EPSG:32514</SRS>
+      <SRS>EPSG:32515</SRS>
+      <SRS>EPSG:32516</SRS>
+      <SRS>EPSG:32517</SRS>
+      <SRS>EPSG:32518</SRS>
+      <SRS>EPSG:32519</SRS>
+      <SRS>EPSG:32520</SRS>
+      <SRS>EPSG:32521</SRS>
+      <SRS>EPSG:32522</SRS>
+      <SRS>EPSG:32523</SRS>
+      <SRS>EPSG:32524</SRS>
+      <SRS>EPSG:32525</SRS>
+      <SRS>EPSG:32526</SRS>
+      <SRS>EPSG:32527</SRS>
+      <SRS>EPSG:32528</SRS>
+      <SRS>EPSG:32529</SRS>
+      <SRS>EPSG:32530</SRS>
+      <SRS>EPSG:32531</SRS>
+      <SRS>EPSG:32532</SRS>
+      <SRS>EPSG:32533</SRS>
+      <SRS>EPSG:32534</SRS>
+      <SRS>EPSG:32535</SRS>
+      <SRS>EPSG:32536</SRS>
+      <SRS>EPSG:32537</SRS>
+      <SRS>EPSG:32538</SRS>
+      <SRS>EPSG:32539</SRS>
+      <SRS>EPSG:32540</SRS>
+      <SRS>EPSG:32541</SRS>
+      <SRS>EPSG:32542</SRS>
+      <SRS>EPSG:32543</SRS>
+      <SRS>EPSG:32544</SRS>
+      <SRS>EPSG:32545</SRS>
+      <SRS>EPSG:32546</SRS>
+      <SRS>EPSG:32547</SRS>
+      <SRS>EPSG:32548</SRS>
+      <SRS>EPSG:32549</SRS>
+      <SRS>EPSG:32550</SRS>
+      <SRS>EPSG:32551</SRS>
+      <SRS>EPSG:32552</SRS>
+      <SRS>EPSG:32553</SRS>
+      <SRS>EPSG:32554</SRS>
+      <SRS>EPSG:32555</SRS>
+      <SRS>EPSG:32556</SRS>
+      <SRS>EPSG:32557</SRS>
+      <SRS>EPSG:32558</SRS>
+      <SRS>EPSG:32559</SRS>
+      <SRS>EPSG:32560</SRS>
+      <SRS>EPSG:32600</SRS>
+      <SRS>EPSG:32601</SRS>
+      <SRS>EPSG:32602</SRS>
+      <SRS>EPSG:32603</SRS>
+      <SRS>EPSG:32604</SRS>
+      <SRS>EPSG:32605</SRS>
+      <SRS>EPSG:32606</SRS>
+      <SRS>EPSG:32607</SRS>
+      <SRS>EPSG:32608</SRS>
+      <SRS>EPSG:32609</SRS>
+      <SRS>EPSG:32610</SRS>
+      <SRS>EPSG:32611</SRS>
+      <SRS>EPSG:32612</SRS>
+      <SRS>EPSG:32613</SRS>
+      <SRS>EPSG:32614</SRS>
+      <SRS>EPSG:32615</SRS>
+      <SRS>EPSG:32616</SRS>
+      <SRS>EPSG:32617</SRS>
+      <SRS>EPSG:32618</SRS>
+      <SRS>EPSG:32619</SRS>
+      <SRS>EPSG:32620</SRS>
+      <SRS>EPSG:32621</SRS>
+      <SRS>EPSG:32622</SRS>
+      <SRS>EPSG:32623</SRS>
+      <SRS>EPSG:32624</SRS>
+      <SRS>EPSG:32625</SRS>
+      <SRS>EPSG:32626</SRS>
+      <SRS>EPSG:32627</SRS>
+      <SRS>EPSG:32628</SRS>
+      <SRS>EPSG:32629</SRS>
+      <SRS>EPSG:32630</SRS>
+      <SRS>EPSG:32631</SRS>
+      <SRS>EPSG:32632</SRS>
+      <SRS>EPSG:32633</SRS>
+      <SRS>EPSG:32634</SRS>
+      <SRS>EPSG:32635</SRS>
+      <SRS>EPSG:32636</SRS>
+      <SRS>EPSG:32637</SRS>
+      <SRS>EPSG:32638</SRS>
+      <SRS>EPSG:32639</SRS>
+      <SRS>EPSG:32640</SRS>
+      <SRS>EPSG:32641</SRS>
+      <SRS>EPSG:32642</SRS>
+      <SRS>EPSG:32643</SRS>
+      <SRS>EPSG:32644</SRS>
+      <SRS>EPSG:32645</SRS>
+      <SRS>EPSG:32646</SRS>
+      <SRS>EPSG:32647</SRS>
+      <SRS>EPSG:32648</SRS>
+      <SRS>EPSG:32649</SRS>
+      <SRS>EPSG:32650</SRS>
+      <SRS>EPSG:32651</SRS>
+      <SRS>EPSG:32652</SRS>
+      <SRS>EPSG:32653</SRS>
+      <SRS>EPSG:32654</SRS>
+      <SRS>EPSG:32655</SRS>
+      <SRS>EPSG:32656</SRS>
+      <SRS>EPSG:32657</SRS>
+      <SRS>EPSG:32658</SRS>
+      <SRS>EPSG:32659</SRS>
+      <SRS>EPSG:32660</SRS>
+      <SRS>EPSG:32661</SRS>
+      <SRS>EPSG:32662</SRS>
+      <SRS>EPSG:32664</SRS>
+      <SRS>EPSG:32665</SRS>
+      <SRS>EPSG:32666</SRS>
+      <SRS>EPSG:32667</SRS>
+      <SRS>EPSG:32700</SRS>
+      <SRS>EPSG:32701</SRS>
+      <SRS>EPSG:32702</SRS>
+      <SRS>EPSG:32703</SRS>
+      <SRS>EPSG:32704</SRS>
+      <SRS>EPSG:32705</SRS>
+      <SRS>EPSG:32706</SRS>
+      <SRS>EPSG:32707</SRS>
+      <SRS>EPSG:32708</SRS>
+      <SRS>EPSG:32709</SRS>
+      <SRS>EPSG:32710</SRS>
+      <SRS>EPSG:32711</SRS>
+      <SRS>EPSG:32712</SRS>
+      <SRS>EPSG:32713</SRS>
+      <SRS>EPSG:32714</SRS>
+      <SRS>EPSG:32715</SRS>
+      <SRS>EPSG:32716</SRS>
+      <SRS>EPSG:32717</SRS>
+      <SRS>EPSG:32718</SRS>
+      <SRS>EPSG:32719</SRS>
+      <SRS>EPSG:32720</SRS>
+      <SRS>EPSG:32721</SRS>
+      <SRS>EPSG:32722</SRS>
+      <SRS>EPSG:32723</SRS>
+      <SRS>EPSG:32724</SRS>
+      <SRS>EPSG:32725</SRS>
+      <SRS>EPSG:32726</SRS>
+      <SRS>EPSG:32727</SRS>
+      <SRS>EPSG:32728</SRS>
+      <SRS>EPSG:32729</SRS>
+      <SRS>EPSG:32730</SRS>
+      <SRS>EPSG:32731</SRS>
+      <SRS>EPSG:32732</SRS>
+      <SRS>EPSG:32733</SRS>
+      <SRS>EPSG:32734</SRS>
+      <SRS>EPSG:32735</SRS>
+      <SRS>EPSG:32736</SRS>
+      <SRS>EPSG:32737</SRS>
+      <SRS>EPSG:32738</SRS>
+      <SRS>EPSG:32739</SRS>
+      <SRS>EPSG:32740</SRS>
+      <SRS>EPSG:32741</SRS>
+      <SRS>EPSG:32742</SRS>
+      <SRS>EPSG:32743</SRS>
+      <SRS>EPSG:32744</SRS>
+      <SRS>EPSG:32745</SRS>
+      <SRS>EPSG:32746</SRS>
+      <SRS>EPSG:32747</SRS>
+      <SRS>EPSG:32748</SRS>
+      <SRS>EPSG:32749</SRS>
+      <SRS>EPSG:32750</SRS>
+      <SRS>EPSG:32751</SRS>
+      <SRS>EPSG:32752</SRS>
+      <SRS>EPSG:32753</SRS>
+      <SRS>EPSG:32754</SRS>
+      <SRS>EPSG:32755</SRS>
+      <SRS>EPSG:32756</SRS>
+      <SRS>EPSG:32757</SRS>
+      <SRS>EPSG:32758</SRS>
+      <SRS>EPSG:32759</SRS>
+      <SRS>EPSG:32760</SRS>
+      <SRS>EPSG:32761</SRS>
+      <SRS>EPSG:32766</SRS>
+      <SRS>EPSG:61206405</SRS>
+      <SRS>EPSG:61216405</SRS>
+      <SRS>EPSG:61226405</SRS>
+      <SRS>EPSG:61236405</SRS>
+      <SRS>EPSG:61246405</SRS>
+      <SRS>EPSG:61266405</SRS>
+      <SRS>EPSG:61266413</SRS>
+      <SRS>EPSG:61276405</SRS>
+      <SRS>EPSG:61286405</SRS>
+      <SRS>EPSG:61296405</SRS>
+      <SRS>EPSG:61306405</SRS>
+      <SRS>EPSG:61306413</SRS>
+      <SRS>EPSG:61316405</SRS>
+      <SRS>EPSG:61326405</SRS>
+      <SRS>EPSG:61336405</SRS>
+      <SRS>EPSG:61346405</SRS>
+      <SRS>EPSG:61356405</SRS>
+      <SRS>EPSG:61366405</SRS>
+      <SRS>EPSG:61376405</SRS>
+      <SRS>EPSG:61386405</SRS>
+      <SRS>EPSG:61396405</SRS>
+      <SRS>EPSG:61406405</SRS>
+      <SRS>EPSG:61406413</SRS>
+      <SRS>EPSG:61416405</SRS>
+      <SRS>EPSG:61426405</SRS>
+      <SRS>EPSG:61436405</SRS>
+      <SRS>EPSG:61446405</SRS>
+      <SRS>EPSG:61456405</SRS>
+      <SRS>EPSG:61466405</SRS>
+      <SRS>EPSG:61476405</SRS>
+      <SRS>EPSG:61486405</SRS>
+      <SRS>EPSG:61486413</SRS>
+      <SRS>EPSG:61496405</SRS>
+      <SRS>EPSG:61506405</SRS>
+      <SRS>EPSG:61516405</SRS>
+      <SRS>EPSG:61516413</SRS>
+      <SRS>EPSG:61526405</SRS>
+      <SRS>EPSG:61526413</SRS>
+      <SRS>EPSG:61536405</SRS>
+      <SRS>EPSG:61546405</SRS>
+      <SRS>EPSG:61556405</SRS>
+      <SRS>EPSG:61566405</SRS>
+      <SRS>EPSG:61576405</SRS>
+      <SRS>EPSG:61586405</SRS>
+      <SRS>EPSG:61596405</SRS>
+      <SRS>EPSG:61606405</SRS>
+      <SRS>EPSG:61616405</SRS>
+      <SRS>EPSG:61626405</SRS>
+      <SRS>EPSG:61636405</SRS>
+      <SRS>EPSG:61636413</SRS>
+      <SRS>EPSG:61646405</SRS>
+      <SRS>EPSG:61656405</SRS>
+      <SRS>EPSG:61666405</SRS>
+      <SRS>EPSG:61676405</SRS>
+      <SRS>EPSG:61676413</SRS>
+      <SRS>EPSG:61686405</SRS>
+      <SRS>EPSG:61696405</SRS>
+      <SRS>EPSG:61706405</SRS>
+      <SRS>EPSG:61706413</SRS>
+      <SRS>EPSG:61716405</SRS>
+      <SRS>EPSG:61716413</SRS>
+      <SRS>EPSG:61736405</SRS>
+      <SRS>EPSG:61736413</SRS>
+      <SRS>EPSG:61746405</SRS>
+      <SRS>EPSG:61756405</SRS>
+      <SRS>EPSG:61766405</SRS>
+      <SRS>EPSG:61766413</SRS>
+      <SRS>EPSG:61786405</SRS>
+      <SRS>EPSG:61796405</SRS>
+      <SRS>EPSG:61806405</SRS>
+      <SRS>EPSG:61806413</SRS>
+      <SRS>EPSG:61816405</SRS>
+      <SRS>EPSG:61826405</SRS>
+      <SRS>EPSG:61836405</SRS>
+      <SRS>EPSG:61846405</SRS>
+      <SRS>EPSG:61886405</SRS>
+      <SRS>EPSG:61896405</SRS>
+      <SRS>EPSG:61896413</SRS>
+      <SRS>EPSG:61906405</SRS>
+      <SRS>EPSG:61906413</SRS>
+      <SRS>EPSG:61916405</SRS>
+      <SRS>EPSG:61926405</SRS>
+      <SRS>EPSG:61936405</SRS>
+      <SRS>EPSG:61946405</SRS>
+      <SRS>EPSG:61956405</SRS>
+      <SRS>EPSG:61966405</SRS>
+      <SRS>EPSG:61976405</SRS>
+      <SRS>EPSG:61986405</SRS>
+      <SRS>EPSG:61996405</SRS>
+      <SRS>EPSG:62006405</SRS>
+      <SRS>EPSG:62016405</SRS>
+      <SRS>EPSG:62026405</SRS>
+      <SRS>EPSG:62036405</SRS>
+      <SRS>EPSG:62046405</SRS>
+      <SRS>EPSG:62056405</SRS>
+      <SRS>EPSG:62066405</SRS>
+      <SRS>EPSG:62076405</SRS>
+      <SRS>EPSG:62086405</SRS>
+      <SRS>EPSG:62096405</SRS>
+      <SRS>EPSG:62106405</SRS>
+      <SRS>EPSG:62116405</SRS>
+      <SRS>EPSG:62126405</SRS>
+      <SRS>EPSG:62136405</SRS>
+      <SRS>EPSG:62146405</SRS>
+      <SRS>EPSG:62156405</SRS>
+      <SRS>EPSG:62166405</SRS>
+      <SRS>EPSG:62186405</SRS>
+      <SRS>EPSG:62196405</SRS>
+      <SRS>EPSG:62206405</SRS>
+      <SRS>EPSG:62216405</SRS>
+      <SRS>EPSG:62226405</SRS>
+      <SRS>EPSG:62236405</SRS>
+      <SRS>EPSG:62246405</SRS>
+      <SRS>EPSG:62256405</SRS>
+      <SRS>EPSG:62276405</SRS>
+      <SRS>EPSG:62296405</SRS>
+      <SRS>EPSG:62306405</SRS>
+      <SRS>EPSG:62316405</SRS>
+      <SRS>EPSG:62326405</SRS>
+      <SRS>EPSG:62336405</SRS>
+      <SRS>EPSG:62366405</SRS>
+      <SRS>EPSG:62376405</SRS>
+      <SRS>EPSG:62386405</SRS>
+      <SRS>EPSG:62396405</SRS>
+      <SRS>EPSG:62406405</SRS>
+      <SRS>EPSG:62416405</SRS>
+      <SRS>EPSG:62426405</SRS>
+      <SRS>EPSG:62436405</SRS>
+      <SRS>EPSG:62446405</SRS>
+      <SRS>EPSG:62456405</SRS>
+      <SRS>EPSG:62466405</SRS>
+      <SRS>EPSG:62476405</SRS>
+      <SRS>EPSG:62486405</SRS>
+      <SRS>EPSG:62496405</SRS>
+      <SRS>EPSG:62506405</SRS>
+      <SRS>EPSG:62516405</SRS>
+      <SRS>EPSG:62526405</SRS>
+      <SRS>EPSG:62536405</SRS>
+      <SRS>EPSG:62546405</SRS>
+      <SRS>EPSG:62556405</SRS>
+      <SRS>EPSG:62566405</SRS>
+      <SRS>EPSG:62576405</SRS>
+      <SRS>EPSG:62586405</SRS>
+      <SRS>EPSG:62586413</SRS>
+      <SRS>EPSG:62596405</SRS>
+      <SRS>EPSG:62616405</SRS>
+      <SRS>EPSG:62626405</SRS>
+      <SRS>EPSG:62636405</SRS>
+      <SRS>EPSG:62646405</SRS>
+      <SRS>EPSG:62656405</SRS>
+      <SRS>EPSG:62666405</SRS>
+      <SRS>EPSG:62676405</SRS>
+      <SRS>EPSG:62686405</SRS>
+      <SRS>EPSG:62696405</SRS>
+      <SRS>EPSG:62706405</SRS>
+      <SRS>EPSG:62716405</SRS>
+      <SRS>EPSG:62726405</SRS>
+      <SRS>EPSG:62736405</SRS>
+      <SRS>EPSG:62746405</SRS>
+      <SRS>EPSG:62756405</SRS>
+      <SRS>EPSG:62766405</SRS>
+      <SRS>EPSG:62776405</SRS>
+      <SRS>EPSG:62786405</SRS>
+      <SRS>EPSG:62796405</SRS>
+      <SRS>EPSG:62806405</SRS>
+      <SRS>EPSG:62816405</SRS>
+      <SRS>EPSG:62826405</SRS>
+      <SRS>EPSG:62836405</SRS>
+      <SRS>EPSG:62836413</SRS>
+      <SRS>EPSG:62846405</SRS>
+      <SRS>EPSG:62856405</SRS>
+      <SRS>EPSG:62866405</SRS>
+      <SRS>EPSG:62886405</SRS>
+      <SRS>EPSG:62896405</SRS>
+      <SRS>EPSG:62926405</SRS>
+      <SRS>EPSG:62936405</SRS>
+      <SRS>EPSG:62956405</SRS>
+      <SRS>EPSG:62976405</SRS>
+      <SRS>EPSG:62986405</SRS>
+      <SRS>EPSG:62996405</SRS>
+      <SRS>EPSG:63006405</SRS>
+      <SRS>EPSG:63016405</SRS>
+      <SRS>EPSG:63026405</SRS>
+      <SRS>EPSG:63036405</SRS>
+      <SRS>EPSG:63046405</SRS>
+      <SRS>EPSG:63066405</SRS>
+      <SRS>EPSG:63076405</SRS>
+      <SRS>EPSG:63086405</SRS>
+      <SRS>EPSG:63096405</SRS>
+      <SRS>EPSG:63106405</SRS>
+      <SRS>EPSG:63116405</SRS>
+      <SRS>EPSG:63126405</SRS>
+      <SRS>EPSG:63136405</SRS>
+      <SRS>EPSG:63146405</SRS>
+      <SRS>EPSG:63156405</SRS>
+      <SRS>EPSG:63166405</SRS>
+      <SRS>EPSG:63176405</SRS>
+      <SRS>EPSG:63186405</SRS>
+      <SRS>EPSG:63196405</SRS>
+      <SRS>EPSG:63226405</SRS>
+      <SRS>EPSG:63246405</SRS>
+      <SRS>EPSG:63266405</SRS>
+      <SRS>EPSG:63266406</SRS>
+      <SRS>EPSG:63266407</SRS>
+      <SRS>EPSG:63266408</SRS>
+      <SRS>EPSG:63266409</SRS>
+      <SRS>EPSG:63266410</SRS>
+      <SRS>EPSG:63266411</SRS>
+      <SRS>EPSG:63266412</SRS>
+      <SRS>EPSG:63266413</SRS>
+      <SRS>EPSG:63266414</SRS>
+      <SRS>EPSG:63266415</SRS>
+      <SRS>EPSG:63266416</SRS>
+      <SRS>EPSG:63266417</SRS>
+      <SRS>EPSG:63266418</SRS>
+      <SRS>EPSG:63266419</SRS>
+      <SRS>EPSG:63266420</SRS>
+      <SRS>EPSG:66006405</SRS>
+      <SRS>EPSG:66016405</SRS>
+      <SRS>EPSG:66026405</SRS>
+      <SRS>EPSG:66036405</SRS>
+      <SRS>EPSG:66046405</SRS>
+      <SRS>EPSG:66056405</SRS>
+      <SRS>EPSG:66066405</SRS>
+      <SRS>EPSG:66076405</SRS>
+      <SRS>EPSG:66086405</SRS>
+      <SRS>EPSG:66096405</SRS>
+      <SRS>EPSG:66106405</SRS>
+      <SRS>EPSG:66116405</SRS>
+      <SRS>EPSG:66126405</SRS>
+      <SRS>EPSG:66126413</SRS>
+      <SRS>EPSG:66136405</SRS>
+      <SRS>EPSG:66146405</SRS>
+      <SRS>EPSG:66156405</SRS>
+      <SRS>EPSG:66166405</SRS>
+      <SRS>EPSG:66186405</SRS>
+      <SRS>EPSG:66196405</SRS>
+      <SRS>EPSG:66196413</SRS>
+      <SRS>EPSG:66206405</SRS>
+      <SRS>EPSG:66216405</SRS>
+      <SRS>EPSG:66226405</SRS>
+      <SRS>EPSG:66236405</SRS>
+      <SRS>EPSG:66246405</SRS>
+      <SRS>EPSG:66246413</SRS>
+      <SRS>EPSG:66256405</SRS>
+      <SRS>EPSG:66266405</SRS>
+      <SRS>EPSG:66276405</SRS>
+      <SRS>EPSG:66276413</SRS>
+      <SRS>EPSG:66286405</SRS>
+      <SRS>EPSG:66296405</SRS>
+      <SRS>EPSG:66306405</SRS>
+      <SRS>EPSG:66316405</SRS>
+      <SRS>EPSG:66326405</SRS>
+      <SRS>EPSG:66336405</SRS>
+      <SRS>EPSG:66346405</SRS>
+      <SRS>EPSG:66356405</SRS>
+      <SRS>EPSG:66366405</SRS>
+      <SRS>EPSG:66376405</SRS>
+      <SRS>EPSG:66386405</SRS>
+      <SRS>EPSG:66396405</SRS>
+      <SRS>EPSG:66406405</SRS>
+      <SRS>EPSG:66406413</SRS>
+      <SRS>EPSG:66416405</SRS>
+      <SRS>EPSG:66426405</SRS>
+      <SRS>EPSG:66436405</SRS>
+      <SRS>EPSG:66446405</SRS>
+      <SRS>EPSG:66456405</SRS>
+      <SRS>EPSG:66456413</SRS>
+      <SRS>EPSG:66466405</SRS>
+      <SRS>EPSG:66576405</SRS>
+      <SRS>EPSG:66586405</SRS>
+      <SRS>EPSG:66596405</SRS>
+      <SRS>EPSG:66596413</SRS>
+      <SRS>EPSG:66606405</SRS>
+      <SRS>EPSG:66616405</SRS>
+      <SRS>EPSG:66616413</SRS>
+      <SRS>EPSG:66636405</SRS>
+      <SRS>EPSG:66646405</SRS>
+      <SRS>EPSG:66656405</SRS>
+      <SRS>EPSG:66666405</SRS>
+      <SRS>EPSG:66676405</SRS>
+      <SRS>EPSG:68016405</SRS>
+      <SRS>EPSG:68026405</SRS>
+      <SRS>EPSG:68036405</SRS>
+      <SRS>EPSG:68046405</SRS>
+      <SRS>EPSG:68056405</SRS>
+      <SRS>EPSG:68066405</SRS>
+      <SRS>EPSG:68086405</SRS>
+      <SRS>EPSG:68096405</SRS>
+      <SRS>EPSG:68136405</SRS>
+      <SRS>EPSG:68146405</SRS>
+      <SRS>EPSG:68156405</SRS>
+      <SRS>EPSG:68186405</SRS>
+      <SRS>EPSG:68206405</SRS>
+      <SRS>EPSG:69036405</SRS>
+      <SRS>EPSG:42302</SRS>
+      <SRS>EPSG:42301</SRS>
+      <SRS>EPSG:900913</SRS>
+      <SRS>EPSG:45556</SRS>
+      <SRS>EPSG:45555</SRS>
+      <SRS>EPSG:54004</SRS>
+      <SRS>EPSG:41001</SRS>
+      <SRS>EPSG:42311</SRS>
+      <SRS>EPSG:42310</SRS>
+      <SRS>EPSG:18001</SRS>
+      <SRS>EPSG:100003</SRS>
+      <SRS>EPSG:42106</SRS>
+      <SRS>EPSG:100002</SRS>
+      <SRS>EPSG:42105</SRS>
+      <SRS>EPSG:100001</SRS>
+      <SRS>EPSG:42309</SRS>
+      <SRS>EPSG:42104</SRS>
+      <SRS>EPSG:42308</SRS>
+      <SRS>EPSG:42103</SRS>
+      <SRS>EPSG:42307</SRS>
+      <SRS>EPSG:42102</SRS>
+      <SRS>EPSG:42306</SRS>
+      <SRS>EPSG:42101</SRS>
+      <SRS>EPSG:42305</SRS>
+      <SRS>EPSG:42304</SRS>
+      <SRS>EPSG:42303</SRS>
+      <LatLonBoundingBox minx="-257.0843245637291" miny="-257.0843245637291" maxx="257.0843245637291" maxy="257.0843245637291"/>
+      <Layer queryable="1">
+        <Name>tiger:poly_landmarks</Name>
+        <Title>Manhattan (NY) landmarks</Title>
+        <Abstract>Manhattan landmarks, identifies water, lakes, parks, interesting buildilngs</Abstract>
+        <KeywordList>
+          <Keyword>DS_poly_landmarks</Keyword>
+          <Keyword>poly_landmarks</Keyword>
+          <Keyword>landmarks</Keyword>
+          <Keyword>manhattan</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-74.1008830202198" miny="40.65748247978021" maxx="-73.8541219797802" maxy="40.90424352021979"/>
+        <BoundingBox SRS="EPSG:4326" minx="-74.047185" miny="40.679648" maxx="-73.90782" maxy="40.882078"/>
+        <Style>
+          <Name>poly_landmarks</Name>
+          <Title>Default Styler</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:poly_landmarks"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tiger:poi</Name>
+        <Title>Manhattan (NY) points of interest</Title>
+        <Abstract>Points of interest in New York, New York (on Manhattan). One of the attributes contains the name of a file with a picture of the point of interest.</Abstract>
+        <KeywordList>
+          <Keyword>poi</Keyword>
+          <Keyword>DS_poi</Keyword>
+          <Keyword>points_of_interest</Keyword>
+          <Keyword>Manhattan</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-74.01288357289539" miny="40.70706518152972" maxx="-74.00752144792617" maxy="40.71242730649893"/>
+        <BoundingBox SRS="EPSG:4326" minx="-74.0118315772888" miny="40.70754683896324" maxx="-74.00153046439813" maxy="40.719885123828675"/>
+        <Style>
+          <Name>poi</Name>
+          <Title>Points of interest</Title>
+          <Abstract>Manhattan points of interest</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:poi"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tiger:tiger_roads</Name>
+        <Title>Manhattan (NY) roads</Title>
+        <Abstract>Highly simplified road layout of Manhattan in New York..</Abstract>
+        <KeywordList>
+          <Keyword>DS_tiger_roads</Keyword>
+          <Keyword>tiger_roads</Keyword>
+          <Keyword>roads</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-74.08769307536667" miny="40.660618924633326" maxx="-73.84653192463333" maxy="40.90178007536667"/>
+        <BoundingBox SRS="EPSG:4326" minx="-74.02722" miny="40.684221" maxx="-73.907005" maxy="40.878178"/>
+        <Style>
+          <Name>tiger_roads</Name>
+          <Title>Default Styler</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:tiger_roads"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>sf:archsites</Name>
+        <Title>Spearfish archeological sites</Title>
+        <Abstract>Sample data from GRASS, archeological sites location, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>archsites</Keyword>
+          <Keyword>sfArchsites</Keyword>
+          <Keyword>spearfish</Keyword>
+          <Keyword>archeology</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <LatLonBoundingBox minx="-103.89000625326194" miny="44.29796961116877" maxx="-103.62049935931161" maxy="44.5674765051191"/>
+        <BoundingBox SRS="EPSG:26713" minx="588926.6865343997" miny="4913890.332215005" maxx="609271.2114429093" maxy="4927102.448786693"/>
+        <Style>
+          <Name>point</Name>
+          <Title>Default point</Title>
+          <Abstract>A sample style that just prints out a 6px wide red square</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=sf:archsites"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>sf:bugsites</Name>
+        <Title>Spearfish bug locations</Title>
+        <Abstract>Sample data from GRASS, bug sites location, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>sfBugsites</Keyword>
+          <Keyword>bugsites</Keyword>
+          <Keyword>insects</Keyword>
+          <Keyword>spearfish</Keyword>
+          <Keyword>tiger_beetles</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <LatLonBoundingBox minx="-103.89041901614995" miny="44.266492773791775" maxx="-103.61527753322848" maxy="44.54163425671326"/>
+        <BoundingBox SRS="EPSG:26713" minx="589311.4871629482" miny="4913787.082099182" maxx="609374.4115724327" maxy="4920844.691225147"/>
+        <Style>
+          <Name>capitals</Name>
+          <Title>Capital cities</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=sf:bugsites"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>sf:restricted</Name>
+        <Title>Spearfish restricted areas</Title>
+        <Abstract>Sample data from GRASS, restricted areas, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>restricted</Keyword>
+          <Keyword>sfRestricted</Keyword>
+          <Keyword>spearfish</Keyword>
+          <Keyword>areas</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <LatLonBoundingBox minx="-103.86063428986338" miny="44.37661974734028" maxx="-103.73735238788223" maxy="44.49990164932145"/>
+        <BoundingBox SRS="EPSG:26713" minx="591175.6988413236" miny="4915754.888027622" maxx="600052.4121365736" maxy="4926353.920417598"/>
+        <Style>
+          <Name>restricted</Name>
+          <Title>Red, translucent style</Title>
+          <Abstract>A sample style that just prints out a transparent red interior with a red outline</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=sf:restricted"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>sf:roads</Name>
+        <Title>Spearfish roads</Title>
+        <Abstract>Sample data from GRASS, road layout, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>sfRoads</Keyword>
+          <Keyword>roads</Keyword>
+          <Keyword>spearfish</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <LatLonBoundingBox minx="-103.90534996703491" miny="44.2800314829381" maxx="-103.5943809967035" maxy="44.5910004532695"/>
+        <BoundingBox SRS="EPSG:26713" minx="588430.2387813567" miny="4913303.484828213" maxx="610531.8279023392" maxy="4928766.251023613"/>
+        <Style>
+          <Name>simple_roads</Name>
+          <Title>Default Styler for simple road segments</Title>
+          <Abstract>Light red line, 2px wide</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=sf:roads"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>sf:streams</Name>
+        <Title>Spearfish streams</Title>
+        <Abstract>Sample data from GRASS, streams, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>sfStreams</Keyword>
+          <Keyword>streams</Keyword>
+          <Keyword>spearfish</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <LatLonBoundingBox minx="-103.9089219204826" miny="44.278738996398694" maxx="-103.59184616696963" maxy="44.595814749911675"/>
+        <BoundingBox SRS="EPSG:26713" minx="588430.3113926318" miny="4913241.156915463" maxx="610522.3974737043" maxy="4928777.235349244"/>
+        <Style>
+          <Name>simple_streams</Name>
+          <Title>Default Styler for streams segments</Title>
+          <Abstract>Blue lines, 2px wide</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=sf:streams"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:tasmania_cities</Name>
+        <Title>Tasmania cities</Title>
+        <Abstract>Cities in Tasmania (actually, just the capital)</Abstract>
+        <KeywordList>
+          <Keyword>cities</Keyword>
+          <Keyword>Tasmania</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="144.93357593664516" miny="-43.93984106335484" maxx="148.53694406335487" maxy="-40.33647293664516"/>
+        <BoundingBox SRS="EPSG:4326" minx="147.2910004483" miny="-42.851001816890005" maxx="147.2910004483" maxy="-42.851001816890005"/>
+        <Style>
+          <Name>capitals</Name>
+          <Title>Capital cities</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_cities"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:tasmania_roads</Name>
+        <Title>Tasmania roads</Title>
+        <Abstract>Main Tasmania roads</Abstract>
+        <KeywordList>
+          <Keyword>Roads</Keyword>
+          <Keyword>Tasmania</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="144.8607879004856" miny="-44.01262909951439" maxx="148.60973209951442" maxy="-40.26368490048561"/>
+        <BoundingBox SRS="EPSG:4326" minx="145.19754" miny="-43.423512" maxx="148.27298000000002" maxy="-40.852802"/>
+        <Style>
+          <Name>simple_roads</Name>
+          <Title>Default Styler for simple road segments</Title>
+          <Abstract>Light red line, 2px wide</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_roads"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:tasmania_state_boundaries</Name>
+        <Title>Tasmania state boundaries</Title>
+        <Abstract>Tasmania state boundaries</Abstract>
+        <KeywordList>
+          <Keyword>tasmania_state_boundaries</Keyword>
+          <Keyword>Tasmania</Keyword>
+          <Keyword>boundaries</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="142.70637712387594" miny="-45.06157887612408" maxx="149.60758787612411" maxy="-38.16036812387592"/>
+        <BoundingBox SRS="EPSG:4326" minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>
+        <Style>
+          <Name>green</Name>
+          <Title>Green polygon</Title>
+          <Abstract>Green fill with black outline</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_state_boundaries"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:tasmania_water_bodies</Name>
+        <Title>Tasmania water bodies</Title>
+        <Abstract>Tasmania water bodies</Abstract>
+        <KeywordList>
+          <Keyword>Lakes</Keyword>
+          <Keyword>Bodies</Keyword>
+          <Keyword>Australia</Keyword>
+          <Keyword>Water</Keyword>
+          <Keyword>Tasmania</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="145.82989373832018" miny="-43.16951476167979" maxx="147.3614212616798" maxy="-41.63798723832021"/>
+        <BoundingBox SRS="EPSG:4326" minx="145.97161899999998" miny="-43.031944" maxx="147.219696" maxy="-41.775558"/>
+        <Style>
+          <Name>cite_lakes</Name>
+          <Title>Blue lake</Title>
+          <Abstract>A blue fill, solid black outline style</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_water_bodies"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:states</Name>
+        <Title>USA Population</Title>
+        <Abstract>This is some census data on the states.</Abstract>
+        <KeywordList>
+          <Keyword>census</Keyword>
+          <Keyword>united</Keyword>
+          <Keyword>boundaries</Keyword>
+          <Keyword>state</Keyword>
+          <Keyword>states</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-131.05615308855994" miny="1.958333411440066" maxx="-60.645117911440046" maxy="72.36936858855995"/>
+        <BoundingBox SRS="EPSG:4326" minx="-124.73142200000001" miny="24.955967" maxx="-66.969849" maxy="49.371735"/>
+        <Style>
+          <Name>population</Name>
+          <Title>Population in the United States</Title>
+          <Abstract>A sample filter that filters the United States into three
+        categories of population, drawn in different colors</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tiger:giant_polygon</Name>
+        <Title>World rectangle</Title>
+        <Abstract>A simple rectangular polygon covering most of the world, it\'s only used for the purpose of providing a background (WMS bgcolor could be used instead)</Abstract>
+        <KeywordList>
+          <Keyword>DS_giant_polygon</Keyword>
+          <Keyword>giant_polygon</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-257.0843245637291" miny="-257.0843245637291" maxx="257.0843245637291" maxy="257.0843245637291"/>
+        <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
+        <Style>
+          <Name>giant_polygon</Name>
+          <Title>Border-less gray fill</Title>
+          <Abstract>Light gray polygon fill without a border</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:giant_polygon"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>nurc:Arc_Sample</Name>
+        <Title>Global annual rainfall</Title>
+        <Abstract>Global annual rainfall in ArcGrid format</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>arcGridSample</Keyword>
+          <Keyword>arcGridSample_Coverage</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
+        <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
+        <Style>
+          <Name>raster</Name>
+          <Title>Raster</Title>
+          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=nurc:Arc_Sample"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>nurc:Img_Sample</Name>
+        <Title>North America sample imagery</Title>
+        <Abstract>A very rough imagery of North America</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>worldImageSample</Keyword>
+          <Keyword>worldImageSample_Coverage</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-130.85168" miny="20.7052" maxx="-62.0054" maxy="54.1141"/>
+        <BoundingBox SRS="EPSG:4326" minx="-130.85168" miny="20.7052" maxx="-62.0054" maxy="54.1141"/>
+        <Style>
+          <Name>raster</Name>
+          <Title>Raster</Title>
+          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=nurc:Img_Sample"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>nurc:mosaic</Name>
+        <Title>Sample PNG mosaic</Title>
+        <Abstract>Subsampled satellite imagery loaded as a mosaic of PNG images</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>mosaic</Keyword>
+          <Keyword>mosaic</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="6.34617490847439" miny="36.4917718219401" maxx="20.8296831527815" maxy="46.5907669751351"/>
+        <BoundingBox SRS="EPSG:4326" minx="6.34617490847439" miny="36.4917718219401" maxx="20.8296831527815" maxy="46.5907669751351"/>
+        <Style>
+          <Name>raster</Name>
+          <Title>Raster</Title>
+          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=nurc:mosaic"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>nurc:Pk50095</Name>
+        <Title>Sample scanned and georerenced map</Title>
+        <Abstract>This is a sample for the world image format (wld + prj + tiff)</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>img_sample2</Keyword>
+          <Keyword>Pk50095</Keyword>
+        </KeywordList>
+        <SRS>EPSG:32633</SRS>
+        <LatLonBoundingBox minx="12.999446822650462" miny="46.722110379286" maxx="13.308182612644663" maxy="46.91359611878293"/>
+        <BoundingBox SRS="EPSG:32633" minx="347649.93086859107" miny="5176214.082539256" maxx="370725.976428591" maxy="5196961.352859256"/>
+        <Style>
+          <Name>raster</Name>
+          <Title>Raster</Title>
+          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=nurc:Pk50095"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>sf:sfdem</Name>
+        <Title>sfdem is a Tagged Image File Format with Geographic information</Title>
+        <Abstract>Generated from sfdem</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>sfdem</Keyword>
+          <Keyword>sfdem</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <LatLonBoundingBox minx="-103.87108701853181" miny="44.370187074132616" maxx="-103.62940739432703" maxy="44.5016011535299"/>
+        <BoundingBox SRS="EPSG:26713" minx="589980.0" miny="4913700.0" maxx="609000.0" maxy="4928010.0"/>
+        <Style>
+          <Name>dem</Name>
+          <Title>Simple DEM style</Title>
+          <Abstract>Classic elevation color progression</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://publicus.opengeo.org:80/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=sf:sfdem"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="0">
+        <Name>spearfish</Name>
+        <Title>spearfish</Title>
+        <Abstract>Layer-Group type layer: spearfish</Abstract>
+        <SRS>EPSG:26713</SRS>
+        <LatLonBoundingBox minx="-103.87799562257162" miny="44.37244213023845" maxx="-103.62286957414864" maxy="44.5023266635277"/>
+        <BoundingBox SRS="EPSG:26713" minx="589425.9342365642" miny="4913959.224611808" maxx="609518.6719560538" maxy="4928082.949945881"/>
+      </Layer>
+      <Layer queryable="0">
+        <Name>tasmania</Name>
+        <Title>tasmania</Title>
+        <Abstract>Layer-Group type layer: tasmania</Abstract>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>
+        <BoundingBox SRS="EPSG:4326" minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>
+      </Layer>
+      <Layer queryable="0">
+        <Name>tiger-ny</Name>
+        <Title>tiger-ny</Title>
+        <Abstract>Layer-Group type layer: tiger-ny</Abstract>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-74.047185" miny="40.679648" maxx="-73.907005" maxy="40.882078"/>
+        <BoundingBox SRS="EPSG:4326" minx="-74.047185" miny="40.679648" maxx="-73.907005" maxy="40.882078"/>
+      </Layer>
+    </Layer>
+  </Capability>
+</WMT_MS_Capabilities>--></div>
+
+</body> 
+</html> 
diff --git a/tests/Format/WMSCapabilities/v1_3_0.html b/tests/Format/WMSCapabilities/v1_3_0.html
new file mode 100644
index 0000000..95f6f4b
--- /dev/null
+++ b/tests/Format/WMSCapabilities/v1_3_0.html
@@ -0,0 +1,578 @@
+<html>
+<head>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+    function test_layers(t) {
+
+        t.plan(22);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var capability = obj.capability;
+
+        var layers = {};
+        for (var i=0, len=capability.layers.length; i<len; i++) {
+            if ("name" in capability.layers[i]) {
+                layers[ capability.layers[i].name ] = capability.layers[i];
+            }
+        }
+
+        var rootlayer = capability.layers[ capability.layers.length - 1];
+
+        t.eq(rootlayer.srs,
+             {"CRS:84": true},
+             "SRS parsed correctly for root layer");
+        t.eq(layers["ROADS_RIVERS"].srs,
+             {"CRS:84": true, "EPSG:26986": true},
+             "Inheritance of SRS handled correctly when adding SRSes");
+        t.eq(layers["Temperature"].srs,
+             {"CRS:84": true},
+             "Inheritance of SRS handled correctly when redeclaring an inherited SRS");
+
+        var bbox = layers["ROADS_RIVERS"].bbox["EPSG:26986"];
+        t.eq(bbox.bbox,
+             [189000, 834000, 285000, 962000],
+             "Correct bbox from BoundingBox");
+        t.eq(bbox.res, {x: 1, y: 1}, "Correct resolution");
+
+        bbox = layers["ROADS_1M"].bbox["EPSG:26986"];
+        t.eq(bbox.bbox,
+             [189000, 834000, 285000, 962000],
+             "Correctly inherited bbox");
+        t.eq(bbox.res, {x: 1, y: 1}, "Correctly inherited resolution");
+
+
+        var identifiers = layers["ROADS_RIVERS"].identifiers;
+        var authorities = layers["ROADS_RIVERS"].authorityURLs;
+
+        t.ok(identifiers, "got identifiers from layer ROADS_RIVERS");
+        t.ok("DIF_ID" in identifiers,
+             "authority attribute from Identifiers parsed correctly");
+        t.eq(identifiers["DIF_ID"],
+             "123456",
+             "Identifier value parsed correctly");
+        t.ok("DIF_ID" in authorities,
+             "AuthorityURLs parsed and inherited correctly");
+        t.eq(authorities["DIF_ID"],
+             "http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html",
+             "OnlineResource in AuthorityURLs parsed correctly");
+
+        var featurelist = layers["ROADS_RIVERS"].featureListURL;
+        t.ok(featurelist, "layer has FeatureListURL");
+        t.eq(featurelist.format,
+             "XML",
+             "FeatureListURL format parsed correctly");
+        t.eq(featurelist.href,
+             "http://www.university.edu/data/roads_rivers.gml",
+             "FeatureListURL OnlineResource parsed correctly");
+
+        t.eq(layers["Pressure"].queryable,
+             true,
+             "queryable property inherited correctly");
+        t.eq(layers["ozone_image"].queryable,
+             false,
+             "queryable property has correct default value");
+        t.eq(layers["population"].cascaded,
+             1,
+             "cascaded property parsed correctly");
+        t.eq(layers["ozone_image"].fixedWidth,
+             512,
+             "fixedWidth property correctly parsed");
+        t.eq(layers["ozone_image"].fixedHeight,
+             256,
+             "fixedHeight property correctly parsed");
+        t.eq(layers["ozone_image"].opaque,
+             true,
+             "opaque property parsed correctly");
+        t.eq(layers["ozone_image"].noSubsets,
+             true,
+             "noSubsets property parsed correctly");
+
+
+    }
+
+    function test_dimensions(t) {
+
+        t.plan(8);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var capability = obj.capability;
+
+        var layers = {};
+        for (var i=0, len=capability.layers.length; i<len; i++) {
+            if ("name" in capability.layers[i]) {
+                layers[ capability.layers[i].name ] = capability.layers[i];
+            }
+        }
+
+        var time = layers["Clouds"].dimensions.time;
+        t.eq(time["default"], "2000-08-22", "Default time value parsed correctly");
+        t.eq(time.values.length, 1, "Currect number of time extent values/periods");
+        t.eq(time.values[0], "1999-01-01/2000-08-22/P1D", "Time extent values parsed correctly");
+
+        var elevation = layers["Pressure"].dimensions.elevation;
+        t.eq(elevation.units, "CRS:88", "Dimension units parsed correctly");
+        t.eq(elevation["default"], "0", "Default elevation value parsed correctly");
+        t.eq(elevation.nearestVal, true, "NearestValue parsed correctly");
+        t.eq(elevation.multipleVal, false, "Absense of MultipleValues handled correctly");
+        t.eq(elevation.values,
+             ["0","1000","3000","5000","10000"],
+             "Parsing of comma-separated values done correctly");
+
+
+    }
+
+    function test_contactinfo(t) {
+        t.plan(14);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var service = obj.service;
+
+        var contactinfo = service.contactInformation;
+        t.ok(contactinfo, "object contains contactInformation property");
+
+        var personPrimary = contactinfo.personPrimary;
+        t.ok(personPrimary, "object contains personPrimary property");
+
+        t.eq(personPrimary.person, "Jeff Smith", "ContactPerson parsed correctly");
+        t.eq(personPrimary.organization, "NASA", "ContactOrganization parsed correctly");
+
+        t.eq(contactinfo.position,
+             "Computer Scientist",
+             "ContactPosition parsed correctly");
+
+
+        var addr = contactinfo.contactAddress;
+        t.ok(addr, "object contains contactAddress property");
+
+        t.eq(addr.type, "postal", "AddressType parsed correctly");
+        t.eq(addr.address,
+             "NASA Goddard Space Flight Center",
+             "Address parsed correctly");
+        t.eq(addr.city, "Greenbelt", "City parsed correctly");
+        t.eq(addr.stateOrProvince, "MD", "StateOrProvince parsed correctly");
+        t.eq(addr.postcode, "20771", "PostCode parsed correctly");
+        t.eq(addr.country, "USA", "Country parsed correctly");
+
+        t.eq(contactinfo.phone,
+             "+1 301 555-1212",
+             "ContactVoiceTelephone parsed correctly");
+        t.eq(contactinfo.email,
+             "user at host.com",
+             "ContactElectronicMailAddress parsed correctly");
+    }
+
+    function test_feesAndConstraints(t) {
+        t.plan(2);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var service = obj.service;
+
+        t.ok(! ("fees" in service), "Fees=none handled correctly");
+        t.ok(! ("accessConstraints" in service), "AccessConstraints=none handled correctly");
+    }
+
+    function test_requests(t) {
+        t.plan(6);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var request = obj.capability.request;
+
+        t.ok(request, "request property exists");
+        t.ok("getmap" in request, "got GetMap request");
+
+        t.ok("getfeatureinfo" in request, "got GetFeatureInfo request");
+        t.eq(request.getfeatureinfo.formats,
+             ["text/xml", "text/plain", "text/html"],
+             "GetFeatureInfo formats correctly parsed");
+
+        var exception = obj.capability.exception;
+        t.ok(exception, "exception property exists");
+        t.eq(exception.formats,
+             ["XML", "INIMAGE", "BLANK"],
+             "Exception Format parsed");
+    }
+
+    function test_ogc(t) {
+        t.plan(14);
+
+        /*
+         * Set up
+         */
+
+        // needed for the minScale/maxScale test, see below
+        var dpi = OpenLayers.DOTS_PER_INCH;
+        OpenLayers.DOTS_PER_INCH = 90.71;
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+        var capability = obj.capability;
+
+        /*
+         * Test
+         */
+
+        var attribution = capability.layers[2].attribution;
+        t.eq(attribution.title, "State College University", "attribution title parsed correctly.");
+        t.eq(attribution.href, "http://www.university.edu/", "attribution href parsed correctly.")
+        t.eq(attribution.logo.href, "http://www.university.edu/icons/logo.gif", "attribution logo url parsed correctly.");
+        t.eq(attribution.logo.format, "image/gif", "attribution logo format parsed correctly.");
+        t.eq(attribution.logo.width, "100", "attribution logo width parsed correctly.");
+        t.eq(attribution.logo.height, "100", "attribution logo height parsed correctly.");
+
+        var keywords = capability.layers[0].keywords;
+        t.eq(keywords.length, 3, "layer has 3 keywords.");
+        t.eq(keywords[0].value, "road", "1st keyword parsed correctly.");
+
+        var metadataURLs = capability.layers[0].metadataURLs;
+        t.eq(metadataURLs.length, 2, "layer has 2 metadata urls.");
+        t.eq(metadataURLs[0].type, "FGDC:1998", "type parsed correctly.");
+        t.eq(metadataURLs[0].format, "text/plain", "format parsed correctly.");
+        t.eq(metadataURLs[0].href, "http://www.university.edu/metadata/roads.txt", "href parsed correctly.");
+
+        /*
+        Test minScale and maxScale
+        */
+        var minScale = 250000;
+        var maxScale = 1000;
+        t.eq(capability.layers[0].minScale, minScale.toPrecision(16), "layer.minScale is correct");
+        t.eq(capability.layers[0].maxScale, maxScale.toPrecision(16), "layer.maxScale is correct");
+
+        /*
+         * Tear down
+         */
+
+        OpenLayers.DOTS_PER_INCH = dpi;
+    }
+
+    function test_WMS13specials(t) {
+        t.plan(3);
+
+        var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+        var doc = new OpenLayers.Format.XML().read(xml);
+
+        var obj = new OpenLayers.Format.WMSCapabilities().read(doc);
+
+        t.eq(obj.service.layerLimit, 16, "LayerLimit parsed correctly");
+        t.eq(obj.service.maxHeight, 2048, "MaxHeight parsed correctly");
+        t.eq(obj.service.maxWidth, 2048, "MaxWidth parsed correctly");
+
+    }
+
+    </script>
+</head>
+<body>
+
+<!--
+OGC example below taken from
+http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xml
+Changes:
+-removed comments
+-corrected typo in FeatureListURL Format XML with double quote
+-added MinScaleDenominator and MaxScaleDenominator
+-remove whitespace in Dimension tags
+-->
+<div id="ogcsample"><!--
+<?xml version='1.0' encoding="UTF-8"?>
+<WMS_Capabilities version="1.3.0" xmlns="http://www.opengis.net/wms"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd">
+<Service>
+  <Name>WMS</Name>
+  <Title>Acme Corp. Map Server</Title>
+  <Abstract>Map Server maintained by Acme Corporation.  Contact: webmaster at wmt.acme.com.  High-quality maps showing roadrunner nests and possible ambush locations.</Abstract>
+
+  <KeywordList>
+    <Keyword>bird</Keyword>
+    <Keyword>roadrunner</Keyword>
+    <Keyword>ambush</Keyword>
+  </KeywordList>
+  <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+   xlink:href="http://hostname/" />
+
+
+  <ContactInformation>
+    <ContactPersonPrimary>
+      <ContactPerson>Jeff Smith</ContactPerson>
+      <ContactOrganization>NASA</ContactOrganization>
+    </ContactPersonPrimary>
+    <ContactPosition>Computer Scientist</ContactPosition>
+
+    <ContactAddress>
+      <AddressType>postal</AddressType>
+      <Address>NASA Goddard Space Flight Center</Address>
+      <City>Greenbelt</City>
+      <StateOrProvince>MD</StateOrProvince>
+      <PostCode>20771</PostCode>
+
+      <Country>USA</Country>
+    </ContactAddress>
+    <ContactVoiceTelephone>+1 301 555-1212</ContactVoiceTelephone>
+    <ContactElectronicMailAddress>user at host.com</ContactElectronicMailAddress>
+  </ContactInformation>
+
+  <Fees>none</Fees>
+
+  <AccessConstraints>none</AccessConstraints>
+  <LayerLimit>16</LayerLimit>
+  <MaxWidth>2048</MaxWidth>
+  <MaxHeight>2048</MaxHeight>
+</Service>
+<Capability>
+  <Request>
+    <GetCapabilities>
+
+      <Format>text/xml</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+          <Post>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+
+          </Post>
+        </HTTP>
+      </DCPType>
+    </GetCapabilities>
+    <GetMap>
+      <Format>image/gif</Format>
+      <Format>image/png</Format>
+      <Format>image/jpeg</Format>
+
+      <DCPType>
+        <HTTP>
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+        </HTTP>
+      </DCPType>
+    </GetMap>
+
+    <GetFeatureInfo>
+      <Format>text/xml</Format>
+      <Format>text/plain</Format>
+      <Format>text/html</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+        </HTTP>
+      </DCPType>
+    </GetFeatureInfo>
+  </Request>
+  <Exception>
+    <Format>XML</Format>
+
+    <Format>INIMAGE</Format>
+    <Format>BLANK</Format>
+  </Exception>
+  <Layer>
+    <Title>Acme Corp. Map Server</Title>
+    <CRS>CRS:84</CRS>
+
+    <AuthorityURL name="DIF_ID">
+      <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+       xlink:href="http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html" />
+    </AuthorityURL>
+    <Layer>
+
+      <Name>ROADS_RIVERS</Name>
+      <Title>Roads and Rivers</Title>
+
+      <CRS>EPSG:26986</CRS>
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-71.63</westBoundLongitude>
+        <eastBoundLongitude>-70.78</eastBoundLongitude>
+        <southBoundLatitude>41.75</southBoundLatitude>
+        <northBoundLatitude>42.90</northBoundLatitude>
+
+      </EX_GeographicBoundingBox>
+      <BoundingBox CRS="CRS:84"
+       minx="-71.63" miny="41.75" maxx="-70.78" maxy="42.90" resx="0.01" resy="0.01"/>
+      <BoundingBox CRS="EPSG:26986"
+       minx="189000" miny="834000" maxx="285000" maxy="962000" resx="1" resy="1" />
+      <Attribution>
+        <Title>State College University</Title>
+        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+         xlink:href="http://www.university.edu/" />
+
+        <LogoURL width="100" height="100">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/icons/logo.gif" />
+        </LogoURL>
+      </Attribution>
+      <Identifier authority="DIF_ID">123456</Identifier>
+      <FeatureListURL>
+
+        <Format>XML</Format>
+        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+         xlink:href="http://www.university.edu/data/roads_rivers.gml" />
+      </FeatureListURL>
+      <Style>
+        <Name>USGS</Name>
+        <Title>USGS Topo Map Style</Title>
+        <Abstract>Features are shown in a style like that used in USGS topographic maps.</Abstract>
+
+        <LegendURL width="72" height="72">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/legends/usgs.gif" />
+        </LegendURL>
+        <StyleSheetURL>
+          <Format>text/xsl</Format>
+
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/stylesheets/usgs.xsl" />
+        </StyleSheetURL>
+      </Style>
+      <MinScaleDenominator>1000</MinScaleDenominator>
+      <MaxScaleDenominator>250000</MaxScaleDenominator>
+      <Layer queryable="1">
+        <Name>ROADS_1M</Name>
+        <Title>Roads at 1:1M scale</Title>
+        <Abstract>Roads at a scale of 1 to 1 million.</Abstract>
+
+        <KeywordList>
+          <Keyword>road</Keyword>
+          <Keyword>transportation</Keyword>
+          <Keyword>atlas</Keyword>
+        </KeywordList>
+        <Identifier authority="DIF_ID">123456</Identifier>
+        <MetadataURL type="FGDC:1998">
+
+                <Format>text/plain</Format>
+                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="http://www.university.edu/metadata/roads.txt" />
+             </MetadataURL>
+        <MetadataURL type="ISO19115:2003">
+               <Format>text/xml</Format>
+               <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+                xlink:type="simple"
+                xlink:href="http://www.university.edu/metadata/roads.xml" />
+             </MetadataURL>
+
+        <Style>
+          <Name>ATLAS</Name>
+          <Title>Road atlas style</Title>
+          <Abstract>Roads are shown in a style like that used in a commercial road atlas.</Abstract>
+        <LegendURL width="72" height="72">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/legends/atlas.gif" />
+
+        </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>RIVERS_1M</Name>
+        <Title>Rivers at 1:1M scale</Title>
+        <Abstract>Rivers at a scale of 1 to 1 million.</Abstract>
+
+        <KeywordList>
+          <Keyword>river</Keyword>
+          <Keyword>canal</Keyword>
+          <Keyword>waterway</Keyword>
+        </KeywordList>
+      </Layer>
+    </Layer>
+
+    <Layer queryable="1">
+      <Title>Weather Forecast Data</Title>
+      <CRS>CRS:84</CRS>
+
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+        <eastBoundLongitude>180</eastBoundLongitude>
+
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="2000-08-22">1999-01-01/2000-08-22/P1D</Dimension>
+      <Layer>
+
+        <Name>Clouds</Name>
+        <Title>Forecast cloud cover</Title>
+      </Layer>
+      <Layer>
+        <Name>Temperature</Name>
+        <Title>Forecast temperature</Title>
+      </Layer>
+
+      <Layer>
+        <Name>Pressure</Name>
+        <Title>Forecast barometric pressure</Title>
+         <Dimension name="elevation" units="EPSG:5030" />
+         <Dimension name="time" units="ISO8601" default="2000-08-22">
+           1999-01-01/2000-08-22/P1D</Dimension>
+
+         <Dimension name="elevation" units="CRS:88" default="0" nearestValue="1">0,1000,3000,5000,10000</Dimension>
+      </Layer>
+    </Layer>
+    <Layer opaque="1" noSubsets="1" fixedWidth="512" fixedHeight="256">
+      <Name>ozone_image</Name>
+      <Title>Global ozone distribution (1992)</Title>
+
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+        <eastBoundLongitude>180</eastBoundLongitude>
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="1992">1992</Dimension>
+
+    </Layer>
+    <Layer cascaded="1">
+      <Name>population</Name>
+      <Title>World population, annual</Title>
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+
+        <eastBoundLongitude>180</eastBoundLongitude>
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="2000">1990/2000/P1Y</Dimension>
+    </Layer>
+  </Layer>
+
+</Capability>
+</WMS_Capabilities>
+--></div>
+
+</body>
+</html>
diff --git a/tests/Format/WMSDescribeLayer.html b/tests/Format/WMSDescribeLayer.html
new file mode 100644
index 0000000..30ebaff
--- /dev/null
+++ b/tests/Format/WMSDescribeLayer.html
@@ -0,0 +1,41 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_read_WMSDescribeLayer(t) {
+        t.plan(5);
+       
+        var parser = new OpenLayers.Format.WMSDescribeLayer();
+
+        var text =
+            '<WMS_DescribeLayerResponse version="1.1.1">' +
+            '  <LayerDescription name="topp:states" wfs="http://geo.openplans.org:80/geoserver/wfs/WfsDispatcher?">' +
+            '    <Query typeName="topp:states"/>' +
+            '  </LayerDescription>' +
+            '</WMS_DescribeLayerResponse>';
+
+        var res = parser.read(text);
+
+        t.eq(res.length, 1,
+            "Only one LayerDescription in data, so only one parsed");
+
+        t.eq(res[0].owsType, "WFS",
+            "Properly parses owsType as WFS");
+
+        t.eq(res[0].owsURL, "http://geo.openplans.org:80/geoserver/wfs/WfsDispatcher?",
+            "Properly parses owsURL");
+
+        t.eq(res[0].typeName, "topp:states",
+            "Properly parses typeName");
+
+        t.eq(res[0].layerName, "topp:states",
+            "Properly parses name");
+
+    }
+
+    </script> 
+</head> 
+<body>
+</body> 
+</html>
diff --git a/tests/Format/WMSGetFeatureInfo.html b/tests/Format/WMSGetFeatureInfo.html
new file mode 100644
index 0000000..41a9066
--- /dev/null
+++ b/tests/Format/WMSGetFeatureInfo.html
@@ -0,0 +1,278 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_read_FeatureInfoResponse(t) {
+        t.plan(5);
+        
+        var parser = new OpenLayers.Format.WMSGetFeatureInfo();
+
+        // read empty response
+        var text = 
+            '<?xml version="1.0" encoding="UTF-8" ?>' +
+            '<FeatureInfoResponse>' +
+            '</FeatureInfoResponse>';
+
+        var features = parser.read(text);
+        t.eq(features.length, 0,
+             "Parsing empty FeatureInfoResponse response succesfull");
+
+        // read 1 feature
+        text = 
+            '<?xml version="1.0" encoding="UTF-8" ?>' +
+            '<FeatureInfoResponse>' +
+            '  <FIELDS OBJECTID="1188" HECTARES="1819.734" ZONENR="5854" NULZONES=" " AREA="18197340.1426" PERIMETER="19177.4073627" SHAPE="NULL" SE_ANNO_CAD_DATA="NULL" SHAPE.AREA="0" SHAPE.LEN="0"/>' +
+            '</FeatureInfoResponse>';
+
+        features = parser.read(text);
+        t.eq(features.length, 1,
+             "Parsed 1 feature in total");
+
+        t.eq(features[0].attributes.OBJECTID, '1188',
+             "Attribute OBJECTID contains the right value");
+
+        // read multiple features
+        text = 
+            '<?xml version="1.0" encoding="UTF-8" ?>' +
+            '<FeatureInfoResponse>' +
+            '  <FIELDS OBJECTID="551" Shape="NULL" NAME="Carbon" STATE_NAME="Wyoming" AREA="7999.91062" POP2000="15639" POP00_SQMI="2" Shape_Length="6.61737274334215" Shape_Area="2.23938983524154"/>' +
+            '  <FIELDS OBJECTID="7" Shape="NULL" AREA="97803.199" STATE_NAME="Wyoming" SUB_REGION="Mtn" STATE_ABBR="WY" POP2000="493782" POP00_SQMI="5" Shape_Length="21.9870297323522" Shape_Area="27.9666881382635"/>' +
+            '  <FIELDS OBJECTID="99" Shape="NULL" LENGTH="378.836" TYPE="Multi-Lane Divided" ADMN_CLASS="Interstate" TOLL_RD="N" RTE_NUM1=" 80" RTE_NUM2=" " ROUTE="Interstate  80" Shape_Length="7.04294883879398"/>' +
+            '</FeatureInfoResponse>';
+
+        features = parser.read(text);
+
+        t.eq(features.length, 3,
+             "Parsed 3 features in total");
+
+        t.eq(features[1].attributes.STATE_NAME, 'Wyoming',
+             "Attribute STATE_NAME contains the right value");
+
+    }
+
+    function test_read_msGMLOutput(t) {
+        t.plan(12);
+        
+        var parser = new OpenLayers.Format.WMSGetFeatureInfo();
+
+        // read empty response
+        var text = 
+            '<?xml version="1.0" encoding="ISO-8859-1"?>' +
+            '<msGMLOutput ' +
+            '	 xmlns:gml="http://www.opengis.net/gml"' +
+            '	 xmlns:xlink="http://www.w3.org/1999/xlink"' +
+            '	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
+            '</msGMLOutput>';
+
+        var features = parser.read(text);
+        t.eq(features.length, 0,
+             "Parsing empty msGMLOutput response succesfull");
+
+        // read 1 feature from 1 layer
+        text = 
+            '<?xml version="1.0" encoding="ISO-8859-1"?>' +
+            '<msGMLOutput ' +
+            '	 xmlns:gml="http://www.opengis.net/gml"' +
+            '	 xmlns:xlink="http://www.w3.org/1999/xlink"' +
+            '	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
+            '	<AAA64_layer>' +
+            '		<AAA64_feature>' +
+            '			<gml:boundedBy>' +
+            '				<gml:Box srsName="EPSG:28992">' +
+            '					<gml:coordinates>107397.266000,460681.063000 116568.188000,480609.250000</gml:coordinates>' +
+            '				</gml:Box>' +
+            '			</gml:boundedBy>' +
+            '			<OBJECTID>109</OBJECTID>' +
+            '			<ROUTE>N231</ROUTE>' +
+            '			<ROUTE_CH>#N231</ROUTE_CH>' +
+            '			<COUNT>2</COUNT>' +
+            '			<BEHEERDER>P</BEHEERDER>' +
+            '			<LENGTH>28641.7</LENGTH>' +
+            '			<SHAPE><shape></SHAPE>' +
+            '			<SE_ANNO_CAD_DATA><null></SE_ANNO_CAD_DATA>' +
+            '		</AAA64_feature>' +
+            '	</AAA64_layer>' +
+            '</msGMLOutput>';
+
+        features = parser.read(text);
+
+        t.eq(features.length, 1,
+             "Parsed 1 feature in total");
+
+        t.eq(features[0].attributes.OBJECTID, '109',
+             "Attribute OBJECTID contains the right value");
+
+        t.eq(features[0].type, 'AAA64',
+             "Parsed the layer name correctly");
+
+        var bounds = features[0].bounds;
+        t.ok(bounds instanceof OpenLayers.Bounds, "feature given a bounds");
+        t.eq(bounds.left.toFixed(3), "107397.266", "Bounds left parsed correctly");
+        t.eq(bounds.right.toFixed(3), "116568.188", "Bounds right parsed correctly");
+        t.eq(bounds.bottom.toFixed(3), "460681.063", "Bounds bottom parsed correctly");
+        t.eq(bounds.top.toFixed(3), "480609.250", "Bounds top parsed correctly");
+
+        // read 2 features from 2 layers
+        text = 
+            '<?xml version="1.0" encoding="ISO-8859-1"?>' +
+            '<msGMLOutput ' +
+            '	 xmlns:gml="http://www.opengis.net/gml"' +
+            '	 xmlns:xlink="http://www.w3.org/1999/xlink"' +
+            '	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+
+            '	<AAA64_layer>' +
+            '		<AAA64_feature>' +
+            '			<gml:boundedBy>' +
+            '				<gml:Box srsName="EPSG:28992">' +
+            '					<gml:coordinates>129799.109000,467950.250000 133199.906000,468904.063000</gml:coordinates>' +
+            '				</gml:Box>' +
+            '			</gml:boundedBy>' +
+            '			<OBJECTID>287</OBJECTID>' +
+            '			<ROUTE>N403</ROUTE>' +
+            '			<ROUTE_CH>#N403</ROUTE_CH>' +
+            '			<COUNT>1</COUNT>' +
+            '			<BEHEERDER>P</BEHEERDER>' +
+            '			<LENGTH>4091.25</LENGTH>' +
+            '			<SHAPE><shape></SHAPE>' +
+            '			<SE_ANNO_CAD_DATA><null></SE_ANNO_CAD_DATA>' +
+            '		</AAA64_feature>' +
+            '	</AAA64_layer>' +
+            '	<AAA62_layer>' +
+            '		<AAA62_feature>' +
+            '			<gml:boundedBy>' +
+            '				<gml:Box srsName="EPSG:28992">' +
+            '					<gml:coordinates>129936.000000,468362.000000 131686.000000,473119.000000</gml:coordinates>' +
+            '				</gml:Box>' +
+            '			</gml:boundedBy>' +
+            '			<OBJECTID>1251</OBJECTID>' +
+            '			<VWK_ID>1515</VWK_ID>' +
+            '			<VWK_BEGDTM>00:00:00 01/01/1998</VWK_BEGDTM>' +
+            '			<VWJ_ID_BEG>1472</VWJ_ID_BEG>' +
+            '			<VWJ_ID_END>1309</VWJ_ID_END>' +
+            '			<VAKTYPE>D</VAKTYPE>' +
+            '			<VRT_CODE>227</VRT_CODE>' +
+            '			<VRT_NAAM>Vecht</VRT_NAAM>' +
+            '			<VWG_NR>2</VWG_NR>' +
+            '			<VWG_NAAM>Vecht</VWG_NAAM>' +
+            '			<BEGKM>18.25</BEGKM>' +
+            '			<ENDKM>23.995</ENDKM>' +
+            '			<LENGTH>5745.09</LENGTH>' +
+            '			<SHAPE><shape></SHAPE>' +
+            '			<SE_ANNO_CAD_DATA><null></SE_ANNO_CAD_DATA>' +
+            '		</AAA62_feature>' +
+            '	</AAA62_layer>' +
+            '</msGMLOutput>';
+
+        features = parser.read(text);
+
+        t.eq(features.length, 2,
+             "Parsed 2 features in total");
+
+        t.eq((features[0].type == features[1].type), false,
+             "The layer name differs for the two features");
+
+        text =
+            '<?xml version="1.0" encoding="ISO-8859-1"?>' +
+            '<msGMLOutput ' +
+            '        xmlns:gml="http://www.opengis.net/gml"' +
+            '        xmlns:xlink="http://www.w3.org/1999/xlink"' +
+            '        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
+            '       <wegbeheerderinfo_layer>' +
+            '               <wegbeheerderinfo_feature>' +
+            '                       <gml:boundedBy>' +
+            '                               <gml:Box srsName="EPSG:28992">' +
+            '                                       <gml:coordinates>105002.943000,490037.863000 105271.523000,490262.208000</gml:coordinates>' +
+            '                               </gml:Box>' +
+            '                       </gml:boundedBy>' +
+            '                       <geometry>' +
+            '                       <gml:MultiLineString srsName="EPSG:28992">' +
+            '                         <gml:lineStringMember>' +
+            '                           <gml:LineString>' +
+            '                             <gml:coordinates>105270.164000,490262.208000 105098.274000,490258.040000 105028.045000,490089.576000 105002.943000,490048.851000 105049.666000,490037.863000 105271.523000,490064.957000 </gml:coordinates>' +
+            '                           </gml:LineString>' +
+            '                         </gml:lineStringMember>' +
+            '                       </gml:MultiLineString>' +
+            '                       </geometry>' +
+            '                       <OGR_FID>203327</OGR_FID>' +
+            '               </wegbeheerderinfo_feature>' +
+            '       </wegbeheerderinfo_layer>' +
+            '</msGMLOutput>';
+
+        features = parser.read(text);
+
+        t.eq((features[0].geometry instanceof OpenLayers.Geometry.MultiLineString), true,
+            "Parsed geometry is of type multi line string");
+
+    }
+
+    function test_read_GMLFeatureInfoResponse(t) {
+        t.plan(4);
+        
+        var parser = new OpenLayers.Format.WMSGetFeatureInfo();
+
+        // read Ionic response, see if parser falls back to GML format
+        // url used:
+        /* http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA?service=WMS&request=GetFeatureInfo&layers=roads&version=1.1.1&bbox=-71.1,42.25,-71.05,42.3&width=500&height=500&format=image/png&SRS=EPSG:4326&styles=&x=174&y=252&query_layers=roads&info_format=application/vnd.ogc.gml */
+        var text = 
+            "<?xml version='1.0' encoding='utf-8' ?>" + 
+            '  <ogcwfs:FeatureCollection xsi:schemaLocation="http://www.ionicsoft.com/wfs http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA?REQUEST=DescribeAllFeatureType&SERVICE=WFS http://www.opengis.net/wfs http://webservices.ionicsoft.com/ionicweb/wfs/BOSTON_ORA/REQUEST/get/DATA/LPR/wfs/1.0.0/WFS-basic.xsd" xmlns:wfs="http://www.ionicsoft.com/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/199 [...]
+            '    <gml:boundedBy>' +
+            '      <gml:Box srsName="EPSG:4326">' +
+            '        <gml:coordinates>-71.08301710045646,42.27320863544783 -71.08020014900377,42.27480054530114</gml:coordinates>' +
+            '      </gml:Box>' +
+            '    </gml:boundedBy>' +
+            '  <gml:featureMember>' +
+            '    <wfs:roads fid="roads.9453.0">' +
+            '      <wfs:FNODE_>8943.0</wfs:FNODE_>' +
+            '      <wfs:TNODE_>9070.0</wfs:TNODE_>' +
+            '      <wfs:LPOLY_>0.0</wfs:LPOLY_>' +
+            '      <wfs:RPOLY_>0.0</wfs:RPOLY_>' +
+            '      <wfs:LENGTH>306.875</wfs:LENGTH>' +
+            '      <wfs:MRD_>13109.0</wfs:MRD_>' +
+            '      <wfs:MRD_ID>9453.0</wfs:MRD_ID>' +
+            '      <wfs:TILE_NAME>126</wfs:TILE_NAME>' +
+            '      <wfs:COUNTYCODE>M</wfs:COUNTYCODE>' +
+            '      <wfs:SERIAL_NUM>26000.0</wfs:SERIAL_NUM>' +
+            '      <wfs:CLASS>5.0</wfs:CLASS>' +
+            '      <wfs:ADMIN_TYPE>0.0</wfs:ADMIN_TYPE>' +
+            '      <wfs:ALTRT1TYPE>0.0</wfs:ALTRT1TYPE>' +
+            '      <wfs:STREETNAME>DOCTOR MARY MOORE BEATTY CIRCLE</wfs:STREETNAME>' +
+            '      <wfs:CSN>M  26000</wfs:CSN>' +
+            '      <wfs:GEOMETRY>' +
+            '        <gml:LineString srsName="EPSG:4326">' +
+            '          <gml:coordinates>-71.08300668868151,42.27480054530114 -71.08155305289881,42.27452010256956 -71.08021063085208,42.27320863544783</gml:coordinates>' +
+            '        </gml:LineString>' +
+            '      </wfs:GEOMETRY>' +
+            '    </wfs:roads>' +
+            '  </gml:featureMember>' +
+            '  </ogcwfs:FeatureCollection>';
+
+        var features = parser.read(text);
+
+        t.eq(features.length, 1,
+             "Parsing GML GetFeatureInfo response from Ionic succesfull");
+
+        t.eq(features[0].attributes.TILE_NAME, '126',
+             "Attribute TILE_NAME contains the right value");
+
+        // read Geoserver response
+        // taken from:
+/* http://demo.opengeo.org/geoserver/wms?service=WMS&request=GetFeatureInfo&layers=opengeo:roads&query_layers=opengeo:roads&format=image/png&version=1.1.1&styles=&bbox=-103.9,44.4,-103.7,44.5&srs=EPSG:4326&width=500&height=500&x=158&y=98&info_format=application/vnd.ogc.gml*/
+
+        text = '<?xml version="1.0" encoding="UTF-8"?><wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:opengeo="http://opengeo.org" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://opengeo.org http://demo.opengeo.org:80/geoserver/wfs?service=WFS&version=1.0.0&request=DescribeFeatureType&typeName=opengeo:roads http://www.opengis.net/wfs http://demo.openg [...]
+
+        features = parser.read(text);
+
+        t.eq(features.length, 1,
+             "Parsing GML GetFeatureInfo response from Geoserver succesfull");
+
+        t.eq(features[0].attributes.cat, '3',
+             "Attribute cat contains the right value");
+
+    }
+    
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/WMTSCapabilities.html b/tests/Format/WMTSCapabilities.html
new file mode 100644
index 0000000..7039707
--- /dev/null
+++ b/tests/Format/WMTSCapabilities.html
@@ -0,0 +1,20 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+    function test_initialize(t) {
+        
+        t.plan(1);
+        var format = new OpenLayers.Format.WMTSCapabilities({
+            version: "foo"
+        });
+        t.eq(format.version, "foo", "version set on format");
+        
+    }
+    
+    </script> 
+</head> 
+<body>
+</body> 
+</html> 
diff --git a/tests/Format/WMTSCapabilities/v1_0_0.html b/tests/Format/WMTSCapabilities/v1_0_0.html
new file mode 100644
index 0000000..176a054
--- /dev/null
+++ b/tests/Format/WMTSCapabilities/v1_0_0.html
@@ -0,0 +1,323 @@
+<html>
+<head>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+        function test_ows(t) {
+            t.plan(17);
+            var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+            var doc = new OpenLayers.Format.XML().read(xml);
+            var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
+            // ows:ServiceIdentification
+            var serviceIdentification = obj.serviceIdentification;
+            t.eq(serviceIdentification.title, "Web Map Tile Service", "ows:ServiceIdentification title is correct");
+            t.eq(serviceIdentification.serviceTypeVersion, "1.0.0", "ows:ServiceIdentification serviceTypeVersion is correct");
+            t.eq(serviceIdentification.serviceType.value, "OGC WMTS", "ows:ServiceIdentification serviceType is correct");
+
+            // ows:ServiceProvider
+            var serviceProvider = obj.serviceProvider;
+            t.eq(serviceProvider.providerName, "MiraMon", "ows:ServiceProvider providerName is correct");
+            t.eq(serviceProvider.providerSite, "http://www.creaf.uab.es/miramon", "ows:ServiceProvider providerSite is correct");
+            t.eq(serviceProvider.serviceContact.individualName, "Joan Maso Pau", "ows:ServiceProvider individualName is correct");
+            t.eq(serviceProvider.serviceContact.positionName, "Senior Software Engineer", "ows:ServiceProvider positionName is correct");
+            t.eq(serviceProvider.serviceContact.contactInfo.address.administrativeArea, "Barcelona", "ows:ServiceProvider address administrativeArea is correct");
+            t.eq(serviceProvider.serviceContact.contactInfo.address.city, "Bellaterra", "ows:ServiceProvider address city is correct");
+            t.eq(serviceProvider.serviceContact.contactInfo.address.country, "Spain", "ows:ServiceProvider address country is correct");
+            t.eq(serviceProvider.serviceContact.contactInfo.address.deliveryPoint, "Fac Ciencies UAB", "ows:ServiceProvider address deliveryPoint is correct");
+            t.eq(serviceProvider.serviceContact.contactInfo.address.electronicMailAddress, "joan.maso at uab.es", "ows:ServiceProvider address electronicMailAddress is correct");
+            t.eq(serviceProvider.serviceContact.contactInfo.address.postalCode, "08193", "ows:ServiceProvider address postalCode is correct");
+            t.eq(serviceProvider.serviceContact.contactInfo.phone.voice, "+34 93 581 1312", "ows:ServiceProvider phone voice is correct");
+
+            // ows:OperationsMetadata
+            var operationsMetadata = obj.operationsMetadata;
+            t.eq(operationsMetadata.GetCapabilities.dcp.http.get, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetCapabilities url is correct");
+            t.eq(operationsMetadata.GetFeatureInfo.dcp.http.get, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetFeatureInfo url is correct");
+            t.eq(operationsMetadata.GetTile.dcp.http.get, "http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?", "ows:OperationsMetadata GetTile url is correct");
+        }
+    
+        function test_layers(t) {
+            t.plan(21);
+            var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+            var doc = new OpenLayers.Format.XML().read(xml);
+    
+            var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
+            var contents = obj.contents;
+    
+            var numOfLayers = contents.layers.length;
+            t.eq(numOfLayers, 1, "correct count of layers");
+
+            var layer = contents.layers[0];
+            t.eq(layer.abstract, "Coastline/shorelines (BA010)", "layer abstract is correct");
+            t.eq(layer.identifier, "coastlines", "layer identifier is correct");
+            t.eq(layer.title, "Coastlines", "layer title is correct");
+
+            var numOfFormats = layer.formats.length;
+            t.eq(numOfFormats, 2, "correct count of formats");
+            t.eq(layer.formats[0], "image/png", "format image/png is correct");
+            t.eq(layer.formats[1], "image/gif", "format image/gif is correct");
+
+            var numOfStyles = layer.styles.length;
+            t.eq(numOfStyles, 2, "correct count of styles");
+            t.eq(layer.styles[0].identifier, "DarkBlue", "style 0 identifier is correct");
+            t.eq(layer.styles[0].isDefault, true, "style 0 isDefault is correct");
+            t.eq(layer.styles[0].title, "Dark Blue", "style 0 title is correct");
+            t.eq(layer.styles[1].identifier, "thickAndRed", "style 1 identifier is correct");
+            t.ok(!layer.styles[1].isDefault, "style 1 isDefault is correct");
+            t.eq(layer.styles[1].title, "Thick And Red", "style 1 title is correct");
+            //t.eq(layer.styles[1].abstract, "Specify this style if you want your maps to have thick red coastlines. ", "style 1 abstract is correct");
+
+            t.eq(layer.tileMatrixSetLinks.length, 1, "correct count of tileMatrixSetLinks");
+            t.eq(layer.tileMatrixSetLinks[0].tileMatrixSet, "BigWorld", "tileMatrixSet is correct");
+
+            var wgs84Bbox = layer.bounds;
+            t.ok(wgs84Bbox instanceof OpenLayers.Bounds, "wgs84BoudingBox instance of OpenLayers.Bounds");
+            t.eq(wgs84Bbox.left, -180.0, "wgs84BoudingBox left is correct");
+            t.eq(wgs84Bbox.right, 180.0, "wgs84BoudingBox right is correct");
+            t.eq(wgs84Bbox.bottom, -90.0, "wgs84BoudingBox bottom is correct");
+            t.eq(wgs84Bbox.top, 90.0, "wgs84BoudingBox top is correct");
+            
+        }
+
+        function test_tileMatrixSets(t) {
+            t.plan(19);
+            var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+            var doc = new OpenLayers.Format.XML().read(xml);
+    
+            var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
+
+            var tileMatrixSets = obj.contents.tileMatrixSets;
+            t.ok(tileMatrixSets['BigWorld'], "tileMatrixSets 'BigWorld' found");
+            var bigWorld = tileMatrixSets['BigWorld'];
+            t.eq(bigWorld.identifier, "BigWorld", "tileMatrixSets identifier is correct");
+            t.eq(bigWorld.matrixIds.length, 2, "tileMatrix count is correct");
+            t.eq(bigWorld.matrixIds[0].identifier, "1e6", "tileMatrix 0 identifier is correct");
+            t.eq(bigWorld.matrixIds[0].matrixHeight, 50000, "tileMatrix 0 matrixHeight is correct");
+            t.eq(bigWorld.matrixIds[0].matrixWidth, 60000, "tileMatrix 0 matrixWidth is correct");
+            t.eq(bigWorld.matrixIds[0].scaleDenominator, 1000000, "tileMatrix 0 scaleDenominator is correct");
+            t.eq(bigWorld.matrixIds[0].tileWidth, 256, "tileMatrix 0 tileWidth is correct");
+            t.eq(bigWorld.matrixIds[0].tileHeight, 256, "tileMatrix 0 tileHeight is correct");
+            t.eq(bigWorld.matrixIds[0].topLeftCorner.lon, -180, "tileMatrix 0 topLeftCorner.lon is correct");
+            t.eq(bigWorld.matrixIds[0].topLeftCorner.lat, 84, "tileMatrix 0 topLeftCorner.lat is correct");
+
+            t.eq(bigWorld.matrixIds[1].identifier, "2.5e6", "tileMatrix 1 identifier is correct");
+            t.eq(bigWorld.matrixIds[1].matrixHeight, 7000, "tileMatrix 1 matrixHeight is correct");
+            t.eq(bigWorld.matrixIds[1].matrixWidth, 9000, "tileMatrix 1 matrixWidth is correct");
+            t.eq(bigWorld.matrixIds[1].scaleDenominator, 2500000, "tileMatrix 1 scaleDenominator is correct");
+            t.eq(bigWorld.matrixIds[1].tileWidth, 256, "tileMatrix 1 tileWidth is correct");
+            t.eq(bigWorld.matrixIds[1].tileHeight, 256, "tileMatrix 1 tileHeight is correct");
+            t.eq(bigWorld.matrixIds[1].topLeftCorner.lon, -180, "tileMatrix 1 topLeftCorner.lon is correct");
+            t.eq(bigWorld.matrixIds[1].topLeftCorner.lat, 84, "tileMatrix 1 topLeftCorner.lat is correct");
+        }
+        
+        function test_createLayer(t) {
+            t.plan(6);
+            
+            var format = new OpenLayers.Format.WMTSCapabilities();
+
+            var xml = document.getElementById("ogcsample").firstChild.nodeValue;
+            var doc = new OpenLayers.Format.XML().read(xml);
+    
+            var caps = format.read(doc);
+            var layer;
+            
+            var success = true;
+            try {
+                // incomplete config (missing matrixSet)
+                layer = format.createLayer(caps, {
+                    layer: "coastlines"
+                });
+            } catch (err) {
+                success = false;
+            }
+            t.ok(!success, "createLayer throws error if provided incomplete layer config");
+            
+            // bogus layer identifier
+            layer = format.createLayer(caps, {
+                layer: "foo",
+                matrixSet: "BigWorld"
+            });
+            t.eq(layer, undefined, "createLayer returns undefined given bad layer identifier");
+            
+            // bogus matrixSet identifier
+            layer = format.createLayer(caps, {
+                layer: "coastlines",
+                matrixSet: "TheWorld"
+            });
+            t.eq(layer, undefined, "createLayer returns undefined given bad matrixSet identifier");
+            
+            layer = format.createLayer(caps, {
+                layer: "coastlines",
+                matrixSet: "BigWorld"
+            });
+            t.ok(layer instanceof OpenLayers.Layer.WMTS, "correct instance");
+            
+            t.eq(layer.matrixIds.length, 2, "correct matrixIds length");
+            t.eq(layer.name, "Coastlines", "correct layer title");
+            
+        }
+        
+    </script>
+</head>
+<body>
+
+<!--
+OGC example below taken from
+http://schemas.opengis.net/wmts/1.0/examples/wmtsGetCapabilities_response.xml
+-->
+<div id="ogcsample"><!--
+<?xml version="1.0" encoding="UTF-8"?>
+<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd" version="1.0.0">
+    <ows:ServiceIdentification>
+        <ows:Title>Web Map Tile Service</ows:Title>
+        <ows:Abstract>Service that contrains the map access interface to some TileMatrixSets</ows:Abstract>
+        <ows:Keywords>
+            <ows:Keyword>tile</ows:Keyword>
+            <ows:Keyword>tile matrix set</ows:Keyword>
+            <ows:Keyword>map</ows:Keyword>
+        </ows:Keywords>
+        <ows:ServiceType>OGC WMTS</ows:ServiceType>
+        <ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
+        <ows:Fees>none</ows:Fees>
+        <ows:AccessConstraints>none</ows:AccessConstraints>
+    </ows:ServiceIdentification>
+    <ows:ServiceProvider>
+        <ows:ProviderName>MiraMon</ows:ProviderName>
+        <ows:ProviderSite xlink:href="http://www.creaf.uab.es/miramon"/>
+        <ows:ServiceContact>
+            <ows:IndividualName>Joan Maso Pau</ows:IndividualName>
+            <ows:PositionName>Senior Software Engineer</ows:PositionName>
+            <ows:ContactInfo>
+                <ows:Phone>
+                    <ows:Voice>+34 93 581 1312</ows:Voice>
+                    <ows:Facsimile>+34 93 581 4151</ows:Facsimile>
+                </ows:Phone>
+                <ows:Address>
+                    <ows:DeliveryPoint>Fac Ciencies UAB</ows:DeliveryPoint>
+                    <ows:City>Bellaterra</ows:City>
+                    <ows:AdministrativeArea>Barcelona</ows:AdministrativeArea>
+                    <ows:PostalCode>08193</ows:PostalCode>
+                    <ows:Country>Spain</ows:Country>
+                    <ows:ElectronicMailAddress>joan.maso at uab.es</ows:ElectronicMailAddress>
+                </ows:Address>
+            </ows:ContactInfo>
+        </ows:ServiceContact>
+    </ows:ServiceProvider>
+    <ows:OperationsMetadata>
+        <ows:Operation name="GetCapabilities">
+            <ows:DCP>
+                <ows:HTTP>
+                    <ows:Get xlink:href="http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?">
+                        <ows:Constraint name="GetEncoding">
+                            <ows:AllowedValues>
+                                <ows:Value>KVP</ows:Value>
+                            </ows:AllowedValues>
+                        </ows:Constraint>
+                    </ows:Get>
+                </ows:HTTP>
+            </ows:DCP>
+        </ows:Operation>
+        <ows:Operation name="GetTile">
+            <ows:DCP>
+                <ows:HTTP>
+                    <ows:Get xlink:href="http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?"/>
+                </ows:HTTP>
+            </ows:DCP>
+        </ows:Operation>
+        <ows:Operation name="GetFeatureInfo">
+            <ows:DCP>
+                <ows:HTTP>
+                    <ows:Get xlink:href="http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?"/>
+                </ows:HTTP>
+            </ows:DCP>
+        </ows:Operation>
+    </ows:OperationsMetadata>
+    <Contents>
+        <Layer>
+            <ows:Title>Coastlines</ows:Title>
+            <ows:Abstract>Coastline/shorelines (BA010)</ows:Abstract>
+            <ows:WGS84BoundingBox>
+                <ows:LowerCorner>-180 -90</ows:LowerCorner>
+                <ows:UpperCorner>180 90</ows:UpperCorner>
+            </ows:WGS84BoundingBox>
+            <ows:Identifier>coastlines</ows:Identifier>
+            <Style isDefault="true">
+                <ows:Title>Dark Blue</ows:Title>
+                <ows:Identifier>DarkBlue</ows:Identifier>
+                <LegendURL format="image/png" xlink:href="http://www.miramon.uab.es/wmts/Coastlines/coastlines_darkBlue.png"/>
+            </Style>
+            <Style>
+                <ows:Title>Thick And Red</ows:Title>
+                <ows:Abstract>Specify this style if you want your maps to have thick red coastlines.
+                </ows:Abstract>
+                <ows:Identifier>thickAndRed</ows:Identifier>
+            </Style>
+            <Format>image/png</Format>
+            <Format>image/gif</Format>
+            <Dimension>
+                <ows:Title>Time</ows:Title>
+                <ows:Abstract>Monthly datasets</ows:Abstract>
+                <ows:Identifier>TIME</ows:Identifier>
+                <Value>2007-05</Value>
+                <Value>2007-06</Value>
+                <Value>2007-07</Value>
+            </Dimension>
+            <TileMatrixSetLink>
+                <TileMatrixSet>BigWorld</TileMatrixSet>
+            </TileMatrixSetLink>
+        </Layer>
+        <TileMatrixSet>        
+            <ows:Identifier>BigWorld</ows:Identifier>
+            <ows:SupportedCRS>urn:ogc:def:crs:OGC:1.3:CRS84</ows:SupportedCRS>
+            <TileMatrix>
+                <ows:Identifier>1e6</ows:Identifier>
+                <ScaleDenominator>1e6</ScaleDenominator>        
+                <TopLeftCorner>-180 84</TopLeftCorner>        
+                <TileWidth>256</TileWidth>
+                <TileHeight>256</TileHeight>        
+                <MatrixWidth>60000</MatrixWidth>
+                <MatrixHeight>50000</MatrixHeight>
+            </TileMatrix>
+            <TileMatrix>
+                <ows:Identifier>2.5e6</ows:Identifier>
+                <ScaleDenominator>2.5e6</ScaleDenominator>
+                <TopLeftCorner>-180 84</TopLeftCorner>
+                <TileWidth>256</TileWidth>
+                <TileHeight>256</TileHeight>
+                <MatrixWidth>9000</MatrixWidth>
+                <MatrixHeight>7000</MatrixHeight>
+            </TileMatrix>
+        </TileMatrixSet>
+    </Contents>
+    <Themes>
+        <Theme>
+            <ows:Title>Foundation</ows:Title>
+            <ows:Abstract>"Digital Chart Of The World" data</ows:Abstract>
+            <ows:Identifier>Foundation</ows:Identifier>
+            <Theme>
+                <ows:Title>Boundaries</ows:Title>
+                <ows:Identifier>Boundaries</ows:Identifier>
+                <LayerRef>coastlines</LayerRef>
+                <LayerRef>politicalBoundaries</LayerRef>
+                <LayerRef>depthContours</LayerRef>
+            </Theme>
+            <Theme>
+                <ows:Title>Transportation</ows:Title>
+                <ows:Identifier>Transportation</ows:Identifier>
+                <LayerRef>roads</LayerRef>
+                <LayerRef>railroads</LayerRef>
+                <LayerRef>airports</LayerRef>
+            </Theme>
+        </Theme>
+        <Theme>
+            <ows:Title>World Geology</ows:Title>
+            <ows:Identifier>World Geology</ows:Identifier>
+            <LayerRef>worldAgeRockType</LayerRef>
+            <LayerRef>worldFaultLines</LayerRef>
+            <LayerRef>felsicMagmatic</LayerRef>
+            <LayerRef>maficMagmatic</LayerRef>
+        </Theme>
+    </Themes>
+</Capabilities>
+--></div>
+</body>
+</html>
diff --git a/tests/Format/XML.html b/tests/Format/XML.html
new file mode 100644
index 0000000..a85b6fb
--- /dev/null
+++ b/tests/Format/XML.html
@@ -0,0 +1,858 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    var text =
+        '<?xml version="1.0"?>' + 
+        '<ol:root xmlns="http://namespace.default.net" ' +
+                 'xmlns:ol="http://namespace.openlayers.org" ' + 
+                 'xmlns:ta="http://namespace.testattribute.net">' +
+            '<ol:child ta:attribute="value1" ' +
+                      'attribute="value2">' +
+                'junk1' +
+            '<' + '/ol:child>' +
+            '<ol:child>junk2<' + '/ol:child>' +
+            '<ol:child>junk3<' + '/ol:child>' +
+            '<element>junk4<' + '/element>' + 
+            '<ol:element>junk5<' + '/ol:element>' + 
+            '<ol:p>' +
+                '<ol:a>junk' +
+                '<' + '/ol:a>' + 
+                '<ol:b>junk' +
+                '<' + '/ol:b>' + 
+                '<ol:a>junk' +
+                '<' + '/ol:a>' + 
+            '<' + '/ol:p>' + 
+        '<' + '/ol:root>';
+
+    function test_Format_XML_constructor(t) { 
+        t.plan(13); 
+         
+        var options = {'foo': 'bar'}; 
+        var format = new OpenLayers.Format.XML(options); 
+        t.ok(format instanceof OpenLayers.Format.XML, 
+             "new OpenLayers.Format.XML returns object" ); 
+        t.eq(format.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof format.read, "function", "format has a read function"); 
+        t.eq(typeof format.write, "function", "format has a write function");
+
+        t.ok(!window.ActiveXObject || format.xmldom, "browsers with activeX must have xmldom");
+        
+        // test namespaces
+        t.ok(format.namespaces instanceof Object, "format has namespace object");
+        var namespaces = {"foo": "bar"};
+        format = new OpenLayers.Format.XML({namespaces: namespaces});
+        t.eq(format.namespaces, namespaces, "format.namespaces correctly set in constructor");
+        
+        // test default prefix
+        t.eq(format.defaultPrefix, null, "defaultPrefix is null by default");
+        format = new OpenLayers.Format.XML({defaultPrefix: "foo"});
+        t.eq(format.defaultPrefix, "foo", "defaultPrefix correctly set in constructor");
+
+        // test readers
+        t.ok(format.readers instanceof Object, "format has readers object");
+        var readers = {"foo": "bar"};
+        format = new OpenLayers.Format.XML({readers: readers});
+        t.eq(format.readers, readers, "format.readers correctly set in constructor");
+
+        // test readers
+        t.ok(format.writers instanceof Object, "format has writers object");
+        var writers = {"foo": "bar"};
+        format = new OpenLayers.Format.XML({writers: writers});
+        t.eq(format.writers, writers, "format.writers correctly set in constructor");
+    }
+    
+    function test_destroy(t) {
+        t.plan(1);
+        var format = new OpenLayers.Format.XML();
+        format.destroy();
+        t.eq(format.xmldom, null, "xmldom set to null for all browsers");
+    }
+
+    function test_Format_XML_read(t) {
+        
+        var format = new OpenLayers.Format.XML();
+        t.plan(format.xmldom ? 10 : 9);
+
+        var doc = format.read(text);
+        t.eq(doc.nodeType, 9,
+             "doc has the correct node type");
+        t.eq(doc.nodeName, "#document",
+             "doc has the correct node name");
+        t.ok(doc.documentElement,
+             "ok to access doc.documentElement");
+        t.xml_eq(doc.documentElement, text,
+                 "doc.documentElement correctly read");
+        
+        // read can also be called on the prototype directly
+        doc = OpenLayers.Format.XML.prototype.read(text);
+        t.eq(doc.nodeType, 9,
+             "doc has the correct node type");
+        t.eq(doc.nodeName, "#document",
+             "doc has the correct node name");
+        t.ok(doc.documentElement,
+             "ok to access doc.documentElement");
+        t.xml_eq(doc.documentElement, text,
+                 "doc.documentElement correctly read");
+        
+        // where appropriate, make sure doc is loaded into xmldom property
+        if(format.xmldom) {
+            t.xml_eq(format.xmldom.documentElement, text,
+                     "xmldom.documentElement contains equivalent xml");
+        }
+        
+        // test equivalence with different namespace alias
+        var pre1 = 
+            "<pre1:parent xmlns:pre1='http://namespace'>" +
+                "<pre1:child1>value2</pre1:child1>" +
+                "<pre1:child2 pre1:attr1='foo'>value2</pre1:child2>" +
+                "<pre1:child3 chicken:attr='hot' xmlns:chicken='http://soup'/>" +
+            "</pre1:parent>";
+        var pre2 = 
+            "<pre2:parent xmlns:pre2='http://namespace'>" +
+                "<pre2:child1>value2</pre2:child1>" +
+                "<pre2:child2 pre2:attr1='foo'>value2</pre2:child2>" +
+                "<pre2:child3 pea:attr='hot' xmlns:pea='http://soup'/>" +
+            "</pre2:parent>";
+        var doc1 = format.read(pre1);
+        t.xml_eq(doc1.documentElement, pre2, "read correctly sets namespaces");
+        
+    }
+
+    function test_Format_XML_write(t) {
+        t.plan(2);
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text);
+        var out = format.write(doc);
+        out = out.replace(/[\r\n]/g, '');
+        out = out.replace( /<\?.*\?>/, '')
+        var expected = text.replace(/<\?.*\?>/, '')
+        t.eq(expected, out,
+             "correctly writes an XML DOM doc");
+        var out = format.write(
+          format.getElementsByTagNameNS(doc,
+           "http://namespace.openlayers.org","root")[0]);
+        out = out.replace(/[\r\n]/g, '');
+        out = out.replace( /<\?.*\?>/, '')
+        t.eq(out, expected,
+             "correctly writes an XML DOM node");
+    }
+
+    function test_Format_XML_createElementNS(t) {
+        t.plan(5);
+
+        var format = new OpenLayers.Format.XML();
+        var uri = "http://foo.com";
+        var prefix = "foo";
+        var localName = "bar";
+        var qualifiedName = prefix + ":" + name;
+        var node = format.createElementNS(uri, qualifiedName);
+        t.eq(node.nodeType, 1,
+             "node has correct type");
+        t.eq(node.nodeName, qualifiedName,
+             "node has correct qualified name");
+        t.eq(node.prefix, prefix,
+             "node has correct prefix");
+        t.eq(node.namespaceURI, uri,
+             "node has correct namespace uri");
+        
+        var doc = format.read(text);
+        if (doc.importNode) {
+            node = doc.importNode(node, true);
+        }    
+        t.ok(doc.documentElement.appendChild(node),
+             "node can be appended to a doc root");
+    }
+
+    function test_Format_XML_createTextNode(t) {
+        t.plan(10);
+
+        var format = new OpenLayers.Format.XML();
+        var value, node;
+
+        value = "string";
+        node = format.createTextNode(value);
+        t.eq(node.nodeType, 3,
+             "[string] node has correct type");
+        t.eq(node.nodeName, "#text",
+             "[string] node has correct name");
+        t.eq(node.nodeValue, "string",
+             "[string] node has correct value");
+        
+        value = 0.42;
+        node = format.createTextNode(value);
+        t.eq(node.nodeType, 3,
+             "[number] node has correct type");
+        t.eq(node.nodeName, "#text",
+             "[number] node has correct name");
+        t.eq(node.nodeValue, "0.42",
+             "[number] node has correct value");
+
+        value = false;
+        node = format.createTextNode(value);
+        t.eq(node.nodeType, 3,
+             "[boolean] node has correct type");
+        t.eq(node.nodeName, "#text",
+             "[boolean] node has correct name");
+        t.eq(node.nodeValue, "false",
+             "[boolean] node has correct value");
+
+        var doc = format.read(text);
+        if (doc.importNode) {
+            node = doc.importNode(node, true);
+        }    
+        t.ok(doc.documentElement.appendChild(node),
+             "node can be appended to a doc root");
+    }
+
+    function test_Format_XML_getElementsByTagNameNS(t) {
+        t.plan(5);
+
+        var format = new OpenLayers.Format.XML();
+        var olUri = "http://namespace.openlayers.org";
+        var name = "child";
+        var doc = format.read(text);
+        var nodes = format.getElementsByTagNameNS(doc.documentElement,
+                                                  olUri, name);
+        t.eq(nodes.length, 3,
+             "gets correct number of nodes");
+        var qualifiedName = nodes[0].prefix + ":" + name;
+        t.eq(nodes[0].nodeName, qualifiedName,
+             "first node has correct qualified name");
+        
+        var defaultUri = "http://namespace.default.net";
+        name = "element";
+        nodes = format.getElementsByTagNameNS(doc.documentElement,
+                                                  defaultUri, name);
+        t.eq(nodes.length, 1,
+             "gets correct number of nodes in default namespace");
+        
+        var pList = format.getElementsByTagNameNS(doc.documentElement,
+                                                  olUri, "p");
+        t.eq(pList.length, 1, "got one ol:p element");
+        var p = pList[0];
+        
+        var aList = format.getElementsByTagNameNS(p, olUri, "a");
+        t.eq(aList.length, 2, "got two child ol:a elements");
+        
+        
+        
+    }
+
+    function test_Format_XML_getAttributeNodeNS(t) {
+        t.plan(5);
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text);
+        var olUri = "http://namespace.openlayers.org";
+        var taUri = "http://namespace.testattribute.net";
+        var localNodeName = "child";
+        var localAttrName = "attribute";
+        var nodes = format.getElementsByTagNameNS(doc.documentElement,
+                                                  olUri, localNodeName);
+        var attributeNode = format.getAttributeNodeNS(nodes[0],
+                                                      taUri, localAttrName);
+        var qualifiedName = attributeNode.prefix + ":" + localAttrName;
+
+        t.ok(attributeNode,
+             "returns non-null value");
+        t.eq(attributeNode.nodeType, 2,
+             "attribute node has correct type");
+        t.eq(attributeNode.nodeName, qualifiedName,
+             "attribute node has correct qualified name");
+        t.eq(attributeNode.nodeValue, "value1",
+             "attribute node has correct value");
+        
+        var nullAttribute = format.getAttributeNodeNS(nodes[0],
+                                                      taUri, "nothing");
+        t.ok(nullAttribute === null,
+             "returns null for nonexistent attribute");
+    }
+
+    function test_Format_XML_getAttributeNS(t) {
+        t.plan(2);
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text);
+        var olUri = "http://namespace.openlayers.org";
+        var taUri = "http://namespace.testattribute.net";
+        var localNodeName = "child";
+        var localAttrName = "attribute";
+        var nodes = format.getElementsByTagNameNS(doc.documentElement,
+                                                  olUri, localNodeName);
+        var attributeValue = format.getAttributeNS(nodes[0],
+                                                   taUri, localAttrName);
+        t.eq(attributeValue, "value1",
+             "got correct attribute value");
+        
+        var emptyValue = format.getAttributeNS(nodes[0],
+                                              taUri, "nothing");
+        t.ok(emptyValue === "",
+             "returns empty string for nonexistent attributes");
+    }
+
+    function test_Format_XML_hasAttributeNS(t) {
+        t.plan(2);
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text);
+        var olUri = "http://namespace.openlayers.org";
+        var taUri = "http://namespace.testattribute.net";
+        var localNodeName = "child";
+        var localAttrName = "attribute";
+        var nodes = format.getElementsByTagNameNS(doc.documentElement,
+                                                  olUri, localNodeName);
+        var found = format.hasAttributeNS(nodes[0], taUri, localAttrName);
+        t.ok(found === true, "returns true for good attribute");
+        
+        found = format.hasAttributeNS(nodes[0], taUri, "nothing");
+        t.ok(found === false, "returns false for bad attribute");
+    }
+    
+    function test_namespaces(t) {
+        t.plan(2);
+        
+        var format = new OpenLayers.Format.XML({
+            namespaces: {
+                "def": "http://example.com/default",
+                "foo": "http://example.com/foo",
+                "bar": "http://example.com/bar"
+            },
+            defaultPrefix: "def"
+        });
+        
+        // test that prototype has not been altered
+        t.eq(OpenLayers.Format.XML.prototype.namespaces, null,
+             "setting namespaces at construction does not modify prototype");
+        
+        // test that namespaceAlias has been set
+        t.eq(format.namespaceAlias["http://example.com/foo"], "foo",
+             "namespaceAlias mapping has been set");
+        
+    }
+    
+    function test_setNamespace(t) {
+        t.plan(3);
+        
+        var format = new OpenLayers.Format.XML();
+        
+        // test that namespaces is an object
+        t.ok(format.namespaces instanceof Object, "empty namespace object set");
+        
+        format.setNamespace("foo", "http://example.com/foo");
+        t.eq(format.namespaces["foo"], "http://example.com/foo", "alias -> uri mapping set");
+        t.eq(format.namespaceAlias["http://example.com/foo"], "foo", "uri -> alias mapping set");
+
+    }
+    
+    function test_readChildNodes(t) {
+        
+        var text = "<?xml version='1.0' encoding='UTF-8'?>" +
+        "<container xmlns='http://example.com/foo'>" +
+            "<marker name='my marker 1'>" +
+                "<position>" +
+                    "<lon>-180</lon>" +
+                    "<lat>90</lat>" +
+                "</position>" +
+                "<detail>some text for first marker</detail>" +
+                "<atom:link xmlns:atom='http://www.w3.org/2005/Atom' href='http://host/path/1'/>" +
+            "</marker>" +
+            "<marker name='my marker 2'>" +
+                "<position>" +
+                    "<lon>180</lon>" +
+                    "<lat>-90</lat>" +
+                "</position>" +
+                "<detail>some text for second marker</detail>" +
+                "<atom:link xmlns:atom='http://www.w3.org/2005/Atom' href='http://host/path/2'/>" +
+            "</marker>" +
+        "</container>";
+        
+        var expect = [
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(-180, 90),
+                {
+                    name: 'my marker 1',
+                    link: 'http://host/path/1',
+                    detail: 'some text for first marker'
+                }
+            ),
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(180, -90),
+                {
+                    name: 'my marker 2',
+                    link: 'http://host/path/2',
+                    detail: 'some text for second marker'
+                }
+            )
+        ];
+        
+        var format = new OpenLayers.Format.XML({
+            defaultPrefix: "foo",
+            namespaces: {
+                "foo": "http://example.com/foo",
+                "atom": "http://www.w3.org/2005/Atom"
+            },
+            readers: {
+                "foo": {
+                    "container": function(node, obj) {
+                        var list = [];
+                        this.readChildNodes(node, list);
+                        obj.list = list;
+                    },
+                    "marker": function(node, list) {
+                        var feature = new OpenLayers.Feature.Vector();
+                        feature.attributes.name = node.getAttribute("name");
+                        this.readChildNodes(node, feature);
+                        list.push(feature);
+                    },
+                    "position": function(node, feature) {
+                        var obj = {};
+                        this.readChildNodes(node, obj);
+                        feature.geometry = new OpenLayers.Geometry.Point(obj.x, obj.y);
+                    },
+                    "lon": function(node, obj) {
+                        obj.x = this.getChildValue(node);
+                    },
+                    "lat": function(node, obj) {
+                        obj.y = this.getChildValue(node);
+                    },
+                    "detail": function(node, feature) {
+                        feature.attributes.detail = this.getChildValue(node);
+                    }
+                },
+                "atom": {
+                    "link": function(node, feature) {
+                        feature.attributes.link = node.getAttribute("href");
+                    }                    
+                }
+            }
+        });
+        
+        // convert text to document node
+        var doc = format.read(text);
+        // read child nodes to get back some object
+        var obj = format.readChildNodes(doc);
+        // start comparing what we got to what we expect
+        var got = obj.list;
+        
+        t.plan(11);
+        t.eq(got.length, expect.length, "correct number of items parsed");
+        t.eq(got[0].geometry.x, expect[0].geometry.x, "correct x coord parsed for marker 1");
+        t.eq(got[0].geometry.y, expect[0].geometry.y, "correct y coord parsed for marker 1");
+        t.eq(got[0].attributes.name, expect[0].attributes.name, "correct name parsed for marker 1");
+        t.eq(got[0].attributes.detail, expect[0].attributes.detail, "correct detail parsed for marker 1");
+        t.eq(got[0].attributes.link, expect[0].attributes.link, "correct link parsed for marker 1");
+        t.eq(got[1].geometry.x, expect[1].geometry.x, "correct x coord parsed for marker 2");
+        t.eq(got[1].geometry.y, expect[1].geometry.y, "correct y coord parsed for marker 2");
+        t.eq(got[1].attributes.name, expect[1].attributes.name, "correct name parsed for marker 2");
+        t.eq(got[1].attributes.detail, expect[1].attributes.detail, "correct detail parsed for marker 2");
+        t.eq(got[1].attributes.link, expect[1].attributes.link, "correct link parsed for marker 2");
+        
+    }
+    
+    function test_writeNode(t) {
+        
+        var features = [
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(-180, 90),
+                {
+                    name: 'my marker 1',
+                    link: 'http://host/path/1',
+                    detail: 'some text for first marker'
+                }
+            ),
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(180, -90),
+                {
+                    name: 'my marker 2',
+                    link: 'http://host/path/2',
+                    detail: 'some text for second marker'
+                }
+            )
+        ];
+
+        var expect = "<?xml version='1.0' encoding='UTF-8'?>" +
+        "<container xmlns='http://example.com/foo'>" +
+            "<marker name='my marker 1'>" +
+                "<position>" +
+                    "<lon>-180</lon>" +
+                    "<lat>90</lat>" +
+                "</position>" +
+                "<detail>some text for first marker</detail>" +
+                "<atom:link xmlns:atom='http://www.w3.org/2005/Atom' href='http://host/path/1'/>" +
+            "</marker>" +
+            "<marker name='my marker 2'>" +
+                "<position>" +
+                    "<lon>180</lon>" +
+                    "<lat>-90</lat>" +
+                "</position>" +
+                "<detail>some text for second marker</detail>" +
+                "<atom:link xmlns:atom='http://www.w3.org/2005/Atom' href='http://host/path/2'/>" +
+            "</marker>" +
+        "</container>";
+        
+        var format = new OpenLayers.Format.XML({
+            defaultPrefix: "foo",
+            namespaces: {
+                "foo": "http://example.com/foo",
+                "atom": "http://www.w3.org/2005/Atom"
+            },
+            writers: {
+                "foo": {
+                    "container": function(features) {
+                        var node = this.createElementNSPlus("container");
+                        var feature;
+                        for(var i=0; i<features.length; ++i) {
+                            feature = features[i];
+                            this.writeNode("marker", features[i], node);
+                        }
+                        return node;
+                    },
+                    "marker": function(feature) {
+                        var node = this.createElementNSPlus("marker", {
+                            attributes: {name: feature.attributes.name}
+                        });
+                        this.writeNode("position", feature.geometry, node);
+                        this.writeNode("detail", feature.attributes.detail, node);
+                        this.writeNode("atom:link", feature.attributes.link, node);
+                        return node;
+                    },
+                    "position": function(geometry) {
+                        var node = this.createElementNSPlus("position");
+                        this.writeNode("lon", geometry.x, node);
+                        this.writeNode("lat", geometry.y, node);
+                        return node;
+                    },
+                    "lon": function(x) {
+                        return this.createElementNSPlus("lon", {
+                            value: x
+                        });
+                    },
+                    "lat": function(y) {
+                        return this.createElementNSPlus("lat", {
+                            value: y
+                        });
+                    },
+                    "detail": function(text) {
+                        return this.createElementNSPlus("detail", {
+                            value: text
+                        });
+                    }
+                },
+                "atom": {
+                    "link": function(href) {
+                        return this.createElementNSPlus("atom:link", {
+                            attributes: {href: href}
+                        });
+                    }
+                }
+            }
+            
+        });
+        
+        t.plan(1);
+        // test that we get what we expect from writeNode
+        var got = format.writeNode("container", features);
+        t.xml_eq(got, expect, "features correctly written");
+    }
+    
+    function test_createElementNSPlus(t) {
+        
+        var format = new OpenLayers.Format.XML({
+            defaultPrefix: "def",
+            namespaces: {
+                "def": "http://example.com/default",
+                "foo": "http://example.com/foo",
+                "bar": "http://example.com/bar"
+            }
+        });
+        
+        var cases = [
+            {
+                description: "unprefixed name with default options",
+                node: format.createElementNSPlus("FooNode"),
+                expect: "<def:FooNode xmlns:def='http://example.com/default'/>"
+            }, {
+                description: "def prefixed name with default options",
+                node: format.createElementNSPlus("def:FooNode"),
+                expect: "<def:FooNode xmlns:def='http://example.com/default'/>"
+            }, {
+                description: "foo prefixed name with default options",
+                node: format.createElementNSPlus("foo:FooNode"),
+                expect: "<foo:FooNode xmlns:foo='http://example.com/foo'/>"
+            }, {
+                description: "unprefixed name with uri option",
+                node: format.createElementNSPlus("FooNode", {
+                    uri: "http://example.com/elsewhere"
+                }),
+                expect: "<FooNode xmlns='http://example.com/elsewhere'/>"
+            }, {
+                description: "foo prefixed name with uri option (overriding format.namespaces)",
+                node: format.createElementNSPlus("foo:FooNode", {
+                    uri: "http://example.com/elsewhere"
+                }),
+                expect: "<foo:FooNode xmlns:foo='http://example.com/elsewhere'/>"
+            }, {
+                description: "foo prefixed name with attributes option",
+                node: format.createElementNSPlus("foo:FooNode", {
+                    attributes: {
+                        "id": "123",
+                        "foo:attr1": "namespaced attribute 1",
+                        "bar:attr2": "namespaced attribute 2"
+                    }
+                }),
+                expect: "<foo:FooNode xmlns:foo='http://example.com/foo' xmlns:bar='http://example.com/bar' id='123' foo:attr1='namespaced attribute 1' bar:attr2='namespaced attribute 2'/>"
+            }, {
+                description: "foo prefixed name with attributes and value options",
+                node: format.createElementNSPlus("foo:FooNode", {
+                    attributes: {"id": "123"},
+                    value: "text value"
+                }),
+                expect: "<foo:FooNode xmlns:foo='http://example.com/foo' id='123'>text value<" + "/foo:FooNode>"
+            }, {
+                description: "value of 0 gets appended as a text node",
+                node: format.createElementNSPlus("foo:bar", {value: 0}),
+                expect: "<foo:bar xmlns:foo='http://example.com/foo'>0</foo:bar>"
+            }, {
+                description: "value of 0.42 gets appended as a text node",
+                node: format.createElementNSPlus("foo:bar", {value: 0.42}),
+                expect: "<foo:bar xmlns:foo='http://example.com/foo'>0.42</foo:bar>"
+            }, {
+                description: "value of true gets appended as a text node",
+                node: format.createElementNSPlus("foo:bar", {value: true}),
+                expect: "<foo:bar xmlns:foo='http://example.com/foo'>true</foo:bar>"
+            }, {
+                description: "value of false gets appended as a text node",
+                node: format.createElementNSPlus("foo:bar", {value: false}),
+                expect: "<foo:bar xmlns:foo='http://example.com/foo'>false</foo:bar>"
+            }, {
+                description: "null value does not get appended as a text node",
+                node: format.createElementNSPlus("foo:bar", {value: null}),
+                expect: "<foo:bar xmlns:foo='http://example.com/foo'/>"
+            }, {
+                description: "undefined value does not get appended as a text node",
+                node: format.createElementNSPlus("foo:bar"),
+                expect: "<foo:bar xmlns:foo='http://example.com/foo'/>"
+            }
+        ];
+        
+        t.plan(cases.length);
+        var test;
+        for(var i=0; i<cases.length; ++i) {
+            test = cases[i];
+            t.xml_eq(test.node, test.expect, test.description);
+        }
+        
+    }
+    
+    function test_setAttributes(t) {
+        
+        var format = new OpenLayers.Format.XML({
+            defaultPrefix: "def",
+            namespaces: {
+                "def": "http://example.com/default",
+                "foo": "http://example.com/foo",
+                "bar": "http://example.com/bar"
+            }
+        });
+        
+        var cases = [
+            {
+                description: "unprefixed attribute",
+                node: format.createElementNSPlus("foo:Node"),
+                attributes: {"id": "123"},
+                expect: "<foo:Node xmlns:foo='http://example.com/foo' id='123'/>"
+            }, {
+                description: "foo prefixed attribute",
+                node: format.createElementNSPlus("foo:Node"),
+                attributes: {"foo:id": "123"},
+                expect: "<foo:Node xmlns:foo='http://example.com/foo' foo:id='123'/>"
+            }, {
+                description: "foo prefixed attribute with def prefixed node",
+                node: format.createElementNSPlus("def:Node"),
+                attributes: {"foo:id": "123"},
+                expect: "<def:Node xmlns:def='http://example.com/default' xmlns:foo='http://example.com/foo' foo:id='123'/>"
+            }, {
+                description: "multiple attributes",
+                node: format.createElementNSPlus("def:Node"),
+                attributes: {"id": "123", "foo": "bar"},
+                expect: "<def:Node xmlns:def='http://example.com/default' id='123' foo='bar'/>"
+            }
+        ];
+        
+        t.plan(cases.length);
+        var test;
+        for(var i=0; i<cases.length; ++i) {
+            test = cases[i];
+            format.setAttributes(test.node, test.attributes);
+            t.xml_eq(test.node, test.expect, test.description);
+        }
+        
+    }
+
+    function test_keepData(t) { 
+        t.plan(2);
+
+        var options = {'keepData': true};
+        var format = new OpenLayers.Format.XML(options); 
+        format.read(text);
+
+        t.ok(format.data != null, 'data property is not null after read with keepData=true');
+        t.eq(format.data.documentElement.tagName,'ol:root','keepData keeps the right data');
+    }
+
+    function test_getChildValue(t) {
+
+        t.plan(1);
+
+        var text =
+            "<?xml version='1.0' encoding='UTF-8'?>" +
+            "<root>" +
+                "x<!-- comment -->y<!-- comment 2 --><![CDATA[z]]>z<foo />&#x79;" +
+            "</root>";
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text).documentElement;
+
+        t.eq(format.getChildValue(doc), "xyzzy", "child value skips comments, concatenates multiple values, reads through entities");
+
+    }
+    
+    function test_getChildEl(t) {
+
+        t.plan(3);
+
+        var text =
+            "<?xml version='1.0' encoding='UTF-8'?>" +
+            "<root>" +
+                "<!-- comment -->" +
+                "<a>x</a>" +
+                "<b>x</b>" +
+            "</root>";
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text).documentElement;
+
+        var a = format.getChildEl(doc);
+        t.eq(a.nodeName, "a", "first element found correctly");
+        
+        a = format.getChildEl(doc, "a");
+        t.eq(b, null, "first child element matches the given name");
+
+        var b = format.getChildEl(doc, "b");
+        t.eq(b, null, "first child element does not match the given name");
+
+    }
+    
+    function test_getNextEl(t) {
+        t.plan(5);
+
+        var text =
+            "<?xml version='1.0' encoding='UTF-8'?>" +
+            "<root>" +
+                "<!-- comment -->" +
+                "<a>x</a>" +
+                "<!-- comment -->" +
+                "<b xmlns='urn:example'>x</b>" +
+            "</root>";
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text).documentElement;
+
+        var a = format.getChildEl(doc);
+        
+        var b = format.getNextEl(a);
+        t.eq(b && b.nodeName, "b", "next element correctly found");
+        
+        b = format.getNextEl(a, "b");
+        t.eq(b && b.nodeName, "b", "next element correctly found when name supplied");
+
+        b = format.getNextEl(a, "c");
+        t.eq(b, null, "null returned when name does not match next element");
+
+        b = format.getNextEl(a, null, "urn:example");
+        t.eq(b && b.nodeName, "b", "next element correctly found when namespace supplied");
+
+        b = format.getNextEl(a, null, "foo");
+        t.eq(b, null, "null returned when namespace does not match next element");
+
+    }
+    
+    function test_isSimpleContent(t) {
+        t.plan(2);
+
+        var text =
+            "<?xml version='1.0' encoding='UTF-8'?>" +
+            "<root>" +
+                "<!-- comment -->" +
+                "<a>x<!-- comment -->y<!-- comment 2 --><![CDATA[z]]>z<foo />&#x79;</a>" +
+                "<!-- comment -->" +
+                "<b>x<!-- comment -->y<!-- comment 2 --><![CDATA[z]]>z&#x79;</b>" +
+            "</root>";
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text).documentElement;
+
+        var a = format.getChildEl(doc);
+        var b = format.getNextEl(a);
+        t.ok(!format.isSimpleContent(a), "<a> content is not simple");
+        t.ok(format.isSimpleContent(b), "<b> content is simple");
+
+    }
+
+    function test_lookupNamespaceURI(t) {
+        
+        t.plan(8);
+
+        var text =
+            "<?xml version='1.0' encoding='UTF-8'?>" +
+            "<root xmlns:baz='urn:baznamespace'>" +
+                "<!-- comment -->" +
+                "<a><foo /></a>" +
+                "<!-- comment -->" +
+                "<b xmlns='urn:example'><!-- comment --><bar foo='value'/></b>" +
+            "</root>";
+
+        var format = new OpenLayers.Format.XML();
+        var doc = format.read(text).documentElement;
+
+        var a = format.getChildEl(doc);
+        t.eq(format.lookupNamespaceURI(a, "baz"), "urn:baznamespace", "prefix lookup on first child");
+
+        var foo = format.getChildEl(a);
+        t.eq(format.lookupNamespaceURI(foo, "baz"), "urn:baznamespace", "prefix lookup on child of first child");
+        
+        var b = format.getNextEl(a);
+        t.eq(format.lookupNamespaceURI(b, null), "urn:example", "default namespace lookup on element");
+        
+        var bar = format.getChildEl(b);
+        t.eq(format.lookupNamespaceURI(bar, null), "urn:example", "default namespace lookup on child");
+        t.eq(format.lookupNamespaceURI(bar, "baz"), "urn:baznamespace", "prefix lookup on child with different default");
+
+        // test that the alias behaves properly
+        var lookup = OpenLayers.Format.XML.lookupNamespaceURI;
+        t.eq(lookup(bar, "baz"), "urn:baznamespace", "(alias) prefix lookup on child with different default");
+
+        var attr = bar.attributes[0];
+        // Internet Explorer didn't have the ownerElement property until 8.
+        var supportsOwnerElement = !!attr.ownerElement;        
+        if(supportsOwnerElement) {
+            t.eq(format.lookupNamespaceURI(attr, null), "urn:example", "default namespace lookup on attribute");
+            t.eq(format.lookupNamespaceURI(attr, "baz"), "urn:baznamespace", "prefix lookup on attribute with different default");
+        } else {
+            t.debug_print("namespace lookup on attributes not supported in this browser");
+            t.ok(true, "namespace lookup on attributes not supported in this browser");
+            t.ok(true, "namespace lookup on attributes not supported in this browser");
+        }
+
+    }
+    
+
+    
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Geometry.html b/tests/Geometry.html
new file mode 100644
index 0000000..c52beff
--- /dev/null
+++ b/tests/Geometry.html
@@ -0,0 +1,344 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script src="data/geos_wkt_intersects.js"></script>
+  <script type="text/javascript">
+    var map; 
+
+    function test_Geometry_constructor (t) {
+        t.plan( 2 );
+        
+        var g = new OpenLayers.Geometry();
+        
+        t.eq(g.CLASS_NAME, "OpenLayers.Geometry", "correct CLASS_NAME")
+        t.ok(OpenLayers.String.startsWith(g.id, "OpenLayers.Geometry_"),
+             "id correctly set");
+    }
+
+
+    function test_Geometry_clone(t) {
+        t.plan(2);
+        var geometry = new OpenLayers.Geometry();
+        var clone = geometry.clone();
+
+        t.eq(clone.CLASS_NAME, "OpenLayers.Geometry", "correct CLASS_NAME")
+        t.ok(OpenLayers.String.startsWith(clone.id, "OpenLayers.Geometry_"),
+             "id correctly set");
+    }
+
+    function test_Geometry_setBounds(t) {
+        t.plan( 2 );
+        
+        var g = new OpenLayers.Geometry();
+        
+      //null object
+        g.setBounds(null);
+        t.ok(g.bounds == null, "setbounds with null value does not crash or set bounds");
+      
+      //no classname object
+        g_clone = {};
+        var object = {
+            'clone': function() { return g_clone; }
+        };
+        g.setBounds(object);
+        t.ok(g.bounds == g_clone, "setbounds with valid object sets bounds, calls clone");
+    }
+
+    function test_Geometry_extendBounds(t) {
+        t.plan(9);
+        
+        OpenLayers.Bounds.prototype._extend = 
+            OpenLayers.Bounds.prototype.extend;
+        OpenLayers.Bounds.prototype.extend = function(b) { 
+            g_extendBounds = b; 
+        };
+        
+        var g = new OpenLayers.Geometry();
+
+      //this.bounds null (calculateBounds(), setBounds() called)
+        g.setBounds = function(b) { g_setBounds = b; };
+        g.calculateBounds = function() { g_calculateBounds = {}; };
+        var object = {};
+        g_setBounds = null;
+        g_calculateBounds = null;
+        g_extendBounds = null;
+        g.extendBounds(object);
+        t.ok(g_calculateBounds != null, "calculateBounds() called when this.bounds is null");
+        t.ok(g_setBounds == object, "setBounds() called when this.bounds is null and calculateBounds() is null too");        
+        t.ok(g_extendBounds != object, "this.bounds.extend() not called when this.bounds is null and calculateBounds() is null too");
+        
+      //this.bounds null (calculateBounds() sets this.bounds:
+      //   -  setBounds() not called
+      //   -  this.bounds.extend() called
+        g_calcBounds = new OpenLayers.Bounds(1,2,3,4);
+        g.calculateBounds = function() { 
+            g_calculateBounds = {}; 
+            this.bounds = g_calcBounds; 
+        };
+        var object = {};
+
+        g_setBounds = null;
+        g_calculateBounds = null;
+        g_extendBounds = null;
+        g.extendBounds(object);
+        t.ok(g_calculateBounds != null, "calculateBounds() called when this.bounds is null");
+        t.ok(g_setBounds == null, "setBounds() not called when this.bounds is null and calculateBounds() sets this.bounds");        
+        t.ok(g_extendBounds == object, "this.bounds.extend() called when this.bounds is null and calculateBounds() sets this.bounds");        
+
+        
+      //this.bounds non-null thus extend()
+      //   -  setBounds() not called
+      //   -  this.bounds.extend() called
+        g_setBounds = null;
+        g_calculateBounds = null;
+        g_extendBounds = null;
+        g.extendBounds(object);
+        t.ok(g_calculateBounds == null, "calculateBounds() not called when this.bounds is non null");
+        t.ok(g_setBounds == null, "setBounds() not called when this.bounds is nonnull");        
+        t.ok(g_extendBounds == object, "this.bounds.extend() called when this.bounds is non-null");        
+
+        OpenLayers.Bounds.prototype.extend = 
+            OpenLayers.Bounds.prototype._extend;
+
+
+    }
+
+    function test_Geometry_getBounds(t) {
+        t.plan(1);
+        
+        var g = new OpenLayers.Geometry();
+        
+        var testBounds = new OpenLayers.Bounds(1,2,3,4);
+        g.bounds = testBounds.clone();
+        
+        t.ok(g.getBounds().equals(testBounds), "getBounds works");
+    }
+    
+    function test_Geometry_atPoint(t) {
+        t.plan(6);
+            
+        var g = new OpenLayers.Geometry();
+    
+        var lonlat = null;
+        var lon = 5;
+        var lat = 10;
+    
+      //null lonlat
+        g.bounds = new OpenLayers.Bounds();
+
+        var atPoint = g.atPoint(lonlat, lon, lat);
+        t.ok(!atPoint, "null lonlat")
+
+      //null this.bounds
+        g.bounds = null;
+        lonlat = new OpenLayers.LonLat(1,2);      
+      
+        atPoint = g.atPoint(lonlat, lon, lat);
+        t.ok(!atPoint, "null this.bounds")
+
+    //toleranceLon/toleranceLat
+
+      //default toleranceLon/toleranceLat
+        OpenLayers.Bounds.prototype._containsLonLat = OpenLayers.Bounds.prototype.containsLonLat;
+        g_Return = {};
+        OpenLayers.Bounds.prototype.containsLonLat = function(ll) {
+            g_bounds = this;
+            return g_Return;
+         }
+
+        var testBounds = new OpenLayers.Bounds(10,20,30,40);
+        g.bounds = testBounds.clone();
+        lonlat = new OpenLayers.LonLat(20,30);
+      
+        g_bounds = null;
+        atPoint = g.atPoint(lonlat);
+        t.ok(g_bounds.equals(testBounds), "default toleranceLon/Lat are 0");
+        t.ok(atPoint == g_Return, "default toleranceLon/Lat returns correctly");
+
+      //real toleranceLon/toleranceLat
+        var testBounds = new OpenLayers.Bounds(10,20,30,40);
+        g.bounds = testBounds.clone();
+        lonlat = new OpenLayers.LonLat(20,30);
+      
+        g_bounds = null;
+        atPoint = g.atPoint(lonlat, lon, lat);
+        testBounds.left -= lon;
+        testBounds.bottom -= lat;
+        testBounds.right += lon;
+        testBounds.top += lat;
+        t.ok(g_bounds.equals(testBounds), "real toleranceLon/Lat are 0");
+        t.ok(atPoint == g_Return, "real toleranceLon/Lat returns correctly");
+
+        OpenLayers.Bounds.prototype.containsLonLat = OpenLayers.Bounds.prototype._containsLonLat;
+    
+    }
+    
+    function test_Geometry_getLength(t) {
+        t.plan(1);
+        
+        var g = new OpenLayers.Geometry();
+        
+        t.eq(g.getLength(), 0, "getLength is 0");
+    }    
+
+    function test_Geometry_getArea(t) {
+        t.plan(1);
+        
+        var g = new OpenLayers.Geometry();
+        
+        t.eq(g.getArea(), 0, "getArea is 0");
+    }
+    
+    function test_Geometry_clearBounds(t) {
+        t.plan(2);
+        
+        var g = new OpenLayers.Geometry();
+        g.parent = new OpenLayers.Geometry();
+
+        g.bounds = "foo";
+        g.parent.bounds = "bar";
+        
+        g.clearBounds();
+        t.ok(g.bounds == null, "bounds is correctly cleared");
+        t.ok(g.parent.bounds == null, "parent geometry bounds is correctly cleared");
+    }
+
+    function test_Geometry_destroy(t) {
+        t.plan( 2 );
+
+        var g = new OpenLayers.Geometry();
+        g.bounds = new OpenLayers.Bounds();
+
+        g_style_destroy = null;
+        g.destroy();
+        
+        t.eq(g.id, null, "id nullified");
+
+        t.eq(g.bounds, null, "bounds nullified");
+
+    }
+
+    function test_Geometry_intersects_geos_wkt(t) {
+        var wkt = new OpenLayers.Format.WKT();
+        var failures = [];
+        var intersect12, intersect21, msg;
+        for (var i = 0; i < geos_test_data.length; i++) {
+            var testcase = geos_test_data[i];
+            f1 = wkt.read(testcase['wkt1']);
+            f2 = wkt.read(testcase['wkt2']);
+            intersect12 = f1.geometry.intersects(f2.geometry);
+            intersect21 = f2.geometry.intersects(f1.geometry);
+            if(intersect12 != testcase.result) {
+                msg = "f1 should " + (testcase.result ? "" : "not ") +
+                      "intersect f2: f1 = '" + testcase['wkt1'] + "' " +
+                      "f2 = '" + testcase['wkt2'] + "'";
+                failures.push(msg);
+            }
+            if(intersect21 != testcase.result) {
+                msg = "f2 should " + (testcase.result ? "" : "not ") +
+                      "intersect f1: f1 = '" + testcase['wkt1'] + "' " +
+                      "f2 = '" + testcase['wkt2'] + "'";
+                failures.push(msg);
+            }
+        }
+        if(failures.length == 0) {
+            t.plan(1);
+            t.ok(true, "all " + geos_test_data.length + " geos tests pass");
+        } else {
+            t.plan(failures.length);
+            for(var f=0; f<failures.length; ++f) {
+                t.fail(failures[f]);
+            }
+        }
+    }
+    
+    function test_distanceToSegment(t) {
+        var dist = OpenLayers.Geometry.distanceToSegment;
+
+        var cases = [{
+            got: dist({x: 0, y: 0}, {x1: 0, y1: 1, x2: 1, y2: 1}),
+            expected: {distance: 1, x: 0, y: 1}
+        }, {
+            got: dist({x: 0, y: 0}, {x1: -1, y1: -1, x2: 0, y2: -1}),
+            expected: {distance: 1, x: 0, y: -1}
+        }, {
+            got: dist({x: 0, y: 0}, {x1: -1, y1: -1, x2: 1, y2: 1}),
+            expected: {distance: 0, x: 0, y: 0}
+        }, {
+            got: dist({x: 1, y: 1}, {x1: 2, y1: 0, x2: 2, y2: 3}),
+            expected: {distance: 1, x: 2, y: 1}
+        }, {
+            got: dist({x: -1, y: -1}, {x1: -2, y1: -2, x2: -1, y2: -3}),
+            expected: {distance: Math.sqrt(2), x: -2, y: -2}
+        }, {
+            got: dist({x: -1, y: 1}, {x1: -3, y1: 1, x2: -1, y2: 3}),
+            expected: {distance: Math.sqrt(2), x: -2, y: 2}
+        }];
+        
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, "case " + i);
+        }
+        
+    }
+
+    function test_fromWKT(t) {
+        
+        var cases = [{
+            wkt: "POINT(1 2)",
+            geom: new OpenLayers.Geometry.Point(1, 2)
+        }, {
+            wkt: "MULTIPOINT((3.5 5.6),(4.8 10.5))",
+            geom: new OpenLayers.Geometry.MultiPoint([
+                new OpenLayers.Geometry.Point(3.5, 5.6),
+                new OpenLayers.Geometry.Point(4.8, 10.5)
+            ])
+        }, {
+            wkt: "LINESTRING(1 2, 3 4)",
+            geom: new OpenLayers.Geometry.LineString([
+                new OpenLayers.Geometry.Point(1, 2),
+                new OpenLayers.Geometry.Point(3, 4)
+            ])
+        }, {
+            wkt: "POLYGON((0 0, 0 4, 4 4, 4 0, 0 0),(1 1, 1 3, 3 3, 3 1, 1 1))",
+            geom: new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(0, 0),
+                    new OpenLayers.Geometry.Point(0, 4),
+                    new OpenLayers.Geometry.Point(4, 4),
+                    new OpenLayers.Geometry.Point(4, 0),
+                    new OpenLayers.Geometry.Point(0, 0)
+                ]),
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(1, 1),
+                    new OpenLayers.Geometry.Point(1, 3),
+                    new OpenLayers.Geometry.Point(3, 3),
+                    new OpenLayers.Geometry.Point(3, 1),
+                    new OpenLayers.Geometry.Point(1, 1)
+                ])
+            ])
+        }, {
+            wkt: "GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))",
+            geom: new OpenLayers.Geometry.Collection([
+                new OpenLayers.Geometry.Point(4, 6),
+                new OpenLayers.Geometry.LineString([
+                    new OpenLayers.Geometry.Point(4, 6),
+                    new OpenLayers.Geometry.Point(7, 10)
+                ])
+            ])
+        }];
+        
+        t.plan(cases.length);
+        var wkt = OpenLayers.Geometry.fromWKT;
+        for(var i=0; i<cases.length; ++i) {
+            t.geom_eq(wkt(cases[i].wkt), cases[i].geom, "case " + i);
+        }
+    }
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Geometry/Collection.html b/tests/Geometry/Collection.html
new file mode 100644
index 0000000..3c19581
--- /dev/null
+++ b/tests/Geometry/Collection.html
@@ -0,0 +1,414 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var coll;
+        
+    function test_Collection_constructor (t) {
+        t.plan( 4 );
+        
+      //null param
+        coll = new OpenLayers.Geometry.Collection();
+        t.ok( coll instanceof OpenLayers.Geometry.Collection, "new OpenLayers.Geometry.Collection returns coll object" );
+        t.eq( coll.CLASS_NAME, "OpenLayers.Geometry.Collection", "coll.CLASS_NAME is set correctly");
+        t.eq( coll.components.length, 0, "coll.components is set correctly");
+        
+        OpenLayers.Geometry.Collection.prototype._addComponents = 
+            OpenLayers.Geometry.Collection.prototype.addComponents;
+        OpenLayers.Geometry.Collection.prototype.addComponents = 
+            function(comps) { g_addcomponents = comps; };
+
+      //valid param
+        g_addcomponents = null;
+        var components = {};
+        coll = new OpenLayers.Geometry.Collection(components);
+        t.ok(g_addcomponents, components, "addcomponents called on non-null param")
+        
+        OpenLayers.Geometry.Collection.prototype.addComponents = 
+            OpenLayers.Geometry.Collection.prototype._addComponents;
+    }
+
+    function test_Collection_addComponents (t) {
+        t.plan( 10 );
+
+        coll = new OpenLayers.Geometry.Collection();
+
+      //null
+        coll.addComponents(null);
+        t.ok(true, "doesn't break on add null components");
+
+        OpenLayers.Geometry.Collection.prototype._addComponent = 
+            OpenLayers.Geometry.Collection.prototype.addComponent;
+
+        OpenLayers.Geometry.Collection.prototype.addComponent = 
+            function(comp) { g_addComp = comp; g_added++};
+            
+
+      //nonarray argument
+        var g_added = 0;
+        var g_addComp = 0;
+        var component = {};
+        coll.addComponents(component);
+        t.eq(g_added, 1, "added once");
+        t.eq(g_addComp, component, "added component");
+        
+      //array arg
+        var g_added = 0;
+        var g_addComp = 0;
+        var component1 = {};
+        var component2 = {};
+        coll.addComponents([component1, component2]);
+        t.eq(g_added, 2, "added twice");
+        t.eq(g_addComp, component2, "added component");
+
+        OpenLayers.Geometry.Collection.prototype.addComponent = 
+            OpenLayers.Geometry.Collection.prototype._addComponent;
+
+
+
+        coll.addComponents(new OpenLayers.Geometry.Point(0,0));
+        coll.addComponents(new OpenLayers.Geometry.Point(10,10));
+        t.eq( coll.components.length, 2, "added two components to collection" );
+        bounds = coll.getBounds();
+        t.eq( bounds.left, 0, "left bound is 0" );
+        t.eq( bounds.bottom, 0, "bottom bound is 0" );
+        t.eq( bounds.right, 10, "right bound is 10" );
+        t.eq( bounds.top, 10, "top bound is 10" );
+    }
+
+    function test_Collection_clone (t) {
+        t.plan( 3 );
+        coll = new OpenLayers.Geometry.Collection();
+        coll.addComponents(new OpenLayers.Geometry.Point(0,0));
+        coll.addComponents(new OpenLayers.Geometry.Point(10,10));
+        coll2 = coll.clone(); 
+        t.ok( coll2 instanceof OpenLayers.Geometry.Collection, "coll.clone() returns collection object" );
+        t.eq( coll2.components.length, 2, "coll2.components.length is set correctly");
+        t.ok( coll2.components[0] instanceof OpenLayers.Geometry.Point,
+            "coll2.components.length is set correctly");
+    }
+
+    function test_Collection_removeComponents (t) {
+        t.plan( 5 );
+        coll = new OpenLayers.Geometry.Collection();
+        point = new OpenLayers.Geometry.Point(0,0);
+        coll.addComponents(point);
+        coll.addComponents(new OpenLayers.Geometry.Point(10,10));
+        coll.removeComponents(coll.components[0]);
+        t.eq( coll.components.length, 1, "coll.components.length is smaller after removeComponent" );
+        t.ok( coll.bounds == null, "bounds are nullified after call to remove (to trigger recalc on getBounds()");
+        bounds = coll.getBounds();
+        t.eq( bounds.left, 10, "left bound is 10 after removeComponent" );
+        t.eq( bounds.bottom, 10, "bottom bound is 10 after removeComponent" );
+        
+        coll = new OpenLayers.Geometry.Collection();
+        for(var i=0; i<5; ++i) {
+            coll.addComponents(
+                new OpenLayers.Geometry.Point(Math.random(), Math.random())
+            );
+        }
+        coll.removeComponents(coll.components);
+        t.eq(coll.components.length, 0,
+             "remove components even works with multiple components");
+        
+    }
+    
+    function test_Collection_calculateBounds(t) {
+        t.plan( 9 );
+        
+        var coll = new OpenLayers.Geometry.Collection();
+        coll.calculateBounds();
+        t.eq(coll.bounds, null, "null components list gives null bounds on calculation()");
+
+        var p1 = new OpenLayers.Geometry.Point(10,20);
+        var p2 = new OpenLayers.Geometry.Point(30,40);
+        
+        var components = [p1, p2];
+        coll = new OpenLayers.Geometry.Collection(components);
+        
+        coll.calculateBounds();
+        
+        t.eq(coll.bounds.left, 10, "good left bounds");
+        t.eq(coll.bounds.bottom, 20, "good bottom bounds");
+        t.eq(coll.bounds.right, 30, "good right bounds");
+        t.eq(coll.bounds.top, 40, "good top bounds");
+
+        var newPoint = new OpenLayers.Geometry.Point(60,70);
+        coll.addComponent(newPoint);
+        coll.calculateBounds();
+        
+        t.eq(coll.bounds.left, 10, "good left bounds");
+        t.eq(coll.bounds.bottom, 20, "good bottom bounds");
+        t.eq(coll.bounds.right, 60, "good right bounds");
+        t.eq(coll.bounds.top, 70, "good top bounds");
+    }
+    
+    function test_Collection_equals(t) {
+        t.plan(1);
+        var geom = new OpenLayers.Geometry.Collection();
+        t.ok(!geom.equals(), "collection.equals() returns false for undefined");
+    }
+
+    function test_Collection_addComponent(t)   {
+        t.plan(10);
+        
+        var coll = new OpenLayers.Geometry.Collection();
+        
+        //null
+        coll.addComponent(null);
+        t.ok(!coll.addComponent(null),
+             "addComponent returns false for bad component")        
+
+        //good component
+        var component = new OpenLayers.Geometry.Point(3,4);
+        t.ok(coll.addComponent(component),
+             "addComponent returns true for good component");
+        t.ok(coll.bounds == null, "bounds cache correctly cleared");         
+         
+        var foundComponent = false;
+        for(var i=0; i< coll.components.length; i++) {
+            if (coll.components[i].equals(component)) {
+                foundComponent = true;
+            }
+        }
+        t.ok(foundComponent, "component added to internal array");
+        
+        // restricted components
+        coll.componentTypes = ["OpenLayers.Geometry.Point",
+                               "OpenLayers.Geometry.LineString"];
+        var point1 = new OpenLayers.Geometry.Point(0,0);
+        var point2 = new OpenLayers.Geometry.Point(1,1);
+        var line = new OpenLayers.Geometry.LineString([point1, point2]);
+        var multipoint = new OpenLayers.Geometry.MultiPoint([point1, point2]);
+        
+        t.ok(coll.addComponent(point1),
+             "addComponent returns true for 1st geometry type in componentTypes");
+        t.ok(OpenLayers.Util.indexOf(coll.components, point1) > -1,
+             "addComponent adds 1st restricted type to components array");
+        t.ok(coll.addComponent(line),
+             "addComponent returns true for 2nd geometry type in componentTypes");
+        t.ok(OpenLayers.Util.indexOf(coll.components, point1) > -1,
+             "addComponent adds 2nd restricted type to components array");
+        t.ok(!coll.addComponent(multipoint),
+             "addComponent returns false for geometry type not in componentTypes");
+        t.ok(OpenLayers.Util.indexOf(coll.components, multipoint) == -1,
+             "addComponent doesn't add restricted type to component array");
+
+    }
+    
+    function test_collection_getLength(t) {
+        t.plan(2);
+        
+      //null
+        var coll = new OpenLayers.Geometry.Collection();
+        t.eq( coll.getLength(), 0, "null coll has 0 getlength");
+            
+      //valid
+        coll.components = [
+            { 'getLength': function() { return 50; } },
+            { 'getLength': function() { return 15; } }
+        ];
+        t.eq( coll.getLength(), 65, "coll with valid components correctly sums getlength");
+    }
+    
+    function test_collection_getArea(t) {
+        t.plan(2);
+        
+      //null
+        var coll = new OpenLayers.Geometry.Collection();
+        t.eq( coll.getArea(), 0, "null coll has 0 getArea");
+            
+      //valid
+        coll.components = [
+            { 'getArea': function() { return 50; } },
+            { 'getArea': function() { return 15; } }
+        ];
+        t.eq( coll.getArea(), 65, "coll with valid components correctly sums getArea");
+    }
+    
+    function test_transform(t) {
+        t.plan(5);
+        var p1 = new OpenLayers.Geometry.Point(0,0);
+        p1.bounds = "foo";
+        var p2 = new OpenLayers.Geometry.Point(1,1);
+        p2.bounds = "foo";
+        var line = new OpenLayers.Geometry.LineString([p1, p2]);
+        var multipoint = new OpenLayers.Geometry.MultiPoint([p1, p2]);
+        var coll = new OpenLayers.Geometry.Collection([
+            p1, p2, line, multipoint
+        ]);
+        coll.bounds = "foo";
+        
+        var wgs84 = new OpenLayers.Projection("EPSG:4326");
+        var sm = new OpenLayers.Projection("EPSG:900913");
+        coll.transform(wgs84, sm);
+        
+        t.eq(coll.bounds, null, "coll bounds cleared");
+        t.eq(p1.bounds, null, "p1 component bounds cleared");
+        t.eq(p2.bounds, null, "p2 component bounds cleared");
+        t.eq(line.bounds, null, "line component bounds cleared");
+        t.eq(multipoint.bounds, null, "multipoint component bounds cleared");
+
+    }
+
+    function test_getCentroid_pts_only(t) {
+        t.plan(3);
+
+        coll = new OpenLayers.Geometry.Collection();
+        coll.addComponent(new OpenLayers.Geometry.Point(0,0));
+        coll.addComponent(new OpenLayers.Geometry.Point(1,1));
+
+        centroid = coll.getCentroid(true);
+        t.ok(centroid != null, 'The centroid is not null.');
+        t.eq(centroid.x, 0.5, 'The centroid x coordinate is good.');
+        t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.');
+
+        coll.destroy();
+    }
+
+    function test_getCentroid_poly_nonrecursive(t) {
+        t.plan(3);
+
+        coll = new OpenLayers.Geometry.Collection();
+        coll.addComponent(
+            new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(0,0),
+                    new OpenLayers.Geometry.Point(0,1),
+                    new OpenLayers.Geometry.Point(1,1),
+                    new OpenLayers.Geometry.Point(1,0)
+                ])
+            ])
+        );
+        // performing non-recursive getCentroid means this next polygon
+        // is excluded from the centroid computation
+        coll.addComponent(
+            new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(2,2),
+                    new OpenLayers.Geometry.Point(2,3),
+                    new OpenLayers.Geometry.Point(3,3),
+                    new OpenLayers.Geometry.Point(3,2)
+                ])
+            ])
+        );
+
+        centroid = coll.getCentroid();
+        t.ok(centroid != null, 'The centroid is not null.');
+        t.eq(centroid.x, 0.5, 'The centroid x coordinate is good.');
+        t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.');
+
+        coll.destroy();
+    }
+
+    function test_getCentroid_poly_only(t) {
+        t.plan(3);
+
+        coll = new OpenLayers.Geometry.Collection();
+        coll.addComponent(
+            new OpenLayers.Geometry.Polygon([
+                    new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(0,0),
+                    new OpenLayers.Geometry.Point(0,1),
+                    new OpenLayers.Geometry.Point(1,1),
+                    new OpenLayers.Geometry.Point(1,0)
+                ])
+            ])
+        );
+
+        centroid = coll.getCentroid(true);
+        t.ok(centroid != null, 'The centroid is not null.');
+        t.eq(centroid.x, 0.5, 'The centroid x coordinate is good.');
+        t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.');
+
+        coll.destroy();
+    }
+
+    function test_getCentroid_poly_and_pts(t) {
+        t.plan(3);
+
+        coll = new OpenLayers.Geometry.Collection();
+        coll.addComponent(
+            new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(0,0),
+                    new OpenLayers.Geometry.Point(0,1),
+                    new OpenLayers.Geometry.Point(1,1),
+                    new OpenLayers.Geometry.Point(1,0)
+                ])
+            ])
+        );
+
+        // since the polygon above has an area of 1 and these
+        // points have an area of 0, they should not change the centroid
+        coll.addComponent( new OpenLayers.Geometry.Point(2,2) );
+        coll.addComponent( new OpenLayers.Geometry.Point(4,4) );
+
+        centroid = coll.getCentroid(true);
+        t.ok(centroid != null, 'The centroid is not null.');
+        t.eq(centroid.x, 0.5, 'The centroid x coordinate is good.');
+        t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.');
+
+        coll.destroy();
+    }
+
+    function test_getCentroid_poly_big_and_small(t) {
+        t.plan(3);
+
+        coll = new OpenLayers.Geometry.Collection();
+        // polygon w/area=1, centroid=0.5,0.5
+        coll.addComponent(
+            new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(0,0),
+                    new OpenLayers.Geometry.Point(0,1),
+                    new OpenLayers.Geometry.Point(1,1),
+                    new OpenLayers.Geometry.Point(1,0)
+                ])
+            ])
+        );
+
+        // since the polygon above has an area of 1 and this
+        // polygon has an area of 4, the center is weighted 20% toward
+        // the first polygon
+
+        // polygon w/area=4, centroid=5.5,5.5
+        coll.addComponent(
+            new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(4.5,-0.5),
+                    new OpenLayers.Geometry.Point(4.5,1.5),
+                    new OpenLayers.Geometry.Point(6.5,1.5),
+                    new OpenLayers.Geometry.Point(6.5,-0.5)
+                ])
+            ])
+        );
+
+        centroid = coll.getCentroid(true);
+        t.ok(centroid != null, 'The centroid is not null.');
+        t.eq(centroid.x, 4.5, 'The centroid x coordinate is good.');
+        t.eq(centroid.y, 0.5, 'The centroid y coordinate is good.');
+
+        coll.destroy();
+    }
+
+    
+    function test_Collection_destroy(t) {
+        t.plan( 3 );
+        coll = new OpenLayers.Geometry.Collection();
+        coll.addComponents(new OpenLayers.Geometry.Point(0,0));
+        coll.addComponents(new OpenLayers.Geometry.Point(10,10));
+        coll.getBounds();
+        coll.destroy(); 
+        
+        t.ok(coll.components == null, "components array cleared");
+        t.ok(coll.getBounds() == null, "bounds is cleared");
+        t.ok(coll.id == null, "id is cleared");
+
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/Curve.html b/tests/Geometry/Curve.html
new file mode 100644
index 0000000..194bf09
--- /dev/null
+++ b/tests/Geometry/Curve.html
@@ -0,0 +1,157 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var curve;
+    var components = [new OpenLayers.Geometry.Point(10,10), 
+                new OpenLayers.Geometry.Point(0,0)];
+        
+    function test_Curve_constructor (t) {
+        t.plan( 3 );
+        curve = new OpenLayers.Geometry.Curve();
+        t.ok( curve instanceof OpenLayers.Geometry.Curve, "new OpenLayers.Geometry.Curve returns curve object" );
+        t.eq( curve.CLASS_NAME, "OpenLayers.Geometry.Curve", "curve.CLASS_NAME is set correctly");
+        t.eq( curve.components, [], "curve.components is set correctly");
+    }
+
+    function test_Curve_constructor (t) {
+        t.plan( 2 );
+        curve = new OpenLayers.Geometry.Curve(components);
+        t.ok( curve instanceof OpenLayers.Geometry.Curve, "new OpenLayers.Geometry.Curve returns curve object" );
+        t.eq( curve.components.length, 2, "curve.components.length is set correctly");
+    }
+
+    function test_Curve_clone (t) {
+        t.plan( 2 );
+        curve = new OpenLayers.Geometry.Curve(components);
+        curve2 = curve.clone(); 
+        t.ok( curve2 instanceof OpenLayers.Geometry.Curve, "curve.clone() returns curve object" );
+        t.eq( curve2.components.length, 2, "curve2.components.length is set correctly");
+    }
+
+    function test_Curve_calculateBounds(t) {
+        t.plan( 17 );
+
+
+        var curve = new OpenLayers.Geometry.Curve();
+        curve.calculateBounds();
+        t.eq(curve.bounds, null, "bounds null when no components");
+        
+        var p1 = new OpenLayers.Geometry.Point(10,20);
+        var p2 = new OpenLayers.Geometry.Point(30,40);
+        
+        var components = [p1, p2];
+        var curve = new OpenLayers.Geometry.Curve(components);
+        
+        curve.calculateBounds();
+        
+        t.eq(curve.bounds.left, 10, "good left bounds");
+        t.eq(curve.bounds.bottom, 20, "good bottom bounds");
+        t.eq(curve.bounds.right, 30, "good right bounds");
+        t.eq(curve.bounds.top, 40, "good top bounds");
+
+        var newPoint = new OpenLayers.Geometry.Point(60,70);
+        curve.addComponent(newPoint);
+        curve.calculateBounds();
+        
+        t.eq(curve.bounds.left, 10, "good left bounds");
+        t.eq(curve.bounds.bottom, 20, "good bottom bounds");
+        t.eq(curve.bounds.right, 60, "good right bounds");
+        t.eq(curve.bounds.top, 70, "good top bounds");
+
+    //nullifying the bounds
+
+      //before calculation
+        curve = new OpenLayers.Geometry.Curve(components);
+        curve.bounds = null;        
+        curve.calculateBounds();
+        
+        t.eq(curve.bounds.left, 10, "good left bounds");
+        t.eq(curve.bounds.bottom, 20, "good bottom bounds");
+        t.eq(curve.bounds.right, 30, "good right bounds");
+        t.eq(curve.bounds.top, 40, "good top bounds");
+
+      //before addComponent
+        curve.bounds = null;
+        curve.addComponent(newPoint);
+        curve.calculateBounds();
+        
+        t.eq(curve.bounds.left, 10, "good left bounds");
+        t.eq(curve.bounds.bottom, 20, "good bottom bounds");
+        t.eq(curve.bounds.right, 60, "good right bounds");
+        t.eq(curve.bounds.top, 70, "good top bounds");
+
+    }
+
+    function test_Curve_addComponent (t) {
+        t.plan( 8 );
+        curve = new OpenLayers.Geometry.Curve(components);
+        curve.addComponent(new OpenLayers.Geometry.Point(20,30));
+        bounds = curve.getBounds();
+        t.eq( curve.components.length, 3, "new point added to array" );
+        t.eq( bounds.top, 30, "top bound is 30 after addComponent" );
+        t.eq( bounds.right, 20, "right bound is 20 after addComponent" );
+        curve.addComponent(new OpenLayers.Geometry.Point(-20,-30), 1);
+        bounds = curve.getBounds();
+        t.eq( curve.components.length, 4, "new point added to array" );
+        t.eq( bounds.bottom, -30, "bottom bound is -30 after 2nd addComponent" );
+        t.eq( bounds.left, -20, "left bound is 20 after 2nd addComponent" );
+        t.eq( curve.components[1].x, -20,  "new point.lon is -20 (index worked)" );
+        t.eq( curve.components[1].y, -30,  "new point.lat is -30 (index worked)" );
+    }
+
+    function test_Curve_removeComponent (t) {
+        t.plan( 4 );
+        curve = new OpenLayers.Geometry.Curve(components);
+        curve.removeComponent(curve.components[1]);
+        t.eq( curve.components.length, 1, "curve.components.length is smaller after removeComponent" );
+        t.eq( curve.bounds, null, "curve.bounds nullified after removeComponent (for recalculation)" );
+        bounds = curve.getBounds();
+        t.eq( bounds.left, 10, "left bound is 10 after removeComponent" );
+        t.eq( bounds.bottom, 10, "bottom bound is 10 after removeComponent" );
+    }
+
+    function test_Curve_getLength (t) {
+        t.plan( 4 );
+
+      //no components
+        curve = new OpenLayers.Geometry.Curve();
+        curve.components = null;
+        t.eq(curve.getLength(), 0, "curve with no components has length 0");
+
+      //empty components
+        curve.components = [];
+        t.eq(curve.getLength(), 0, "curve with empty components has length 0");
+
+      //single point curve
+        curve.components = [ new OpenLayers.Geometry.Point(0,0) ];        
+        t.eq(curve.getLength(), 0, "curve with only one point has length 0");
+
+      //multipoint
+        var newcomponents = [ new OpenLayers.Geometry.Point(0,0),
+                        new OpenLayers.Geometry.Point(0,10),
+                        new OpenLayers.Geometry.Point(20,10),
+                        new OpenLayers.Geometry.Point(20,-10)
+        ];
+        
+        curve = new OpenLayers.Geometry.Curve(newcomponents);
+        t.eq(curve.getLength(), 50, "curve.getLength returns a reasonably accurate length" );
+    }
+    
+    function test_Curve_destroy(t) {
+        t.plan(1);
+        
+        var curve = new OpenLayers.Geometry.Curve();
+        curve.components = {};
+        
+        curve.destroy();
+        
+        t.ok( curve.components == null, "components is cleared well in destruction");
+    }
+    
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/LineString.html b/tests/Geometry/LineString.html
new file mode 100644
index 0000000..535a054
--- /dev/null
+++ b/tests/Geometry/LineString.html
@@ -0,0 +1,383 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var line;
+    var components = [new OpenLayers.Geometry.Point(10,15), 
+                new OpenLayers.Geometry.Point(0,0)];
+        
+    function test_LineString_constructor (t) {
+        t.plan( 3 );
+        line = new OpenLayers.Geometry.LineString();
+        t.ok( line instanceof OpenLayers.Geometry.LineString, "new OpenLayers.Geometry.LineString returns line object" );
+        t.eq( line.CLASS_NAME, "OpenLayers.Geometry.LineString", "line.CLASS_NAME is set correctly");
+        t.eq( line.components, [], "line.components is set correctly");
+    }
+
+    function test_LineString_constructor (t) {
+        t.plan( 3 );
+        line = new OpenLayers.Geometry.LineString(components);
+        t.ok( line instanceof OpenLayers.Geometry.LineString, "new OpenLayers.Geometry.LineString returns line object" );
+        t.eq( line.CLASS_NAME, "OpenLayers.Geometry.LineString", "line.CLASS_NAME is set correctly");
+        // TBD FIXME, recursion
+        // t.eq( line.components, components, "line.components is set correctly");
+        t.eq( line.components.length, 2, "line.components.length is set correctly");
+    }
+    
+    function test_LineString_toString(t) {
+        t.plan(1);
+        
+        line = new OpenLayers.Geometry.LineString(components);
+        t.eq(line.toString(),
+             "LINESTRING(10 15,0 0)",
+             "toString() returns WKT");
+    }
+    
+    function test_LineString_removeComponent(t) {
+        t.plan(2);
+        
+        OpenLayers.Geometry.Collection.prototype._removeComponent = 
+            OpenLayers.Geometry.Collection.prototype.removeComponent;
+        OpenLayers.Geometry.Collection.prototype.removeComponent = 
+            function(point) { g_removeComponent = point; };
+        
+        line = new OpenLayers.Geometry.LineString(components);
+
+        g_removeComponent = null;
+        line.removeComponent(components[0]);
+        t.ok(g_removeComponent == null, "point not removed if only 2 points in components");
+
+        line.components.push(new OpenLayers.Geometry.Point(4,4));
+        line.removeComponent(components[0]);
+        t.ok(g_removeComponent, components[0], "point removed if 3 points in components");
+        
+        OpenLayers.Geometry.Collection.prototype.removeComponent = 
+            OpenLayers.Geometry.Collection.prototype._removeComponent;
+    }
+    
+    function test_LineString_move(t) {
+        t.plan(4);
+        
+        var components = [new OpenLayers.Geometry.Point(10,15), 
+                new OpenLayers.Geometry.Point(0,0)];
+        var line = new OpenLayers.Geometry.LineString(components);
+        
+        var x0 = components[0].x;
+        var y0 = components[0].y;
+        var x1 = components[1].x;
+        var y1 = components[1].y;
+        
+        var dx = 10 * Math.random();
+        var dy = 10 * Math.random();
+        line.move(dx, dy);
+        
+        t.eq(line.components[0].x, x0 + dx, "move() correctly modifies first x");
+        t.eq(line.components[0].y, y0 + dy, "move() correctly modifies first y");
+        t.eq(line.components[1].x, x1 + dx, "move() correctly modifies second x");
+        t.eq(line.components[1].y, y1 + dy, "move() correctly modifies second y");
+    }
+
+    function test_LineString_rotate(t) {
+        t.plan(6);
+        
+        var components = [new OpenLayers.Geometry.Point(10,15), 
+                          new OpenLayers.Geometry.Point(0,0)];
+        var geometry = new OpenLayers.Geometry.LineString(components);
+        
+        var originals = [];
+        var comp;
+        var angle = 2 * Math.PI * Math.random();
+        var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
+                                                   10 * Math.random());
+        for(var i=0; i<geometry.components.length; ++i) {
+            comp = geometry.components[i];
+            originals[i] = comp.rotate;
+            comp.rotate = function(a, o) {
+                t.ok(true, "rotate called for component " + i);
+                t.ok(a == angle, "rotate called with correct angle");
+                t.ok(o == origin, "rotate called with correct origin");
+            }
+        }
+        geometry.rotate(angle, origin);
+        
+        // restore the original rotate defs
+        for(var i=0; i<geometry.components.length; ++i) {
+            comp.rotate = originals[i];
+        }
+    }
+
+    function test_LineString_resize(t) {
+        t.plan(8);
+        
+        var tolerance = 1e-10;
+
+        var components = [new OpenLayers.Geometry.Point(10 * Math.random(),
+                                                        10 * Math.random()), 
+                          new OpenLayers.Geometry.Point(10 * Math.random(),
+                                                        10 * Math.random())];
+        var geometry = new OpenLayers.Geometry.LineString(components);
+
+        var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
+                                                   10 * Math.random());
+        
+        var scale = 10 * Math.random();
+        
+        var oldLength = geometry.getLength();
+        var ret = geometry.resize(scale, origin);
+        t.ok(ret === geometry, "resize returns geometry");
+        var newLength = geometry.getLength();
+        t.ok((((newLength / oldLength) - scale) / scale) < tolerance,
+             "resize correctly changes the length of a linestring")
+
+        var originals = [];
+        var comp;
+        for(var i=0; i<geometry.components.length; ++i) {
+            comp = geometry.components[i];
+            originals[i] = comp.resize;
+            comp.resize = function(s, o) {
+                t.ok(true, "resize called for component " + i);
+                t.ok(s == scale, "resize called with correct scale");
+                t.ok(o == origin, "resize called with correct origin");
+            }
+        }
+        geometry.resize(scale, origin);
+        
+        // restore the original resize defs
+        for(var i=0; i<geometry.components.length; ++i) {
+            comp.resize = originals[i];
+        }
+        
+    }
+    
+    function test_split(t) {
+        var wkt = OpenLayers.Geometry.fromWKT;
+        
+        var cases = [{
+            msg: "no intersection",
+            g1: "LINESTRING(0 0, 0 1)",
+            g2: "LINESTRING(1 0, 1 1)",
+            exp: null
+        } , {
+            msg: "intersection at midpoint",
+            g1: "LINESTRING(0 0, 1 1)",
+            g2: "LINESTRING(1 0, 0 1)",
+            exp: ["LINESTRING(1 0, 0.5 0.5)", "LINESTRING(0.5 0.5, 0 1)"]
+        }, {
+            msg: "intersection at midpoint (reverse source/target)",
+            g1: "LINESTRING(1 0, 0 1)",
+            g2: "LINESTRING(0 0, 1 1)",
+            exp: ["LINESTRING(0 0, 0.5 0.5)", "LINESTRING(0.5 0.5, 1 1)"]
+        }, {
+            msg: "intersection at endpoint",
+            g1: "LINESTRING(0 0, 1 1)",
+            g2: "LINESTRING(1 0, 1 1)",
+            exp: null
+        }, {
+            msg: "midpoint intersection, no options",
+            g1: "LINESTRING(0 0, 2 2)",
+            g2: "LINESTRING(0 2, 2 0)",
+            exp: ["LINESTRING(0 2, 1 1)", "LINESTRING(1 1, 2 0)"]
+        }, {
+            msg: "midpoint intersection, edge false",
+            opt: {edge: false},
+            g1: "LINESTRING(0 0, 2 2)",
+            g2: "LINESTRING(0 2, 2 0)",
+            exp: null
+        }, {
+            msg: "midpoint intersection, mutual",
+            opt: {mutual: true},
+            g1: "LINESTRING(0 0, 2 2)",
+            g2: "LINESTRING(0 2, 2 0)",
+            exp: [["LINESTRING(0 0, 1 1)", "LINESTRING(1 1, 2 2)"], ["LINESTRING(0 2, 1 1)", "LINESTRING(1 1, 2 0)"]]
+        }, {
+            msg: "close intersection, no tolerance",
+            g1: "LINESTRING(0 0, 0.9 0.9)",
+            g2: "LINESTRING(0 2, 2 0)",
+            exp: null
+        }, {
+            msg: "close intersection, within tolerance",
+            opt: {tolerance: 0.2},
+            g1: "LINESTRING(0 0, 0.9 0.9)",
+            g2: "LINESTRING(0 2, 2 0)",
+            exp: ["LINESTRING(0 2, 0.9 0.9)", "LINESTRING(0.9 0.9, 2 0)"]
+        }];
+        
+        t.plan(cases.length);
+        var c, parts, part, midparts;
+        for(var i=0; i<cases.length; ++i) {
+            c = cases[i];
+            var g1 = wkt(c.g1);
+            var g2 = wkt(c.g2);
+            var got = g1.split(g2, c.opt);
+            var exp = c.exp;
+            if(got instanceof Array) {
+                parts = [];
+                for(var j=0; j<got.length; ++j) {
+                    part = got[j];
+                    if(part instanceof Array) {
+                        midparts = [];
+                        for(var k=0; k<part.length; ++k) {
+                            midparts.push(part[k].toString());
+                        }
+                        parts.push("[" + midparts.join(", ") + "]");
+                    } else {
+                        parts.push(got[j].toString());
+                    }
+                }
+                got = parts.join(", ");
+            }
+            if(exp instanceof Array) {
+                parts = [];
+                for(var j=0; j<exp.length; ++j) {
+                    part = exp[j];
+                    if(part instanceof Array) {
+                        midparts = [];
+                        for(var k=0; k<part.length; ++k) {
+                            midparts.push(wkt(part[k]).toString());
+                        }
+                        parts.push("[" + midparts.join(", ") + "]");
+                    } else {
+                        parts.push(wkt(exp[j]).toString());
+                    }
+                }
+                exp = parts.join(", ");
+            }
+            t.eq(got, exp, "case " + i + ": " +  c.msg);
+        }
+        
+    }
+    
+
+    function test_distanceTo(t) {
+        var wkt = OpenLayers.Geometry.fromWKT;
+        var geoms = [
+            wkt("POINT(0 0)"),
+            wkt("LINESTRING(-2 0, 0 -2, 2 -1, 2 0)")
+        ];
+
+        var cases = [{
+            got: geoms[1].distanceTo(geoms[0]),
+            expected: Math.sqrt(2)
+        }, {
+            got: geoms[1].distanceTo(geoms[0], {details: true}),
+            expected: {
+                distance: Math.sqrt(2),
+                x0: -1, y0: -1,
+                x1: 0, y1: 0
+            }
+        }];
+        
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, "case " + i);
+        }
+        
+    }
+
+    function test_LineString_equals(t) {
+        t.plan(3);
+        
+        var x0 = Math.random() * 100;
+        var y0 = Math.random() * 100;
+        var x1 = Math.random() * 100;
+        var y1 = Math.random() * 100;
+        var point0 = new OpenLayers.Geometry.Point(x0, y0);
+        var point1 = new OpenLayers.Geometry.Point(x1, y1);
+        var geometry = new OpenLayers.Geometry.LineString([point0, point1]);
+        var equal = new OpenLayers.Geometry.LineString([point0, point1]);
+        var offX =  new OpenLayers.Geometry.LineString([
+                            new OpenLayers.Geometry.Point(x0 + 1, y0),
+                            new OpenLayers.Geometry.Point(x1 + 1, y1)]);
+        var offY =  new OpenLayers.Geometry.LineString([
+                            new OpenLayers.Geometry.Point(x0, y0 + 1),
+                            new OpenLayers.Geometry.Point(x1, y1 + 1)]);
+        t.ok(geometry.equals(equal),
+             "equals() returns true for a geometry with equivalent coordinates");
+        t.ok(!geometry.equals(offX),
+             "equals() returns false for a geometry with offset x");
+        t.ok(!geometry.equals(offY),
+             "equals() returns false for a geometry with offset y");
+    }
+
+    
+    function test_getVertices(t) {
+        t.plan(14);
+        
+        var points = [
+            new OpenLayers.Geometry.Point(10, 20),
+            new OpenLayers.Geometry.Point(20, 30),
+            new OpenLayers.Geometry.Point(30, 40),
+            new OpenLayers.Geometry.Point(40, 50)
+        ];
+        var line = new OpenLayers.Geometry.LineString(points);
+        
+        var verts = line.getVertices();
+        t.ok(verts instanceof Array, "got back an array");
+        t.eq(verts.length, points.length, "of correct length length");
+        t.geom_eq(verts[0], points[0], "0: correct geometry");
+        t.geom_eq(verts[1], points[1], "1: correct geometry");
+        t.geom_eq(verts[2], points[2], "2: correct geometry");
+        t.geom_eq(verts[3], points[3], "3: correct geometry");
+        
+        // get nodes only
+        var nodes = line.getVertices(true);
+        t.ok(nodes instanceof Array, "[nodes only] got back an array");
+        t.eq(nodes.length, 2, "[nodes only] of correct length length");
+        t.geom_eq(nodes[0], points[0], "[nodes only] first: correct geometry");
+        t.geom_eq(nodes[1], points[points.length-1], "[nodes only] last: correct geometry");
+
+        // no nodes
+        var nodes = line.getVertices(false);
+        t.ok(nodes instanceof Array, "[no nodes] got back an array");
+        t.eq(nodes.length, 2, "[no nodes] of correct length length");
+        t.geom_eq(nodes[0], points[1], "[no nodes] first: correct geometry");
+        t.geom_eq(nodes[1], points[2], "[no nodes] last: correct geometry");
+
+    }
+    
+    
+    function test_LineString_clone(t) {
+        t.plan(2);
+        
+        var x0 = Math.random() * 100;
+        var y0 = Math.random() * 100;
+        var x1 = Math.random() * 100;
+        var y1 = Math.random() * 100;
+        var point0 = new OpenLayers.Geometry.Point(x0, y0);
+        var point1 = new OpenLayers.Geometry.Point(x1, y1);
+        var geometry = new OpenLayers.Geometry.LineString([point0, point1]);
+        var clone = geometry.clone();
+        t.ok(clone instanceof OpenLayers.Geometry.LineString,
+             "clone() creates an OpenLayers.Geometry.LineString");
+        t.ok(geometry.equals(clone), "clone has equivalent coordinates");
+    }
+    
+    function test_getGeodesicLength(t) {
+        
+        // expected values from http://www.movable-type.co.uk/scripts/latlong-vincenty.html
+        var cases = [{
+            wkt: "LINESTRING(0 0, -10 45)",
+            exp: 5081689.690
+        }, {
+            wkt: "LINESTRING(-10 45, 0 0)",
+            exp: 5081689.690
+        }, {
+            wkt: "LINESTRING(0 0, -10 45, -20 50)",
+            exp: 5081689.690 + 935018.062
+        }];
+        t.plan(cases.length);
+        
+        var geom, got;
+        for(var i=0; i<cases.length; ++i) {
+            geom = new OpenLayers.Geometry.fromWKT(cases[i].wkt);
+            got = geom.getGeodesicLength();
+            t.eq(Math.round(got), Math.round(cases[i].exp), "[case " + i + "] length calculated");
+        }
+        
+    }   
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/LinearRing.html b/tests/Geometry/LinearRing.html
new file mode 100644
index 0000000..e4d6696
--- /dev/null
+++ b/tests/Geometry/LinearRing.html
@@ -0,0 +1,258 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var line;
+    var components = [new OpenLayers.Geometry.Point(10,10), 
+                new OpenLayers.Geometry.Point(0,0)];
+        
+    function test_LinearRing_constructor (t) {
+        t.plan( 6 );
+
+      //null
+        ring = new OpenLayers.Geometry.LinearRing();
+        t.ok( ring instanceof OpenLayers.Geometry.LinearRing, "new OpenLayers.Geometry.LinearRing returns ring object" );
+        t.eq( ring.CLASS_NAME, "OpenLayers.Geometry.LinearRing", "ring.CLASS_NAME is set correctly");
+        t.eq( ring.components, [], "ring.components is set correctly");
+
+      //valid components
+        ring = new OpenLayers.Geometry.LinearRing(components);
+        t.ok( ring instanceof OpenLayers.Geometry.LinearRing, "new OpenLayers.Geometry.LinearRing returns ring object" );
+        t.eq( ring.CLASS_NAME, "OpenLayers.Geometry.LinearRing", "ring.CLASS_NAME is set correctly");
+        t.eq( ring.components.length, 3, "ring.components.length is set correctly");
+    }
+    
+    function test_LinearRing_addComponent(t) {
+        t.plan(13);
+        
+        var ring = new OpenLayers.Geometry.LinearRing();
+ 
+        var point = new OpenLayers.Geometry.Point(0,0);
+        t.ok(ring.addComponent(point),
+             "addComponent returns true for 1st point");
+        t.eq(ring.components.length, 2, "add first point, correct length");
+        t.ok(ring.components[0].equals(point), "point one correct");
+        t.ok(ring.components[0] === ring.components[ring.components.length - 1],
+             "first and last point are the same");
+        
+        newPoint = new OpenLayers.Geometry.Point(10,10);
+        t.ok(ring.addComponent( newPoint ),
+             "addComponent returns true for unique point");
+        t.eq(ring.components.length, 3, "correctly adds 3rd point");
+        t.ok(ring.components[0].equals(point), "point one correct");
+        t.ok(ring.components[1].equals(newPoint), "point one correct");
+        t.ok(ring.components[0] === ring.components[ring.components.length - 1],
+             "first and last point are the same");
+        
+        var length = ring.components.length;
+        var clone = ring.components[length - 1].clone();
+        t.ok(!ring.addComponent(clone),
+             "addComponent returns false for adding a duplicate last point");
+        t.eq(ring.components.length, length,
+             "components remains unchanged after trying to add duplicate point");
+        t.ok(ring.addComponent(clone, length - 1),
+             "addComponent returns true when adding a duplicate with an index");
+        t.eq(ring.components.length, length + 1,
+             "components increase in length after adding a duplicate point with index");
+        
+    }
+    
+    function test_LinearRing_removeComponent(t) {
+        t.plan(11);
+        
+        var components = [new OpenLayers.Geometry.Point(0,0), 
+                    new OpenLayers.Geometry.Point(0,10),
+                    new OpenLayers.Geometry.Point(15,15), 
+                    new OpenLayers.Geometry.Point(10,0)
+                    ];
+        var ring = new OpenLayers.Geometry.LinearRing(components);
+ 
+        ring.removeComponent( ring.components[2] );
+        t.eq(ring.components.length, 4, "removing from linear ring with 5 points: length ok");
+        t.ok(ring.components[0].equals(components[0]), "point one correct");
+        t.ok(ring.components[1].equals(components[1]), "point two correct");
+        t.ok(ring.components[2].equals(components[3]), "point one correct");
+        t.ok(ring.components[0] === ring.components[ring.components.length - 1],
+             "first and last point are the same");
+ 
+        var testBounds = new OpenLayers.Bounds(0,0,10,10);
+        var ringBounds = ring.getBounds();
+        t.ok(ringBounds.equals(testBounds), "bounds correctly recalculated");
+        
+        ring.removeComponent( ring.components[2] );
+        t.eq(ring.components.length, 4, "cant remove from linear ring with only 4 points. new length ok (unchanged)");
+        t.ok(ring.components[0].equals(components[0]), "point one correct");
+        t.ok(ring.components[1].equals(components[1]), "point two correct");
+        t.ok(ring.components[2].equals(components[3]), "point one correct");
+        t.ok(ring.components[0] === ring.components[ring.components.length - 1],
+             "first and last point are the same");
+        
+     }
+    
+    function test_LinearRing_getArea(t) {
+        t.plan(1);
+        var components = [new OpenLayers.Geometry.Point(0,0), 
+                    new OpenLayers.Geometry.Point(0,10),
+                    new OpenLayers.Geometry.Point(10,10), 
+                    new OpenLayers.Geometry.Point(10,0)
+                    ];
+        var ring = new OpenLayers.Geometry.LinearRing(components);
+        
+        t.eq(ring.getArea(), 100, "getArea works lovely");
+    }
+    
+    function test_LinearRing_getLength(t) {
+        t.plan(1);
+        var components = [
+            new OpenLayers.Geometry.Point(0,0), 
+            new OpenLayers.Geometry.Point(0,10),
+            new OpenLayers.Geometry.Point(10,10), 
+            new OpenLayers.Geometry.Point(10,0)
+        ];
+        var ring = new OpenLayers.Geometry.LinearRing(components);
+        t.eq(ring.getLength(), 40, "getLength returns the correct perimiter");
+    }
+
+    function test_LinearRing_getCentroid(t) {
+        t.plan(2);
+        var components = [
+            new OpenLayers.Geometry.Point(0,0), 
+            new OpenLayers.Geometry.Point(0,10),
+            new OpenLayers.Geometry.Point(10,10), 
+            new OpenLayers.Geometry.Point(10,0)
+        ];
+        var ring = new OpenLayers.Geometry.LinearRing(components);
+        var centroid = ring.getCentroid();
+        t.ok(centroid.x === 5 && centroid.y === 5, "getCentroid returns the correct centroid");
+        ring.destroy();
+
+        ring = new OpenLayers.Geometry.LinearRing();
+        t.eq(ring.getCentroid(), null, "getCentroid returns null if no components");     
+    }
+
+    function test_LinearRing_move(t) {
+
+        var nvert = 4,
+            x = new Array(nvert),
+            y = new Array(nvert),
+            components = new Array(nvert);
+            
+        t.plan(2 * (nvert + 1));
+
+        for(var i=0; i<nvert; ++i) {
+            x[i] = Math.random();
+            y[i] = Math.random();
+            components[i] = new OpenLayers.Geometry.Point(x[i], y[i]);
+        }
+        x.push(x[0]);
+        y.push(y[0]);
+
+        var ring = new OpenLayers.Geometry.LinearRing(components);
+
+        var dx = Math.random();
+        var dy = Math.random();
+
+        ring.move(dx, dy);
+        
+        for(var j=0; j<nvert + 1; ++j) {
+            t.eq(ring.components[j].x, x[j] + dx,
+                 "move correctly adjust x coord of " + j + " component");
+            t.eq(ring.components[j].y, y[j] + dy,
+                 "move correctly adjust y coord of " + j + " component");
+        }
+    }
+    
+    function test_LinearRing_rotate(t) {
+        t.plan(10);
+
+        var components = [
+            new OpenLayers.Geometry.Point(10,10), 
+            new OpenLayers.Geometry.Point(11,10),
+            new OpenLayers.Geometry.Point(11,11), 
+            new OpenLayers.Geometry.Point(10,11)
+        ];
+        
+        var ring = new OpenLayers.Geometry.LinearRing(components);
+
+        // rotate a quarter turn around the origin
+        var origin = new OpenLayers.Geometry.Point(0, 0);
+        var angle = 90;
+        
+        ring.rotate(angle, origin);
+        
+        function withinTolerance(i, j) {
+            return Math.abs(i - j) < 1e-9;
+        }
+
+        t.ok(withinTolerance(ring.components[0].x , -10),
+             "rotate correctly adjusts x of component 0");
+        t.ok(withinTolerance(ring.components[0].y, 10),
+             "rotate correctly adjusts y of component 0");
+        t.ok(withinTolerance(ring.components[1].x, -10),
+             "rotate correctly adjusts x of component 1");
+        t.ok(withinTolerance(ring.components[1].y, 11),
+             "rotate correctly adjusts y of component 1");
+        t.ok(withinTolerance(ring.components[2].x, -11),
+             "rotate correctly adjusts x of component 2");
+        t.ok(withinTolerance(ring.components[2].y, 11),
+             "rotate correctly adjusts y of component 2");
+        t.ok(withinTolerance(ring.components[3].x, -11),
+             "rotate correctly adjusts x of component 3");
+        t.ok(withinTolerance(ring.components[3].y, 10),
+             "rotate correctly adjusts y of component 3");
+        t.ok(withinTolerance(ring.components[4].x, -10),
+             "rotate correctly adjusts x of component 4");
+        t.ok(withinTolerance(ring.components[4].y, 10),
+             "rotate correctly adjusts y of component 4");
+    }
+
+    function test_LinearRing_resize(t) {
+        t.plan(10);
+
+        var components = [
+            new OpenLayers.Geometry.Point(10,10), 
+            new OpenLayers.Geometry.Point(11,10),
+            new OpenLayers.Geometry.Point(11,11), 
+            new OpenLayers.Geometry.Point(10,11)
+        ];
+        
+        var ring = new OpenLayers.Geometry.LinearRing(components);
+
+        // rotate a quarter turn around the origin
+        var origin = new OpenLayers.Geometry.Point(0, 0);
+        var scale = Math.random();
+        
+        ring.resize(scale, origin);
+        
+        function withinTolerance(i, j) {
+            return Math.abs(i - j) < 1e-9;
+        }
+
+        t.ok(withinTolerance(ring.components[0].x , 10 * scale),
+             "resize correctly adjusts x of component 0");
+        t.ok(withinTolerance(ring.components[0].y, 10 * scale),
+             "resize correctly adjusts y of component 0");
+        t.ok(withinTolerance(ring.components[1].x, 11 * scale),
+             "resize correctly adjusts x of component 1");
+        t.ok(withinTolerance(ring.components[1].y, 10 * scale),
+             "resize correctly adjusts y of component 1");
+        t.ok(withinTolerance(ring.components[2].x, 11 * scale),
+             "resize correctly adjusts x of component 2");
+        t.ok(withinTolerance(ring.components[2].y, 11 * scale),
+             "resize correctly adjusts y of component 2");
+        t.ok(withinTolerance(ring.components[3].x, 10 * scale),
+             "resize correctly adjusts x of component 3");
+        t.ok(withinTolerance(ring.components[3].y, 11 * scale),
+             "resize correctly adjusts y of component 3");
+        t.ok(withinTolerance(ring.components[4].x, 10 * scale),
+             "resize correctly adjusts x of component 4");
+        t.ok(withinTolerance(ring.components[4].y, 10 * scale),
+             "resize correctly adjusts y of component 4");
+    }
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/MultiLineString.html b/tests/Geometry/MultiLineString.html
new file mode 100644
index 0000000..0d049de
--- /dev/null
+++ b/tests/Geometry/MultiLineString.html
@@ -0,0 +1,267 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var line;
+        
+    function test_MultiLineString_constructor (t) {
+        t.plan( 3 );
+        mline = new OpenLayers.Geometry.MultiLineString();
+        t.ok( mline instanceof OpenLayers.Geometry.MultiLineString, "new OpenLayers.Geometry.MultiLineString returns mline object" );
+        t.eq( mline.CLASS_NAME, "OpenLayers.Geometry.MultiLineString", "mline.CLASS_NAME is set correctly");
+        t.eq( mline.components, [], "line.components is set correctly");
+    }
+
+    function test_MultiLineString_constructor (t) {
+        t.plan( 3 );
+        line = new OpenLayers.Geometry.LineString();
+        mline = new OpenLayers.Geometry.MultiLineString(line);
+        t.ok( mline instanceof OpenLayers.Geometry.MultiLineString, "new OpenLayers.Geometry.MultiLineString returns mline object" );
+        t.eq( mline.CLASS_NAME, "OpenLayers.Geometry.MultiLineString", "mline.CLASS_NAME is set correctly");
+        t.eq( mline.components.length, 1, "mline.components.length is set correctly");
+    }
+
+    function test_split(t) {
+        var wkt = OpenLayers.Geometry.fromWKT;
+        
+        var cases = [{
+            msg: "no intersection",
+            g1: "MULTILINESTRING((0 0, 0 1), (2 2, 3 3))",
+            g2: "MULTILINESTRING((1 0, 1 1), (2 2, 3 2))",
+            exp: null
+        } , {
+            msg: "intersection at midpoint",
+            g1: "MULTILINESTRING((0 0, 1 1))",
+            g2: "MULTILINESTRING((1 0, 0 1))",
+            exp: ["MULTILINESTRING((1 0, 0.5 0.5))", "MULTILINESTRING((0.5 0.5, 0 1))"]
+        }, {
+            msg: "intersection at midpoint (reverse source/target)",
+            g1: "MULTILINESTRING((1 0, 0 1))",
+            g2: "MULTILINESTRING((0 0, 1 1))",
+            exp: ["MULTILINESTRING((0 0, 0.5 0.5))", "MULTILINESTRING((0.5 0.5, 1 1))"]
+        }, {
+            msg: "intersection at endpoint",
+            g1: "MULTILINESTRING((0 0, 1 1))",
+            g2: "MULTILINESTRING((1 0, 1 1))",
+            exp: null
+        }, {
+            msg: "midpoint intersection, no options",
+            g1: "MULTILINESTRING((0 0, 2 2))",
+            g2: "MULTILINESTRING((0 2, 2 0))",
+            exp: ["MULTILINESTRING((0 2, 1 1))", "MULTILINESTRING((1 1, 2 0))"]
+        }, {
+            msg: "midpoint intersection, edge false",
+            opt: {edge: false},
+            g1: "MULTILINESTRING((0 0, 2 2))",
+            g2: "MULTILINESTRING((0 2, 2 0))",
+            exp: null
+        }, {
+            msg: "midpoint intersection, mutual",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((0 0, 2 2))",
+            g2: "MULTILINESTRING((0 2, 2 0))",
+            exp: [["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2))"], ["MULTILINESTRING((0 2, 1 1))", "MULTILINESTRING((1 1, 2 0))"]]
+        }, {
+            msg: "close intersection, no tolerance",
+            g1: "MULTILINESTRING((0 0, 0.9 0.9))",
+            g2: "MULTILINESTRING((0 2, 2 0))",
+            exp: null
+        }, {
+            msg: "close intersection, within tolerance",
+            opt: {tolerance: 0.2},
+            g1: "MULTILINESTRING((0 0, 0.9 0.9))",
+            g2: "MULTILINESTRING((0 2, 2 0))",
+            exp: ["MULTILINESTRING((0 2, 0.9 0.9))", "MULTILINESTRING((0.9 0.9, 2 0))"]
+        }, {
+            msg: "multi source, single target",
+            g1: "MULTILINESTRING((0 0, 2 2))",
+            g2: "LINESTRING(0 2, 2 0)",
+            exp: ["LINESTRING(0 2, 1 1)", "LINESTRING(1 1, 2 0)"]
+        }, {
+            msg: "multi source, single target, mutual split",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((0 0, 2 2))",
+            g2: "LINESTRING(0 2, 2 0)",
+            exp: [["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2))"], ["LINESTRING(0 2, 1 1)", "LINESTRING(1 1, 2 0)"]]
+        }, {
+            msg: "single source, multi target",
+            g1: "LINESTRING(0 2, 2 0)",
+            g2: "MULTILINESTRING((0 0, 2 2))",
+            exp: ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2))"]
+        }, {
+            msg: "partial target split",
+            g1: "MULTILINESTRING((2 0, 0 2))",
+            g2: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
+            exp: ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"]
+        }, {
+            msg: "partial target split, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((2 0, 0 2))",
+            g2: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
+            exp: [["MULTILINESTRING((2 0, 1 1))", "MULTILINESTRING((1 1, 0 2))"], ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"]]
+        }, {
+            msg: "partial source split, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
+            g2: "MULTILINESTRING((2 0, 0 2))",
+            exp: [["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"], ["MULTILINESTRING((2 0, 1 1))", "MULTILINESTRING((1 1, 0 2))"]]
+        }, {
+            msg: "partial target split with source endpoint",
+            g1: "MULTILINESTRING((1 0, 1 1))",
+            g2: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
+            exp: ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"]
+        }, {
+            msg: "partial target split with source endpoint, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((5 5, 6 6), (1 0, 1 1))",
+            g2: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
+            exp: [[], ["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4))"]]
+        }, {
+            msg: "partial source split with target endpoint",
+            g1: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4))",
+            g2: "MULTILINESTRING((1 0, 1 1))",
+            exp: null
+        }, {
+            msg: "partial source split with target endpoint, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((0 0, 2 2), (3 3, 4 4), (5 5, 6 6))",
+            g2: "MULTILINESTRING((1 0, 1 1))",
+            exp: [["MULTILINESTRING((0 0, 1 1))", "MULTILINESTRING((1 1, 2 2), (3 3, 4 4), (5 5, 6 6))"], []]
+        }, {
+            msg: "partial target and source split",
+            g1: "MULTILINESTRING((0 5, 2 5), (4 5, 6 5), (8 5, 10 5))",
+            g2: "MULTILINESTRING((5 0, 5 2), (5 4, 5 6), (5 8, 5 10))",
+            exp: ["MULTILINESTRING((5 0, 5 2), (5 4, 5 5))", "MULTILINESTRING((5 5, 5 6), (5 8, 5 10))"]
+        }, {
+            msg: "partial target and source split, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((0 5, 2 5), (4 5, 6 5), (8 5, 10 5))",
+            g2: "MULTILINESTRING((5 0, 5 2), (5 4, 5 6), (5 8, 5 10))",
+            exp: [["MULTILINESTRING((0 5, 2 5), (4 5, 5 5))", "MULTILINESTRING((5 5, 6 5), (8 5, 10 5))"],
+                  ["MULTILINESTRING((5 0, 5 2), (5 4, 5 5))", "MULTILINESTRING((5 5, 5 6), (5 8, 5 10))"]]
+        }, {
+            msg: "partial target and source split with source endpoint, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((0 5, 2 5), (4 5, 6 5), (8 5, 10 5))",
+            g2: "MULTILINESTRING((4 0, 4 2), (4 4, 4 6), (4 8, 4 10))",
+            exp: [[], ["MULTILINESTRING((4 0, 4 2), (4 4, 4 5))", "MULTILINESTRING((4 5, 4 6), (4 8, 4 10))"]]
+        }, {
+            msg: "partial target and source split with target endpoint, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((4 0, 4 2), (4 4, 4 6), (4 8, 4 10))",
+            g2: "MULTILINESTRING((0 5, 2 5), (4 5, 6 5), (8 5, 10 5))",
+            exp: [["MULTILINESTRING((4 0, 4 2), (4 4, 4 5))", "MULTILINESTRING((4 5, 4 6), (4 8, 4 10))"], []]
+        }, {
+            msg: "partial target and source split with source vertex, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((0 5, 2 5), (4 5, 5 5, 6 5), (8 5, 10 5))",
+            g2: "MULTILINESTRING((5 0, 5 2), (5 4, 5 6), (5 8, 5 10))",
+            exp: [["MULTILINESTRING((0 5, 2 5), (4 5, 5 5))", "MULTILINESTRING((5 5, 6 5), (8 5, 10 5))"], ["MULTILINESTRING((5 0, 5 2), (5 4, 5 5))", "MULTILINESTRING((5 5, 5 6), (5 8, 5 10))"]]
+        }, {
+            msg: "partial target and source split with target vertex, mutual true",
+            opt: {mutual: true},
+            g1: "MULTILINESTRING((5 0, 5 2), (5 4, 5 6), (5 8, 5 10))",
+            g2: "MULTILINESTRING((0 5, 2 5), (4 5, 5 5, 6 5), (8 5, 10 5))",
+            exp: [["MULTILINESTRING((5 0, 5 2), (5 4, 5 5))", "MULTILINESTRING((5 5, 5 6), (5 8, 5 10))"], ["MULTILINESTRING((0 5, 2 5), (4 5, 5 5))", "MULTILINESTRING((5 5, 6 5), (8 5, 10 5))"]]
+        }];
+
+
+        t.plan(cases.length);
+        var c, parts, part, midparts;
+        for(var i=0; i<cases.length; ++i) {
+            c = cases[i];
+            var g1 = wkt(c.g1);
+            var g2 = wkt(c.g2);
+            var got = g1.split(g2, c.opt);
+            var exp = c.exp;
+            if(got instanceof Array) {
+                parts = [];
+                for(var j=0; j<got.length; ++j) {
+                    part = got[j];
+                    if(part instanceof Array) {
+                        midparts = [];
+                        for(var k=0; k<part.length; ++k) {
+                            midparts.push(part[k].toString());
+                        }
+                        parts.push("[" + midparts.join(", ") + "]");
+                    } else {
+                        parts.push(got[j].toString());
+                    }
+                }
+                got = parts.join(", ");
+            }
+            if(exp instanceof Array) {
+                parts = [];
+                for(var j=0; j<exp.length; ++j) {
+                    part = exp[j];
+                    if(part instanceof Array) {
+                        midparts = [];
+                        for(var k=0; k<part.length; ++k) {
+                            midparts.push(wkt(part[k]).toString());
+                        }
+                        parts.push("[" + midparts.join(", ") + "]");
+                    } else {
+                        parts.push(wkt(exp[j]).toString());
+                    }
+                }
+                exp = parts.join(", ");
+            }
+            t.eq(got, exp, "case " + i + ": " +  c.msg);
+        }
+        
+    }
+
+    function test_getVertices(t) {
+        t.plan(22);
+        
+        var points = [
+            new OpenLayers.Geometry.Point(10, 20),
+            new OpenLayers.Geometry.Point(20, 30),
+            new OpenLayers.Geometry.Point(30, 40),
+            new OpenLayers.Geometry.Point(40, 50)
+        ];
+        
+        var multi = new OpenLayers.Geometry.MultiLineString([
+            new OpenLayers.Geometry.LineString(points),
+            new OpenLayers.Geometry.LineString(points)
+        ]);
+        
+        var verts = multi.getVertices();
+        t.ok(verts instanceof Array, "got back an array");
+        t.eq(verts.length, 2 * points.length, "of correct length length");
+        t.geom_eq(verts[0], points[0], "0: correct geometry");
+        t.geom_eq(verts[1], points[1], "1: correct geometry");
+        t.geom_eq(verts[2], points[2], "2: correct geometry");
+        t.geom_eq(verts[3], points[3], "3: correct geometry");
+        t.geom_eq(verts[4], points[0], "4: correct geometry");
+        t.geom_eq(verts[5], points[1], "5: correct geometry");
+        t.geom_eq(verts[6], points[2], "6: correct geometry");
+        t.geom_eq(verts[7], points[3], "7: correct geometry");
+        
+        // nodes only
+        var nodes = multi.getVertices(true);
+        t.ok(nodes instanceof Array, "[nodes only] got back an array");
+        t.eq(nodes.length, 4, "[nodes only] of correct length length");
+        t.geom_eq(nodes[0], points[0], "[nodes only] 0: correct geometry");
+        t.geom_eq(nodes[1], points[3], "[nodes only] 1: correct geometry");
+        t.geom_eq(nodes[2], points[0], "[nodes only] 2: correct geometry");
+        t.geom_eq(nodes[3], points[3], "[nodes only] 3: correct geometry");
+        
+        // no nodes
+        var nodes = multi.getVertices(false);
+        t.ok(nodes instanceof Array, "[no nodes] got back an array");
+        t.eq(nodes.length, 4, "[no nodes] of correct length length");
+        t.geom_eq(nodes[0], points[1], "[no nodes] 0: correct geometry");
+        t.geom_eq(nodes[1], points[2], "[no nodes] 1: correct geometry");
+        t.geom_eq(nodes[2], points[1], "[no nodes] 2: correct geometry");
+        t.geom_eq(nodes[3], points[2], "[no nodes] 3: correct geometry");
+
+
+    }
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/MultiPoint.html b/tests/Geometry/MultiPoint.html
new file mode 100644
index 0000000..1fa0696
--- /dev/null
+++ b/tests/Geometry/MultiPoint.html
@@ -0,0 +1,130 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var point = new OpenLayers.Geometry.Point(10, 15);
+     
+        
+    function test_MultiPoint_constructor (t) {
+        t.plan( 2 );
+        var multipoint = new OpenLayers.Geometry.MultiPoint();
+        t.ok( multipoint instanceof OpenLayers.Geometry.MultiPoint, "new OpenLayers.Geometry.MultiPoint returns multipoint object" );
+        t.eq( multipoint.CLASS_NAME, "OpenLayers.Geometry.MultiPoint", "multipoint.CLASS_NAME is set correctly");
+    }
+
+    function test_MultiPoint_constructor (t) {
+        t.plan( 3 );
+        var multipoint = new OpenLayers.Geometry.MultiPoint([point]);
+        t.ok( multipoint instanceof OpenLayers.Geometry.MultiPoint, "new OpenLayers.Geometry.MultiPoint returns multipoint object" );
+        t.eq( multipoint.CLASS_NAME, "OpenLayers.Geometry.MultiPoint", "multipoint.CLASS_NAME is set correctly");
+        t.eq( multipoint.components.length, 1, "multipolygon.components.length is set correctly");
+    }
+
+    function test_MultiPoint_move(t) {
+        t.plan(2);
+        
+        var multipoint = new OpenLayers.Geometry.MultiPoint([point]);
+        var x = point.x;
+        var y = point.y;
+        
+        var dx = 10 * Math.random();
+        var dy = 10 * Math.random();
+        multipoint.move(dx, dy);
+        t.eq(multipoint.components[0].x, x + dx, "move() correctly modifies x");
+        t.eq(multipoint.components[0].y, y + dy, "move() correctly modifies y");
+    }
+    
+    function test_distanceTo(t) {
+        var points = [
+            new OpenLayers.Geometry.Point(0, 0),
+            new OpenLayers.Geometry.Point(10, 0),
+            new OpenLayers.Geometry.Point(0, 9),
+            new OpenLayers.Geometry.Point(-5, 0),
+            new OpenLayers.Geometry.Point(-5, 4)
+        ];
+        
+        var geoms = [
+            new OpenLayers.Geometry.MultiPoint([points[0], points[1]]),
+            new OpenLayers.Geometry.MultiPoint([points[2], points[3]]),
+            points[4]
+        ];
+        
+        var cases = [{
+            got: geoms[0].distanceTo(geoms[0]),
+            expected: 0
+        }, {
+            got: geoms[0].distanceTo(geoms[1]),
+            expected: 5
+        }, {
+            got: geoms[1].distanceTo(geoms[2]),
+            expected: 4
+        }, {
+            got: geoms[0].distanceTo(geoms[1], {details: true}),
+            expected: {
+                distance: 5,
+                x0: 0, y0: 0,
+                x1: -5, y1: 0
+            }
+        }, {
+            got: geoms[1].distanceTo(geoms[0], {details: true}),
+            expected: {
+                distance: 5,
+                x0: -5, y0: 0,
+                x1: 0, y1: 0
+            }
+        }, {
+            got: geoms[1].distanceTo(geoms[2], {details: true}),
+            expected: {
+                distance: 4,
+                x0: -5, y0: 0,
+                x1: -5, y1: 4
+            }
+        }];
+        
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, "case " + i);
+        }
+        
+    }
+
+    function test_MultiPoint_equals(t) {
+        t.plan(3);
+        
+        var x = Math.random() * 100;
+        var y = Math.random() * 100;
+        var geometry = new OpenLayers.Geometry.MultiPoint(
+                                        [new OpenLayers.Geometry.Point(x, y)]);
+        var equal =  new OpenLayers.Geometry.MultiPoint(
+                                        [new OpenLayers.Geometry.Point(x, y)]);        
+        var offX =  new OpenLayers.Geometry.MultiPoint(
+                                        [new OpenLayers.Geometry.Point(x + 1, y)]);        
+        var offY =  new OpenLayers.Geometry.MultiPoint(
+                                        [new OpenLayers.Geometry.Point(x, y + 1)]);        
+        t.ok(geometry.equals(equal),
+             "equals() returns true for a geometry with equivalent coordinates");
+        t.ok(!geometry.equals(offX),
+             "equals() returns false for a geometry with offset x");
+        t.ok(!geometry.equals(offY),
+             "equals() returns false for a geometry with offset y");
+    }
+    
+    function test_MultiPoint_clone(t) {
+        t.plan(2);
+        
+        var x = Math.random() * 100;
+        var y = Math.random() * 100;
+        var geometry = new OpenLayers.Geometry.MultiPoint(
+                                        [new OpenLayers.Geometry.Point(x, y)]);
+        var clone = geometry.clone();
+        t.ok(clone instanceof OpenLayers.Geometry.MultiPoint,
+             "clone() creates an OpenLayers.Geometry.MultiPoint");
+        t.ok(geometry.equals(clone), "clone has equivalent coordinates");
+    }
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/MultiPolygon.html b/tests/Geometry/MultiPolygon.html
new file mode 100644
index 0000000..6b6e355
--- /dev/null
+++ b/tests/Geometry/MultiPolygon.html
@@ -0,0 +1,34 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var polygon;
+    var components = [new OpenLayers.Geometry.Point(10,10), new OpenLayers.Geometry.Point(0,0)];
+    var components2 = [new OpenLayers.Geometry.Point(10,10), new OpenLayers.Geometry.Point(0,0), new OpenLayers.Geometry.Point(10,0), new OpenLayers.Geometry.Point(10,10)];
+    var linearRing = new OpenLayers.Geometry.LinearRing(components);
+    var linearRing2 = new OpenLayers.Geometry.LinearRing(components2);
+    
+    var polygon = new OpenLayers.Geometry.Polygon([linearRing]);
+    var polygon2 = new OpenLayers.Geometry.Polygon([linearRing2]);
+        
+    function test_MultiPolygon_constructor (t) {
+        t.plan( 2 );
+        multipolygon = new OpenLayers.Geometry.MultiPolygon();
+        t.ok( multipolygon instanceof OpenLayers.Geometry.MultiPolygon, "new OpenLayers.Geometry.MultiPolygon returns multipolygon object" );
+        t.eq( multipolygon.CLASS_NAME, "OpenLayers.Geometry.MultiPolygon", "multipolygon.CLASS_NAME is set correctly");
+    }
+
+    function test_MultiPolygon_constructor (t) {
+        t.plan( 3 );
+        multipolygon = new OpenLayers.Geometry.MultiPolygon([polygon, polygon2]);
+        t.ok( multipolygon instanceof OpenLayers.Geometry.MultiPolygon, "new OpenLayers.Geometry.MultiPolygon returns multipolygon object" );
+        t.eq( multipolygon.CLASS_NAME, "OpenLayers.Geometry.MultiPolygon", "multipolygon.CLASS_NAME is set correctly");
+        t.eq( multipolygon.components.length, 2, "multipolygon.components.length is set correctly");
+    }
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/Point.html b/tests/Geometry/Point.html
new file mode 100644
index 0000000..8932ee2
--- /dev/null
+++ b/tests/Geometry/Point.html
@@ -0,0 +1,214 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var point; 
+        
+    function test_Point_constructor (t) {
+        t.plan( 8 );
+
+      //empty
+        point = new OpenLayers.Geometry.Point();
+        t.ok( point instanceof OpenLayers.Geometry.Point, "new OpenLayers.Geometry.Point returns point object" );
+        t.eq( point.CLASS_NAME, "OpenLayers.Geometry.Point", "point.CLASS_NAME is set correctly");
+
+      //valid
+        var x = 10;
+        var y = 20;
+        point = new OpenLayers.Geometry.Point(x, y);
+        t.ok( point instanceof OpenLayers.Geometry.Point, "new OpenLayers.Geometry.Point returns point object" );
+        t.eq( point.CLASS_NAME, "OpenLayers.Geometry.Point", "point.CLASS_NAME is set correctly");
+        t.eq( point.x, x, "point.x is set correctly");
+        t.eq( point.y, y, "point.y is set correctly");
+        t.eq( point.lon, null, "point.lon is not set");
+        t.eq( point.lat, null, "point.lat is not set");
+    }
+
+    function test_Point_calculateBounds (t) {
+        t.plan(4);
+
+        var x = 10;
+        var y = 20;
+        point = new OpenLayers.Geometry.Point(x, y);
+        point.calculateBounds();
+        t.eq( point.bounds.left, x, "bounds.left is 10" );
+        t.eq( point.bounds.right, x, "bounds.right is 10" );
+        t.eq( point.bounds.top, y, "bounds.top is 20" );
+        t.eq( point.bounds.bottom, y, "bounds.bottom is 20" );
+    }
+    
+
+    function test_Point_transform_getBounds (t) {
+        t.plan(2);
+
+        var x = 10;
+        var y = 20;
+        point = new OpenLayers.Geometry.Point(x, y);
+        point.calculateBounds();
+        t.ok( point.bounds != null, "bounds calculated by calcBounds" );
+        point.transform(new OpenLayers.Projection("EPSG:4326"), 
+                        new OpenLayers.Projection("EPSG:900913"));
+        t.eq(point.bounds, null, "Point bounds cleared after transform");
+    }
+    
+    function test_Point_distanceTo(t) {
+        t.plan(7);
+
+        var x1 = 10;
+        var y1 = 20;
+        point1 = new OpenLayers.Geometry.Point(x1, y1);
+
+        var x2 = 100;
+        var y2 = 200;
+        point2 = new OpenLayers.Geometry.Point(x2, y2);
+
+        var dist = point1.distanceTo(point2)
+        t.eq( dist, 201.24611797498107267682563018581, "distances calculating correctly");
+        t.eq( dist, Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)), "distance calculation correct");
+        
+        // test that details are returned (though trivial in this case)
+        var result = point1.distanceTo(point2, {details: true});
+        t.eq(result.distance, point1.distanceTo(point2), "[details] distance property is same as return without details");
+        t.eq(result.x0, x1, "[details] x0 property is correct");
+        t.eq(result.y0, y1, "[details] y0 property is correct");
+        t.eq(result.x1, x2, "[details] x1 property is correct");
+        t.eq(result.y1, y2, "[details] y1 property is correct");
+        
+    }
+    
+    function test_Point_toString(t) {
+        t.plan(1);
+
+        var x = 10;
+        var y = 20;
+        point = new OpenLayers.Geometry.Point(x, y);
+        t.eq(point.toString(), "POINT(" + x + " " + y + ")",
+             "toString() returns WKT" );
+        
+    }
+    
+    function test_Point_move(t) {
+        t.plan(3);
+        
+        var x = 10;
+        var y = 20;
+        point = new OpenLayers.Geometry.Point(x, y);
+        
+        var dx = 10 * Math.random();
+        var dy = 10 * Math.random();
+        point.bounds = "foo";
+        point.move(dx, dy);
+        t.eq(point.x, x + dx, "move() correctly modifies x");
+        t.eq(point.y, y + dy, "move() correctly modifies y");
+        
+        t.ok(point.bounds == null, "bounds is cleared after a move()");
+    }
+
+    function test_Point_rotate(t) {
+        t.plan(5);
+        
+        var tolerance = 1e-10;
+        var x = 10;
+        var y = 20;
+        var point = new OpenLayers.Geometry.Point(x, y);
+        var origin = new OpenLayers.Geometry.Point(5, 10);
+        
+        // rotate a full revolution
+        point.bounds = "foo";
+        point.rotate(360, origin);
+        t.ok(((point.x - x) / x) < tolerance,
+             "rotate by 360 returns to the same y");
+        t.ok(((point.y - y) / y) < tolerance,
+             "rotate by 360 returns to the same y");
+        
+        t.ok(point.bounds == null, "bounds is cleared after a rotate()");
+        
+        // rotate an 1/8 turn
+        point.rotate(45, origin);
+        t.ok(((point.x - 1.4644660940672636) / 1.4644660940672636) < tolerance,
+             "rotate 1/8 turn correctly");
+        t.ok(((point.y - 20.606601717798213) / 20.606601717798213) < tolerance,
+             "rotate 1/8 turn correctly");
+    }
+
+    function test_Point_resize(t) {
+        t.plan(6);
+        
+        var tolerance = 1e-10;
+        var x = 100 * Math.random();
+        var y = 100 * Math.random();
+        var point = new OpenLayers.Geometry.Point(x, y);
+        point.bounds = "foo";
+        
+        var i = 100 * Math.random();
+        var j = 100 * Math.random();
+        var origin = new OpenLayers.Geometry.Point(i, j);
+        
+        var scale = 10 * Math.random();
+        var oldDistance = origin.distanceTo(point);
+        
+        var ret = point.resize(scale, origin);
+        var newDistance = origin.distanceTo(point);
+        
+        t.ok(ret === point, "resize returns geometry");
+        t.ok((origin.x == i) && (origin.y == j),
+             "resize leaves the origin untouched");
+        t.ok((((newDistance / oldDistance) - scale) / scale) < tolerance,
+             "resize moves points the correct distance from the origin");
+        
+        t.ok(point.bounds == null, "bounds is correctly cleared after a resize()");
+        
+        // resize with non uniform scaling (ratio != 1)
+        point = new OpenLayers.Geometry.Point(10, 10);
+        origin = new OpenLayers.Geometry.Point(0, 0);
+        point.resize(2, origin, 4);
+        t.eq(point.x, 80, "non-uniform scaling correctly applied in x dim");
+        t.eq(point.y, 20, "non-uniform scaling correctly applied in y dim");
+        
+    }
+
+    function test_Point_equals(t) {
+        t.plan(3);
+        
+        var x = Math.random() * 100;
+        var y = Math.random() * 100;
+        var geometry = new OpenLayers.Geometry.Point(x, y);
+        var equal = new OpenLayers.Geometry.Point(x, y);
+        var offX = new OpenLayers.Geometry.Point(x + 1, y);
+        var offY = new OpenLayers.Geometry.Point(x, y + 1);
+        t.ok(geometry.equals(equal),
+             "equals() returns true for a geometry with equivalent coordinates");
+        t.ok(!geometry.equals(offX),
+             "equals() returns false for a geometry with offset x");
+        t.ok(!geometry.equals(offY),
+             "equals() returns false for a geometry with offset y");
+    }
+    
+    function test_getVertices(t) {
+        t.plan(3);
+        
+        var point = new OpenLayers.Geometry.Point(10, 20);
+        var verts = point.getVertices();
+        t.ok(verts instanceof Array, "got back an array");
+        t.eq(verts.length, 1, "of length 1");
+        t.geom_eq(verts[0], point, "with correct geometry");
+    }
+    
+    function test_Point_clone(t) {
+        t.plan(2);
+        
+        var x = Math.random() * 100;
+        var y = Math.random() * 100;
+        var geometry = new OpenLayers.Geometry.Point(x, y);
+        var clone = geometry.clone();
+        t.ok(clone instanceof OpenLayers.Geometry.Point,
+             "clone() creates an OpenLayers.Geometry.Point");
+        t.ok(geometry.equals(clone), "clone has equivalent coordinates");
+    }
+    
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/Polygon.html b/tests/Geometry/Polygon.html
new file mode 100644
index 0000000..2a5fb36
--- /dev/null
+++ b/tests/Geometry/Polygon.html
@@ -0,0 +1,381 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var polygon;
+    var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
+    var components2 = [new OpenLayers.Geometry.Point(12,15), new OpenLayers.Geometry.Point(2,3), new OpenLayers.Geometry.Point(10,0), new OpenLayers.Geometry.Point(10,10)];
+    var linearRing = new OpenLayers.Geometry.LinearRing(components);
+    var linearRing2 = new OpenLayers.Geometry.LinearRing(components2);
+    
+    function test_Polygon_constructor (t) {
+        t.plan( 3 );
+        polygon = new OpenLayers.Geometry.Polygon();
+        t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
+        t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
+        t.eq( polygon.components.length, 0, "polygon.components is set correctly");
+    }
+
+    function test_Polygon_constructor (t) {
+        t.plan( 3 );
+        polygon = new OpenLayers.Geometry.Polygon([linearRing]);
+        t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
+        t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
+        t.eq( polygon.components.length, 1, "polygon.components.length is set correctly");
+    }
+    
+    function test_Polygon_constructor (t) {
+        t.plan( 3 );
+        polygon = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
+        t.ok( polygon instanceof OpenLayers.Geometry.Polygon, "new OpenLayers.Geometry.Polygon returns polygon object" );
+        t.eq( polygon.CLASS_NAME, "OpenLayers.Geometry.Polygon", "polygon.CLASS_NAME is set correctly");
+        t.eq( polygon.components.length, 2, "polygon.components.length is set correctly");
+    }
+    
+    function test_Polygon_transform_getBounds (t) {
+        t.plan(3);
+
+        var components = [new OpenLayers.Geometry.Point(10,14), new OpenLayers.Geometry.Point(5,3)];
+        var linearRing = new OpenLayers.Geometry.LinearRing(components);
+        polygon = new OpenLayers.Geometry.Polygon([linearRing.clone()]);
+        polygon.calculateBounds();
+        t.ok( polygon.bounds != null, "bounds calculated by calcBounds" );
+        polygon.transform(new OpenLayers.Projection("EPSG:4326"), 
+                        new OpenLayers.Projection("EPSG:900913"));
+        t.eq(polygon.bounds, null, "Point bounds cleared after transform");
+        t.eq(polygon.getBounds().toBBOX(), "556597.453889,334111.171355,1113194.907778,1574216.547942", "Bounds are correct")
+    }
+
+    function test_Polygon_getArea(t) {
+        t.plan( 5 );
+
+      //no components
+        var polygon = new OpenLayers.Geometry.Polygon();
+        t.eq(polygon.getArea(), 0, "getArea empty polygon is 0");
+
+        var createSquareRing = function(area) {
+            var points = [
+                new OpenLayers.Geometry.Point(0, 0),
+                new OpenLayers.Geometry.Point(0, area),
+                new OpenLayers.Geometry.Point(area, area),
+                new OpenLayers.Geometry.Point(area, 0)
+            ];
+            var ring = new OpenLayers.Geometry.LinearRing(points);
+            return ring;
+        };
+    
+
+      //simple polygon
+        var comps = [ createSquareRing(2) ];
+        
+        var polygon = new OpenLayers.Geometry.Polygon(comps);
+        t.eq(polygon.getArea(), 4, "getArea simple polygon works lovely");
+
+      //polygon with holes
+        comps = [ createSquareRing(10),
+                           createSquareRing(2),
+                           createSquareRing(3),
+                           createSquareRing(4)
+                         ];
+
+        var polygon = new OpenLayers.Geometry.Polygon(comps);
+        t.eq(polygon.getArea(), 71, "getArea polygon with holes works lovely");
+        
+      //simple polygon negative
+        comps = [ createSquareRing(-2) ];
+        
+        var polygon = new OpenLayers.Geometry.Polygon(comps);
+        t.eq(polygon.getArea(), 4, "getArea simple polygon negative works lovely");
+
+      //polygon with holes negative
+        comps = [ createSquareRing(-10),
+                           createSquareRing(-2),
+                           createSquareRing(-3),
+                           createSquareRing(-4)
+                         ];
+        
+        var polygon = new OpenLayers.Geometry.Polygon(comps);
+        t.eq(polygon.getArea(), 71, "getArea negative polygon with holes works lovely");
+        
+    }
+    
+    function test_Polygon_move(t) {
+        t.plan(4);
+        
+        polygon = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
+        
+        var x = linearRing.components[0].x;
+        var y = linearRing.components[0].y;
+        var x2 = linearRing2.components[0].x;
+        var y2 = linearRing2.components[0].y;
+        
+        var dx = 10 * Math.random();
+        var dy = 10 * Math.random();
+
+        polygon.move(dx, dy);
+
+        t.eq(polygon.components[0].components[0].x, x + dx, "move() correctly modifies first x");
+        t.eq(polygon.components[0].components[0].y, y + dy, "move() correctly modifies first y");
+        t.eq(polygon.components[1].components[0].x, x2 + dx, "move() correctly modifies second x");
+        t.eq(polygon.components[1].components[0].y, y2 + dy, "move() correctly modifies second y");
+    }
+
+    function test_Polygon_rotate(t) {
+        t.plan(6);
+        
+        var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
+        
+        var originals = [];
+        var comp;
+        var angle = 2 * Math.PI * Math.random();
+        var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
+                                                   10 * Math.random());
+        for(var i=0; i<geometry.components.length; ++i) {
+            comp = geometry.components[i];
+            originals[i] = comp.rotate;
+            comp.rotate = function(a, o) {
+                t.ok(true, "rotate called for component " + i);
+                t.ok(a == angle, "rotate called with correct angle");
+                t.ok(o == origin, "rotate called with correct origin");
+            }
+        }
+        geometry.rotate(angle, origin);
+        
+        // restore the original rotate defs
+        for(var i=0; i<geometry.components.length; ++i) {
+            comp.rotate = originals[i];
+        }
+    }
+
+    function test_Polygon_resize(t) {
+        t.plan(8);
+        
+        var tolerance = 1e-10;
+        var geometry = new OpenLayers.Geometry.Polygon([linearRing, linearRing2]);
+        var origin = new OpenLayers.Geometry.Point(10 * Math.random(),
+                                                   10 * Math.random());
+        var scale = 10 * Math.random();
+        
+        var oldArea = geometry.getArea();
+        var oldPerimeter = geometry.getLength();
+        geometry.resize(scale, origin);
+        var newArea = geometry.getArea();
+        var newPerimeter = geometry.getLength();
+        
+        t.ok((((newArea / oldArea) - (scale * scale)) / (scale * scale)) < tolerance,
+             "resize correctly changes the area of a polygon")
+        t.ok((((newPerimeter / oldPerimeter) - scale) / scale) < tolerance,
+             "resize correctly changes the perimeter of a polygon")
+
+        var originals = [];
+        var comp;
+        for(var i=0; i<geometry.components.length; ++i) {
+            comp = geometry.components[i];
+            originals[i] = comp.resize;
+            comp.resize = function(s, o) {
+                t.ok(true, "resize called for component " + i);
+                t.ok(s == scale, "resize called with correct scale");
+                t.ok(o == origin, "resize called with correct origin");
+            }
+        }
+        geometry.resize(scale, origin);
+        
+        // restore the original resize defs
+        for(var i=0; i<geometry.components.length; ++i) {
+            comp.resize = originals[i];
+        }
+        
+    }
+
+    function test_Polygon_createRegular(t) {
+        t.plan(22);
+        var sides = 40;
+        var poly = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(5,0), 6, sides);
+        var polyBounds = poly.getBounds();
+        t.eq(polyBounds.toBBOX(), "-0.981504,-5.981504,10.981504,5.981504", sides + " sided figure generates correct bbox.");
+        t.eq(poly.components.length, 1, "Poly has one linear ring");
+        t.eq(poly.components[0].components.length, sides + 1, "ring has 41 components");
+        t.eq(poly.components[0].components[0].id, poly.components[0].components[sides].id, "ring starts and ends with same geom");
+        t.eq(Math.round(poly.getArea()), Math.round(Math.PI * 36), "area of "+sides+" sided poly rounds to same area as a circle.");
+        
+        var sides = 3;
+        var poly = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(5,0), 6, sides);
+        var polyBounds = poly.getBounds();
+        t.eq(polyBounds.toBBOX(), "-0.196152,-3,10.196152,6", sides + " sided figure generates correct bbox.");
+        t.eq(poly.components.length, 1, "Poly has one linear ring");
+        t.eq(poly.components[0].components.length, sides + 1, "ring has  correct count of  components");
+        t.eq(poly.components[0].components[0].id, poly.components[0].components[sides].id, "ring starts and ends with same geom");
+        t.eq(Math.round(poly.getArea()), 47, "area of 3 sided poly is correct");
+        
+        var sides = 3;
+        var poly3 = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(10,0), 15, sides);
+        var polyBounds = poly3.getBounds();
+        t.eq(polyBounds.toBBOX(), "-2.990381,-7.5,22.990381,15", sides + " sided figure generates correct bbox.");
+        t.eq(Math.round(polyBounds.getCenterLonLat().lon), 10, "longitude of center of bounds is same as origin");
+        t.eq(poly3.components.length, 1, "Poly has one linear ring");
+        t.eq(poly3.components[0].components.length, sides + 1, "ring has  correct count of  components");
+        t.eq(poly3.components[0].components[0].id, poly3.components[0].components[sides].id, "ring starts and ends with same geom");
+        t.ok(poly3.getArea() > poly.getArea(), "area with radius 15 > poly with radius 6"); 
+        
+        var sides = 4;
+        var poly4 = OpenLayers.Geometry.Polygon.createRegularPolygon(new OpenLayers.Geometry.Point(10,0), 15, sides);
+        var polyBounds = poly4.getBounds();
+        t.eq(polyBounds.toBBOX(), "-0.606602,-10.606602,20.606602,10.606602", sides + " sided figure generates correct bbox.");
+        t.eq(Math.round(polyBounds.getCenterLonLat().lon), 10, "longitude of center of bounds is same as origin");
+        t.eq(poly4.components.length, 1, "Poly has one linear ring");
+        t.eq(poly4.components[0].components.length, sides + 1, "ring has  correct count of  components");
+        t.eq(poly4.components[0].components[0].id, poly4.components[0].components[sides].id, "ring starts and ends with same geom");
+        t.ok(poly4.getArea() > poly3.getArea(), "square with radius 15 > triangle with radius 15"); 
+    }
+
+    function test_Polygon_equals(t) {
+        t.plan(3);
+        
+        var x0 = Math.random() * 100;
+        var y0 = Math.random() * 100;
+        var x1 = Math.random() * 100;
+        var y1 = Math.random() * 100;
+        var x2 = Math.random() * 100;
+        var y2 = Math.random() * 100;
+        var point0 = new OpenLayers.Geometry.Point(x0, y0);
+        var point1 = new OpenLayers.Geometry.Point(x1, y1);
+        var point2 = new OpenLayers.Geometry.Point(x2, y2);
+        var pointX = new OpenLayers.Geometry.Point(x0 + 1, y0);
+        var pointY = new OpenLayers.Geometry.Point(x0, y0 + 1);
+        var geometry = new OpenLayers.Geometry.Polygon([
+                            new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
+        var equal = new OpenLayers.Geometry.Polygon([
+                            new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
+        var offX = new OpenLayers.Geometry.Polygon([
+                            new OpenLayers.Geometry.LinearRing([pointX, point1, point2])]);
+        var offY = new OpenLayers.Geometry.Polygon([
+                            new OpenLayers.Geometry.LinearRing([pointY, point1, point2])]);
+        t.ok(geometry.equals(equal),
+             "equals() returns true for a geometry with equivalent coordinates");
+        t.ok(!geometry.equals(offX),
+             "equals() returns false for a geometry with offset x");
+        t.ok(!geometry.equals(offY),
+             "equals() returns false for a geometry with offset y");
+    }
+    
+    function test_distanceTo(t) {
+        var wkt = OpenLayers.Geometry.fromWKT;
+        var geoms = [
+            wkt("POLYGON((0 3, 1 4, 2 3, 1 2, 0 3))"),
+            wkt("POINT(0 0)"),
+            wkt("LINESTRING(-2 0, 0 -2, 2 -1, 2 0)"),
+            wkt("LINESTRING(0 2, 1 3)"),
+            wkt("POINT(1 3)")
+        ];
+
+        var cases = [{
+            got: geoms[0].distanceTo(geoms[1]),
+            expected: Math.sqrt(5)
+        }, {
+            got: geoms[0].distanceTo(geoms[1], {details: true}),
+            expected: {
+                distance: Math.sqrt(5),
+                x0: 1, y0: 2,
+                x1: 0, y1: 0
+            }
+        }, {
+            got: geoms[0].distanceTo(geoms[2], {details: true}),
+            expected: {
+                distance: Math.sqrt(5),
+                x0: 1, y0: 2,
+                x1: 2, y1: 0
+            }
+        }, {
+            got: geoms[0].distanceTo(geoms[3], {details: true}),
+            expected: {
+                distance: 0,
+                x0: 0.5, y0: 2.5,
+                x1: 0.5, y1: 2.5
+            }
+        }, {
+            got: geoms[0].distanceTo(geoms[4]),
+            expected: Math.sqrt(0.5)
+        }, {
+            got: geoms[0].distanceTo(geoms[4], {edge: false}),
+            expected: 0
+        }];
+
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, "case " + i);
+        }
+        
+    }
+
+    function test_getVertices(t) {
+        t.plan(6);
+        
+        var points = [
+            new OpenLayers.Geometry.Point(10, 20),
+            new OpenLayers.Geometry.Point(20, 30),
+            new OpenLayers.Geometry.Point(30, 40),
+            new OpenLayers.Geometry.Point(40, 50)
+        ];
+        var polygon = new OpenLayers.Geometry.Polygon([
+            new OpenLayers.Geometry.LinearRing(points)
+        ]);
+        
+        var verts = polygon.getVertices();
+        t.ok(verts instanceof Array, "got back an array");
+        t.eq(verts.length, points.length, "of correct length length");
+        t.geom_eq(verts[0], points[0], "0: correct geometry");
+        t.geom_eq(verts[1], points[1], "1: correct geometry");
+        t.geom_eq(verts[2], points[2], "2: correct geometry");
+        t.geom_eq(verts[3], points[3], "3: correct geometry");
+        
+    }
+
+    function test_Polygon_clone(t) {
+        t.plan(2);
+        
+        var x0 = Math.random() * 100;
+        var y0 = Math.random() * 100;
+        var x1 = Math.random() * 100;
+        var y1 = Math.random() * 100;
+        var x2 = Math.random() * 100;
+        var y2 = Math.random() * 100;
+        var point0 = new OpenLayers.Geometry.Point(x0, y0);
+        var point1 = new OpenLayers.Geometry.Point(x1, y1);
+        var point2 = new OpenLayers.Geometry.Point(x2, y2);
+        var geometry = new OpenLayers.Geometry.Polygon([
+                            new OpenLayers.Geometry.LinearRing([point0, point1, point2])]);
+        var clone = geometry.clone();
+        t.ok(clone instanceof OpenLayers.Geometry.Polygon,
+             "clone() creates an OpenLayers.Geometry.Polygon");
+        t.ok(geometry.equals(clone), "clone has equivalent coordinates");
+    }
+    
+    function test_getGeodesicArea(t) {
+        
+        t.plan(1);
+        
+        // from the wfs-states.html example
+        var illinois = OpenLayers.Geometry.fromWKT(
+            "MULTIPOLYGON(((-88.071564 37.51099,-88.087883 37.476273,-88.311707 37.442852,-88.359177 37.409309,-88.419853 37.420292,-88.467644 37.400757,-88.511322 37.296852,-88.501427 37.257782,-88.450699 37.205669,-88.422516 37.15691,-88.45047 37.098671,-88.476799 37.072144,-88.4907 37.06818,-88.517273 37.06477,-88.559273 37.072815,-88.61422 37.109047,-88.68837 37.13541,-88.739113 37.141182,-88.746506 37.152107,-88.863289 37.202194,-88.932503 37.218407,-88.993172 37.220036,-89.065033 3 [...]
+        );
+        
+        // two calculations of the area (in square meters)
+        var planar = illinois.getArea() * Math.pow(OpenLayers.INCHES_PER_UNIT['dd'] / OpenLayers.INCHES_PER_UNIT['m'], 2);
+        var geodesic = illinois.getGeodesicArea();
+        
+        // from http://en.wikipedia.org/wiki/Illinois
+        var expected = 1.40998e11; // square meters
+        
+        var planarErr = Math.abs(planar - expected) / expected;
+        var geodesicErr = Math.abs(geodesic - expected) / expected;
+        
+        t.ok(geodesicErr < planarErr, "geodesic measure is better (" + geodesicErr.toFixed(3) + " vs. " + planarErr.toFixed(3) + ")");
+        
+    }
+    
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/Rectangle.html b/tests/Geometry/Rectangle.html
new file mode 100644
index 0000000..87e04d7
--- /dev/null
+++ b/tests/Geometry/Rectangle.html
@@ -0,0 +1,76 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_Rectangle_constructor (t) {
+        t.plan( 8 );
+
+      //empty
+        var rect = new OpenLayers.Geometry.Rectangle();
+        t.ok( rect instanceof OpenLayers.Geometry.Rectangle, "new OpenLayers.Geometry.Rectangle returns Rectangle object" );
+        t.eq( rect.CLASS_NAME, "OpenLayers.Geometry.Rectangle", "Rectangle.CLASS_NAME is set correctly");
+        t.ok( rect.id != null, "rect.id is set");
+        t.ok( ! (rect.x || rect.y || rect.width || rect.height), "empty construct leaves properties empty");
+        
+      //good
+        var x = {};
+        var y = {};
+        var w = {};
+        var h = {};
+        var rect = new OpenLayers.Geometry.Rectangle(x, y, w, h);
+        t.eq( rect.x, x, "good init correctly sets x property"); 
+        t.eq( rect.y, y, "good init correctly sets y property"); 
+        t.eq( rect.width, w, "good init correctly sets width property"); 
+        t.eq( rect.height, h, "good init correctly sets height property"); 
+    }
+
+    function test_Rectangle_calculateBounds(t) {
+        t.plan(1);
+        
+        var x = 1;
+        var y = 2;
+        var w = 10;
+        var h = 20;
+        var rect = new OpenLayers.Geometry.Rectangle(x, y, w, h);
+        rect.calculateBounds();
+
+        var testBounds = new OpenLayers.Bounds(x, y, x + w, y + h)
+        
+        t.ok( rect.bounds.equals(testBounds), "calculateBounds works correctly"); 
+    }
+
+    function test_Rectangle_getLength(t) {
+        t.plan(1);
+
+        var x = 1;
+        var y = 2;
+        var w = 10;
+        var h = 20;
+        var rect = new OpenLayers.Geometry.Rectangle(x, y, w, h);
+
+        var testLength = (2 * w) + (2 * h);
+
+        t.eq(rect.getLength(), testLength, "getLength() works");
+    }
+
+    function test_Rectangle_getArea(t) {
+        t.plan(1);
+
+        var x = 1;
+        var y = 2;
+        var w = 10;
+        var h = 20;
+        var rect = new OpenLayers.Geometry.Rectangle(x, y, w, h);
+
+        var testArea = w * h;
+        t.eq(rect.getArea(), testArea, "testArea() works");
+    }
+
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Geometry/Surface.html b/tests/Geometry/Surface.html
new file mode 100644
index 0000000..25e1705
--- /dev/null
+++ b/tests/Geometry/Surface.html
@@ -0,0 +1,22 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_Surface_constructor (t) {
+        t.plan( 2 );
+        
+        var g = new OpenLayers.Geometry.Surface();
+        
+        t.eq(g.CLASS_NAME, "OpenLayers.Geometry.Surface", "correct CLASS_NAME")
+        t.ok(OpenLayers.String.startsWith(g.id, "OpenLayers.Geometry.Surface_"),
+             "id correctly set");
+    }
+
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Handler.html b/tests/Handler.html
new file mode 100644
index 0000000..1650065
--- /dev/null
+++ b/tests/Handler.html
@@ -0,0 +1,261 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_constructor(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+    
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        var handler = new OpenLayers.Handler(control, callbacks, options);
+        t.ok(handler instanceof OpenLayers.Handler,
+             "new OpenLayers.Handler returns object");
+        t.eq(handler.map.id, map.id,
+             "constructing a handler with a map sets the map on the handler");
+        t.eq(handler.callbacks.foo, callbacks.foo,
+             "constructor correctly sets callbacks");
+        t.eq(handler.bar, options.bar,
+             "constructor correctly extends handler with options");
+    }
+    
+    function test_Handler_activate(t) {
+        t.plan(52);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+    
+        var events = ["mouseover", "mouseout", "mousedown",
+                      "mouseup", "mousemove", "click",
+                      "dblclick", "resize", "focus", "blur"];
+
+        var handler = new OpenLayers.Handler(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler is already active");
+
+        handler.active = false;
+        map.events.registerPriority = function(type, obj, func) {
+            var r = func();
+            if(typeof r == "string") {
+                // this is one of the mock handler methods
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "activate calls registerPriority with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls registerPriority with a function");
+                t.eq(r, type,
+                     "activate calls registerPriority with the correct method");
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler",
+                     "activate calls registerPriority with the handler");
+            } else {
+                // this is the call with handler.setEvent as the func
+                t.ok(r, "activate calls registerPriority with handler.setEvent");
+            }
+        }
+        
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        function setMethod(key) {
+            handler[key] = function() {return key};
+        }
+        activated = handler.activate();
+        t.ok(activated,
+             "activated returns true if the handler is not already active");
+        
+    }
+    
+    function test_Handler_deactivate(t) {
+        t.plan(52);
+        var map = new OpenLayers.Map('map', { controls: []});
+        // No controls so that we don't get more thingies than we expect
+        // when we actually clean up after ourselves: r5891 caused this
+        // because we actually destroy things now on the navigation control. 
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+    
+        var events = ["mouseover", "mouseout", "mousedown",
+                      "mouseup", "mousemove", "click",
+                      "dblclick", "resize", "focus", "blur"];
+
+        var handler = new OpenLayers.Handler(control);
+        handler.active = false;
+        var deactivated = handler.deactivate();
+        t.ok(!deactivated,
+             "deactivate returns false if the handler is already deactive");
+
+        handler.activate();
+        map.events.unregister = function(type, obj, func) {
+            var r = func();
+            if(typeof r == "string") {
+                // this is one of the mock handler methods
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "deactivate calls unregister with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls unregister with a function");
+                t.eq(func(), type,
+                     "activate calls unregister with the correct method");
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler",
+                     "activate calls unregister with the handler");
+            } else {
+                // this is the call with handler.setEvent as the func
+                t.ok(r, "activate calls registerPriority with handler.setEvent");
+            }
+        }
+        
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            // add in a closure for key
+            (function(key) {
+                handler[key] = function() {return key};
+            })(events[i]);
+        }
+        deactivated = handler.deactivate();
+        t.ok(deactivated,
+             "deactivated returns true if the handler is already active");
+        map.events.unregister = OpenLayers.Events.prototype.unregister;
+        map.destroy();
+        
+    }
+    
+    function test_Handler_setEvent(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler(control);
+        handler.click = function(evt) {
+        }
+        handler.activate();
+        var testEvent = {
+            xy: new OpenLayers.Pixel(Math.random(), Math.random()),
+            altKey: (Math.random() > 0.5),
+            shiftKey: (Math.random() > 0.5),
+            ctrlKey: (Math.random() > 0.5)
+        }
+        map.events.triggerEvent("click", testEvent);
+        t.ok(handler.evt.xy.x == testEvent.xy.x &&
+             handler.evt.xy.y == testEvent.xy.y,
+             "handler.evt has proper xy object");
+        t.eq(handler.evt.altKey, testEvent.altKey,
+             "handler.evt.altKey correct");
+        t.eq(handler.evt.shiftKey, testEvent.shiftKey,
+             "handler.evt.shiftKey correct");
+        t.eq(handler.evt.ctrlKey, testEvent.ctrlKey,
+             "handler.evt.ctrlKey correct");
+    }
+    
+    function test_Handler_destroy(t) {
+        t.plan(5);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler(control);
+        var deactivated = false;
+        handler.deactivate = function() {
+            deactivated = true;
+        };
+        t.ok(handler.control,
+             "handler has a control prior to destroy");
+        t.ok(handler.map,
+             "handler has a map prior to destroy");
+        handler.destroy();
+        t.eq(handler.control, null,
+             "hanlder.control is null after destroy");
+        t.eq(handler.map, null,
+             "handler.map is null after destroy");
+        t.ok(deactivated,
+             "handler.deactivate is called by destroy");
+    }
+    
+    function test_Handler_checkModifiers(t) {
+        t.plan(26);
+        var handler = new OpenLayers.Handler({});
+        handler.keyMask = null;
+        var proceed = handler.checkModifiers({});
+        t.ok(proceed,
+             "checkModifiers returns true if no keyMask on the handler");
+        
+        
+        /**
+         * Test checkModifiers for single keyMask values.  The method should
+         *     return true if the corresponding key is associated with the
+         *     event.  For example, if evt.shiftKey is true and handler.keyMask
+         *     is OpenLayers.Handler.MOD_SHIFT, checkModifiers should return
+         *     true.
+         */
+        var constants = {
+            MOD_NONE: null,
+            MOD_SHIFT: "shiftKey",
+            MOD_CTRL: "ctrlKey",
+            MOD_ALT: "altKey"
+        }
+        var proceed, evt, value, c, k;
+        for(c in constants) {
+            handler.keyMask = OpenLayers.Handler[c];
+            // for this key mask, test all single key possibilities
+            for(k in constants) {
+                value = constants[k];
+                evt = {};
+                if(value) {
+                    // mimic a key down on an event
+                    evt[value] = true;
+                }
+                proceed = handler.checkModifiers(evt);
+                // if k == c, proceed should be true - false otherwise
+                t.eq(k == c, proceed,
+                     "returns " + proceed + " if keyMask is " + c +
+                     " and " + ((value) ? value : "no key") + " is down");
+            }
+        }
+
+        /**
+         * Test checkModifiers for double keyMask values.  The method should
+         *     return true if the corresponding key combo is associated with the
+         *     event.  For example, if evt.shiftKey is true and handler.keyMask
+         *     is OpenLayers.Handler.MOD_SHIFT, checkModifiers should return
+         *     true.
+         */
+        var constants = ["MOD_SHIFT", "MOD_CTRL", "MOD_ALT"];
+        var keys = ["shiftKey", "ctrlKey", "altKey"];
+        var proceed, evt, c1, c2, k1, k2;
+        for(var i=0; i<constants.length-1; ++i) {
+            c1 = constants[i];
+            for(var j=i+1; j<constants.length; ++j) {
+                c2 = constants[j];
+                handler.keyMask = OpenLayers.Handler[c1] |
+                                  OpenLayers.Handler[c2];
+                // for this key mask, test all double key possibilities
+                for(var x=0; x<keys.length-1; ++x) {
+                    k1 = keys[x];
+                    for(var y=x+1; y<keys.length; ++y) {
+                        k2 = keys[y];
+                        evt = {};
+                        evt[k1] = true;
+                        evt[k2] = true;
+                        proceed = handler.checkModifiers(evt);
+                        // if the combo matches, proceed should be true
+                        // at this point we know that i != j and x != y
+                        t.eq(((i == x) || (i == y)) &&
+                             ((j == x) || (j == y)),
+                             proceed,
+                             "returns " + proceed + " if " + c1 + " | " + c2 +
+                             " and " + k1 + " + " + k2 + " is down");
+                    }
+                }
+            }
+        }
+            
+    }
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/Handler/Click.html b/tests/Handler/Click.html
new file mode 100644
index 0000000..0ffa6ff
--- /dev/null
+++ b/tests/Handler/Click.html
@@ -0,0 +1,299 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_Click_constructor(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+        
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.Click(control, callbacks, options);
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_Handler_Click_activate(t) {
+        t.plan(2);
+        var control = {
+            map: new OpenLayers.Map('map')
+        };
+        var handler = new OpenLayers.Handler.Click(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        handler.dragging = true;
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+        
+    }
+    
+    function test_Handler_Click_events(t) {
+        t.plan(50);
+        
+        var map = new OpenLayers.Map('map');
+        var control = {
+            map: map
+        };
+        map.events.registerPriority = function(type, obj, func) {
+            var r = func();
+            if(typeof r == "string") {
+                // this is one of the mock handler methods
+                t.eq(OpenLayers.Util.indexOf(nonevents, type), -1,
+                     "registered method is not one of the events " +
+                     "that should not be handled");
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "activate calls registerPriority with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls registerPriority with a function");
+                t.eq(func(), type,
+                     "activate calls registerPriority with the correct method");
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler.Click",
+                     "activate calls registerPriority with the handler");
+            }
+        }
+        function setMethod(key) {
+            handler[key] = function() {return key};
+        }
+
+        // list below events that should be handled (events) and those
+        // that should not be handled (nonevents) by the handler
+        var events = ["click", "dblclick", "mousedown", "mouseup", "rightclick"];
+        var nonevents = ["mousemove", "resize", "focus", "blur"];
+        var handler = new OpenLayers.Handler.Click(control);
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        handler.activate();
+
+        // different listeners registered for pixelTolerance option
+        var events = ["click", "dblclick", "mousedown", "mouseup", "rightclick"];
+        var nonevents = ["mousemove", "resize", "focus", "blur"];
+        var handler = new OpenLayers.Handler.Click(control, {}, {
+            pixelTolerance: 2
+        });
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        handler.activate();
+
+    }
+
+    function test_Handler_Click_callbacks(t) {
+        t.plan(13);
+        
+        var map = new OpenLayers.Map('map', {controls: []});
+
+        var control = {
+            map: map
+        };
+
+        var handler = new OpenLayers.Handler.Click(control, {});
+        handler.activate();
+        
+        
+        // set up for single click - three tests here
+        var timers = {};
+        var sto = window.setTimeout;
+        window.setTimeout = function(func, delay) {
+            var key = Math.random();
+            timers[key] = true;
+            t.ok(typeof func == "function",
+                 "setTimeout called with a function");
+            t.eq(delay, handler.delay,
+                 "setTimeout called with proper delay");
+            // execute function that is supposed to be delayed
+            func();
+            return key;
+        }
+        var cto = window.clearTimeout;
+        window.clearTimeout = function(key) {
+            if(timers[key] === true) {
+                delete timers[key];
+            } else {
+                t.fail("clearTimeout called with non-existent timerId");
+            }
+        }
+        var testEvt = {id: Math.random()};
+        handler.callbacks = {
+            "click": function(evt) {
+                t.eq(evt.id, testEvt.id,
+                     "(click w/ single true) click callback called with correct evt");
+            },
+            "dblclick": function(evt) {
+                t.fail("(click w/ single true) dblclick should not be called here");
+            }
+        };
+        map.events.triggerEvent("click", testEvt);
+        
+        // set up for double click with double false - no tests here (only failures)
+        handler.callbacks = {
+            "click": function(evt) {
+                t.fail("(dblclick w/ double false) click should not be called here");
+            },
+            "dblclick": function(evt) {
+                t.fail("(dblclick w/ double false) dblclick should not be called here");
+            }
+        };
+        testEvt = Math.random();
+        map.events.triggerEvent("dblclick", testEvt);
+
+        // set up for double click with double true - one test here
+        handler.double = true;
+        handler.callbacks = {
+            "click": function(evt) {
+                t.fail("(dblclick w/ double true) click should not be called here");
+            },
+            "dblclick": function(evt) {
+                t.eq(evt, testEvt,
+                     "(dblclick w/ double true) dblclick called with correct evt");
+            }
+        };
+        testEvt = Math.random();
+        map.events.triggerEvent("dblclick", testEvt);
+        
+        // set up for two clicks with double true - 6 tests here (with timeout ones from above)
+        handler.double = true;
+        handler.callbacks = {
+            "click": function(evt) {
+                t.ok(evt != null, "(two clicks w/ double true) click will not be called here if next three tests pass");
+            },
+            "dblclick": function(evt) {
+                t.eq(evt, testEvt,
+                     "(two clicks w/ double true) dblclick called with correct evt");
+            }
+        };
+        testEvt = Math.random();
+        map.events.triggerEvent("click", testEvt);
+        t.ok(handler.timerId != null,
+             "(two clicks w/ double true) timer is set to call click");
+        map.events.triggerEvent("click", testEvt);
+        t.ok(handler.timerId == null,
+             "(two clicks w/ double true) timer is cleared to call click");
+        map.events.triggerEvent("dblclick", testEvt);
+        handler.destroy();
+        
+        // set up to tests pixelTolerance - three tests here (2 from setTimeout above)
+        handler = new OpenLayers.Handler.Click(control, {}, {
+            pixelTolerance: 2
+        });
+        handler.activate();
+        var downEvt = {
+            xy: new OpenLayers.Pixel(0, 0)
+        };
+        map.events.triggerEvent("mousedown", downEvt);
+        var clickEvt = {
+            xy: new OpenLayers.Pixel(0, 1)
+        };
+        // mouse moves one pixel, click should be called
+        handler.callbacks = {
+            "click": function(evt) {
+                t.ok(evt.xy == clickEvt.xy, "(pixelTolerance met) click called");
+            }
+        };
+        map.events.triggerEvent("click", clickEvt);
+        handler.clearTimer();
+        
+        // mouse moves 3x3 pixels, click should not be called
+        map.events.triggerEvent("mousedown", downEvt);
+        var clickEvt = {
+            xy: new OpenLayers.Pixel(3, 3)
+        };
+        // mouse moves one pixel, click should be called
+        handler.callbacks = {
+            "click": function(evt) {
+                t.fail("(pixelTolerance not met) click should not be called");
+            }
+        };
+        map.events.triggerEvent("click", clickEvt); // no test run
+        handler.clearTimer();
+        
+        window.setTimeout = sto;
+        window.clearTimeout = cto;
+        
+
+    }
+
+    function test_Handler_Click_deactivate(t) {
+        t.plan(4);
+        var control = {
+            map: new OpenLayers.Map('map')
+        };
+        var handler = new OpenLayers.Handler.Click(control);
+        handler.active = false;
+        var deactivated = handler.deactivate();
+        t.ok(!deactivated,
+             "deactivate returns false if the handler was not already active");
+        handler.active = true;
+        handler.down = true;
+        handler.timerId = true;
+        deactivated = handler.deactivate();
+        t.ok(deactivated,
+             "deactivate returns true if the handler was active already");
+        t.eq(handler.down, null,
+             "deactivate sets down to null");
+        t.eq(handler.timerId, null,
+             "deactivate sets timerId to null");
+    }
+
+    function test_Handler_Click_mouseup(t) {
+        t.plan(4);
+        g_Propagate = {};
+        g_evt = {};
+                
+      //no modifiers, no handlerightclicks, no isrightclick        
+        var temp = OpenLayers.Event.isRightClick;
+        OpenLayers.Event.isRightClick = function(e) { 
+            t.ok(e == g_evt, 'correct event passed in to checkModifiers');
+            return false; 
+        };
+
+        var h = {
+            'checkModifiers': function(e) {
+                t.ok(e == g_evt, 'correct event passed in to checkModifiers');
+                return false;
+            },
+            'control': {
+                'handleRightClicks': false
+            },
+            'rightclick': function(e) {
+                t.ok(e == g_evt, 'correct event passed in to checkModifiers');
+                return g_Propagate;
+            }
+        };
+        var propagate = OpenLayers.Handler.Click.prototype.mouseup.apply(h, [g_evt]);
+        t.ok(propagate, "default propagate is true when no modifiers, no handlerightclicks, no isrightclick")
+
+      //modifiers, handlerightclicks, and isrightclick
+        h.checkModifiers = function() { return true; };
+        h.control.handleRightClicks = true;        
+        OpenLayers.Event.isRightClick = function(e) { return true; };
+        propagate = OpenLayers.Handler.Click.prototype.mouseup.apply(h, [g_evt]);
+
+        t.ok(propagate == g_Propagate, "return from handler's rightClick() returned from mouseup");
+
+        OpenLayers.Event.isRightClick = temp;
+    }
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/Drag.html b/tests/Handler/Drag.html
new file mode 100644
index 0000000..581ffcc
--- /dev/null
+++ b/tests/Handler/Drag.html
@@ -0,0 +1,390 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_Drag_constructor(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+        
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.Drag(control, callbacks, options);
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_Handler_Drag_activate(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Drag(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        handler.dragging = true;
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+        t.ok(!handler.dragging,
+             "activate sets dragging to false");
+        
+    }
+    
+    function test_Handler_Drag_events(t) {
+        t.plan(25);
+        
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Drag(control);
+
+        // list below events that should be handled (events) and those
+        // that should not be handled (nonevents) by the handler
+        var events = ["mousedown", "mouseup", "mousemove", "mouseout", "click"];
+        var nonevents = ["dblclick", "resize", "focus", "blur"];
+        map.events.registerPriority = function(type, obj, func) {
+            var r = func();
+            if(typeof r == "string") {
+                // this is one of the mock handler methods
+                t.eq(OpenLayers.Util.indexOf(nonevents, type), -1,
+                     "registered method is not one of the events " +
+                     "that should not be handled");
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "activate calls registerPriority with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls registerPriority with a function");
+                t.eq(func(), type,
+                     "activate calls registerPriority with the correct method");
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler.Drag",
+                     "activate calls registerPriority with the handler");
+            }
+        }
+        
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        function setMethod(key) {
+            handler[key] = function() {return key};
+        }
+
+        var activated = handler.activate();
+
+    }
+
+    function test_Handler_Drag_callbacks(t) {
+        t.plan(33);
+        
+        var map = new OpenLayers.Map('map', {controls: []});
+
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        
+        // set callback methods (out doesn't get an xy)
+        var events = ["down", "move", "up", "done"];
+        var testEvents = {};
+        var xys = {};
+        var callbacks = {};
+        for(var i=0; i<events.length; ++i) {
+            var px = new OpenLayers.Pixel(Math.random(), Math.random());
+            testEvents[events[i]] = {xy: px};
+            setCallback(events[i]);
+        }
+        function setCallback(key) {
+            callbacks[key] = function(evtxy) {
+                t.ok(evtxy.x == testEvents[key].xy.x &&
+                     evtxy.y == testEvents[key].xy.y,
+                     key + " callback called with the proper evt.xy");
+            }
+        }
+
+        var handler = new OpenLayers.Handler.Drag(control, callbacks);
+        handler.activate();
+        
+        var oldIsLeftClick = OpenLayers.Event.isLeftClick;
+        var oldStop = OpenLayers.Event.stop;
+        var oldCheckModifiers = handler.checkModifiers;
+
+        // test mousedown with right click
+        OpenLayers.Event.isLeftClick = function() {
+            return false;
+        }
+        handler.checkModifiers = function() {
+            return true;
+        }
+        handler.started = true;
+        handler.start = {x: "foo", y: "bar"};
+        handler.last = {x: "foo", y: "bar"};
+        map.events.triggerEvent("mousedown", testEvents.down);
+        t.ok(!handler.started, "right-click sets started to false");
+        t.eq(handler.start, null, "right-click sets start to null");
+        t.eq(handler.last, null, "right-click sets last to null");
+
+        // test mousedown with improper modifier
+        OpenLayers.Event.isLeftClick = function() {
+            return true;
+        }
+        handler.checkModifiers = function() {
+            return false;
+        }
+        handler.started = true;
+        handler.start = {x: "foo", y: "bar"};
+        handler.last = {x: "foo", y: "bar"};
+        map.events.triggerEvent("mousedown", testEvents.down);
+        t.ok(!handler.started, "bad modifier sets started to false");
+        t.eq(handler.start, null, "bad modifier sets start to null");
+        t.eq(handler.last, null, "bad modifier sets last to null");
+
+        // test mousedown
+        handler.checkModifiers = function(evt) {
+            t.ok(evt.xy.x == testEvents.down.xy.x &&
+                 evt.xy.y == testEvents.down.xy.y,
+                 "mousedown calls checkModifiers with the proper event");
+            return true;
+        }
+        OpenLayers.Event.isLeftClick = function(evt) {
+            t.ok(evt.xy.x == testEvents.down.xy.x &&
+                 evt.xy.y == testEvents.down.xy.y,
+                 "mousedown calls isLeftClick with the proper event");
+            return true;
+        }
+        OpenLayers.Event.stop = function(evt, allowDefault) {
+            if(!allowDefault) {
+                t.ok(evt.xy.x == testEvents.down.xy.x &&
+                     evt.xy.y == testEvents.down.xy.y,
+                     "mousedown default action is disabled");
+            } else {
+                t.fail(
+                     "mousedown is prevented from falling to other elements");
+            }
+        }
+        map.events.triggerEvent("mousedown", testEvents.down);
+        t.ok(handler.started, "mousedown sets the started flag to true");
+        t.ok(!handler.dragging, "mouse down sets the dragging flag to false");
+        t.ok(handler.start.x == testEvents.down.xy.x &&
+             handler.start.y == testEvents.down.xy.y,
+             "mouse down sets handler.start correctly");
+        t.ok(handler.last.x == testEvents.down.xy.x &&
+             handler.last.y == testEvents.down.xy.y,
+             "mouse down sets handler.last correctly");
+        
+        OpenLayers.Event.stop = oldStop;        
+        OpenLayers.Event.isLeftClick = oldIsLeftClick;
+        handler.checkModifiers = oldCheckModifiers;
+
+        // test mouseup before mousemove
+        var realUp = testEvents.up;
+        testEvents.up = testEvents.down;
+        // this will fail with notice about the done callback being called
+        // if done is called when it shouldn't be
+        map.events.triggerEvent("mouseup", testEvents.up);
+        testEvents.up = realUp;
+
+        // test mousemove
+        handler.started = false;
+        map.events.triggerEvent("mousemove", {xy: {x: null, y: null}});
+        // if the handler triggers the move callback, it will be with the
+        // incorrect evt.xy
+        t.ok(true,
+             "mousemove before the handler has started doesn't call move");
+        
+        handler.started = true;
+        map.events.triggerEvent("mousemove", testEvents.move);
+        t.ok(handler.dragging, "mousemove sets the dragging flag to true");
+        t.ok(handler.start.x == testEvents.down.xy.x &&
+             handler.start.y == testEvents.down.xy.y,
+             "mouse move leaves handler.start alone");
+        t.ok(handler.last.x == testEvents.move.xy.x &&
+             handler.last.y == testEvents.move.xy.y,
+             "mouse move sets handler.last correctly");
+        
+        // a second move with the same evt.xy should not trigger move callback
+        // if it does, the test page will complain about a bad plan number
+        var oldMove = handler.callbacks.move;
+        handler.callbacks.move = function() {
+            t.ok(false,
+                 "a second move with the same evt.xy should not trigger a move callback");
+        }
+        map.events.triggerEvent("mousemove", testEvents.move);
+        handler.callbacks.move = oldMove;
+        
+        // test mouseup
+        handler.started = false;
+        map.events.triggerEvent("mouseup", {xy: {x: null, y: null}});
+        // if the handler triggers the up callback, it will be with the
+        // incorrect evt.xy
+        t.ok(true,
+             "mouseup before the handler has started doesn't call up");
+        
+        handler.started = true;
+        // mouseup triggers the up and done callbacks
+        testEvents.done = testEvents.up;
+        map.events.triggerEvent("mouseup", testEvents.up);
+        t.ok(!this.started, "mouseup sets the started flag to false");
+        t.ok(!this.dragging, "mouseup sets the dragging flag to false");
+        
+        // test mouseout
+        handler.started = false;
+        map.events.triggerEvent("mouseout", {xy: {x: null, y: null}});
+        // if the handler triggers the out or done callback, it will be with the
+        // incorrect evt.xy
+        t.ok(true,
+             "mouseout before the handler has started doesn't call out or done");
+        
+        handler.started = true;
+        var oldMouseLeft = OpenLayers.Util.mouseLeft;
+        OpenLayers.Util.mouseLeft = function(evt, element) {
+            t.ok(evt.xy.x == testEvents.done.xy.x &&
+                 evt.xy.y == testEvents.done.xy.y,
+                 "mouseout calls Util.mouseLeft with the correct event");
+            t.eq(element.id, map.div.id,
+                 "mouseout calls Util.mouseLeft with the correct element");
+            return true;
+        }
+        // mouseup triggers the out and done callbacks
+        // out callback gets no arguments
+        handler.callbacks.out = function() {
+            t.eq(arguments.length, 0,
+                 "mouseout calls out callback with no arguments");
+        }
+        map.events.triggerEvent("mouseout", testEvents.done);
+        t.ok(!handler.started, "mouseout sets started flag to false");
+        t.ok(!handler.dragging, "mouseout sets dragging flag to false");
+        OpenLayers.Util.mouseLeft = oldMouseLeft;
+        
+        // test click with the click.html example - the click method on the
+        // drag handler returns (handler.start == handler.last), stopping
+        // propagation of the click event if the mouse moved during a drag.
+        
+        // regression tests will assure that the drag handler doesn't mess
+        // with anything else on a click
+        function getProperties(obj) {
+            var props = {};
+            for(key in obj) {
+                if(typeof obj[key] != "function" && typeof obj[key] != "object") {
+                    props[key] = obj[key];
+                }
+            }
+            return props;
+        }
+        var before = getProperties(handler);
+        map.events.triggerEvent("click", null);
+        var after = getProperties(handler);
+        t.eq(before, after, "click doesn't mess with handler");
+        
+    }
+
+    function test_Handler_Drag_submethods(t) {
+        t.plan(8);
+        
+        var map = new OpenLayers.Map('map', {controls: []});
+
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        
+
+        var handler = new OpenLayers.Handler.Drag(control, {});
+        // set test events
+        var events = ["down", "move", "up", "out"];
+        var onselect = {
+            "move": OpenLayers.Function.False,
+            "up": OpenLayers.Function.False,
+            "out": OpenLayers.Function.True
+        }
+        var testEvents = {};
+        var type, px;
+        for(var i=0; i<events.length; ++i) {
+            type = events[i];
+            px = new OpenLayers.Pixel(Math.random(), Math.random());
+            testEvents[type] = {xy: px};
+            setMethod(type);
+        }
+        function setMethod(type) {
+            handler[type] = function(evt) {
+                t.ok(evt.xy.x == testEvents[type].xy.x &&
+                     evt.xy.y == testEvents[type].xy.y,
+                     "handler." + type + " called with the right event");
+                onselect[type] && t.ok(document.onselectstart === onselect[type], "document.onselectstart listener is correct after " + type);
+            }
+        }
+        handler.activate();
+        
+        // pretend that we have gone through a down-move-up-out cycle before
+        handler.oldOnselectstart = OpenLayers.Function.True;
+        
+        // test mousedown
+        handler.checkModifiers = function(evt) {
+            return true;
+        }
+        var oldIsLeftClick = OpenLayers.Event.isLeftClick;
+        OpenLayers.Event.isLeftClick = function(evt) {
+            return true;
+        }
+        map.events.triggerEvent("mousedown", testEvents.down);
+        OpenLayers.Event.isLeftClick = oldIsLeftClick;
+
+        // test mousemove
+        map.events.triggerEvent("mousemove", testEvents.move);
+        
+        // test mouseup
+        map.events.triggerEvent("mouseup", testEvents.up);
+        
+        // test mouseout
+        var oldMouseLeft = OpenLayers.Util.mouseLeft;
+        OpenLayers.Util.mouseLeft = function() {
+            return true;
+        };
+        handler.started = true;
+        map.events.triggerEvent("mouseout", testEvents.out);
+        OpenLayers.Util.mouseLeft = oldMouseLeft;
+        
+        t.ok(document.onselectstart === OpenLayers.Function.True, "document.onselectstart listener correct after down-move-up-out cycle");
+        
+    }
+
+    function test_Handler_Drag_deactivate(t) {
+        t.plan(6);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Drag(control);
+        handler.active = false;
+        var deactivated = handler.deactivate();
+        t.ok(!deactivated,
+             "deactivate returns false if the handler was not already active");
+        handler.active = true;
+        handler.dragging = true;
+        deactivated = handler.deactivate();
+        t.ok(deactivated,
+             "deactivate returns true if the handler was active already");
+        t.ok(!handler.started,
+             "deactivate sets started to false");
+        t.ok(!handler.dragging,
+             "deactivate sets dragging to false");
+        t.ok(handler.start == null,
+             "deactivate sets start to null");
+        t.ok(handler.last == null,
+             "deactivate sets start to null");
+    }
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/Feature.html b/tests/Handler/Feature.html
new file mode 100644
index 0000000..2f1e6de
--- /dev/null
+++ b/tests/Handler/Feature.html
@@ -0,0 +1,484 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_initialize(t) {
+        t.plan(4);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var layer = "boo";
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+        
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.Feature(control, layer,
+                                                     callbacks, options);
+        
+        t.eq(handler.layer, "boo",
+             "layer property properly set");
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_activate(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        map.addLayer(layer);
+        var handler = new OpenLayers.Handler.Feature(control, layer);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        
+        var zIndex = layer.div.style.zIndex;
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+        t.eq(parseInt(layer.div.style.zIndex),
+             map.Z_INDEX_BASE['Feature'],
+             "layer z-index properly adjusted");
+        
+    }
+    function test_events(t) {
+        t.plan(25);
+        
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        map.addLayer(layer);
+        var handler = new OpenLayers.Handler.Feature(control, layer);
+ 
+        // list below events that should be handled (events) and those
+        // that should not be handled (nonevents) by the handler
+        var events = ["mousedown", "mouseup", "mousemove", "click", "dblclick"];
+        var nonevents = ["mouseout", "resize", "focus", "blur"];
+        map.events.registerPriority = function(type, obj, func) {
+            var output = func();
+            // Don't listen for setEvent handlers (#902)
+            if (typeof output == "string") {
+                t.eq(OpenLayers.Util.indexOf(nonevents, type), -1,
+                     "registered method is not one of the events " +
+                     "that should not be handled");
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "activate calls registerPriority with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls registerPriority with a function");
+                t.eq(func(), type,
+                     "activate calls registerPriority with the correct method:"+type);
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler.Feature",
+                     "activate calls registerPriority with the handler");
+            }     
+        }
+        
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        function setMethod(key) {
+            handler[key] = function() {return key};
+        }
+ 
+        var activated = handler.activate();
+ 
+    }
+ 
+    function test_geometrytype_limit(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
+        feature.layer = layer;
+        layer.getFeatureFromEvent = function(evt) { return feature };
+        map.addLayer(layer);
+        var handler = new OpenLayers.Handler.Feature(control, layer, {}, {'geometryTypes':['OpenLayers.Geometry.Point']});
+        handler.activate();
+        handler.callback = function(type,featurelist) {
+            t.eq(featurelist[0].id, feature.id, "Correct feature called back on");
+        }
+        handler.handle({type: "click"});
+        handler.feature = null;
+        handler.lastFeature = null;
+        handler.callback = function(type,featurelist) {
+            t.fail("Shouldn't have called back on " + featurelist[0].geometry);
+        }    
+        feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.LineString(0,0));
+        feature.layer = layer;
+        handler.handle("click", {}); 
+    }
+
+    function test_callbacks(t) {
+        t.plan(9);
+        
+        var map = new OpenLayers.Map('map', {controls: []});
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        map.addLayer(layer);
+ 
+        var callbacks = {};
+        var newFeature, lastFeature;
+        var evtPx = {xy: new OpenLayers.Pixel(Math.random(), Math.random())};
+ 
+        // define a callback factory function
+        function getCallback(evt, feature) {
+            return function(f) {
+                t.ok(f == feature, evt + " callback called with proper feature");
+            };
+        }
+ 
+        // override the layer's getFeatureFromEvent func so that it always
+        // returns newFeature
+        layer.getFeatureFromEvent = function(evt) { return newFeature; };
+ 
+        var handler = new OpenLayers.Handler.Feature(control, layer, callbacks);
+        handler.activate();
+
+        // test click in new feature
+        // only 'click' callback should be called
+        handler.feature = null;
+        lastFeature = null;
+        newFeature = new OpenLayers.Feature.Vector();
+        newFeature.layer = layer;
+        callbacks['click'] = getCallback('click', newFeature);
+        callbacks['clickout'] = getCallback('clickout', lastFeature);
+        evtPx.type = "click";
+        map.events.triggerEvent('click', evtPx);
+
+        // test click in new feature and out of last feature
+        // both 'click' and 'clickout' callbacks should be called
+        lastFeature = newFeature;
+        newFeature = new OpenLayers.Feature.Vector();
+        newFeature.layer = layer;
+        callbacks['click'] = getCallback('click', newFeature);
+        callbacks['clickout'] = getCallback('clickout', lastFeature);
+        evtPx.type = "click";
+        map.events.triggerEvent('click', evtPx);
+
+        // test click out of last feature
+        // only 'clickout' callback should be called
+        lastFeature = newFeature;
+        newFeature = null;
+        callbacks['click'] = getCallback('click', newFeature);
+        callbacks['clickout'] = getCallback('clickout', lastFeature);
+        evtPx.type = "click";
+        map.events.triggerEvent('click', evtPx);
+
+        layer.getFeatureFromEvent = function(evt) { t.fail("mousemove called getFeatureFromEvent without any mousemove callbacks"); };
+        evtPx.type = "mousemove";
+        map.events.triggerEvent('mousemove', evtPx);
+        layer.getFeatureFromEvent = function(evt) { return newFeature; };
+        
+        // test over a new feature
+        // only 'over' callback should be called
+        handler.feature = null;
+        lastFeature = null;
+        newFeature = new OpenLayers.Feature.Vector();
+        newFeature.layer = layer;
+        callbacks['over'] = getCallback('over', newFeature);
+        callbacks['out'] = getCallback('out', lastFeature);
+        evtPx.type = "mousemove";
+        map.events.triggerEvent('mousemove', evtPx);
+
+        // test over a new feature and out of last feature
+        // both 'over' and 'out' callbacks should be called
+        lastFeature = newFeature;
+        newFeature = new OpenLayers.Feature.Vector();
+        newFeature.layer = layer;
+        callbacks['over'] = getCallback('over', newFeature);
+        callbacks['out'] = getCallback('out', lastFeature);
+        evtPx.type = "mousemove";
+        map.events.triggerEvent('mousemove', evtPx);
+
+        // test out of last feature
+        // only 'out' callback should be called
+        lastFeature = newFeature;
+        newFeature = null;
+        callbacks['over'] = getCallback('over', newFeature);
+        callbacks['out'] = getCallback('out', lastFeature);
+        evtPx.type = "mousemove";
+        map.events.triggerEvent('mousemove', evtPx);
+
+        // test dblclick on a feature
+        // 'dblclick' callback should be called
+        handler.feature = null;
+        lastFeature = null;
+        newFeature = new OpenLayers.Feature.Vector();
+        newFeature.layer = layer;
+        callbacks['dblclick'] = getCallback('dblclick', newFeature);
+        evtPx.type = "dblclick";
+        map.events.triggerEvent('dblclick', evtPx);
+    }
+
+    function test_deactivate(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        map.addLayer(layer);
+        var layerIndex = parseInt(layer.div.style.zIndex);
+        
+        var handler = new OpenLayers.Handler.Feature(control, layer);
+        handler.active = false;
+        var deactivated = handler.deactivate();
+        t.ok(!deactivated,
+             "deactivate returns false if the handler was not already active");
+        
+        handler.active = true;
+
+        deactivated = handler.deactivate();
+        t.ok(deactivated,
+             "deactivate returns true if the handler was active already");
+        t.eq(parseInt(layer.div.style.zIndex),
+             layerIndex,
+             "deactivate sets the layer z-index back");
+    }
+
+    function test_stopHandled(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        map.addLayer(layer);
+        var handler = new OpenLayers.Handler.Feature(control, layer);
+        handler.activate();
+        handler.handle = function(evt) { return /* handled */ true; };
+        var  evtPx = {xy: new OpenLayers.Pixel(Math.random(), Math.random())};
+        map.events.register("click", map, function(e) {
+            t.ok(!handler.stopClick, "clicks propagate with stopClick set to false" );
+        });
+        map.events.register("mousedown", map, function(e) {
+            t.ok(!handler.stopDown, "mousedown propagate with stopDown set to false" );
+        });
+        map.events.register("mouseup", map, function(e) {
+            t.ok(!handler.stopUp, "mouseup propagate with stopUp set to false" );
+        });
+
+        // 0 test
+        map.events.triggerEvent('click', evtPx);
+        // 0 test
+        map.events.triggerEvent('mousedown', evtPx);
+        // 0 test
+        map.events.triggerEvent('mousedown', evtPx);
+
+        // 1 test
+        handler.stopClick = false;
+        map.events.triggerEvent('click', evtPx);
+        // 1 test
+        handler.stopDown = false;
+        map.events.triggerEvent('mousedown', evtPx);
+        // 1 test
+        handler.stopUp = false;
+        map.events.triggerEvent('mouseup', evtPx);
+        
+        // 3 tests total
+    }
+
+    function test_destroyed_feature(t) {
+        t.plan(18);
+        
+        // setup
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var layer = new OpenLayers.Layer();
+        layer.removeFeatures = function() {};
+        map.addLayer(layer);
+        var handler = new OpenLayers.Handler.Feature(control, layer);
+        var feature, count, lastType, lastHandled;
+        handler.callback = function(type, features) {
+            ++count;
+            lastType = type;
+            lastHandled = features;
+        }
+
+        /**
+         * Test that a destroyed feature doesn't get sent to the "click" callback
+         */
+        count = 0;
+        handler.activate();
+        feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
+        feature.layer = layer;
+        // mock click on a feature
+        layer.getFeatureFromEvent = function(evt) {return feature};
+        handler.handle({type: "click"});
+        // confirm that feature was handled
+        t.eq(count, 1, "[click] callback called once");
+        t.eq(lastType, "click", "[click] correct callback type");
+        t.eq(lastHandled[0].id, feature.id, "[click] correct feature sent to callback");
+        
+        // now destroy the feature and confirm that the callback is not called again
+        feature.destroy();
+        handler.handle({type: "click"});
+        if(count === 1) {
+            t.ok(true, "[click] callback not called after destroy");
+        } else {
+            t.fail("[click] callback called after destroy: " + lastType);
+        }
+        
+        /**
+         * Test that a destroyed feature doesn't get sent to the "clickout" callback
+         */
+        count = 0;
+        handler.deactivate();
+        handler.activate();
+        feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
+        feature.layer = layer;
+
+        // mock a click on a feature
+        layer.getFeatureFromEvent = function(evt) {return feature};
+        handler.handle({type: "click"});
+        // confirm that callback got feature
+        t.eq(count, 1, "[clickout] callback called once on in");
+        t.eq(lastType, "click", "[clickout] click callback called on in");
+        t.eq(lastHandled.length, 1, "[clickout] callback called with one feature");
+        t.eq(lastHandled[0].id, feature.id, "[clickout] callback called with correct feature");
+
+        // now mock a click off a destroyed feature
+        feature.destroy();
+        layer.getFeatureFromEvent = function(evt) {return null};
+        handler.handle({type: "click"});
+        // confirm that callback does not get called
+        if(count === 1) {
+            t.ok(true, "[clickout] callback not called when clicking out of a destroyed feature");
+        } else {
+            t.fail("[clickout] callback called when clicking out of a destroyed feature: " + lastType);
+        }
+        
+        /**
+         * Test that a destroyed feature doesn't get sent to the "over" callback
+         */
+        count = 0;
+        handler.deactivate();
+        handler.activate();
+        feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
+        feature.layer = layer;
+        // mock mousemove over a feature
+        layer.getFeatureFromEvent = function(evt) {return feature};
+        handler.handle({type: "mousemove"});
+        // confirm that feature was handled
+        t.eq(count, 1, "[over] callback called once");
+        t.eq(lastType, "over", "[over] correct callback type");
+        t.eq(lastHandled[0].id, feature.id, "[over] correct feature sent to callback");
+        
+        // now destroy the feature and confirm that the callback is not called again
+        feature.destroy();
+        handler.handle({type: "mousemove"});
+        if(count === 1) {
+            t.ok(true, "[over] callback not called after destroy");
+        } else {
+            t.fail("[over] callback called after destroy: " + lastType);
+        }
+
+        /**
+         * Test that a destroyed feature doesn't get sent to the "out" callback
+         */
+        count = 0;
+        handler.deactivate();
+        handler.activate();
+        feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,0));
+        feature.layer = layer;
+
+        // mock a mousemove over a feature
+        layer.getFeatureFromEvent = function(evt) {return feature};
+        handler.handle({type: "mousemove"});
+        // confirm that callback got feature
+        t.eq(count, 1, "[out] callback called once on over");
+        t.eq(lastType, "over", "[out] click callback called on over");
+        t.eq(lastHandled.length, 1, "[out] callback called with one feature");
+        t.eq(lastHandled[0].id, feature.id, "[out] callback called with correct feature");
+
+        // now mock a click off a destroyed feature
+        feature.destroy();
+        layer.getFeatureFromEvent = function(evt) {return null};
+        handler.handle({type: "mousemove"});
+        // confirm that callback does not get called
+        if(count === 1) {
+            t.ok(true, "[out] callback not called when moving out of a destroyed feature");
+        } else {
+            t.fail("[out] callback called when moving out of a destroyed feature: " + lastType);
+        }
+        
+        handler.destroy();
+    }
+
+    function test_click_tolerance(t) {
+        t.plan(3);
+
+        var map, control, layer, feature, evtPx;
+        var clicks, callbacks, handler;
+
+        map = new OpenLayers.Map('map', {controls: []});
+        control = new OpenLayers.Control();
+        map.addControl(control);
+        layer = new OpenLayers.Layer();
+        map.addLayer(layer);
+ 
+        feature = new OpenLayers.Feature.Vector();
+        feature.layer = layer;
+
+        evtPx = {
+            xy: new OpenLayers.Pixel(Math.random(), Math.random()),
+            type: "click"
+        };
+ 
+        // override the layer's getFeatureFromEvent func so that it always
+        // returns newFeature
+        layer.getFeatureFromEvent = function(evt) { return feature; };
+
+        callbacks = {
+            click: function() {
+                clicks++;
+            }
+        };
+ 
+        handler = new OpenLayers.Handler.Feature(
+            control, layer, callbacks, {clickTolerance: 4});
+        handler.activate();
+        handler.down = {x: 0, y: 0};
+
+        // distance between down and up is 1, which is
+        // lower than clickTolerance so "click" should trigger
+        handler.up = {x: 1, y: 0};
+        clicks = 0;
+        map.events.triggerEvent("click", evtPx);
+        t.eq(clicks, 1, "click callback triggers when tolerance is not reached (lower than)");
+
+        // distance between down and up is 4, which is
+        // equal to clickTolerance so "click" should trigger
+        handler.up = {x: 0, y: 4};
+        clicks = 0;
+        map.events.triggerEvent("click", evtPx);
+        t.eq(clicks, 1, "click callback triggers when tolerance is not reached (equal to)");
+
+        // distance between down and up is 5, which is
+        // greater than clickTolerance so "click" should not trigger
+        handler.up = {x: 5, y: 0};
+        clicks = 0;
+        map.events.triggerEvent("click", evtPx);
+        t.eq(clicks, 0, "click callback does not trigger when tolerance is reached");
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/Hover.html b/tests/Handler/Hover.html
new file mode 100644
index 0000000..075aa14
--- /dev/null
+++ b/tests/Handler/Hover.html
@@ -0,0 +1,136 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_Hover_events(t) {
+        t.plan(10);
+        
+        var map = new OpenLayers.Map('map');
+        var control = {
+            map: map
+        };
+        map.events.registerPriority = function(type, obj, func) {
+            var r = func();
+            if(typeof r == "string") {
+                // this is one of the mock handler methods
+                t.eq(OpenLayers.Util.indexOf(nonevents, type), -1,
+                     "registered method is not one of the events " +
+                     "that should not be handled");
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "activate calls registerPriority with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls registerPriority with a function");
+                t.eq(func(), type,
+                     "activate calls registerPriority with the correct method");
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler.Hover",
+                     "activate calls registerPriority with the handler");
+            }
+        }
+        function setMethod(key) {
+            handler[key] = function() {return key};
+        }
+
+        // list below events that should be handled (events) and those
+        // that should not be handled (nonevents) by the handler
+        var events = ["mousemove", "mouseout"];
+        var nonevents = ["mousedown", "mouseup", "click", "dblclick", "resize", "focus", "blur"];
+        var handler = new OpenLayers.Handler.Hover(control);
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        handler.activate();
+    }
+
+    function test_Handler_Hover_callbacks(t) {
+        t.plan(8);
+        
+        var map = new OpenLayers.Map('map', {controls: []});
+
+        var control = {
+            map: map
+        };
+        
+        var timers = {};
+        var sto = window.setTimeout;
+        window.setTimeout = function(func, delay) {
+            var key = Math.random();
+            timers[key] = true;
+            t.ok(typeof func == "function",
+                 "setTimeout called with a function");
+            t.eq(delay, handler.delay,
+                 "setTimeout called with proper delay");
+            // execute function that is supposed to be delayed
+            func();
+            return key;
+        }
+        var cto = window.clearTimeout;
+        window.clearTimeout = function(key) {
+            if(timers[key] === true) {
+                delete timers[key];
+            } else {
+                t.fail("clearTimeout called with non-existent timerId");
+            }
+        }
+
+        var handler = new OpenLayers.Handler.Hover(control, {});
+        handler.activate();
+        var testEvt;
+
+        // test pause and move callbacks - four tests here (2 from setTimeout above)
+        testEvt = {id: Math.random()};
+        handler.callbacks = {
+            "pause": function(evt) {
+                t.eq(evt.id, testEvt.id,
+                     "pause callback called with correct evt");
+            },
+            "move": function(evt) {
+               t.eq(evt.id, testEvt.id,
+                   "move callback called with correct evt");
+            }
+        };
+        map.events.triggerEvent("mousemove", testEvt);
+        handler.clearTimer();
+
+        // test pixelTolerance - four tests here (2 from setTimeout above)
+        handler.pixelTolerance = 2;
+        handler.px = new OpenLayers.Pixel(0, 0);
+        testEvt = {
+            xy: new OpenLayers.Pixel(0, 1)
+        };
+        // mouse moves one pixel, callbacks shouldn't be called
+        handler.callbacks = {
+            "pause": function(evt) {
+                t.fail("(pixelTolerance met) pause callback shouldn't be called");
+            },
+            "move": function(evt) {
+                t.fail("(pixelTolerance met) move callback shoudln't be called");
+            }
+        };
+        map.events.triggerEvent("mousemove", testEvt);
+        handler.clearTimer();
+        handler.px = new OpenLayers.Pixel(0, 0);
+        testEvt = {
+            xy: new OpenLayers.Pixel(3, 3)
+        };
+        // mouse moves 3x3 pixels, callbacks should be called
+        handler.callbacks =  {
+            "pause": function(evt) {
+                t.ok(evt.xy == testEvt.xy, "(pixelTolerance unmet) pause callback called");
+            },
+            "move": function(evt) {
+                t.ok(evt == testEvt, "(pixelTolerance unmet) move callback called");
+            }
+        };
+        map.events.triggerEvent("mousemove", testEvt);
+        handler.clearTimer();
+
+        window.setTimeout = sto;
+        window.clearTimeout = cto;
+   }
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/Keyboard.html b/tests/Handler/Keyboard.html
new file mode 100644
index 0000000..0ea739c
--- /dev/null
+++ b/tests/Handler/Keyboard.html
@@ -0,0 +1,106 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_Keyboard_initialize(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+        
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.Keyboard(control, callbacks,
+                                                      options);
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_Handler_Keyboard_destroy(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();        
+        var handler = new OpenLayers.Handler.Keyboard(control);
+        var old = OpenLayers.Handler.prototype.destroy;
+        t.ok(handler.eventListener != null,
+             "eventListener is not null before destroy");
+        OpenLayers.Handler.prototype.destroy = function() {
+            t.ok(true, "destroy calls destroy on correct parent");
+        };
+        handler.destroy();
+        t.ok(handler.eventListener == null,
+             "eventListeners is null after destroy");
+        OpenLayers.Handler.prototype.destroy = old;
+    }
+
+    function test_Handler_Keyboard_activate(t) {
+        t.plan(8);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Keyboard(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        handler.dragging = true;
+        var old = OpenLayers.Event.stopObserving;
+        var types = ["keydown", "keyup"];
+        OpenLayers.Event.observe = function(obj, type, method) {
+            t.ok(obj == document,
+                 "activate calls observing with correct object");
+            var validType = (OpenLayers.Util.indexOf(types, type) != -1);
+            t.ok(validType, "activate calls observe for " + type);
+            t.ok(method == handler.eventListener,
+                 "activate calls observing with correct method");
+        };
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+        OpenLayers.Event.observe = old;
+        
+    }
+
+    function test_Handler_Drag_deactivate(t) {
+        t.plan(8);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Keyboard(control);
+        handler.active = false;
+        var deactivated = handler.deactivate();
+        t.ok(!deactivated,
+             "deactivate returns false if the handler was not already active");
+        handler.active = true;
+        var old = OpenLayers.Event.stopObserving;
+        var types = ["keydown", "keyup"];
+        OpenLayers.Event.stopObserving = function(obj, type, method) {
+            t.ok(obj == document,
+                 "deactivate calls stopObserving with correct object");
+            var validType = (OpenLayers.Util.indexOf(types, type) != -1);
+            t.ok(validType, "deactivate calls stopObserving for " + type);
+            t.ok(method == handler.eventListener,
+                 "deactivate calls stopObserving with correct method");
+        };
+        deactivated = handler.deactivate();
+        t.ok(deactivated,
+             "deactivate returns true if the handler was active already");
+        OpenLayers.Event.stopObserving = old;
+    }
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/MouseWheel.html b/tests/Handler/MouseWheel.html
new file mode 100644
index 0000000..d5e340b
--- /dev/null
+++ b/tests/Handler/MouseWheel.html
@@ -0,0 +1,182 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_MouseWheel_constructor(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+        
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.MouseWheel(control, callbacks, options);
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_Handler_MouseWheel_activate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.MouseWheel(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+    }
+    
+    function test_Handler_MouseWheel_mousePosition(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("","",{}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var pass = false;
+        var handler = new OpenLayers.Handler.MouseWheel(control, {'up': 
+          function (evt) { 
+                if (evt.xy) { pass = true; }
+          }
+        });
+        handler.setMap(map);
+        handler.activate();
+        var delta = 120;
+        if (window.opera && window.opera.version() < 9.2)  delta = -delta;
+        handler.onWheelEvent({'target':map.layers[0].div, wheelDelta: delta});
+        t.ok(pass, "evt.xy was set even without a mouse move");
+    }    
+    
+    function test_Handler_MouseWheel_events(t) {
+        t.plan(6);
+        
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("","",{}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var deltaZ;
+        var handler = new OpenLayers.Handler.MouseWheel(control, {
+            'up': function(evt, delta){
+                deltaZ = delta;
+            }
+        }, {interval: 200});
+
+        // list below events that should be handled (events) and those
+        // that should not be handled (nonevents) by the handler
+        var events = ["mousemove"];
+        var nonevents = ["dblclick", "resize", "focus", "blur"];
+        map.events.registerPriority = function(type, obj, func) {
+            var r = func();
+            if(typeof r == "string") {
+                t.eq(OpenLayers.Util.indexOf(nonevents, type), -1,
+                     "registered method is not one of the events " +
+                     "that should not be handled");
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "activate calls registerPriority with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls registerPriority with a function");
+                t.eq(func(), type,
+                     "activate calls registerPriority with the correct method");
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler.MouseWheel",
+                     "activate calls registerPriority with the handler");
+            }
+        }
+        
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        function setMethod(key) {
+            handler[key] = function() {return key};
+        }
+
+        var activated = handler.activate();
+        
+        var delta = 120;
+        if (window.opera && window.opera.version() < 9.2)  delta = -delta;
+        handler.onWheelEvent({'target':map.layers[0].div, wheelDelta: delta});
+        handler.onWheelEvent({'target':map.layers[0].div, wheelDelta: delta});
+        t.delay_call(1, function() {
+            t.eq(deltaZ, 2, "Multiple scroll actions triggered one event when interval is set");
+        });
+    }
+
+    function test_Handler_MouseWheel_cumulative(t) {
+        t.plan(1);
+
+        var deltaUp = 0;
+        var callbacks = {
+            up: function(evt, delta) {
+                deltaUp += delta;
+            }
+        };
+
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("","",{}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control({});
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.MouseWheel(control, callbacks, {
+            interval: 150,
+            cumulative: false    
+        });
+
+        var delta = 120;
+        // generate 20 scroll up in non cumulative mode
+        if (window.opera && window.opera.version() < 9.2)  delta = -delta;
+        for (var i=0; i < 20; i++) {
+            handler.onWheelEvent({'target':map.layers[0].div, wheelDelta: delta});
+        }
+        
+        t.delay_call(1, function() {
+            t.eq(deltaUp, 1, "Non cumulative mode works");
+        });
+    }
+
+    function test_Handler_MouseWheel_deactivate(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.MouseWheel(control);
+        handler.active = false;
+        var deactivated = handler.deactivate();
+        t.ok(!deactivated,
+             "deactivate returns false if the handler was not already active");
+        handler.active = true;
+        deactivated = handler.deactivate();
+        t.ok(deactivated,
+             "deactivate returns true if the handler was active already");
+    }
+    function test_handler_MouseWheel_destroy(t) {
+        t.plan(1);
+        var control = new OpenLayers.Control();
+        var handler = new OpenLayers.Handler.MouseWheel(control);
+        handler.deactivate = function() { 
+            t.ok(true, "Deactivate called one time.");
+        }    
+        handler.destroy();
+    }
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/Path.html b/tests/Handler/Path.html
new file mode 100644
index 0000000..a46a055
--- /dev/null
+++ b/tests/Handler/Path.html
@@ -0,0 +1,186 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_Path_constructor(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+        
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.Path(control, callbacks, options);
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_Handler_Path_activation(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Path(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+        activated = handler.deactivate();
+        t.ok(activated,
+             "deactivate returns true if the handler was active already");
+        map.destroy();     
+    }
+
+    function test_Handler_Path_bounds(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Path(control, {});
+        var activated = handler.activate();
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.mousedown(evt);
+        handler.mouseup(evt);
+        var evt = {xy: new OpenLayers.Pixel(175, 100), which: 1};
+        handler.mousemove(evt);
+        handler.mousedown(evt);
+        handler.mouseup(evt);
+        t.ok(handler.line.geometry.getBounds().equals(new OpenLayers.Bounds(0,-35.15625,35.15625,0)), "Correct bounds"); 
+        var evt = {xy: new OpenLayers.Pixel(175, 100), which: 1};
+        handler.mousedown(evt);
+        var evt = {xy: new OpenLayers.Pixel(125, 100), which: 1};
+        handler.mousemove(evt);
+        t.ok(!handler.line.geometry.getBounds().equals(new OpenLayers.Bounds(0,-35.15625,35.15625,0)), "Correct bounds after dragging without letting go. (Came out as "+handler.line.geometry.getBounds().toBBOX() + ".)"); 
+        map.destroy();     
+    }     
+
+    function test_callbacks(t) {
+        t.plan(15);
+        var map = new OpenLayers.Map("map", {
+            resolutions: [1]
+        });
+        var layer = new OpenLayers.Layer.Vector("foo", {
+            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+        var control = new OpenLayers.Control({
+        });
+        var log = {};
+        var handler = new OpenLayers.Handler.Path(control, {
+            create: function() {
+                log.type = "create",
+                log.args = arguments
+            },
+            modify: function() {
+                log.type = "modify",
+                log.args = arguments
+            },
+            done: function() {
+                log.type = "done",
+                log.args = arguments
+            },
+            cancel: function() {
+                log.type = "cancel",
+                log.args = arguments
+            }
+        });
+        control.handler = handler;
+        map.addControl(control);
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+        
+        // mock up feature drawing
+        handler.activate();
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
+        t.eq(log.type, "create", "[mousedown] create called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75), "[mousedown] correct vertex");
+        t.ok(log.args[1] === handler.line, "[mousedown] correct sketch feature");
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
+        t.eq(log.type, "modify", "[mouseup] modify called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75), "[mouseup] correct vertex");
+        t.ok(log.args[1] === handler.line, "[mouseup] correct sketch feature");
+        handler.mousemove({type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
+        t.eq(log.type, "modify", "[mousemove] modify called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-149, 74), "[mousemove] correct vertex");
+        t.ok(log.args[1] === handler.line, "[mousemove] correct sketch feature");
+        handler.mousemove({type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
+        t.eq(log.type, "modify", "[mousemove] modify called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-140, 65), "[mousemove] correct vertex");
+        t.ok(log.args[1] === handler.line, "[mousemove] correct sketch feature");
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(10, 10)});
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(10, 10)});
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(10, 10)});
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(10, 10)});
+        handler.dblclick({type: "dblclick", xy: new OpenLayers.Pixel(10, 10)});
+        t.eq(log.type, "done", "[dblclick] done called");
+        t.geom_eq(
+            log.args[0],
+            new OpenLayers.Geometry.LineString([
+                new OpenLayers.Geometry.Point(-150, 75),
+                new OpenLayers.Geometry.Point(-140, 65)
+            ]),
+            "[dblclick] correct linestring"
+        );
+        
+        // mock up sketch cancel
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
+        handler.mousemove({type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
+        handler.deactivate();
+        t.eq(log.type, "cancel", "[deactivate while drawing] cancel called");
+        
+        map.destroy();
+    }        
+
+    function test_Handler_Path_destroy(t) {
+        t.plan(6);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Path(control, {foo: 'bar'});
+
+        handler.activate();
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.mousedown(evt);
+
+        t.ok(handler.layer,
+             "handler has a layer prior to destroy");
+        t.ok(handler.point,
+             "handler has a point prior to destroy");
+        t.ok(handler.line,
+             "handler has a line prior to destroy");
+        handler.destroy();
+        t.eq(handler.layer, null,
+             "handler.layer is null after destroy");
+        t.eq(handler.point, null,
+             "handler.point is null after destroy");
+        t.eq(handler.line, null,
+             "handler.line is null after destroy");
+        map.destroy();     
+    }
+    
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/Point.html b/tests/Handler/Point.html
new file mode 100644
index 0000000..fb10edf
--- /dev/null
+++ b/tests/Handler/Point.html
@@ -0,0 +1,227 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_Point_constructor(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+        
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.Point(control, callbacks, options);
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_Handler_Point_activation(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Point(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+        activated = handler.deactivate();
+        t.ok(activated,
+             "deactivate returns true if the handler was active already");
+    }
+
+    function test_Handler_Point_events(t) {
+        t.plan(29);
+        
+        var map = new OpenLayers.Map('map');
+        var control = {
+            map: map
+        };
+        var handler = new OpenLayers.Handler.Point(control);
+
+        // list below events that should be handled (events) and those
+        // that should not be handled (nonevents) by the handler
+        var events = ["click", "dblclick", "mousedown", "mouseup", "mousemove"];
+        var nonevents = ["mouseout", "resize", "focus", "blur"];
+        map.events.registerPriority = function(type, obj, func) {
+            var r = func();
+            if(typeof r == "string") {
+                // this is one of the mock handler methods
+                t.eq(OpenLayers.Util.indexOf(nonevents, type), -1,
+                     "registered method is not one of the events " +
+                     "that should not be handled");
+                t.ok(OpenLayers.Util.indexOf(events, type) > -1,
+                     "activate calls registerPriority with browser event: " + type);
+                t.eq(typeof func, "function",
+                     "activate calls registerPriority with a function");
+                t.eq(func(), type,
+                     "activate calls registerPriority with the correct method");
+                t.eq(obj["CLASS_NAME"], "OpenLayers.Handler.Point",
+                     "activate calls registerPriority with the handler");
+            }
+        }
+        
+        // set browser event like properties on the handler
+        for(var i=0; i<events.length; ++i) {
+            setMethod(events[i]);
+        }
+        function setMethod(key) {
+            handler[key] = function() {return key};
+        }
+
+        var activated = handler.activate();
+        handler.destroy();
+
+        // test that click and dblclick are stopped
+        var handler = new OpenLayers.Handler.Point(control);
+        var oldStop = OpenLayers.Event.stop;
+        OpenLayers.Event.stop = function(evt) {
+            t.ok(evt.type == "click" || evt.type == "dblclick",
+                 evt.type + " stopped");
+        }
+        t.eq(handler.click({type: "click"}), false, "click returns false");
+        t.eq(handler.dblclick({type: "dblclick"}), false, "dblclick returns false");
+        OpenLayers.Event.stop = oldStop;
+
+    }
+    
+    function test_callbacks(t) {
+        t.plan(10);
+        var map = new OpenLayers.Map("map", {
+            resolutions: [1]
+        });
+        var layer = new OpenLayers.Layer.Vector("foo", {
+            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+        var control = new OpenLayers.Control({
+        });
+        var log = {};
+        var handler = new OpenLayers.Handler.Point(control, {
+            create: function() {
+                log.type = "create",
+                log.args = arguments
+            },
+            modify: function() {
+                log.type = "modify",
+                log.args = arguments
+            },
+            done: function() {
+                log.type = "done",
+                log.args = arguments
+            },
+            cancel: function() {
+                log.type = "cancel",
+                log.args = arguments
+            }
+        });
+        control.handler = handler;
+        map.addControl(control);
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+        
+        // mock up feature drawing
+        handler.activate();
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
+        t.eq(log.type, "create", "[mousedown] create called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75), "[mousedown] correct point");
+        t.geom_eq(log.args[1].geometry, new OpenLayers.Geometry.Point(-150, 75), "[mousedown] correct sketch feature");
+        handler.mousemove({type: "mousemove", xy: new OpenLayers.Pixel(1, 0)});
+        t.eq(log.type, "modify", "[mousemove] modify called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-149, 75), "[mousemove] correct point");
+        t.geom_eq(log.args[1].geometry, new OpenLayers.Geometry.Point(-149, 75), "[mousemove] correct sketch feature");
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(1, 0)});
+        t.eq(log.type, "done", "[mouseup] done called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-149, 75), "[mouseup] correct point");
+
+        // mock up feature drawing with a cancel
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
+        handler.deactivate();
+        t.eq(log.type, "cancel", "[deactivate while drawing] cancel called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75), "[deactivate while drawing] correct point");
+        
+        map.destroy();
+    }
+
+
+    function test_Handler_Point_deactivation(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+             
+        var handler = new OpenLayers.Handler.Point(control, {foo: 'bar'});
+        handler.activate();
+        handler.layer.destroy();
+        handler.deactivate();
+        t.eq(handler.layer, null,
+             "deactivate doesn't throw an error if layer was" +
+             " previously destroyed");
+    }
+
+    function test_Handler_Point_bounds(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Point(control, {});
+        var activated = handler.activate();
+        var px = new OpenLayers.Pixel(150, 75);
+        var evt = {xy: px, which: 1};
+        handler.mousedown(evt);
+        var lonlat = map.getLonLatFromPixel(px);
+        t.eq(handler.point.geometry.x, lonlat.lon, "X is correct"); 
+        t.eq(handler.point.geometry.y, lonlat.lat, "Y is correct"); 
+        t.ok(handler.point.geometry.getBounds().equals(new OpenLayers.Bounds(lonlat.lon,lonlat.lat,lonlat.lon,lonlat.lat)), "Correct bounds"); 
+        var evt = {xy: new OpenLayers.Pixel(175, 100), which: 1};
+        handler.mousemove(evt);
+        t.ok(!handler.point.geometry.getBounds().equals(new OpenLayers.Bounds(0,0,0,0)), "Bounds changed after moving mouse"); 
+    }     
+        
+    function test_Handler_Point_destroy(t) {
+        t.plan(4);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Point(control, {foo: 'bar'});
+
+        handler.activate();
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.mousedown(evt);
+
+        t.ok(handler.layer,
+             "handler has a layer prior to destroy");
+        t.ok(handler.point,
+             "handler has a point prior to destroy");
+        handler.destroy();
+        t.eq(handler.layer, null,
+             "handler.layer is null after destroy");
+        t.eq(handler.point, null,
+             "handler.point is null after destroy");
+    }
+    
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/Polygon.html b/tests/Handler/Polygon.html
new file mode 100644
index 0000000..dba05cb
--- /dev/null
+++ b/tests/Handler/Polygon.html
@@ -0,0 +1,201 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_Polygon_constructor(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.Polygon(control, callbacks, options);
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_Handler_Polygon_activation(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Polygon(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+        activated = handler.deactivate();
+        t.ok(activated,
+             "deactivate returns true if the handler was active already");
+        map.destroy();     
+    }
+
+    function test_Handler_Polygon_bounds(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Polygon(control, {});
+        var activated = handler.activate();
+
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.mousedown(evt);
+        handler.mouseup(evt);
+        var evt = {xy: new OpenLayers.Pixel(175, 100), which: 1};
+        handler.mousemove(evt);
+        handler.mousedown(evt);
+        handler.mouseup(evt);
+        t.ok(handler.line.geometry.getBounds().equals(new OpenLayers.Bounds(0,-35.15625,35.15625,0)), "Correct bounds");
+        var evt = {xy: new OpenLayers.Pixel(175, 100), which: 1};
+        handler.mousedown(evt);
+        var evt = {xy: new OpenLayers.Pixel(125, 100), which: 1};
+        handler.mousemove(evt);
+        t.ok(!handler.polygon.geometry.getBounds().equals(new OpenLayers.Bounds(0,-35.15625,35.15625,0)),
+             "Correct bounds after dragging without letting go. (Came out as "+handler.line.geometry.getBounds().toBBOX() + ".)");
+        map.destroy();     
+    }
+
+    function test_callbacks(t) {
+        t.plan(15);
+        var map = new OpenLayers.Map("map", {
+            resolutions: [1]
+        });
+        var layer = new OpenLayers.Layer.Vector("foo", {
+            maxExtent: new OpenLayers.Bounds(-10, -10, 10, 10),
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+        var control = new OpenLayers.Control({
+        });
+        var log = {};
+        var handler = new OpenLayers.Handler.Polygon(control, {
+            create: function() {
+                log.type = "create",
+                log.args = arguments
+            },
+            modify: function() {
+                log.type = "modify",
+                log.args = arguments
+            },
+            done: function() {
+                log.type = "done",
+                log.args = arguments
+            },
+            cancel: function() {
+                log.type = "cancel",
+                log.args = arguments
+            }
+        });
+        control.handler = handler;
+        map.addControl(control);
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+        
+        // mock up feature drawing
+        handler.activate();
+        // click at 0, 0
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
+        t.eq(log.type, "create", "[mousedown] create called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75), "[mousedown] correct vertex");
+        t.ok(log.args[1] === handler.polygon, "[mousedown] correct sketch feature");
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
+        t.eq(log.type, "modify", "[mouseup] modify called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 75), "[mouseup] correct vertex");
+        t.ok(log.args[1] === handler.polygon, "[mouseup] correct sketch feature");
+        // move to 10, 10 and click
+        handler.mousemove({type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
+        t.eq(log.type, "modify", "[mousemove] modify called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-140, 65), "[mousemove] correct vertex");
+        t.ok(log.args[1] === handler.polygon, "[mouseup] correct sketch feature");
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(10, 10)});
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(10, 10)});
+        // move to 0, 10 and double click
+        handler.mousemove({type: "mousemove", xy: new OpenLayers.Pixel(0, 10)});
+        t.eq(log.type, "modify", "[mousemove] modify called");
+        t.geom_eq(log.args[0], new OpenLayers.Geometry.Point(-150, 65), "[mousemove] correct vertex");
+        t.ok(log.args[1] === handler.polygon, "[mouseup] correct sketch feature");
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(0, 10)});
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(0, 10)});
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(0, 10)});
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(0, 10)});
+        handler.dblclick({type: "dblclick", xy: new OpenLayers.Pixel(0, 10)});
+        t.eq(log.type, "done", "[dblclick] done called");
+        t.geom_eq(
+            log.args[0],
+            new OpenLayers.Geometry.Polygon([
+                new OpenLayers.Geometry.LinearRing([
+                    new OpenLayers.Geometry.Point(-150, 75),
+                    new OpenLayers.Geometry.Point(-140, 65),
+                    new OpenLayers.Geometry.Point(-150, 65),
+                    new OpenLayers.Geometry.Point(-150, 75)
+                ])
+            ]),
+            "[dblclick] correct polygon"
+        );
+        
+        // mock up sketch cancel
+        handler.mousedown({type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
+        handler.mouseup({type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
+        handler.mousemove({type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
+        handler.deactivate();
+        t.eq(log.type, "cancel", "[deactivate while drawing] cancel called");
+        
+        map.destroy();
+    }        
+
+    function test_Handler_Polygon_destroy(t) {
+        t.plan(8);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.Polygon(control, {foo: 'bar'});
+
+        handler.activate();
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.mousedown(evt);
+
+        t.ok(handler.layer,
+             "handler has a layer prior to destroy");
+        t.ok(handler.point,
+             "handler has a point prior to destroy");
+        t.ok(handler.line,
+             "handler has a line prior to destroy");
+        t.ok(handler.polygon,
+             "handler has a polygon prior to destroy");
+        handler.destroy();
+        t.eq(handler.layer, null,
+             "handler.layer is null after destroy");
+        t.eq(handler.point, null,
+             "handler.point is null after destroy");
+        t.eq(handler.line, null,
+             "handler.line is null after destroy");
+        t.eq(handler.polygon, null,
+             "handler.polygon is null after destroy");
+        map.destroy();     
+    }
+
+
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Handler/RegularPolygon.html b/tests/Handler/RegularPolygon.html
new file mode 100644
index 0000000..21e6c36
--- /dev/null
+++ b/tests/Handler/RegularPolygon.html
@@ -0,0 +1,228 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    function test_Handler_RegularPolygon_constructor(t) {
+        t.plan(3);
+        var control = new OpenLayers.Control();
+        control.id = Math.random();
+        var callbacks = {foo: "bar"};
+        var options = {bar: "foo"};
+        
+        var oldInit = OpenLayers.Handler.prototype.initialize;
+        
+        OpenLayers.Handler.prototype.initialize = function(con, call, opt) {
+            t.eq(con.id, control.id,
+                 "constructor calls parent with the correct control");
+            t.eq(call, callbacks,
+                 "constructor calls parent with the correct callbacks");
+            t.eq(opt, options,
+                 "regular polygon constructor calls parent with the correct options");
+        }
+        var handler = new OpenLayers.Handler.RegularPolygon(control, callbacks, options);
+
+        OpenLayers.Handler.prototype.initialize = oldInit;
+    }
+
+    function test_Handler_RegularPolygon_activation(t) {
+        t.plan(3);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.RegularPolygon(control);
+        handler.active = true;
+        var activated = handler.activate();
+        t.ok(!activated,
+             "activate returns false if the handler was already active");
+        handler.active = false;
+        activated = handler.activate();
+        t.ok(activated,
+             "activate returns true if the handler was not already active");
+        activated = handler.deactivate();
+        t.ok(activated,
+             "deactivate returns true if the handler was active already");
+        map.destroy();     
+    }
+
+    function test_Handler_RegularPolygon_deactivation(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+             
+        var handler = new OpenLayers.Handler.RegularPolygon(control, {foo: 'bar'});
+        handler.activate();
+        handler.layer.destroy();
+        handler.deactivate();
+        t.eq(handler.layer, null,
+             "deactivate doesn't throw an error if layer was" +
+             " previously destroyed");
+        map.destroy();     
+    }
+
+    function test_Handler_RegularPolygon_four_corners(t) {
+        t.plan(7);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.RegularPolygon(control, {});
+        var activated = handler.activate();
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.down(evt);
+        var evt = {xy: new OpenLayers.Pixel(175, 75), which: 1};
+        handler.move(evt);
+        t.eq(handler.feature.geometry.getBounds().toBBOX(),
+             "-35.15625,-35.15625,35.15625,35.15625",
+             "correct bounds after move");
+        t.eq(handler.feature.geometry.components[0].components.length, 5,
+             "geometry has 5 components");
+        t.eq(handler.feature.geometry.CLASS_NAME,
+             "OpenLayers.Geometry.Polygon",
+             "geometry is a polygon");
+        t.eq(handler.radius, 25*1.40625, "feature radius as set on handler");
+        var evt = {xy: new OpenLayers.Pixel(175, 80), which: 1};
+        handler.move(evt);
+        t.eq(handler.feature.geometry.getBounds().toBBOX(),
+             "-35.15625,-35.15625,35.15625,35.15625",
+             "correct bounds after move with a fixed radius");
+        handler.cancel();
+        handler.setOptions({radius:2 / Math.sqrt(2)});
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.down(evt);
+        
+        t.eq(handler.feature.geometry.getBounds().toBBOX(),
+             "-1,-1,1,1",
+             "bounds with manual radius setting");
+        var evt = {xy: new OpenLayers.Pixel(175, 90), which: 1};
+        handler.move(evt);
+        t.eq(handler.feature.geometry.getBounds().toBBOX(),
+             "34.15625,-22.09375,36.15625,-20.09375",
+             "bounds with manual radius setting and mousemove");
+        map.destroy();     
+    }
+
+    function test_Handler_RegularPolygon_circle(t) {
+        t.plan(7);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer.WMS("", "", {}));
+        map.zoomToMaxExtent();
+        var control = new OpenLayers.Control();
+        map.addControl(control);
+        var handler = new OpenLayers.Handler.RegularPolygon(control, {}, {'sides':40});
+        var activated = handler.activate();
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.down(evt);
+        var evt = {xy: new OpenLayers.Pixel(175, 75), which: 1};
+        handler.move(evt);
+        t.eq(handler.feature.geometry.getBounds().toBBOX(),
+             "-35.15625,-35.15625,35.15625,35.15625",
+             "correct bounds after move");
+        t.eq(handler.feature.geometry.components[0].components.length, 41,
+             "geometry has correct numbre of components");
+        t.eq(handler.feature.geometry.CLASS_NAME,
+             "OpenLayers.Geometry.Polygon",
+             "geometry is a polygon");
+        t.eq(handler.radius, 25*1.40625, "feature radius as set on handler");
+        var evt = {xy: new OpenLayers.Pixel(175, 80), which: 1};
+        handler.move(evt);
+        t.eq(handler.feature.geometry.getBounds().toBBOX(),
+             "-35.823348,-35.823348,35.823348,35.823348",
+             "correct bounds after move with fixed radius");
+        handler.cancel();
+        handler.setOptions({radius:1});
+        var evt = {xy: new OpenLayers.Pixel(150, 75), which: 1};
+        handler.down(evt);
+        
+        t.eq(handler.feature.geometry.getBounds().toBBOX(),
+             "-0.996917,-0.996917,0.996917,0.996917",
+             "bounds with manual radius setting");
+        var evt = {xy: new OpenLayers.Pixel(175, 80), which: 1};
+        handler.move(evt);
+        t.eq(handler.feature.geometry.getBounds().toBBOX(),
+             "34.159333,-8.028167,36.153167,-6.034333",
+             "bounds with manual radius setting and mousemove");
+        map.destroy();     
+    }
+
+    function test_Handler_RegularPolygon_irregular(t) {
+        t.plan(4);
+        var map = {
+            getLonLatFromPixel: function(px) {
+                return {lon: px.x, lat: px.y};
+            },
+            getResolution: function() {
+                return 1;
+            }
+        };
+        var layer = {
+            addFeatures: function() {},
+            drawFeature: function(feature, style) {
+                var ring = feature.geometry.components[0];
+                t.eq(ring.components[0].x, 20, "correct right");
+                t.eq(ring.components[0].y, 10, "correct bottom");
+                t.eq(ring.components[2].x, 10, "correct left");
+                t.eq(ring.components[2].y, 15, "correct top");
+            }
+        };
+        var control = {};
+        var options = {
+            sides: 4,
+            irregular: true,
+            layer: layer,
+            map: map
+        };
+        var handler = new OpenLayers.Handler.RegularPolygon(
+            control, null, options
+        );
+        handler.origin = new OpenLayers.Geometry.Point(10, 10);
+        handler.feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Polygon(
+                [new OpenLayers.Geometry.LinearRing()]
+            )
+        );
+        // should result in a 10 x 5 rectangle
+        handler.move({xy: {x: 20, y: 15}});
+    }
+
+    function test_callbacks(t) {
+        t.plan(1);
+
+        // setup
+        var map = new OpenLayers.Map("map", {
+            getLonLatFromPixel: function(px) {
+                return {lon: px.x, lat: px.y};
+            }
+        });
+
+        var control = {"map": map};
+
+        var done = function(geom) {
+            t.ok(true,
+                 "done callback called even if no move between down and up");
+        };
+
+        var handler = new OpenLayers.Handler.RegularPolygon(
+            control, {"done": done});
+        handler.activate();
+        
+        var xy = new OpenLayers.Pixel(Math.random(), Math.random());
+
+        var isLeftClick = OpenLayers.Event.isLeftClick;
+        OpenLayers.Event.isLeftClick = function() { return true; };
+
+        // test
+        map.events.triggerEvent("mousedown", {"xy": xy});
+        map.events.triggerEvent("mouseup", {"xy": xy});
+
+        // tear down
+        OpenLayers.Event.isLeftClick = isLeftClick;
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 300px; height: 150px;"/>
+</body>
+</html>
diff --git a/tests/Icon.html b/tests/Icon.html
new file mode 100644
index 0000000..09f09b8
--- /dev/null
+++ b/tests/Icon.html
@@ -0,0 +1,68 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var icon; 
+    
+    function test_Icon_constructor (t) {
+        t.plan( 4 );
+        var size = new OpenLayers.Size(5,6);
+        icon = new OpenLayers.Icon("", size);
+        t.ok( icon instanceof OpenLayers.Icon, "new OpenLayers.Icon returns Icon object" );
+        t.ok( icon.size instanceof OpenLayers.Size, "icon.size returns Size object" );
+        t.ok( icon.size.equals(size), "icon.size returns correct value" );
+        t.eq( icon.url, "", "icon.url returns str object" );
+    }
+    function test_Icon_clone (t) {
+        t.plan( 4 );
+        icon = new OpenLayers.Icon("a",new OpenLayers.Size(5,6));
+        t.ok( icon instanceof OpenLayers.Icon, "new OpenLayers.Icon returns Icon object" );
+        var cloned = icon.clone();
+        t.ok( cloned instanceof OpenLayers.Icon, "clone is an OpenLayers.Icon" );
+        cloned.url = "b"
+        t.eq( icon.url, "a", "icon.url doesn't change with clone's url" );
+        t.eq( cloned.url, "b", "cloned.url does change when edited" );
+    }
+
+    function test_Icon_setOpacity(t) {
+        t.plan( 2 );
+        
+        icon = new OpenLayers.Icon("a",new OpenLayers.Size(5,6));
+        t.ok(!icon.imageDiv.style.opacity, "default icon has no opacity");
+        
+        icon.setOpacity(0.5);
+        t.eq(parseFloat(icon.imageDiv.style.opacity), 0.5, "icon.setOpacity() works");
+    }
+    
+    function test_Icon_isDrawn(t) {
+        t.plan(4);
+
+        var icon = {};
+
+        //no imageDiv
+        var drawn = OpenLayers.Icon.prototype.isDrawn.apply(icon, []);
+        t.ok(!drawn, "icon with no imageDiv not drawn");
+
+        //imageDiv no parentNode
+        icon.imageDiv = {};
+        drawn = OpenLayers.Icon.prototype.isDrawn.apply(icon, []);
+        t.ok(!drawn, "icon with imageDiv with no parentNode not drawn");
+
+        //imageDiv with parent
+        icon.imageDiv.parentNode = {};
+        drawn = OpenLayers.Icon.prototype.isDrawn.apply(icon, []);
+        t.ok(drawn, "icon with imageDiv with parentNode drawn");
+
+        //imageDiv with parent but nodetype 11
+        icon.imageDiv.parentNode = {'nodeType': 11};
+        drawn = OpenLayers.Icon.prototype.isDrawn.apply(icon, []);
+        t.ok(!drawn, "imageDiv with parent but nodetype 11 not drawn");
+    }
+
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Lang.html b/tests/Lang.html
new file mode 100644
index 0000000..3251e34
--- /dev/null
+++ b/tests/Lang.html
@@ -0,0 +1,106 @@
+<html>
+<head>
+    <script src="../lib/OpenLayers.js"></script>
+    <script src="../lib/OpenLayers/Lang/en-CA.js" type="text/javascript"></script>
+    <script src="../lib/OpenLayers/Lang/fr.js" type="text/javascript"></script>
+    <script type="text/javascript">
+    
+    function test_setCode(t) {
+        t.plan(4);
+        OpenLayers.Lang.code = null;
+        
+        // test with no argument - this could result in the default or the
+        // browser language if a dictionary exists
+        OpenLayers.Lang.setCode();
+        t.ok(OpenLayers.Lang.code != null,
+             "code set when no argument is sent");
+        
+        var primary = "xx";
+        var subtag = "XX";
+        var code = primary + "-" + subtag;
+        OpenLayers.Lang[code] = {};
+        
+        // test code for dictionary that exists
+        OpenLayers.Lang.setCode(code);
+        t.eq(OpenLayers.Lang.code, code,
+             "code properly set for existing dictionary");
+        
+        // test code for dictionary that doesn't exist
+        OpenLayers.Lang.setCode(primary + "-YY");
+        t.eq(OpenLayers.Lang.code, OpenLayers.Lang.defaultCode,
+             "code set to default for non-existing dictionary");
+        
+        // test code for existing primary but missing subtag
+        OpenLayers.Lang[primary] = {};
+        OpenLayers.Lang.setCode(primary + "-YY");
+        t.eq(OpenLayers.Lang.code, primary,
+             "code set to primary when subtag dictionary is missing");
+        
+        // clean up
+        delete OpenLayers.Lang[code];
+        delete OpenLayers.Lang[primary];
+        OpenLayers.Lang.code = null;
+    }
+    
+    function test_getCode(t) {
+        t.plan(3);
+        OpenLayers.Lang.code = null;
+        
+        // test that a non-null value is retrieved - could be browser language
+        // or defaultCode
+        var code = OpenLayers.Lang.getCode();
+        t.ok(code != null, "returns a non-null code");
+        t.ok(OpenLayers.Lang.code != null, "sets the code to a non-null value");
+        
+        // test that the code is returned if non-null
+        OpenLayers.Lang.code = "foo";
+        t.eq(OpenLayers.Lang.getCode(), "foo", "returns the code if non-null");
+        
+        // clean up
+        OpenLayers.Lang.code = null;        
+    }
+    
+    function test_i18n(t) {
+        t.plan(1);        
+        t.ok(OpenLayers.i18n === OpenLayers.Lang.translate,
+             "i18n is an alias for OpenLayers.Lang.translate");
+    }
+    
+    function test_translate(t) {
+        var keys = ['test1', 'test3', 'noKey'];
+        var codes = ['en', 'en-CA', 'fr', 'fr-CA', 'sw'];
+        var result = {
+            'en': {'overlays':'Overlays', 
+                   'unhandledRequest':'Unhandled request return foo', 
+                   'noKey':'noKey'},
+            'en-CA': {'overlays':'Overlays',
+                   'unhandledRequest':'Unhandled request return foo', 
+                      'noKey':'noKey'},
+            'fr': {'overlays':'Calques', 
+                   'unhandledRequest':'Requête non gérée, retournant foo',
+                  'noKey':'noKey'},
+            'fr-CA': {'overlays':'Calques', //this should result in 'fr'
+                   'unhandledRequest':'Requête non gérée, retournant foo',
+                  'noKey':'noKey'},
+            'sw': {'overlays':'Overlays', //this should result in 'en'
+                   'unhandledRequest':'Unhandled request return foo', 
+                  'noKey':'noKey'}
+        };
+        
+        t.plan(keys.length*codes.length);
+
+        for (var i=0; i<codes.length; ++i) {
+            var code = codes[i];
+            OpenLayers.Lang.setCode(code);
+            t.eq(OpenLayers.Lang.translate('overlays'), result[code]['overlays'], "simple key lookup in "+code);
+            t.eq(OpenLayers.Lang.translate('unhandledRequest',{'statusText':'foo'}), 
+                        result[code]['unhandledRequest'], "lookup with argument substitution in "+code);
+            t.eq(OpenLayers.Lang.translate('noKey'), result[code]['noKey'], "invalid key returns the key in "+code);
+        }
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Layer.html b/tests/Layer.html
new file mode 100644
index 0000000..9938ac7
--- /dev/null
+++ b/tests/Layer.html
@@ -0,0 +1,836 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer; 
+
+    function test_Layer_constructor (t) {
+        t.plan( 15 );
+        
+        var options = { chicken: 151, foo: "bar", projection: "none" };
+        var layer = new OpenLayers.Layer('Test Layer', options);
+        
+        t.ok( layer instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
+        t.eq( layer.CLASS_NAME, "OpenLayers.Layer", "CLASS_NAME variable set correctly");
+
+        t.eq( layer.name, "Test Layer", "layer.name is correct" );
+        t.ok( layer.id != null, "Layer is given an id");
+        t.ok( layer.projection, "none", "default layer projection correctly set");
+        t.ok( ((layer.chicken == 151) && (layer.foo == "bar")), "layer.options correctly set to Layer Object" );
+        t.ok( ((layer.options["chicken"] == 151) && (layer.options["foo"] == "bar")), "layer.options correctly backed up" );
+
+        t.ok( typeof layer.div == "object" , "layer.div is created" );
+        t.eq( layer.div.id, layer.id, "layer.div.id is correct" );
+
+        options.chicken = 552;
+        
+        t.eq( layer.options["chicken"], 151 , "layer.options correctly made fresh copy" );
+        
+        t.eq( layer.isBaseLayer, false, "Default layer is not base layer" );
+
+        layer = new OpenLayers.Layer('Test Layer');
+        t.ok( layer instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
+        t.eq( layer.name, "Test Layer", "layer.name is correct" );
+        t.ok( layer.projection == null, "default layer projection correctly set");
+        t.ok( layer.options instanceof Object, "layer.options correctly initialized as a non-null Object" );
+    }
+
+
+    function test_Layer_clone (t) {
+        t.plan( 7 );
+        
+        var mapone = new OpenLayers.Map('map'); 
+        var options = { chicken: 151, foo: "bar", maxResolution: "auto", visibility: false };
+        var layer = new OpenLayers.Layer('Test Layer', options);
+        mapone.addLayer(layer);
+        layer.setVisibility(true);
+
+        // randomly assigned property
+        layer.chocolate = 5;
+
+        var clone = layer.clone();
+
+        t.ok( clone.map == null, "cloned layer has map property set to null")
+
+        var maptwo = new OpenLayers.Map('map2'); 
+        maptwo.addLayer(clone);
+
+        t.ok( clone instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
+        t.eq( clone.name, "Test Layer", "default clone.name is correct" );
+        t.ok( ((clone.options["chicken"] == 151) && (clone.options["foo"] == "bar")), "clone.options correctly set" );
+        t.eq(clone.chocolate, 5, "correctly copied randomly assigned property");
+
+        t.eq(clone.visibility, true, "visibility correctly cloned");
+        
+        layer.addOptions({chicken:152});
+        t.eq(clone.options["chicken"], 151, "made a clean copy of options");        
+
+        mapone.destroy();
+        maptwo.destroy();
+    }
+
+    function test_Layer_setName (t) {
+        
+        t.plan( 1 );
+
+        layer = new OpenLayers.Layer('Test Layer');
+        layer.setName("chicken");
+        
+        t.eq(layer.name, "chicken", "setName() works")
+        
+    }
+
+    function test_Layer_addOptions (t) {
+        
+        t.plan( 19 );
+
+        var map = new OpenLayers.Map("map");
+        var options = { chicken: 151, foo: "bar" };
+        var layer = new OpenLayers.Layer('Test Layer', options);
+        map.addLayer(layer);
+
+        layer.addOptions({bark:55, chicken: 171});
+        t.eq(layer.bark, 55, "addOptions() assigns new option correctly to Layer");
+        t.eq(layer.options.bark, 55, "addOptions() adds new option correctly to backup");
+
+        t.eq(layer.chicken, 171, "addOptions() overwrites option correctly to Layer");
+        t.eq(layer.options.chicken, 171, "addOptions() overwrites option correctly to backup");
+
+        var log;
+        layer.initResolutions = function() {
+            log++;
+        };
+        log = 0;
+        layer.addOptions({bark: 56});
+        t.eq(log, 0, "addOptions doesn't call initResolutions when not given a resolution option");
+
+        log = 0;
+        layer.addOptions({scales: [1, 2]});
+        t.eq(log, 1, "addOptions calls initResolutions when given scales");
+
+        log = 0;
+        layer.addOptions({resolutions: [1, 2]});
+        t.eq(log, 1, "addOptions calls initResolutions when given resolutions");
+
+        log = 0;
+        layer.addOptions({minScale: 4});
+        t.eq(log, 1, "addOptions calls initResolutions when given minScale");
+
+        log = 0;
+        layer.addOptions({maxScale: 4});
+        t.eq(log, 1, "addOptions calls initResolutions when given maxScale");
+
+        log = 0;
+        layer.addOptions({minResolution: 4});
+        t.eq(log, 1, "addOptions calls initResolutions when given minResolution");
+
+        log = 0;
+        layer.addOptions({maxResolution: 4});
+        t.eq(log, 1, "addOptions calls initResolutions when given maxResolution");
+
+        log = 0;
+        layer.addOptions({numZoomLevels: 4});
+        t.eq(log, 1, "addOptions calls initResolutions when given numZoomLevels");
+
+        log = 0;
+        layer.addOptions({maxZoomLevel: 4});
+        t.eq(log, 1, "addOptions calls initResolutions when given maxZoomLevel");
+
+        log = 0;
+        layer.addOptions({projection: new OpenLayers.Projection("EPSG:900913")});
+        t.eq(log, 1, "addOptions calls initResolutions when given projection");
+
+        log = 0;
+        layer.addOptions({units: "m"});
+        t.eq(log, 1, "addOptions calls initResolutions when given units");
+
+        log = 0;
+        layer.addOptions({minExtent: new OpenLayers.Bounds(0, 0, 0, 0)});
+        t.eq(log, 1, "addOptions calls initResolutions when given minExtent");
+
+        log = 0;
+        layer.addOptions({maxExtent: new OpenLayers.Bounds(0, 0, 0, 0)});
+        t.eq(log, 1, "addOptions calls initResolutions when given maxExtent");
+
+        layer.projection = null;
+        layer.addOptions({projection: "EPSG:900913"});
+        t.ok(layer.projection instanceof OpenLayers.Projection,
+             "addOptions creates a Projection object when given a projection string");
+
+        map.removeLayer(layer);
+        log = 0;
+        layer.addOptions({minExtent: new OpenLayers.Bounds(0, 0, 0, 0)});
+        t.eq(log, 0, "addOptions doesn't call initResolutions when layer is not in map");
+    }
+    
+    function test_Layer_StandardOptionsAccessors (t) {
+
+        t.plan( 4 );
+
+        var projection = "EPSG:4326";
+        var maxExtent = new OpenLayers.Bounds(50,50,100,100);
+        var maxResolution = 1.5726;
+        var numZoomLevels = 11;
+
+        var options = { projection: projection, 
+                        maxExtent: maxExtent,
+                        maxResolution: maxResolution,
+                        numZoomLevels: numZoomLevels
+                        };
+
+        var layer = new OpenLayers.Layer('Test Layer', options);
+
+        t.eq(layer.projection.getCode(), projection, "projection set correctly");
+        t.ok(layer.maxExtent.equals(maxExtent), "maxExtent set correctly");
+        t.eq(layer.maxResolution, maxResolution, "maxResolution set correctly");
+        t.eq(layer.numZoomLevels, numZoomLevels, "numZoomLevels set correctly");
+    }
+    
+    function test_eventListeners(t) {
+        t.plan(1);
+        
+        var method = OpenLayers.Events.prototype.on;
+        // test that events.on is called at layer construction
+        var options = {
+            eventListeners: {foo: "bar"}
+        };
+        OpenLayers.Events.prototype.on = function(obj) {
+            t.eq(obj, options.eventListeners, "events.on called with eventListeners");
+        }
+        var layer = new OpenLayers.Layer("test", options);
+        OpenLayers.Events.prototype.on = method;
+        layer.destroy();
+        
+        // if events.on is called again, this will fail due to an extra test
+        // test layer without eventListeners
+        OpenLayers.Events.prototype.on = function(obj) {
+            t.fail("events.on called without eventListeners");
+        }
+        var layer2 = new OpenLayers.Layer("test");
+        OpenLayers.Events.prototype.on = method;
+        layer2.destroy();
+    }
+
+    function test_initResolutions_alwaysInRange(t) {
+        t.plan(3);
+
+        var map, layer;
+
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer("test", {maxResolution: 80, minResolution: 10});
+        map.addLayer(layer);
+        t.eq(layer.alwaysInRange, false,
+             "alwaysInRange set to false due to passed options");
+        map.destroy();
+
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer("test", {projection: "EPSG:4326"});
+        map.addLayer(layer);
+        t.eq(layer.alwaysInRange, true,
+             "alwaysInRange true if only get projection.");
+        map.destroy();
+
+        map = new OpenLayers.Map("map");
+        OpenLayers.Layer.prototype.alwaysInRange = false;
+        layer = new OpenLayers.Layer("test", {'projection': 'EPSG:4326'});
+        map.addLayer(layer);
+        t.eq(layer.alwaysInRange, false,
+             "alwaysInRange true if overridden on prototype.");
+        OpenLayers.Layer.prototype.alwaysInRange = null;
+        map.destroy();
+    }
+
+    function test_initResolutions_resolutions(t) {
+
+        function initResolutionsTest(
+            id, mapOptions, layerOptions,
+            expectedResolutions, expectedMinResolution, expectedMaxResolution) {
+
+            // setup
+            var map = new OpenLayers.Map("map", mapOptions);
+            var layer = new OpenLayers.Layer(null, layerOptions);
+            map.addLayer(layer);
+
+            // make resolution assertions
+            t.eq(
+                layer.resolutions.length, expectedResolutions.length,
+                id + ": correct resolutions length"
+            );
+            // allow for floating point imprecision
+            var got, exp, same = true;
+            for (var i=0; i<expectedResolutions.length; ++i) {
+                got = layer.resolutions[i];
+                exp = expectedResolutions[i];
+                if (got.toFixed(10) !== exp.toFixed(10)) {
+                    t.fail(id + ": bad resolutions - index " + i + " got " + got + " but expected " + exp);
+                    same = false;
+                    break;
+                }
+            }
+            if (same) {
+                t.ok(true, id + ": correct resolutions");
+            }
+            t.eq(
+                layer.maxResolution, expectedMaxResolution,
+                id + ": maxResolution set"
+            );
+            t.eq(
+                layer.minResolution, expectedMinResolution,
+                id + ": minResolution set"
+            );
+
+            // teardown
+            map.destroy();
+        }
+
+        // each case is an array of id, map options, layer options, expected resolutions,
+        // expected min resolution, and expected max resolution
+        var cases = [[
+
+        /*
+         * Batch 1: map defaults and sensible layer options
+         */
+
+            "1.0",  null, {resolutions: [400, 200, 100]},
+            [400, 200, 100], 100, 400
+        ], [
+            "1.1",  null, {resolutions: [400, 200, 100], minResolution: 150, maxResolution: 300},
+            [400, 200, 100], 150, 300
+        ], [
+            "1.2",  null, {maxResolution: 4000, numZoomLevels: 3},
+            [4000, 2000, 1000], 1000, 4000
+        ], [
+            "1.3",  null, {maxResolution: 4000, maxZoomLevel: 2},
+            [4000, 2000, 1000], 1000, 4000
+        ], [
+            "1.4",  null, {minResolution: 40, numZoomLevels: 3},
+            [160, 80, 40], 40, 160
+        ], [
+            "1.5",  null, {minResolution: 40, maxZoomLevel: 2},
+            [160, 80, 40], 40, 160
+        ], [
+            "1.6", null, {minResolution: 10, maxResolution: 40},
+            [40, 20, 10], 10, 40
+        ], [
+            "1.7", null, {minResolution: 10, maxResolution: 40, numZoomLevels: 3},
+            [40, 20, 10], 10, 40
+        ], [
+            "1.8", null, {minResolution: 10, maxResolution: 40, maxZoomLevel: 2},
+            [40, 20, 10], 10, 40
+        ], [
+            "1.9",  null, {scales: [400000, 200000, 100000]},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.10",  null, {scales: [400000, 200000, 100000], minScale: 400000, maxScale: 100000},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.11",  null, {minScale: 400000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.12",  null, {minScale: 400000, maxZoomLevel: 2},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.13",  null, {maxScale: 100000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.14",  null, {maxScale: 100000, maxZoomLevel: 2},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.15",  null, {maxScale: 100000, minScale: 400000},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.16",  null, {maxScale: 100000, minScale: 400000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.17",  null, {maxScale: 100000, minScale: 400000, maxZoomLevel: 2},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "1.18",  null, {scales: [400000, 200000, 100000], units: "m"},
+            [141.11103491115225, 70.55551745557612, 35.27775872778806], 35.27775872778806, 141.11103491115225
+        ], [
+            "1.19",  null, {minScale: 400000, numZoomLevels: 3, units: "m"},
+            [141.11103491115225, 70.55551745557612, 35.27775872778806], 35.27775872778806, 141.11103491115225
+        ], [
+            "1.20",  null, {maxScale: 100000, numZoomLevels: 3, units: "m"},
+            [141.11103491115225, 70.55551745557612, 35.27775872778806], 35.27775872778806, 141.11103491115225
+        ], [
+
+        /*
+         * Batch 2: custom map options map and sensible layer options
+         */
+
+        /*
+         * Batch 2.1: resolutions set in the layer options
+         */
+            "2.1.0",  {resolutions: [300, 150]}, {resolutions: [400, 200, 100]},
+            [400, 200, 100], 100, 400
+        ], [
+            "2.1.1",  {numZoomLevels: 4}, {resolutions: [400, 200, 100]},
+            [400, 200, 100], 100, 400
+        ], [
+            "2.1.2",  {maxResolution: 300}, {resolutions: [400, 200, 100]},
+            [400, 200, 100], 100, 400
+        ], [
+            "2.1.3",  {minResolution: 300}, {resolutions: [400, 200, 100]},
+            [400, 200, 100], 100, 400
+        ], [
+            "2.1.4",  {scales: [4, 2, 1]}, {resolutions: [400, 200, 100]},
+            [400, 200, 100], 100, 400
+        ], [
+            "2.1.5",  {minScale: 4}, {resolutions: [400, 200, 100]},
+            [400, 200, 100], 100, 400
+        ], [
+            "2.1.6",  {maxScale: 4}, {resolutions: [400, 200, 100]},
+            [400, 200, 100], 100, 400
+        ], [
+        /*
+         * Batch 2.2: minResolution and maxResolution set in the layer options
+         */
+            "2.2.0",  {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: 0},
+            [80, 40, 20, 10], 12, 48
+        ], [
+            "2.2.1",  {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: -1},
+            [80, 40, 20, 10], 12, 48
+        ], [
+            "2.2.2",  {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: null},
+            [80, 40, 20, 10], 12, 48
+        ], [
+            "2.2.3",  {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: undefined},
+            [48, 24, 12], 12, 48
+        ], [
+            "2.2.4",  {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48, numZoomLevels: 3},
+            [48, 24, 12], 12, 48
+        ], [
+            "2.2.5",  {resolutions: [80, 40, 20, 10]}, {minResolution: 12, maxResolution: 48},
+            [48, 24, 12], 12, 48
+        ], [
+        /*
+         * Batch 2.3: maxResolution set in the layer options
+         */
+            "2.3.0",  {resolutions: [300, 150]}, {maxResolution: 4000, numZoomLevels: 3},
+            [4000, 2000, 1000], 1000, 4000
+        ], [
+            "2.3.1",  {numZoomLevels: 2}, {maxResolution: 4000, numZoomLevels: 3},
+            [4000, 2000, 1000], 1000, 4000
+        ], [
+            "2.3.2",  {maxResolution: 50}, {maxResolution: 4000, numZoomLevels: 3},
+            [4000, 2000, 1000], 1000, 4000
+        ], [
+            "2.3.3",  {scales: [4, 2, 1]}, {maxResolution: 4000, numZoomLevels: 3},
+            [4000, 2000, 1000], 1000, 4000
+        ], [
+            "2.3.4",  {minScale: 4}, {maxResolution: 4000, numZoomLevels: 3},
+            [4000, 2000, 1000], 1000, 4000
+        ], [
+            "2.3.5",  {resolutions: [300, 150]}, {maxResolution: 250},
+            [300, 150], 150, 250
+        ], [
+        /*
+         * Batch 2.4: minResolution set in the layer options
+         */
+            "2.4.0",  {resolutions: [300, 150]}, {minResolution: 40, numZoomLevels: 3},
+            [160, 80, 40], 40, 160
+        ], [
+            "2.4.1",  {numZoomLevels: 2}, {minResolution: 40, numZoomLevels: 3},
+            [160, 80, 40], 40, 160
+        ], [
+            "2.4.2",  {minResolution: 50}, {minResolution: 40, numZoomLevels: 3},
+            [160, 80, 40], 40, 160
+        ], [
+            "2.4.3",  {scales: [4, 2, 1]}, {minResolution: 40, numZoomLevels: 3},
+            [160, 80, 40], 40, 160
+        ], [
+            "2.4.4",  {maxScale: 1}, {minResolution: 40, numZoomLevels: 3},
+            [160, 80, 40], 40, 160
+        ], [
+            "2.4.5",  {resolutions: [300, 150]}, {minResolution: 250},
+            [300, 150], 250, 300
+        ], [
+        /*
+         * Batch 2.5: scales set in the layer options
+         */
+            "2.5.0",  {resolutions: [4, 2, 1]}, {scales: [400000, 200000, 100000]},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.5.1",  {numZoomLevels: 2}, {scales: [400000, 200000, 100000]},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.5.2",  {maxResolution: 4}, {scales: [400000, 200000, 100000]},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.5.3",  {minResolution: 1}, {scales: [400000, 200000, 100000]},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.5.4",  {units: "m"}, {scales: [400000, 200000, 100000]},
+            [141.11103491115225, 70.55551745557612, 35.27775872778806], 35.27775872778806, 141.11103491115225
+        ], [
+        /*
+         * Batch 2.6: minScale set in the layer options
+         */
+            "2.6.0",  {resolutions: [4, 2, 1]}, {minScale: 400000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.6.1",  {numZoomLevels: 2}, {minScale: 400000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.6.2",  {maxResolution: 4}, {minScale: 400000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.6.3", {scales: [400000, 200000, 100000]}, {minScale: 200000},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0006349563376084181
+        ], [
+        /*
+         * Batch 2.7: maxScale set in the layer options
+         */
+            "2.7.0",  {resolutions: [4, 2, 1]}, {maxScale: 100000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.7.1",  {numZoomLevels: 2}, {maxScale: 100000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.7.2",  {minResolution: 1}, {maxScale: 100000, numZoomLevels: 3},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.00031747816880420905, 0.0012699126752168362
+        ], [
+            "2.7.3", {scales: [400000, 200000, 100000]}, {maxScale: 200000},
+            [0.0012699126752168362, 0.0006349563376084181, 0.00031747816880420905], 0.0006349563376084181, 0.0012699126752168362
+        ], [
+        /*
+         * Batch 2.8: numZoomLevels set in the layer options
+         */
+            "2.8.0",  {maxResolution: 80}, {numZoomLevels: 4},
+            [80, 40, 20, 10], 10, 80
+        ], [
+            "2.8.1", {maxResolution: 80, numZoomLevels: 4}, {numZoomLevels: null},
+            [80, 40, 20, 10], 10, 80
+        ], [
+            "2.8.2", {maxResolution: 80, numZoomLevels: 4}, {numZoomLevels: undefined},
+            [80, 40, 20, 10], 10, 80
+        ]];
+
+        // run all cases (4 tests each)
+        var i, num = cases.length, c;
+        t.plan(num * 4);
+        for (i=0; i<num; ++i) {
+            c = cases[i];
+            initResolutionsTest(c[0], c[1], c[2], c[3], c[4], c[5]);
+        }
+
+    }
+
+    function test_Layer_visibility(t) {
+
+        t.plan(7);
+
+        var layer = new OpenLayers.Layer('Test Layer');
+    
+        t.eq(layer.getVisibility(), true, "default for layer creation is visible");
+        
+        layer.setVisibility(false);
+        t.eq(layer.getVisibility(), false, "setVisibility false works");
+
+        layer.setVisibility(true);
+        t.eq(layer.getVisibility(), true, "setVisibility true works");
+       
+        // Need a map in order to have moveTo called.
+        // Tests added for #654.
+        var layer = new OpenLayers.Layer.WMS('Test Layer','http://example.com');
+        var m = new OpenLayers.Map('map');
+        m.addLayer(layer);
+        m.zoomToMaxExtent();
+        
+        layermoved = false; 
+        layer.moveTo = function() { layermoved = true; }
+        
+        layer.events.register('visibilitychanged', t, function() {
+            this.ok(true, "Visibility changed calls layer event.");
+        });    
+        
+        layer.setVisibility(false);
+        t.eq(layermoved, false, "Layer didn't move when calling setvis false");
+        
+        layer.setVisibility(true);
+        t.eq(layermoved, true, "Layer moved when calling setvis true.");
+    
+    }
+
+
+    function test_Layer_getZoomForResolution(t) {
+
+        t.plan(12);
+
+        var layer = new OpenLayers.Layer('Test Layer');
+        layer.map = {};
+        
+        //make some dummy resolutions
+        layer.resolutions = [128, 64, 32, 16, 8, 4, 2];
+        
+        t.eq(layer.getZoomForResolution(200), 0, "zoom all the way out");
+        t.eq(layer.getZoomForResolution(25), 2, "zoom in middle");
+        t.eq(layer.getZoomForResolution(3), 5, "zoom allmost all the way in");
+        t.eq(layer.getZoomForResolution(1), 6, "zoom  all the way in");
+
+        t.eq(layer.getZoomForResolution(65), 0, "smallest containing res");
+        t.eq(layer.getZoomForResolution(63), 1, "smallest containing res");
+
+        t.eq(layer.getZoomForResolution(65, true), 1, "closest res");
+        t.eq(layer.getZoomForResolution(63, true), 1, "closest res");
+        
+        layer.map.fractionalZoom = true;
+        t.eq(layer.getZoomForResolution(64), 1,
+             "(fractionalZoom) correct zoom for res in array");
+        t.eq(layer.getZoomForResolution(48).toPrecision(6), (1.5).toPrecision(6),
+             "(fractionalZoom) linear scaling for res between entries");
+        t.eq(layer.getZoomForResolution(200).toPrecision(6), (0).toPrecision(6),
+             "(fractionalZoom) doesn't return zoom below zero");
+        t.eq(layer.getZoomForResolution(1).toPrecision(6), (layer.resolutions.length - 1).toPrecision(6),
+             "(fractionalZoom) doesn't return zoom above highest index");
+
+    }
+    
+    function test_Layer_redraw(t) {
+        t.plan(11)
+
+        var name = 'Test Layer';
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        var params = { map: '/mapdata/vmap_wms.map', 
+                       layers: 'basic', 
+                       format: 'image/jpeg'};
+
+        var layer = new OpenLayers.Layer.WMS(name, url, params);
+        
+        t.ok(!layer.redraw(),
+             "redraw on an orphan layer returns false");
+        
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+
+        t.ok(!layer.redraw(),
+             "redraw returns false if map does not yet have a center");
+        map.zoomToMaxExtent();
+        
+        t.ok(layer.redraw(),
+             "redraw returns true after map has a center");
+        
+        layer.setVisibility(false);
+        t.ok(!layer.redraw(),
+             "redraw returns false if a layer is not visible");
+        
+        layer.setVisibility(true);
+        t.ok(layer.redraw(),
+                "redraw returns true even if extent has not changed");
+        
+        var log = {};
+        var onMoveend = function(e) {
+            log.event = e;
+        };
+        layer.events.on({"moveend": onMoveend});
+        layer.redraw();
+        layer.events.un({"moveend": onMoveend});
+        // test that the moveend event was triggered
+        t.ok(log.event, "an event was logged");
+        t.eq(log.event.type, "moveend", "moveend was triggered");
+        t.eq(log.event.zoomChanged, true, "event says zoomChanged true - poor name");
+
+        layer.moveTo = function(bounds, zoomChanged, dragging) {
+            var extent = layer.map.getExtent();
+            t.ok(bounds.equals(extent),
+                 "redraw calls moveTo with the map extent");
+            t.ok(zoomChanged,
+                 "redraw calls moveTo with zoomChanged true");
+            t.ok(!dragging,
+                 "redraw calls moveTo with dragging false");
+        }
+        layer.redraw();
+    }
+      
+    function test_layer_setIsBaseLayer(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer();
+
+        map.events.register("changebaselayer", t, function() {
+          this.ok(true, "setIsBaseLayer() trig changebaselayer event.")
+        });
+
+        map.addLayer(layer);
+        layer.setIsBaseLayer(true);
+        t.ok(layer.isBaseLayer, "setIsBaseLayer() change isBaseLayer property.");
+    }
+      
+    function test_layer_setTileSize(t) {
+        t.plan(6);
+
+        layer = new OpenLayers.Layer();
+        
+        g_MapTileSize = new OpenLayers.Size(25,67);        
+        layer.map = {
+            getTileSize: function() {
+                return g_MapTileSize;
+            }
+        };
+
+        var layerTileSize = new OpenLayers.Size(1,1);
+
+    //TILE SIZE
+        layer.tileSize = layerTileSize;
+      
+      //parameter
+        var size = new OpenLayers.Size(2,2);
+        layer.setTileSize(size);
+        t.ok(layer.tileSize.equals(size), "size paramater set correctly to layer's tile size");
+        t.ok(layer.imageOffset == null, "imageOffset and imageSize null when no gutters")
+      
+      //set on layer
+        layer.tileSize = layerTileSize;
+        layer.setTileSize();
+        t.ok(layer.tileSize.equals(layerTileSize), "layer's tileSize property preserved if no parameter sent in");
+      
+      //take it from map
+        layer.tileSize = null;
+        layer.setTileSize();
+        t.ok(layer.tileSize.equals(g_MapTileSize), "layer's tileSize property is null and so correctly taken from the map");
+        
+        
+
+    //GUTTERS
+        layer.gutter = 15;
+        size = new OpenLayers.Size(10,100);
+        layer.setTileSize(size);
+
+        var desiredImageOffset = new OpenLayers.Pixel(-15, -15); 
+        var desiredImageSize = new OpenLayers.Size(40, 130); 
+
+        t.ok(layer.imageOffset.equals(desiredImageOffset), "image offset correctly calculated");
+        t.ok(layer.imageSize.equals(desiredImageSize), "image size correctly calculated");
+    }
+    
+    function test_Layer_getResolution(t) {
+        t.plan(1);
+        var layer = new OpenLayers.Layer("test");
+        layer.map = {
+            getZoom: function() {return "foo";}
+        };
+        layer.getResolutionForZoom = function(zoom) {
+            t.eq(zoom, "foo", "getResolution calls getResolutionForZoom");
+        }
+        layer.getResolution();
+        layer.map = null;
+        layer.destroy();
+    }
+    
+    function test_Layer_getResolutionForZoom(t) {
+        t.plan(8);
+        var layer = new OpenLayers.Layer("test");
+        layer.map = {fractionalZoom: false};
+        layer.resolutions = ["zero", "one", "two"];
+        t.eq(layer.getResolutionForZoom(0), "zero",
+             "(fractionalZoom false) returns resolution for given index");
+        t.eq(layer.getResolutionForZoom(0.9), "one",
+             "(fractionalZoom false) returns resolution for float index");
+        
+        layer.resolutions = [2, 4, 6, 8];
+        layer.map.fractionalZoom = true;
+        t.eq(layer.getResolutionForZoom(1).toPrecision(6), (4).toPrecision(6),
+             "(fractionalZoom true) returns resolution for integer zoom");
+
+        t.eq(layer.getResolutionForZoom(1.3).toPrecision(6), (4.6).toPrecision(6),
+             "(fractionalZoom true) for zoom 1.3 should be 4.6");
+
+        t.eq(layer.getResolutionForZoom(1.6).toPrecision(6), (5.2).toPrecision(6),
+             "(fractionalZoom true) for zoom 1.6 should be 5.2");
+
+        t.eq(layer.getResolutionForZoom(1.8).toPrecision(6), (5.6).toPrecision(6),
+             "(fractionalZoom true) for zoom 1.8 should be 5.6");
+
+        t.eq(layer.getResolutionForZoom(1.5).toPrecision(6), (5).toPrecision(6),
+             "(fractionalZoom true) returns resolution for float zoom");             
+        t.eq(layer.getResolutionForZoom(3.5).toPrecision(6), (8).toPrecision(6),
+             "(fractionalZoom true) returns resolution for zoom beyond res length - 1");
+        
+    }
+    
+    function test_afterAdd(t) {
+        
+        t.plan(1);
+        
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer(null, {isBaseLayer: true});
+        var hasBase = false;
+        layer.afterAdd = function() {
+            hasBase = !!(layer.map && layer.map.baseLayer);
+        }
+        map.addLayer(layer);
+        t.eq(hasBase, true, "when afterAdd is called, map has a base layer");
+        
+    }
+    
+    function test_setOpacity(t) {
+        t.plan(5);
+
+        var map, layer, log;
+        
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer("");
+        map.addLayer(layer);
+
+        log = [];
+        map.events.register('changelayer', t, function(event) {
+            log.push({layer: event.layer, property: event.property});
+        });
+        layer.setOpacity(0.42);
+        t.eq(layer.opacity, 0.42,
+             "setOpacity() set layer.opacity to correct value");
+        t.eq(log.length, 1,
+             "setOpacity() triggers changelayer once");
+        t.ok(log[0].layer == layer,
+             "changelayer listener called with expected layer");
+        t.eq(log[0].property, "opacity",
+             "changelayer listener called with expected property");
+
+        // This call must not trig the event because the opacity value is the same.
+        log = [];
+        layer.setOpacity(0.42);
+        t.eq(log.length, 0,
+             "setOpacity() does not trigger changelayer if the opacity value is the same");
+    }
+
+
+/******
+ * 
+ * 
+ * HERE IS WHERE SOME TESTS SHOULD BE PUT TO CHECK ON THE LONLAT-PX TRANSLATION
+ * FUNCTIONS AND RESOLUTION AND GETEXTENT GETZOOMLEVEL, ETC
+ * 
+ * 
+ */
+
+
+    function test_Layer_destroy (t) {
+        t.plan( 5 );    
+
+        var map = new OpenLayers.Map('map');
+        
+        layer = new OpenLayers.Layer('Test Layer');
+
+        map.addLayer(layer);
+
+        layer.destroy();
+
+        t.eq( layer.name, null, "layer.name is null after destroy" );
+        t.eq( layer.div, null, "layer.div is null after destroy" );
+        t.eq( layer.map, null, "layer.map is null after destroy" );
+        t.eq( layer.options, null, "layer.options is null after destroy" );
+
+        t.eq(map.layers.length, 0, "layer removed from map");
+        
+        map.destroy();
+
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width:500px;height:500px"></div>
+  <div id="map2" style="width:100px;height:100px"></div>
+</body>
+</html>
diff --git a/tests/Layer/ArcGIS93Rest.html b/tests/Layer/ArcGIS93Rest.html
new file mode 100644
index 0000000..de37de4
--- /dev/null
+++ b/tests/Layer/ArcGIS93Rest.html
@@ -0,0 +1,363 @@
+<html>
+<head>
+    <script type="text/javascript">var oldAlert = window.alert, gMess; window.alert = function(message) {gMess = message; return true;};</script>
+    <script type="text/javascript">window.alert = oldAlert;</script>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer; 
+
+    var name = 'Test Layer';
+    var url = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/export";
+    var params = {layers: "show:0,2"};
+
+    function test_Layer_AGS93_constructor (t) {
+        var params = {layers: "show:0,2"};
+        t.plan( 14 );
+
+        var trans_format = "png";
+        if (OpenLayers.Util.alphaHack()) { trans_format = "gif"; } 
+        
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        t.ok( layer instanceof OpenLayers.Layer.ArcGIS93Rest, "new OpenLayers.Layer.ArcGIS93Rest returns object" );
+        t.eq( layer.url, url, "layer.url is correct (HTTPRequest inited)" );
+        t.eq( layer.params.LAYERS, "show:0,2", "params passed in correctly uppercased" );
+
+        t.eq( layer.params.FORMAT, "png", "default params correclty uppercased and copied");
+
+        t.eq(layer.isBaseLayer, true, "no transparency setting, wms is baselayer");
+
+        params.format = 'jpg';
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        t.eq( layer.params.FORMAT, "jpg", "default params correclty uppercased and overridden");
+
+        params.TRANSPARENT = "true";
+        var layer2 = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        t.eq(layer2.isBaseLayer, false, "transparency == 'true', wms is not baselayer");
+
+        params.TRANSPARENT = "TRUE";
+        var layer3 = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        t.eq(layer3.isBaseLayer, false, "transparency == 'TRUE', wms is not baselayer");
+        t.eq(layer3.params.FORMAT, trans_format, "transparent = TRUE causes non-image/jpeg format");
+
+        params.TRANSPARENT = "TRuE";
+        var layer4 = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        t.eq(layer4.isBaseLayer, false, "transparency == 'TRuE', wms is not baselayer");
+        t.eq(layer4.params.FORMAT, trans_format, "transparent = TRuE causes non-image/jpeg format");
+
+        params.TRANSPARENT = true;
+        var layer5 = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        t.eq(layer5.isBaseLayer, false, "transparency == true, wms is not baselayer");
+        t.eq(layer5.params.FORMAT, trans_format, "transparent = true causes non-image/jpeg format");
+
+        params.TRANSPARENT = false;
+        var layer6 = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        t.eq(layer6.isBaseLayer, true, "transparency == false, wms is baselayer");
+    }
+    
+    function test_Layer_AGS93_addtile (t) {
+        var params = {layers: "show:0,2"};
+        t.plan( 6 );
+    
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        var pixel = new OpenLayers.Pixel(5,6);
+        var tile = layer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
+        tile.draw();
+
+        var img = tile.imgDiv;
+        var tParams = OpenLayers.Util.extend({},
+                        OpenLayers.Util.upperCaseObject(params));
+        tParams = OpenLayers.Util.extend(tParams, {
+            FORMAT: "png", BBOX: "1,2,3,4", SIZE: "256,256", F: "image", BBOXSR: "4326", IMAGESR: "4326"
+        });
+        t.eq( img.src,
+             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             "image src is created correctly via addtile" );
+        t.eq( tile.frame.style.top, "6px", "image top is set correctly via addtile" );
+        t.eq( tile.frame.style.left, "5px", "image top is set correctly via addtile" );
+
+        var firstChild = layer.div.firstChild.firstChild;
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( firstChild instanceof HTMLElement, "div first child is an image object" );
+        t.eq( firstChild.src,
+             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             "div first child is correct image object" );
+        t.eq( tile.position.toString(), "x=5,y=6", "Position of tile is set correctly." );
+        map.destroy();
+    }
+    
+    function test_Layer_AGS93_inittiles (t) {
+        var params = {layers: "show:0,2"};
+        t.plan( 2 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),5);
+        t.eq( layer.grid.length, 7, "Grid rows is correct." );
+        t.eq( layer.grid[0].length, 6, "Grid cols is correct." );
+        map.destroy();
+    }
+
+
+    function test_Layer_AGS93_clone (t) {
+        var params = {layers: "show:0,2"};
+        t.plan(4);
+        
+        var options = {tileSize: new OpenLayers.Size(500,50)};
+        var map = new OpenLayers.Map('map', options);
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        map.addLayer(layer);
+
+        layer.grid = [ [6, 7], 
+                       [8, 9]];
+
+        var clone = layer.clone();
+
+        t.ok( clone.grid != layer.grid, "clone does not copy grid");
+
+        t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
+
+        layer.tileSize.w += 40;
+
+        t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference");
+
+        t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
+
+        layer.grid = null;
+        map.destroy();
+    }
+
+    function test_Layer_AGS93_isBaseLayer(t) {
+        var params = {layers: "show:0,2"};
+        t.plan(3);
+        
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        t.ok( layer.isBaseLayer, "baselayer is true by default");
+
+        var newParams = OpenLayers.Util.extend({}, params);
+        newParams.transparent = "true";
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, newParams);
+        t.ok( !layer.isBaseLayer, "baselayer is false when transparent is set to true");
+
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params, {isBaseLayer: false});
+        t.ok( !layer.isBaseLayer, "baselayer is false when option is set to false" );
+    }
+
+    function test_Layer_AGS93_mergeNewParams (t) {
+        var params = {layers: "show:0,2"};
+        t.plan( 4 );
+
+        var map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        
+        var newParams = { layers: 'sooper', 
+                          chickpeas: 'png'};
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+
+        layer.redraw = function() {
+            t.ok(true, "layer is redrawn after new params merged");
+        }
+
+        layer.mergeNewParams(newParams);
+        
+        t.eq( layer.params.LAYERS, "sooper", "mergeNewParams() overwrites well");
+        t.eq( layer.params.CHICKPEAS, "png", "mergeNewParams() adds well");
+    
+        newParams.CHICKPEAS = 151;
+
+        t.eq( layer.params.CHICKPEAS, "png", "mergeNewParams() makes clean copy of hashtable");
+        map.destroy();
+    }
+
+    function test_Layer_AGS93_getFullRequestString (t) {
+        var params = {layers: "show:0,2"};
+        t.plan( 1 );
+        var map = new OpenLayers.Map('map');
+        map.projection = "xx";
+        tParams = { layers: 'show:0,2', 
+                   format: 'png'};
+        var tLayer = new OpenLayers.Layer.ArcGIS93Rest(name, url, tParams);
+        map.addLayer(tLayer);
+        str = tLayer.getFullRequestString();
+        var tParams = {
+            LAYERS: "show:0,2", FORMAT: "png"
+        };
+        t.eq(str,
+             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             "getFullRequestString() adds SRS value");
+        map.destroy();
+ 
+    }
+
+    function test_Layer_AGS93_setOpacity (t) {
+        var params = {layers: "show:0,2"};
+        t.plan( 5 );
+
+        var map = new OpenLayers.Map('map');
+        map.projection = "xx";
+        tParams = { layers: 'show:0,2', 
+                   format: 'png'};
+        tOptions = { 'opacity': '0.5' };           
+        var tLayer = new OpenLayers.Layer.ArcGIS93Rest(name, url, tParams, tOptions);
+        map.addLayer(tLayer);
+        map.zoomToMaxExtent();
+        t.eq(tLayer.opacity, "0.5", "Opacity is set correctly");
+        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.5, "Opacity on tile is correct");
+        tLayer.setOpacity("0.6");
+        t.eq(tLayer.opacity, "0.6", "setOpacity works properly");
+        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.6, "Opacity on tile is changed correctly");
+        var pixel = new OpenLayers.Pixel(5,6);
+        var tile = tLayer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
+        tile.draw();
+        t.eq(parseFloat(tile.imgDiv.style.opacity), 0.6, "Tile opacity is set correctly");
+
+        map.destroy();
+    }    
+    
+    function test_Layer_AGS93_noGutters (t) { 
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.ArcGIS93Rest("no gutter layer", url, params, {gutter: 0});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        var tile = layer.grid[0][0];
+        var request = layer.getURL(tile.bounds);
+        var args = OpenLayers.Util.getParameters(request);
+        t.eq(parseInt(args['SIZE'][0]),
+             tile.size.w,
+             "layer without gutter requests images that are as wide as the tile");
+        t.eq(parseInt(args['SIZE'][1]),
+             tile.size.h,
+             "layer without gutter requests images that are as tall as the tile");
+        
+        layer.destroy();
+        map.destroy();
+    }
+
+    function test_Layer_AGS93_gutters (t) { 
+        var params = {layers: "show:0,2"};
+        t.plan(2);
+        var gutter = 15;
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.ArcGIS93Rest("gutter layer", url, params, {gutter: gutter});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        var tile = layer.grid[0][0];
+        var request = layer.getURL(tile.bounds);
+        var args = OpenLayers.Util.getParameters(request);
+        t.eq(parseInt(args['SIZE'][0]),
+             tile.size.w + (2 * gutter),
+             "layer with gutter requests images that are wider by twice the gutter");
+        t.eq(parseInt(args['SIZE'][1]),
+             tile.size.h + (2 * gutter),
+             "layer with gutter requests images that are taller by twice the gutter");
+
+        layer.destroy();
+        map.destroy();
+
+    }
+
+    function test_Layer_AGS93_destroy (t) {
+
+        t.plan( 1 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.destroy();
+        
+    // checks to make sure superclass (grid) destroy() was called    
+        
+        t.ok( layer.grid == null, "grid set to null");
+    }
+    
+    function test_Layer_ADG93_Filter(t) {
+        var params = {layers: "show:0,2"};
+        t.plan( 9 );
+    
+        layer = new OpenLayers.Layer.ArcGIS93Rest(name, url, params);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        var pixel = new OpenLayers.Pixel(5,6);
+        var tile = layer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
+        // Set up basic params.
+        var tParams = OpenLayers.Util.extend({}, OpenLayers.Util.upperCaseObject(params));
+        tParams = OpenLayers.Util.extend(tParams, {
+            FORMAT: "png", BBOX: "1,2,3,4", SIZE: "256,256", F: "image", BBOXSR: "4326", IMAGESR: "4326"
+        });
+        
+        // We need to actually set the "correct" url on a dom element, because doing so encodes things not encoded by getParameterString.
+        var encodingHack = document.createElement("img");
+        
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src no filter" );
+        
+        layer.setLayerFilter('1', "MR_TOAD = 'FLYING'");
+        tParams["LAYERDEFS"] = "1:MR_TOAD = 'FLYING';";
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src one filter" );
+
+        layer.setLayerFilter('1', "MR_TOAD = 'NOT FLYING'");
+        tParams["LAYERDEFS"] = "1:MR_TOAD = 'NOT FLYING';";
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src change one filter" );
+
+        layer.setLayerFilter('2', "true = false");
+        tParams["LAYERDEFS"] = "1:MR_TOAD = 'NOT FLYING';2:true = false;";
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src two filters" );
+
+        layer.setLayerFilter('99', "some_col > 5");
+        tParams["LAYERDEFS"] = "1:MR_TOAD = 'NOT FLYING';2:true = false;99:some_col > 5;";
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src three filters" );
+        
+        layer.clearLayerFilter('2');
+        tParams["LAYERDEFS"] = "1:MR_TOAD = 'NOT FLYING';99:some_col > 5;";
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src removed middle filter" );
+        
+        layer.clearLayerFilter('2');
+        tParams["LAYERDEFS"] = "1:MR_TOAD = 'NOT FLYING';99:some_col > 5;";
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src removed missing filter (no change)" );
+        
+        layer.clearLayerFilter();
+        delete tParams["LAYERDEFS"];
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src removed all filters" );
+        
+        layer.clearLayerFilter();
+        tile.draw();
+        encodingHack.src = (url + "?" + OpenLayers.Util.getParameterString(tParams));
+        t.eq( tile.imgDiv.src, encodingHack.src, "image src removed all (no) filters" );
+    }
+    
+    
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/ArcIMS.html b/tests/Layer/ArcIMS.html
new file mode 100644
index 0000000..48cf309
--- /dev/null
+++ b/tests/Layer/ArcIMS.html
@@ -0,0 +1,123 @@
+<html>
+  <head>
+    <script type="text/javascript" src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    
+      // use an arcims map service against Avencia Inc.'s global sample map services
+      var serviceName = "OpenLayers_Sample";
+      var layerName = "Global Sample Map";
+      var imsUrl = "http://sample.avencia.com/servlet/com.esri.esrimap.Esrimap";
+      
+      //
+      // create an arcims layer
+      //
+      function test_Layer_ArcIMS_constructor( t ) {
+        t.plan(11);
+        
+        var options = {
+          serviceName: serviceName,
+          async: false,
+          displayOutsideMaxExtent: true
+        };
+            
+        var layer = new OpenLayers.Layer.ArcIMS( layerName, imsUrl, options );
+          
+        // check layer & properties
+        t.ok( layer instanceof OpenLayers.Layer.ArcIMS, "new OpenLayers.Layer.ArcIMS returns object" );
+        t.eq( layer.url, imsUrl, "layer.url is correct (HTTPRequest inited)" );
+        t.eq( layer.name, layerName, "layer.name is correct" );
+        t.eq( layer.displayOutsideMaxExtent, options.displayOutsideMaxExtent, 
+          "displayOutsideMaxExtent property set correctly from options" );
+         
+        // check request parameters
+        t.eq( layer.params.ServiceName, serviceName, "ServiceName set properly" );
+        t.eq( layer.params.ClientVersion, "9.2", "ClientVersion set properly" );
+        
+        // check request options
+        t.eq( layer.options.async, options.async, "async property set correctly from options" );
+        t.eq( layer.options.serviceName, serviceName, "serviceName property set correctly from options" );
+        t.eq( layer.options.layers.length, 0, "layers option is the correct length" );
+        t.eq( layer.options.tileSize.w, 512, "default tile width set correctly" );
+        t.eq( layer.options.tileSize.h, 512, "default tile height set correctly" );
+      } 
+      
+      
+      
+      /*
+       * how to test getURL, getURLasync, and getFeatureInfo without a proxy?
+       *
+       */
+      
+      
+      //
+      // Create an arcims layer, and verify that the query changes properly
+      //
+      function test_Layer_ArcIMS_setLayerQuery(t) {
+        t.plan(9);
+        
+        var options = { serviceName: serviceName };
+        var layer = new OpenLayers.Layer.ArcIMS( layerName, imsUrl, options );
+        var querydef = {
+          where: "FIPS_CNTRY = 'US'"
+        };
+        
+        t.eq( layer.options.layers.length, 0, "layer definitions are empty" );
+        
+        layer.setLayerQuery( "layerID", querydef );
+        
+        t.eq( layer.options.layers.length, 1, "layers definitions contain one layerdef" );
+        t.ok( layer.options.layers[0].query !== null, "layer query exists" );
+        t.eq( typeof layer.options.layers[0].query.where, "string", "where query is a string" );
+        t.eq( layer.options.layers[0].query.where, querydef.where, "where query matches" );
+        
+        // change the definition
+        querydef = {
+          where: "FIPS_CNTRY = 'UV'",
+          spatialfilter:true
+        }
+        
+        layer.setLayerQuery( "layerID", querydef );
+        
+        t.eq( layer.options.layers.length, 1, "layers definitions contain one layerdef" );
+        t.ok( layer.options.layers[0].query !== null, "layer query exists" );
+        t.eq( typeof layer.options.layers[0].query.where, "string", "where query is a string" );
+        t.eq( layer.options.layers[0].query.where, querydef.where, "where query matches" );
+      }
+      function test_Layer_ArcIMS_clone (t) {
+          t.plan(5);
+  
+          var url = imsUrl;
+          var options = {
+            serviceName: serviceName,
+            async: false,
+            displayOutsideMaxExtent: true
+          };
+          var map = new OpenLayers.Map('map', {controls: []});
+          var layer = new OpenLayers.Layer.ArcIMS(name, url, options);
+          map.addLayer(layer);
+  
+          layer.grid = [ [6, 7],
+                         [8, 9]];
+  
+          var clone = layer.clone();
+  
+          t.ok( clone.grid != layer.grid, "clone does not copy grid");
+  
+          t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
+  
+          t.eq( clone.params.serviceName, layer.params.serviceName, "serviceName copied correctly");
+  
+          t.eq( clone.async, layer.async, "async copied correctly");
+  
+          t.eq( clone.url, layer.url, "url copied correctly");
+  
+          layer.grid = null;
+          map.destroy();
+      }
+      
+    </script>
+  </head>
+  <body>
+    <div id="map" style="width:500px;height:550px"></div> 
+  </body>  
+</html>
diff --git a/tests/Layer/EventPane.html b/tests/Layer/EventPane.html
new file mode 100644
index 0000000..ccf12d7
--- /dev/null
+++ b/tests/Layer/EventPane.html
@@ -0,0 +1,168 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
+    var layer; 
+
+    function test_Layer_EventPane_constructor (t) {
+        t.plan( 5 );
+        
+        var layer = new OpenLayers.Layer.EventPane('Test Layer');
+        
+        t.ok( layer instanceof OpenLayers.Layer.EventPane, "new OpenLayers.Layer.EventPane returns object" );
+        t.eq( layer.CLASS_NAME, "OpenLayers.Layer.EventPane", "CLASS_NAME variable set correctly");
+        t.eq( layer.name, "Test Layer", "layer.name is correct" );
+        t.eq( layer.isBaseLayer, true, "EventPane layer is always base layer" );
+        if (!isMozilla) {
+            t.ok( true, "skipping element test outside of Mozilla");
+        } else {
+            t.ok( layer.pane instanceof HTMLDivElement, "layer.pane is an HTMLDivElement" );
+        }
+    }
+
+    function test_Layer_EventPane_clone (t) {
+        t.plan( 1 );
+        t.ok( true, "need to actually write some tests here" );
+        return;
+        
+        /// FIX ME FIX ME: fix this later
+
+        var map = new OpenLayers.Map('map'); 
+        var options = { chicken: 151, foo: "bar" };
+        var layer = new OpenLayers.Layer('Test Layer', options);
+        map.addLayer(layer);
+
+        // randomly assigned property
+        layer.chocolate = 5;
+
+        var clone = layer.clone();
+
+        t.ok( clone instanceof OpenLayers.Layer, "new OpenLayers.Layer returns object" );
+        t.eq( clone.name, "Test Layer", "default clone.name is correct" );
+        t.ok( ((clone.options["chicken"] == 151) && (clone.options["foo"] == "bar")), "clone.options correctly set" );
+        t.eq(clone.chocolate, 5, "correctly copied randomly assigned property");
+
+        layer.addOptions({chicken:152});
+        t.eq(clone.options["chicken"], 151, "made a clean copy of options");        
+
+        
+        t.ok( clone.map == null, "cloned layer has map property set to null")
+        
+    }
+
+    function test_Layer_EventPane_setMap (t) {
+
+// MOUSEMOVE test does not seem to work... 
+//         t.plan( 2 );    
+
+        if (OpenLayers.Util.getBrowserName() != "firefox" && OpenLayers.Util.getBrowserName() != "mozilla") {
+          t.plan(4);
+        } else {
+          t.plan(0);
+          t.debug_print("Firefox gives different results for different browsers on setMap on EventPane, so just don't run it for now.") 
+          return;
+        }
+        var map = new OpenLayers.Map('map');
+        
+        layer = new OpenLayers.Layer.EventPane('Test Layer');
+
+        //give dummy function so test wont bomb on layer.setMap()
+        layer.loadMapObject = function() { };
+        layer.getWarningHTML = function() { this.warning = true; return ""; };
+        map.addLayer(layer);
+        t.eq( parseInt(layer.pane.style.zIndex) - parseInt(layer.div.style.zIndex),
+            1, "layer pane is 1 z-level above its div" );
+
+        t.ok( layer.warning, "warning correctly registered on no mapObject load" );
+
+        layer2 = new OpenLayers.Layer.EventPane('Test Layer');
+
+        //give dummy function so test wont bomb on layer.setMap()
+        layer2.loadMapObject = function() { this.mapObject = {}; };
+        layer2.getWarningHTML = function() { this.warning = true; return ""; }
+
+        map.addLayer(layer2);
+        t.ok( !layer2.warning, "warning not registered on mapObject load" );
+
+        map.events.register("mousemove", map, function () {
+            t.ok(true, "got mouse move");
+        });
+        
+        if( document.createEvent ) { // Mozilla
+          var evObj = document.createEvent('MouseEvents');
+          evObj.initEvent( 'mousemove', true, false );
+          layer.pane.dispatchEvent(evObj);
+        } else if( document.createEventObject ) { // IE
+          layer.pane.fireEvent('onmousemove');
+        }
+    }
+
+    function test_Layer_EventPane_setVisibility (t) {
+        t.plan( 2 );    
+        layer = new OpenLayers.Layer.EventPane('Test Layer');
+        layer.setVisibility(false);
+        t.eq(layer.visibility, false, "layer pane is now invisible");
+        layer.setVisibility(true);
+        t.eq(layer.visibility, true, "layer pane is now visible");
+    }
+
+    
+    function test_Layer_EventPane_removeLayer(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        
+        layer = new OpenLayers.Layer.EventPane('Test Layer');
+        layer.loadMapObject = function() { };
+        layer.getWarningHTML = function() { this.warning = true; return ""; };
+        map.addLayer(layer);
+        map.removeLayer(layer);
+        var parent = layer.pane.parentNode;
+        // IE creates a DOCUMENT_FRAGMENT_NODE for the parent
+        t.ok(!parent || parent.nodeType == 11, "Layer.pane removed from dom.");
+    }
+   
+    function test_repeat_add(t) {
+
+        t.plan(1);
+        var map = new OpenLayers.Map("map");
+        
+        layer = new OpenLayers.Layer.EventPane();
+        layer.loadMapObject = function() {};
+        layer.getWarningHTML = function() {this.warning = true; return "";};
+
+        map.addLayer(layer);
+        map.removeLayer(layer);
+        
+        // try adding the layer a second time
+        var msg = "layer successfully added after being removed";
+        var pass = true;
+        try {
+            map.addLayer(layer);
+        } catch (err) {
+            msg = "couldn't add layer after removing: " + err;
+            pass = false;
+        }
+        t.ok(pass, msg);
+
+    }
+    
+    function test_destroy(t) {
+        
+        t.plan(2);
+        layer = new OpenLayers.Layer.EventPane();
+        t.ok(layer.pane, "pane created on initialize");
+        
+        layer.destroy();
+        t.ok(!layer.pane, "pane deleted on destroy");
+        
+    }
+
+
+  </script>
+</head>
+<body>
+  <div id="map" style="height:500px;width:500px"></div>
+</body>
+</html>
diff --git a/tests/Layer/FixedZoomLevels.html b/tests/Layer/FixedZoomLevels.html
new file mode 100644
index 0000000..9e00cb6
--- /dev/null
+++ b/tests/Layer/FixedZoomLevels.html
@@ -0,0 +1,109 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer; 
+
+    function test_Layer_FixedZoomLevels (t) {
+        t.plan( 39 );
+        
+        var layer = { 'MIN_ZOOM_LEVEL': 5,
+                      'MAX_ZOOM_LEVEL': 10 };        
+
+
+    //defaults 
+
+        layer = p_createLayer(layer);
+        p_minMaxNum(t, layer, layer.MIN_ZOOM_LEVEL, layer.MAX_ZOOM_LEVEL, "nothing specified");
+
+    
+    //layer.options
+
+        // min,num
+        layer = p_createLayer(layer, {}, { minZoomLevel: 3, numZoomLevels: 12});
+        p_minMaxNum(t, layer, layer.MIN_ZOOM_LEVEL, layer.MAX_ZOOM_LEVEL, "min too low num too high(layer.options)");
+
+        layer = p_createLayer(layer, {}, { minZoomLevel: 6, numZoomLevels: 3 });
+        p_minMaxNum(t, layer, 6, 8, "valid min,num(layer.options)");
+
+
+        // max
+        layer = p_createLayer(layer, {}, { maxZoomLevel: 9 });
+        p_minMaxNum(t, layer, layer.MIN_ZOOM_LEVEL, 9, "valid max(layer.options)");
+
+        layer = p_createLayer(layer, {}, { maxZoomLevel: 12 });
+        p_minMaxNum(t, layer, layer.MIN_ZOOM_LEVEL, layer.MAX_ZOOM_LEVEL, "invalid max(layer.options)");
+
+
+
+    //map
+
+        // min,num
+        layer = p_createLayer(layer, { minZoomLevel: 3, numZoomLevels: 12});
+        p_minMaxNum(t, layer, layer.MIN_ZOOM_LEVEL, layer.MAX_ZOOM_LEVEL, "min too low num too high(map)");
+
+        layer = p_createLayer(layer, { minZoomLevel: 6, numZoomLevels: 3 });
+        p_minMaxNum(t, layer, 6, 8, "valid min,num(map)");
+
+
+        // max
+        layer = p_createLayer(layer, { maxZoomLevel: 9 });
+        p_minMaxNum(t, layer, layer.MIN_ZOOM_LEVEL, 9, "valid max(map)");
+
+        layer = p_createLayer(layer, { maxZoomLevel: 12 });
+        p_minMaxNum(t, layer, layer.MIN_ZOOM_LEVEL, layer.MAX_ZOOM_LEVEL, "invalid max(map)");
+
+    //map vs. options
+
+        layer = p_createLayer(layer, {minZoomLevel: 6, numZoomLevels: 2}, { minZoomLevel: 7, numZoomLevels: 3});
+        p_minMaxNum(t, layer, 7, 9, "min,num(layer.options) wins over (map)");
+
+        layer = p_createLayer(layer, {minZoomLevel: 6, maxZoomLevel: 8}, { minZoomLevel: 7, maxZoomLevel: 9});
+        p_minMaxNum(t, layer, 7, 9, "min,max(layer.options) wins over (map)");
+
+
+    // numZoomLevels vs. maxZoomLevel
+    
+        layer = p_createLayer(layer, {maxZoomLevel: 8, numZoomLevels: 6});
+        p_minMaxNum(t, layer, layer.MIN_ZOOM_LEVEL, 10, "min,max(layer.options) wins over (map)");
+
+    // resolutions array
+
+        var resolutions = Array(20);
+        for (var i = 0; i < 20; i++) {
+            resolutions[i] = Math.random();
+        }
+        OpenLayers.Util.extend(layer, {RESOLUTIONS:resolutions});
+        var minZoomLevel = 6;
+        var numZoomLevels = 2;
+        layer = p_createLayer(layer, {}, {minZoomLevel: minZoomLevel, numZoomLevels: numZoomLevels});
+        t.eq( layer.resolutions.length, numZoomLevels, "length of resolutions array ok");
+        for (var i = 0; i < numZoomLevels; i++) {
+            t.eq( layer.resolutions[i], resolutions[i + minZoomLevel], "resolutions array at index " + i + " ok");
+        }
+    }
+
+    function p_createLayer(layer, mapOptions, layerOptions) {
+
+        layer.map = mapOptions || {};
+        layer.options = layerOptions || {};
+        OpenLayers.Layer.FixedZoomLevels.prototype.initResolutions.apply(layer);
+
+        return layer;
+    }
+
+    function p_minMaxNum(t, layer, min, max, msg) {
+
+        t.eq( layer.minZoomLevel, min, "min zoom level inherited from layer constant: " + msg);
+        t.eq( layer.maxZoomLevel, max, "max zoom level inherited from layer constant: " + msg);
+        t.eq( layer.numZoomLevels, max - min + 1, "num zoom levels correctly calcuated: " + msg);
+        
+    }
+
+
+  </script>
+</head>
+<body>
+  <div id="map"></div>
+</body>
+</html>
diff --git a/tests/Layer/GML.html b/tests/Layer/GML.html
new file mode 100644
index 0000000..8e01e94
--- /dev/null
+++ b/tests/Layer/GML.html
@@ -0,0 +1,60 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var name = "GML Layer";
+    
+    var gml = "./owls.xml";
+    var gml2 = "./mice.xml";
+
+    // if this test is running online, different rules apply
+    var isMSIE = (navigator.userAgent.indexOf("MSIE") > -1);
+    if (isMSIE) {
+        gml = "." + gml;
+        gml2 = "." + gml2;
+    }
+    
+    function test_Layer_GML_constructor(t) {
+        t.plan(3);
+
+        var layer = new OpenLayers.Layer.GML(name);
+        t.ok(layer instanceof OpenLayers.Layer.GML, "new OpenLayers.Layer.GML returns correct object" );
+        t.eq(layer.name, name, "layer name is correctly set");
+        t.ok(layer.renderer.CLASS_NAME, "layer has a renderer");
+
+    }
+    function test_Layer_GML_events(t) {
+        t.plan(3);
+
+        var layer = new OpenLayers.Layer.GML(name, gml, {isBaseLayer: true});
+        layer.events.register("loadstart", layer, function() { 
+            t.ok(true, "loadstart called.")
+        });
+        layer.events.register("loadend", layer, function() { 
+            t.ok(true, "loadend called.")
+        });
+        var map = new OpenLayers.Map("map");
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        t.delay_call(1, function() { 
+            t.ok(true, "waited for 1s"); 
+        });
+
+    }
+    function test_GML_setUrl(t) {
+        t.plan(2);
+        var layer = new OpenLayers.Layer.GML(name, gml);
+        var map = new OpenLayers.Map("map");
+        map.addLayer(layer);
+        t.eq(layer.url, gml, "layer has correct original url");
+        layer.setUrl(gml2);
+        t.eq(layer.url, gml2, "layer has correctly changed url");
+    }
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
+
diff --git a/tests/Layer/GeoRSS.html b/tests/Layer/GeoRSS.html
new file mode 100644
index 0000000..7d33ad3
--- /dev/null
+++ b/tests/Layer/GeoRSS.html
@@ -0,0 +1,210 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var isMSIE    = (navigator.userAgent.indexOf("MSIE") > -1);
+    var layer; 
+
+    var georss_txt = "./georss.txt";
+    var atom_xml   = "./atom-1.0.xml";
+
+    // if this test is running online, different rules apply
+    if (isMSIE) {
+        georss_txt = "." + georss_txt;
+        atom_xml = "." + atom_xml;
+    }
+
+    function test_Layer_GeoRSS_constructor (t) {
+        t.plan( 7 );
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt );
+        t.ok( layer instanceof OpenLayers.Layer.GeoRSS, "new OpenLayers.Layer.GeoRSS returns object" );
+        t.eq( layer.location, georss_txt, "layer.location is correct" );
+        var markers;
+        layer.loadRSS();
+        t.delay_call( 1, function() {  
+            t.eq( layer.markers.length, 40, "marker length is correct" );
+            var ll = new OpenLayers.LonLat(-71.142197, 42.405696);
+            var theTitle = "Knitting Room";
+            var theDescription = 'This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake S [...]
+            t.ok( layer.markers[0].lonlat.equals(ll), "lonlat on first marker is correct" );
+            t.eq( layer.name, "Crschmidt's Places At Platial", "Layer name is correct." );
+            t.eq( layer.features[0].data.title, theTitle);
+            t.eq( layer.features[0].data.description, theDescription);
+        } );
+    }
+    
+    function test_Layer_GeoRSS_dontUseFeedTitle (t) {
+        t.plan( 1 );
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt, {'useFeedTitle': false} );
+        t.delay_call( 1, function() {  
+            t.eq( layer.name, "Test Layer", "Layer name is correct when not used from feed." );
+        } );
+    }
+    
+    function test_Layer_GeoRSS_AtomParsing (t) {
+        t.plan( 6 );
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', atom_xml );
+        t.ok( layer instanceof OpenLayers.Layer.GeoRSS, "new OpenLayers.Layer.GeoRSS returns object" );
+        t.eq( layer.location, atom_xml, "layer.location is correct" );
+        var markers;
+        layer.loadRSS();
+        t.delay_call( 1, function() {  
+            t.eq( layer.markers.length, 2, "marker length is correct" );
+            var ll = new OpenLayers.LonLat(29.9805, 36.7702);
+            t.ok( layer.markers[0].lonlat.equals(ll), "lonlat on first marker is correct" );
+            t.like( layer.features[0].data['popupContentHTML'], '<a class="link" href="http://pleiades.stoa.org/places/638896" target="_blank">Unnamed Tumulus</a>', "Link is correct.");
+            t.eq( layer.name, "tumulus", "Layer name is correct." );
+        } );
+    }
+
+    function test_Layer_GeoRSS_draw (t) { 
+//        t.plan(5);
+        t.plan( 2 );
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt);
+        t.ok( layer instanceof OpenLayers.Layer.GeoRSS, "new OpenLayers.Layer.GeoRSS returns object" );
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        t.delay_call( 1, function() { 
+          map.setCenter(new OpenLayers.LonLat(0,0),0);
+          t.eq( map.layers[1].name, layer.name, "Layer name is correct" );
+
+        });;
+    }
+    function test_Layer_GeoRSS_load_events (t) {
+        t.plan( 1 );    
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt);
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        layer.events.register("loadstart", t, function() { this.ok(true, "loadstart event triggered once (#1580)") });
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+    }
+    function test_Layer_GeoRSS_events (t) {
+        t.plan( 4 );    
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt);
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+        var event = {};
+        t.delay_call( 2, function() {  
+          t.ok(layer.markers[0].events, "First marker has an events object");
+          t.eq(layer.markers[0].events.listeners['click'].length, 1, "Marker events has one object");
+          layer.markers[0].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "Popup opened correctly");
+          layer.markers[1].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "1st popup gone, 2nd Popup opened correctly");
+        });
+    }
+    function test_Layer_GeoRSS_popups (t) {
+        t.plan( 4 );    
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt);
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+        var event = {};
+        t.delay_call( 1, function() {  
+          t.ok(layer.markers[0].events, "First marker has an events object");
+          t.eq(layer.markers[0].events.listeners['click'].length, 1, "Marker events has one object");
+          layer.markers[0].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "Popup opened correctly");
+          layer.markers[1].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "1st popup gone, 2nd Popup opened correctly");
+        });
+        
+    }
+    function test_Layer_GeoRSS_resizedPopups(t) {
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt, {'popupSize': new OpenLayers.Size(200,100)});
+        t.plan( 4 );    
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+        var event = {};
+        t.delay_call( 1, function() {  
+          t.ok(layer.markers[0].events, "First marker has an events object");
+          t.eq(layer.markers[0].events.listeners['click'].length, 1, "Marker events has one object");
+          layer.markers[0].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "Popup opened correctly");
+          map.popups[0].size.w=300;
+          layer.markers[1].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "1st popup gone, 2nd Popup opened correctly");
+        });
+    }    
+
+    function test_Layer_GeoRSS_icon(t) {
+        t.plan( 3 );
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt);
+        var the_icon = new OpenLayers.Icon('http://boston.openguides.org/markers/AQUA.png');
+        var otherLayer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt,{icon:the_icon});
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayers([layer,otherLayer]);
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+        var defaultIcon = OpenLayers.Marker.defaultIcon();
+        layer.loadRSS();
+        otherLayer.loadRSS();
+        t.delay_call( 2, function() {
+            t.ok(layer.markers[0].icon, "The layer has a icon");
+            t.eq(layer.markers[0].icon.url, defaultIcon.url, "The layer without icon has the default icon.");
+            t.eq(otherLayer.markers[0].icon.url, the_icon.url,"The layer with an icon has that icon.");
+        });
+    }
+    function test_Layer_GeoRSS_loadend_Event(t) {
+        var browserCode = OpenLayers.Util.getBrowserName();
+        if (browserCode == "msie") {
+            t.plan(1);
+            t.ok(true, "IE fails the GeoRSS test. This could probably be fixed by someone with enough energy to fix it.");
+        } else {
+            t.plan(2);
+            layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt);
+            t.delay_call(2, function() { 
+                layer.events.register('loadend', layer, function() { 
+                    t.ok(true, "Loadend event fired"); 
+                });
+                layer.parseData({
+                    'responseText': '<xml xmlns="http://example.com"><title> </title></xml>'
+                });
+                t.ok(true, "Parsing data didn't fail"); 
+            });
+        } 
+    }
+
+    function test_Layer_GeoRSS_destroy (t) {
+        t.plan( 1 );    
+        layer = new OpenLayers.Layer.GeoRSS('Test Layer', georss_txt);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        t.delay_call( 1, function() {  
+        layer.destroy();
+        t.eq( layer.map, null, "layer.map is null after destroy" );
+        });
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width:500px; height:500px"></div>
+</body>
+</html>
diff --git a/tests/Layer/Google.html b/tests/Layer/Google.html
new file mode 100644
index 0000000..2f20526
--- /dev/null
+++ b/tests/Layer/Google.html
@@ -0,0 +1,360 @@
+<html>
+<head>
+    <script type="text/javascript">var oldAlert = window.alert, gMess; window.alert = function(message) {gMess = message; return true;};</script>
+    <!-- this gmaps key generated for http://openlayers.org/dev/ -->
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAA9XNhd8q0UdwNC7YSO4YZghSPUCi5aRYVveCcVYxzezM4iaj_gxQ9t-UajFL70jfcpquH5l1IJ-Zyyw'></script>
+    <script type="text/javascript">window.alert = oldAlert;</script>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    var layer; 
+    var validkey = (window.location.protocol == "file:") ||
+                   (window.location.host == "localhost") ||
+                   (window.location.host == "openlayers.org");
+                   
+    function test_Layer_Google_message(t) {
+        t.plan(0);
+        if(gMess) {
+            t.debug_print(gMess);
+        }
+    }
+
+    function test_Layer_Google_constructor (t) {
+        if(validkey) {
+            t.plan( 4 );
+            
+            var map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.Google('Goog Layer');
+            map.addLayer(layer);
+            
+            
+            t.ok( layer instanceof OpenLayers.Layer.Google, "new OpenLayers.Layer.Google returns object" );
+            t.eq( layer.CLASS_NAME, "OpenLayers.Layer.Google", "CLASS_NAME variable set correctly");
+    
+            t.eq( layer.name, "Goog Layer", "layer.name is correct" );
+    
+            t.ok ( layer.mapObject != null, "GMap2 Object correctly loaded");
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }
+    
+    function test_clone(t) {
+        if (validkey) {
+            t.plan(2);
+            var layer, clone;
+            
+            // test default layer
+            layer = new OpenLayers.Layer.Google();
+            clone = layer.clone();
+            t.ok(clone instanceof OpenLayers.Layer.Google, "[default] good instance");
+            
+            layer.destroy();
+            clone.destroy();
+            
+            // test with alt type
+            layer = new OpenLayers.Layer.Google(null, {type: G_SATELLITE_MAP});
+            clone = layer.clone();
+            t.ok(clone.type === G_SATELLITE_MAP, "[sat] correct type");
+            
+            layer.destroy();
+            clone.destroy();   
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }
+
+    function test_Layer_Google_isBaseLayer (t) {
+        if(validkey) {
+            t.plan(1);
+            
+            var layer = new OpenLayers.Layer.Google('Goog Layer');
+    
+            t.ok(layer.isBaseLayer, "a default load of google layer responds as a base layer");
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }    
+
+    function test_Layer_Google_Translation_lonlat (t) {
+        
+        if(validkey) {
+            t.plan( 4 );
+            
+            var map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.Google('Goog Layer');
+            map.addLayer(layer);
+
+        // these two lines specify an appropriate translation. 
+        //  the code afterwards works by itself to test that translation
+        //  works correctly both ways.
+           var gLatLng = new GLatLng(50,100);
+           var correspondingOLLonLat = new OpenLayers.LonLat(100,50);
+   
+   
+           olLonLat = layer.getOLLonLatFromMapObjectLonLat(gLatLng);
+           t.ok(olLonLat.equals(correspondingOLLonLat), "Translation from GLatLng to OpenLayers.LonLat works");
+   
+           var transGLatLng = layer.getMapObjectLonLatFromOLLonLat(olLonLat);
+           t.ok( transGLatLng.equals(gLatLng), "Translation from OpenLayers.LonLat to GLatLng works");
+   
+           t.ok( layer.getMapObjectLonLatFromOLLonLat(null) == null, "getGLatLngFromOLLonLat(null) returns null");
+           t.ok( layer.getOLLonLatFromMapObjectLonLat(null) == null, "getOLLonLatFromGLatLng(null) returns null");
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }
+
+    function test_Layer_Google_Translation_pixel (t) {
+        if(validkey) {
+            t.plan( 4 );
+            
+            var map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.Google('Goog Layer');
+            map.addLayer(layer);
+    
+         // these two lines specify an appropriate translation. 
+         //  the code afterwards works by itself to test that translation
+         //  works correctly both ways.
+            var gPoint = new GPoint(50,100);
+            var correspondingOLPixel = new OpenLayers.Pixel(50, 100);
+    
+    
+            olPixel = layer.getOLPixelFromMapObjectPixel(gPoint);
+            t.ok( olPixel.equals(correspondingOLPixel), "Translation from GPoint to OpenLayers.Pixel works");
+    
+            var transGPoint = layer.getMapObjectPixelFromOLPixel(olPixel);
+            t.ok( transGPoint.equals(gPoint), "Translation from OpenLayers.Pixel to GPoint works");
+    
+            t.ok( layer.getMapObjectPixelFromOLPixel(null) == null, "getGPointFromOLPixel(null) returns null");
+            t.ok( layer.getOLPixelFromMapObjectPixel(null) == null, "getOLPixelFromGPoint(null) returns null");
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }
+
+    function test_Layer_destroy (t) {
+        if(validkey) {
+            t.plan( 5 );    
+    
+            var map = new OpenLayers.Map('map');
+            
+            layer = new OpenLayers.Layer.Google('Test Layer');
+            map.addLayer(layer);
+    
+            layer.destroy();
+    
+            t.eq( layer.name, null, "layer.name is null after destroy" );
+            t.eq( layer.div, null, "layer.div is null after destroy" );
+            t.eq( layer.map, null, "layer.map is null after destroy" );
+            t.eq( layer.options, null, "layer.options is null after destroy" );
+            t.eq( layer.gmap, null, "layer.gmap is null after destroy" );
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }
+
+    function test_Layer_Goole_forwardMercator(t){
+        if(validkey) {
+            t.plan(2);
+            //Just test that the fowardMercator function still exists.
+            var layer = new OpenLayers.Layer.Google('Test Layer', {'sphericalMercator': true});
+            layer.forwardMercator = function(evt) {
+                t.ok(true,
+                     "GoogleMercator.forwardMercator was called and executed." );
+                return;
+            }
+            layer.forwardMercator();
+            //Now test the fowardMercator returns the expected LonLat object
+            var layer = new OpenLayers.Layer.Google('Test Layer', {'sphericalMercator': true});
+            var lonlat2 = new OpenLayers.LonLat(Math.random(),Math.random());
+            var result = layer.forwardMercator(lonlat2.lon, lonlat2.lat);
+            t.ok(result instanceof OpenLayers.LonLat, "OpenLayers.Google.fowardMercator returns LonLat object" );
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }
+
+    function test_Layer_Google_overlay(t) {
+        // Test for #849.
+        if(validkey) {
+            t.plan(1);
+            var map = new OpenLayers.Map( 'map' , 
+            { controls: [] , 'numZoomLevels':20});
+    
+            var satellite = new OpenLayers.Layer.Google( "Google Satellite" , {type: G_SATELLITE_MAP, 'maxZoomLevel':18} );
+            var layer = new OpenLayers.Layer.WMS.Untiled( "OpenLayers WMS", 
+                    "http://labs.metacarta.com/wms/vmap0", {layers: 'basic', 'transparent':true}, 
+                      {isBaseLayer: false} );
+    
+            map.addLayers([satellite, layer]);
+            map.setCenter(new OpenLayers.LonLat(10.205188,48.857593), 5);
+            map.zoomIn();
+            var size = map.getSize();
+            var px = new OpenLayers.Pixel(size.w, size.h);
+            var br = map.getLonLatFromPixel(px);
+            t.ok(layer.grid[0][0].bounds.containsLonLat(br), "Bottom right pixel is covered by untiled WMS layer");
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }    
+    function test_Layer_Google_isBaseLayer (t) {
+        if(validkey) {
+            t.plan(3);
+            var map = new OpenLayers.Map( 'map' , 
+            { controls: [] , 'numZoomLevels':20});
+    
+            var satellite = new OpenLayers.Layer.Google( "Google Satellite" , {type: G_SATELLITE_MAP, 'maxZoomLevel':18} );
+            map.addLayers([satellite]);
+            map.zoomToMaxExtent();
+            
+            t.eq(satellite.div.style.display, "", "Satellite layer is visible.");
+            satellite.setVisibility(false);
+            t.eq(satellite.div.style.display, "none", "Satellite layer is not visible.");
+            satellite.setVisibility(true);
+            t.eq(satellite.div.style.display, "block", "Satellite layer is visible.");
+            
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }
+    }
+    
+    function test_setOpacity(t) {
+        
+        t.plan(6);
+        
+        var map = new OpenLayers.Map("map");
+        var gmap = new OpenLayers.Layer.Google(
+            "Google Streets", // the default
+            {numZoomLevels: 20}
+        );
+        var ghyb = new OpenLayers.Layer.Google(
+            "Google Hybrid",
+            {type: G_HYBRID_MAP, numZoomLevels: 20}
+        );
+        var gsat = new OpenLayers.Layer.Google(
+            "Google Satellite",
+            {type: G_SATELLITE_MAP, numZoomLevels: 22}
+        );
+        map.addLayers([gmap, ghyb, gsat]);
+        map.zoomToMaxExtent();
+        
+        var container = map.baseLayer.mapObject.getContainer();
+        var opacityCheck = function(opacity) {
+            var style = container.style;
+            var current = style.opacity === "" ? 1 : parseFloat(style.opacity);
+            if (style.filter && !style.opacity) {
+                current = Number(style.filter.replace(/alpha\(opacity=(.+?)\)/, "$1"));
+            }
+            return (current === opacity);
+        };
+        
+        gmap.setOpacity(0.5);
+        t.ok(opacityCheck(0.5), "container opacity set for visible layer");
+        
+        ghyb.setOpacity(0.75);
+        t.ok(opacityCheck(0.5), "container opacity not changed if layer not visible");
+        map.setBaseLayer(ghyb);
+        t.ok(opacityCheck(0.75), "container opacity changed to 0.75 when layer becomes visible");
+        
+        map.setBaseLayer(gsat);
+        t.ok(opacityCheck(1), "container opacity set to 1 by default");
+        gsat.setOpacity(0.25);
+        t.ok(opacityCheck(0.25), "container opacity changed to 0.25 for visible layer");
+        
+        map.setBaseLayer(gmap);
+        t.ok(opacityCheck(0.5), "container opacity set to layer opacity");
+        
+        map.destroy();
+        
+    }
+
+    function test_Layer_Google_setGMapVisibility(t) {
+        if(validkey) {
+            t.plan(4);
+
+            var map1 = new OpenLayers.Map('map');
+            var gmap1 = new OpenLayers.Layer.Google("Google Streets");
+            var dummy1 = new OpenLayers.Layer("Dummy", {isBaseLayer: true});
+            map1.addLayers([dummy1, gmap1]);
+            map1.zoomToMaxExtent();
+            
+            t.delay_call(2, function() {
+                t.ok(gmap1.termsOfUse.style.display == "none" || gmap1.termsOfUse.style.left == "-9999px", "termsOfUse is not visible");
+                t.eq(gmap1.poweredBy.style.display, "none", "poweredBy is not visible");
+                map1.destroy();
+            });            
+            
+            var map2 = new OpenLayers.Map('map', {allOverlays: true});
+            var gmap2 = new OpenLayers.Layer.Google("Google Streets", {visibility: false});
+            var dummy2 = new OpenLayers.Layer("Dummy");
+            map2.addLayers([gmap2, dummy2]);
+            map2.zoomToMaxExtent();
+            
+            t.delay_call(2, function() {
+                t.ok(gmap2.termsOfUse.style.display == "none" || gmap2.termsOfUse.style.left == "-9999px", "allOverlays:true - termsOfUse is not visible");
+                t.eq(gmap2.poweredBy.style.display, "none", "allOverlays:true - poweredBy is not visible");
+                map2.destroy();
+            });            
+        } else {
+            t.plan(0);
+            t.debug_print("Google tests can't be run from " +
+                          window.location.host);
+        }    
+    }
+    
+    function test_sphericalMercator(t) {
+        
+        t.plan(4);
+        var map, layer;
+
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer.Google();
+        map.addLayer(layer);
+        t.ok(!layer.sphericalMercator, "sphericalMercator false by default");
+        t.eq(map.getProjection(), "EPSG:4326", "4326 by default without sphericalMercator");
+        map.destroy();
+        
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer.Google(null, {
+            sphericalMercator: true
+        });
+        map.addLayer(layer);
+        t.eq(map.getProjection(), "EPSG:900913", "900913 by default with sphericalMercator");
+        map.destroy();
+
+        map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer.Google(null, {
+            sphericalMercator: true,
+            projection: "EPSG:102113"
+        });
+        map.addLayer(layer);
+        t.eq(map.getProjection(), "EPSG:102113", "custom code respected with sphericalMercator");
+        map.destroy();
+        
+    }
+    
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width:500px; height: 500px"></div>
+</body>
+</html>
diff --git a/tests/Layer/Google/v3.html b/tests/Layer/Google/v3.html
new file mode 100644
index 0000000..6d5df4e
--- /dev/null
+++ b/tests/Layer/Google/v3.html
@@ -0,0 +1,364 @@
+<html>
+<head>
+    <script src="http://maps.google.com/maps/api/js?sensor=false"></script>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    var layer; 
+                   
+    function test_Layer_Google_constructor (t) {
+        t.plan( 5 );
+        
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.Google('Goog Layer');
+        map.addLayer(layer);
+        
+        
+        t.ok( layer instanceof OpenLayers.Layer.Google, "new OpenLayers.Layer.Google returns object" );
+        t.eq( layer.CLASS_NAME, "OpenLayers.Layer.Google", "CLASS_NAME variable set correctly");
+    
+        t.eq( layer.name, "Goog Layer", "layer.name is correct" );
+    
+        t.ok ( layer.mapObject != null, "GMap Object correctly loaded");
+        
+        t.eq(layer.version, "3", "API version 3 detected.");
+    }
+    
+    function test_clone(t) {
+        t.plan(2);
+        var layer, clone;
+        
+        // test default layer
+        layer = new OpenLayers.Layer.Google();
+        clone = layer.clone();
+        t.ok(clone instanceof OpenLayers.Layer.Google, "[default] good instance");
+        
+        layer.destroy();
+        clone.destroy();
+        
+        // test with alt type
+        layer = new OpenLayers.Layer.Google(null, {type: google.maps.MapTypeId.SATELLITE});
+        clone = layer.clone();
+        t.ok(clone.type === google.maps.MapTypeId.SATELLITE, "[sat] correct type");
+        
+        layer.destroy();
+        clone.destroy();   
+    }
+    
+    function test_Layer_Google_isBaseLayer (t) {
+        t.plan(1);
+        
+        var layer = new OpenLayers.Layer.Google('Goog Layer');
+    
+        t.ok(layer.isBaseLayer, "a default load of google layer responds as a base layer");
+    }    
+    
+    function test_Layer_Google_Translation_lonlat (t) {
+        t.plan( 4 );
+        
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.Google('Goog Layer');
+        map.addLayer(layer);
+    
+    // these two lines specify an appropriate translation. 
+    //  the code afterwards works by itself to test that translation
+    //  works correctly both ways.
+       var gLatLng = new google.maps.LatLng(50,100);
+       // v3 uses sphericalMercator by default
+       var correspondingOLLonLat = new OpenLayers.LonLat(100,50).transform(
+           new OpenLayers.Projection("EPSG:4326"),
+           map.getProjectionObject()
+       );
+    
+    
+       olLonLat = layer.getOLLonLatFromMapObjectLonLat(gLatLng);
+       t.ok(olLonLat.equals(correspondingOLLonLat), "Translation from GLatLng to OpenLayers.LonLat works");
+    
+       var transGLatLng = layer.getMapObjectLonLatFromOLLonLat(olLonLat);
+       t.ok( transGLatLng.equals(gLatLng), "Translation from OpenLayers.LonLat to GLatLng works");
+    
+       t.ok( layer.getMapObjectLonLatFromOLLonLat(null) == null, "getGLatLngFromOLLonLat(null) returns null");
+       t.ok( layer.getOLLonLatFromMapObjectLonLat(null) == null, "getOLLonLatFromGLatLng(null) returns null");
+    }
+    
+    function test_Layer_Google_Translation_pixel (t) {
+        t.plan( 4 );
+        
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.Google('Goog Layer');
+        map.addLayer(layer);
+    
+     // these two lines specify an appropriate translation. 
+     //  the code afterwards works by itself to test that translation
+     //  works correctly both ways.
+        var gPoint = new google.maps.Point(50,100);
+        var correspondingOLPixel = new OpenLayers.Pixel(50, 100);
+    
+    
+        olPixel = layer.getOLPixelFromMapObjectPixel(gPoint);
+        t.ok( olPixel.equals(correspondingOLPixel), "Translation from GPoint to OpenLayers.Pixel works");
+    
+        var transGPoint = layer.getMapObjectPixelFromOLPixel(olPixel);
+        t.ok( transGPoint.equals(gPoint), "Translation from OpenLayers.Pixel to GPoint works");
+    
+        t.ok( layer.getMapObjectPixelFromOLPixel(null) == null, "getGPointFromOLPixel(null) returns null");
+        t.ok( layer.getOLPixelFromMapObjectPixel(null) == null, "getOLPixelFromGPoint(null) returns null");
+    }
+    
+    function test_Layer_destroy (t) {
+        t.plan( 5 );    
+    
+        var map = new OpenLayers.Map('map');
+        
+        layer = new OpenLayers.Layer.Google('Test Layer');
+        map.addLayer(layer);
+    
+        layer.destroy();
+    
+        t.eq( layer.name, null, "layer.name is null after destroy" );
+        t.eq( layer.div, null, "layer.div is null after destroy" );
+        t.eq( layer.map, null, "layer.map is null after destroy" );
+        t.eq( layer.options, null, "layer.options is null after destroy" );
+        t.eq( layer.gmap, null, "layer.gmap is null after destroy" );
+    }
+    
+    function test_Layer_Goole_forwardMercator(t){
+        t.plan(2);
+        //Just test that the fowardMercator function still exists.
+        var layer = new OpenLayers.Layer.Google('Test Layer', {'sphericalMercator': true});
+        layer.forwardMercator = function(evt) {
+            t.ok(true,
+                 "GoogleMercator.forwardMercator was called and executed." );
+            return;
+        }
+        layer.forwardMercator();
+        //Now test the fowardMercator returns the expected LonLat object
+        var layer = new OpenLayers.Layer.Google('Test Layer', {'sphericalMercator': true});
+        var lonlat2 = new OpenLayers.LonLat(Math.random(),Math.random());
+        var result = layer.forwardMercator(lonlat2.lon, lonlat2.lat);
+        t.ok(result instanceof OpenLayers.LonLat, "OpenLayers.Google.fowardMercator returns LonLat object" );
+    }
+    
+    function test_Layer_Google_overlay(t) {
+        // Test for #849.
+        t.plan(1);
+        var map = new OpenLayers.Map( 'map' , 
+        { controls: [] , 'numZoomLevels':20});
+    
+        var satellite = new OpenLayers.Layer.Google( "Google Satellite" , {type: google.maps.MapTypeId.SATELLITE, 'maxZoomLevel':18} );
+        var layer = new OpenLayers.Layer.WMS.Untiled( "OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0", {layers: 'basic', 'transparent':true}, 
+                  {isBaseLayer: false} );
+    
+        map.addLayers([satellite, layer]);
+        map.setCenter(new OpenLayers.LonLat(10.205188,48.857593), 5);
+        map.zoomIn();
+        var size = map.getSize();
+        var px = new OpenLayers.Pixel(size.w, size.h);
+        var br = map.getLonLatFromPixel(px);
+        t.ok(layer.grid[0][0].bounds.containsLonLat(br), "Bottom right pixel is covered by untiled WMS layer");
+    }    
+    function test_Layer_Google_isBaseLayer (t) {
+        t.plan(3);
+        var map = new OpenLayers.Map( 'map' , 
+        { controls: [] , 'numZoomLevels':20});
+    
+        var satellite = new OpenLayers.Layer.Google( "Google Satellite" , {type: google.maps.MapTypeId.SATELLITE, 'maxZoomLevel':18} );
+        map.addLayers([satellite]);
+        map.zoomToMaxExtent();
+        
+        t.eq(satellite.div.style.display, "", "Satellite layer is visible.");
+        satellite.setVisibility(false);
+        t.eq(satellite.div.style.display, "none", "Satellite layer is not visible.");
+        satellite.setVisibility(true);
+        t.eq(satellite.div.style.display, "block", "Satellite layer is visible.");
+    }    
+    
+    function test_Layer_Google_setGMapVisibility(t) {
+        t.plan(3);
+    
+        var map = new OpenLayers.Map('map');
+        var gmap = new OpenLayers.Layer.Google("Google Streets");
+        var dummy = new OpenLayers.Layer("Dummy", {isBaseLayer: true});
+        map.addLayers([dummy, gmap]);
+        map.zoomToMaxExtent();
+    
+        // In v3, the terms of use and powered by elements are not available 
+        // until the layer loads.  This can occur before the layer is visible,
+        // but we don't try to access these elements until after the layer is
+        // made visible for the first time.  
+        var cache = OpenLayers.Layer.Google.cache[map.id];
+        t.ok(!cache.termsOfUse, "termsOfUse is not yet cached");
+        t.ok(!cache.poweredBy, "poweredBy is not yet cached");
+
+        var called = 0;
+        var original = gmap.repositionMapElements;
+        gmap.repositionMapElements = function() {
+            ++called;
+            original.apply(gmap, arguments);
+        }
+
+        map.setBaseLayer(gmap);
+        t.delay_call(4, function() {
+            t.ok(called > 0, "repositionMapElements called");
+            map.destroy();
+        });            
+    }
+
+    function test_Layer_Google_setGMapVisibility_allOverlays(t) {
+         t.plan(3);
+     
+         var map = new OpenLayers.Map('map', {allOverlays: true});
+         var gmap = new OpenLayers.Layer.Google("Google Streets", {visibility: false});
+         var dummy = new OpenLayers.Layer("Dummy");
+         map.addLayers([gmap, dummy]);
+         map.zoomToMaxExtent();
+         
+         // In v3, the terms of use and powered by elements are not available 
+         // until the layer loads.  This can occur before the layer is visible,
+         // but we don't try to access these elements until after the layer is
+         // made visible for the first time.
+         var cache = OpenLayers.Layer.Google.cache[map.id];
+         t.ok(!cache.termsOfUse, "termsOfUse is not yet cached");
+         t.ok(!cache.poweredBy, "poweredBy is not yet cached");
+     
+         var called = 0;
+         var original = gmap.repositionMapElements;
+         gmap.repositionMapElements = function() {
+             ++called;
+             original.apply(gmap, arguments);
+         }    
+
+         gmap.setVisibility(true);
+         t.delay_call(2, function() {
+             t.ok(called > 0, "repositionMapElements called");
+             map.destroy();
+         });            
+     }
+
+     function test_allOverlays_invisible(t) {
+
+         t.plan(1);
+
+         var map = new OpenLayers.Map('map', {allOverlays: true});
+
+         var osm = new OpenLayers.Layer.OSM();
+         var gmap = new OpenLayers.Layer.Google("Google Streets", {visibility: false});
+
+         // keep track of last argument to setGMapVisibility
+         var visible;
+         var original = gmap.setGMapVisibility;
+         gmap.setGMapVisibility = function(vis) {
+             visible = vis;
+             original.apply(gmap, arguments);
+         }
+
+         map.addLayers([osm, gmap]);
+         map.zoomToMaxExtent();
+
+         t.ok(visible === false, "setGMapVisibility last called with false");
+
+         map.destroy();
+
+     }
+     
+     function test_allOverlays_pan(t) {
+
+         t.plan(8);
+
+         var map = new OpenLayers.Map('map', {allOverlays: true});
+
+         var gmap = new OpenLayers.Layer.Google("Google Streets");
+         var osm = new OpenLayers.Layer.OSM();
+         map.addLayers([gmap, osm]);
+
+         var origin = new OpenLayers.LonLat(1000000, 6000000);
+         map.setCenter(origin, 4);
+         var resolution = map.getResolution();
+         
+         var dx, dy, center, expectedX, expectedY;
+
+         // confirm that panning works with Google visible
+         dx = 100, dy = -100;
+         map.pan(dx, dy, {animate: false});
+         center = map.getCenter();
+         expectedX = origin.lon + (resolution * dx);
+         expectedY = origin.lat - (resolution * dy);
+         t.eq(center.lon, expectedX, "x panning with Google visible " + dx + ", " + dy);
+         t.eq(center.lat, expectedY, "y panning with Google visible " + dx + ", " + dy);
+         map.pan(-dx, -dy, {animate: false});
+         center = map.getCenter();
+         t.eq(center.lon, origin.lon, "x panning with Google visible " + (-dx) + ", " + (-dy));
+         t.eq(center.lat, origin.lat, "y panning with Google visible " + (-dx) + ", " + (-dy));
+
+         // confirm that panning works with Google invisible
+         gmap.setVisibility(false);
+         dx = 100, dy = -100;
+         map.pan(dx, dy, {animate: false});
+         center = map.getCenter();
+         expectedX = origin.lon + (resolution * dx);
+         expectedY = origin.lat - (resolution * dy);
+         t.eq(center.lon, expectedX, "x panning with Google invisible " + dx + ", " + dy);
+         t.eq(center.lat, expectedY, "y panning with Google invisible " + dx + ", " + dy);
+         map.pan(-dx, -dy, {animate: false});
+         center = map.getCenter();
+         t.eq(center.lon, origin.lon, "x panning with Google invisible " + (-dx) + ", " + (-dy));
+         t.eq(center.lat, origin.lat, "y panning with Google invisible " + (-dx) + ", " + (-dy));
+         
+         map.destroy();
+
+     }
+     
+     function test_wrapDateLine(t) {
+         t.plan(2);
+
+         var map = new OpenLayers.Map("map");
+
+         var gmap = new OpenLayers.Layer.Google("Google Streets");
+         map.addLayer(gmap);
+         map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+         
+         var center;
+         
+         // pan to the edge of the world
+         map.pan(256, 0, {animate: false});
+         center = map.getCenter();
+         t.eq(center.lon, 20037508.3392, "edge of the world");
+         // pan off the edge of the world
+         map.pan(100, 0, {animate: false});
+         center = map.getCenter();
+         t.eq(center.lon, -12210356.6442, "magically back in the western hemisphere");
+         
+         map.destroy();
+         
+     }
+
+     function test_respectDateLine(t) {
+         t.plan(2);
+
+         var map = new OpenLayers.Map("map");
+
+         var gmap = new OpenLayers.Layer.Google("Google Streets", {wrapDateLine: false});
+         map.addLayer(gmap);
+         map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+         
+         var center;
+         
+         // pan to the edge of the world
+         map.pan(256, 0, {animate: false});
+         center = map.getCenter();
+         t.eq(center.lon, 20037508.3392, "edge of the world");
+         // pan off the edge of the world
+         map.pan(100, 0, {animate: false});
+         center = map.getCenter();
+         t.eq(center.lon, 20037508.3392, "whew, still on the edge");
+         
+         map.destroy();
+         
+     }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width:500px; height: 500px"></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/tests/Layer/Grid.html b/tests/Layer/Grid.html
new file mode 100644
index 0000000..e5c1ed5
--- /dev/null
+++ b/tests/Layer/Grid.html
@@ -0,0 +1,642 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer; 
+
+    var name = 'Test Layer';
+    var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+    var params = { map: '/mapdata/vmap_wms.map', 
+                   layers: 'basic', 
+                   format: 'image/png'};
+
+    /**
+     *  NOTE TO READER:
+     * 
+     *    Some of the tests on the Grid class actually use the WMS class. 
+     *    This is because WMS is a subclass of Grid and it implements the 
+     *    core functions which are necessary to test the tile-generation 
+     *    mechanism. 
+     * 
+     */
+
+
+    function test_Layer_Grid_constructor (t) {
+        t.plan( 8 );
+                       
+        layer = new OpenLayers.Layer.Grid(name, url, params, null);
+        t.ok( layer instanceof OpenLayers.Layer.Grid, "returns OpenLayers.Layer.Grid object" );
+        t.eq( layer.buffer, 2, "buffer default is 2");
+        t.eq( layer.ratio, 1.5, "ratio default is 1.5");
+        t.eq( layer.numLoadingTiles, 0, "numLoadingTiles starts at 0");
+        t.ok( layer.events.listeners["tileloaded"] != null, "'tileloaded' event added to layer's event types");
+        t.ok( OpenLayers.Util.indexOf(layer.events.eventTypes, 'tileloaded') != -1 ,"'tileloaded' event added to layer's event types");
+
+        //regression testing for #1502
+        t.ok( layer.events.listeners['tileloaded'].length == 0, "no listeners for tileloaded preregister");        
+
+        var obj = {};
+        var func = function() {};
+        layer.events.register('tileloaded', obj, func);        
+
+        t.ok( layer.events.listeners['tileloaded'].length == 1, "one listener for tileloaded after register");        
+    }
+
+
+    function test_Layer_Grid_inittiles (t) {
+        t.plan( 2 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),5);
+        t.eq( layer.grid.length, 7, "Grid rows is correct." );
+        t.eq( layer.grid[0].length, 6, "Grid cols is correct." );
+        
+    }
+
+    function test_Layer_Grid_clearTiles (t) {
+        t.plan(3);
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0));
+
+        var numTiles = layer.grid.length * layer.grid[0].length;
+
+        //our count of how many times tile.destroy() is called
+        tilesDeleted = 0;
+        
+        //this will get set to false if we try to destroy a tile that has 
+        // not been unhookedv
+        allTilesUnhooked = true;
+        
+        OpenLayers.Tile.Image.prototype._destroy =
+            OpenLayers.Tile.Image.prototype.destroy;
+
+        OpenLayers.Tile.Image.prototype.destroy = function() {
+            if (!this.unhooked) {
+                allTilesUnhooked = false;
+            }
+            tilesDeleted++;
+        }
+
+        layer.removeTileMonitoringHooks = function(tile) {
+            tile.unhooked = true;            
+        }
+
+        layer.clearGrid();
+
+        t.ok( layer.grid != null, "layer.grid does not get nullified" );
+        t.eq(tilesDeleted, numTiles, "all tiles destroy()ed properly");
+        t.ok(allTilesUnhooked, "all tiles unhooked before being destroyed");
+
+        OpenLayers.Tile.Image.prototype.destroy =
+            OpenLayers.Tile.Image.prototype._destroy;
+        
+    }
+
+
+    function test_Layer_Grid_getTilesBounds(t) {
+        t.plan( 4 );
+
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+
+
+    //normal grid
+        var bl = { bounds: new OpenLayers.Bounds(1,2,0,0)};
+        var tr = { bounds: new OpenLayers.Bounds(0,0,3,4)};
+        layer.grid = [ [6, tr], 
+                       [bl, 7]];
+
+        var bounds = layer.getTilesBounds();
+        var testBounds = new OpenLayers.Bounds(1,2,3,4);
+        
+        t.ok( bounds.equals(testBounds), "getTilesBounds() returns correct bounds");
+        
+        var bounds = layer.getGridBounds();
+        
+        t.ok( bounds.equals(testBounds), "getGridBounds() wrapper works the same as getTilesBounds.");
+
+    //no tiles
+        layer.grid = [];
+        bounds = layer.getTilesBounds();
+        
+        t.ok(bounds == null, "getTilesBounds() on a tile-less grid returns null");
+        
+
+    //singleTile
+        var singleTile = { bounds: new OpenLayers.Bounds(1,2,3,4)};
+        layer.grid = [ [ singleTile ] ];
+        bounds = layer.getTilesBounds();
+        
+        t.ok( bounds.equals(testBounds), "getTilesBounds() returns correct bounds");
+        
+    }
+
+    function test_Layer_Grid_getResolution(t) {
+        t.plan( 1 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+
+        map.zoom = 5;
+
+        t.eq( layer.getResolution(), 0.0439453125, "getResolution() returns correct value");
+    }
+
+    function test_Layer_Grid_getZoomForExtent(t) {
+        t.plan( 2 );
+        var bounds, zoom;
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+
+        bounds = new OpenLayers.Bounds(10,10,12,12);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 8, "getZoomForExtent() returns correct value");
+
+        bounds = new OpenLayers.Bounds(10,10,100,100);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 2, "getZoomForExtent() returns correct value");
+    }   
+    
+    function test_Layer_Grid_moveTo(t) {
+
+    t.plan(13);
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        layer.destroy = function() {}; //we're going to do funky things with the grid
+        map.addLayer(layer);
+
+    //make sure null bounds doesnt cause script error. 
+    // no test necessary, just action
+        map.getExtent = function() { return null; }
+        layer.singleTile = false;
+        layer.moveTo(); //checks to make sure null bounds doesnt break us
+  
+
+
+      //observing globals
+        layer.initSingleTile = function(bounds) {
+            g_WhichFunc = "InitSingle";
+            g_Bounds = bounds;
+        };
+        layer.initGriddedTiles = function(bounds) {
+            g_WhichFunc = "InitGridded";
+            g_Bounds = bounds;
+        };
+        layer.moveGriddedTiles = function(bounds) {
+            g_WhichFunc = "MoveGridded";
+            g_Bounds = bounds;
+        };
+        var clearTestBounds = function() {
+            g_WhichFunc = null;
+            g_Bounds = null;
+        };
+
+      //default map extent (tested every time below)
+        b = new OpenLayers.Bounds(0,0,100,100);        
+        map.getExtent = function() {
+            return b;
+        };
+        var tilesBounds = null;
+        layer.getTilesBounds = function() {
+            return tilesBounds;
+        }
+
+
+//FORCE
+
+    //empty grid
+        layer.grid = [];
+       //grid
+        clearTestBounds();
+        layer.singleTile = false;
+        layer.moveTo()        
+        t.ok(g_Bounds.equals(b), "if grid is empty, initGridded called");
+        
+       //singletile
+        clearTestBounds();
+        layer.singleTile = true;
+        layer.moveTo()        
+        t.ok(g_Bounds.equals(b), "if grid is empty, initSingleTile called");
+
+    //zoomChanged
+        zoomChanged = true;
+        layer.grid = [ [ {} ] ];
+
+       //grid
+        clearTestBounds();
+        layer.singleTile = false;
+        layer.moveTo(null, zoomChanged);        
+        t.ok(g_Bounds.equals(b), "if layer has grid but zoomChanged is called, initGridded called");
+        
+       //singletile
+        clearTestBounds();
+        layer.singleTile = true;
+        layer.moveTo(null, zoomChanged);
+        t.ok(g_Bounds.equals(b), "if layer has grid but zoomChanged is called, initSingleTile called");
+
+
+        layer.getTilesBounds = function() {
+            return tilesBounds;
+        }
+        
+        
+
+//NO FORCE
+        zoomChanged = false;
+        layer.grid = [ [ {} ] ];
+ 
+   //single tile
+        layer.singleTile = true; 
+        
+      //DRAGGING   
+        var dragging = true;
+            
+        //in bounds
+        clearTestBounds();
+        tilesBounds = new OpenLayers.Bounds(-10,-10,110,110);
+        layer.moveTo(null, zoomChanged, dragging);
+        t.ok(g_Bounds == null, "if dragging and tile in bounds, no init()");
+        
+        //out bounds
+        clearTestBounds();
+        tilesBounds = new OpenLayers.Bounds(10,10,120,120);
+        layer.moveTo(null, zoomChanged, dragging);
+        t.ok(g_Bounds == null, "if dragging and tile out of bounds, no init()");
+
+      //NOT DRAGGING
+        dragging = false;
+
+        //in bounds
+        clearTestBounds();
+        tilesBounds = new OpenLayers.Bounds(-10,-10,110,110);
+        layer.moveTo(null, zoomChanged, dragging);
+        t.ok(g_Bounds == null, "if dragging and tile in bounds, no init()");
+        
+        //out bounds
+        clearTestBounds();
+        tilesBounds = new OpenLayers.Bounds(10,10,120,120);
+        layer.moveTo(null, zoomChanged, dragging);
+        t.ok(g_WhichFunc == "InitSingle", "if not dragging and tile out of bounds, we call initSingleTile()");
+        t.ok(g_Bounds.equals(b), "if not dragging and tile out of bounds, we call initSingleTile() with correct bounds");
+
+  
+   //gridded
+        layer.grid = [ [ {} ] ];
+        layer.singleTile = false;
+        
+        // drastic pan
+        clearTestBounds();
+        tilesBounds = new OpenLayers.Bounds(-150,-150,-120,-120);
+        layer.moveTo(null, zoomChanged);
+        t.ok(g_WhichFunc == "InitGridded", "if tiles drastically out of bounds, we call initGriddedTile()");
+        t.ok(g_Bounds.equals(b), "if tiles drastically out of bounds, we call initGriddedTile() with correct bounds");
+       
+        //regular move 
+        clearTestBounds();
+        tilesBounds = new OpenLayers.Bounds(10,10,120,120);
+        layer.moveTo(null, zoomChanged);
+        t.ok(g_WhichFunc == "MoveGridded", "if tiles not drastically out of bounds, we call moveGriddedTile()");
+        t.ok(g_Bounds.equals(b), "if tiles not drastically out of bounds, we call moveGriddedTile() with correct bounds");
+    }
+
+    /** THIS WOULD BE WHERE THE TESTS WOULD GO FOR 
+     *     
+     *    -insertColumn
+     *    -insertRow
+     * 
+
+    function 08_Layer_Grid_insertColumn(t) {
+    }
+
+    function 09_Layer_Grid_insertRow(t) {
+    }
+
+     * 
+     */
+
+    function test_Layer_Grid_clone(t) {
+        t.plan(5);
+        
+        var options = {tileSize: new OpenLayers.Size(500,50)};
+        var map = new OpenLayers.Map('map', options);
+        layer = new OpenLayers.Layer.Grid(name, url, params);
+        map.addLayer(layer);
+
+        layer.grid = [ [6, 7], 
+                       [8, 9]];
+
+        var clone = layer.clone();
+
+        t.ok( clone.grid != layer.grid, "clone does not copy grid");
+        t.ok( clone.grid.length == 0, "clone creates a new array instead");
+
+        t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
+
+        layer.tileSize.w += 40;
+
+        t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference");
+
+        t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
+
+        layer.grid = null;
+    }
+
+    function test_Layer_Grid_setTileSize(t) {
+        t.plan(1);
+
+        OpenLayers.Layer.HTTPRequest.prototype._setTileSize = 
+            OpenLayers.Layer.HTTPRequest.prototype.setTileSize;
+
+        OpenLayers.Layer.HTTPRequest.prototype.setTileSize = function(size) {
+            g_Size = size;
+        };
+
+
+        layer = new OpenLayers.Layer.Grid(name, url, params, {
+            singleTile: true
+        });
+        mapSize = new OpenLayers.Size(100,1000);
+        layer.map = {
+            getSize: function() { return mapSize; }
+        }
+        
+        g_Size = null;
+        layer.setTileSize();
+        
+        var idealSize = new OpenLayers.Size(150,1500);
+        t.ok( g_Size && g_Size.equals(idealSize), "correctly calculated tile size passed to superclass setTileSize() function");
+ 
+        OpenLayers.Layer.HTTPRequest.prototype.setTileSize = 
+            OpenLayers.Layer.HTTPRequest.prototype._setTileSize;
+    }
+    
+    function test_Layer_Grid_initSingleTile(t) {
+      t.plan( 11 );
+      
+        layer = new OpenLayers.Layer.Grid(name, url, params, {
+            singleTile: true,
+            ratio: 2
+        });
+        
+        var bounds = new OpenLayers.Bounds(-10,10,50,100);
+        
+        var desiredTileBounds = new OpenLayers.Bounds(-40,-35,80,145);
+        var desiredUL = new OpenLayers.LonLat(-40,145);
+        
+        translatedPX = {};
+        layer.map = {
+            getLayerPxFromLonLat: function(ul) {
+                t.ok(ul.equals(desiredUL), "correct ul passed to translation");
+                return translatedPX;        
+            }
+        }
+
+        var newTile = {
+            draw: function() {
+                t.ok(true, "newly created tile has been drawn");
+            }
+        };
+        layer.addTile = function(tileBounds, px) {
+            t.ok(tileBounds.equals(desiredTileBounds), "correct tile bounds passed to addTile to create new tile");
+            t.ok(px == translatedPX, "correct tile px passed to addTile to create new tile");
+            return newTile;
+        };
+        layer.addTileMonitoringHooks = function(tile) {
+            t.ok(tile == newTile, "adding monitoring hooks to the newly added tile");
+        };
+        layer.removeExcessTiles = function(x,y) {
+            t.ok(x == 1 && y == 1, "removeExcessTiles called")  
+        };
+
+
+        layer.grid = [];
+        layer.initSingleTile(bounds);       
+      
+        t.ok(layer.grid[0][0] == newTile, "grid's 0,0 is set to the newly created tile");        
+        
+        var tile = { 
+            moveTo: function(tileBounds, px) {
+                t.ok(tileBounds.equals(desiredTileBounds), "correct tile bounds passed to tile.moveTo()");
+                t.ok(px == translatedPX, "correct tile px passed to tile.moveTo()");
+            }
+        }; 
+        layer.grid = [[ tile ]];
+        layer.initSingleTile(bounds);       
+      
+    }  
+     
+    function test_Layer_Grid_addTileMonitoringHooks(t) {
+        t.plan(14);
+        
+        layer = new OpenLayers.Layer.Grid();
+        layer.events = {
+            'triggerEvent': function(str) {
+                g_events.push(str); 
+            }
+        }
+                
+        var tile = {
+            events: {
+                register: function(name, obj, func) {
+                    g_registered[name] = [obj, func];
+                }
+            }
+        }
+
+        g_registered = {};
+        g_events = [];
+        
+        layer.addTileMonitoringHooks(tile);
+        
+    //loadstart
+        t.ok(tile.onLoadStart != null, "onLoadStart function created and added to tile");
+        entry =  g_registered["loadstart"];
+        t.ok( entry && entry[0] == layer && entry[1] == tile.onLoadStart, "loadstart correctly registered");
+
+        layer.numLoadingTiles = 0; 
+        g_events = [];
+        tile.onLoadStart.apply(layer);
+
+        t.eq(g_events[0], "loadstart", "loadstart event triggered when numLoadingTiles is 0");
+        t.eq(layer.numLoadingTiles, 1, "numLoadingTiles incremented");
+
+        g_events = [];
+        tile.onLoadStart.apply(layer);
+        t.eq(g_events.length, 0, "loadstart event not triggered when numLoadingTiles is not 0");
+        t.eq(layer.numLoadingTiles, 2, "numLoadingTiles incremented");
+
+
+    //loadend
+        t.ok(tile.onLoadEnd != null, "onLoadEnd function created and added to tile");
+        entry = g_registered["loadend"];
+        t.ok( entry && entry[0] == layer && entry[1] == tile.onLoadEnd, "loadend correctly registered");
+        
+        layer.numLoadingTiles = 2; 
+        g_events = [];
+        tile.onLoadEnd.apply(layer);
+        t.eq(g_events[0], "tileloaded", "tileloaded triggered when numLoadingTiles is > 0");
+        t.eq(g_events.length, 1, "loadend event not triggered when numLoadingTiles is > 0");
+        t.eq(layer.numLoadingTiles, 1, "numLoadingTiles decremented");
+
+
+        g_events = [];
+        tile.onLoadEnd.apply(layer);
+        t.eq(g_events[0], "tileloaded", "tileloaded triggered when numLoadingTiles is 0");
+        t.eq(g_events[1], "loadend", "loadend event triggered when numLoadingTiles is 0");
+        t.eq(layer.numLoadingTiles, 0, "numLoadingTiles decremented");
+    }
+    
+    function test_Layer_Grid_removeTileMonitoringHooks(t) {
+        t.plan(2);
+        
+        layer = new OpenLayers.Layer.Grid();
+                
+        var tile = {
+            onLoadStart: {},
+            onLoadEnd: {},
+            unload: function() {},
+            events: {
+                unregister: function(name, obj, func) {
+                    g_unregistered[name] = [obj, func];
+                },
+                un: OpenLayers.Events.prototype.un
+            }
+        }
+
+        g_unregistered = {};
+        
+        layer.removeTileMonitoringHooks(tile);
+        
+        entry =  g_unregistered["loadstart"];
+        t.ok( entry && entry[0] == layer && entry[1] == tile.onLoadStart, "loadstart correctly unregistered");
+
+        entry =  g_unregistered["loadend"];
+        t.ok( entry && entry[0] == layer && entry[1] == tile.onLoadEnd, "loadend correctly unregistered");
+    }
+    
+    function test_Layer_Grid_tileSizeIsInteger(t) {
+            t.plan(1);
+            
+        var map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.Grid(name, url, params, {
+            singleTile: true,
+            ratio: 1.5
+        });
+        map.addLayers([layer]);
+        
+        width = layer.tileSize.w;
+        height = layer.tileSize.h;
+        t.ok(width == parseInt(width) && height == parseInt(height), "calculated tileSize width/height are integer values");
+    }
+    function test_Layer_Grid_getTileBounds(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map2");
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        
+        var newParams = { layers: 'sooper', 
+                          chickpeas: 'image/png'};
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        map.zoomIn();
+        var bounds = layer.getTileBounds(new OpenLayers.Pixel(200,200));
+        t.eq(bounds.toBBOX(), "-180,-90,0,90", "get tile bounds returns correct bounds"); 
+        map.pan(200,0, {animate:false});
+        var bounds = layer.getTileBounds(new OpenLayers.Pixel(200,200));
+        t.eq(bounds.toBBOX(), "0,-90,180,90", "get tile bounds returns correct bounds after pan"); 
+    }
+
+    function test_Layer_Grid_moveTo_buffer_calculation (t) {
+        t.plan(6);
+
+        var map = new OpenLayers.Map( 'map3' ); // odd map size
+        var layer0 = new OpenLayers.Layer.WMS( "0 buffer: OpenLayers WMS", 
+                    "http://labs.metacarta.com/wms/vmap0",
+                    {layers: 'basic'}, {'buffer':0} );
+        map.addLayer(layer0);
+
+        var layer1 = new OpenLayers.Layer.WMS( "1 buffer: OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0",
+                {layers: 'basic'}, {'buffer':1} );
+        map.addLayer(layer1);
+
+        var layer2 = new OpenLayers.Layer.WMS( "2 buffer: OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0",
+                {layers: 'basic'}, {'buffer':2} );
+        map.addLayer(layer2);
+
+        map.setCenter(new OpenLayers.LonLat(0, 0), 4); 
+        t.eq( layer0.grid.length, 3, "Grid rows with buffer:0" );
+        map.setBaseLayer(layer1);
+        t.eq( layer1.grid.length, 4, "Grid rows with buffer:1" );
+        map.setBaseLayer(layer2);
+        t.eq( layer2.grid.length, 6, "Grid rows with buffer:2" );
+
+        // zooming in on Greenland exercises the bug from pre-r4313
+        map.setCenter(new OpenLayers.LonLat(0, 90), 4); 
+        t.eq( layer0.grid.length, 3, "Grid rows with buffer:0" );
+        map.setBaseLayer(layer1);
+        t.eq( layer1.grid.length, 4, "Grid rows with buffer:1" );
+        map.setBaseLayer(layer2);
+        t.eq( layer2.grid.length, 6, "Grid rows with buffer:2" );
+    }
+
+    function test_Layer_Grid_destroy (t) {
+
+        t.plan( 7 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.Grid(name, url, params);
+        map.addLayer(layer);
+        layer.destroy();
+        t.eq( layer.grid, null, "layer.grid is null after destroy" );
+        t.eq( layer.tileSize, null, "layer.tileSize is null after destroy" );
+
+
+    //test with tile creation
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0), 10);
+
+         
+        //grab a reference to one of the tiles
+        var tile = layer.grid[1][1];        
+        t.eq( tile.imgDiv.className, "olTileImage", "Tile has an image" ); 
+
+        layer.destroy();
+        t.eq( tile.imgDiv, null, "Tile destroyed" ); 
+        
+        t.ok( layer.grid == null, "tiles appropriately destroyed")
+
+        // destroy after remove from map
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 10);
+        map.removeLayer(layer);
+        layer.destroy();
+        t.eq( layer.grid, null, "layer.grid is null after destroy" );
+        t.eq( layer.tileSize, null, "layer.tileSize is null after destroy" );
+    }
+    
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:499px;height:549px;display:none"></div>
+<div id="map2" style="width:500px;height:550px;display:none"></div>
+<div id="map3" style="width:594px;height:464px;display:none"></div>
+</body>
+</html>
diff --git a/tests/Layer/HTTPRequest.html b/tests/Layer/HTTPRequest.html
new file mode 100644
index 0000000..5c82f45
--- /dev/null
+++ b/tests/Layer/HTTPRequest.html
@@ -0,0 +1,226 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer; 
+
+    var name = "Test Layer";
+    var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+    var params = { map: '/mapdata/vmap_wms.map', 
+                   layers: 'basic', 
+                   format: 'image/png'};
+    var options = { chicken: 151, foo: "bar" };
+
+    function test_Layer_HTTPRequest_constructor (t) {
+        t.plan( 5 );
+
+        layer = new OpenLayers.Layer.HTTPRequest(name, url, params, options);
+        
+        t.ok( layer instanceof OpenLayers.Layer.HTTPRequest, "new OpenLayers.Layer.HTTPRequest returns correctly typed object" );
+
+        // correct bubbling up to Layer.initialize()
+        t.eq( layer.name, name, "layer.name is correct" );
+        t.ok( ((layer.options["chicken"] == 151) && (layer.options["foo"] == "bar")), "layer.options correctly set" );
+
+        // HTTPRequest-specific properties
+        t.eq( layer.url, url, "layer.name is correct" );
+        t.ok( ((layer.params["map"] == '/mapdata/vmap_wms.map') && 
+               (layer.params["layers"] == "basic") &&
+               (layer.params["format"] == "image/png")), "layer.params correctly set" );
+
+
+    }
+
+    function test_Layer_HTTPRequest_clone (t) {
+        t.plan( 6 );
+        
+        var toClone = new OpenLayers.Layer.HTTPRequest(name, url, params, options);
+        toClone.chocolate = 5;
+
+        var layer = toClone.clone();
+
+        t.eq(layer.chocolate, 5, "correctly copied randomly assigned property");
+
+        t.ok( layer instanceof OpenLayers.Layer.HTTPRequest, "new OpenLayers.Layer.HTTPRequest returns correctly typed object" );
+
+        // correct bubbling up to Layer.initialize()
+        t.eq( layer.name, name, "layer.name is correct" );
+        t.eq( layer.options, options, "layer.options correctly set" );
+
+        // HTTPRequest-specific properties
+        t.eq( layer.url, url, "layer.name is correct" );
+        t.ok( ((layer.params["map"] == '/mapdata/vmap_wms.map') && 
+               (layer.params["layers"] == "basic") &&
+               (layer.params["format"] == "image/png")), "layer.params correctly set" );
+
+    }
+
+    function test_Layer_HTTPRequest_setUrl (t) {
+        t.plan( 1 );
+
+        layer = new OpenLayers.Layer.HTTPRequest(name, url, params, options);
+        
+        layer.setUrl("foo");
+        t.eq( layer.url, "foo", "setUrl() works");
+    }
+
+    function test_Layer_HTTPRequest_mergeNewParams (t) {
+        t.plan( 8 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.HTTPRequest(name, url, params, options);
+        map.addLayer(layer);
+
+        var scope = {some: "scope"}, log = [];
+        map.events.on({
+            changelayer: function(e) {
+                log.push({layer: e.layer, property: e.property, scope: this});
+            },
+            scope: scope
+        });
+        
+        var newParams = { layers: 'sooper', 
+                          chickpeas: 'image/png'};
+
+        layer.mergeNewParams(newParams);
+        
+        t.eq( layer.params.layers, "sooper", "mergeNewParams() overwrites well");
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() adds well");
+        t.eq( log.length, 1, "mergeNewParams() triggers changelayer once");
+        t.ok( log[0].layer == layer, "mergeNewParams() passes changelayer listener the expected layer");
+        t.ok( log[0].property == "params", "mergeNewParams() passes changelayer listener the property \"params\"");
+        t.eq( log[0].scope, scope, "mergeNewParams() executes changelayer listener with expected scope");
+
+        newParams.chickpeas = 151;
+
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() makes clean copy of hash");
+        
+        layer.redraw = function() {
+            t.ok(true, "layer.mergeNewParams calls layer.redraw");
+        }
+        layer.mergeNewParams();
+    }
+
+    function test_Layer_HTTPRequest_getFullRequestString (t) {
+
+        tParams = { layers: 'basic', 
+                   format: 'image/png'};
+        
+        t.plan( 12 );
+
+  // without ?        
+        tUrl = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
+        str = layer.getFullRequestString();
+        t.eq(str, tUrl + '?' + OpenLayers.Util.getParameterString(tParams), "getFullRequestString() works for url sans ?");
+
+
+  // with ?        
+        tUrl = "http://octo.metacarta.com/cgi-bin/mapserv?";
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
+        str = layer.getFullRequestString();
+        t.eq(str, tUrl + OpenLayers.Util.getParameterString(tParams), "getFullRequestString() works for url with ?");
+
+  // with ?param1=5
+        tUrl = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5";
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
+        str = layer.getFullRequestString();
+        t.eq(str, tUrl + '&' + OpenLayers.Util.getParameterString(tParams), "getFullRequestString() works for url with ?param1=5");
+  
+  // with ?param1=5&
+        tUrl = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&format=image/jpeg";
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
+        str = layer.getFullRequestString();
+        t.eq(str, tUrl + '&' + OpenLayers.Util.getParameterString({'layers':'basic'}), "getFullRequestString() doesn't override already-existing params in URL");
+
+ 
+  // with ?param1=5&
+        tUrl = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&";
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
+        str = layer.getFullRequestString();
+        t.eq(str, tUrl + OpenLayers.Util.getParameterString(tParams), "getFullRequestString() works for url with ?param1=5&");
+  
+
+
+  // passing in new params
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
+        str = layer.getFullRequestString( { chicken: 6, 
+                                            layers:"road" } );
+        t.eq(str, tUrl + OpenLayers.Util.getParameterString({layers: 'road', format: "image/png", chicken: 6}), "getFullRequestString() works for passing in new params");
+
+  // layer with null params
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, null, null);
+        str = layer.getFullRequestString();
+        t.eq(str, tUrl + OpenLayers.Util.getParameterString({}), "getFullRequestString() works for layer with null params");
+
+  // layer with null params passing in new params
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, null, null);
+        str = layer.getFullRequestString( { chicken: 6, 
+                                            layers:"road" } );
+        t.eq(str, tUrl + OpenLayers.Util.getParameterString({chicken: 6, layers: "road"}), "getFullRequestString() works for layer with null params passing in new params");
+
+  // with specified altUrl parameter
+        tUrl = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.HTTPRequest(name, "chicken", tParams, null);
+        str = layer.getFullRequestString(null, tUrl);
+        t.eq(str, tUrl + '?' + OpenLayers.Util.getParameterString(tParams), "getFullRequestString() works with specified altUrl parameter");
+  
+  // single url object        
+        tUrl = ["http://octo.metacarta.com/cgi-bin/mapserv"];
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
+        str = layer.getFullRequestString();
+        t.eq(str, tUrl[0] + '?' + OpenLayers.Util.getParameterString(tParams), "getFullRequestString() works for list of one url");
+  
+  // two url object        
+        tUrl = ["http://octo.metacarta.com/cgi-bin/mapserv","http://labs.metacarta.com/cgi-bin/mapserv"];
+        layer = new OpenLayers.Layer.HTTPRequest(name, tUrl, tParams, null);
+        str = layer.getFullRequestString();
+        t.eq(str, tUrl[1] + '?' + OpenLayers.Util.getParameterString(tParams), "getFullRequestString() works for list of two urls");
+        str = layer.getFullRequestString({'a':'b'});
+        t.eq(str, tUrl[0] + '?' + OpenLayers.Util.getParameterString(OpenLayers.Util.extend(tParams,{'a':'b'})), "getFullRequestString() works for list of two urls and is deterministic");
+
+    }
+
+    function test_Layer_HTTPRequest_selectUrl (t) { 
+        t.plan( 4 ); 
+
+        layer = new OpenLayers.Layer.HTTPRequest(name, url, params, options); 
+
+        urls = ["wms1", "wms2", "wms3", "wms4"]; 
+        t.eq( layer.selectUrl("bbox=-180,0,0,90",  urls), "wms3", "selectUrl(-90,-180) returns 4" ); 
+        t.eq( layer.selectUrl("bbox=-180,-90,0,0", urls), "wms1", "selectUrl(90,-180) returns 3" ); 
+        t.eq( layer.selectUrl("bbox=0,90,180,0",   urls), "wms1", "selectUrl(-90,180) returns 1" ); 
+        t.eq( layer.selectUrl("bbox=0,0,180,90",   urls), "wms4", "selectUrl(90,180) returns 2" ); 
+    }
+
+    function test_Layer_HTTPRequest_destroy (t) {
+        t.plan( 6 );    
+
+        var map = new OpenLayers.Map('map');
+
+        layer = new OpenLayers.Layer.HTTPRequest("Test Layer",
+                                                 "http://www.openlayers.org", 
+                                                 { foo: 2, bar: 3}, 
+                                                 { opt1: 8, opt2: 9});
+
+        map.addLayer(layer);
+        layer.destroy();
+ 
+        // Ensure Layer.destroy() is called
+        t.eq( layer.name, null, "layer.name is null after destroy" );
+        t.eq( layer.div, null, "layer.div is null after destroy" );
+        t.eq( layer.map, null, "layer.map is null after destroy" );
+        t.eq( layer.options, null, "layer.options is null after destroy" );
+ 
+ 
+        // Specific to HTTPRequest 
+        t.eq( layer.url, null, "layer.url is null after destroy" );
+        t.eq( layer.params, null, "layer.params is null after destroy" );
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map"></div>
+</body>
+</html>
diff --git a/tests/Layer/Image.html b/tests/Layer/Image.html
new file mode 100644
index 0000000..a519859
--- /dev/null
+++ b/tests/Layer/Image.html
@@ -0,0 +1,164 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer; 
+
+    function test_Layer_Image_constructor (t) {
+        t.plan( 13 );
+        
+        var options = { chicken: 151, foo: "bar", projection: "EPSG:4326" };
+        var layer = new OpenLayers.Layer.Image('Test Layer',
+                                        'http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif',
+                                                                        new OpenLayers.Bounds(-180, -88.759, 180, 88.759),
+                                                                                                        new OpenLayers.Size(580, 288), options);
+        
+        t.ok( layer instanceof OpenLayers.Layer.Image, "new OpenLayers.Layer.Image returns object" );
+        t.eq( layer.CLASS_NAME, "OpenLayers.Layer.Image", "CLASS_NAME variable set correctly");
+
+        t.eq( layer.name, "Test Layer", "layer.name is correct" );
+        t.ok( layer.id != null, "Layer is given an id");
+        t.eq( layer.projection.getCode(), "EPSG:4326", "default layer projection correctly set");
+        t.ok( ((layer.chicken == 151) && (layer.foo == "bar")), "layer.options correctly set to Layer Object" );
+        t.ok( ((layer.options["chicken"] == 151) && (layer.options["foo"] == "bar")), "layer.options correctly backed up" );
+
+        options.chicken = 552;
+        
+        t.eq( layer.options["chicken"], 151 , "layer.options correctly made fresh copy" );
+        
+        t.eq( layer.isBaseLayer, true, "Default img layer is base layer" );
+
+        layer = new OpenLayers.Layer.Image('Test Layer',
+                                        'http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif',
+                                                                        new OpenLayers.Bounds(-180, -88.759, 180, 88.759),
+                                                                                                        new OpenLayers.Size(580, 288));
+        t.ok( layer instanceof OpenLayers.Layer.Image, "new OpenLayers.Layer.Image returns object" );
+        t.eq( layer.name, "Test Layer", "layer.name is correct" );
+        t.ok( layer.projection == null, "default layer projection correctly set");
+        t.ok( layer.options instanceof Object, "layer.options correctly initialized as a non-null Object" );
+    }
+    
+    function test_maxExtent(t) {
+        t.plan(2);
+        var layer;
+        
+        // test that the image extent is set as the default maxExtent
+        var extent = new OpenLayers.Bounds(1, 2, 3, 4);
+        var size = new OpenLayers.Size(2, 2);
+        layer = new OpenLayers.Layer.Image("Test", "foo", extent, size);
+        t.eq(layer.maxExtent.toString(), extent.toString(), "extent set as default maxExtent");
+        
+        // test that the maxExtent can be set explicitly
+        var maxExtent = new OpenLayers.Bounds(10, 20, 30, 40);
+        layer = new OpenLayers.Layer.Image("Test", "foo", extent, size, {maxExtent: maxExtent});
+        t.eq(layer.maxExtent.toString(), maxExtent.toString(), "maxExtent can be set explicitly");
+        
+    }
+
+    function test_Layer_Image_tileTests (t) {
+        t.plan(7);
+        var map = new OpenLayers.Map('map');
+        
+        layer = new OpenLayers.Layer.Image('Test Layer', 
+                                        'http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif',
+                                                                        new OpenLayers.Bounds(-180, -88.759, 180, 88.759),
+                                                                                                        new OpenLayers.Size(580, 288));
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+
+        // no resolution info was sent, so maxResolution should be calculated
+        // by aspectRatio*extent/size (this is the pixel aspect ratio)
+        var aspectRatio =  (layer.extent.getHeight() / layer.size.h) /
+                           (layer.extent.getWidth() / layer.size.w);
+        t.eq(aspectRatio, layer.aspectRatio, "aspectRatio is properly set");
+        var maxExtent = aspectRatio * layer.extent.getWidth() / layer.size.w;
+        t.eq(maxExtent, layer.maxResolution, "maxResolution is properly set");
+
+        t.eq(layer.tile.position.x,-42, "Tile x positioned correctly at maxextent");
+        t.eq(layer.tile.position.y,106, "Tile y positioned correctly at maxextent");
+        t.eq(layer.tile.imgDiv.src, "http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif", "URL is correct");
+        map.zoomIn();
+        t.eq(layer.tile.imgDiv.src, "http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif", "URL is correct");
+        layer.setUrl('http://labs.metacarta.com/wms/vmap0?LAYERS=basic&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&FORMAT=image%2Fjpeg&SRS=EPSG%3A4326&BBOX=-180,-90,0,90&WIDTH=256&HEIGHT=256');
+        t.eq(layer.tile.imgDiv.src, "http://labs.metacarta.com/wms/vmap0?LAYERS=basic&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&FORMAT=image%2Fjpeg&SRS=EPSG%3A4326&BBOX=-180,-90,0,90&WIDTH=256&HEIGHT=256", "URL is correct after setURL");
+    }
+/******
+ * 
+ * 
+ * HERE IS WHERE SOME TESTS SHOULD BE PUT TO CHECK ON THE LONLAT-PX TRANSLATION
+ * FUNCTIONS AND RESOLUTION AND GETEXTENT GETZOOMLEVEL, ETC
+ * 
+ * 
+ */
+
+
+    function test_Layer_Image_destroy_before_use (t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.Image('Test', 'http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif', new OpenLayers.Bounds(-180, -88.759, 180, 88.759), new OpenLayers.Size(580, 288));
+        map.addLayer(layer);
+        map.removeLayer(layer);
+        layer.destroy();
+        t.ok(true, "destroy() didn't throw an error");
+    }
+
+    function test_Layer_Image_destroy (t) {
+        t.plan( 4 );    
+
+        var map = new OpenLayers.Map('map');
+        
+        layer = new OpenLayers.Layer.Image('Test Layer', 
+                                        'http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif',
+                                                                        new OpenLayers.Bounds(-180, -88.759, 180, 88.759),
+                                                                                                        new OpenLayers.Size(580, 288));
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+    
+        layer.destroy();
+
+        t.eq( layer.name, null, "layer.name is null after destroy" );
+        t.eq( layer.div, null, "layer.div is null after destroy" );
+        t.eq( layer.map, null, "layer.map is null after destroy" );
+        t.eq( layer.options, null, "layer.options is null after destroy" );
+
+    }
+
+    function test_loadEvents(t) {
+        t.plan(3);
+
+        var map = new OpenLayers.Map('map');    
+        var layer = new OpenLayers.Layer.Image(
+            'Test', '../../img/blank.gif',
+            new OpenLayers.Bounds(-180, -88.759, 180, 88.759),
+            new OpenLayers.Size(580, 288)
+        );
+    
+        map.addLayer(layer);
+
+        layer.events.register('loadstart', null, function(obj) {
+            t.ok(obj.object.tile.isLoading, "loadstart triggered while tile is loading");
+        });
+
+        var delay = false;
+        layer.events.register('loadend', null, function(obj) {
+            delay = true;
+        });
+
+        t.delay_call(0.4,function() {
+            t.eq(delay, true, "registered for loadend");
+            t.eq(layer.tile.isLoading, false, "loadend triggered after tile is loaded");
+            map.destroy(); //tear down
+            return delay;
+        });
+        map.zoomToMaxExtent();
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width:500px;height:500px"></div>
+  <div id="map2" style="width:100px;height:100px"></div>
+</body>
+</html>
diff --git a/tests/Layer/KaMap.html b/tests/Layer/KaMap.html
new file mode 100644
index 0000000..11573b6
--- /dev/null
+++ b/tests/Layer/KaMap.html
@@ -0,0 +1,287 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer; 
+
+    var name = 'Test Layer';
+    var url = "http://boston.freemap.in/tile.php?";
+    var params = {
+                  'map':'boston-new', 
+                  'g':'border,water,roads,openspace', 
+                  'i':'JPEG'
+                 };
+    var units = "meters";
+
+
+
+    function test_Layer_KaMap_constructor (t) {
+        t.plan( 1 );
+                       
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+        t.ok( layer instanceof OpenLayers.Layer.KaMap, "returns OpenLayers.Layer.KaMap object" );
+    }
+
+    function test_Layer_Grid_moveTo_buffer_calculation (t) {
+        t.plan(6);
+
+        var map = new OpenLayers.Map( 'map3' ); // odd map size
+        var layer0 = new OpenLayers.Layer.KaMap( "0 buffer: OpenLayers WMS", 
+                    "http://labs.metacarta.com/wms/vmap0",
+                    {layers: 'basic'}, {'buffer':0} );
+        map.addLayer(layer0);
+
+        var layer1 = new OpenLayers.Layer.KaMap( "1 buffer: OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0",
+                {layers: 'basic'}, {'buffer':1} );
+        map.addLayer(layer1);
+
+        var layer2 = new OpenLayers.Layer.KaMap( "2 buffer: OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0",
+                {layers: 'basic'}, {'buffer':2} );
+        map.addLayer(layer2);
+
+        map.setCenter(new OpenLayers.LonLat(0, 0), 4); 
+        t.eq( layer0.grid.length, 3, "Grid rows with buffer:0" );
+        map.setBaseLayer(layer1);
+        t.eq( layer1.grid.length, 4, "Grid rows with buffer:1" );
+        map.setBaseLayer(layer2);
+        t.eq( layer2.grid.length, 6, "Grid rows with buffer:2" );
+
+        // zooming in on Greenland exercises the bug from pre-r4313
+        map.setCenter(new OpenLayers.LonLat(0, 90), 4); 
+        t.eq( layer0.grid.length, 3, "Grid rows with buffer:0" );
+        map.setBaseLayer(layer1);
+        t.eq( layer1.grid.length, 4, "Grid rows with buffer:1" );
+        map.setBaseLayer(layer2);
+        t.eq( layer2.grid.length, 6, "Grid rows with buffer:2" );
+        map.destroy();
+    }
+
+    function test_Layer_KaMap_inittiles (t) {
+        t.plan( 2 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),5);
+        t.eq( layer.grid.length, 8, "KaMap rows is correct." );
+        t.eq( layer.grid[0].length, 6, "KaMap cols is correct." );
+        map.destroy();
+        
+    }
+
+    function test_Layer_KaMap_clearTiles (t) {
+        t.plan( 1 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0));
+
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.clearGrid();
+
+        t.ok( layer.grid != null, "layer.grid does not get nullified" );
+        map.destroy();
+    }
+
+
+    function test_Layer_KaMap_getKaMapBounds(t) {
+        t.plan( 1 );
+
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+
+        var bl = { bounds: new OpenLayers.Bounds(1,2,0,0)};
+        var tr = { bounds: new OpenLayers.Bounds(0,0,3,4)};
+        layer.grid = [ [6, tr], 
+                       [bl, 7]];
+
+        var bounds = layer.getTilesBounds();
+    
+        var testBounds = new OpenLayers.Bounds(1,2,3,4);
+        
+        t.ok( bounds.equals(testBounds), "getKaMapBounds() returns correct bounds")
+        
+        layer.grid = null;
+    }
+
+    function test_Layer_KaMap_getResolution(t) {
+        t.plan( 1 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+        map.addLayer(layer);
+
+        map.zoom = 5;
+
+        t.eq( layer.getResolution(), 0.0439453125, "getResolution() returns correct value");
+        map.destroy();
+    }
+
+    function test_Layer_KaMap_getZoomForExtent(t) {
+        t.plan( 2 );
+        var bounds, zoom;
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+        map.addLayer(layer);
+
+        bounds = new OpenLayers.Bounds(10,10,12,12);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 8, "getZoomForExtent() returns correct value");
+
+        bounds = new OpenLayers.Bounds(10,10,100,100);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 2, "getZoomForExtent() returns correct value");
+        map.destroy();
+    }   
+    
+    function test_Layer_kaMap_mergeNewParams (t) {
+        t.plan( 4 );
+
+        var map = new OpenLayers.Map("map");
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.KaMap(name, url, params);
+        
+        var newParams = { layers: 'sooper', 
+                          chickpeas: 'image/png'};
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        layer.redraw = function() {
+            t.ok(true, "layer is redrawn after new params merged");
+        }
+        
+        layer.mergeNewParams(newParams);
+        
+        t.eq( layer.params.layers, "sooper", "mergeNewParams() overwrites well");
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() adds well");
+
+        newParams.chickpeas = 151;
+
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() makes clean copy of hashtable");
+        map.destroy();
+    }
+
+
+    /** THIS WOULD BE WHERE THE TESTS WOULD GO FOR 
+     *     
+     *    -moveTo
+     *    -insertColumn
+     *    -insertRow
+    
+    function 07_Layer_KaMap_moveTo(t) {
+    }
+
+    function 08_Layer_KaMap_insertColumn(t) {
+    }
+
+    function 09_Layer_KaMap_insertRow(t) {
+    }
+
+     * 
+     */
+
+    function test_Layer_KaMap_clone(t) {
+        t.plan(5);
+        
+        var options = {tileSize: new OpenLayers.Size(500,50)};
+        var map = new OpenLayers.Map('map', options);
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+        map.addLayer(layer);
+
+        layer.grid = [ [6, 7], 
+                       [8, 9]];
+
+        var clone = layer.clone();
+
+        t.ok( clone.grid != layer.grid, "clone does not copy grid");
+
+        t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
+
+        layer.tileSize.w += 40;
+
+        t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference");
+
+        t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
+        
+        t.eq( clone.CLASS_NAME, "OpenLayers.Layer.KaMap", "Clone is a ka-map layer");
+
+        layer.grid = null;
+        map.destroy();
+    }
+
+    function test_Layer_KaMap_setMap(t) {
+
+        t.plan(2);
+        
+        var options = {tileSize: new OpenLayers.Size(500,50)};
+        var map = new OpenLayers.Map('map', options);
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+
+
+        layer.setMap(map);
+        
+        t.ok( layer.tileSize != null, "tileSize has been set");
+        t.ok( (layer.tileSize.h == 50) && (layer.tileSize.w == 500), "tileSize has been set correctly");
+        map.destroy();
+    }
+    function test_Layer_KaMap_getTileBounds(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.KaMap(name, url, params);
+        
+        var newParams = { layers: 'sooper', 
+                          chickpeas: 'image/png'};
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        map.zoomIn();
+        var bounds = layer.getTileBounds(new OpenLayers.Pixel(200,200));
+        t.eq(bounds.toBBOX(), "-180,0,0,180", "get tile bounds returns correct bounds"); 
+        map.pan(200,0,{animate:false});
+        var bounds = layer.getTileBounds(new OpenLayers.Pixel(200,200));
+        t.eq(bounds.toBBOX(), "0,0,180,180", "get tile bounds returns correct bounds after pan"); 
+        map.destroy();
+    }
+
+    function test_Layer_KaMap_destroy (t) {
+
+        t.plan( 3 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+        map.addLayer(layer);
+        layer.destroy();
+        t.eq( layer.grid, null, "layer.grid is null after destroy" );
+        t.eq( layer.tileSize, null, "layer.tileSize is null after destroy" );
+
+
+    //test with tile creation
+        layer = new OpenLayers.Layer.KaMap(name, url, params, units);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.destroy();
+
+        t.ok( layer.grid == null, "tiles appropriately destroyed");
+        map.destroy();
+    }
+    
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px;display:none"></div>
+<div id="map2" style="width:500px;height:550px;display:none"></div>
+<div id="map3" style="width:594px;height:464px;display:none"></div>
+</body>
+</html>
diff --git a/tests/Layer/MapGuide.html b/tests/Layer/MapGuide.html
new file mode 100644
index 0000000..43ebaa2
--- /dev/null
+++ b/tests/Layer/MapGuide.html
@@ -0,0 +1,177 @@
+<html>
+<head>
+    <script type="text/javascript">var oldAlert = window.alert, gMess; window.alert = function(message) {gMess = message; return true;};</script>
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script type="text/javascript">window.alert = oldAlert;</script>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer; 
+
+    var name = 'MapGuide Test Layer';
+    var url = "http://data.mapguide.com/mapguide/mapagent/mapagent.fcgi?USERNAME=Anonymous&";
+    var paramsTiled = {
+      mapdefinition: 'Library://Samples/Sheboygan/MapsTiled/Sheboygan.MapDefinition',
+      basemaplayergroupname: "Base Layer Group"
+    }
+    var paramsUntiled = {
+      mapdefinition: 'Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition'
+    };
+
+    function test_Layer_MapGuide_untiled_constructor (t) {
+        t.plan( 8 );
+
+        var trans_format = "image/png";
+        var options = {singleTile:true};
+        if (OpenLayers.Util.alphaHack()) { trans_format = "image/gif"; } 
+        
+        layer = new OpenLayers.Layer.MapGuide(name, url, paramsUntiled, options);
+        t.ok( layer instanceof OpenLayers.Layer.MapGuide, "new OpenLayers.Layer.MapGuide returns object" );
+        t.eq( layer.url, "http://data.mapguide.com/mapguide/mapagent/mapagent.fcgi?USERNAME=Anonymous&", "layer.url is correct (HTTPRequest inited)" );
+        t.eq( layer.params.mapdefinition, "Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition", "params passed in correctly" );
+
+        t.eq( layer.params.operation, "GETMAPIMAGE", "default params set correctly and copied");
+
+        t.eq(layer.isBaseLayer, true, "no transparency setting, layer is baselayer");
+
+        options.transparent = "true";
+        var layer2 = new OpenLayers.Layer.MapGuide(name, url, paramsUntiled, options);
+        t.eq(layer2.isBaseLayer, false, "transparency == 'true', layer is not baselayer");
+
+        options.transparent = true;
+        var layer5 = new OpenLayers.Layer.MapGuide(name, url, paramsUntiled, options);
+        t.eq(layer5.isBaseLayer, false, "transparency == true, layer is not baselayer");
+
+        options.transparent = false;
+        var layer6 = new OpenLayers.Layer.MapGuide(name, url, paramsUntiled, options);
+        t.eq(layer6.isBaseLayer, true, "transparency == false, layer is baselayer");
+    }
+    
+    function test_Layer_MapGuide_tiled_constructor (t) {
+        t.plan( 5 );
+
+        var trans_format = "image/png";
+        var options = {singleTile:false};
+        if (OpenLayers.Util.alphaHack()) { trans_format = "image/gif"; } 
+        
+        layer = new OpenLayers.Layer.MapGuide(name, url, paramsTiled, options);
+        t.ok( layer instanceof OpenLayers.Layer.MapGuide, "new OpenLayers.Layer.MapGuide returns object" );
+        t.eq( layer.url, "http://data.mapguide.com/mapguide/mapagent/mapagent.fcgi?USERNAME=Anonymous&", "layer.url is correct (HTTPRequest inited)" );
+        t.eq( layer.params.basemaplayergroupname, "Base Layer Group", "params passed in correctly" );
+
+        t.eq( layer.params.operation, "GETTILEIMAGE", "default params correctly uppercased and copied");
+        t.eq( layer.params.version, "1.2.0", "version params set correctly set");
+    }
+    
+    function test_Layer_MapGuide_inittiles (t) {
+        t.plan( 1 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.MapGuide(name, url, paramsTiled);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,400000),5);
+        t.eq( layer.grid.length, 6, "Grid rows is correct." );
+        // t.eq( layer.grid[0].length, 6, "Grid cols is correct." );
+        map.destroy();
+    }
+
+
+    function test_Layer_MapGuide_clone (t) {
+        t.plan(4);
+        
+        var options = {tileSize: new OpenLayers.Size(500,50)};
+        var map = new OpenLayers.Map('map', options);
+        layer = new OpenLayers.Layer.MapGuide(name, url, paramsTiled);
+        map.addLayer(layer);
+
+        layer.grid = [ [6, 7], 
+                       [8, 9]];
+
+        var clone = layer.clone();
+
+        t.eq( layer.tileSize.w, 300, "layer.tileSize fixed to 300x300");
+        t.ok( clone.grid != layer.grid, "clone does not copy grid");
+
+        t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
+
+        layer.tileSize.w += 40;
+
+        t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
+
+        layer.grid = null;
+        map.destroy();
+    }
+
+    function test_Layer_MapGuide_isBaseLayer(t) {
+        t.plan(3);
+        
+        var options = {singleTile:true};
+        layer = new OpenLayers.Layer.MapGuide(name, url, paramsUntiled, options);
+        t.ok( layer.isBaseLayer, "baselayer is true by default");
+
+        var newParams = OpenLayers.Util.extend({}, paramsUntiled);
+        options.transparent = "true";
+        layer = new OpenLayers.Layer.MapGuide(name, url, newParams, options);
+        t.ok( !layer.isBaseLayer, "baselayer is false when transparent is set to true");
+
+        newParams = OpenLayers.Util.extend({}, paramsUntiled);
+        options.isBaseLayer = false;
+        layer = new OpenLayers.Layer.MapGuide(name, url, newParams, options);
+        t.ok( !layer.isBaseLayer, "baselayer is false when option is set to false" );
+    }
+
+    function test_Layer_MapGuide_mergeNewParams (t) {
+        t.plan( 4 );
+
+        var options = {singleTile:true};
+        var map = new OpenLayers.Map("map");
+        layer = new OpenLayers.Layer.MapGuide(name, url, paramsUntiled, options);
+        
+        var newParams = { mapDefinition: 'Library://Samples/Gmap/Maps/gmap.MapDefinition',
+                          chickpeas: 'image/png'};
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+
+        layer.redraw = function() {
+            t.ok(true, "layer is redrawn after new params merged");
+        }
+
+        layer.mergeNewParams(newParams);
+        
+        t.eq( layer.params.mapDefinition, "Library://Samples/Gmap/Maps/gmap.MapDefinition", "mergeNewParams() overwrites well");
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() adds well");
+    
+        newParams.chickpeas = 151;
+
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() makes clean copy of hashtable");
+        map.destroy();
+    }
+
+    function test_Layer_MapGuide_destroy (t) {
+
+        t.plan( 1 );
+
+        var options = {singleTile:true};
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.MapGuide(name, url, paramsUntiled, options);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.destroy();
+        
+    // checks to make sure superclass (grid) destroy() was called    
+        
+        t.ok( layer.grid == null, "grid set to null");
+    }
+    
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/MapServer.html b/tests/Layer/MapServer.html
new file mode 100644
index 0000000..25eb1e8
--- /dev/null
+++ b/tests/Layer/MapServer.html
@@ -0,0 +1,472 @@
+<html>
+<head>
+    <script type="text/javascript">var oldAlert = window.alert, gMess; window.alert = function(message) {gMess = message; return true;};</script>
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script type="text/javascript">window.alert = oldAlert;</script>
+    
+
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer; 
+
+    var name = 'Test Layer';
+    var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+    var params = { map: '/mapdata/vmap_wms.map', 
+                   layers: 'basic'};
+
+    function test_Layer_MapServer_constructor (t) {
+        t.plan( 4 );
+
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.MapServer(name, url, params);
+        t.ok( layer instanceof OpenLayers.Layer.MapServer, "new OpenLayers.Layer.MapServer returns object" );
+        t.eq( layer.url, "http://labs.metacarta.com/cgi-bin/mapserv", "layer.url is correct (HTTPRequest inited)" );
+
+        t.eq( layer.params.mode, "map", "default mode param correctly copied");
+        t.eq( layer.params.map_imagetype, "png", "default imagetype correctly copied");
+
+
+    }
+    
+    function test_Layer_MapServer_addtile (t) {
+        t.plan( 6 );
+    
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.MapServer(name, url, params);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        var pixel = new OpenLayers.Pixel(5,6);
+        var tile = layer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
+        tile.draw();
+
+        var img = tile.imgDiv;
+        var tParams = OpenLayers.Util.extend({},params);
+        tParams = OpenLayers.Util.extend(tParams, {
+                 layers: 'basic', 
+                 mode: 'map',
+                 map_imagetype: 'png',
+                 mapext:[1,2,3,4],
+                 imgext:[1,2,3,4],
+                 map_size:[256, 256],
+                 imgx:128,
+                 imgy:128,
+                 imgxy:[256,256]
+        });
+        t.eq( img.src,
+             url + "?" + OpenLayers.Util.getParameterString(tParams).replace(/,/g, "+"),
+             "image src is created correctly via addtile" );
+        t.eq( tile.frame.style.top, "6px", "image top is set correctly via addtile" );
+        t.eq( tile.frame.style.left, "5px", "image top is set correctly via addtile" );
+
+        var firstChild = layer.div.firstChild.firstChild;
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( firstChild instanceof HTMLElement, "div first child is an image object" );
+        t.eq( firstChild.src,
+             url + "?" + OpenLayers.Util.getParameterString(tParams).replace(/,/g, "+"),
+             "div first child is correct image object" );
+        t.eq( tile.position.toString(), "x=5,y=6", "Position of tile is set correctly." );
+        map.destroy();
+    }
+    
+    function test_Layer_MapServer_inittiles (t) {
+        t.plan( 2 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.MapServer(name, url, params);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),5);
+        t.eq( layer.grid.length, 7, "Grid rows is correct." );
+        t.eq( layer.grid[0].length, 6, "Grid cols is correct." );
+        map.destroy();
+        
+    }
+
+
+    function test_Layer_MapServer_clone (t) {
+        t.plan(4);
+        
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        var options = {tileSize: new OpenLayers.Size(500,50)};
+        var map = new OpenLayers.Map('map', options);
+        layer = new OpenLayers.Layer.MapServer(name, url, params);
+        map.addLayer(layer);
+
+        layer.grid = [ [6, 7], 
+                       [8, 9]];
+
+        var clone = layer.clone();
+
+        t.ok( clone.grid != layer.grid, "clone does not copy grid");
+
+        t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
+
+        layer.tileSize.w += 40;
+
+        t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference");
+
+        t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
+
+        layer.grid = null;
+        map.destroy();
+    }
+
+    function test_Layer_MapServer_isBaseLayer(t) {
+        t.plan(3);
+        
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.MapServer(name, url, params);
+        t.ok( layer.isBaseLayer, "baselayer is true by default");
+
+        var newParams = OpenLayers.Util.extend({}, params);
+        newParams.transparent = "true";
+        layer = new OpenLayers.Layer.MapServer(name, url, newParams);
+        t.ok( !layer.isBaseLayer, "baselayer is false when transparent is set to true");
+
+        layer = new OpenLayers.Layer.MapServer(name, url, params, {isBaseLayer: false});
+        t.ok( !layer.isBaseLayer, "baselayer is false when option is set to false" );
+    }
+
+    function test_Layer_MapServer_mergeNewParams (t) {
+        t.plan( 4 );
+
+        var map = new OpenLayers.Map("map");
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.MapServer(name, url, params);
+        
+        var newParams = { layers: 'sooper', 
+                          chickpeas: 'image/png'};
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        layer.redraw = function() {
+            t.ok(true, "layer is redrawn after new params merged");
+        }
+        layer.mergeNewParams(newParams);
+        
+        t.eq( layer.params.layers, "sooper", "mergeNewParams() overwrites well");
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() adds well");
+        
+        newParams.chickpeas = 151;
+
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() makes clean copy of hashtable");
+        map.destroy();
+    }
+
+    function test_Layer_MapServer_getFullRequestString (t) {
+        t.plan( 3 );
+        var map = new OpenLayers.Map('map');
+        tUrl = "http://labs.metacarta.com/cgi-bin/mapserv";
+        tParams = { layers: 'basic', 
+                    format: 'png'};
+        var tLayer = new OpenLayers.Layer.MapServer(name, tUrl, tParams);
+        map.addLayer(tLayer);
+        str = tLayer.getFullRequestString();
+        var tParams = {
+                 layers: 'basic', 
+                 format: 'png',
+                 mode: 'map',
+                 map_imagetype: 'png'
+        };
+
+            var sStr = tUrl + "?" + OpenLayers.Util.getParameterString(tParams);
+            sStr = sStr.replace(/,/g, "+");
+        
+        t.eq(str, sStr , "getFullRequestString() works");
+        map.destroy();
+        
+        tUrl = ["http://octo.metacarta.com/cgi-bin/mapserv","http://labs.metacarta.com/cgi-bin/mapserv"];
+        layer = new OpenLayers.Layer.MapServer(name, tUrl, tParams, null);
+        str = layer.getFullRequestString({'c':'d'});
+        t.eq(str, tUrl[1] + '?' + OpenLayers.Util.getParameterString(OpenLayers.Util.extend(tParams,{'c':'d'})), "getFullRequestString() works for list of two urls and is deterministic");
+        layer.destroy();
+        var tParams = {
+                 layers: 'basic', 
+                 format: 'png',
+                 mode: 'map',
+                 map_imagetype: 'png'
+        };
+        tUrl = ["http://octo.metacarta.com/cgi-bin/mapserv","http://labs.metacarta.com/cgi-bin/mapserv"];
+        layer = new OpenLayers.Layer.MapServer(name, tUrl, tParams, null);
+        str = layer.getFullRequestString({'a':'b'});
+        t.eq(str, tUrl[0] + '?' + OpenLayers.Util.getParameterString(OpenLayers.Util.extend(tParams,{'a':'b'})), "getFullRequestString() works for list of two urls and is deterministic");
+        layer.destroy();
+
+    }
+
+    function test_Layer_MapServer_setOpacity (t) {
+        t.plan( 5 );
+
+        var map = new OpenLayers.Map('map');
+        map.projection = "xx";
+        tUrl = "http://labs.metacarta.com/cgi-bin/mapserv";
+        tParams = { layers: 'basic', 
+                   format: 'image/png'};
+        tOptions = { 'opacity': '0.5' };           
+        var tLayer = new OpenLayers.Layer.MapServer(name, tUrl, tParams, tOptions);
+        map.addLayer(tLayer);
+        map.zoomToMaxExtent();
+        t.eq(tLayer.opacity, "0.5", "Opacity is set correctly");
+        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.5, "Opacity on tile is correct");
+        tLayer.setOpacity("0.6");
+        t.eq(tLayer.opacity, "0.6", "setOpacity works properly");
+        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.6, "Opacity on tile is changed correctly");
+        var pixel = new OpenLayers.Pixel(5,6);
+        var tile = tLayer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
+        tile.draw();
+        t.eq(parseFloat(tile.imgDiv.style.opacity), 0.6, "Tile opacity is set correctly");
+        map.destroy();
+
+    }    
+    
+    function test_Layer_MapServer_Reproject (t) { 
+        var validkey = (window.location.protocol == "file:") ||
+                       (window.location.host == "localhost") ||
+                       (window.location.host == "openlayers.org");
+        
+        if (OpenLayers.Util.getBrowserName() == "opera" || OpenLayers.Util.getBrowserName() == "safari") {
+            t.plan(1);
+            t.debug_print("Can't test google reprojection in Opera or Safari.");
+        } else if(validkey) {
+            t.plan(5);
+            var map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.Google("Google");
+            map.addLayer(layer);
+            layer = new OpenLayers.Layer.MapServer(name, url, params, {isBaseLayer: false, reproject: true});
+            layer.isBaseLayer=false;
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(0,0), 5);
+            var tile = layer.grid[0][0];
+            t.eq( tile.bounds.left, -22.5, "left side matches" ); 
+            t.eq( tile.bounds.right, -11.25, "top side matches" ); 
+            t.eq( tile.bounds.bottom.toFixed(6), '11.178402', "bottom side matches" ); 
+            t.eq( tile.bounds.top.toFixed(6), '21.943046', "top side matches" );
+            map.destroy();
+        } else {
+            t.plan(1);
+            t.debug_print("can't test google layer from " +
+                          window.location.host);
+        }
+        
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.MapServer(name, url, params);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        var tile = layer.grid[0][0];
+        t.ok( tile.bounds.equals(new OpenLayers.Bounds(-33.75, 33.75, -22.5, 45)), "okay");
+        map.destroy();
+    }
+    
+    function test_Layer_MapServer_singleTile (t) {
+        t.plan( 5 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.MapServer(name, url, params, {singleTile: true});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),5);
+        t.eq( layer.singleTile, true, "layer has singleTile property, great!" );
+        t.eq( layer.grid.length, 1, "Grid has only a single row, good enough!" );
+        t.eq( layer.grid[0].length, 1, "Grid has only a single column, good enough!" );
+        t.eq( layer.tileSize.w, 750, "Image width is correct" );
+        t.eq( layer.tileSize.h, 825, "Image height is correct" );
+        map.destroy();
+    }
+
+    
+    
+    function test_Layer_MapServer_destroy (t) {
+
+        t.plan( 1 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.MapServer(name, url, params);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.destroy();
+        
+    // checks to make sure superclass (grid) destroy() was called    
+        
+        t.ok( layer.grid == null, "grid set to null");
+        map.destroy();
+    }
+   
+    // Untiled tests 
+   
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer; 
+
+    var name = 'Test Layer';
+    var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+    var params = { map: '/mapdata/vmap_wms.map', 
+                   layers: 'basic'};
+    
+    function test_Layer_MapServer_Untiled_constructor (t) {
+        t.plan( 4 );
+
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.MapServer.Untiled(name, url, params);
+        t.ok( layer instanceof OpenLayers.Layer.MapServer.Untiled, "new OpenLayers.Layer.MapServer returns object" );
+        t.eq( layer.url, "http://labs.metacarta.com/cgi-bin/mapserv", "layer.url is correct (HTTPRequest inited)" );
+
+        t.eq( layer.params.mode, "map", "default mode param correctly copied");
+        t.eq( layer.params.map_imagetype, "png", "default imagetype correctly copied");
+
+
+    }
+    
+    function test_Layer_MapServer_Untiled_clone (t) {
+        t.plan(3);
+        
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        var map = new OpenLayers.Map('map', {});
+        layer = new OpenLayers.Layer.MapServer.Untiled(name, url, params);
+        map.addLayer(layer);
+
+        var clone = layer.clone();
+        layer.tile = [[1,2],[3,4]];
+        
+        t.ok( clone.tile != layer.tile, "clone does not copy tile");
+
+        layer.ratio += 1;
+
+        t.eq( clone.ratio, 1.5, "changing layer.ratio does not change clone.ratio -- a fresh copy was made, not just copied reference");
+
+        t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
+
+        layer.tile = null;
+        map.destroy();
+    }
+
+    function test_Layer_MapServer_Untiled_isBaseLayer(t) {
+        t.plan(3);
+        
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.MapServer.Untiled(name, url, params);
+        t.ok( layer.isBaseLayer, "baselayer is true by default");
+
+        var newParams = OpenLayers.Util.extend({}, params);
+        newParams.transparent = "true";
+        layer = new OpenLayers.Layer.MapServer.Untiled(name, url, newParams);
+        t.ok( !layer.isBaseLayer, "baselayer is false when transparent is set to true");
+
+        layer = new OpenLayers.Layer.MapServer.Untiled(name, url, params, {isBaseLayer: false});
+        t.ok( !layer.isBaseLayer, "baselayer is false when option is set to false" );
+    }
+
+    function test_Layer_MapServer_Untiled_mergeNewParams (t) {
+        t.plan( 5 );
+
+        var map = new OpenLayers.Map("map");
+        var url = "http://labs.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.MapServer.Untiled(name, url, params);
+        
+        var newParams = { layers: 'sooper', 
+                          chickpeas: 'image/png'};
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        t.ok( !layer.grid[0][0].url.match("chickpeas"), "chickpeas is not in URL of first tile in grid" );
+
+        layer.mergeNewParams(newParams);
+        
+        t.eq( layer.params.layers, "sooper", "mergeNewParams() overwrites well");
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() adds well");
+        t.ok( layer.grid[0][0].url.match("chickpeas"), "chickpeas is in URL of first tile in grid" );
+
+        newParams.chickpeas = 151;
+
+        t.eq( layer.params.chickpeas, "image/png", "mergeNewParams() makes clean copy of hashtable");
+        map.destroy();
+    }
+
+    function test_Layer_MapServer_Untiled_getFullRequestString (t) {
+
+        
+        t.plan( 1 );
+        var map = new OpenLayers.Map('map');
+        tUrl = "http://labs.metacarta.com/cgi-bin/mapserv";
+        tParams = { layers: 'basic', 
+                    format: 'png'};
+        var tLayer = new OpenLayers.Layer.MapServer.Untiled(name, tUrl, tParams);
+        map.addLayer(tLayer);
+        str = tLayer.getFullRequestString();
+        var tParams = {
+             layers: 'basic', 
+             format: 'png',
+             mode: 'map',
+             map_imagetype: 'png'
+        };
+
+        var sStr = tUrl + "?" + OpenLayers.Util.getParameterString(tParams);
+        sStr = sStr.replace(/,/g, "+");
+        
+        t.eq(str, sStr , "getFullRequestString() works");
+        map.destroy();
+
+    }
+
+    function test_Layer_MapServer_Untiled_setOpacity (t) {
+        t.plan( 4 );
+
+        var map = new OpenLayers.Map('map');
+        map.projection = "xx";
+        tUrl = "http://labs.metacarta.com/cgi-bin/mapserv";
+        tParams = { layers: 'basic', 
+                   format: 'image/png'};
+        tOptions = { 'opacity': '0.5' };           
+        var tLayer = new OpenLayers.Layer.MapServer.Untiled(name, tUrl, tParams, tOptions);
+        map.addLayer(tLayer);
+        map.zoomToMaxExtent();
+        t.eq(tLayer.opacity, "0.5", "Opacity is set correctly");
+        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.5, "Opacity on tile is correct");
+        tLayer.setOpacity("0.6");
+        t.eq(tLayer.opacity, "0.6", "setOpacity works properly");
+        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.6, "Opacity on tile is changed correctly");
+        map.destroy();
+
+    }    
+
+    // DEPRECATED -- REMOVE IN 3.0
+    function test_Layer_Untiled_MapServer(t) { 
+        t.plan(1);
+        
+        var layer = new OpenLayers.Layer.MapServer.Untiled();
+        
+        var clone = layer.clone();
+        
+        t.ok(clone.singleTile, "regression test: clone works. this is for #1013");
+    }
+    
+    function test_Layer_MapServer_Untiled_destroy (t) {
+
+        t.plan( 1 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.MapServer.Untiled(name, url, params);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+
+        //grab a reference to one of the tiles
+        var tile = layer.tile;        
+
+        layer.destroy();
+        
+    // checks to make sure superclass (grid) destroy() was called    
+        
+        t.ok( layer.tile == null, "tile set to null");
+        map.destroy();
+    }
+    
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/Markers.html b/tests/Layer/Markers.html
new file mode 100644
index 0000000..6e994f5
--- /dev/null
+++ b/tests/Layer/Markers.html
@@ -0,0 +1,156 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer; 
+
+    function test_initialize(t) {
+        t.plan( 2 );
+        
+        layer = new OpenLayers.Layer.Markers('Test Layer');
+        t.ok( layer instanceof OpenLayers.Layer.Markers, "new OpenLayers.Layer.Markers returns object" );
+        t.eq( layer.name, "Test Layer", "layer.name is correct" );
+    }
+    function test_addlayer (t) {
+        t.plan( 3 );
+        
+        layer = new OpenLayers.Layer.Markers('Test Layer');
+        t.ok( layer instanceof OpenLayers.Layer.Markers, "new OpenLayers.Layer.Markers returns object" );
+        t.eq( layer.name, "Test Layer", "layer.name is correct" );
+        layer.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0), 
+                                              new OpenLayers.Icon())
+                       );
+        t.eq( layer.markers.length, 1, "addLayer adds marker to layer." );
+    }
+    function test_addMarker_removeMarker (t) {
+        t.plan( 6 );
+
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.zoomToMaxExtent();
+        layer = new OpenLayers.Layer.Markers('Test Layer');
+        map.addLayer(layer);
+        var marker = new OpenLayers.Marker(new OpenLayers.LonLat(5,40));
+        layer.addMarker(marker);
+        t.ok(  marker.icon.imageDiv.parentNode == layer.div, "addMarker adds marker image node into layer node." ); 
+        layer.removeMarker(marker);
+        t.ok(  marker.icon.imageDiv.parentNode != layer.div, "removeMarker removes marker image node from layer node." ); 
+        layer.removeMarker(marker);
+        t.ok(true, "Removing marker twice does not fail.");
+        layer.addMarker(marker);
+        t.ok(  marker.icon.imageDiv.parentNode == layer.div, "addMarker adds marker image node into layer node." ); 
+
+        layer.markers = null;
+        layer.removeMarker(marker);
+        t.ok(true, "removing marker when no markers present does not script error");
+
+        var l = new OpenLayers.Layer.Markers();
+        var marker = new OpenLayers.Marker(new OpenLayers.LonLat(5,40));
+        l.addMarker(marker);
+        l.removeMarker(marker);
+        t.ok(true, "Removing marker when layer not added to map does not fail.");
+
+    }
+    
+    function test_markerMovement(t) {
+        
+        t.plan(6);
+        
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Markers("Base", {isBaseLayer: true});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0, 0), 1);
+        
+        var size = new OpenLayers.Size(10, 10);
+        var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
+        var icon = new OpenLayers.Icon("foo", size, offset);
+        var marker = new OpenLayers.Marker(new OpenLayers.LonLat(10, -10), icon)
+        layer.addMarker(marker);
+        
+        t.eq(marker.icon.px.x, 554, "marker icon is placed at 554 px on x-axis");
+        t.eq(marker.icon.px.y, 314, "marker icon is placed at 314 px on y-axis");
+        
+        map.zoomTo(2);
+        
+        t.eq(marker.icon.px.x, 568, "marker icon moved to 568 px on x-axis");
+        t.eq(marker.icon.px.y, 328, "marker icon moved to 328 px on y-axis");
+        
+        map.zoomTo(1);
+
+        t.eq(marker.icon.px.x, 554, "marker icon moved back to 554 px on x-axis");
+        t.eq(marker.icon.px.y, 314, "marker icon moved back to 314 px on y-axis");
+        
+    }
+    
+    function test_destroy (t) {
+        t.plan( 1 );    
+        layer = new OpenLayers.Layer.Markers('Test Layer');
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        layer.destroy();
+        t.eq( layer.map, null, "layer.map is null after destroy" );
+    }
+
+    function test_getDataExtent(t) {
+        t.plan( 4 );
+
+        var layer = {};
+        var ret = OpenLayers.Layer.Markers.prototype.getDataExtent.apply(layer, []);
+        t.eq(ret, null, "does not crash, returns null on layer with null 'this.markers'");
+
+        layer.markers = [];
+        ret = OpenLayers.Layer.Markers.prototype.getDataExtent.apply(layer, []);
+        t.eq(ret, null, "returns null on layer with empty 'this.markers'");
+        
+        layer.markers.push({
+            'lonlat': new OpenLayers.LonLat(4,5)
+        });
+        var expectedBounds = new OpenLayers.Bounds(4,5,4,5);
+        ret = OpenLayers.Layer.Markers.prototype.getDataExtent.apply(layer, []);
+        t.ok(ret.equals(expectedBounds), "returns expected bounds with only one marker");
+
+        layer.markers.push({
+            'lonlat': new OpenLayers.LonLat(1,2)
+        });
+        var expectedBounds = new OpenLayers.Bounds(1,2,4,5);
+        ret = OpenLayers.Layer.Markers.prototype.getDataExtent.apply(layer, []);
+        t.ok(ret.equals(expectedBounds), "returns expected bounds with multiple markers");
+
+    }
+
+    function test_setOpacity(t) {
+        t.plan(1);
+
+        layer = new OpenLayers.Layer.Markers('Test Layer');
+
+        var opacity = 0.1234;
+        
+        for (var i = 0; i < 12; i++) {
+            layer.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0), new OpenLayers.Icon()));
+        }
+
+        layer.setOpacity(opacity);
+
+        for (var i = 0; i < 4; i++) {
+            layer.addMarker(new OpenLayers.Marker(new OpenLayers.LonLat(0,0), new OpenLayers.Icon()));
+        }
+        
+        var itWorks = false;
+        for (var i = 0; i < layer.markers.length; i++) {
+            itWorks = parseFloat(layer.markers[i].icon.imageDiv.style.opacity) == opacity;
+            if (!itWorks) {
+                break;
+            }
+        }
+        t.ok(itWorks, "setOpacity change markers opacity");
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width: 1080px; height: 600px;"/>
+</body>
+</html>
diff --git a/tests/Layer/MultiMap.html b/tests/Layer/MultiMap.html
new file mode 100644
index 0000000..4c9a619
--- /dev/null
+++ b/tests/Layer/MultiMap.html
@@ -0,0 +1,106 @@
+<html>
+<head>
+  <!-- multimap api key for http://(www.)openlayers.org -->
+  <script type="text/javascript" src="http://developer.multimap.com/API/maps/1.2/OA10072915821139765"></script>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer; 
+
+    function test_Layer_MultiMap_constructor (t) {
+        t.plan( 4 );
+        
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.MultiMap('Goog Layer');
+        map.addLayer(layer);
+        
+        
+        t.ok( layer instanceof OpenLayers.Layer.MultiMap, "new OpenLayers.Layer.MultiMap returns object" );
+        t.eq( layer.CLASS_NAME, "OpenLayers.Layer.MultiMap", "CLASS_NAME variable set correctly");
+
+        t.eq( layer.name, "Goog Layer", "layer.name is correct" );
+
+        t.ok ( layer.mapObject != null, "MultiMap Object correctly loaded");
+    }
+
+    function test_Layer_MultiMap_isBaseLayer (t) {
+        t.plan(1);
+        
+        var layer = new OpenLayers.Layer.MultiMap('Goog Layer');
+
+        t.ok(layer.isBaseLayer, "a default load of google layer responds as a base layer");
+    }    
+
+    function test_Layer_MultiMap_Translation_lonlat (t) {
+        
+        t.plan( 4 );
+        
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.MultiMap('Goog Layer');
+        map.addLayer(layer);
+
+     // these two lines specify an appropriate translation. 
+     //  the code afterwards works by itself to test that translation
+     //  works correctly both ways.
+        var gLatLng = new MMLatLon(50,100);
+        var correspondingOLLonLat = new OpenLayers.LonLat(100,50);
+
+
+        olLonLat = layer.getOLLonLatFromMapObjectLonLat(gLatLng);
+        t.ok(olLonLat.equals(correspondingOLLonLat), "Translation from GLatLng to OpenLayers.LonLat works");
+
+        var transGLatLng = layer.getMapObjectLonLatFromOLLonLat(olLonLat);
+        t.ok( (transGLatLng.lat == gLatLng.lat) && (transGLatLng.lon == transGLatLng.lon), "Translation from OpenLayers.LonLat to GLatLng works");
+
+        t.ok( layer.getMapObjectLonLatFromOLLonLat(null) == null, "getGLatLngFromOLLonLat(null) returns null");
+        t.ok( layer.getOLLonLatFromMapObjectLonLat(null) == null, "getOLLonLatFromGLatLng(null) returns null");
+    }
+
+    function test_Layer_MultiMap_Translation_pixel (t) {
+        
+        t.plan( 4 );
+        
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.MultiMap('Goog Layer');
+        map.addLayer(layer);
+
+     // these two lines specify an appropriate translation. 
+     //  the code afterwards works by itself to test that translation
+     //  works correctly both ways.
+        var gPoint = new MMPoint(50,100);
+        var correspondingOLPixel = new OpenLayers.Pixel(50, 100);
+
+
+        olPixel = layer.getOLPixelFromMapObjectPixel(gPoint);
+        t.ok( olPixel.equals(correspondingOLPixel), "Translation from GPoint to OpenLayers.Pixel works");
+
+        var transGPoint = layer.getMapObjectPixelFromOLPixel(olPixel);
+        t.ok( ((transGPoint.x == transGPoint.x) && (transGPoint.y == transGPoint.y)), "Translation from OpenLayers.Pixel to GPoint works");
+
+        t.ok( layer.getMapObjectPixelFromOLPixel(null) == null, "getGPointFromOLPixel(null) returns null");
+        t.ok( layer.getOLPixelFromMapObjectPixel(null) == null, "getOLPixelFromGPoint(null) returns null");
+    }
+
+
+    function test_Layer_destroy (t) {
+        t.plan( 5 );    
+
+        var map = new OpenLayers.Map('map');
+        
+        layer = new OpenLayers.Layer.MultiMap('Test Layer');
+        map.addLayer(layer);
+
+        layer.destroy();
+
+        t.eq( layer.name, null, "layer.name is null after destroy" );
+        t.eq( layer.div, null, "layer.div is null after destroy" );
+        t.eq( layer.map, null, "layer.map is null after destroy" );
+        t.eq( layer.options, null, "layer.options is null after destroy" );
+        t.eq( layer.multimap, null, "layer.gmap is null after destroy" );
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map"></div>
+</body>
+</html>
diff --git a/tests/Layer/PointTrack.html b/tests/Layer/PointTrack.html
new file mode 100644
index 0000000..b8b70b8
--- /dev/null
+++ b/tests/Layer/PointTrack.html
@@ -0,0 +1,79 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+  
+    var name = "PointTrack Layer";
+
+    function test_Layer_PointTrack_constructor(t) {
+        t.plan(2);
+
+        var layer = new OpenLayers.Layer.PointTrack(name);
+        t.ok(layer instanceof OpenLayers.Layer.PointTrack, "new OpenLayers.Layer.PointTrack returns correct object" );
+        t.ok(layer.addNodes, "layer has an addNodes method");
+
+    }
+    
+    function test_Layer_PointTrack_addNodes(t) {
+        t.plan(11);
+    
+        var layer = new OpenLayers.Layer.PointTrack(name,
+                {dataFrom: OpenLayers.Layer.PointTrack.dataFrom.TARGET_NODE});
+
+        var point1 = new OpenLayers.Geometry.Point(-111.04, 45.68);
+        var sourceNode = new OpenLayers.Feature.Vector(point1);
+        var point2 = new OpenLayers.Geometry.Point(-112.34, 45.67);
+        var targetNode = new OpenLayers.Feature.Vector(point2, {foo: "bar"});
+        layer.addNodes([sourceNode, targetNode]);
+        
+        t.eq(layer.features.length, 1, "OpenLayers.Layer.PointTrack.addNodes creates one feature from two vector point features");
+        t.eq(layer.features[0].geometry.CLASS_NAME, "OpenLayers.Geometry.LineString", "The created feature has a LineString geometry");
+        var geometry = layer.features[0].geometry;
+        t.eq(geometry.components[0].x, -111.04, "The x of the first point of the line equals the x of the first point added to the layer");
+        t.eq(geometry.components[1].y, 45.67, "The y of the second point of the line equals the y of the second point added to the layer");
+        t.eq(layer.features[0].attributes.foo, "bar", "OpenLayers.Layer.PointTrack.addNodes assigns the attributes of the target node correctly");
+        
+        layer.dataFrom = OpenLayers.Layer.PointTrack.dataFrom.SOURCE_NODE;
+
+        point1 = new OpenLayers.Geometry.Point(-123.54, 45.67);
+        sourceNode = new OpenLayers.Feature.Vector(point1, {foo: "bar"});
+        point2 = new OpenLayers.Geometry.Point(-123.21, 45.32);
+        targetNode = new OpenLayers.Feature.Vector(point2);
+        layer.addNodes([sourceNode, targetNode]);
+
+        t.eq(layer.features.length, 2, "added another two points, so the layer now has two features");
+        t.eq(layer.features[1].attributes.foo, "bar", "OpenLayers.Layer.PointTrack.addNodes assigns the attributes of the source node correctly");
+
+        point1 = new OpenLayers.LonLat(-123.58, 45.69);
+        sourceNode = new OpenLayers.Feature(null, point1);
+        point2 = new OpenLayers.LonLat(-123.25, 45.37);
+        targetNode = new OpenLayers.Feature(null, point2);
+        sourceNode.data = {foo: "bar"};
+        layer.addNodes([sourceNode, targetNode]);
+
+        t.eq(layer.features.length, 3, "added another two points, this time from features, so the layer now has two features");
+        t.eq(layer.features[2].geometry.components[0].x, -123.58, "The x of the first point of the line equals the x of the first point added to the layer");
+        t.eq(layer.features[2].geometry.components[1].y, 45.37, "The y of the second point of the line equals the x of the second point added to the layer");
+        t.eq(layer.features[2].data, sourceNode.data, "OpenLayers.Layer.PointTrack.addNodes assigns the data of the source node correctly");
+
+    }
+
+    function test_Layer_PointTrack_destroy (t) {
+        t.plan(3);    
+        layer = new OpenLayers.Layer.PointTrack(name);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        t.eq(layer.map.layers.length, 1, "layer added to the map successfully");
+        layer.destroy();
+        t.eq(layer.map, null, "layer.map is null after destroy");
+        t.eq(layer.getFeatureFromEvent({'target':'map'}), null, "getFeatureIdFromEvent doesn't cause an error when called on layer which has been destroyed.");
+    }
+
+
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/SphericalMercator.html b/tests/Layer/SphericalMercator.html
new file mode 100644
index 0000000..460c57e
--- /dev/null
+++ b/tests/Layer/SphericalMercator.html
@@ -0,0 +1,95 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    function test_SphericalMercator_forwardMercator(t) {
+        t.plan(12);
+        var arctic = OpenLayers.Layer.SphericalMercator.forwardMercator(0, 85);
+        var antarctic = OpenLayers.Layer.SphericalMercator.forwardMercator(0, -85);
+        var hawaii = OpenLayers.Layer.SphericalMercator.forwardMercator(-180, 0);
+        var phillipines = OpenLayers.Layer.SphericalMercator.forwardMercator(180, 0);
+        var ne = OpenLayers.Layer.SphericalMercator.forwardMercator(180, 90);
+        var sw = OpenLayers.Layer.SphericalMercator.forwardMercator(-180, -90);
+        
+        t.eq(arctic.lon, 0, "Arctic longitude is correct");
+        t.eq(Math.round(arctic.lat), 19971869, "Arctic latitude is correct");
+        
+        t.eq(antarctic.lon, 0, "Antarctic longitude is correct");
+        t.eq(Math.round(antarctic.lat), -19971869, "Antarctic latitude is correct");
+        
+        t.eq(Math.round(hawaii.lat), 0, "Hawaiian lat is correct");
+        t.eq(hawaii.lon, -20037508.34, "Hawaiian lon is correct");
+        
+        t.eq(Math.round(phillipines.lat), 0, "Phillipines lat is correct");
+        t.eq(phillipines.lon, 20037508.340, "Phillipines lon is correct");
+       
+        // Rounding errors make this not infinity 
+        t.ok(ne.lat > 50000000, "NE lat is correct");
+        t.eq(ne.lon, 20037508.34, "NE lon is correct");
+        
+        t.eq(sw.lat, -Infinity, "SW lat is correct");
+        t.eq(sw.lon, -20037508.34, "SW lon is correct");
+    } 
+    
+    function test_sphericalMercator_inverseMercator(t) {
+        t.plan(4);
+        var sw =  OpenLayers.Layer.SphericalMercator.inverseMercator(-20037508.34,  -20037508.34);
+        var ne =  OpenLayers.Layer.SphericalMercator.inverseMercator(20037508.34,  20037508.34);
+        t.eq(sw.lon, -180, "Southwest lon correct");
+        t.eq(ne.lon, 180, "Northeast lon correct");
+        
+        t.eq(sw.lat, -85.051128779807, "Southwest lat correct");
+        t.eq(ne.lat, 85.051128779807, "Northeast lat correct");
+    }
+
+    function strToFixed(str, dig) { 
+        if(dig == undefined) { 
+            dig = 5; 
+        } 
+        return str.replace(/(\d+\.\d+)/g, function(match) { 
+            return parseFloat(match).toFixed(dig); 
+        }); 
+    } 
+ 
+    function test_SphericalMercator_projectForward(t) { 
+        t.plan(1);
+        var point = new OpenLayers.Geometry.Point(10, 20); 
+        OpenLayers.Layer.SphericalMercator.projectForward(point); 
+
+        t.eq(strToFixed(point.toString()), 
+             strToFixed("POINT(1113194.9077777779 2273030.9266712805)"), 
+             "point transforms from EPSG:4326 to Spherical Mercator"); 
+    } 
+         
+    function test_SphericalMercator_to4326(t) { 
+        t.plan(1);
+        var point = new OpenLayers.Geometry.Point(1113195, 2273031); 
+
+        OpenLayers.Layer.SphericalMercator.projectInverse(point); 
+         
+        t.eq(strToFixed(point.toString()), 
+             strToFixed("POINT(10.000000828446318 20.000000618997227)"), 
+             "point transforms from EPSG:4326 to Spherical Mercator"); 
+    }
+    
+    function test_SphericalMercator_addTransform(t) {
+        // this class should add two methods to the
+        // OpenLayers.Projection.transforms object
+        t.plan(4);
+        var wgs84 = OpenLayers.Projection.transforms["EPSG:4326"];
+        t.ok(wgs84 instanceof Object, "EPSG:4326 exists in table");
+        
+        var smerc = OpenLayers.Projection.transforms["EPSG:900913"];
+        t.ok(smerc instanceof Object, "EPSG:900913 exists in table");
+        
+        t.ok(wgs84["EPSG:900913"] === OpenLayers.Layer.SphericalMercator.projectForward,
+             "from EPSG:4326 to EPSG:900913 correctly defined");
+        t.ok(smerc["EPSG:4326"] === OpenLayers.Layer.SphericalMercator.projectInverse,
+             "from EPSG:900913 to EPSG:4326 correctly defined");
+    }
+    
+  </script> 
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Layer/TMS.html b/tests/Layer/TMS.html
new file mode 100644
index 0000000..e8205da
--- /dev/null
+++ b/tests/Layer/TMS.html
@@ -0,0 +1,268 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer; 
+
+    var name = 'Test Layer';
+    var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+    var options = {'layername':'basic', 'type':'png'}; 
+
+
+    function test_Layer_TMS_constructor (t) {
+        t.plan( 1 );
+                       
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+        t.ok( layer instanceof OpenLayers.Layer.TMS, "returns OpenLayers.Layer.TMS object" );
+    }
+
+
+
+    function test_Layer_TMS_clearTiles (t) {
+        t.plan( 1 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0));
+
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.clearGrid();
+
+        t.ok( layer.grid != null, "layer.grid does not get nullified" );
+        map.destroy();
+    }
+
+
+    function test_Layer_TMS_getTMSBounds(t) {
+        t.plan( 1 );
+
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+
+        var bl = { bounds: new OpenLayers.Bounds(1,2,0,0)};
+        var tr = { bounds: new OpenLayers.Bounds(0,0,3,4)};
+        layer.grid = [ [6, tr], 
+                       [bl, 7]];
+
+        var bounds = layer.getTilesBounds();
+    
+        var testBounds = new OpenLayers.Bounds(1,2,3,4);
+        
+        t.ok( bounds.equals(testBounds), "getTMSBounds() returns correct bounds");
+        
+        layer.grid = null;
+    }
+
+    function test_Layer_TMS_getResolution(t) {
+        t.plan( 1 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+        map.addLayer(layer);
+
+        map.zoom = 5;
+
+        t.eq( layer.getResolution(), 0.0439453125, "getResolution() returns correct value");
+        map.destroy();
+    }
+
+    function test_Layer_TMS_getZoomForExtent(t) {
+        t.plan( 2 );
+        var bounds, zoom;
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+        map.addLayer(layer);
+
+        bounds = new OpenLayers.Bounds(10,10,12,12);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 8, "getZoomForExtent() returns correct value");
+
+        bounds = new OpenLayers.Bounds(10,10,100,100);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 2, "getZoomForExtent() returns correct value");
+        map.destroy();
+    }   
+
+
+    /** THIS WOULD BE WHERE THE TESTS WOULD GO FOR 
+     *     
+     *    -moveTo
+     *    -insertColumn
+     *    -insertRow
+    
+    function 07_Layer_TMS_moveTo(t) {
+    }
+
+    function 08_Layer_TMS_insertColumn(t) {
+    }
+
+    function 09_Layer_TMS_insertRow(t) {
+    }
+
+     * 
+     */
+    function test_Layer_TMS_getURL(t) {
+
+        t.plan(3);
+        
+        var map = new OpenLayers.Map('map', options);
+        var options = {'layername':'basic', 'type':'png'}; 
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 9);
+        var tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://labs.metacarta.com/wms-c/Basic.py/1.0.0/basic/9/261/192.png", "Tile URL is correct");
+    
+        var layer2 = layer.clone();
+        layer2.serviceVersion = "1.2.3";
+        map.addLayer(layer2);
+        tileurl = layer2.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://labs.metacarta.com/wms-c/Basic.py/1.2.3/basic/9/261/192.png", "TMS serviceVersion is correct");
+
+        layer.url = ["http://tilecache1/", "http://tilecache2/", "http://tilecache3/"];
+        tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://tilecache1/1.0.0/basic/9/261/192.png", "Tile URL is deterministic");
+        map.destroy();
+    }
+    function test_Layer_TMS_Rounding(t) {
+        t.plan(1);
+            m = new OpenLayers.Map("map", {'maxExtent':new OpenLayers.Bounds(-122.6579,37.4901,-122.0738,37.8795)});
+            layer = new OpenLayers.Layer.TMS( "TMS", 
+                    "http://labs.metacarta.com/wms-c/Basic.py/", {layername: 'basic', type:'png', resolutions:[0.000634956337608418]} );
+            m.addLayer(layer);
+            m.zoomToMaxExtent();
+            t.eq(layer.getURL(layer.grid[3][3].bounds), "http://labs.metacarta.com/wms-c/Basic.py/1.0.0/basic/0/1/1.png", "TMS tiles around rounded properly.");
+        m.destroy();
+    }        
+            
+    function test_Layer_TMS_serverResolutions(t) {
+        t.plan(2);
+        
+        var map = new OpenLayers.Map('map', {
+            resolutions: [13,11]
+        });
+
+        var layer = new OpenLayers.Layer.TMS('tc layer', '', options);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 1);
+
+        var tileurl = layer.getURL(new OpenLayers.Bounds(0,0,0,0));
+        var level = parseInt(tileurl.split('/')[2]);
+        t.eq(map.getZoom(), level, "Tile zoom level is correct without serverResolutions");
+
+        layer.serverResolutions = [14,13,12,11,10];
+        tileurl = layer.getURL(new OpenLayers.Bounds(0,0,0,0));
+        level = parseInt(tileurl.split('/')[2]);
+        var res = map.getResolution();
+        var gotLevel = OpenLayers.Util.indexOf(layer.serverResolutions, res);
+        t.eq(gotLevel, level, "Tile zoom level is correct with serverResolutions");
+        
+        map.destroy();
+    }
+
+    function test_zoomOffset(t) {
+
+        t.plan(2);
+        
+        var offset, zoom;
+        
+        // test offset of 2
+        offset = 2;
+        zoom = 3;
+        
+        var map = new OpenLayers.Map({
+            div: "map",
+            maxResolution: OpenLayers.Map.prototype.maxResolution / Math.pow(2, offset)
+        });
+        var layer = new OpenLayers.Layer.TMS("TMS", "", {
+            layername: "basic",
+            type: "png",
+            zoomOffset: offset
+        });
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0, 0), zoom);
+
+        var tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        level = parseInt(tileurl.split("/")[2]);
+        t.eq(parseInt(tileurl.split("/")[2]), zoom + offset, "correct level for offset 2");
+
+        map.destroy();
+
+        // test offset of -1
+        offset = -1;
+        zoom = 3;
+        
+        var map = new OpenLayers.Map({
+            div: "map",
+            maxResolution: OpenLayers.Map.prototype.maxResolution / Math.pow(2, offset)
+        });
+        var layer = new OpenLayers.Layer.TMS("TMS", "", {
+            layername: "basic",
+            type: "png",
+            zoomOffset: offset
+        });
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0, 0), zoom);
+
+        var tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        level = parseInt(tileurl.split("/")[2]);
+        t.eq(parseInt(tileurl.split("/")[2]), zoom + offset, "correct level for offset -1");
+
+        map.destroy();
+
+
+    }
+
+    function test_Layer_TMS_setMap(t) {
+
+        t.plan(3);
+        
+        var map = new OpenLayers.Map('map', options);
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+
+        t.eq(layer.tileOrigin, null, "Tile origin starts out null");
+        layer.setMap(map);
+        
+        t.eq(layer.tileOrigin.lat, -90, "lat is -90");
+        t.eq(layer.tileOrigin.lon, -180, "lon is -180");
+        map.destroy();
+    }
+
+    function test_Layer_TMS_destroy (t) {
+
+        t.plan( 3 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+        map.addLayer(layer);
+        layer.destroy();
+        t.eq( layer.grid, null, "layer.grid is null after destroy" );
+        t.eq( layer.tileSize, null, "layer.tileSize is null after destroy" );
+
+
+    //test with tile creation
+        layer = new OpenLayers.Layer.TMS(name, url, options);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.destroy();
+
+        t.ok( layer.grid == null, "tiles appropriately destroyed");
+        map.destroy();
+    }
+    
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px;"></div>
+</body>
+</html>
diff --git a/tests/Layer/Text.html b/tests/Layer/Text.html
new file mode 100644
index 0000000..a287ed1
--- /dev/null
+++ b/tests/Layer/Text.html
@@ -0,0 +1,211 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var isMSIE = (navigator.userAgent.indexOf("MSIE") > -1);
+    var layer; 
+
+    var datafile  = "./data_Layer_Text_textfile.txt";
+    var datafile2 = "./data_Layer_Text_textfile_2.txt";
+    var datafile_overflow = "./data_Layer_Text_textfile_overflow.txt";
+
+    // if this test is running in IE, different rules apply
+    if (isMSIE) {
+        datafile = "." + datafile;
+        datafile2 = "." + datafile2;
+        datafile_overflow = "." + datafile_overflow;
+    }
+
+    function test_Layer_Text_constructor (t) {
+        t.plan( 5 );
+        
+        layer = new OpenLayers.Layer.Text('Test Layer', { location: datafile });
+        layer.loadText();
+        t.ok( layer instanceof OpenLayers.Layer.Text, "new OpenLayers.Layer.Text returns object" );
+        t.eq( layer.location, datafile, "layer.location is correct" );
+        var markers;
+        t.delay_call( 1, function() {  
+            t.eq( layer.markers.length, 2, "marker length is correct" );
+            var ll = new OpenLayers.LonLat(20, 10);
+            t.ok( layer.markers[0].lonlat.equals(ll), "first marker is correct" );
+            t.eq( layer.markers[0].icon.url, 'http://boston.openguides.org/markers/ORANGE.png', "icon" );
+        } );
+    }
+    function test_Layer_Text_draw (t) { 
+//        t.plan(5);
+        t.plan( 2 );
+        layer = new OpenLayers.Layer.Text('Test Layer', { location: datafile });
+        t.ok( layer instanceof OpenLayers.Layer.Text, "new OpenLayers.Layer.Text returns object" );
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        t.eq( map.layers[1].name, layer.name, "Layer added to map okay" );
+        t.delay_call( 1, function() { 
+          map.setCenter(new OpenLayers.LonLat(0,0),0);
+
+/*
+            if (!isMozilla)
+                t.ok( true, "skipping element test outside of Mozilla");
+            else
+              t.ok( map.layers[0].div.firstChild instanceof HTMLImageElement, "Marker added to div" )
+
+          t.eq( map.layers[0].div.firstChild.style.top, "219px", "Marker top set correctly" )
+          t.eq( map.layers[0].div.firstChild.style.left, "273px", "Marker left set correctly" )
+*/
+        });;
+    }
+
+    function test_Layer_Text_moveTo(t) {
+        t.plan(16);
+        
+        temp = OpenLayers.Layer.Markers.prototype.moveTo;
+
+        g_Bounds = {};
+        g_ZoomChanged = {};
+        g_Minor = {};
+        var args = [g_Bounds, g_ZoomChanged, g_Minor];
+
+        OpenLayers.Layer.Markers.prototype.moveTo = 
+            function(bounds, zoomChanged, minor) {
+                t.ok(bounds == g_Bounds, "correct bounds passed to Markers superclass");
+                t.ok(zoomChanged == g_ZoomChanged, "correct zoomChanged passed to Markers superclass");
+                t.ok(minor == g_Minor, "correct minor passed to Markers superclass");
+            }
+
+        var layer = {
+            'loadText': function() { g_TextLoaded = true; }
+        };
+
+        //visibility true, loaded true
+        layer.visibility = true;
+        layer.loaded = true;
+        g_TextLoaded = false;
+        OpenLayers.Layer.Text.prototype.moveTo.apply(layer, args);
+        t.ok(g_TextLoaded == false, "text not loaded when visibility true, loaded true");
+
+        //visibility true, loaded false
+        layer.visibility = true;
+        layer.loaded = false;
+        g_TextLoaded = false;
+        OpenLayers.Layer.Text.prototype.moveTo.apply(layer, args);
+        t.ok(g_TextLoaded == true, "text is loaded when visibility true, loaded false");
+
+        //visibility false, loaded true
+        layer.visibility = false;
+        layer.loaded = true;
+        g_TextLoaded = false;
+        OpenLayers.Layer.Text.prototype.moveTo.apply(layer, args);
+        t.ok(g_TextLoaded == false, "text not loaded when visibility false, loaded true");
+
+        //visibility false, loaded false
+        layer.visibility = false;
+        layer.loaded = false;
+        g_TextLoaded = false;
+        OpenLayers.Layer.Text.prototype.moveTo.apply(layer, args);
+        t.ok(g_TextLoaded == false, "text not loaded when visibility false, loaded false");
+
+        OpenLayers.Layer.Markers.prototype.moveTo = temp;
+    }
+
+
+
+    function test_Layer_Text_events (t) {
+        t.plan( 5 );    
+        layer = new OpenLayers.Layer.Text('Test Layer', { location: datafile2 });
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+        var event = {};
+        t.delay_call( 1, function() {  
+          t.ok(layer.markers[0].events, "First marker has an events object");
+          t.eq(layer.markers[0].events.listeners['click'].length, 1, "Marker events has one object");
+          layer.markers[0].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "Popup opened correctly");
+          layer.markers[1].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "1st popup gone, 2nd Popup opened correctly");
+          //Safari 3 separates style overflow into overflow-x and overflow-y
+          var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+          t.eq(map.popups[0].contentDiv.style[prop],"auto", "default Popup overflow correct");
+        });
+    }
+    function test_Layer_Text_overflow (t) {
+        t.plan( 4 );    
+        layer = new OpenLayers.Layer.Text('Test Layer', { location: datafile_overflow });
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+        var event = {};
+        t.delay_call( 1, function() {  
+          layer.markers[0].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "Popup opened correctly");
+          //Safari 3 separates style overflow into overflow-x and overflow-y
+          var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+          t.eq(map.popups[0].contentDiv.style[prop],"auto", "Popup overflow read from file");
+          layer.markers[1].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 1, "1st popup gone, 2nd Popup opened correctly");
+          //Safari 3 separates style overflow into overflow-x and overflow-y
+          var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+          t.eq(map.popups[0].contentDiv.style[prop],"hidden", "Popup overflow read from file");
+        });
+    }
+    function test_Layer_Text_events_nopopups (t) {
+        t.plan( 4 );    
+        layer = new OpenLayers.Layer.Text('Test Layer', { location: datafile });
+        var map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),0);
+        var event = {};
+        t.delay_call( 1, function() {  
+          t.ok(layer.markers[0].events, "First marker has an events object");
+          t.eq(layer.markers[0].events.listeners['click'].length, 0, "Marker events has one object");
+          layer.markers[0].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 0, "no popup on first marker");
+          layer.markers[1].events.triggerEvent('click', event);
+          t.eq(map.popups.length, 0, "no popup on second marker");
+        });
+    }
+    function test_Layer_Text_loadend_Event(t) {
+        t.plan(2);
+        layer = new OpenLayers.Layer.Text('Test Layer', {location:datafile});
+        t.delay_call(2, function() { 
+            layer.events.register('loadend', layer, function() { 
+                t.ok(true, "Loadend event fired"); 
+            });
+            layer.parseData({
+                'responseText':''
+            });
+            t.ok(true, "Parsing data didn't fail"); 
+        });
+    }
+
+    function test_Layer_Text_destroy (t) {
+        t.plan( 1 );    
+        layer = new OpenLayers.Layer.Text('Test Layer');
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        layer.destroy();
+        t.eq( layer.map, null, "layer.map is null after destroy" );
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width:500px; height:500px"></div>
+</body>
+</html>
diff --git a/tests/Layer/TileCache.html b/tests/Layer/TileCache.html
new file mode 100644
index 0000000..d24a44a
--- /dev/null
+++ b/tests/Layer/TileCache.html
@@ -0,0 +1,203 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+
+
+    function test_Layer_TileCache_constructor (t) {
+        t.plan( 1 );
+
+        var name = 'Test Layer';
+        var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+        var layername = "basic";
+        var options = {'type':'png'}; 
+
+        var layer = new OpenLayers.Layer.TileCache(name, url, layername, options);
+        t.ok( layer instanceof OpenLayers.Layer.TileCache, "returns OpenLayers.Layer.TileCache object" );
+        layer.destroy();
+    }
+
+    function test_Layer_TileCache_clone(t) {
+        t.plan(3);
+
+        var name = 'Test Layer';
+        var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+        var layername = "basic";
+        var options = {'type':'png'}; 
+        var layer = new OpenLayers.Layer.TileCache(name, url, layername, options);
+
+        var clone = layer.clone();
+        t.eq(layer.name, clone.name, "clone() correctly copy the 'name' property");
+        t.eq(layer.url, clone.url, "clone() correctly copy the 'url' property");
+        t.eq(layer.layername, clone.layername, "clone() correctly copy the 'layername' property");
+        clone.destroy();
+        layer.destroy();
+    }
+
+    function test_Layer_TileCache_clearTiles (t) {
+        t.plan( 1 );
+        var name = 'Test Layer';
+        var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+        var layername = "basic";
+        var options = {'type':'png'}; 
+        var layer = new OpenLayers.Layer.TileCache(name, url, layername, options);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0));
+
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.clearGrid();
+
+        t.ok( layer.grid != null, "layer.grid does not get nullified" );
+        map.destroy();
+    }
+
+
+    function test_Layer_TileCache_getTileCacheBounds(t) {
+        t.plan( 1 );
+
+        var name = 'Test Layer';
+        var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+        var layername = "basic";
+        var options = {'type':'png'}; 
+        var layer = new OpenLayers.Layer.TileCache(name, url, layername, options);
+
+        var bl = { bounds: new OpenLayers.Bounds(1,2,0,0)};
+        var tr = { bounds: new OpenLayers.Bounds(0,0,3,4)};
+        layer.grid = [ [6, tr], 
+                       [bl, 7]];
+
+        var bounds = layer.getGridBounds();
+    
+        var testBounds = new OpenLayers.Bounds(1,2,3,4);
+        
+        t.ok( bounds.equals(testBounds), "getTileCacheBounds() returns correct bounds")
+
+    }
+
+    function test_Layer_TileCache_getResolution(t) {
+        t.plan( 1 );
+
+        var name = 'Test Layer';
+        var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+        var layername = "basic";
+        var options = {'type':'png', maxResolution: 180/256}; 
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.TileCache(name, url, layername, options);
+        map.addLayer(layer);
+
+        map.zoom = 5;
+
+        t.eq( layer.getResolution(), 0.02197265625, "getResolution() returns correct value");
+        map.destroy();
+    }
+
+    function test_Layer_TileCache_getZoomForExtent(t) {
+        t.plan( 2 );
+        var bounds, zoom;
+
+        var name = 'Test Layer';
+        var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+        var layername = "basic";
+        var options = {'type':'png', maxResolution: 180/256}; 
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.TileCache(name, url, layername, options);
+        map.addLayer(layer);
+
+        bounds = new OpenLayers.Bounds(10,10,12,12);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 7, "getZoomForExtent() returns correct value");
+
+        bounds = new OpenLayers.Bounds(10,10,100,100);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 1, "getZoomForExtent() returns correct value");
+        map.destroy();
+    }   
+
+    function test_Layer_TileCache_getURL(t) {
+
+        t.plan(2);
+        
+        var map = new OpenLayers.Map('map');
+        var name = 'Test Layer';
+        var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+        var layername = "basic";
+        var options = {'layername':'basic', 'format':'image/jpg', maxResolution: 180/256}; 
+        var layer = new OpenLayers.Layer.TileCache(name, url, layername, options);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 9);
+        var tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://labs.metacarta.com/wms-c/Basic.py/basic/09/000/000/522/000/000/384.jpeg", "Tile URL is correct");
+
+        layer.url = ["http://tilecache1/", "http://tilecache2/", "http://tilecache3/"];
+        tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://tilecache2/basic/09/000/000/522/000/000/384.jpeg", "Tile URL is deterministic");
+        map.destroy();
+    }
+
+    function test_Layer_TileCache_serverResolutions(t) {
+        t.plan(2);
+        
+        var map = new OpenLayers.Map('map', {
+            resolutions: [13,11]
+        });
+
+        var layer = new OpenLayers.Layer.TileCache('tc layer', '', 'basic');
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 1);
+
+        var tileurl = layer.getURL(new OpenLayers.Bounds(0,0,0,0));
+        var level = parseInt(tileurl.split('/')[2]);
+        t.eq(map.getZoom(), level, "Tile zoom level is correct without serverResolutions");
+
+        layer.serverResolutions = [14,13,12,11,10];
+        tileurl = layer.getURL(new OpenLayers.Bounds(0,0,0,0));
+        level = parseInt(tileurl.split('/')[2]);
+        var gotLevel = OpenLayers.Util.indexOf(layer.serverResolutions, map.getResolution());
+        t.eq(gotLevel, level, "Tile zoom level is correct with serverResolutions");
+        
+        map.destroy();
+    }
+
+    function test_Layer_TileCache_destroy (t) {
+
+        t.plan( 3 );
+
+        var name = 'Test Layer';
+        var url = "http://labs.metacarta.com/wms-c/Basic.py/";
+        var layername = "basic";
+        var options = {'layername':'basic', 'format':'image/jpg', maxResolution: 180/256}; 
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.TileCache(name, url, layername, options);
+        map.addLayer(layer);
+        layer.destroy();
+        t.eq( layer.grid, null, "layer.grid is null after destroy" );
+        t.eq( layer.tileSize, null, "layer.tileSize is null after destroy" );
+
+
+    //test with tile creation
+        layer = new OpenLayers.Layer.TileCache(name, url, options);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.destroy();
+
+        t.ok( layer.grid == null, "tiles appropriately destroyed");
+        map.destroy();
+    }
+    
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/Vector.html b/tests/Layer/Vector.html
new file mode 100644
index 0000000..790201c
--- /dev/null
+++ b/tests/Layer/Vector.html
@@ -0,0 +1,786 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var name = "Vector Layer";
+    
+    function test_Layer_Vector_constructor(t) {
+        t.plan(5);
+
+        var options = {protocol: new OpenLayers.Protocol(), 
+                       strategies: [new OpenLayers.Strategy(), new OpenLayers.Strategy()]}
+        var layer = new OpenLayers.Layer.Vector(name, options);
+
+        t.ok(layer instanceof OpenLayers.Layer.Vector, "new OpenLayers.Layer.Vector returns correct object" );
+        t.eq(layer.name, name, "layer name is correctly set");
+        t.ok(layer.renderer.CLASS_NAME, "layer has a renderer");
+        
+        t.ok((layer.name == layer.strategies[0].layer.name) &&
+             (layer.strategies[0].layer.name == layer.strategies[1].layer.name), 
+             "setLayer was called on strategies");
+
+       options.renderers = [OpenLayers.Renderer.SVG, OpenLayers.Renderer.VML, OpenLayers.Renderer.Canvas]; 
+       layer.destroy(); 
+       layer = new OpenLayers.Layer.Vector(name, options); 
+       t.ok(layer.renderer.CLASS_NAME, "layer has a renderer when providing a function"); 
+       layer.destroy(); 
+    }
+
+    function test_Layer_Vector_assignRenderer(t) { 
+        t.plan(2);
+ 
+        // create a dummy class in the global name space 
+        My = { 
+            Custom: { 
+                Renderer: { 
+                    Supported: OpenLayers.Class(OpenLayers.Renderer, { 
+                        supported: OpenLayers.Function.True, 
+                        CLASS_NAME: 'My.Custom.Renderer.Supported' 
+                    }), 
+                    NotSupported: OpenLayers.Class(OpenLayers.Renderer, { 
+                        supported: OpenLayers.Function.False, 
+                        CLASS_NAME: 'My.Custom.Renderer.NotSupported' 
+                    }) 
+                } 
+            } 
+        }; 
+        var layer = new OpenLayers.Layer.Vector('vector', { 
+            renderers: [My.Custom.Renderer.NotSupported, 
+                My.Custom.Renderer.Supported, 
+                OpenLayers.Renderer.Canvas] 
+        }); 
+        t.eq(layer.renderer.CLASS_NAME, 'My.Custom.Renderer.Supported',  
+            'layer has a valid renderer'); 
+ 
+        var layer = new OpenLayers.Layer.Vector('vector', { 
+            renderers: ['SVG', 'VML', 'Canvas', My.Custom.Renderer.Supported] 
+        }); 
+        t.ok(layer.renderer.CLASS_NAME != 'My.Custom.Renderer.Supported',  
+            'renderers can be strings as well'); 
+    }
+
+    function test_Layer_Vector_refresh(t) {
+        t.plan(4);
+
+        var obj = {"an": "object"};
+
+        var log;
+        var layer = new OpenLayers.Layer.Vector(name, {
+            eventListeners: {
+                refresh: function(o) {
+                    log.obj = o;
+                }
+            }
+        });
+        inRange = false;
+        layer.calculateInRange = function() {
+            return inRange;
+        };
+
+        log = {};
+        inRange = false;
+        layer.visibility = false;
+        layer.refresh(obj);
+        t.eq(log.obj, undefined, "[false, false] refresh not triggered");
+
+        log = {};
+        inRange = true;
+        layer.visibility = false;
+        layer.refresh(obj);
+        t.eq(log.obj, undefined, "[true, false] refresh not triggered");
+
+        log = {};
+        inRange = false;
+        layer.visibility = true;
+        layer.refresh(obj);
+        t.eq(log.obj, undefined, "[false, true] refresh not triggered");
+
+        log = {};
+        inRange = true;
+        layer.visibility = true;
+        layer.refresh(obj);
+        t.ok(log.obj === obj, "[true, true] refresh triggered with correct arg");
+    }
+    
+    function test_Layer_Vector_addFeatures(t) {
+        t.plan(8);
+    
+        var layer = new OpenLayers.Layer.Vector(name);
+
+        var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
+        var pointFeature = new OpenLayers.Feature.Vector(point);
+
+        layer.preFeatureInsert = function(feature) {
+            t.ok(feature == pointFeature, "OpenLayers.Layer.Vector.addFeatures calls preFeatureInsert with the right arg");
+        };
+        layer.onFeatureInsert = function(feature) {
+            t.ok(feature == pointFeature, "OpenLayers.Layer.Vector.addFeatures calls onFeatureInsert with the right arg");
+        };
+        layer.events.register('beforefeatureadded', null, function(obj) {
+            t.ok(pointFeature == obj.feature, "OpenLayers.Layer.Vector.addFeatures triggers beforefeatureadded with correct feature passed to callback");
+        });
+        layer.events.register('featureadded', null, function(obj) {
+            t.ok(pointFeature == obj.feature, "OpenLayers.Layer.Vector.addFeatures triggers featureadded with correct feature passed to callback");
+        });
+        layer.events.register('featuresadded', null, function(obj) {
+            t.ok(pointFeature == obj.features[0], "OpenLayers.Layer.Vector.addFeatures triggers featuresadded with correct features passed to callback");
+        });
+
+        layer.addFeatures([pointFeature]);
+        
+        t.eq(layer.features.length, 1, "OpenLayers.Layer.Vector.addFeatures adds something to the array");
+        t.ok(layer.features[0] == pointFeature, "OpenLayers.Layer.Vector.addFeatures returns an array of features");
+
+        layer.preFeatureInsert = function(feature) {
+            t.fail("OpenLayers.Layer.Vector.addFeatures calls preFeatureInsert while it must not");
+        };
+        layer.onFeatureInsert = function(feature) {
+            t.fail("OpenLayers.Layer.Vector.addFeatures calls onFeatureInsert while it must not");
+        };
+        layer.events.register('beforefeatureadded', null, function(obj) {
+            t.fail("OpenLayers.Layer.Vector.addFeatures triggers beforefeatureadded while it must not");
+        });
+        layer.events.register('featureadded', null, function(obj) {
+            t.fail("OpenLayers.Layer.Vector.addFeatures triggers featureadded while it must not");
+        });
+        layer.events.register('featuresadded', null, function(obj) {
+            t.fail("OpenLayers.Layer.Vector.addFeatures triggers featuresadded while it must not");
+        });
+
+        layer.addFeatures([pointFeature], {silent: true});
+
+        var extent = layer.getDataExtent();
+        t.eq(extent.toBBOX(), "-111.04,45.68,-111.04,45.68", "extent from getDataExtent is correct");
+    }
+
+    function test_Layer_Vector_getFeature(t) {
+        t.plan(13);
+
+        var layer = new OpenLayers.Layer.Vector(name);
+        var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(-111.04, 45.68));
+
+        t.ok(layer.getFeatureById(feature.id) == null,
+             "OpenLayers.Layer.Vector.getFeatureById returns null while the layer is empty");
+        t.ok(layer.getFeatureByFid('my_fid') == null,
+             "OpenLayers.Layer.Vector.getFeatureByFid returns null while the layer is empty");
+
+        layer.addFeatures([feature]);
+
+        t.ok(layer.getFeatureByFid('my_fid') == null,
+             "OpenLayers.Layer.Vector.getFeatureByFid returns null on unset feature fid");
+
+        feature.fid = 'my_fid';
+
+        t.ok(layer.getFeatureById(feature.id) == feature,
+             "OpenLayers.Layer.Vector.getFeatureById returns the correct feature");
+        t.ok(layer.getFeatureByFid(feature.fid) == feature,
+             "OpenLayers.Layer.Vector.getFeatureByFid returns the correct feature");
+        t.ok(layer.getFeatureById('some_id_that_does_not_exist') == null,
+             "OpenLayers.Layer.Vector.getFeatureById returns null on non-existing feature id");
+        t.ok(layer.getFeatureByFid('some_fid_that_does_not_exist') == null,
+             "OpenLayers.Layer.Vector.getFeatureByFid returns null on non-existing feature fid");
+        t.ok(layer.getFeatureById(feature.fid) == null,
+             "OpenLayers.Layer.Vector.getFeatureById ignores the feature fid");
+        t.ok(layer.getFeatureByFid(feature.id) == null,
+             "OpenLayers.Layer.Vector.getFeatureByFid ignores the feature id");
+
+        t.ok(layer.getFeatureBy('id', feature.id) == feature,
+             "OpenLayers.Layer.Vector.getFeatureBy('id', ...) works like getFeatureById on existing feature id");
+        t.ok(layer.getFeatureBy('id', 'some_id_that_does_not_exist') == null,
+             "OpenLayers.Layer.Vector.getFeatureBy('id', ...) works like getFeatureById on non-existing feature id");
+        t.ok(layer.getFeatureBy('fid', feature.fid) == feature,
+             "OpenLayers.Layer.Vector.getFeatureBy('fid', ...) works like getFeatureByFid on existing feature fid");
+        t.ok(layer.getFeatureBy('fid', 'some_fid_that_does_not_exist') == null,
+             "OpenLayers.Layer.Vector.getFeatureBy('fid', ...) works like getFeatureByFid on non-existing feature fid");
+    }
+
+    function test_Layer_Vector_getDataExtent(t) {
+        t.plan(1);
+        var layer = new OpenLayers.Layer.Vector(name);
+
+        var point = new OpenLayers.Geometry.Point(-111.04, 45.68);
+        var pointFeature = new OpenLayers.Feature.Vector(point);
+        layer.addFeatures([pointFeature]);
+        var point = new OpenLayers.Geometry.Point(-111.04, 5.68);
+        var pointFeature = new OpenLayers.Feature.Vector(point);
+        layer.addFeatures([pointFeature]);
+        var extent = layer.getDataExtent();
+        t.ok(extent.toBBOX() != layer.features[0].geometry.getBounds().toBBOX(), "extent from getDataExtent doesn't clobber first feature");
+    }
+
+    function test_Layer_Vector_removeFeatures(t) {
+        t.plan(17);
+    
+        var layer = new OpenLayers.Layer.Vector(name);
+        var features, log;
+
+        var point1 = new OpenLayers.Geometry.Point(-111.04, 45.68);
+        var pointFeature1 = new OpenLayers.Feature.Vector(point1);
+        var point2 = new OpenLayers.Geometry.Point(-111.14, 45.78);
+        var pointFeature2 = new OpenLayers.Feature.Vector(point2);
+
+        // 1 test
+        layer.addFeatures([pointFeature1, pointFeature2]);
+        features = layer.removeFeatures([pointFeature1]);
+        t.ok(layer.features.length == 1, "OpenLayers.Layer.Vector.removeFeatures removes a feature from the features array");
+
+        // 1 test
+        layer.addFeatures([pointFeature1.clone(), pointFeature2.clone()]);
+        layer.selectedFeatures.push(layer.features[0]); 
+        layer.removeFeatures(layer.features[0]);
+        t.eq(layer.selectedFeatures, [], "Remove features removes selected features");
+
+        // 1 test
+        features = layer.removeFeatures(layer.features);
+        t.ok(layer.features.length == 0,
+             "OpenLayers.Layer.Vector.removeFeatures(layer.features) removes all feature from the features array");
+
+        // 4 tests
+        log = [];
+        layer.addFeatures([pointFeature1, pointFeature2]);
+        layer.events.register("featuresremoved", null, function(obj) {
+            log.push(obj);
+        });
+        layer.removeFeatures(layer.features);
+        t.eq(log.length, 1,
+             "\"featuresremoved\" triggered once [0]");
+        t.eq(log[0].features.length, 2,
+             "\"featuresremoved\" listener is passed two features [0]");
+        t.ok(log[0].features[0] == pointFeature1,
+             "\"featuresremoved\" listener is passed the correct feature at index 0 [0]");
+        t.ok(log[0].features[1] == pointFeature2,
+             "\"featuresremoved\" listener is passed the correct feature at index 1 [0]");
+        layer.events.remove("featuresremoved");
+
+        // 4 tests
+        log = [];
+        layer.addFeatures([
+            pointFeature1, pointFeature2,
+            pointFeature1.clone(), pointFeature2.clone()
+        ]);
+        layer.selectedFeatures.push(pointFeature1);
+        layer.selectedFeatures.push(pointFeature2);
+        layer.events.register("featuresremoved", null, function(obj) {
+            log.push(obj);
+        });
+        layer.removeFeatures(layer.selectedFeatures);
+        t.eq(log.length, 1,
+             "\"featuresremoved\" triggered once [1]");
+        t.eq(log[0].features.length, 2,
+             "\"featuresremoved\" listener is passed two features [1]");
+        t.ok(log[0].features[0] == pointFeature1,
+             "\"featuresremoved\" listener is passed the correct feature at index 0 [1]");
+        t.ok(log[0].features[1] == pointFeature2,
+             "\"featuresremoved\" listener is passed the correct feature at index 1 [1]");
+        layer.events.remove("featuresremoved");
+        layer.removeFeatures(layer.features);
+
+        // 6 tests
+        layer.events.register('beforefeatureremoved', null, function(obj) {
+            t.ok(pointFeature1 == obj.feature,
+                 "OpenLayers.Layer.Vector.removeFeatures triggers beforefeatureremoved with correct feature passed to callback");
+        });
+        layer.events.register('featureremoved', null, function(obj) {
+            t.ok(pointFeature1 == obj.feature,
+                 "OpenLayers.Layer.Vector.removeFeatures triggers featureremoved with correct feature passed to callback");
+        });
+        layer.events.register('featuresremoved', null, function(obj) {
+            t.ok(pointFeature1 == obj.features[0],
+                 "OpenLayers.Layer.Vector.removeFeatures triggers featuresremoved with correct features passed to callback");
+        });
+        layer.addFeatures([pointFeature1]);
+        layer.removeFeatures([pointFeature1]);
+        layer.addFeatures([pointFeature1]);
+        layer.removeFeatures(layer.features);
+
+        // 0 test
+        layer.events.register('beforefeatureremoved', null, function(obj) {
+            t.fail("OpenLayers.Layer.Vector.removeFeatures triggers beforefeatureremoved while it must not");
+        });
+        layer.events.register('featureremoved', null, function(obj) {
+            t.fail("OpenLayers.Layer.Vector.removeFeatures triggers featureremoved while it must not");
+        });
+        layer.events.register('featuresremoved', null, function(obj) {
+            t.fail("OpenLayers.Layer.Vector.removeFeatures triggers featuresremoved while it must not");
+        });
+        layer.addFeatures([pointFeature1]);
+        layer.removeFeatures([pointFeature1], {silent: true});
+     }
+    
+    function test_Layer_Vector_drawFeature(t) {
+        t.plan(7);
+        var layer = new OpenLayers.Layer.Vector("Test Layer", {isBaseLayer: true});
+        var map = new OpenLayers.Map('map', {
+            maxExtent: new OpenLayers.Bounds(-100, -100, 100, 100)
+        });
+        map.addLayer(layer);
+        var geometry = new OpenLayers.Geometry.Point(10, 10);
+        var feature = new OpenLayers.Feature.Vector(geometry);
+        
+        var f, s;
+        
+        // Bogus layer renderer needs some methods
+        // for functional tests.
+        layer.drawn = true;
+        layer.renderer = {
+            drawFeature: function(feature, style) {
+                f = feature;
+                s = style;
+            },
+            root: document.createElement("div"),
+            destroy: function() { },
+            eraseFeatures: function() {},
+            setExtent: function() {}
+        };
+        
+
+        layer.drawFeature(feature);
+        t.ok(geometry.equals(f.geometry),
+             "calls layer.renderer.drawFeature() with feature.geometry");
+        
+        feature.style = {foo: "bar"};
+        layer.drawFeature(feature);
+        t.eq(feature.style, s,
+             "calls layer.renderer.drawFeature() with feature.style");
+        
+        feature.style = null;
+        layer.style = {foo: "bar"};
+        layer.drawFeature(feature);
+        t.eq(layer.style.foo, s.foo,
+             "given null feature style, uses layer style");
+
+        feature.style = {foo1: "bar1"};
+        layer.style = {foo2: "bar2"};
+        var customStyle = {foo: "bar"};
+        layer.drawFeature(feature, customStyle);
+        t.eq(customStyle.foo, s.foo,
+             "given a custom style, renders with that");
+        
+        // the real renderer's drawFeature method is tested in Renderer.html
+        layer.renderer.drawFeature = function(feature) {
+            return(feature.geometry.getBounds().intersectsBounds(map.getExtent()));
+        }
+        // reset the drawn to null as if the layer had never been rendered
+        layer.drawn = null;
+        
+        layer.drawFeature(feature);
+        t.ok(true, "Trying to draw a feature on an not drawn layer doesn't throw any error.");
+        
+        layer.addFeatures([feature]);
+        
+        map.setCenter(new OpenLayers.Bounds(0, 0, 0, 0), 6);
+        t.ok(layer.unrenderedFeatures[feature.id], "Did not render feature outside the viewport.");
+        map.panTo(new OpenLayers.LonLat(10, 10));
+        t.ok(!layer.unrenderedFeatures[feature.id], "Rendered feature inside the viewport.");
+        
+        layer.features = [];
+    }
+    
+    function test_deleted_state(t) {
+        t.plan(9);
+        
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector(null, {
+            drawn: true
+        });
+        map.addLayer(layer);
+        var feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(10, 10)
+        );
+        var log;
+        layer.renderer = {
+            drawFeature: function(f, s) {
+                log = {
+                    feature: f,
+                    style: s
+                };
+            },
+            destroy: function() {}
+        };
+        
+        // draw feature with no state
+        layer.drawFeature(feature);
+        t.ok(log.feature === feature, "[no state] drawFeature called with correct feature");
+        t.ok(log.style.display !== "none", "[no state] drawFeature called with style display not none");
+
+        // draw feature with delete style
+        feature.state = OpenLayers.State.DELETE;
+        layer.drawFeature(feature);
+        t.ok(log.feature === feature, "[delete] drawFeature called with correct feature");
+        t.eq(log.style.display, "none", "[delete] drawFeature called with style display none");
+
+        // undelete the feature and redraw
+        delete feature.state;
+        delete feature.renderIntent;
+        layer.drawFeature(feature);
+        t.ok(log.feature === feature, "[undelete] drawFeature called with correct feature");
+        t.ok(log.style.display !== "none", "[undelete] drawFeature called with style display not none");
+        
+        // change deleted style
+        layer.styleMap.styles["delete"] = new OpenLayers.Style({fillOpacity: 0.1});
+
+        // draw feature with delete style
+        feature.state = OpenLayers.State.DELETE;
+        layer.drawFeature(feature);
+        t.ok(log.feature === feature, "[draw deleted] drawFeature called with correct feature");
+        t.ok(log.style.display !== "none", "[draw deleted] drawFeature called with style display not none");
+        t.eq(log.style.fillOpacity, 0.1,"[draw deleted] drawFeature called with correct fill opacity");
+
+        
+    }
+    
+    function test_Layer_Vector_eraseFeatures(t) {
+        t.plan(2);
+        var layer = new OpenLayers.Layer.Vector("Test Layer");
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        var geometry = new OpenLayers.Geometry.Point(10, 10);
+        var feature = new OpenLayers.Feature.Vector(geometry);
+        
+        var f;
+        layer.renderer = {
+            eraseFeatures: function(features) {
+                f = features[0];
+            },
+            destroy: function() { }
+        };
+
+        layer.eraseFeatures([feature]);
+        t.ok(f, "calls layer.renderer.eraseFeatures");
+        t.ok(geometry.equals(f.geometry),
+             "calls layer.renderer.eraseFeatures() given an array of features");
+    }
+
+    function test_Layer_Vector_destroyFeatures (t) {
+        t.plan(8);
+        var layer = new OpenLayers.Layer.Vector(name);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        var features = [], i;
+        for (i = 0; i < 5; i++) {
+            features.push(new OpenLayers.Feature.Vector(
+                          new OpenLayers.Geometry.Point(0,0)));
+        }
+        layer.addFeatures(features);
+        t.eq(layer.features.length, 5, "addFeatures adds 5 features");
+        layer.selectedFeatures.push(features[0]); 
+        layer.destroyFeatures();
+        t.eq(layer.features.length, 0, "destroyFeatures triggers removal");
+        t.eq(layer.selectedFeatures, [], "Destroy features removes selected features");
+        var allDestroyed = true;
+        for (i = 0; i < 5; i++) {
+            if(features[i].geometry) {
+                allDestroyed = false;
+            }
+        }
+        t.ok(allDestroyed, "destroyFeatures actually destroys features");
+        features = [];
+        for (i = 0; i < 5; i++) {
+            features.push(new OpenLayers.Feature.Vector(
+                          new OpenLayers.Geometry.Point(0,0)));
+        }
+        layer.addFeatures(features);
+        layer.selectedFeatures.push(features[0]);
+        layer.selectedFeatures.push(features[1]);
+        layer.destroyFeatures([features[0], features[1]]);
+        t.eq(layer.features.length, 3, "destroyFeatures removes appropriate features");
+        t.eq(layer.selectedFeatures, [], "destroyFeatures removes appropriate selected features");
+        t.eq(features[0].geometry, null, "destroyFeatures destroys feature 0");
+        t.eq(features[1].geometry, null, "destroyFeatures destroys feature 1");
+    }
+
+    function test_Layer_Vector_destroy (t) {
+        t.plan(5);    
+
+        var options = {protocol: new OpenLayers.Protocol(), 
+                       strategies: [new OpenLayers.Strategy(), new OpenLayers.Strategy()]}
+        var layer = new OpenLayers.Layer.Vector(name, options);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        layer.destroy();
+        t.eq(layer.map, null, "layer.map is null after destroy");
+        t.eq(layer.getFeatureFromEvent({'target':'map'}), null, 
+            "getFeatureIdFromEvent doesn't cause an error when called on layer which has been destroyed.");
+
+        t.eq(layer.protocol, null, "layer.protocol is null after destroy");
+        t.eq(layer.strategies, null, "layer.strategies is null after destroy");
+        
+        // test that we can call layer.destroy a second time without trouble
+        try {
+            layer.destroy();
+            layer.destroy();
+            t.ok(true, "layer.destroy called twice without any issues");
+        } catch(err) {
+            t.fail("calling layer.destroy twice triggers exception: " + err + " in " + err.fileName + " line " + err.lineNumber);
+        }
+        
+    }
+    
+    function test_Layer_Vector_clone(t) {
+        t.plan(5);
+        var original = new OpenLayers.Layer.Vector(name, {dummyOption: "foo"});
+        original.addFeatures([new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,2), {foo: "bar"})]);
+        var clone = original.clone();
+        t.ok(clone instanceof OpenLayers.Layer.Vector, "clone is an instance of OpenLayers.Layer.Vector");
+        t.ok(clone.name, original.name, "clone has the same name as the original");
+        t.ok(clone.features[0] != original.features[0], "clone's feature does not equal the original's feature");
+        t.eq(clone.features[0].attributes.foo, original.features[0].attributes.foo, "clone's feature has the same attributes as the original's feature");
+        t.eq(clone.dummyOption, original.dummyOption, "clone's dummyOption equals the original's dummy option");
+    }
+
+    function test_Layer_Vector_externalGraphic(t) {
+        t.plan(11);
+        var layer = new OpenLayers.Layer.Vector("Test Layer", {isBaseLayer: true});
+        var renderer = layer.renderer;
+        var map = new OpenLayers.Map('map');
+        map.addLayers([layer]);
+
+        var geometryX = 10;
+        var geometryY = 10;
+        var geometry = new OpenLayers.Geometry.Point(geometryX, geometryY);
+        var feature = new OpenLayers.Feature.Vector(geometry);
+
+        map.zoomToMaxExtent();
+
+        var customStyle1 = new Object({
+                externalGraphic: 'test.png',
+                pointRadius: 10
+        });
+        var customStyle2 = new Object({
+                externalGraphic: 'test.png',
+                graphicWidth: 12
+        });
+        var customStyle3 = new Object({
+                externalGraphic: 'test.png',
+                graphicHeight: 14
+        });
+        var customStyle4 = new Object({
+                externalGraphic: 'test.png',
+                graphicWidth: 24,
+                graphicHeight: 16
+        });
+        var customStyle5 = new Object({
+                externalGraphic: 'test.png',
+                graphicWidth: 24,
+                graphicOpacity: 1
+        });
+        var customStyle6 = new Object({
+                externalGraphic: 'test.png',
+                graphicWidth: 24,
+                graphicHeight: 16,
+                graphicXOffset: -24,
+                graphicYOffset: -16
+        });
+               
+        var root = renderer.vectorRoot;
+        if (layer.renderer.CLASS_NAME == 'OpenLayers.Renderer.SVG') {
+                feature.style = customStyle1;
+                layer.drawFeature(feature);
+                t.eq(root.firstChild.getAttributeNS(null, 'width'),
+                             (2*customStyle1.pointRadius).toString(),
+                             "given a pointRadius, width equals 2*pointRadius");
+                t.eq(root.firstChild.getAttributeNS(null, 'height'),
+                             (2*customStyle1.pointRadius).toString(),
+                             "given a pointRadius, height equals 2*pointRadius");
+                feature.style = customStyle2;
+                layer.drawFeature(feature);
+                t.eq(root.firstChild.getAttributeNS(null, 'width'),
+                             root.firstChild.getAttributeNS(null, 'height'),
+                             "given a graphicWidth, width equals height");
+                t.eq(root.firstChild.getAttributeNS(null, 'width'),
+                             customStyle2.graphicWidth.toString(),
+                             "width is set correctly");
+                feature.style = customStyle3;
+                layer.drawFeature(feature);
+                t.eq(root.firstChild.getAttributeNS(null, 'height'),
+                             root.firstChild.getAttributeNS(null, 'width'),
+                             "given a graphicHeight, height equals width");
+                t.eq(root.firstChild.getAttributeNS(null, 'height'),
+                             customStyle3.graphicHeight.toString(),
+                             "height is set correctly");
+                feature.style = customStyle4;
+                layer.drawFeature(feature);
+                t.eq(root.firstChild.getAttributeNS(null, 'height'),
+                             customStyle4.graphicHeight.toString(),
+                             "given graphicHeight and graphicWidth, both are set: height");
+                t.eq(root.firstChild.getAttributeNS(null, 'width'),
+                             customStyle4.graphicWidth.toString(),
+                             "given graphicHeight and graphicWidth, both are set: width");
+                feature.style = customStyle5;
+                layer.drawFeature(feature);
+                t.eq(root.firstChild.getAttributeNS(null, 'style'),
+                             'opacity: '+customStyle5.graphicOpacity.toString()+((OpenLayers.Util.getBrowserName() == "opera" || OpenLayers.Util.getBrowserName() == "safari") ? "" : ';'),
+                             "graphicOpacity correctly set");
+                feature.style = customStyle6;
+                layer.drawFeature(feature);
+                var x = geometryX / renderer.getResolution() + renderer.left;
+                var y = geometryY / renderer.getResolution() - renderer.top;
+                // SVG setStyle() gets x and y using getAttributeNS(), which returns
+                // a value with only 3 decimal digits. To mimic this we use toFixed(3) here
+                x = x.toFixed(3);
+                y = y.toFixed(3);
+                // toFixed() returns a string
+                x = parseFloat(x);
+                y = parseFloat(y);
+                t.eq(root.firstChild.getAttributeNS(null, 'x'),
+                        (x + customStyle6.graphicXOffset).toFixed().toString(),
+                        "graphicXOffset correctly set");
+                t.eq(root.firstChild.getAttributeNS(null, 'y'),
+                        (-y + customStyle6.graphicYOffset).toFixed().toString(),
+                        "graphicYOffset correctly set");
+        }
+        if (layer.renderer.CLASS_NAME == 'OpenLayers.Renderer.VML') {
+                feature.style = customStyle1;
+                layer.drawFeature(feature);
+                t.eq(root.firstChild.style.width,
+                             (2*customStyle1.pointRadius).toString()+'px',
+                             "given a pointRadius, width equals 2*pointRadius");
+                t.eq(root.firstChild.style.height,
+                             (2*customStyle1.pointRadius).toString()+'px',
+                             "given a pointRadius, height equals 2*pointRadius");
+                feature.style = customStyle2;
+                layer.drawFeature(feature);
+                t.eq(root.firstChild.style.width,
+                             root.firstChild.style.height,
+                             "given a graphicWidth, width equals height");
+                t.eq(root.firstChild.style.width,
+                             customStyle2.graphicWidth.toString()+'px',
+                             "width is set correctly");
+                feature.style = customStyle3;
+                layer.drawFeature(feature);
+                t.eq(root.firstChild.style.height,
+                             root.firstChild.style.width,
+                             "given a graphicHeight, height equals width");
+                t.eq(root.firstChild.style.height,
+                             customStyle3.graphicHeight.toString()+'px',
+                             "height is set correctly");
+                feature.style = customStyle4;
+                layer.drawFeature(feature);
+                var left = parseInt(root.firstChild.style.left);
+                var top = parseInt(root.firstChild.style.top);
+                t.eq(root.firstChild.style.height,
+                             customStyle4.graphicHeight.toString()+'px',
+                             "given graphicHeight and graphicWidth, both are set: height");
+                t.eq(root.firstChild.style.width,
+                             customStyle4.graphicWidth.toString()+'px',
+                             "given graphicHeight and graphicWidth, both are set: width");
+                feature.style = customStyle5;
+                layer.renderer.clear();
+                layer.drawFeature(feature);
+                var fill = root.firstChild.getElementsByTagName("v:fill")[0];
+                var opacity;
+                if(fill) {
+                    opacity = fill.getAttribute('opacity');
+                }
+                if(opacity === undefined) {
+                    fill = root.firstChild.getElementsByTagName("fill")[0];
+                    opacity = fill.getAttribute('opacity');
+                }
+                t.eq(opacity,
+                             customStyle5.graphicOpacity,
+                             "graphicOpacity correctly set"); 
+                feature.style = customStyle6;
+                layer.drawFeature(feature);
+                var offsetLeft = parseInt(root.firstChild.style.left);
+                var offsetTop = parseInt(root.firstChild.style.top);
+                t.eq((offsetLeft-left)*2, customStyle6.graphicXOffset, "graphicXOffset correctly set");
+                t.eq((top-offsetTop)*2, customStyle6.graphicYOffset, "graphicYOffset correctly set");
+
+        }
+    }
+
+    function test_removeLayer_drawFeature(t) {
+        // test behaviour when features are redrawn while
+        // the layer has been removed from the map
+
+        t.plan(1);
+
+        // set up
+
+        var map, layer, feature;
+
+        map = new OpenLayers.Map("map");
+        map.addLayer(new OpenLayers.Layer("base", {isBaseLayer: true}));
+
+        layer = new OpenLayers.Layer.Vector("vector");
+        map.addLayer(layer);
+
+        map.zoomToMaxExtent();
+
+        feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(1.0, 1.0));
+        layer.addFeatures(feature);
+
+        // test
+
+        map.removeLayer(layer);
+        layer.drawFeature(feature);
+        layer.drawFeature(feature);
+        map.addLayer(layer);
+
+        var count = 0, node;
+        while(node = document.getElementById(feature.geometry.id)) {
+            node.parentNode.removeChild(node);
+            count++;
+        }
+
+        t.eq(count, 1, "one geometry added, one geometry removed");
+
+        // tear down
+
+        map.destroy();
+    }
+
+    function test_vectorBeforeFeatureAddedVeto(t) {
+        t.plan( 4 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.Vector("");
+        map.addLayer(layer);
+        var feature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry(1.0, 1.0));
+        layer.addFeatures([feature]);
+
+        var addedFeatures = [];
+        var beforefeatureadded_veto = function(evt) { return false; };
+        layer.events.register("beforefeatureadded", layer, beforefeatureadded_veto);
+        layer.events.register("featuresadded", layer, function(evt) {
+            if (evt.features) {
+                for (var i = 0; i < evt.features.length; i++) {
+                    addedFeatures.push(evt.features[i]);
+                }
+            }
+        });
+
+        var blankFeatures = [
+            new OpenLayers.Feature.Vector(new OpenLayers.Geometry(1.0, 1.0)),
+            new OpenLayers.Feature.Vector(new OpenLayers.Geometry(1.0, 1.0))];
+        layer.addFeatures(blankFeatures);
+
+        t.eq(layer.features.length, 1,
+            "features not added to layer after beforefeatureadded veto");
+        t.eq(addedFeatures.length, 0,
+            "no features sent to featuresadded on feature veto");
+
+        addedFeatures = [];
+
+        layer.events.unregister("beforefeatureadded", layer, beforefeatureadded_veto);
+        beforefeatureadded_veto = function(evt) { return true; };
+        layer.events.register("beforefeatureadded", layer, beforefeatureadded_veto);
+
+        layer.addFeatures(blankFeatures);
+
+        t.eq(layer.features.length, 3,
+            "features added to layer as expected");
+        t.eq(addedFeatures.length, 2,
+            "featuresadded event received expected number of features");
+    }
+
+
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/Vector/RootContainer.html b/tests/Layer/Vector/RootContainer.html
new file mode 100644
index 0000000..982e492
--- /dev/null
+++ b/tests/Layer/Vector/RootContainer.html
@@ -0,0 +1,63 @@
+<html>
+<head>
+  <script src="../../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer, map; 
+
+    function test_RootContainer_collectResetRoots(t) {
+        
+        map = new OpenLayers.Map("map");
+        var layer1 = new OpenLayers.Layer.Vector("layer1");
+        var layer2 = new OpenLayers.Layer.Vector("layer2");
+        layer = new OpenLayers.Layer.Vector.RootContainer("layer_1_2", {
+            layers: [layer1, layer2]
+        });
+        
+        // we cannot test this with a renderer that does not hava a rendererRoot
+        var plan = layer.renderer.rendererRoot ? 4 : 0;
+        t.plan(plan);
+        if(plan == 0) {
+            return;
+        }
+
+        var numRoots = layer.renderer.rendererRoot.childNodes.length;
+
+        // addLayers will call setMap() for layer, which will call collectRoots()
+        map.addLayers([layer1, layer2, layer]);
+        t.eq(layer.renderer.rendererRoot.childNodes.length, numRoots * 3, "layer has correct number of renderer roots");        
+        t.eq(layer1.renderer.rendererRoot.childNodes.length, 0, "layer1 has no own renderer root");
+        
+        layer.resetRoots();
+        t.eq(layer.renderer.rendererRoot.childNodes.length, numRoots, "roots removed from container");
+        t.eq(layer1.renderer.rendererRoot.childNodes.length, numRoots, "root re-added to original layer");
+    }
+    
+    function test_RootContainer_getFeatureFromEvent(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var layer1 = new OpenLayers.Layer.Vector("layer1");
+        var layer2 = new OpenLayers.Layer.Vector("layer2");
+        layer = new OpenLayers.Layer.Vector.RootContainer("layer_1_2", {
+            layers: [layer1, layer2]
+        });
+        map.addLayers([layer1, layer2, layer]);
+        var feature1 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0,1));
+        var feature2 = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(1,0));
+        layer1.addFeatures(feature1);
+        layer2.addFeatures(feature2);
+        t.eq(layer.getFeatureFromEvent({
+            srcElement: {
+                _featureId: feature1.id
+            }
+        }).id, feature1.id, "feature from layer1 found");
+        t.eq(layer.getFeatureFromEvent({srcElement: {
+            _featureId: feature2.id
+        }}).id, feature2.id, "feature from layer2 found");
+    }
+
+  </script>
+</head>
+<body>
+  <div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/WFS.html b/tests/Layer/WFS.html
new file mode 100644
index 0000000..a74b782
--- /dev/null
+++ b/tests/Layer/WFS.html
@@ -0,0 +1,177 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var name = "Vector Layer";
+    
+    function test_Layer_WFS_constructor(t) {
+        t.plan(3);
+
+        var layer = new OpenLayers.Layer.WFS(name, "url", {});
+        t.ok(layer instanceof OpenLayers.Layer.WFS, "new OpenLayers.Layer.Vector returns correct object" );
+        t.eq(layer.name, name, "layer name is correctly set");
+        t.ok(layer.renderer.CLASS_NAME, "layer has a renderer");
+
+    }
+    
+    function test_Layer_WFS_getDataExtent(t) {
+        t.plan(1);
+
+        var layer = new OpenLayers.Layer.WFS(name, "url", {});
+        layer.addFeatures(new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0, 0)));
+        layer.addFeatures(new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0, 1)));
+        t.eq(layer.getDataExtent().toBBOX(), "0,0,0,1", "bbox is correctly pulled from vectors.");
+
+    }
+    
+    function test_Layer_WFS_setOpacity(t) {
+        t.plan(3);
+
+        var layer = new OpenLayers.Layer.WFS(name, "url", {});
+        layer.setOpacity(.5);
+        t.eq(layer.opacity, 0.5, "vector setOpacity didn't fail");
+        var layer = new OpenLayers.Layer.WFS(name, "url", {}, {'featureClass': OpenLayers.Feature.WFS});
+        var marker = new OpenLayers.Marker(new OpenLayers.LonLat(0,0));
+        marker.setOpacity = function() {
+            t.ok(true, "Marker setOpacity was called");
+        }    
+        layer.addMarker(marker);
+        layer.setOpacity(.6);
+        t.eq(layer.opacity, 0.6, "setOpacity didn't fail on markers");
+    }
+    
+    function test_Layer_WFS_destroy(t) {
+        t.plan(13);
+        
+        var tVectorDestroy = OpenLayers.Layer.Vector.prototype.destroy;
+        OpenLayers.Layer.Vector.prototype.destroy = function() {
+            g_VectorDestroyed = true;
+        }
+
+        var tMarkersDestroy = OpenLayers.Layer.Markers.prototype.destroy;
+        OpenLayers.Layer.Markers.prototype.destroy = function() {
+            g_MarkersDestroyed = true;
+        }
+
+        var layer = {
+            'vectorMode': true,
+            'tile': {
+                'destroy': function() {
+                    t.ok(true, "wfs layer's tile is destroyed");
+                }
+            },
+            'ratio': {},
+            'featureClass': {},
+            'format': {},
+            'formatObject': {
+                'destroy': function() {
+                    t.ok(true, "wfs layer's format object is destroyed");
+                }
+            },
+            'formatOptions': {},
+            'encodeBBOX': {},
+            'extractAttributes': {}
+        };
+        
+        //this call should set off two tests (destroys for tile and format object)
+        g_VectorDestroyed = null;
+        g_MarkersDestroyed = null;        
+        OpenLayers.Layer.WFS.prototype.destroy.apply(layer, []);        
+
+        t.ok(g_VectorDestroyed && !g_MarkersDestroyed, "when vector mode is set to true, the default vector layer's destroy() method is called");
+        t.eq(layer.vectorMode, null, "'vectorMode' property nullified");
+        t.eq(layer.tile, null, "'tile' property nullified");
+        t.eq(layer.ratio, null, "'ratio' property nullified");
+        t.eq(layer.featureClass, null, "'featureClass' property nullified");
+        t.eq(layer.format, null, "'format' property nullified");
+        t.eq(layer.formatObject, null, "'formatObject' property nullified");
+        t.eq(layer.formatOptions, null, "'formatOptions' property nullified");
+        t.eq(layer.encodeBBOX, null, "'encodeBBOX' property nullified");
+        t.eq(layer.extractAttributes, null, "'extractAttributes' property nullified");
+
+        layer.vectorMode = false;
+
+        //this call will *not* set off two tests (tile and format object are null)
+        g_VectorDestroyed = null;
+        g_MarkersDestroyed = null;        
+        OpenLayers.Layer.WFS.prototype.destroy.apply(layer, []);        
+        t.ok(!g_VectorDestroyed && g_MarkersDestroyed, "when vector mode is set to false, the default markers layer's destroy() method is called");
+        
+        OpenLayers.Layer.Vector.prototype.destroy = tVectorDestroy;
+        OpenLayers.Layer.Markers.prototype.destroy = tMarkersDestroy;
+    }
+    
+    function test_Layer_WFS_mapresizevector(t) {
+        t.plan(2);
+
+        var map = new OpenLayers.Map("map");
+        map.addLayer(new OpenLayers.Layer.WMS("WMS", "url", {}));
+        var layer = new OpenLayers.Layer.WFS(name, "url", {});
+        t.ok(layer.renderer.CLASS_NAME, "layer has a renderer");
+        map.addLayer(layer);
+        setSize = false;
+        layer.renderer.setSize = function() { setSize = true; }
+        layer.onMapResize();
+        t.eq(setSize, true, "Renderer resize called on map size change.");
+        map.destroy();     
+
+    }
+    function test_Layer_WFS_drawmap(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
+        map.addLayer(layer);
+
+        layer = new OpenLayers.Layer.WFS( "Owl Survey",
+            "http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?",
+            {typename: "OWLS", maxfeatures: 10},
+            { featureClass: OpenLayers.Feature.WFS});
+        map.addLayer(layer);
+        map.addControl(new OpenLayers.Control.LayerSwitcher());
+        try { 
+            map.setCenter(new OpenLayers.LonLat(-100, 60), 3);
+        } catch (Exception) {
+        }    
+        t.eq(layer.tile.url, "http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?TYPENAME=OWLS&MAXFEATURES=10&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&SRS=EPSG%3A4326&BBOX=-187.890625,-36.6796875,-12.109375,156.6796875", "Tile URL is set correctly when not encoded");
+        map.destroy();     
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'}
+            );
+        map.addLayer(layer);
+
+        layer = new OpenLayers.Layer.WFS( "Owl Survey",
+            "http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?",
+            {typename: "OWLS", maxfeatures: 10},
+            { featureClass: OpenLayers.Feature.WFS, 'encodeBBOX': true});
+        map.addLayer(layer);
+        map.addControl(new OpenLayers.Control.LayerSwitcher());
+        try { 
+            map.setCenter(new OpenLayers.LonLat(-100, 60), 3);
+        } catch (Exception) {
+        }  
+        t.eq(layer.tile.url, "http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?TYPENAME=OWLS&MAXFEATURES=10&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&SRS=EPSG%3A4326&BBOX=-187.890625%2C-36.679687%2C-12.109375%2C156.679688", "Tile URL is set correctly when not encoded");
+        map.destroy();     
+    }
+    function test_projection_srs(t) {
+        t.plan(1);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer("",{isBaseLayer: true} ));
+        // we use an empty moveTo function because we don't want to request tiles
+        var layer = new OpenLayers.Layer.WFS("","/wfs",{},{'projection': new OpenLayers.Projection("EPSG:900913"),
+            moveTo: function() {}});
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        var params = OpenLayers.Util.getParameters(layer.getFullRequestString());
+        t.eq(params.SRS, "EPSG:900913", "SRS represents projection of WFS layer, instead of map (#1537)");   
+    }
+
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/WMS.html b/tests/Layer/WMS.html
new file mode 100644
index 0000000..50cc9ed
--- /dev/null
+++ b/tests/Layer/WMS.html
@@ -0,0 +1,496 @@
+<html>
+<head>
+    <script type="text/javascript">var oldAlert = window.alert, gMess; window.alert = function(message) {gMess = message; return true;};</script>
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script type="text/javascript">window.alert = oldAlert;</script>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer;
+
+    var name = 'Test Layer';
+    var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+    var params = { map: '/mapdata/vmap_wms.map',
+                   layers: 'basic',
+                   format: 'image/jpeg'};
+
+    function test_Layer_WMS_constructor (t) {
+        t.plan( 15 );
+
+        var trans_format = "image/png";
+        if (OpenLayers.Util.alphaHack()) { trans_format = "image/gif"; }
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        t.ok( layer instanceof OpenLayers.Layer.WMS, "new OpenLayers.Layer.WMS returns object" );
+        t.eq( layer.url, "http://octo.metacarta.com/cgi-bin/mapserv", "layer.url is correct (HTTPRequest inited)" );
+        t.eq( layer.params.MAP, "/mapdata/vmap_wms.map", "params passed in correctly uppercased" );
+
+        t.eq( layer.params.SERVICE, "WMS", "default params correclty uppercased and copied");
+
+        t.eq(layer.isBaseLayer, true, "no transparency setting, wms is baselayer");
+
+        params.TRANSPARENT = "true";
+        var layer2 = new OpenLayers.Layer.WMS(name, url, params);
+        t.eq(layer2.isBaseLayer, false, "transparency == 'true', wms is not baselayer");
+
+        params.TRANSPARENT = "TRUE";
+        var layer3 = new OpenLayers.Layer.WMS(name, url, params);
+        t.eq(layer3.isBaseLayer, false, "transparency == 'TRUE', wms is not baselayer");
+        t.eq(layer3.params.FORMAT, trans_format, "transparent = TRUE causes non-image/jpeg format");
+
+        params.TRANSPARENT = "TRuE";
+        var layer4 = new OpenLayers.Layer.WMS(name, url, params);
+        t.eq(layer4.isBaseLayer, false, "transparency == 'TRuE', wms is not baselayer");
+        t.eq(layer4.params.FORMAT, trans_format, "transparent = TRuE causes non-image/jpeg format");
+
+        params.TRANSPARENT = true;
+        var layer5 = new OpenLayers.Layer.WMS(name, url, params);
+        t.eq(layer5.isBaseLayer, false, "transparency == true, wms is not baselayer");
+        t.eq(layer5.params.FORMAT, trans_format, "transparent = true causes non-image/jpeg format");
+
+        params.TRANSPARENT = false;
+        var layer6 = new OpenLayers.Layer.WMS(name, url, params);
+        t.eq(layer6.isBaseLayer, true, "transparency == false, wms is baselayer");
+
+        params.TRANSPARENT = true;
+        var layer7 = new OpenLayers.Layer.WMS(name, url, params, {noMagic: true});
+        t.eq(layer7.params.FORMAT, "image/jpeg", "When using noMagic true image/jpeg will not be automagically switched to image/png or image/gif if transparent");
+
+        params.TRANSPARENT = true;
+        var layer8 = new OpenLayers.Layer.WMS(name, url, params, {noMagic: true});
+        t.eq(layer8.isBaseLayer, true, "When using noMagic then transparent means the wms layer is not automagically changed to not being a baselayer");
+
+        params.TRANSPARENT = false;
+
+    }
+
+    function test_Layer_WMS_addtile (t) {
+        t.plan( 6 );
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        var pixel = new OpenLayers.Pixel(5,6);
+        var tile = layer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
+        tile.draw();
+
+        var img = tile.imgDiv;
+        var tParams = OpenLayers.Util.extend({},
+                        OpenLayers.Util.upperCaseObject(params));
+        tParams = OpenLayers.Util.extend(tParams, {
+            SERVICE: "WMS", VERSION: "1.1.1",
+            REQUEST: "GetMap", STYLES: "",
+            EXCEPTIONS: "application/vnd.ogc.se_inimage",
+            SRS: "EPSG:4326", BBOX: [1,2,3,4],
+            WIDTH: "256", HEIGHT: "256"
+        });
+        t.eq( img.src,
+             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             "image src is created correctly via addtile" );
+        t.eq( tile.frame.style.top, "6px", "image top is set correctly via addtile" );
+        t.eq( tile.frame.style.left, "5px", "image top is set correctly via addtile" );
+
+        var firstChild = layer.div.firstChild.firstChild;
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( firstChild instanceof HTMLElement, "div first child is an image object" );
+        t.eq( firstChild.src,
+             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             "div first child is correct image object" );
+        t.eq( tile.position.toString(), "x=5,y=6", "Position of tile is set correctly." );
+        map.destroy();
+    }
+
+    function test_Layer_WMS_bboxEncoding (t) {
+        t.plan( 6 );
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url, params, {encodeBBOX:true});
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        var pixel = new OpenLayers.Pixel(5,6);
+        var tile = layer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
+        tile.draw();
+
+        var img = tile.imgDiv;
+        var tParams = OpenLayers.Util.extend({},
+                        OpenLayers.Util.upperCaseObject(params));
+        tParams = OpenLayers.Util.extend(tParams, {
+            SERVICE: "WMS", VERSION: "1.1.1",
+            REQUEST: "GetMap", STYLES: "",
+            EXCEPTIONS: "application/vnd.ogc.se_inimage",
+            SRS: "EPSG:4326", BBOX: "1,2,3,4",
+            WIDTH: "256", HEIGHT: "256"
+        });
+        t.eq( img.src,
+             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             "image src is created correctly via addtile" );
+        t.eq( tile.frame.style.top, "6px", "image top is set correctly via addtile" );
+        t.eq( tile.frame.style.left, "5px", "image top is set correctly via addtile" );
+
+        var firstChild = layer.div.firstChild.firstChild;
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( firstChild instanceof HTMLElement, "div first child is an image object" );
+        t.eq( firstChild.src,
+             url + "?" + OpenLayers.Util.getParameterString(tParams),
+             "div first child is correct image object" );
+        t.eq( tile.position.toString(), "x=5,y=6", "Position of tile is set correctly." );
+        map.destroy();
+    }
+
+    function test_Layer_WMS_inittiles (t) {
+        t.plan( 2 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0),5);
+        t.eq( layer.grid.length, 7, "Grid rows is correct." );
+        t.eq( layer.grid[0].length, 6, "Grid cols is correct." );
+        map.destroy();
+    }
+
+
+    function test_Layer_WMS_clone (t) {
+        t.plan(4);
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        var options = {tileSize: new OpenLayers.Size(500,50)};
+        var map = new OpenLayers.Map('map', options);
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+
+        layer.grid = [ [6, 7],
+                       [8, 9]];
+
+        var clone = layer.clone();
+
+        t.ok( clone.grid != layer.grid, "clone does not copy grid");
+
+        t.ok( clone.tileSize.equals(layer.tileSize), "tileSize correctly cloned");
+
+        layer.tileSize.w += 40;
+
+        t.eq( clone.tileSize.w, 500, "changing layer.tileSize does not change clone.tileSize -- a fresh copy was made, not just copied reference");
+
+        t.eq( clone.alpha, layer.alpha, "alpha copied correctly");
+
+        layer.grid = null;
+        map.destroy();
+    }
+
+    function test_Layer_WMS_isBaseLayer(t) {
+        t.plan(3);
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        t.ok( layer.isBaseLayer, "baselayer is true by default");
+
+        var newParams = OpenLayers.Util.extend({}, params);
+        newParams.transparent = "true";
+        layer = new OpenLayers.Layer.WMS(name, url, newParams);
+        t.ok( !layer.isBaseLayer, "baselayer is false when transparent is set to true");
+
+        layer = new OpenLayers.Layer.WMS(name, url, params, {isBaseLayer: false});
+        t.ok( !layer.isBaseLayer, "baselayer is false when option is set to false" );
+    }
+
+    function test_Layer_WMS_mergeNewParams (t) {
+        t.plan( 4 );
+
+        var map = new OpenLayers.Map("map");
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+
+        var newParams = { layers: 'sooper',
+                          chickpeas: 'image/png'};
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+
+        layer.redraw = function() {
+            t.ok(true, "layer is redrawn after new params merged");
+        }
+
+        layer.mergeNewParams(newParams);
+
+        t.eq( layer.params.LAYERS, "sooper", "mergeNewParams() overwrites well");
+        t.eq( layer.params.CHICKPEAS, "image/png", "mergeNewParams() adds well");
+
+        newParams.CHICKPEAS = 151;
+
+        t.eq( layer.params.CHICKPEAS, "image/png", "mergeNewParams() makes clean copy of hashtable");
+        map.destroy();
+    }
+
+    function test_Layer_WMS_getFullRequestString (t) {
+
+
+        t.plan( 2 );
+        var map = new OpenLayers.Map('map');
+        map.projection = "xx";
+        tUrl = "http://octo.metacarta.com/cgi-bin/mapserv";
+        tParams = { layers: 'basic',
+                   format: 'image/png'};
+        var tLayer = new OpenLayers.Layer.WMS(name, tUrl, tParams);
+        map.addLayer(tLayer);
+        str = tLayer.getFullRequestString();
+        var tParams = {
+            LAYERS: "basic", FORMAT: "image/png", SERVICE: "WMS",
+            VERSION: "1.1.1", REQUEST: "GetMap", STYLES: "",
+            EXCEPTIONS: "application/vnd.ogc.se_inimage", SRS: "xx"
+        };
+        t.eq(str,
+             tUrl + "?" + OpenLayers.Util.getParameterString(tParams),
+             "getFullRequestString() adds SRS value");
+
+        map.removeLayer(tLayer);
+        tLayer.projection = "none";
+        map.addLayer(tLayer);
+        str = tLayer.getFullRequestString();
+        delete tParams['SRS'];
+        t.eq(str,
+             tUrl + "?" + OpenLayers.Util.getParameterString(tParams),
+             "getFullRequestString() by default does *not* add SRS value if projection is 'none'");
+        map.destroy();
+
+    }
+
+    function test_Layer_WMS_setOpacity (t) {
+        t.plan( 5 );
+
+        var map = new OpenLayers.Map('map');
+        map.projection = "xx";
+        tUrl = "http://octo.metacarta.com/cgi-bin/mapserv";
+        tParams = { layers: 'basic',
+                   format: 'image/png'};
+        tOptions = { 'opacity': '0.5' };
+        var tLayer = new OpenLayers.Layer.WMS(name, tUrl, tParams, tOptions);
+        map.addLayer(tLayer);
+        map.zoomToMaxExtent();
+        t.eq(tLayer.opacity, "0.5", "Opacity is set correctly");
+        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.5, "Opacity on tile is correct");
+        tLayer.setOpacity("0.6");
+        t.eq(tLayer.opacity, "0.6", "setOpacity works properly");
+        t.eq(parseFloat(tLayer.div.firstChild.firstChild.style.opacity), 0.6, "Opacity on tile is changed correctly");
+        var pixel = new OpenLayers.Pixel(5,6);
+        var tile = tLayer.addTile(new OpenLayers.Bounds(1,2,3,4), pixel);
+        tile.draw();
+        t.eq(parseFloat(tile.imgDiv.style.opacity), 0.6, "Tile opacity is set correctly");
+
+        map.destroy();
+    }
+
+    function test_Layer_WMS_Reproject (t) {
+        var validkey = (window.location.protocol == "file:") ||
+                       (window.location.host == "localhost") ||
+                       (window.location.host == "openlayers.org");
+        if (OpenLayers.Util.getBrowserName() == "opera" || OpenLayers.Util.getBrowserName() == "safari") {
+            t.plan(1);
+            t.debug_print("Can't test google reprojection in Opera or Safari.");
+        } else if(validkey) {
+            t.plan(5);
+
+            var map = new OpenLayers.Map('map');
+            var layer = new OpenLayers.Layer.Google("Google");
+            map.addLayer(layer);
+            var wmslayer = new OpenLayers.Layer.WMS(name, url, params,
+                                                    {isBaseLayer: false, reproject:true});
+            wmslayer.isBaseLayer=false;
+            map.addLayer(wmslayer);
+            map.setCenter(new OpenLayers.LonLat(0,0), 5);
+            var tile = wmslayer.grid[0][0];
+            t.eq( tile.bounds.left, -22.5, "left side matches" );
+            t.eq( tile.bounds.right, -11.25, "right side matches" );
+            t.eq( tile.bounds.bottom.toFixed(6), '11.178402', "bottom side matches" );
+            t.eq( tile.bounds.top.toFixed(6), '21.943046', "top side matches" );
+            map.destroy();
+        } else {
+            t.plan(1);
+            t.debug_print("can't test google layer from " +
+                          window.location.host);
+        }
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        var tile = layer.grid[0][0];
+        t.ok( tile.bounds.equals(new OpenLayers.Bounds(-33.75, 33.75, -22.5, 45)), "okay");
+
+        map.destroy();
+    }
+
+    function test_Layer_WMS_noGutters (t) {
+        t.plan(2);
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("no gutter layer", url, params, {gutter: 0});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        var tile = layer.grid[0][0];
+        var request = layer.getURL(tile.bounds);
+        var args = OpenLayers.Util.getParameters(request);
+        t.eq(parseInt(args['WIDTH']),
+             tile.size.w,
+             "layer without gutter requests images that are as wide as the tile");
+        t.eq(parseInt(args['HEIGHT']),
+             tile.size.h,
+             "layer without gutter requests images that are as tall as the tile");
+
+        layer.destroy();
+        map.destroy();
+    }
+
+    function test_Layer_WMS_gutters (t) {
+        t.plan(2);
+        var gutter = 15;
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS("gutter layer", url, params, {gutter: gutter});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        var tile = layer.grid[0][0];
+        var request = layer.getURL(tile.bounds);
+        var args = OpenLayers.Util.getParameters(request);
+        t.eq(parseInt(args['WIDTH']),
+             tile.size.w + (2 * gutter),
+             "layer with gutter requests images that are wider by twice the gutter");
+        t.eq(parseInt(args['HEIGHT']),
+             tile.size.h + (2 * gutter),
+             "layer with gutter requests images that are taller by twice the gutter");
+
+        layer.destroy();
+        map.destroy();
+
+    }
+
+    // DEPRECATED -- REMOVE IN 3.0
+    function test_Layer_Untiled_WMS(t) {
+        t.plan(1);
+
+        var layer = new OpenLayers.Layer.WMS.Untiled();
+
+        var clone = layer.clone();
+
+        t.ok(clone.singleTile, "regression test: clone works. this is for #1013");
+    }
+
+    function test_Layer_WMS_destroy (t) {
+
+        t.plan( 1 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];
+
+        layer.destroy();
+
+    // checks to make sure superclass (grid) destroy() was called
+
+        t.ok( layer.grid == null, "grid set to null");
+    }
+
+    function test_Layer_WMS_v13(t) {
+
+        t.plan(6);
+
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map = new OpenLayers.Map( 'map' );
+        var layer = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://myserver.org/wms?",
+            {layers: 'mylayer', version: '1.3.0'},
+            {singleTile: true}
+        );
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+
+        var url = layer.getURL(map.getExtent());
+        var params = url.split("&");
+        var bbox;
+        for (var i=0, len=params.length; i<len; i++) {
+            var param = params[i];
+            var a = param.split('=');
+            if (a[0] === 'BBOX') {
+                bbox = a[1];
+                break;
+            }
+        }
+
+        t.eq(layer.params.CRS, "EPSG:4326", "In WMS 1.3 SRS is now CRS");
+        t.eq(bbox, "27.9150390625,-5.986328125,52.0849609375,15.986328125", "Axis sequence is lat lon for EPSG:4326 in WMS 1.3.0");
+
+        var layer2 = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://myserver.org/wms?",
+            {layers: 'mylayer', version: '1.1.1'},
+            {singleTile: true}
+        );
+        map.addLayer(layer2);
+
+        var url = layer2.getURL(map.getExtent());
+        var params = url.split("&");
+        var bbox;
+        for (var i=0, len=params.length; i<len; i++) {
+            var param = params[i];
+            var a = param.split('=');
+            if (a[0] === 'BBOX') {
+                bbox = a[1];
+                break;
+            }
+        }
+
+        t.eq(layer2.params.SRS, "EPSG:4326", "In WMS 1.1.1 parameter is called SRS");
+        t.eq(bbox, "-5.986328125,27.9150390625,15.986328125,52.0849609375", "Axis sequence is lon lat for EPSG:4326 in WMS 1.1.1");
+
+        map.destroy();
+
+        // CRS:84 has normal axis sequence (lon lat)
+        var map = new OpenLayers.Map( 'map', {projection: 'CRS:84'} );
+        var layer = new OpenLayers.Layer.WMS(
+            "OpenLayers WMS",
+            "http://myserver.org/wms?",
+            {layers: 'mylayer', version: '1.3.0'},
+            {singleTile: true}
+        );
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+
+        var url = layer.getURL(map.getExtent());
+        var params = url.split("&");
+        var bbox, exceptions;
+        for (var i=0, len=params.length; i<len; i++) {
+            var param = params[i];
+            var a = param.split('=');
+            if (a[0] === 'EXCEPTIONS') {
+                exceptions = a[1];
+            }
+            if (a[0] === 'BBOX') {
+                bbox = a[1];
+            }
+        }
+
+        t.eq(exceptions, "INIMAGE", "If not set, EXCEPTIONS should be INIMAGE for WMS 1.3");
+        t.eq(bbox, "-5.986328125,27.9150390625,15.986328125,52.0849609375", "Axis sequence for CRS:84 is lon lat");
+
+        map.destroy();
+
+    }
+
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/WMS/Post.html b/tests/Layer/WMS/Post.html
new file mode 100644
index 0000000..649cc23
--- /dev/null
+++ b/tests/Layer/WMS/Post.html
@@ -0,0 +1,86 @@
+<html>
+<head>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var isOpera   = (navigator.userAgent.indexOf("Opera") != -1);
+    var layer;
+
+    var name = 'Test Layer';
+    var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+    var params = { map: '/mapdata/vmap_wms.map', 
+                   layers: 'basic', 
+                   format: 'image/jpeg'};
+
+    function test_Layer_WMS_Post_constructor (t) {
+        t.plan( 2 );
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS.Post(name, url, params);
+
+        t.ok(
+            layer.tileClass == OpenLayers.Tile.Image.IFrame,
+            "instantiate OpenLayers.Tile.Image.IFrame tiles.");
+
+        layer.destroy();
+
+        var options = { unsupportedBrowsers: [OpenLayers.Util.getBrowserName()]};
+        layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
+        t.ok(
+            layer.tileClass == OpenLayers.Tile.Image,
+            "unsupported browser instantiate Image tiles.");
+        layer.destroy();
+    }
+
+    function test_Layer_WMS_Post_addtile (t) {
+        t.plan( 3 );
+    
+        layer = new OpenLayers.Layer.WMS.Post(name, url, params);
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var pixel  = new OpenLayers.Pixel(5,6);
+        var tile   = layer.addTile(bounds, pixel);
+        
+        if(isMozilla || isOpera) {
+            t.ok(
+                tile instanceof OpenLayers.Tile.Image,
+                "tile is an instance of OpenLayers.Tile.Image");
+        }
+        else {
+            t.ok(
+                tile instanceof OpenLayers.Tile.Image.IFrame,
+                "tile is an instance of OpenLayers.Tile.Image.IFrame");
+        }
+        map.destroy();
+
+        var browserName = OpenLayers.Util.getBrowserName();
+        var options = { unsupportedBrowsers: [browserName]};
+
+        // test the unsupported browser
+        layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
+        map   = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        tile  = layer.addTile(bounds, pixel);
+        t.ok(
+            tile instanceof OpenLayers.Tile.Image,
+            "unsupported browser: tile is an instance of Tile.Image");
+        layer.destroy();
+
+        // test a supported browser
+        OpenLayers.Util.getBrowserName = function () { return 'not_' + browserName };
+        layer = new OpenLayers.Layer.WMS.Post(name, url, params, options);
+        map.addLayer(layer);
+        var tile2 = layer.addTile(bounds, pixel);
+        t.ok(
+            tile2 instanceof OpenLayers.Tile.Image.IFrame,
+            "supported browser: tile is an instance of Tile.Image.IFrame");
+        map.destroy();
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/WMTS.html b/tests/Layer/WMTS.html
new file mode 100644
index 0000000..b733bac
--- /dev/null
+++ b/tests/Layer/WMTS.html
@@ -0,0 +1,1424 @@
+<html>
+    <head>
+        <script src="../../lib/OpenLayers.js"></script>
+        <script type="text/javascript">    
+
+            function test_constructor(t) {
+                t.plan(6);        
+                var xml = document.getElementById("capabilities").firstChild.nodeValue;
+                var doc = new OpenLayers.Format.XML().read(xml);
+                var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
+            
+                var layer0 = new OpenLayers.Layer.WMTS({
+                    name: "GeoWebCache USA WMTS", 
+                    url: "http://example.com/geowebcache-1.2.2/service/wmts/",
+                    layer: "arcgis-online-wms",
+                    style: "",
+                    matrixSet: "arcgis-online-wgs84",                
+                    format: "image/png",
+                    isBaseLayer: false,
+                    requestEncoding: "KVP",
+                    maxResolution: 0.3521969032857032,
+                    numZoomLevels: 7,
+                    matrixIds: obj.contents.tileMatrixSets["arcgis-online-wgs84"].matrixIds
+                });
+
+                t.ok(layer0 instanceof OpenLayers.Layer.WMTS, "constructor returns instance of OpenLayers.Layer.WMTS");
+                t.eq(layer0.formatSuffix, "png", "formatSuffix is set correct based on 'format' parameter");
+                
+                var layer1 = new OpenLayers.Layer.WMTS({
+                    name: "Blue Marble WMTS",  
+                    url: "http://example.com/wmts/",
+                    layer: "world",
+                    style: "blue_marble",
+                    matrixSet: "arcgis_online",
+                    tileSize: new OpenLayers.Size(512, 512),            
+                    requestEncoding: "REST"            
+                });
+
+                t.ok(layer1 instanceof OpenLayers.Layer.WMTS, "constructor returns instance of OpenLayers.Layer.WMTS");
+                t.eq(layer1.formatSuffix, "jpg", "formatSuffix is set correct based on default format");
+                t.eq(layer1.tileSize.w, 512.0, "tileSize w is set correctly");
+                t.eq(layer1.tileSize.h, 512.0, "tileSize h is set correctly");
+            }
+
+            function test_moveTo(t) {
+                t.plan(9);        
+                var xml = document.getElementById("capabilities").firstChild.nodeValue;
+                var doc = new OpenLayers.Format.XML().read(xml);
+                var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
+            
+                var layer0 = new OpenLayers.Layer.WMTS({
+                    name: "GeoWebCache USA WMTS", 
+                    url: "http://example.com/geowebcache-1.2.2/service/wmts/",
+                    layer: "arcgis-online-wms",
+                    style: "foo",
+                    matrixSet: "arcgis-online-wgs84",    
+                    format: "image/png",
+                    requestEncoding: "KVP",
+                    maxResolution: 0.3521969032857032,
+                    numZoomLevels: 7,
+                    matrixIds: obj.contents.tileMatrixSets["arcgis-online-wgs84"].matrixIds
+                });   
+
+                var map = new OpenLayers.Map('map');
+                map.addLayer(layer0);
+                
+                map.setCenter(new OpenLayers.LonLat(-97, 38), 1);
+                
+                t.ok((layer0.tileOrigin instanceof OpenLayers.LonLat), "tileOrigin is an instance of OpenLayers.LonLat");
+                t.ok((layer0.tileOrigin.lon == -180 && layer0.tileOrigin.lat == 90), "tileOrigin is set correctly");
+                t.ok((layer0.tileSize instanceof OpenLayers.Size), "tileSize is an instance of OpenLayers.Size");
+                t.eq(layer0.tileSize.w, 256.0, "tileSize w is set correctly");
+                t.eq(layer0.tileSize.h, 256.0, "tileSize h is set correctly");
+
+                map.setCenter(new OpenLayers.LonLat(-97.0, 38.0), 6);
+                
+                t.eq(layer0.tileOrigin.lon, -175, "tileOrigin.lat updated correctly when zoom changed"); 
+                t.eq(layer0.tileOrigin.lat, 85, "tileOrigin.lat updated correctly when zoom changed");                
+                t.eq(layer0.tileSize.w, 512.0, "tileSize w updated correctly when zoom changed");
+                t.eq(layer0.tileSize.h, 512.0, "tileSize h updated correctly when zoom changed");                    
+
+                map.destroy();
+            }
+
+            function test_clearTiles (t) {
+                t.plan(1);
+                var map = new OpenLayers.Map('map');
+
+                var layer1 = new OpenLayers.Layer.WMTS({
+                    name: "Blue Marble WMTS",
+                    url: "http://example.com/wmts/",
+                    layer: "world",
+                    style: "blue_marble",
+                    matrixSet: "arcgis_online",
+                    tileSize: new OpenLayers.Size(512, 512),            
+                    requestEncoding: "REST"            
+                });
+                
+                map.addLayer(layer1);
+                map.setCenter(new OpenLayers.LonLat(0,0));
+
+                //grab a reference to one of the tiles
+                var tile = layer1.grid[0][0];        
+
+                layer1.clearGrid();
+
+                t.ok( layer1.grid != null, "layer.grid does not get nullified" );
+                map.destroy();
+            }
+
+            function test_getTilesBounds(t) {
+                t.plan(1);
+                var layer1 = new OpenLayers.Layer.WMTS({ 
+                    name: "Blue Marble WMTS",  
+                    url: "http://example.com/wmts/",
+                    layer: "world",
+                    style: "blue_marble",
+                    matrixSet: "arcgis_online",
+                    tileSize: new OpenLayers.Size(512, 512),            
+                    requestEncoding: "REST"            
+                });
+                var bl = {bounds: new OpenLayers.Bounds(1,2,0,0)};
+                var tr = {bounds: new OpenLayers.Bounds(0,0,3,4)};
+                layer1.grid = [[6, tr],[bl, 7]];
+                var bounds = layer1.getTilesBounds();            
+                var testBounds = new OpenLayers.Bounds(1,2,3,4);                
+                t.ok(bounds.equals(testBounds), "correct bounds");                
+            }
+
+            function test_getResolution(t) {
+                t.plan(1);
+                var map = new OpenLayers.Map('map');
+                var layer1 = new OpenLayers.Layer.WMTS({
+                    name: "Blue Marble WMTS",  
+                    url: "http://example.com/wmts/",
+                    layer: "world",
+                    style: "blue_marble",
+                    matrixSet: "arcgis_online",
+                    tileSize: new OpenLayers.Size(512, 512),            
+                    requestEncoding: "REST"            
+                });
+                map.addLayer(layer1);
+                map.zoom = 5;
+                t.eq(layer1.getResolution(), 0.0439453125, "getResolution() returns correct value");
+                map.destroy();
+            }
+
+            function test_getZoomForExtent(t) {
+                t.plan(2);
+                var bounds, zoom;
+
+                var map = new OpenLayers.Map('map');
+                var layer1 = new OpenLayers.Layer.WMTS({
+                    name: "Blue Marble WMTS",  
+                    url: "http://example.com/wmts/",
+                    layer: "world",
+                    style: "blue_marble",
+                    matrixSet: "arcgis_online",
+                    tileSize: new OpenLayers.Size(512, 512),            
+                    requestEncoding: "REST"            
+                });                                
+                map.addLayer(layer1);
+                bounds = new OpenLayers.Bounds(10,10,12,12);
+                zoom = layer1.getZoomForExtent(bounds);
+                t.eq(zoom, 8, "correct value for (10,10,12,12)");
+                bounds = new OpenLayers.Bounds(10,10,100,100);
+                zoom = layer1.getZoomForExtent(bounds);
+                t.eq(zoom, 3, "correct value (10,10,100,100)");
+                map.destroy();
+            }   
+
+            function test_getURL(t) {
+                t.plan(2);
+                var xml = document.getElementById("capabilities").firstChild.nodeValue;
+                var doc = new OpenLayers.Format.XML().read(xml);
+                var obj = new OpenLayers.Format.WMTSCapabilities().read(doc);
+            
+                var layer0 = new OpenLayers.Layer.WMTS({
+                    name: "GeoWebCache USA WMTS", 
+                    url: "http://example.com/geowebcache-1.2.2/service/wmts/",
+                    layer: "arcgis-online-wms",
+                    style: "foo",
+                    matrixSet: "arcgis-online-wgs84",                
+                    format: "image/png",
+                    requestEncoding: "KVP",
+                    maxResolution: 0.3521969032857032,
+                    numZoomLevels: 7,
+                    matrixIds: obj.contents.tileMatrixSets["arcgis-online-wgs84"].matrixIds
+                }); 
+                 
+                var layer1 = new OpenLayers.Layer.WMTS({
+                    name: "Blue Marble WMTS",  
+                    url: "http://example.com/wmts/",
+                    layer: "world",
+                    style: "blue_marble",
+                    matrixSet: "arcgis_online",
+                    format: "image/jpeg",
+                    tileSize: new OpenLayers.Size(512, 512),            
+                    requestEncoding: "REST",
+                    isBaseLayer: false            
+                });     
+
+                var options = {
+                    controls: [            
+                        new OpenLayers.Control.LayerSwitcher(),
+                        new OpenLayers.Control.Navigation(),   
+                        new OpenLayers.Control.PanZoom()
+                    ],
+                    projection: "EPSG:4326",                                    
+                    maxResolution: 0.3515625,
+                    maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90)
+                };    
+                var map = new OpenLayers.Map('map', options);
+                map.addLayers([layer0,layer1]);
+                map.setCenter(new OpenLayers.LonLat(-97.0, 38.0), 1);
+                var tileurl0 = layer0.getURL(new OpenLayers.Bounds(-135.0, 0.0, -90.0, 45.0));
+                t.ok(OpenLayers.Util.isEquivalentUrl(tileurl0, "http://example.com/geowebcache-1.2.2/service/wmts/?LAYER=arcgis-online-wms&STYLE=foo&TILEMATRIXSET=arcgis-online-wgs84&FORMAT=image%2Fpng&SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&TILEMATRIX=arcgis-online-wgs84%3A1&TILEROW=1&TILECOL=1"), "layer0 getURL returns correct url");
+
+                var tileurl1 = layer1.getURL(new OpenLayers.Bounds(-180.0, 0.0, -90.0, 90.0));
+                t.eq(tileurl1, "http://example.com/wmts/1.0.0/world/blue_marble/arcgis_online/1/0/0.jpg", "layer1 getURL returns correct url");                                        
+                map.destroy();
+            }
+            
+            function test_destroy (t) {
+                t.plan(3);
+                var map = new OpenLayers.Map('map');
+                var layer1 = new OpenLayers.Layer.WMTS({
+                    name: "Blue Marble WMTS",  
+                    url: "http://example.com/wmts/",
+                    layer: "world",
+                    style: "blue_marble",
+                    matrixSet: "arcgis_online",
+                    tileSize: new OpenLayers.Size(512, 512),            
+                    requestEncoding: "REST"            
+                });    
+                map.addLayer(layer1);
+                layer1.destroy();
+                t.eq( layer1.grid, null, "layer.grid is null after destroy" );
+                t.eq( layer1.tileSize, null, "layer.tileSize is null after destroy" );
+
+                //test with tile creation
+                var layer2 = new OpenLayers.Layer.WMTS({
+                    name: "Blue Marble WMTS",  
+                    url: "http://example.com/wmts/",
+                    layer: "world",
+                    style: "blue_marble",
+                    matrixSet: "arcgis_online",
+                    tileSize: new OpenLayers.Size(512, 512),            
+                    requestEncoding: "REST"            
+                });    
+                map.addLayer(layer2);
+                map.setCenter(new OpenLayers.LonLat(0,0), 5);
+                //grab a reference to one of the tiles
+                var tile = layer2.grid[0][0];        
+
+                layer2.destroy();
+
+                t.ok( layer2.grid == null, "tiles appropriately destroyed");
+                map.destroy();
+            }    
+        </script>
+    </head>
+    <body>
+        <div id="map" style="width:1024px;height:512px;"></div>
+        <div id="capabilities"><!--
+<Capabilities xmlns="http://www.opengis.net/wmts/1.0"
+xmlns:ows="http://www.opengis.net/ows/1.1"
+xmlns:xlink="http://www.w3.org/1999/xlink"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://geowebcache.org/schema/opengis/wmts/1.0.0/wmtsGetCapabilities_response.xsd"
+version="1.0.0">
+<ows:ServiceIdentification>
+  <ows:Title>Web Map Tile Service - GeoWebCache</ows:Title>
+  <ows:ServiceType>OGC WMTS</ows:ServiceType>
+  <ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
+</ows:ServiceIdentification>
+<ows:ServiceProvider>
+  <ows:ProviderName>http://example.com/geowebcache-1.2.2/service/wmts</ows:ProviderName>
+  <ows:ProviderSite xlink:href="http://example.com/geowebcache-1.2.2/service/wmts" />
+  <ows:ServiceContact>
+    <ows:IndividualName>GeoWebCache User</ows:IndividualName>
+  </ows:ServiceContact>
+</ows:ServiceProvider>
+<ows:OperationsMetadata>
+  <ows:Operation name="GetCapabilities">
+    <ows:DCP>
+      <ows:HTTP>
+        <ows:Get xlink:href="http://example.com/geowebcache-1.2.2/service/wmts?">
+          <ows:Constraint name="GetEncoding">
+            <ows:AllowedValues>
+              <ows:Value>KVP</ows:Value>
+            </ows:AllowedValues>
+          </ows:Constraint>
+        </ows:Get>
+      </ows:HTTP>
+    </ows:DCP>
+  </ows:Operation>
+  <ows:Operation name="GetTile">
+    <ows:DCP>
+      <ows:HTTP>
+        <ows:Get xlink:href="http://example.com/geowebcache-1.2.2/service/wmts?">
+          <ows:Constraint name="GetEncoding">
+            <ows:AllowedValues>
+              <ows:Value>KVP</ows:Value>
+            </ows:AllowedValues>
+          </ows:Constraint>
+        </ows:Get>
+      </ows:HTTP>
+    </ows:DCP>
+  </ows:Operation>
+  <ows:Operation name="GetFeatureInfo">
+    <ows:DCP>
+      <ows:HTTP>
+        <ows:Get xlink:href="http://example.com/geowebcache-1.2.2/service/wmts?">
+          <ows:Constraint name="GetEncoding">
+            <ows:AllowedValues>
+              <ows:Value>KVP</ows:Value>
+            </ows:AllowedValues>
+          </ows:Constraint>
+        </ows:Get>
+      </ows:HTTP>
+    </ows:DCP>
+  </ows:Operation>
+</ows:OperationsMetadata>
+<Contents>
+  <Layer>
+    <ows:Title>arcgis-online-wms</ows:Title>
+    <ows:Abstract>arcgis-online-wms</ows:Abstract>
+    <ows:WGS84BoundingBox>
+      <ows:LowerCorner>-180.0 -90.0</ows:LowerCorner>
+      <ows:UpperCorner>180.0 90.0</ows:UpperCorner>
+    </ows:WGS84BoundingBox>
+    <ows:Identifier>arcgis-online-wms</ows:Identifier>
+    <Style isDefault="true">
+      <ows:Identifier>_null</ows:Identifier>
+    </Style>
+    <Format>image/png</Format>
+    <Format>image/jpeg</Format>
+    <TileMatrixSetLink>      <TileMatrixSet>arcgis-online-wgs84</TileMatrixSet>
+    </TileMatrixSetLink>  </Layer>
+  <TileMatrixSet>
+    <ows:Identifier>EPSG:4326</ows:Identifier>
+    <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4326</ows:SupportedCRS>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:0</ows:Identifier>
+      <ScaleDenominator>2.795411320143589E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2</MatrixWidth>
+      <MatrixHeight>1</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:1</ows:Identifier>
+      <ScaleDenominator>1.3977056600717944E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>4</MatrixWidth>
+      <MatrixHeight>2</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:2</ows:Identifier>
+      <ScaleDenominator>6.988528300358972E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>8</MatrixWidth>
+      <MatrixHeight>4</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:3</ows:Identifier>
+      <ScaleDenominator>3.494264150179486E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16</MatrixWidth>
+      <MatrixHeight>8</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:4</ows:Identifier>
+      <ScaleDenominator>1.747132075089743E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>32</MatrixWidth>
+      <MatrixHeight>16</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:5</ows:Identifier>
+      <ScaleDenominator>8735660.375448715</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>64</MatrixWidth>
+      <MatrixHeight>32</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:6</ows:Identifier>
+      <ScaleDenominator>4367830.1877243575</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>128</MatrixWidth>
+      <MatrixHeight>64</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:7</ows:Identifier>
+      <ScaleDenominator>2183915.0938621787</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>256</MatrixWidth>
+      <MatrixHeight>128</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:8</ows:Identifier>
+      <ScaleDenominator>1091957.5469310894</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>512</MatrixWidth>
+      <MatrixHeight>256</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:9</ows:Identifier>
+      <ScaleDenominator>545978.7734655447</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1024</MatrixWidth>
+      <MatrixHeight>512</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:10</ows:Identifier>
+      <ScaleDenominator>272989.38673277234</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2048</MatrixWidth>
+      <MatrixHeight>1024</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:11</ows:Identifier>
+      <ScaleDenominator>136494.69336638617</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>4096</MatrixWidth>
+      <MatrixHeight>2048</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:12</ows:Identifier>
+      <ScaleDenominator>68247.34668319309</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>8192</MatrixWidth>
+      <MatrixHeight>4096</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:13</ows:Identifier>
+      <ScaleDenominator>34123.67334159654</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16384</MatrixWidth>
+      <MatrixHeight>8192</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:14</ows:Identifier>
+      <ScaleDenominator>17061.83667079827</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>32768</MatrixWidth>
+      <MatrixHeight>16384</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:15</ows:Identifier>
+      <ScaleDenominator>8530.918335399136</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>65536</MatrixWidth>
+      <MatrixHeight>32768</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:16</ows:Identifier>
+      <ScaleDenominator>4265.459167699568</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>131072</MatrixWidth>
+      <MatrixHeight>65536</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:17</ows:Identifier>
+      <ScaleDenominator>2132.729583849784</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>262144</MatrixWidth>
+      <MatrixHeight>131072</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:18</ows:Identifier>
+      <ScaleDenominator>1066.364791924892</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>524288</MatrixWidth>
+      <MatrixHeight>262144</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:19</ows:Identifier>
+      <ScaleDenominator>533.182395962446</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1048576</MatrixWidth>
+      <MatrixHeight>524288</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:20</ows:Identifier>
+      <ScaleDenominator>266.591197981223</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2097152</MatrixWidth>
+      <MatrixHeight>1048576</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:21</ows:Identifier>
+      <ScaleDenominator>133.2955989906115</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>4194304</MatrixWidth>
+      <MatrixHeight>2097152</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:22</ows:Identifier>
+      <ScaleDenominator>66.64779949530575</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>8388608</MatrixWidth>
+      <MatrixHeight>4194304</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:23</ows:Identifier>
+      <ScaleDenominator>33.323899747652874</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16777216</MatrixWidth>
+      <MatrixHeight>8388608</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:24</ows:Identifier>
+      <ScaleDenominator>16.661949873826437</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>33554432</MatrixWidth>
+      <MatrixHeight>16777216</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:25</ows:Identifier>
+      <ScaleDenominator>8.330974936913218</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>67108864</MatrixWidth>
+      <MatrixHeight>33554432</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:26</ows:Identifier>
+      <ScaleDenominator>4.165487468456609</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>134217728</MatrixWidth>
+      <MatrixHeight>67108864</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:27</ows:Identifier>
+      <ScaleDenominator>2.0827437342283046</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>268435456</MatrixWidth>
+      <MatrixHeight>134217728</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:28</ows:Identifier>
+      <ScaleDenominator>1.0413718671141523</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>536870912</MatrixWidth>
+      <MatrixHeight>268435456</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:29</ows:Identifier>
+      <ScaleDenominator>0.5206859335570762</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1073741824</MatrixWidth>
+      <MatrixHeight>536870912</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:4326:30</ows:Identifier>
+      <ScaleDenominator>0.2603429667785381</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2147483648</MatrixWidth>
+      <MatrixHeight>1073741824</MatrixHeight>
+    </TileMatrix>
+  </TileMatrixSet>
+  <TileMatrixSet>
+    <ows:Identifier>arcgis-online-epsg102113</ows:Identifier>
+    <ows:SupportedCRS>urn:ogc:def:crs:EPSG::102113</ows:SupportedCRS>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:0</ows:Identifier>
+      <ScaleDenominator>5.590822639285715E8</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1</MatrixWidth>
+      <MatrixHeight>1</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:1</ows:Identifier>
+      <ScaleDenominator>2.7954113196428573E8</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2</MatrixWidth>
+      <MatrixHeight>2</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:2</ows:Identifier>
+      <ScaleDenominator>1.3977056598214287E8</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>4</MatrixWidth>
+      <MatrixHeight>4</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:3</ows:Identifier>
+      <ScaleDenominator>6.988528299107143E7</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>8</MatrixWidth>
+      <MatrixHeight>8</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:4</ows:Identifier>
+      <ScaleDenominator>3.494264149553572E7</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16</MatrixWidth>
+      <MatrixHeight>16</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:5</ows:Identifier>
+      <ScaleDenominator>1.747132074776786E7</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>32</MatrixWidth>
+      <MatrixHeight>32</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:6</ows:Identifier>
+      <ScaleDenominator>8735660.37388393</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>64</MatrixWidth>
+      <MatrixHeight>64</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:7</ows:Identifier>
+      <ScaleDenominator>4367830.186941965</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>128</MatrixWidth>
+      <MatrixHeight>128</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Abstract>The grid was not well-defined, the scale therefore assumes 1m per map unit.</ows:Abstract>      <ows:Identifier>arcgis-online-epsg102113:8</ows:Identifier>
+      <ScaleDenominator>2183915.0934709823</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.00375083392E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>256</MatrixWidth>
+      <MatrixHeight>256</MatrixHeight>
+    </TileMatrix>
+  </TileMatrixSet>
+  <TileMatrixSet>
+    <ows:Identifier>GlobalCRS84Scale</ows:Identifier>
+    <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4326</ows:SupportedCRS>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:0</ows:Identifier>
+      <ScaleDenominator>5.0000000000000006E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2</MatrixWidth>
+      <MatrixHeight>1</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:1</ows:Identifier>
+      <ScaleDenominator>2.5000000000000003E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>3</MatrixWidth>
+      <MatrixHeight>2</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:2</ows:Identifier>
+      <ScaleDenominator>1.0000000000000001E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>6</MatrixWidth>
+      <MatrixHeight>3</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:3</ows:Identifier>
+      <ScaleDenominator>5.000000000000001E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>12</MatrixWidth>
+      <MatrixHeight>6</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:4</ows:Identifier>
+      <ScaleDenominator>2.5000000000000004E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>23</MatrixWidth>
+      <MatrixHeight>12</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:5</ows:Identifier>
+      <ScaleDenominator>1.0E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>56</MatrixWidth>
+      <MatrixHeight>28</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:6</ows:Identifier>
+      <ScaleDenominator>5000000.0</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>112</MatrixWidth>
+      <MatrixHeight>56</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:7</ows:Identifier>
+      <ScaleDenominator>2500000.0</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>224</MatrixWidth>
+      <MatrixHeight>112</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:8</ows:Identifier>
+      <ScaleDenominator>1000000.0000000001</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>560</MatrixWidth>
+      <MatrixHeight>280</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:9</ows:Identifier>
+      <ScaleDenominator>500000.00000000006</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1119</MatrixWidth>
+      <MatrixHeight>560</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:10</ows:Identifier>
+      <ScaleDenominator>250000.00000000003</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2237</MatrixWidth>
+      <MatrixHeight>1119</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:11</ows:Identifier>
+      <ScaleDenominator>100000.00000000001</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>5591</MatrixWidth>
+      <MatrixHeight>2796</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:12</ows:Identifier>
+      <ScaleDenominator>50000.00000000001</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>11182</MatrixWidth>
+      <MatrixHeight>5591</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:13</ows:Identifier>
+      <ScaleDenominator>25000.000000000004</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>22364</MatrixWidth>
+      <MatrixHeight>11182</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:14</ows:Identifier>
+      <ScaleDenominator>10000.000000000002</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>55909</MatrixWidth>
+      <MatrixHeight>27955</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:15</ows:Identifier>
+      <ScaleDenominator>5000.000000000001</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>111817</MatrixWidth>
+      <MatrixHeight>55909</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:16</ows:Identifier>
+      <ScaleDenominator>2500.0000000000005</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>223633</MatrixWidth>
+      <MatrixHeight>111817</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:17</ows:Identifier>
+      <ScaleDenominator>1000.0000000000002</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>559083</MatrixWidth>
+      <MatrixHeight>279542</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:18</ows:Identifier>
+      <ScaleDenominator>500.0000000000001</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1118165</MatrixWidth>
+      <MatrixHeight>559083</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:19</ows:Identifier>
+      <ScaleDenominator>250.00000000000006</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2236330</MatrixWidth>
+      <MatrixHeight>1118165</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Scale:20</ows:Identifier>
+      <ScaleDenominator>100.00000000000003</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>5590823</MatrixWidth>
+      <MatrixHeight>2795412</MatrixHeight>
+    </TileMatrix>
+  </TileMatrixSet>
+  <TileMatrixSet>
+    <ows:Identifier>EPSG:900913</ows:Identifier>
+    <ows:SupportedCRS>urn:ogc:def:crs:EPSG::900913</ows:SupportedCRS>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:0</ows:Identifier>
+      <ScaleDenominator>5.590822639508929E8</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1</MatrixWidth>
+      <MatrixHeight>1</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:1</ows:Identifier>
+      <ScaleDenominator>2.7954113197544646E8</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2</MatrixWidth>
+      <MatrixHeight>2</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:2</ows:Identifier>
+      <ScaleDenominator>1.3977056598772323E8</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>4</MatrixWidth>
+      <MatrixHeight>4</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:3</ows:Identifier>
+      <ScaleDenominator>6.988528299386162E7</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>8</MatrixWidth>
+      <MatrixHeight>8</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:4</ows:Identifier>
+      <ScaleDenominator>3.494264149693081E7</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16</MatrixWidth>
+      <MatrixHeight>16</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:5</ows:Identifier>
+      <ScaleDenominator>1.7471320748465404E7</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>32</MatrixWidth>
+      <MatrixHeight>32</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:6</ows:Identifier>
+      <ScaleDenominator>8735660.374232702</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>64</MatrixWidth>
+      <MatrixHeight>64</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:7</ows:Identifier>
+      <ScaleDenominator>4367830.187116351</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>128</MatrixWidth>
+      <MatrixHeight>128</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:8</ows:Identifier>
+      <ScaleDenominator>2183915.0935581755</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>256</MatrixWidth>
+      <MatrixHeight>256</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:9</ows:Identifier>
+      <ScaleDenominator>1091957.5467790877</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>512</MatrixWidth>
+      <MatrixHeight>512</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:10</ows:Identifier>
+      <ScaleDenominator>545978.7733895439</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1024</MatrixWidth>
+      <MatrixHeight>1024</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:11</ows:Identifier>
+      <ScaleDenominator>272989.38669477194</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2048</MatrixWidth>
+      <MatrixHeight>2048</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:12</ows:Identifier>
+      <ScaleDenominator>136494.69334738597</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>4096</MatrixWidth>
+      <MatrixHeight>4096</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:13</ows:Identifier>
+      <ScaleDenominator>68247.34667369298</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>8192</MatrixWidth>
+      <MatrixHeight>8192</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:14</ows:Identifier>
+      <ScaleDenominator>34123.67333684649</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16384</MatrixWidth>
+      <MatrixHeight>16384</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:15</ows:Identifier>
+      <ScaleDenominator>17061.836668423246</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>32768</MatrixWidth>
+      <MatrixHeight>32768</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:16</ows:Identifier>
+      <ScaleDenominator>8530.918334211623</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>65536</MatrixWidth>
+      <MatrixHeight>65536</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:17</ows:Identifier>
+      <ScaleDenominator>4265.4591671058115</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>131072</MatrixWidth>
+      <MatrixHeight>131072</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:18</ows:Identifier>
+      <ScaleDenominator>2132.7295835529058</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>262144</MatrixWidth>
+      <MatrixHeight>262144</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:19</ows:Identifier>
+      <ScaleDenominator>1066.3647917764529</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>524288</MatrixWidth>
+      <MatrixHeight>524288</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:20</ows:Identifier>
+      <ScaleDenominator>533.1823958882264</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1048576</MatrixWidth>
+      <MatrixHeight>1048576</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:21</ows:Identifier>
+      <ScaleDenominator>266.5911979441132</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2097152</MatrixWidth>
+      <MatrixHeight>2097152</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:22</ows:Identifier>
+      <ScaleDenominator>133.2955989720566</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>4194304</MatrixWidth>
+      <MatrixHeight>4194304</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:23</ows:Identifier>
+      <ScaleDenominator>66.6477994860283</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>8388608</MatrixWidth>
+      <MatrixHeight>8388608</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:24</ows:Identifier>
+      <ScaleDenominator>33.32389974301415</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16777216</MatrixWidth>
+      <MatrixHeight>16777216</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:25</ows:Identifier>
+      <ScaleDenominator>16.661949871507076</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>33554432</MatrixWidth>
+      <MatrixHeight>33554432</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:26</ows:Identifier>
+      <ScaleDenominator>8.330974935753538</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>67108864</MatrixWidth>
+      <MatrixHeight>67108864</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:27</ows:Identifier>
+      <ScaleDenominator>4.165487467876769</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>134217728</MatrixWidth>
+      <MatrixHeight>134217728</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:28</ows:Identifier>
+      <ScaleDenominator>2.0827437339383845</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>268435456</MatrixWidth>
+      <MatrixHeight>268435456</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:29</ows:Identifier>
+      <ScaleDenominator>1.0413718669691923</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>536870912</MatrixWidth>
+      <MatrixHeight>536870912</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>EPSG:900913:30</ows:Identifier>
+      <ScaleDenominator>0.5206859334845961</ScaleDenominator>
+      <TopLeftCorner>2.0037508E7 -2.003750834E7</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1073741824</MatrixWidth>
+      <MatrixHeight>1073741824</MatrixHeight>
+    </TileMatrix>
+  </TileMatrixSet>
+  <TileMatrixSet>
+    <ows:Identifier>arcgis-online-wgs84</ows:Identifier>
+    <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4326</ows:SupportedCRS>
+    <TileMatrix>
+      <ows:Identifier>arcgis-online-wgs84:0</ows:Identifier>
+      <ScaleDenominator>1.3977056600717944E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>4</MatrixWidth>
+      <MatrixHeight>2</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>arcgis-online-wgs84:1</ows:Identifier>
+      <ScaleDenominator>6.988528300358972E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>8</MatrixWidth>
+      <MatrixHeight>4</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>arcgis-online-wgs84:2</ows:Identifier>
+      <ScaleDenominator>3.494264150179486E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16</MatrixWidth>
+      <MatrixHeight>8</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>arcgis-online-wgs84:3</ows:Identifier>
+      <ScaleDenominator>1.747132075089743E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>32</MatrixWidth>
+      <MatrixHeight>16</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>arcgis-online-wgs84:4</ows:Identifier>
+      <ScaleDenominator>8735660.375448715</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>64</MatrixWidth>
+      <MatrixHeight>32</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>arcgis-online-wgs84:5</ows:Identifier>
+      <ScaleDenominator>4367830.1877243575</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>128</MatrixWidth>
+      <MatrixHeight>64</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>arcgis-online-wgs84:6</ows:Identifier>
+      <ScaleDenominator>2183915.0938621787</ScaleDenominator>
+      <TopLeftCorner>85 -175</TopLeftCorner>
+      <TileWidth>512</TileWidth>
+      <TileHeight>512</TileHeight>
+      <MatrixWidth>256</MatrixWidth>
+      <MatrixHeight>128</MatrixHeight>
+    </TileMatrix>
+  </TileMatrixSet>
+  <TileMatrixSet>
+    <ows:Identifier>GlobalCRS84Pixel</ows:Identifier>
+    <ows:SupportedCRS>urn:ogc:def:crs:EPSG::4326</ows:SupportedCRS>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:0</ows:Identifier>
+      <ScaleDenominator>7.951392199519542E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1</MatrixWidth>
+      <MatrixHeight>1</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:1</ows:Identifier>
+      <ScaleDenominator>3.975696099759771E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>2</MatrixWidth>
+      <MatrixHeight>1</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:2</ows:Identifier>
+      <ScaleDenominator>1.9878480498798856E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>3</MatrixWidth>
+      <MatrixHeight>2</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:3</ows:Identifier>
+      <ScaleDenominator>1.325232033253257E8</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>5</MatrixWidth>
+      <MatrixHeight>3</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:4</ows:Identifier>
+      <ScaleDenominator>6.626160166266285E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>9</MatrixWidth>
+      <MatrixHeight>5</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:5</ows:Identifier>
+      <ScaleDenominator>3.3130800831331424E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>17</MatrixWidth>
+      <MatrixHeight>9</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:6</ows:Identifier>
+      <ScaleDenominator>1.325232033253257E7</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>43</MatrixWidth>
+      <MatrixHeight>22</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:7</ows:Identifier>
+      <ScaleDenominator>6626160.166266285</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>85</MatrixWidth>
+      <MatrixHeight>43</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:8</ows:Identifier>
+      <ScaleDenominator>3313080.0831331424</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>169</MatrixWidth>
+      <MatrixHeight>85</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:9</ows:Identifier>
+      <ScaleDenominator>1656540.0415665712</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>338</MatrixWidth>
+      <MatrixHeight>169</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:10</ows:Identifier>
+      <ScaleDenominator>552180.0138555238</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1013</MatrixWidth>
+      <MatrixHeight>507</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:11</ows:Identifier>
+      <ScaleDenominator>331308.00831331423</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>1688</MatrixWidth>
+      <MatrixHeight>844</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:12</ows:Identifier>
+      <ScaleDenominator>110436.00277110476</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>5063</MatrixWidth>
+      <MatrixHeight>2532</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:13</ows:Identifier>
+      <ScaleDenominator>55218.00138555238</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>10125</MatrixWidth>
+      <MatrixHeight>5063</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:14</ows:Identifier>
+      <ScaleDenominator>33130.80083133143</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>16875</MatrixWidth>
+      <MatrixHeight>8438</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:15</ows:Identifier>
+      <ScaleDenominator>11043.600277110474</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>50625</MatrixWidth>
+      <MatrixHeight>25313</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:16</ows:Identifier>
+      <ScaleDenominator>3313.080083133142</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>168750</MatrixWidth>
+      <MatrixHeight>84375</MatrixHeight>
+    </TileMatrix>
+    <TileMatrix>
+      <ows:Identifier>GlobalCRS84Pixel:17</ows:Identifier>
+      <ScaleDenominator>1104.3600277110472</ScaleDenominator>
+      <TopLeftCorner>90.0 -180.0</TopLeftCorner>
+      <TileWidth>256</TileWidth>
+      <TileHeight>256</TileHeight>
+      <MatrixWidth>506250</MatrixWidth>
+      <MatrixHeight>253125</MatrixHeight>
+    </TileMatrix>
+  </TileMatrixSet>
+</Contents>
+<ServiceMetadataURL xlink:href="http://example.com/geowebcache-1.2.2/service/wmts?REQUEST=getcapabilities&VERSION=1.0.0"/>
+</Capabilities>
+        -->
+        </div>
+    </body>
+</html>
diff --git a/tests/Layer/WrapDateLine.html b/tests/Layer/WrapDateLine.html
new file mode 100644
index 0000000..01ed22f
--- /dev/null
+++ b/tests/Layer/WrapDateLine.html
@@ -0,0 +1,182 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var layer; 
+
+    var name = 'Test Layer';
+    var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+    var params = { map: '/mapdata/vmap_wms.map', 
+                   layers: 'basic', 
+                   format: 'image/png'};
+
+    
+    function test_Layer_WrapDateLine_adjustBounds(t) {
+        t.plan(10);
+        
+        
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params, {'wrapDateLine':true});
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        var bounds = layer.adjustBounds(new OpenLayers.Bounds(-270,-90,-180,0));
+        t.ok( bounds.equals(new OpenLayers.Bounds(90,-90,180,0)), "-270,-90,-180,0 wraps to 90,-90,180,0");
+        bounds = layer.adjustBounds(new OpenLayers.Bounds(180,-90,270,0));
+        t.ok( bounds.equals(new OpenLayers.Bounds(-180,-90,-90,0)), "180,-90,270,0 wraps to -180,-90,-90,0");
+        bounds = layer.adjustBounds(new OpenLayers.Bounds(-180,-90,0,0));
+        t.ok( bounds.equals(new OpenLayers.Bounds(-180,-90,0,0)), "-180,-90,0,0 doesn't wrap");
+        bounds = layer.adjustBounds(new OpenLayers.Bounds(-181,-90,-179,0));
+        t.ok( bounds.equals(new OpenLayers.Bounds(-181,-90,-179,0)), "-181,-90,-179,0 doesn't wrap, because it straddles the dateline");
+        bounds = layer.adjustBounds(new OpenLayers.Bounds(-180,-180,-90,-90));
+        t.ok( bounds.equals(new OpenLayers.Bounds(-180,-180,-90,-90)), "-180,-180,-90,-90 doesn't wrap, because we don't wrap lats.");
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+        var testBounds = null;
+        var outBounds = null;
+        var testList = [
+          new OpenLayers.Bounds(-270,-90,-180,0),
+          new OpenLayers.Bounds(180,-90,270,0),
+          new OpenLayers.Bounds(-180,-90,0,0),
+          new OpenLayers.Bounds(-181,-90,-179,0),
+          new OpenLayers.Bounds(-180,-180,-90,-90)
+        ];          
+        for (var i = 0; i < testList.length; i++) {
+            outBounds = layer.adjustBounds(testList[i]);
+            t.ok( outBounds.equals(testList[i]), testList[i]+" doesn't wrap in non-wrapping layer.");
+        }
+        map.destroy();
+    }
+    function test_Layer_WrapDateLine_getLonLat(t) {
+        t.plan(12);
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS(name, url, params, {'wrapDateLine':true});
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        var testLonLats = [
+            new OpenLayers.LonLat(-185,5),
+            new OpenLayers.LonLat(-180,-95),
+            new OpenLayers.LonLat(-180,95),
+            new OpenLayers.LonLat(180,-95),
+            new OpenLayers.LonLat(180,95),
+            new OpenLayers.LonLat(185,5)
+        ];
+        var outLonLats = [
+            new OpenLayers.LonLat(175,5),
+            new OpenLayers.LonLat(-180,-95),
+            new OpenLayers.LonLat(-180,95),
+            new OpenLayers.LonLat(180,-95),
+            new OpenLayers.LonLat(180,95),
+            new OpenLayers.LonLat(-175,5)
+        ];    
+            
+        for (var i = 0; i < testLonLats.length; i++) {
+            var pixel = layer.getViewPortPxFromLonLat(testLonLats[i]);
+            var lonlat = layer.getLonLatFromViewPortPx(pixel);
+            lonlat.lon = Math.round(lonlat.lon);
+            lonlat.lat = Math.round(lonlat.lat);
+            t.ok(outLonLats[i].equals(lonlat), testLonLats[i] + " wraps to " + outLonLats[i]+ " (what happened: " + lonlat + ")");   
+        }
+        
+        layer = new OpenLayers.Layer.WMS(name, url, params);
+        map.addLayer(layer);
+        var outLonLats = [
+            new OpenLayers.LonLat(-185,5),
+            new OpenLayers.LonLat(-180,-95),
+            new OpenLayers.LonLat(-180,95),
+            new OpenLayers.LonLat(180,-95),
+            new OpenLayers.LonLat(180,95),
+            new OpenLayers.LonLat(185,5)
+        ];    
+        for (var i = 0; i < testLonLats.length; i++) {
+            var pixel = layer.getViewPortPxFromLonLat(testLonLats[i]);
+            var lonlat = layer.getLonLatFromViewPortPx(pixel);
+            lonlat.lon = Math.round(lonlat.lon);
+            lonlat.lat = Math.round(lonlat.lat);
+            t.ok(outLonLats[i].equals(lonlat), testLonLats[i] + " wraps to " + outLonLats[i]+ " (what happened: " + lonlat + ")");   
+        }
+        map.destroy();
+        
+    }
+    function test_Layer_WrapDateLine_ZoomToExtent (t) {
+        t.plan( 4 );
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url, params, {'wrapDateLine':true});
+        var m = new OpenLayers.Map('map');
+        m.addLayer(layer);
+        m.setCenter = function(myCenter) { this.center = myCenter; }
+        var testBounds = [
+            new OpenLayers.Bounds(-185,-90,-175,-85),
+            new OpenLayers.Bounds(0,-90,-170,-85),
+            new OpenLayers.Bounds(-270,-90,-180,-85),
+            new OpenLayers.Bounds(0,0,45,45)
+        ];
+        var outCenters = [
+            new OpenLayers.LonLat(-180,-87.5),
+            new OpenLayers.LonLat(95,-87.5),
+            new OpenLayers.LonLat(135,-87.5),
+            new OpenLayers.LonLat(22.5,22.5)
+        ];
+        for (var i = 0; i < testBounds.length; i++) {
+            m.zoomToExtent(testBounds[i]);
+            t.ok(m.center.equals(outCenters[i]), "Map center from bounds " + testBounds[i] + " should be " + outCenters[i] + ", got " + m.center);  
+        }
+        m.destroy();
+        
+    
+    }
+    function test_Layer_WrapDateLine_WMS (t) {
+        t.plan( 3 );
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url, params, {'wrapDateLine':true,encodeBBOX:true});
+        var m = new OpenLayers.Map('map');
+        m.addLayer(layer);
+        m.zoomToMaxExtent();
+        t.eq(layer.grid[3][0].url, "http://octo.metacarta.com/cgi-bin/mapserv?MAP=%2Fmapdata%2Fvmap_wms.map&LAYERS=basic&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=0%2C-90%2C180%2C90&WIDTH=256&HEIGHT=256", "cell [3][0] is wrapped around the world.");
+        t.eq(layer.grid[0][0].url, "http://octo.metacarta.com/cgi-bin/mapserv?MAP=%2Fmapdata%2Fvmap_wms.map&LAYERS=basic&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=0%2C450%2C180%2C630&WIDTH=256&HEIGHT=256", "cell [0][0] is wrapped around the world lon, but not lat");
+        t.eq(layer.grid[0][3].url, "http://octo.metacarta.com/cgi-bin/mapserv?MAP=%2Fmapdata%2Fvmap_wms.map&LAYERS=basic&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=-180%2C450%2C0%2C630&WIDTH=256&HEIGHT=256", "cell [3][0] is not wrapped at all.");
+        m.destroy();
+
+    }
+    function test_Layer_WrapDateLine_KaMap (t) {
+        t.plan( 3 );
+
+        var layer = new OpenLayers.Layer.KaMap( "Blue Marble NG",
+             "http://www.openlayers.org/world/index.php",
+             {g: "satellite", map: "world"},
+             {wrapDateLine: true} ); 
+        var m = new OpenLayers.Map('map');
+        m.addLayer(layer);
+        m.zoomToMaxExtent();
+        t.eq(layer.grid[0][0].url, "http://www.openlayers.org/world/index.php?g=satellite&map=world&i=jpeg&t=-1280&l=0&s=221471921.25", "grid[0][0] kamap is okay");
+        t.eq(layer.grid[0][3].url, "http://www.openlayers.org/world/index.php?g=satellite&map=world&i=jpeg&t=-1280&l=-256&s=221471921.25", "grid[0][3] kamap is okay");
+        t.eq(layer.grid[3][0].url, "http://www.openlayers.org/world/index.php?g=satellite&map=world&i=jpeg&t=-512&l=0&s=221471921.25", "grid[3][0] is okay");
+        m.destroy();
+    }
+    function test_Layer_WrapDateLine_WMS_Overlay (t) {
+        t.plan( 3 );
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        baselayer = new OpenLayers.Layer.WMS(name, url, params, {'wrapDateLine':true});
+        var layer = new OpenLayers.Layer.WMS( "DM Solutions Demo",
+            "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
+            {layers: "bathymetry,land_fn,park,drain_fn,drainage," +
+                     "prov_bound,fedlimit,rail,road,popplace",
+             transparent: "true", format: "image/png"},
+            {wrapDateLine: true, reproject: false,encodeBBOX:true});
+        var m = new OpenLayers.Map('map');
+        m.addLayers([baselayer,layer]);
+        m.zoomToMaxExtent();
+        t.eq(layer.grid[0][0].url, "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap?LAYERS=bathymetry%2Cland_fn%2Cpark%2Cdrain_fn%2Cdrainage%2Cprov_bound%2Cfedlimit%2Crail%2Croad%2Cpopplace&TRANSPARENT=true&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=0%2C450%2C180%2C630&WIDTH=256&HEIGHT=256", "grid[0][0] wms overlay is okay");
+        t.eq(layer.grid[0][3].url, "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap?LAYERS=bathymetry%2Cland_fn%2Cpark%2Cdrain_fn%2Cdrainage%2Cprov_bound%2Cfedlimit%2Crail%2Croad%2Cpopplace&TRANSPARENT=true&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=-180%2C450%2C0%2C630&WIDTH=256&HEIGHT=256", "grid[0][3] wms overlay is okay");
+        t.eq(layer.grid[3][0].url, "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap?LAYERS=bathymetry%2Cland_fn%2Cpark%2Cdrain_fn%2Cdrainage%2Cprov_bound%2Cfedlimit%2Crail%2Croad%2Cpopplace&TRANSPARENT=true&FORMAT=image%2Fpng&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=0%2C-90%2C180%2C90&WIDTH=256&HEIGHT=256", "grid[3][0] wms overlay okay");
+        m.destroy();
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:1000px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/XYZ.html b/tests/Layer/XYZ.html
new file mode 100644
index 0000000..364b147
--- /dev/null
+++ b/tests/Layer/XYZ.html
@@ -0,0 +1,236 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer; 
+
+    var name = 'Test Layer';
+    var url = "http://labs.metacarta.com/wms-c/Basic.py/1.0.0/basic/${z}/${x}/${y}.png";
+    var options = {'layername':'basic', 'type':'png'}; 
+
+
+    function test_Layer_XYZ_constructor (t) {
+        t.plan( 1 );
+                       
+        layer = new OpenLayers.Layer.XYZ(name, url, options);
+        t.ok( layer instanceof OpenLayers.Layer.XYZ, "returns OpenLayers.Layer.XYZ object" );
+    }
+
+
+
+    function test_Layer_XYZ_clearTiles (t) {
+        t.plan( 1 );
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.XYZ(name, url, options);
+        map.addLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(0,0));
+
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.clearGrid();
+
+        t.ok( layer.grid != null, "layer.grid does not get nullified" );
+        map.destroy();
+    }
+
+
+    function test_Layer_XYZ_getXYZBounds(t) {
+        t.plan( 1 );
+
+        layer = new OpenLayers.Layer.XYZ(name, url, options);
+
+        var bl = { bounds: new OpenLayers.Bounds(1,2,0,0)};
+        var tr = { bounds: new OpenLayers.Bounds(0,0,3,4)};
+        layer.grid = [ [6, tr], 
+                       [bl, 7]];
+
+        var bounds = layer.getTilesBounds();
+    
+        var testBounds = new OpenLayers.Bounds(1,2,3,4);
+        
+        t.ok( bounds.equals(testBounds), "getXYZBounds() returns correct bounds")
+        
+        layer.grid = null;
+    }
+
+    function test_Layer_XYZ_getResolution(t) {
+        t.plan( 1 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.XYZ(name, url, options);
+        map.addLayer(layer);
+
+        map.zoom = 5;
+
+        t.eq( layer.getResolution(), 0.0439453125, "getResolution() returns correct value");
+        map.destroy();
+    }
+
+    function test_Layer_XYZ_getZoomForExtent(t) {
+        t.plan( 2 );
+        var bounds, zoom;
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.XYZ(name, url, options);
+        map.addLayer(layer);
+
+        bounds = new OpenLayers.Bounds(10,10,12,12);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 8, "getZoomForExtent() returns correct value");
+
+        bounds = new OpenLayers.Bounds(10,10,100,100);
+        zoom = layer.getZoomForExtent(bounds);
+
+        t.eq( zoom, 2, "getZoomForExtent() returns correct value");
+        map.destroy();
+    }   
+
+
+    /** THIS WOULD BE WHERE THE TESTS WOULD GO FOR 
+     *     
+     *    -moveTo
+     *    -insertColumn
+     *    -insertRow
+    
+    function 07_Layer_XYZ_moveTo(t) {
+    }
+
+    function 08_Layer_XYZ_insertColumn(t) {
+    }
+
+    function 09_Layer_XYZ_insertRow(t) {
+    }
+
+     * 
+     */
+    function test_Layer_XYZ_getURL(t) {
+
+        t.plan(2);
+        
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.XYZ(name, url);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 9);
+        var tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://labs.metacarta.com/wms-c/Basic.py/1.0.0/basic/9/261/63.png", "Tile URL is correct");
+    
+        layer.url = ["http://tilecache1/", "http://tilecache2/", "http://tilecache3/"];
+        tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://tilecache1/", "Tile URL is deterministic");
+        map.destroy();
+    }
+    function test_Layer_XYZ_Rounding(t) {
+        t.plan(1);
+            m = new OpenLayers.Map("map", {'maxExtent':new OpenLayers.Bounds(-122.6579,37.4901,-122.0738,37.8795)});
+            layer = new OpenLayers.Layer.XYZ( "XYZ", 
+                    url, {layername: 'basic', type:'png', resolutions:[0.000634956337608418]} );
+            m.addLayer(layer);
+            m.zoomToMaxExtent()
+            t.eq(layer.getURL(layer.grid[3][3].bounds), "http://labs.metacarta.com/wms-c/Basic.py/1.0.0/basic/0/1/0.png", "XYZ tiles around rounded properly.");
+        m.destroy();
+    }        
+            
+    function test_Layer_XYZ_setMap(t) {
+
+        t.plan(3);
+        
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.XYZ(name, url);
+
+        t.eq(layer.tileOrigin, null, "Tile origin starts out null");
+        layer.setMap(map);
+        
+        t.eq(layer.tileOrigin.lat, -90, "lat is -90");
+        t.eq(layer.tileOrigin.lon, -180, "lon is -180");
+        map.destroy();
+    }
+
+    function test_zoomOffset(t) {
+
+        t.plan(2);
+        
+        var offset;
+        
+        // test offset of 2
+        offset = 2;
+        
+        var map = new OpenLayers.Map({
+            div: "map",
+            maxResolution: OpenLayers.Map.prototype.maxResolution / Math.pow(2, offset)
+        });
+        var layer = new OpenLayers.Layer.XYZ(name, url, {zoomOffset: offset});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 7);
+
+        var tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://labs.metacarta.com/wms-c/Basic.py/1.0.0/basic/9/261/63.png", "correct URL for offset of 2");
+
+        map.destroy();
+
+        // test offset of -1
+        offset = -1;
+        
+        var map = new OpenLayers.Map({
+            div: "map",
+            maxResolution: OpenLayers.Map.prototype.maxResolution / Math.pow(2, offset)
+        });
+        var layer = new OpenLayers.Layer.XYZ(name, url, {zoomOffset: offset});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 10);
+
+        var tileurl = layer.getURL(new OpenLayers.Bounds(3.515625,45,4.21875,45.703125));
+        t.eq(tileurl, "http://labs.metacarta.com/wms-c/Basic.py/1.0.0/basic/9/261/63.png", "correct URL for offset of -1");
+
+        map.destroy();
+
+
+    }
+
+    function test_Layer_XYZ_destroy (t) {
+
+        t.plan( 3 );
+
+        var map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.XYZ(name, url, options);
+        map.addLayer(layer);
+        layer.destroy();
+        t.eq( layer.grid, null, "layer.grid is null after destroy" );
+        t.eq( layer.tileSize, null, "layer.tileSize is null after destroy" );
+
+
+    //test with tile creation
+        layer = new OpenLayers.Layer.XYZ(name, url, options);
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        //grab a reference to one of the tiles
+        var tile = layer.grid[0][0];        
+
+        layer.destroy();
+
+        t.ok( layer.grid == null, "tiles appropriately destroyed");
+        map.destroy();
+    }
+    
+    function test_clone(t) {
+        t.plan(2);
+        
+        var clone;
+        
+        layer = new OpenLayers.Layer.XYZ(name, url, options);
+        clone = layer.clone();
+        t.ok(clone instanceof OpenLayers.Layer.XYZ, "clone is a Layer.XYZ instance");
+
+        layer = new OpenLayers.Layer.OSM();
+        clone = layer.clone();
+        t.ok(clone instanceof OpenLayers.Layer.OSM, "clone is a Layer.OSM instance");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Layer/Yahoo.html b/tests/Layer/Yahoo.html
new file mode 100755
index 0000000..9059f02
--- /dev/null
+++ b/tests/Layer/Yahoo.html
@@ -0,0 +1,120 @@
+<html>
+<head>
+  <script src="http://api.maps.yahoo.com/ajaxymap?v=3.0&appid=euzuro-openlayers"></script>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var layer; 
+
+    function test_Layer_Yahoo_constructor (t) {
+        t.plan( 4 );
+
+        var tempEventPane = OpenLayers.Layer.EventPane.prototype.initialize;
+        OpenLayers.Layer.EventPane.prototype.initialize = function(name, options) {
+            t.ok(name == g_Name, "EventPane initialize() called with correct name");
+            t.ok(options == g_Options, "EventPane initialize() called with correct options");
+        }
+
+        var tempFixedZoomLevels = OpenLayers.Layer.FixedZoomLevels.prototype.initialize;
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize = function(name, options) {
+            t.ok(name == g_Name, "FixedZoomLevels initialize() called with correct name");
+            t.ok(options == g_Options, "FixedZoomLevels initialize() called with correct options");
+        }
+
+
+        g_Name = {};
+        g_Options = {};        
+        var l = new OpenLayers.Layer.Yahoo(g_Name, g_Options);
+
+        OpenLayers.Layer.EventPane.prototype.initialize = tempEventPane;
+        OpenLayers.Layer.FixedZoomLevels.prototype.initialize = tempFixedZoomLevels;
+    }
+
+    function test_Layer_Yahoo_loadMapObject(t) {
+        t.plan(5);
+        
+        var temp = YMap;
+        YMap = OpenLayers.Class({
+            initialize: function(div, type, size) {
+                t.ok(div == g_Div, "correct div passed to YMap constructor");
+                t.ok(type == g_Type, "correct type passed to YMap constructor");
+                t.ok(size == g_YMapSize, "correct size passed to YMap constructor");
+            },
+            disableKeyControls: function() {
+                t.ok(true, "disableKeyControls called on map object");
+            }
+        });
+        
+        g_Div = {};
+        g_Type = {};
+        g_MapSize = {};
+        g_YMapSize = {};
+        
+        var l = new OpenLayers.Layer.Yahoo();
+        l.div = g_Div;
+        l.type = g_Type;
+        l.map = {
+            'getSize': function() {
+                return g_MapSize;
+            }
+        };
+        l.getMapObjectSizeFromOLSize = function(mapSize) {
+            t.ok(mapSize == g_MapSize, "correctly translating map size from ol to YSize");
+            return g_YMapSize;
+        };
+
+        l.loadMapObject();
+
+        YMap = temp;
+    }    
+
+    function test_Layer_Yahoo_onMapResize(t) {
+        t.plan(2);
+        
+        g_MapSize = {};
+        g_YMapSize = {};
+        
+        var l = new OpenLayers.Layer.Yahoo();
+        l.mapObject = {
+            'resizeTo': function(size) {
+                t.ok(size == g_YMapSize, "correct YSize passed to reiszeTo on map object");
+            }
+        }
+        l.map = {
+            'getSize': function() {
+                return g_MapSize;
+            }
+        };
+        l.getMapObjectSizeFromOLSize = function(mapSize) {
+            t.ok(mapSize == g_MapSize, "correctly translating map size from ol to YSize");
+            return g_YMapSize;
+        };
+
+        l.onMapResize();
+    }
+    
+    function test_Layer_Yahoo_getMapObjectSizeFromOLSize(t) {
+        t.plan(2);
+        
+        var temp = YSize;
+        YSize = function(w, h) {
+            t.ok(w == g_Size.w, "correct width passed to YSize constructor");
+            t.ok(h == g_Size.h, "correct height passed to YSize constructor");
+        }
+        
+        g_Size = {
+            'w': {},
+            'h': {}
+        };
+        
+        OpenLayers.Layer.Yahoo.prototype.getMapObjectSizeFromOLSize(g_Size);
+
+        YSize = temp;
+    }
+
+
+  </script>
+</head>
+<body>
+  <div id="map"></div>
+</body>
+</html>
diff --git a/tests/Layer/atom-1.0.xml b/tests/Layer/atom-1.0.xml
new file mode 100644
index 0000000..f0d5d6f
--- /dev/null
+++ b/tests/Layer/atom-1.0.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom"
+      xmlns:georss="http://www.georss.org/georss">
+
+  <title>tumulus</title>
+  <link rel="self"
+        href="http://pleiades.stoa.org/places/tumulus"/>
+  <updated/>
+  <author/>
+  <id>http://pleiades.stoa.org/places/tumulus</id>
+    
+  <entry>
+    <title>Unnamed Tumulus</title>
+    <link rel="alternate"
+          href="http://pleiades.stoa.org/places/638896"
+    />
+    <id>http://pleiades.stoa.org/places/638896</id>
+    <updated/>
+    <summary>An ancient tumulus, attested during the Classical period (modern location: Karaburun). Its ancient name is not known.</summary>
+    <georss:point>36.7702 29.9805</georss:point>
+  </entry>
+  <entry>
+    <title>Unnamed Tumulus</title>
+    <link rel="alternate"
+          href="http://pleiades.stoa.org/places/638924"
+    />
+    <id>http://pleiades.stoa.org/places/638924</id>
+    <updated/>
+    <summary>An ancient tumulus, attested during the Classical period (modern location: Kızılbel). Its ancient name is not known.</summary>
+    <georss:point>36.7263 29.8619</georss:point>
+  </entry>
+  
+</feed>
+
diff --git a/tests/Layer/data_Layer_Text_textfile.txt b/tests/Layer/data_Layer_Text_textfile.txt
new file mode 100644
index 0000000..8250988
--- /dev/null
+++ b/tests/Layer/data_Layer_Text_textfile.txt
@@ -0,0 +1,3 @@
+point	image
+10,20	http://boston.openguides.org/markers/ORANGE.png
+15,25	http://boston.openguides.org/markers/ORANGE.png
diff --git a/tests/Layer/data_Layer_Text_textfile_2.txt b/tests/Layer/data_Layer_Text_textfile_2.txt
new file mode 100644
index 0000000..91a8093
--- /dev/null
+++ b/tests/Layer/data_Layer_Text_textfile_2.txt
@@ -0,0 +1,3 @@
+point	title	description	image
+10,20	a	b	http://boston.openguides.org/markers/ORANGE.png
+15,25	c	d	http://boston.openguides.org/markers/ORANGE.png
diff --git a/tests/Layer/data_Layer_Text_textfile_overflow.txt b/tests/Layer/data_Layer_Text_textfile_overflow.txt
new file mode 100644
index 0000000..bb4768e
--- /dev/null
+++ b/tests/Layer/data_Layer_Text_textfile_overflow.txt
@@ -0,0 +1,3 @@
+overflow	point	title	description	image
+auto	10,20	a	b	http://boston.openguides.org/markers/ORANGE.png
+hidden	15,25	c	d	http://boston.openguides.org/markers/ORANGE.png
diff --git a/tests/Layer/georss.txt b/tests/Layer/georss.txt
new file mode 100644
index 0000000..053749b
--- /dev/null
+++ b/tests/Layer/georss.txt
@@ -0,0 +1,378 @@
+<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/css" href="/css/rss.css" ?>
+
+<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xmlns="http://purl.org/rss/1.0/"
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns:georss="http://www.georss.org/georss">
+<docs>This is an RSS file.  Copy the URL into your aggregator of choice.  If you don't know what this means and want to learn more, please see: <span>http://platial.typepad.com/news/2006/04/really_simple_t.html</span> for more info.</docs><channel rdf:about="http://platial.com">
+<link>http://platial.com</link>
+<title>Crschmidt's Places At Platial</title>
+<description></description>
+<items>
+<rdf:Seq>
+<rdf:li resource="http://platial.com/place/90306"/>
+<rdf:li resource="http://platial.com/place/67230"/>
+<rdf:li resource="http://platial.com/place/65645"/>
+<rdf:li resource="http://platial.com/place/62200"/>
+<rdf:li resource="http://platial.com/place/28232"/>
+<rdf:li resource="http://platial.com/place/43666"/>
+<rdf:li resource="http://platial.com/place/28394"/>
+<rdf:li resource="http://platial.com/place/28251"/>
+<rdf:li resource="http://platial.com/place/28392"/>
+<rdf:li resource="http://platial.com/place/28391"/>
+<rdf:li resource="http://platial.com/place/28231"/>
+<rdf:li resource="http://platial.com/place/28393"/>
+<rdf:li resource="http://platial.com/place/31685"/>
+<rdf:li resource="http://platial.com/place/28596"/>
+<rdf:li resource="http://platial.com/place/28595"/>
+<rdf:li resource="http://platial.com/place/28594"/>
+<rdf:li resource="http://platial.com/place/28593"/>
+<rdf:li resource="http://platial.com/place/28592"/>
+<rdf:li resource="http://platial.com/place/28591"/>
+<rdf:li resource="http://platial.com/place/28590"/>
+<rdf:li resource="http://platial.com/place/28589"/>
+<rdf:li resource="http://platial.com/place/28588"/>
+<rdf:li resource="http://platial.com/place/28587"/>
+<rdf:li resource="http://platial.com/place/28586"/>
+<rdf:li resource="http://platial.com/place/28585"/>
+<rdf:li resource="http://platial.com/place/28584"/>
+<rdf:li resource="http://platial.com/place/28583"/>
+<rdf:li resource="http://platial.com/place/28582"/>
+<rdf:li resource="http://platial.com/place/28581"/>
+<rdf:li resource="http://platial.com/place/28580"/>
+<rdf:li resource="http://platial.com/place/28579"/>
+<rdf:li resource="http://platial.com/place/28578"/>
+<rdf:li resource="http://platial.com/place/28577"/>
+<rdf:li resource="http://platial.com/place/28576"/>
+<rdf:li resource="http://platial.com/place/28575"/>
+<rdf:li resource="http://platial.com/place/28574"/>
+<rdf:li resource="http://platial.com/place/28573"/>
+<rdf:li resource="http://platial.com/place/28572"/>
+<rdf:li resource="http://platial.com/place/28571"/>
+<rdf:li resource="http://platial.com/place/28570"/>
+</rdf:Seq>
+</items>
+</channel>
+<item rdf:about="http://platial.com/place/90306">
+<link>http://platial.com/place/90306</link>
+<title>Knitting Room</title>
+<description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington [...]
+<georss:point>42.405696 -71.142197</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-06-08T17:35:01.942452+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/67230">
+<link>http://platial.com/place/67230</link>
+<title>Knitting Room</title>
+<description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington [...]
+<georss:point>42.405524 -71.142273</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-24T11:35:26.733857+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/65645">
+<link>http://platial.com/place/65645</link>
+<title>†¢¢™£ˆøœ</title>
+<description><![CDATA[ijeª£∆µˆ˚î<br/>Address: 151 Erie St., Cambridge, MA<br/>Tags: platial graffiti<br /><br /><a href="http://platial.com/place/65645">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/65645">Grab this on Platial</a> ]]></description>
+<georss:point>42.352455 -71.110210</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-20T08:56:12.696224+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/62200">
+<link>http://platial.com/place/62200</link>
+<title>Allen Hall</title>
+<description><![CDATA[My dorm at UIUC.<br/>Address: 1301 W Gregory Dr, Urbana, IL<br/>Tags: dorm, uiuc, college<br/><a href="http://platial.com/place/62200"><img src="http://platial.comhttp://static.flickr.com/4/8576450_0d59cc2531_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/62200">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/62200">Grab this on Platial</a> ]]></description>
+<georss:point>40.104172 -88.220623</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-14T08:01:01.872873+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28232">
+<link>http://platial.com/place/28232</link>
+<title>Bagby Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C. However, the area around the springs are not exactly well looked upon by people who know the place.
+
+<br/>Tags: 20s, rosalie, romance, childhood, hike, camping, soak, relax, beautiful, hot springs, bathhouse, favorite, popular, crowded, organized, honeymoon tub, plumbing made from hollowed out trees, hot springs, mt hood, notorious car break in spot, rash, bacteria<br /><br /><a href="http://platial.com/place/28232">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28232">Grab this on Platial</a> ]]></description>
+<georss:point>44.936000 -122.173000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:10:18.553063+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/43666">
+<link>http://platial.com/place/43666</link>
+<title>Shooting Location for "The Field of Dreams" Film</title>
+<description><![CDATA[1989's Field of Dreams was a Best Picture Academy Award nominee, and the baseball field in the cornfield still stands today, and has become quite a tourist destination.  Games are occasionally played at the field, re-enacting professional baseball at the turn of the 20th Century.<br/>Address: Dyersville, Iowa<br/>Tags: iowa, baseball, movie locations, field of dreams, kevin costner, costner, dyersville, kinsella, james earl jones, chicago black sox, shoeless joe, jo [...]
+<georss:point>42.481213 -91.111679</georss:point>
+<dc:creator>echinodermata</dc:creator>
+<dc:date>2006-03-23T11:40:17.654061+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28394">
+<link>http://platial.com/place/28394</link>
+<title>Moffetts (Bonneville) Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 97  degress F, 36  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28394">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28394">Grab this on Platial</a> ]]></description>
+<georss:point>45.658000 -121.962000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:27.329816+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28251">
+<link>http://platial.com/place/28251</link>
+<title>Austin Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 186  degress F, 86  degress C<br/>Tags: soak, hot springs, relax, nature, popular, crowded<br /><br /><a href="http://platial.com/place/28251">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28251">Grab this on Platial</a> ]]></description>
+<georss:point>45.021000 -122.009000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:11:04.489886+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28392">
+<link>http://platial.com/place/28392</link>
+<title>Rock Creek Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28392">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28392">Grab this on Platial</a> ]]></description>
+<georss:point>45.723000 -121.927000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:22.636855+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28391">
+<link>http://platial.com/place/28391</link>
+<title>St. Martins (Wind River) Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 120  degress F, 49  degress C<br/>Tags: hot springs, soak, relax, nature, wonderful<br /><br /><a href="http://platial.com/place/28391">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28391">Grab this on Platial</a> ]]></description>
+<georss:point>45.728000 -121.800000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:20.383244+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28231">
+<link>http://platial.com/place/28231</link>
+<title>Breitenbush Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br/>Tags: hot springs, resort, relax, nature, beautiful, http:www.breitenbush.com, soaking<br /><br /><a href="http://platial.com/place/28231">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28231">Grab this on Platial</a> ]]></description>
+<georss:point>44.782000 -121.975000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:10:16.529195+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28393">
+<link>http://platial.com/place/28393</link>
+<title>Collins Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 122  degress F, 50  degress C<br/>Tags: portland, nice, hot springs, soak<br /><br /><a href="http://platial.com/place/28393">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28393">Grab this on Platial</a> ]]></description>
+<georss:point>45.701000 -121.728000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:24.648745+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/31685">
+<link>http://platial.com/place/31685</link>
+<title>Darwin's Ltd.</title>
+<description><![CDATA[Nice little coffee shop/cafe, free Wifi, close enough to walk from Harvard Square.<br/>Address: 148 Mount Auburn St, Cambridge, MA<br/>Tags: coffee, beer, sandwiches, freewifi<br/><a href="http://platial.com/place/31685"><img src="http://platial.comhttp://static.flickr.com/38/84885937_74fd3d1025_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/31685">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/31685">Grab this on Platial</a> ]] [...]
+<georss:point>42.373974 -71.125053</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-10T09:24:08.152985+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28596">
+<link>http://platial.com/place/28596</link>
+<title>Huckleberry Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, Boiling  degress C<br /><br /><a href="http://platial.com/place/28596">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28596">Grab this on Platial</a> ]]></description>
+<georss:point>44.115000 -110.684000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:32.283094+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28595">
+<link>http://platial.com/place/28595</link>
+<title>South Entrance Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 156  degress F, 69  degress C<br/><a href="http://platial.com/place/28595"><img src="http://platial.comhttp://static.flickr.com/52/130989872_f1457f68b5_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28595">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28595">Grab this on Platial</a> ]]></description>
+<georss:point>44.142000 -110.656000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:30.279497+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28594">
+<link>http://platial.com/place/28594</link>
+<title>Crawfish Creek Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br/><a href="http://platial.com/place/28594"><img src="http://platial.comhttp://static.flickr.com/52/128312256_d6a879924c_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28594">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28594">Grab this on Platial</a> ]]></description>
+<georss:point>44.157000 -110.699000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:28.280271+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28593">
+<link>http://platial.com/place/28593</link>
+<title>Crawfish Creek Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 138  degress F, 59  degress C<br /><br /><a href="http://platial.com/place/28593">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28593">Grab this on Platial</a> ]]></description>
+<georss:point>44.165000 -110.723000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:20.364077+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28592">
+<link>http://platial.com/place/28592</link>
+<title>Snake Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br /><br /><a href="http://platial.com/place/28592">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28592">Grab this on Platial</a> ]]></description>
+<georss:point>44.169000 -110.583000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:12.234974+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28591">
+<link>http://platial.com/place/28591</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 142  degress F, 61  degress C<br /><br /><a href="http://platial.com/place/28591">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28591">Grab this on Platial</a> ]]></description>
+<georss:point>44.187000 -110.726000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:10.027857+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28590">
+<link>http://platial.com/place/28590</link>
+<title>Hot Springs on Upper Snake River, WY</title>
+<description><![CDATA[Hot spring, temperature: 167  degress F, 75  degress C<br /><br /><a href="http://platial.com/place/28590">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28590">Grab this on Platial</a> ]]></description>
+<georss:point>44.204000 -110.486000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:07.79658+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28589">
+<link>http://platial.com/place/28589</link>
+<title>Hot Springs on lewis Lake, WY</title>
+<description><![CDATA[Hot spring, temperature: 154  degress F, 68  degress C<br /><br /><a href="http://platial.com/place/28589">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28589">Grab this on Platial</a> ]]></description>
+<georss:point>44.276000 -110.636000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:05.683418+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28588">
+<link>http://platial.com/place/28588</link>
+<title>Rustic Geyser, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28588">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28588">Grab this on Platial</a> ]]></description>
+<georss:point>44.282000 -110.506000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:03.66329+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28587">
+<link>http://platial.com/place/28587</link>
+<title>Bechler River Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 194  degress F, 90  degress C<br /><br /><a href="http://platial.com/place/28587">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28587">Grab this on Platial</a> ]]></description>
+<georss:point>44.285000 -110.900000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:01.611442+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28586">
+<link>http://platial.com/place/28586</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28586">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28586">Grab this on Platial</a> ]]></description>
+<georss:point>44.290000 -110.504000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:59.658699+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28585">
+<link>http://platial.com/place/28585</link>
+<title>Heart Lake Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature:  Middle Group  degress F, 174  degress C<br /><br /><a href="http://platial.com/place/28585">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28585">Grab this on Platial</a> ]]></description>
+<georss:point>44.299000 -110.517000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:57.181801+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28584">
+<link>http://platial.com/place/28584</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28584">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28584">Grab this on Platial</a> ]]></description>
+<georss:point>44.307000 -110.526000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:55.240485+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28583">
+<link>http://platial.com/place/28583</link>
+<title>Hot Springs on lewis Lake, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28583">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28583">Grab this on Platial</a> ]]></description>
+<georss:point>44.309000 -110.654000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:53.22295+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28582">
+<link>http://platial.com/place/28582</link>
+<title>Shoshone Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28582">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28582">Grab this on Platial</a> ]]></description>
+<georss:point>44.354000 -110.800000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:51.179049+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28581">
+<link>http://platial.com/place/28581</link>
+<title>Hot Springs on Continental Divide, WY</title>
+<description><![CDATA[Hot spring, temperature: 189  degress F, 87  degress C<br /><br /><a href="http://platial.com/place/28581">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28581">Grab this on Platial</a> ]]></description>
+<georss:point>44.401000 -110.936000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:49.077176+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28580">
+<link>http://platial.com/place/28580</link>
+<title>Hot Springs on Upper Firehole River, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28580">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28580">Grab this on Platial</a> ]]></description>
+<georss:point>44.404000 -110.824000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:47.054664+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28579">
+<link>http://platial.com/place/28579</link>
+<title>Summit Lake Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 162  degress F, 72  degress C<br /><br /><a href="http://platial.com/place/28579">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28579">Grab this on Platial</a> ]]></description>
+<georss:point>44.410000 -110.953000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:45.039394+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28578">
+<link>http://platial.com/place/28578</link>
+<title>Lone Star Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature:  Footbridge  degress F, 183  degress C<br /><br /><a href="http://platial.com/place/28578">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28578">Grab this on Platial</a> ]]></description>
+<georss:point>44.414000 -110.817000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:42.938808+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28577">
+<link>http://platial.com/place/28577</link>
+<title>West. Thumb Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28577">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28577">Grab this on Platial</a> ]]></description>
+<georss:point>44.417000 -110.570000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:40.90238+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28576">
+<link>http://platial.com/place/28576</link>
+<title>Lone Star Geyser, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28576">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28576">Grab this on Platial</a> ]]></description>
+<georss:point>44.418000 -110.805000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:38.844625+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28575">
+<link>http://platial.com/place/28575</link>
+<title>Smoke Jumper Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28575">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28575">Grab this on Platial</a> ]]></description>
+<georss:point>44.421000 -110.952000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:36.818513+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28574">
+<link>http://platial.com/place/28574</link>
+<title>West. Thumb Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 196  degress F, 91  degress C<br /><br /><a href="http://platial.com/place/28574">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28574">Grab this on Platial</a> ]]></description>
+<georss:point>44.422000 -110.574000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:34.767729+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28573">
+<link>http://platial.com/place/28573</link>
+<title>Potts Hot Spring Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28573">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28573">Grab this on Platial</a> ]]></description>
+<georss:point>44.433000 -110.581000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:32.749915+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28572">
+<link>http://platial.com/place/28572</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28572">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28572">Grab this on Platial</a> ]]></description>
+<georss:point>44.433000 -110.813000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:30.829745+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28571">
+<link>http://platial.com/place/28571</link>
+<title>Hot Springs on Continental Divide, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28571">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28571">Grab this on Platial</a> ]]></description>
+<georss:point>44.438000 -110.977000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:28.730401+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28570">
+<link>http://platial.com/place/28570</link>
+<title>SouthEastern Group, WY</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28570">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28570">Grab this on Platial</a> ]]></description>
+<georss:point>44.459000 -110.817000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:26.706763+00:00</dc:date>
+</item>
+</rdf:RDF>
\ No newline at end of file
diff --git a/tests/Layer/mice.xml b/tests/Layer/mice.xml
new file mode 100644
index 0000000..4a001ec
--- /dev/null
+++ b/tests/Layer/mice.xml
@@ -0,0 +1,156 @@
+<?xml version='1.0' encoding="ISO-8859-1" ?>
+<wfs:FeatureCollection
+   xmlns:bsc="http://www.bsc-eoc.org/bsc"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-basic.xsd 
+                       http://www.bsc-eoc.org/bsc http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=OWLS&OUTPUTFORMAT=XMLSCHEMA">
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-89.817223,45.005555 -74.755001,51.701388</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember><bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.771668,45.891110 -79.771668,45.891110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.771668,45.891110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.755834,46.365277 -83.755834,46.365277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:owlname>owl</bsc:owlname>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.755834,46.365277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.808612,46.175277 -83.808612,46.175277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.808612,46.175277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-84.111112,46.309166 -84.111112,46.309166</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-84.111112,46.309166</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.678612,46.821110 -83.678612,46.821110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.678612,46.821110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.664445,46.518888 -83.664445,46.518888</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.664445,46.518888</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-80.613334,46.730277 -80.613334,46.730277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-80.613334,46.730277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.676946,45.428054 -79.676946,45.428054</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.676946,45.428054</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.853056,46.236944 -83.853056,46.236944</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.853056,46.236944</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-82.289167,45.896388 -82.289167,45.896388</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-82.289167,45.896388</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+</wfs:FeatureCollection>
+
diff --git a/tests/Layer/owls.xml b/tests/Layer/owls.xml
new file mode 100644
index 0000000..4a001ec
--- /dev/null
+++ b/tests/Layer/owls.xml
@@ -0,0 +1,156 @@
+<?xml version='1.0' encoding="ISO-8859-1" ?>
+<wfs:FeatureCollection
+   xmlns:bsc="http://www.bsc-eoc.org/bsc"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-basic.xsd 
+                       http://www.bsc-eoc.org/bsc http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=OWLS&OUTPUTFORMAT=XMLSCHEMA">
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-89.817223,45.005555 -74.755001,51.701388</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember><bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.771668,45.891110 -79.771668,45.891110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.771668,45.891110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.755834,46.365277 -83.755834,46.365277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:owlname>owl</bsc:owlname>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.755834,46.365277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.808612,46.175277 -83.808612,46.175277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.808612,46.175277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-84.111112,46.309166 -84.111112,46.309166</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-84.111112,46.309166</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.678612,46.821110 -83.678612,46.821110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.678612,46.821110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.664445,46.518888 -83.664445,46.518888</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.664445,46.518888</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-80.613334,46.730277 -80.613334,46.730277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-80.613334,46.730277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.676946,45.428054 -79.676946,45.428054</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.676946,45.428054</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.853056,46.236944 -83.853056,46.236944</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.853056,46.236944</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-82.289167,45.896388 -82.289167,45.896388</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-82.289167,45.896388</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+</wfs:FeatureCollection>
+
diff --git a/tests/Map.html b/tests/Map.html
new file mode 100644
index 0000000..e2a2ddd
--- /dev/null
+++ b/tests/Map.html
@@ -0,0 +1,1627 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var map;
+
+    function test_Map_constructor (t) {
+        t.plan( 11 );
+        
+        map = new OpenLayers.Map('map'); 
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+
+        t.ok( OpenLayers.Element.hasClass(map.div, "olMap"), "Map div has olMap class");
+
+        t.ok( map instanceof OpenLayers.Map, "new OpenLayers.Map returns object" );
+        if (!isMozilla) {
+            t.ok( true, "skipping element test outside of Mozilla");
+            t.ok( true, "skipping element test outside of Mozilla");
+            t.ok( true, "skipping element test outside of Mozilla");
+        } else {
+            t.ok( map.div instanceof HTMLDivElement, "map.div is an HTMLDivElement" );
+            t.ok( map.viewPortDiv instanceof HTMLDivElement, "map.viewPortDiv is an HTMLDivElement" );
+            t.ok( map.layerContainerDiv instanceof HTMLDivElement, "map.layerContainerDiv is an HTMLDivElement" );
+        }
+        t.ok( map.layers instanceof Array, "map.layers is an Array" );
+        t.ok( map.controls instanceof Array, "map.controls is an Array" );
+        t.eq( map.controls.length, 4, "Default map has 4 controls." );
+        t.ok( map.events instanceof OpenLayers.Events, "map.events is an OpenLayers.Events" );
+        t.ok( map.getMaxExtent() instanceof OpenLayers.Bounds, "map.maxExtent is an OpenLayers.Bounds" );
+        t.ok( map.getNumZoomLevels() > 0, "map has a default numZoomLevels" );
+
+        map.destroy();
+    }
+    
+    function test_Map_constructor_late_rendering(t) {
+        t.plan( 4 );
+        
+        map = new OpenLayers.Map(); 
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        
+        t.ok(map.div != null, "Map has a div even though none was specified.");
+        t.ok(map.viewPortDiv.parentNode == map.div, "Map is attached to a temporary div that holds the viewPortDiv.");
+        
+        var mapDiv = document.getElementById("map");
+        // clean up the effects of other tests
+        while(OpenLayers.Element.hasClass(mapDiv, "olMap")) {
+            OpenLayers.Element.removeClass(mapDiv, "olMap");
+        }
+        map.render(mapDiv); // Can also take a string.
+        
+        t.ok(map.div == mapDiv, "Map is now rendered to the 'map' div.")
+        t.ok( OpenLayers.Element.hasClass(map.div, "olMap"), "Map div has olMap class");
+        
+        map.destroy();
+        
+    }
+    
+    function test_Map_constructor_renderTo(t) {
+        t.plan( 1 );
+        
+        map = new OpenLayers.Map({
+            div: "map"
+        }); 
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        
+        var mapDiv = document.getElementById("map");
+        t.ok(map.div == mapDiv, "Map is rendered to the 'map' div.")
+        
+        map.destroy();
+    }
+
+    function test_Map_setOptions(t) {
+        t.plan(2);
+        map = new OpenLayers.Map('map', {maxExtent: new OpenLayers.Bounds(100, 200, 300, 400)});
+        map.setOptions({theme: 'foo'});
+        
+        t.eq(map.theme, 'foo', "theme is correctly set by setOptions");
+        t.ok(map.maxExtent.equals(new OpenLayers.Bounds(100, 200, 300, 400)), 
+             "maxExtent is correct after calling setOptions");
+        
+        map.destroy();
+    }
+
+    function test_Map_add_layers(t) {
+        t.plan(8);
+        map = new OpenLayers.Map('map');
+        var layer1 = new OpenLayers.Layer.WMS("Layer 1", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        var layer2 = new OpenLayers.Layer.WMS("Layer 2",
+            "http://wms.jpl.nasa.gov/wms.cgi", {layers: "modis,global_mosaic"});
+        // this uses map.addLayer internally
+        map.addLayers([layer1, layer2])
+        t.eq( map.layers.length, 2, "map has exactly two layers" );
+        t.ok( map.layers[0] === layer1, "1st layer is layer1" );
+        t.ok( map.layers[1] === layer2, "2nd layer is layer2" );
+        t.ok( layer1.map === map, "layer.map is map" ); 
+        t.eq( parseInt(layer1.div.style.zIndex), map.Z_INDEX_BASE['BaseLayer'], 
+                "layer1 zIndex is set" );
+        t.eq( parseInt(layer2.div.style.zIndex), map.Z_INDEX_BASE['BaseLayer'] + 5, 
+                "layer2 zIndex is set" );
+
+        map.events.register('preaddlayer', this, function(evt) {
+            return !(evt.layer.name === 'donotadd');
+        });
+        var layer3 = new OpenLayers.Layer.WMS("donotadd",
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayers([layer3]);
+        t.eq(map.layers.length, 2, "layer is not added since preaddlayer returns false");
+        layer3.name = 'pleaseadd';
+        map.addLayers([layer3]);
+        t.eq(map.layers.length, 3, "layer is added since preaddlayer returns true");
+        
+        map.destroy();
+    }
+
+    function test_Map_options(t) {
+        t.plan(3);
+        map = new OpenLayers.Map('map', {numZoomLevels: 6, maxResolution: 3.14159, theme: 'foo'});
+        t.eq( map.numZoomLevels, 6, "map.numZoomLevels set correctly via options hashtable" );
+        t.eq( map.maxResolution, 3.14159, "map.maxResolution set correctly via options hashtable" );
+        t.eq( map.theme, 'foo', "map theme set correctly." );
+
+        map.destroy();
+    }
+    
+    function test_eventListeners(t) {
+        t.plan(1);
+        
+        var method = OpenLayers.Events.prototype.on;
+        // test that events.on is called at map construction
+        var options = {
+            eventListeners: {foo: "bar"},
+            controls: []
+        };
+        OpenLayers.Events.prototype.on = function(obj) {
+            t.eq(obj, options.eventListeners, "events.on called with eventListeners");
+        }
+        var map = new OpenLayers.Map('map', options);
+        OpenLayers.Events.prototype.on = method;
+        map.destroy();
+
+        // if events.on is called again, this will fail due to an extra test
+        // test map without eventListeners
+        OpenLayers.Events.prototype.on = function(obj) {
+            t.fail("events.on called without eventListeners");
+        }
+        var map2 = new OpenLayers.Map("map", {controls: []});
+        OpenLayers.Events.prototype.on = method;
+        map2.destroy();
+    }
+
+    function test_Map_center(t) {
+        t.plan(8);
+        map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"} );
+        map.addLayer(baseLayer);
+        var ll = new OpenLayers.LonLat(2,1);
+        map.setCenter(ll, 0);
+        t.ok( map.getCenter() instanceof OpenLayers.LonLat, "map.getCenter returns a LonLat");
+        t.eq( map.getZoom(), 0, "map.zoom is correct after calling setCenter");
+        t.ok( map.getCenter().equals(ll), "map center is correct after calling setCenter");
+        map.zoomIn();
+        t.eq( map.getZoom(), 1, "map.zoom is correct after calling setCenter,zoom in");
+        t.ok( map.getCenter().equals(ll), "map center is correct after calling setCenter, zoom in");
+        map.zoomOut();
+        t.eq( map.getZoom(), 0, "map.zoom is correct after calling setCenter,zoom in, zoom out");
+
+        map.zoomTo(5);
+        t.eq( map.getZoom(), 5, "map.zoom is correct after calling zoomTo" );
+
+    /**
+        map.zoomToMaxExtent();
+        t.eq( map.getZoom(), 2, "map.zoom is correct after calling zoomToMaxExtent" );
+        var lonlat = map.getCenter();
+        var zero = new OpenLayers.LonLat(0, 0);
+        t.ok( lonlat.equals(zero), "map center is correct after calling zoomToFullExtent" );
+    */
+
+        map.getCenter().lon = 10;
+        t.ok( map.getCenter().equals(ll), "map.getCenter returns a clone of map.center");
+
+        map.destroy();
+    }
+
+    function test_Map_zoomend_event (t) {
+        t.plan(2);
+
+        map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.events.register("zoomend", {count: 0}, function() { 
+            this.count++; 
+            t.ok(true, "zoomend event was triggered " + this.count + " times");
+            });
+        map.setCenter(new OpenLayers.LonLat(2, 1), 0);
+        map.zoomIn();
+        map.zoomOut();
+
+        map.destroy();
+    }
+
+    function test_Map_add_remove_popup (t) {
+        t.plan(4);
+
+        map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        
+        var popup = new OpenLayers.Popup("chicken", 
+                                         new OpenLayers.LonLat(0,0),
+                                         new OpenLayers.Size(200,200));
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+
+        map.addPopup(popup);
+        var pIndex = OpenLayers.Util.indexOf(map.popups, popup);
+        t.eq(pIndex, 0, "popup successfully added to Map's internal popups array");
+
+        var nodes = map.layerContainerDiv.childNodes;
+        
+        var found = false;
+        for (var i=0; i < nodes.length; i++) {
+            if (nodes.item(i) == popup.div) {
+                found = true;
+                break;
+            }
+        }
+        t.ok(found, "popup.div successfully added to the map's viewPort");
+
+        
+        map.removePopup(popup);
+        var pIndex = OpenLayers.Util.indexOf(map.popups, popup);
+        t.eq(pIndex, -1, "popup successfully removed from Map's internal popups array");
+
+        var found = false;
+        for (var i=0; i < nodes.length; i++) {
+            if (nodes.item(i) == popup.div) {
+                found = true;
+                break;
+            }
+        }
+        t.ok(!found, "popup.div successfully removed from the map's viewPort");
+
+        map.destroy();
+    }
+
+    function test_Map_add_popup_exclusive(t) {
+        t.plan(2);
+
+        map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+
+        for (var i = 0; i < 10; i++) {
+            var popup = new OpenLayers.Popup("chicken", 
+                                             new OpenLayers.LonLat(0,0),
+                                             new OpenLayers.Size(200,200));
+            map.addPopup(popup);
+        }
+        t.eq(map.popups.length, 10, "addPopup non exclusive mode works");
+
+        var popup = new OpenLayers.Popup("chicken", 
+                                         new OpenLayers.LonLat(0,0),
+                                         new OpenLayers.Size(200,200));
+        map.addPopup(popup, true);
+        t.eq(map.popups.length, 1, "addPopup exclusive mode works");
+
+        map.destroy();
+    }   
+    
+
+/***  THIS IS A GOOD TEST, BUT IT SHOULD BE MOVED TO WMS. 
+ *     Also, it won't work until we figure out the viewSize bug
+
+    function 08_Map_px_lonlat_translation (t) {
+        t.plan( 6 );    
+        map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"});
+        map.addLayer(baseLayer);
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+ 
+        var pixel = new OpenLayers.Pixel(50,150);
+        var lonlat = map.getLonLatFromViewPortPx(pixel);
+        t.ok( lonlat instanceof OpenLayers.LonLat, "getLonLatFromViewPortPx returns valid OpenLayers.LonLat" );
+
+        var newPixel = map.getViewPortPxFromLonLat(lonlat);
+        t.ok( newPixel instanceof OpenLayers.Pixel, "getViewPortPxFromLonLat returns valid OpenLayers.Pixel" );
+
+        // WARNING!!!  I'm faily sure that the following test's validity 
+        //             depends highly on rounding and the resolution. For now,
+        //             in the default case, it seems to work. This may not 
+        //             always be so.
+        t.ok( newPixel.equals(pixel), "Translation to pixel and back to lonlat is consistent");
+
+        lonlat = map.getLonLatFromPixel(pixel);
+        t.ok( lonlat instanceof OpenLayers.LonLat, "getLonLatFromPixel returns valid OpenLayers.LonLat" );
+
+        newPixel = map.getPixelFromLonLat(lonlat);
+        t.ok( newPixel instanceof OpenLayers.Pixel, "getPixelFromLonLat returns valid OpenLayers.Pixel" );
+
+        t.ok( newPixel.equals(pixel), "2nd translation to pixel and back to lonlat is consistent");
+    }
+ */
+
+    function test_Map_isValidLonLat(t) {
+        t.plan( 3 );    
+
+        map = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS('Test Layer', 
+                    "http://octo.metacarta.com/cgi-bin/mapserv", 
+                    {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
+                    {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
+        map.addLayer(layer);
+        
+        t.ok( !map.isValidLonLat(null), "null lonlat is not valid" );
+        t.ok( map.isValidLonLat(new OpenLayers.LonLat(33862, 717606)), "lonlat outside max extent is valid" );
+        t.ok( !map.isValidLonLat(new OpenLayers.LonLat(10, 10)), "lonlat outside max extent is not valid" );
+
+        map.destroy();
+    }
+
+    function test_Map_getLayer(t) {
+        var numLayers = 3;
+        t.plan( numLayers + 1 );    
+
+        var m = {
+            layers: []
+        };
+        
+        for(var i = 0; i < numLayers; i++) {
+            m.layers.push( { 'id': i } );
+        }
+
+        for(var i = 0; i < numLayers; i++) {
+            var layer = OpenLayers.Map.prototype.getLayer.apply(m, [i]);
+            t.ok( layer == m.layers[i], "getLayer correctly returns layer " + i);
+        }
+
+        var gotLayer = OpenLayers.Map.prototype.getLayer.apply(m, ["chicken"]);
+        t.ok( gotLayer == null, "getLayer correctly returns null when layer not found");
+
+        map.destroy();
+    }
+
+    function test_Map_getLayersBy(t) {
+        
+        var map = {
+            getBy: OpenLayers.Map.prototype.getBy,
+            getLayersBy: OpenLayers.Map.prototype.getLayersBy,
+            layers: [
+                {foo: "foo", id: Math.random()},
+                {foo: "bar", id: Math.random()},
+                {foo: "foobar", id: Math.random()},
+                {foo: "foo bar", id: Math.random()},
+                {foo: "foo", id: Math.random()}
+            ]
+        };
+
+        var cases = [
+            {
+                got: map.getLayersBy("foo", "foo"),
+                expected: [map.layers[0], map.layers[4]],
+                message: "(string literal) got two layers matching foo"
+            }, {
+                got: map.getLayersBy("foo", "bar"),
+                expected: [map.layers[1]],
+                message: "(string literal) got one layer matching foo"
+            }, {
+                got: map.getLayersBy("foo", "barfoo"),
+                expected: [],
+                message: "(string literal) got empty array for no foo match"
+            }, {
+                got: map.getLayersBy("foo", /foo/),
+                expected: [map.layers[0], map.layers[2], map.layers[3], map.layers[4]],
+                message: "(regexp literal) got three layers containing string"
+            }, {
+                got: map.getLayersBy("foo", /foo$/),
+                expected: [map.layers[0], map.layers[4]],
+                message: "(regexp literal) got three layers ending with string"
+            }, {
+                got: map.getLayersBy("foo", /\s/),
+                expected: [map.layers[3]],
+                message: "(regexp literal) got layer containing space"
+            }, {
+                got: map.getLayersBy("foo", new RegExp("BAR", "i")),
+                expected: [map.layers[1], map.layers[2], map.layers[3]],
+                message: "(regexp object) got layers ignoring case"
+            }, {
+                got: map.getLayersBy("foo", {test: function(str) {return str.length > 3;}}),
+                expected: [map.layers[2], map.layers[3]],
+                message: "(custom object) got layers with foo length greater than 3"
+            }
+        ];
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, cases[i].message);
+        }
+        
+    }
+
+    function test_Map_getLayersByName(t) {
+        
+        var map = {
+            getBy: OpenLayers.Map.prototype.getBy,
+            getLayersBy: OpenLayers.Map.prototype.getLayersBy,
+            getLayersByName: OpenLayers.Map.prototype.getLayersByName,
+            layers: [
+                {name: "foo", id: Math.random()},
+                {name: "bar", id: Math.random()},
+                {name: "foobar", id: Math.random()},
+                {name: "foo bar", id: Math.random()},
+                {name: "foo", id: Math.random()}
+            ]
+        };
+
+        var cases = [
+            {
+                got: map.getLayersByName("foo"),
+                expected: [map.layers[0], map.layers[4]],
+                message: "(string literal) got two layers matching name"
+            }, {
+                got: map.getLayersByName("bar"),
+                expected: [map.layers[1]],
+                message: "(string literal) got one layer matching name"
+            }, {
+                got: map.getLayersByName("barfoo"),
+                expected: [],
+                message: "(string literal) got empty array for no match"
+            }, {
+                got: map.getLayersByName(/foo/),
+                expected: [map.layers[0], map.layers[2], map.layers[3], map.layers[4]],
+                message: "(regexp literal) got three layers containing string"
+            }, {
+                got: map.getLayersByName(/foo$/),
+                expected: [map.layers[0], map.layers[4]],
+                message: "(regexp literal) got three layers ending with string"
+            }, {
+                got: map.getLayersByName(/\s/),
+                expected: [map.layers[3]],
+                message: "(regexp literal) got layer containing space"
+            }, {
+                got: map.getLayersByName(new RegExp("BAR", "i")),
+                expected: [map.layers[1], map.layers[2], map.layers[3]],
+                message: "(regexp object) got layers ignoring case"
+            }, {
+                got: map.getLayersByName({test: function(str) {return str.length > 3;}}),
+                expected: [map.layers[2], map.layers[3]],
+                message: "(custom object) got layers with name length greater than 3"
+            }
+        ];
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, cases[i].message);
+        }
+        
+    }
+
+    function test_Map_getLayersByClass(t) {
+        
+        var map = {
+            getBy: OpenLayers.Map.prototype.getBy,
+            getLayersBy: OpenLayers.Map.prototype.getLayersBy,
+            getLayersByClass: OpenLayers.Map.prototype.getLayersByClass,
+            layers: [
+                {CLASS_NAME: "foo", id: Math.random()},
+                {CLASS_NAME: "bar", id: Math.random()},
+                {CLASS_NAME: "foobar", id: Math.random()},
+                {CLASS_NAME: "foo bar", id: Math.random()},
+                {CLASS_NAME: "foo", id: Math.random()}
+            ]
+        };
+
+        var cases = [
+            {
+                got: map.getLayersByClass("foo"),
+                expected: [map.layers[0], map.layers[4]],
+                message: "(string literal) got two layers matching type"
+            }, {
+                got: map.getLayersByClass("bar"),
+                expected: [map.layers[1]],
+                message: "(string literal) got one layer matching type"
+            }, {
+                got: map.getLayersByClass("barfoo"),
+                expected: [],
+                message: "(string literal) got empty array for no match"
+            }, {
+                got: map.getLayersByClass(/foo/),
+                expected: [map.layers[0], map.layers[2], map.layers[3], map.layers[4]],
+                message: "(regexp literal) got three layers containing string"
+            }, {
+                got: map.getLayersByClass(/foo$/),
+                expected: [map.layers[0], map.layers[4]],
+                message: "(regexp literal) got three layers ending with string"
+            }, {
+                got: map.getLayersByClass(/\s/),
+                expected: [map.layers[3]],
+                message: "(regexp literal) got layer containing space"
+            }, {
+                got: map.getLayersByClass(new RegExp("BAR", "i")),
+                expected: [map.layers[1], map.layers[2], map.layers[3]],
+                message: "(regexp object) got layers ignoring case"
+            }, {
+                got: map.getLayersByClass({test: function(str) {return str.length > 3;}}),
+                expected: [map.layers[2], map.layers[3]],
+                message: "(custom object) got layers with type length greater than 3"
+            }
+        ];
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, cases[i].message);
+        }
+        
+    }
+
+    function test_Map_getControlsBy(t) {
+        
+        var map = {
+            getBy: OpenLayers.Map.prototype.getBy,
+            getControlsBy: OpenLayers.Map.prototype.getControlsBy,
+            controls: [
+                {foo: "foo", id: Math.random()},
+                {foo: "bar", id: Math.random()},
+                {foo: "foobar", id: Math.random()},
+                {foo: "foo bar", id: Math.random()},
+                {foo: "foo", id: Math.random()}
+            ]
+        };
+
+        var cases = [
+            {
+                got: map.getControlsBy("foo", "foo"),
+                expected: [map.controls[0], map.controls[4]],
+                message: "(string literal) got two controls matching foo"
+            }, {
+                got: map.getControlsBy("foo", "bar"),
+                expected: [map.controls[1]],
+                message: "(string literal) got one control matching foo"
+            }, {
+                got: map.getControlsBy("foo", "barfoo"),
+                expected: [],
+                message: "(string literal) got empty array for no foo match"
+            }, {
+                got: map.getControlsBy("foo", /foo/),
+                expected: [map.controls[0], map.controls[2], map.controls[3], map.controls[4]],
+                message: "(regexp literal) got three controls containing string"
+            }, {
+                got: map.getControlsBy("foo", /foo$/),
+                expected: [map.controls[0], map.controls[4]],
+                message: "(regexp literal) got three controls ending with string"
+            }, {
+                got: map.getControlsBy("foo", /\s/),
+                expected: [map.controls[3]],
+                message: "(regexp literal) got control containing space"
+            }, {
+                got: map.getControlsBy("foo", new RegExp("BAR", "i")),
+                expected: [map.controls[1], map.controls[2], map.controls[3]],
+                message: "(regexp object) got layers ignoring case"
+            }, {
+                got: map.getControlsBy("foo", {test: function(str) {return str.length > 3;}}),
+                expected: [map.controls[2], map.controls[3]],
+                message: "(custom object) got controls with foo length greater than 3"
+            }
+        ];
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, cases[i].message);
+        }
+        
+    }
+
+    function test_Map_getControlsByClass(t) {
+        
+        var map = {
+            getBy: OpenLayers.Map.prototype.getBy,
+            getControlsBy: OpenLayers.Map.prototype.getControlsBy,
+            getControlsByClass: OpenLayers.Map.prototype.getControlsByClass,
+            controls: [
+                {CLASS_NAME: "foo", id: Math.random()},
+                {CLASS_NAME: "bar", id: Math.random()},
+                {CLASS_NAME: "foobar", id: Math.random()},
+                {CLASS_NAME: "foo bar", id: Math.random()},
+                {CLASS_NAME: "foo", id: Math.random()}
+            ]
+        };
+
+        var cases = [
+            {
+                got: map.getControlsByClass("foo"),
+                expected: [map.controls[0], map.controls[4]],
+                message: "(string literal) got two controls matching type"
+            }, {
+                got: map.getControlsByClass("bar"),
+                expected: [map.controls[1]],
+                message: "(string literal) got one control matching type"
+            }, {
+                got: map.getControlsByClass("barfoo"),
+                expected: [],
+                message: "(string literal) got empty array for no match"
+            }, {
+                got: map.getControlsByClass(/foo/),
+                expected: [map.controls[0], map.controls[2], map.controls[3], map.controls[4]],
+                message: "(regexp literal) got three controls containing string"
+            }, {
+                got: map.getControlsByClass(/foo$/),
+                expected: [map.controls[0], map.controls[4]],
+                message: "(regexp literal) got three controls ending with string"
+            }, {
+                got: map.getControlsByClass(/\s/),
+                expected: [map.controls[3]],
+                message: "(regexp literal) got control containing space"
+            }, {
+                got: map.getControlsByClass(new RegExp("BAR", "i")),
+                expected: [map.controls[1], map.controls[2], map.controls[3]],
+                message: "(regexp object) got controls ignoring case"
+            }, {
+                got: map.getControlsByClass({test: function(str) {return str.length > 3;}}),
+                expected: [map.controls[2], map.controls[3]],
+                message: "(custom object) got controls with type length greater than 3"
+            }
+        ];
+        t.plan(cases.length);
+        for(var i=0; i<cases.length; ++i) {
+            t.eq(cases[i].got, cases[i].expected, cases[i].message);
+        }
+        
+    }
+
+    function test_Map_double_addLayer(t) {
+        t.plan( 1 );    
+
+        map = new OpenLayers.Map($('map'));
+        layer = new OpenLayers.Layer.WMS('Test Layer', 
+                    "http://octo.metacarta.com/cgi-bin/mapserv", 
+                    {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'} 
+                    );
+
+        map.addLayers([layer,layer]);
+        
+        t.eq( map.layers.length, 1, "Map does not allow double adding of layers." );
+    
+        map.destroy();
+    }
+
+    function test_Map_setBaseLayer(t) {
+        t.plan( 4 );
+        
+        map = new OpenLayers.Map('map');
+
+        var wmslayer = new OpenLayers.Layer.WMS('Test Layer', 
+                    "http://octo.metacarta.com/cgi-bin/mapserv", 
+                    {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
+                    {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
+
+        var wmslayer2 = new OpenLayers.Layer.WMS('Test Layer2', 
+                    "http://octo.metacarta.com/cgi-bin/mapserv", 
+                    {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
+                    {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
+
+        map.addLayers([wmslayer, wmslayer2]);
+
+        t.ok(map.baseLayer == wmslayer, "default base layer is first one added");
+        
+        map.setBaseLayer(null);
+        t.ok(map.baseLayer == wmslayer, "setBaseLayer on null object does nothing (and does not break)");
+        
+        map.setBaseLayer("chicken");
+        t.ok(map.baseLayer == wmslayer, "setBaseLayer on non-layer object does nothing (and does not break)");
+        
+        map.setBaseLayer(wmslayer2);
+        t.ok(map.baseLayer == wmslayer2, "setbaselayer correctly sets 'baseLayer' property");
+
+        map.destroy();
+    }
+    
+    function test_Map_removeLayer(t) {
+        t.plan(1);
+        var f = function() {};
+        var layers = [
+            {name: "fee", removeMap: f},
+            {name: "fi", removeMap: f},
+            {name: "fo", removeMap: f},
+            {name: "fum", removeMap: f}
+        ];
+        var map = {
+            layers: layers,
+            baseLayer: layers[0],
+            layerContainerDiv: {removeChild: f},
+            events: {triggerEvent: f},
+            resetLayersZIndex: function() {}
+        };
+        OpenLayers.Map.prototype.removeLayer.apply(map, [map.baseLayer, false]);
+        t.eq(map.baseLayer, null,
+             "removing the baselayer sets baseLayer to null");        
+    }
+
+    function test_Map_removeLayer_res(t) {
+        t.plan(2);
+        
+        map = new OpenLayers.Map('map');
+
+        var layer0 = new OpenLayers.Layer.WMS(
+            'Test Layer 0', 
+            "http://octo.metacarta.com/cgi-bin/mapserv", 
+            {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
+            {resolutions: [4, 2, 1]}
+        );
+
+        var layer1 = new OpenLayers.Layer.WMS(
+            'Test Layer 1', 
+            "http://octo.metacarta.com/cgi-bin/mapserv", 
+            {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
+            {resolutions: [4, 2]}
+        );
+
+        map.addLayers([layer0, layer1]);
+        map.zoomToMaxExtent();
+        map.zoomTo(2);
+        t.eq(map.getResolution(), layer0.resolutions[2],
+             "correct resolution before removal");
+        map.removeLayer(layer0);
+        t.eq(map.getResolution(), layer0.resolutions[1],
+             "correct resolution after removal");
+
+        map.destroy();
+    }
+
+    function test_Map_removeLayer_zindex(t) {
+        t.plan(2);
+        
+        map = new OpenLayers.Map('map');
+
+        var layer0 = new OpenLayers.Layer('Test Layer 0', {isBaseLayer:true});
+        var layer1 = new OpenLayers.Layer('Test Layer 1', {isBaseLayer:true});
+        var layer2 = new OpenLayers.Layer('Test Layer 2', {isBaseLayer:false});
+
+        map.addLayers([layer0, layer1, layer2]);
+        map.removeLayer(layer0);
+
+        t.eq(parseInt(layer1.div.style.zIndex), map.Z_INDEX_BASE['BaseLayer'],
+             "correct z-index after removeLayer");
+        t.eq(parseInt(layer2.div.style.zIndex), map.Z_INDEX_BASE['Overlay'] + 5,
+             "correct z-index after removeLayer");
+
+        map.destroy();
+    }
+
+    function test_Map_setBaseLayer_after_pan (t) {
+        t.plan(1);
+
+        map = new OpenLayers.Map('map');
+        var wmsLayer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
+        var tmsLayer = new OpenLayers.Layer.TMS("TMS",
+                                    "http://labs.metacarta.com/wms-c/Basic.py/",
+                                    {'layername':'basic', 'type':'png'});
+        map.addLayers([wmsLayer,tmsLayer]);
+        map.setBaseLayer(wmsLayer);
+        map.zoomToMaxExtent();
+        map.setBaseLayer(tmsLayer);
+        map.zoomIn();
+        map.pan(0, -200, {animate:false});
+        map.setBaseLayer(wmsLayer);
+        t.eq(map.layerContainerDiv.style.top, "0px", "layerContainer is recentered after setBaseLayer");
+        
+        map.destroy();
+    }
+
+    function test_Map_moveLayer (t) {
+        t.plan(10);
+
+        var ct  = 0;
+        map = new OpenLayers.Map('map');
+        var wmslayer = new OpenLayers.Layer.WMS('Test Layer', 
+                    "http://octo.metacarta.com/cgi-bin/mapserv", 
+                    {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
+                    {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
+
+        var wmslayer2 = new OpenLayers.Layer.WMS('Test Layer2', 
+                    "http://octo.metacarta.com/cgi-bin/mapserv", 
+                    {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
+                    {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
+
+        var wmslayer3 = new OpenLayers.Layer.WMS('Test Layer2', 
+                    "http://octo.metacarta.com/cgi-bin/mapserv", 
+                    {map: '/mapdata/vmap_wms.map', layers: 'basic', format: 'image/jpeg'}, 
+                    {maxExtent: new OpenLayers.Bounds(33861, 717605, 330846, 1019656), maxResolution: 296985/1024, projection:"EPSG:2805" } );
+
+        map.addLayers([wmslayer, wmslayer2, wmslayer3]);
+        map.events.register("changelayer", map, function (e) { ct++; });
+        t.eq( map.getNumLayers(), 3, "getNumLayers returns the number of layers" );
+        t.eq( map.getLayerIndex(wmslayer3), 2, "getLayerIndex returns the right index" );
+        map.raiseLayer(wmslayer3, 1);
+        t.eq( map.getLayerIndex(wmslayer3), 2, "can't moveLayer up past the top of the stack" );
+        map.raiseLayer(wmslayer, -1);
+        t.eq( map.getLayerIndex(wmslayer), 0, "can't moveLayer down past the bottom of the stack" );
+        map.raiseLayer(wmslayer3, -1);
+        t.eq( map.getLayerIndex(wmslayer3), 1, "can moveLayer down from the top" );
+        t.eq( parseInt(wmslayer3.div.style.zIndex), map.Z_INDEX_BASE['BaseLayer'] + 5,
+            "layer div has the right zIndex after moving down" );
+        map.raiseLayer(wmslayer, 2);
+        t.eq( map.getLayerIndex(wmslayer), 2, "can moveLayer up from the bottom" );
+        t.eq( parseInt(wmslayer.div.style.zIndex), map.Z_INDEX_BASE['BaseLayer'] + 2 * 5,
+            "layer div has the right zIndex after moving up" );
+        t.eq( map.getLayerIndex(wmslayer3), 0, "top layer is now on the bottom" );
+        t.eq( ct, 3, "raiseLayer triggered changelayer the right # of times" );
+
+        map.destroy();
+    }
+
+    function test_Map_moveTo(t) {
+        t.plan(2);
+
+        map = new OpenLayers.Map('map');
+        var baseLayer = new OpenLayers.Layer.WMS("Test Layer", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"},
+            {maxResolution: 'auto', maxExtent: new OpenLayers.Bounds(-10,-10,10,10)});
+        baseLayer.events.on({
+            move: function() {
+                t.ok(true, "move listener called");
+            },
+            moveend: function(e) {
+                t.eq(e.zoomChanged, true, "moveend listener called with expected value");
+            }
+        });
+        map.addLayer(baseLayer);
+        var ll = new OpenLayers.LonLat(-100,-150);
+        map.moveTo(ll, 2);
+        t.ok(map.getCenter().equals(new OpenLayers.LonLat(0,0)), "safely sets out-of-bounds lonlat");
+
+        map.destroy();
+    }
+
+    function test_Map_defaultTheme(t) {
+        t.plan(5);
+        
+        var links = document.getElementsByTagName('link');
+        map = new OpenLayers.Map('map');
+        var gotNodes = 0;
+        var themeNode = null;
+        for(var i=0; i<links.length; ++i) {
+            if(OpenLayers.Util.isEquivalentUrl(map.theme, links.item(i).href)) {
+                gotNodes += 1;
+                themeNode = links.item(i);
+            }
+        }
+        t.eq(gotNodes, 1, "by default, a single link node is added to document");
+        t.ok(themeNode != null, "a link node with the theme href was added");
+        t.eq(themeNode.rel, "stylesheet", "node added has rel set to stylesheet");
+        t.eq(themeNode.type, "text/css", "node added has type set to text/css");
+        
+        // reconstruct the map to prove that another link is not added
+        map = new OpenLayers.Map('map');
+        t.eq(links.length, document.getElementsByTagName('link').length,
+             "calling the map constructor twice with the same theme doesn't add duplicate link nodes");
+
+        map.destroy();
+    }
+
+    function test_Map_customTheme(t) {
+        t.plan(5);
+        
+        var customTheme = 'foo';
+        var options = {theme: customTheme};
+        map = new OpenLayers.Map('map', options);
+
+        var links = document.getElementsByTagName('link');
+        var gotNodes = 0;
+        var themeNode = null;
+        for(var i=0; i<links.length; ++i) {
+            if(OpenLayers.Util.isEquivalentUrl(map.theme, links.item(i).href)) {
+                gotNodes += 1;
+                themeNode = links.item(i);
+            }
+        }
+        
+        t.eq(map.theme, customTheme, "map theme is properly set");
+        t.eq(gotNodes, 1, "with custom theme, a single link node is added to document");
+        t.ok(themeNode != null, "a link node with the theme href was added");
+        t.eq(themeNode.rel, "stylesheet", "node added has rel set to stylesheet");
+        t.eq(themeNode.type, "text/css", "node added has type set to text/css");
+        
+        map.destroy();
+    }
+
+    function test_Map_noTheme(t) {
+        t.plan(1);
+        
+        var head = document.getElementsByTagName('head')[0];
+        var nodeCount = head.childNodes.length;
+        
+        var options = {theme: null};
+        map = new OpenLayers.Map('map', options);
+
+        t.eq(nodeCount, head.childNodes.length, "with no theme, a node is not added to document head" );
+
+        map.destroy();
+    }
+
+    function test_Map_addControls(t) {
+        t.plan(5);
+        var map = new OpenLayers.Map('map', {
+            controls: []
+        });
+        var controls = [
+          new OpenLayers.Control({id:'firstctrl'}),
+          new OpenLayers.Control({id:'secondctrl'})
+        ];
+        map.addControls(controls);
+        t.eq(map.controls.length, 2, "two controls were added by map.addControls without a px-array");
+        t.eq(map.controls[0].id, 'firstctrl', "control with index 0 has id 'firstctrl'");
+        t.eq(map.controls[1].id, 'secondctrl', "control with index 1 has id 'secondctrl'");
+        
+        var controls2 = [
+          new OpenLayers.Control({id:'thirdctrl'}),
+          new OpenLayers.Control({id:'fourthctrl'}),
+          new OpenLayers.Control({id:'fifthctrl'})
+        ];
+        // this array is intentionally one element shorter than the above       
+        var pixels2 = [
+          null,
+          new OpenLayers.Pixel(27,11)
+        ];
+        map.addControls(controls2, pixels2);
+        t.eq(map.controls.length, 5, "three additional controls were added by map.addControls with a px-array");
+        t.eq(map.controls[3].position.toString(), pixels2[1].toString(), "control 'fourthctrl' has position set to given px");
+    }
+
+    function test_Map_getControl(t) {
+        t.plan(2);
+        
+        var map1 = new OpenLayers.Map('map');
+        
+        var control = new OpenLayers.Control();
+        map1.addControl(control);
+
+        var gotControl = map1.getControl(control.id);
+        t.ok(gotControl == control, "got right control");
+        
+        gotControl = map1.getControl("bogus id");
+        t.ok(gotControl == null, "getControl() for bad id returns null");
+
+        map1.destroy();
+    }
+
+    function test_Map_removeControl(t) {
+        t.plan(6);
+        
+        var oldNumControls, newNumControls;
+        
+        var map1 = new OpenLayers.Map('map');
+        oldNumControls = map1.controls.length;
+        
+        var control = new OpenLayers.Control();
+        map1.addControl(control);
+
+    //add control        
+        newNumControls = map1.controls.length;
+        t.ok( newNumControls = oldNumControls + 1, "adding a control increases control count")
+
+        var foundDiv = false;
+        for(var i=0; i < map1.viewPortDiv.childNodes.length; i++) {
+            var childNode = map1.viewPortDiv.childNodes[i];
+            if (childNode == control.div) {
+                foundDiv = true;
+            }
+        }
+        t.ok(foundDiv, "new control's div correctly added to viewPort");
+
+    //remove control        
+        map1.removeControl(control)
+        newNumControls = map1.controls.length;
+        t.ok( newNumControls == oldNumControls, "removing the control decreases control count")
+
+        var gotControl = map1.getControl(control.id);
+        t.ok( gotControl == null, "control no longer in map's controls array");
+
+        var foundDiv = false;
+        for(var i=0; i < map1.viewPortDiv.childNodes.length; i++) {
+            var childNode = map1.viewPortDiv.childNodes[i];
+            if (childNode == control.div) {
+                foundDiv = true;
+            }
+        }
+        t.ok(!foundDiv, "control no longer child of viewPort");
+
+    //remove bogus
+        control = { id: "bogus id" };
+        map1.removeControl(control);
+        newNumControls = map1.controls.length;
+        t.ok( newNumControls == oldNumControls, "removing bad controlid doesnt crash or decrease control count")
+
+        map1.destroy();
+
+    }
+
+    function test_Map_restrictedExtent(t) {
+        t.plan(24);
+        var extent = new OpenLayers.Bounds(-180, -90, 180, 90);
+        var options = {
+            maxResolution: "auto"
+        };
+        var map = new OpenLayers.Map("map", options);
+        var layer = new OpenLayers.Layer.WMS(
+            "test", 
+            "http://octo.metacarta.com/cgi-bin/mapserv?",
+            {map: "/mapdata/vmap_wms.map", layers: "basic"}
+        );
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        var nw = new OpenLayers.LonLat(extent.left, extent.top);
+        var ne = new OpenLayers.LonLat(extent.right, extent.top);
+        var sw = new OpenLayers.LonLat(extent.left, extent.bottom);
+        var se = new OpenLayers.LonLat(extent.right, extent.bottom);
+        
+        // try panning to northwest corner
+        map.setOptions({restrictedExtent: extent});
+        map.setCenter(nw, 0);
+        t.eq(map.getExtent().getCenterLonLat().toString(),
+             extent.getCenterLonLat().toString(),
+             "map extent properly restricted to northwest at zoom 0");
+        t.eq(map.zoom, 0, "zoom not restricted for nw, 0");
+        map.setCenter(nw, 5);
+        t.eq(map.getExtent().top, extent.top,
+             "map extent top properly restricted to northwest at zoom 5");
+        t.eq(map.getExtent().left, extent.left,
+             "map extent left properly restricted to northwest at zoom 5");
+        t.eq(map.zoom, 5, "zoom not restricted for nw, 5");
+        map.setOptions({restrictedExtent: null});
+        map.setCenter(nw, 0);
+        t.eq(map.getExtent().getCenterLonLat().toString(),
+             nw.toString(),
+             "map extent not restricted with null restrictedExtent for nw");
+
+        // try panning to northeast corner
+        map.setOptions({restrictedExtent: extent});
+        map.setCenter(ne, 0);
+        t.eq(map.getExtent().getCenterLonLat().toString(),
+             extent.getCenterLonLat().toString(),
+             "map extent properly restricted to northeast at zoom 0");
+        t.eq(map.zoom, 0, "zoom not restricted for ne, 0");
+        map.setCenter(ne, 5);
+        t.eq(map.getExtent().top, extent.top,
+             "map extent top properly restricted to northeast at zoom 5");
+        t.eq(map.getExtent().right, extent.right,
+             "map extent right properly restricted to northeast at zoom 5");
+        t.eq(map.zoom, 5, "zoom not restricted for ne, 5");
+        map.setOptions({restrictedExtent: null});
+        map.setCenter(ne, 0);
+        t.eq(map.getExtent().getCenterLonLat().toString(),
+             ne.toString(),
+             "map extent not restricted with null restrictedExtent for ne");
+        
+        // try panning to southwest corner
+        map.setOptions({restrictedExtent: extent});
+        map.setCenter(sw, 0);
+        t.eq(map.getExtent().getCenterLonLat().toString(),
+             extent.getCenterLonLat().toString(),
+             "map extent properly restricted to southwest at zoom 0");
+        t.eq(map.zoom, 0, "zoom not restricted for sw, 0");
+        map.setCenter(sw, 5);
+        t.eq(map.getExtent().bottom, extent.bottom,
+             "map extent bottom properly restricted to southwest at zoom 5");
+        t.eq(map.getExtent().left, extent.left,
+             "map extent left properly restricted to southwest at zoom 5");
+        t.eq(map.zoom, 5, "zoom not restricted for sw, 5");
+        map.setOptions({restrictedExtent: null});
+        map.setCenter(sw, 0);
+        t.eq(map.getExtent().getCenterLonLat().toString(),
+             sw.toString(),
+             "map extent not restricted with null restrictedExtent for sw");
+
+        // try panning to southeast corner
+        map.setOptions({restrictedExtent: extent});
+        map.setCenter(se, 0);
+        t.eq(map.getExtent().getCenterLonLat().toString(),
+             extent.getCenterLonLat().toString(),
+             "map extent properly restricted to southeast at zoom 0");
+        t.eq(map.zoom, 0, "zoom not restricted for se, 0");
+        map.setCenter(se, 5);
+        t.eq(map.getExtent().bottom, extent.bottom,
+             "map extent bottom properly restricted to southeast at zoom 5");
+        t.eq(map.getExtent().right, extent.right,
+             "map extent right properly restricted to southeast at zoom 5");
+        t.eq(map.zoom, 5, "zoom not restricted for se, 5");
+        map.setOptions({restrictedExtent: null});
+        map.setCenter(se, 0);
+        t.eq(map.getExtent().getCenterLonLat().toString(),
+             se.toString(),
+             "map extent not restricted with null restrictedExtent for se");
+
+        map.destroy();
+    }
+    
+    function test_Map_getResolutionForZoom(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var res = map.getResolutionForZoom();
+        t.eq(res, null, "getResolutionForZoom returns null for no base layer");
+        map.fractionalZoom = true;
+        var layer = new OpenLayers.Layer("test", {isBaseLayer: true});
+        layer.getResolutionForZoom = function() {
+            t.ok(true, "getResolutionForZoom calls base layer getResolutionForZoom");
+        }
+        map.addLayer(layer);
+        var res = map.getResolutionForZoom();
+        layer.destroy();
+        map.destroy();
+    }
+    
+    function test_zoomTo(t) {
+        t.plan(8);
+        
+        var map = new OpenLayers.Map("map");
+        map.addLayer(new OpenLayers.Layer(null, {
+            isBaseLayer: true
+        }));
+        
+        map.zoomToMaxExtent();
+        
+        map.zoomTo(2);
+        t.eq(map.getZoom(), 2, 'zoomTo(2)');
+
+        map.zoomTo(3.6);
+        t.eq(map.getZoom(), 4, 'zoomTo(3.6)');
+        
+        map.zoomTo("4.6");
+        t.eq(map.getZoom(), 5, 'zoomTo("4.6")');
+        
+        map.zoomTo("1.2");
+        t.eq(map.getZoom(), 1, 'zoomTo("1.2")');
+        
+        // now allow fractional zoom
+        map.fractionalZoom = true;
+        
+        map.zoomTo(2);
+        t.eq(map.getZoom(), 2, '[fractionalZoom] zoomTo(2)');
+
+        map.zoomTo(3.6);
+        t.eq(map.getZoom(), 3.6, '[fractionalZoom] zoomTo(3.6)');
+        
+        map.zoomTo("4.6");
+        t.eq(map.getZoom(), 4.6, '[fractionalZoom] zoomTo("4.6")');
+        
+        map.zoomTo("1.2");
+        t.eq(map.getZoom(), 1.2, '[fractionalZoom] zoomTo("1.2")');
+        
+        map.destroy();
+    }
+    
+    function test_Map_getUnits(t) {
+        t.plan(2);
+        var map = new OpenLayers.Map("map");
+        var units = map.getUnits();
+        t.eq(units, null, "getUnits returns null for no base layer");
+        
+        var layer = new OpenLayers.Layer("test", {
+            isBaseLayer: true,
+            units: 'foo'
+        });
+        map.addLayer(layer);
+        var units = map.getUnits();
+        t.eq(units, 'foo', "getUnits returns the base layer units property");
+        layer.destroy();
+        map.destroy();
+    }
+
+    function test_Map_destroy (t) {
+        t.plan( 3 );    
+        map = new OpenLayers.Map('map');
+        map.destroy();
+        t.eq( map.layers, null, "map.layers is null after destroy" );
+        t.eq( map.controls, null, "map.controls is null after destroy" );
+        t.eq( map.viewPortDiv, null, "map's viewportDiv nullified");
+    }
+
+    function test_Map_getMaxExtent(t){
+        t.plan(5);
+
+        var options = null;
+        var map = {};
+
+      //null options, no baseLayer
+        var maxExtent = OpenLayers.Map.prototype.getMaxExtent.apply(map, [options]);
+        t.eq(maxExtent, null, "null options, no baseLayer returns null");     
+
+      //null options.restricted, no baseLayer
+        maxExtent = OpenLayers.Map.prototype.getMaxExtent.apply(map, [options]);
+        t.eq(maxExtent, null, "null options.restricted, no baseLayer returns null");     
+
+      //true options.restricted, null map.restrictedExtent no baseLayer
+        maxExtent = OpenLayers.Map.prototype.getMaxExtent.apply(map, [options]);
+        t.eq(maxExtent, null, "true options.restricted, null map.restrictedExtent no baseLayer returns null");     
+
+      //true options.restricted, valid map.restrictedExtent no baseLayer
+        options = {
+            'restricted': true
+        };
+        map.restrictedExtent = {};
+        maxExtent = OpenLayers.Map.prototype.getMaxExtent.apply(map, [options]);
+        t.ok(maxExtent == map.restrictedExtent, "true options.restricted, valid map.restrictedExtent no baseLayer returns map.restrictedExtent");     
+
+      //null options, valid baseLayer
+        options = null;
+        map.baseLayer = {
+            'maxExtent': {}
+        };
+        var maxExtent = OpenLayers.Map.prototype.getMaxExtent.apply(map, [options]);
+        t.ok(maxExtent == map.baseLayer.maxExtent, "null options, valid baseLayer returns map.baseLayer.maxExtent");     
+    }
+
+    function test_Map_zoomToMaxExtent(t){
+        t.plan(4)
+
+        gMaxExtent = {};
+
+        var map = {
+            'getMaxExtent': function(options) {
+                gRestricted = options.restricted; 
+                return gMaxExtent;
+            }, 
+            'zoomToExtent': function(extent) {
+                t.ok(extent == gMaxExtent, "zoomToExtent() always called on return from map.getMaxExtent()");
+            } 
+        };
+
+      //options is null
+        var options = null;
+        gRestricted = null;
+        OpenLayers.Map.prototype.zoomToMaxExtent.apply(map, [options]);
+        t.eq(gRestricted, true, "default 'restricted' passed to map.getMaxExtent() is true");
+        
+      //valid options
+        options = {
+            'restricted': {}
+        };
+        gRestricted = null;
+        OpenLayers.Map.prototype.zoomToMaxExtent.apply(map, [options]);
+        t.ok(gRestricted == options.restricted, "when valid options argument, 'options.restricted' passed to map.getMaxExtent()");
+    }
+
+    function test_Map_zoomToScale(t) {
+        t.plan(4);
+        
+        var m = {
+            'baseLayer': { 'units': {} },
+            'getSize': function() { return {'w': 10, 'h': 15}; },
+            'getCenter': function() { return {'lon': -5, 'lat': -25}; },
+            'zoomToExtent': function(extent, closest) {
+                t.ok(extent.equals(g_ExpectedExtent), "extent correctly calculated for zoomToExtent()");
+                t.ok(closest == g_Closest, "closest correctly passed on to zoomToExtent()");
+            }            
+        }
+
+        var temp = OpenLayers.Util.getResolutionFromScale;
+        OpenLayers.Util.getResolutionFromScale = function(scale, units) {
+            t.ok(scale == g_Scale, "scale parameter correctly passed to getResolutionFromScale");
+            t.ok(units == m.baseLayer.units, "map's baselayer's units parameter correctly passed to getResolutionFromScale");
+            return 1000;
+        };
+ 
+        g_ExpectedExtent = new OpenLayers.Bounds(-5005,-7525,4995,7475);
+        g_Scale = {};
+        g_Closest = {};
+        var args = [g_Scale, g_Closest];
+        OpenLayers.Map.prototype.zoomToScale.apply(m, args);    
+
+        OpenLayers.Util.getResolutionFromScale = temp;
+    }
+    
+    function test_Map_zoomToExtent(t) {
+        t.plan(8);
+
+        
+        var m = {
+            'baseLayer': {
+                'wrapDateLine': false      
+            },
+            'setCenter': function(center, zoomLevel) {
+                g_Center = center;
+                g_ZoomLevel = zoomLevel;
+            },
+            'getZoomForExtent': function(bounds, closest) {
+                t.ok(bounds.equals(g_ToCenterBounds), "bounds correctly passed into getZoomForExtent()");
+                t.ok(closest == g_Closest, "closest correctly passed along to getZoomForExtent()");
+                return g_ZoomLevelReturn;
+            }
+        };
+
+    //no wrapDateLine        
+        g_ZoomLevelReturn = {};
+        g_Bounds = new OpenLayers.Bounds(-20,-15,0,5);
+        g_ExpectedCenter = new OpenLayers.LonLat(-10,-5);
+        g_Closest = {};
+        g_ToCenterBounds = g_Bounds;
+        var args = [g_Bounds, g_Closest];
+        OpenLayers.Map.prototype.zoomToExtent.apply(m, args);
+        
+        t.ok(g_Center.equals(g_ExpectedCenter), "setCenter called on correct center");
+        t.ok(g_ZoomLevel == g_ZoomLevelReturn, "correctly passes along zoom level as returned from getZoomForExtent()");
+
+
+    //wrapDateLine
+        m.baseLayer.wrapDateLine = true;
+        m.getMaxExtent = function() { return new OpenLayers.Bounds(-200,-200,200,200); };
+
+        g_ZoomLevelReturn = {};
+        g_BoundsCenter = {};
+        g_Bounds = new OpenLayers.Bounds(160,-60,-60,60);
+        g_ExpectedCenter = new OpenLayers.LonLat(-150,0);
+        g_Closest = {};
+        g_ToCenterBounds = new OpenLayers.Bounds(160,-60,340,60);
+        var args = [g_Bounds, g_Closest];
+        OpenLayers.Map.prototype.zoomToExtent.apply(m, args);
+        t.ok(g_Center.equals(g_ExpectedCenter), "setCenter called on correct center");
+        t.ok(g_ZoomLevel == g_ZoomLevelReturn, "correctly passes along zoom level as returned from getZoomForExtent()");
+
+        
+    }
+    
+    function test_allOverlays(t) {
+        
+        t.plan(18);
+
+        var map = new OpenLayers.Map({
+            div: "map", allOverlays: true
+        });
+        
+        var a = new OpenLayers.Layer.Vector("a", {visibility: true});
+
+        var b = new OpenLayers.Layer.Image(
+            "b",
+            "http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif",
+            new OpenLayers.Bounds(-180, -88.759, 180, 88.759),
+            new OpenLayers.Size(580, 288)
+        );
+
+        var c = new OpenLayers.Layer.WMS(
+            "c",
+            "http://labs.metacarta.com/wms/vmap0",
+            {layers: 'basic'}
+        );
+
+        var d = new OpenLayers.Layer.Vector("d");
+        
+        map.addLayers([a, b, c, d]);
+
+        var moveCount = 0;
+        a.moveTo = function() {
+            moveCount++;
+            OpenLayers.Layer.Vector.prototype.moveTo.apply(this, arguments);
+        };
+
+        map.zoomToMaxExtent();
+        t.eq(moveCount, 1, "map.moveTo moves the base layer only once");
+        t.eq(map.getCenter().toString(), "lon=0,lat=0", "a map with all overlays can have a center");
+
+        a.setVisibility(false);
+        var moveend = 0;
+        a.events.on({"moveend": function() { moveend++; }}); 
+        map.zoomToMaxExtent();
+        t.eq(moveCount, 1, "map.moveTo does not move the base layer if it is invisible");
+        t.eq(moveend, 0, "map.moveTo does not trigger \"moveend\" in the layer if the layer is invisible");
+        a.setVisibility(true);
+        
+        // a, b, c, d
+        t.eq(map.baseLayer.name, "a", "base layer set to first layer added");
+        
+        map.removeLayer(a);
+        // b, c, d
+        t.eq(map.baseLayer.name, "b", "if base layer is removed, lowest layer becomes base");
+        
+        map.addLayer(a);
+        // b, c, d, a
+        t.eq(map.baseLayer.name, "b", "adding a new layer doesn't change base layer");
+        
+        map.setLayerIndex(c, 1);
+        // b, d, c, a
+        t.eq(map.baseLayer.name, "b", "changing layer order above base doesn't mess with base");
+        
+        map.setLayerIndex(d, 0);
+        // d, b, c, a
+        t.eq(map.baseLayer.name, "d", "changing layer order to 0 sets base layer");
+        
+        map.raiseLayer(d, 1);
+        // b, d, c, a
+        t.eq(map.baseLayer.name, "b", "raising the base layer sets a new base layer");
+        
+        map.raiseLayer(d, -1);
+        // d, b, c, a
+        t.eq(map.baseLayer.name, "d", "lowering a layer to lowest index sets as base");
+        
+        // all this switching of base layer didn't muck with layer visibility
+        t.eq(a.visibility, true, "a is visible");
+        t.eq(b.visibility, true, "b is visible");
+        t.eq(c.visibility, true, "c is visible");
+        t.eq(d.visibility, true, "d is visible");
+        
+        // test that map can have an invisible base layer
+        b.setVisibility(false);
+        map.setLayerIndex(b, 0);
+        t.eq(b.visibility, false, "changing layer order doesn't change visibility");
+
+       
+        map.destroy();
+        
+        // make sure setVisibility is called when adding a single layer to the map
+        map = new OpenLayers.Map({
+            div: "map", allOverlays: true
+        });
+        var count = 0;
+        var layer = new OpenLayers.Layer(null, {
+            visibility: true,
+            maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90),
+            setVisibility: function() {
+                ++count;
+                OpenLayers.Layer.prototype.setVisibility.apply(this, arguments);
+            }
+        });
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        t.eq(count, 1, "setVisibility called when visibility is true in layer config");
+        t.eq(layer.div.style.display, "", "layer is visible.");
+
+        map.destroy();
+        
+    }
+    
+    function test_panTo(t) {
+        
+        t.plan(2);
+        
+        var map = new OpenLayers.Map("map");
+        map.addLayer(
+            new OpenLayers.Layer(null, {isBaseLayer: true})
+        );
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+        
+        map.panTo(new OpenLayers.LonLat(1, 0));
+        t.eq(map.panTween.playing, true, "the map pan tween is playing before destroy");
+        
+        map.destroy();
+        t.ok(!map.panTween || !map.panTween.playing, "the map pan tween is not playing after destroy");
+    }
+
+    function test_updateSize(t) {
+        t.plan(2);
+
+        var map, moveToCnt, size;
+
+        map = new OpenLayers.Map({div: "map"});
+        map.addLayer(new OpenLayers.Layer("layer", {isBaseLayer: true}));
+
+        map.moveTo = function() {
+            moveToCnt++;
+            OpenLayers.Map.prototype.moveTo.apply(this, arguments);
+        };
+
+        map.getCurrentSize = function() {
+            return size;
+        };
+
+        // map has no center
+        // 1 test
+        moveToCnt = 0;
+        size = new OpenLayers.Size(650, 350);
+        map.updateSize();
+        t.eq(moveToCnt, 0, "updateSize doesn't move the map if it doesn't have a center");
+
+        // map has a center
+        // 1 test
+        map.zoomToMaxExtent();
+        moveToCnt = 0;
+        size = new OpenLayers.Size(600, 300);
+        map.updateSize();
+        t.eq(moveToCnt, 1, "updateSize move the map if it has a center");
+
+        map.destroy();
+    }
+    
+    function test_invisible_map(t) {
+        /** 
+         * This test confirms that initializing a map using an element that is 
+         * not currently displayed doesn't cause any trouble.
+         */
+        t.plan(1);
+        
+        var map, msg = "initializing a map on an undisplayed element";
+        try {
+            map = new OpenLayers.Map("invisimap");
+        } catch (err) {
+            msg += ": " + err;
+        }
+        t.ok(!!map, msg);
+        
+        if (map) {
+            map.destroy();
+        }        
+    }
+    
+    function test_layers_option(t) {
+        
+        t.plan(3);
+
+        var map = new OpenLayers.Map({
+            div: "map",
+            layers: [
+                new OpenLayers.Layer()
+            ]
+        });
+        
+        t.eq(map.layers.length, 1, "single layer from options added");
+
+        map.destroy();
+        
+        map = new OpenLayers.Map({
+            div: "map",
+            layers: [
+                new OpenLayers.Layer(null, {isBaseLayer: true}),
+                new OpenLayers.Layer(null, {isBaseLayer: false})
+            ]
+        });
+        
+        t.eq(map.layers.length, 2, "multiple layers added from options");
+        t.ok(map.baseLayer, "map has a base layer");
+        
+    }
+    
+    function test_center_option(t) {
+        t.plan(6);
+        
+        var map, msg;
+        
+        
+        // try setting center without layers, this has no effect
+        var failed = false;
+        try {
+            map = new OpenLayers.Map({
+                div: "map",
+                center: new OpenLayers.LonLat(1, 2)
+            });
+            msg = "center option without layers has no effect";
+        } catch (err) {
+            failed = true;
+            msg = "center option without layers throws error";
+        }
+        t.ok(!failed, msg);
+        
+        if (map) {
+            map.destroy();
+        }
+        
+        
+        // set center without zoom
+        var center = new OpenLayers.LonLat(1, 2);
+        map = new OpenLayers.Map({
+            div: "map",
+            layers: [new OpenLayers.Layer(null, {isBaseLayer: true})],
+            center: center
+        });
+        
+        t.ok(center.equals(map.getCenter()), "map center set without zoom");
+        
+        map.destroy();
+        
+        // set center and zoom
+        var zoom = 3;
+        map = new OpenLayers.Map({
+            div: "map",
+            layers: [new OpenLayers.Layer(null, {isBaseLayer: true})],
+            center: center,
+            zoom: zoom
+        });
+
+        t.ok(center.equals(map.getCenter()), "map center set with center and zoom");
+        t.eq(zoom, map.getZoom(), "map zoom set with center and zoom");
+        
+        map.destroy();
+        
+        // set center and zoom with all overlays
+        map = new OpenLayers.Map({
+            div: "map",
+            allOverlays: true,
+            layers: [new OpenLayers.Layer()],
+            center: center,
+            zoom: zoom
+        });
+        
+        t.ok(center.equals(map.getCenter()), "map center set with all overlays");
+        t.eq(zoom, map.getZoom(), "map zoom set with all overlays");        
+        
+        map.destroy();
+        
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 600px; height: 300px;"/>
+    <div style="display: none;"><div id="invisimap"></div></div>
+</body>
+</html>
diff --git a/tests/Marker.html b/tests/Marker.html
new file mode 100644
index 0000000..69b9a81
--- /dev/null
+++ b/tests/Marker.html
@@ -0,0 +1,163 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var marker;
+
+    function test_Marker_constructor (t) {
+        t.plan( 4 );
+        var ll = new OpenLayers.LonLat(2,1);
+        marker = new OpenLayers.Marker(ll,new OpenLayers.Icon());
+        t.ok( marker instanceof OpenLayers.Marker, "new OpenLayers.Marker returns Marker object" );
+        t.ok( marker.icon instanceof OpenLayers.Icon, "new marker.Icon returns Icon object" );
+        t.ok( marker.lonlat instanceof OpenLayers.LonLat, "new marker.lonlat returns LonLat object" );
+        t.ok( marker.lonlat.equals(ll), "marker.lonlat returns correct" );
+    }
+
+    function test_Marker_onScreen(t) {
+        t.plan( 2 );
+
+        var map = new OpenLayers.Map("map");
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url);
+
+        map.addLayer(layer);
+        
+        mlayer = new OpenLayers.Layer.Markers('Test Layer');
+        map.addLayer(mlayer);
+               
+        map.zoomToExtent(new OpenLayers.Bounds(-50,-50,50,50));
+
+        //onscreen marker
+        var ll = new OpenLayers.LonLat(0,0);
+        var marker = new OpenLayers.Marker(ll);
+        mlayer.addMarker(marker);
+        
+        t.ok( marker.onScreen(), "marker knows it's onscreen" );
+
+        //offscreen marker
+        var ll = new OpenLayers.LonLat(100,100);
+        var marker2 = new OpenLayers.Marker(ll);
+        mlayer.addMarker(marker2);
+
+        t.ok( !marker2.onScreen(), "marker knows it's offscreen" );
+        map.destroy();
+    }
+
+    function test_Marker_setOpacity(t) {
+        t.plan( 2 );
+        
+        var map = new OpenLayers.Map("map");
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url);
+
+        map.addLayer(layer);
+        
+        mlayer = new OpenLayers.Layer.Markers('Test Layer');
+        map.addLayer(mlayer);
+               
+        map.zoomToExtent(new OpenLayers.Bounds(-50,-50,50,50));
+
+        //onscreen marker
+        var ll = new OpenLayers.LonLat(0,0);
+        var marker = new OpenLayers.Marker(ll);
+        mlayer.addMarker(marker);
+
+        t.ok(!marker.icon.imageDiv.style.opacity, "default marker has no opacity");
+        
+        marker.setOpacity(0.5);
+
+        t.eq(parseFloat(marker.icon.imageDiv.style.opacity), 0.5, "marker.setOpacity() works");
+        map.destroy();
+    }
+    
+    function test_Marker_setUrl(t) {
+        t.plan( 2 );
+        
+        var map = new OpenLayers.Map("map");
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url);
+
+        map.addLayer(layer);
+        
+        mlayer = new OpenLayers.Layer.Markers('Test Layer');
+        map.addLayer(mlayer);
+               
+        map.zoomToExtent(new OpenLayers.Bounds(-50,-50,50,50));
+
+        //onscreen marker
+        var ll = new OpenLayers.LonLat(0,0);
+        var marker = new OpenLayers.Marker(ll);
+        mlayer.addMarker(marker);
+
+        t.ok(marker.icon.imageDiv.firstChild.src.contains("img/marker.png"), "Marker.png is default URL");
+        
+        marker.setUrl("http://example.com/broken.png");
+        t.eq(marker.icon.imageDiv.firstChild.src, "http://example.com/broken.png", "image source changes correctly.");
+
+        map.destroy();
+    }
+
+    function test_Marker_moveTo(t) {
+        t.plan( 6 );
+        
+        var map = new OpenLayers.Map("map");
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS(name, url);
+
+        map.addLayer(layer);
+        
+        mlayer = new OpenLayers.Layer.Markers('Test Layer');
+        map.addLayer(mlayer);
+               
+        map.zoomToExtent(new OpenLayers.Bounds(-50,-50,50,50));
+
+        //onscreen marker
+        var ll = new OpenLayers.LonLat(0,0);
+        var marker = new OpenLayers.Marker(ll);
+        mlayer.addMarker(marker);
+        
+        t.eq(marker.lonlat.lon, 0, "marker lon okay"); 
+        t.eq(marker.lonlat.lat, 0, "marker lat okay");
+
+        marker.moveTo(new OpenLayers.Pixel(250,275));
+        t.eq(marker.lonlat.lon, 0, "marker lon no change"); 
+        t.eq(marker.lonlat.lat, 0, "marker lat no change"); 
+        
+        marker.moveTo(new OpenLayers.Pixel(0,0));
+        t.eq(marker.lonlat.lon, map.getExtent().left, "on left edge of map"); 
+        t.eq(marker.lonlat.lat, map.getExtent().top, "on top edge of map"); 
+        map.destroy();
+    }
+    
+    function test_Marker_isDrawn(t) {
+        t.plan(3);
+
+        var marker = {};
+
+        //no icon
+        var drawn = OpenLayers.Marker.prototype.isDrawn.apply(marker, []);
+        t.ok(!drawn, "marker with no icon not drawn");
+
+        //not drawn icon
+        marker.icon = { isDrawn: function() { return false; } };
+        drawn = OpenLayers.Marker.prototype.isDrawn.apply(marker, []);
+        t.ok(!drawn, "marker with not drawn icon not drawn");
+
+        //drawn icon
+        marker.icon.isDrawn = function() { return true; };
+        drawn = OpenLayers.Marker.prototype.isDrawn.apply(marker, []);
+        t.ok(drawn, "marker with drawn icon drawn");
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Marker/Box.html b/tests/Marker/Box.html
new file mode 100644
index 0000000..d8d5306
--- /dev/null
+++ b/tests/Marker/Box.html
@@ -0,0 +1,183 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var box; 
+    
+    function test_Box_constructor (t) {
+        t.plan( 7 );
+
+        OpenLayers.Marker.Box.prototype._setBorder = 
+            OpenLayers.Marker.Box.prototype.setBorder;
+        OpenLayers.Marker.Box.prototype.setBorder = function (x,y) {
+            g_Color = x;
+            g_Width = y;
+        };
+
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var borderColor = "blue";
+        var borderWidth = 55;
+
+
+        g_Color = g_Width = null;
+        box = new OpenLayers.Marker.Box(bounds, borderColor, borderWidth);
+
+        t.ok( box instanceof OpenLayers.Marker.Box, "new OpenLayers.Marker.Box returns Box object" );
+        t.ok( box.bounds.equals(bounds), "bounds object correctly set");
+        t.ok( box.div != null, "div created");
+        //Safari 3 separates style overflow into overflow-x and overflow-y
+        var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+        t.eq( box.div.style[prop], "hidden", "div style overflow hidden");
+        t.ok( box.events != null, "events object created");
+        t.eq( g_Color, borderColor, "setBorder called with correct border color");        
+        t.eq( g_Width, borderWidth, "setBorder called with correct border width");        
+        
+
+        OpenLayers.Marker.Box.prototype.setBorder = 
+            OpenLayers.Marker.Box.prototype._setBorder;
+    }
+
+
+    function test_Box_setBorder(t) {
+        t.plan( 2 );
+
+        var box = {
+            div: {
+                style: {}
+            }
+        };
+
+      //defaults
+        var args = [];
+        OpenLayers.Marker.Box.prototype.setBorder.apply(box, args);
+        t.eq(box.div.style.border, "2px solid red", "style correctly set with no good values (defaults work)");
+
+      //good vals
+        var borderColor = "blue";
+        var borderWidth = 55;
+
+        args = [borderColor, borderWidth];
+        OpenLayers.Marker.Box.prototype.setBorder.apply(box, args);
+        t.eq(box.div.style.border, borderWidth + "px solid " + borderColor, "style correctly set with both good values");
+
+    }
+    function test_Box_draw(t) {
+        t.plan( 5 );
+
+        OpenLayers.Util._modifyDOMElement = 
+            OpenLayers.Util.modifyDOMElement;
+        OpenLayers.Util.modifyDOMElement = 
+            function (element, id, px, sz) {
+                g_Element = element;
+                g_Id = id;
+                g_Px = px;
+                g_Sz = sz;
+            };
+
+        var box = {
+            div: {}
+        };
+
+        
+        var px = {};
+        var sz = {};
+        var args = [px, sz];
+
+        g_Element = g_Id = g_Px = g_Sz = null;
+        var retVal = OpenLayers.Marker.Box.prototype.draw.apply(box, args);
+
+        t.eq(g_Element, box.div, "modifyDOMElement passes box's div for element");
+        t.eq(g_Id, null, "modifyDOMElement passes null for id");
+        t.eq(g_Px, px, "modifyDOMElement passes new px value for px");
+        t.eq(g_Sz, sz, "modifyDOMElement passes new sz value for sz");
+        t.ok(retVal == box.div, "draw returns box's div");
+
+        OpenLayers.Util.modifyDOMElement = 
+            OpenLayers.Util._modifyDOMElement;
+
+    }
+
+    function test_Box_onScreen(t) {
+        t.plan( 2 );
+
+        var map = new OpenLayers.Map("map");
+
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        layer = new OpenLayers.Layer.WMS("WMS Layer", url);
+
+        map.addLayer(layer);
+        
+        mlayer = new OpenLayers.Layer.Boxes('Test Layer');
+        map.addLayer(mlayer);
+               
+        map.zoomToExtent(new OpenLayers.Bounds(-50,-50,50,50));
+
+        //onscreen box
+        var bounds = new OpenLayers.Bounds(-1,-1,1,1);
+        var box = new OpenLayers.Marker.Box(bounds);
+        mlayer.addMarker(box);
+        
+        t.ok( box.onScreen(), "box knows it's onscreen" );
+
+        //offscreen box
+        var bounds = new OpenLayers.Bounds(100,100,150,150);
+        var box2 = new OpenLayers.Marker.Box(bounds);
+        mlayer.addMarker(box2);
+
+        t.ok( !box2.onScreen(), "box knows it's offscreen" );
+        map.destroy();
+    }
+
+    function test_Box_display(t) {
+        t.plan( 2 );
+
+        var box = {
+            div: {
+                style: {}
+            }
+        };
+
+      //display(true)
+        var args = [true];
+        OpenLayers.Marker.Box.prototype.display.apply(box, args);
+        t.eq(box.div.style.display, "", "style.display correctly set to '' when display(true)");
+
+      //display(false)
+        var args = [false];
+        OpenLayers.Marker.Box.prototype.display.apply(box, args);
+        t.eq(box.div.style.display, "none", "style.display correctly set to 'none' when display(false)");
+    }
+
+    function test_Box_destroy(t) {
+        t.plan(3);
+        
+        OpenLayers.Marker.prototype._destroy = 
+            OpenLayers.Marker.prototype.destroy;
+        OpenLayers.Marker.prototype.destroy = function() {
+            g_Destroy = true;
+        }
+                
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var borderColor = "blue";
+        var borderWidth = 55;
+
+        g_Destroy = null;
+        box = new OpenLayers.Marker.Box(bounds, borderColor, borderWidth);
+        box.destroy();
+
+        t.eq(box.bounds, null, "bounds nullified");
+        t.eq(box.div, null, "div nullified");
+        t.ok(g_Destroy == true, "OpenLayers.Marker.destroy() called");
+
+
+        OpenLayers.Marker.prototype.destroy = 
+            OpenLayers.Marker.prototype._destroy;
+    }
+    
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
\ No newline at end of file
diff --git a/tests/OpenLayers.html b/tests/OpenLayers.html
new file mode 100644
index 0000000..2f62610
--- /dev/null
+++ b/tests/OpenLayers.html
@@ -0,0 +1,31 @@
+<html>
+<head>
+    <script src="bogus/1/OpenLayers.js-foo"></script>
+    <script src="bogus/2/foo-OpenLayers.js"></script>
+    <script id="script" src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        function test_OpenLayers(t) {
+            t.plan(3);
+
+            var script = document.getElementById("script");
+
+            t.eq(OpenLayers._getScriptLocation(), "../", "Script location correctly detected.");
+            
+            // create a clone of OpenLayers._getScriptLocation
+            eval("var getScriptLocation = " + OpenLayers._getScriptLocation.toString());
+            var scriptLocation;
+            
+            script.setAttribute("src", "../lib/OpenLayers.js?foo");
+            t.eq(getScriptLocation(), "../", "Script location with search string correctly detected.");
+            scriptLocation = null;
+
+            // now pretend we're using a built script
+            OpenLayers._scriptName = "OpenLayers.js";
+            t.eq(getScriptLocation(), "../lib/", "not fooled by bogus paths");
+            
+        }
+    </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Popup.html b/tests/Popup.html
new file mode 100644
index 0000000..f7f8384
--- /dev/null
+++ b/tests/Popup.html
@@ -0,0 +1,213 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var popup;
+
+    function test_Popup_default_constructor(t) {
+        t.plan( 8 );
+
+        var size = new OpenLayers.Size(OpenLayers.Popup.WIDTH,
+                                       OpenLayers.Popup.HEIGHT);
+        popup = new OpenLayers.Popup();
+
+        t.ok( popup instanceof OpenLayers.Popup, "new OpenLayers.Popup returns Popup object" );
+        t.ok(OpenLayers.String.startsWith(popup.id, "OpenLayers.Popup"),
+             "valid default popupid");
+        var firstID = popup.id;
+        t.ok(popup.contentSize.equals(size), "good default popup.size");
+        t.eq(popup.contentHTML, null, "good default popup.contentHTML");
+        t.eq(popup.backgroundColor, OpenLayers.Popup.COLOR, "good default popup.backgroundColor");
+        t.eq(popup.opacity, OpenLayers.Popup.OPACITY, "good default popup.opacity");
+        t.eq(popup.border, OpenLayers.Popup.BORDER, "good default popup.border");
+
+        
+        popup = new OpenLayers.Popup();
+        var newID = popup.id;
+        t.ok(newID != firstID, "default id generator creating unique ids");
+    }
+    
+    function test_Popup_constructor (t) {
+        t.plan( 8 );
+
+        var id = "chicken";
+        var w = 500;
+        var h = 400;
+        var sz = new OpenLayers.Size(w,h);
+        var lon = 5;
+        var lat = 40;
+        var ll = new OpenLayers.LonLat(lon, lat);
+        var content = "foo";
+        var closePopupCallback = function(e) {
+            //this should get triggered by the "observer.observer();" call below
+            t.ok(true, "closePopupCallback called")
+        };
+
+        popup = new OpenLayers.Popup(id,
+                                     ll,
+                                     sz,
+                                     content,
+                                     true,
+                                     closePopupCallback);
+
+        t.ok( popup instanceof OpenLayers.Popup, "new OpenLayers.Popup returns Popup object" );
+        t.eq(popup.id, id, "popup.id set correctly");
+        t.ok(popup.lonlat.equals(ll), "popup.lonlat set correctly");
+        t.ok(popup.contentSize.equals(sz), "popup.size set correctly");
+        t.eq(popup.contentHTML, content, "contentHTML porpoerty of set correctly");
+
+        // test that a browser event is registered on click on popup closebox
+        var closeImgDiv = popup.groupDiv.childNodes[1];
+        var cacheID = closeImgDiv._eventCacheID;
+        for (var i = 0; i < OpenLayers.Event.observers[cacheID].length; i++) {
+            var observer = OpenLayers.Event.observers[cacheID][i];
+            if (observer.element == closeImgDiv) {
+                t.ok(true, "An event was registered for the close box element");
+                t.eq(observer.name, "click", "A click event was registered for the close box element");
+                //call the registered observer to make sure it's the right one
+                observer.observer();
+                break;
+            }
+        }
+    }
+
+    function test_Popup_updatePosition(t) {
+        t.plan(1)
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer('name', {'isBaseLayer':true}));
+        map.zoomToMaxExtent();
+        var popup = new OpenLayers.Popup('id');
+        map.addPopup(popup);
+        map.getLayerPxFromLonLat = function () { return null; }
+        popup.moveTo=function() { t.fail("Shouldnt' call moveTo if layerpx is null"); }
+        popup.lonlat = true;
+        popup.updatePosition();
+        t.ok(true, "update position doesn't fail when getLayerPxFromLonLat fails.");
+        map.destroy();
+    }
+    function test_Popup_keepInMap(t) {
+        
+        var gb = OpenLayers.Util.getBrowserName;
+        OpenLayers.Util.getBrowserName = function() { return "mock"; }
+        t.plan(3);
+        var map = new OpenLayers.Map("map");
+        map.addLayer(new OpenLayers.Layer("", {isBaseLayer: true}));
+        map.zoomToMaxExtent();
+        var longString = "<div style='width: 200px; height: 200px'>Abc def</div>"; 
+        popup = new OpenLayers.Popup("chicken", 
+                                 new OpenLayers.LonLat(90, 60),
+                                 new OpenLayers.Size(100,100),
+                                 longString,
+                                 null, true);
+        popup.panMapIfOutOfView = false;
+        popup.keepInMap = true;
+        map.addPopup(popup);
+        var safeSize = popup.getSafeContentSize(new OpenLayers.Size(1000,1000));
+        popup = new OpenLayers.Popup("chicken", 
+                                 new OpenLayers.LonLat(90, 60),
+                                 new OpenLayers.Size(100,100),
+                                 longString,
+                                 null, true);
+        popup.panMapIfOutOfView = true;
+        popup.keepInMap = true;
+        map.addPopup(popup);
+        var safeSizePanKeep = popup.getSafeContentSize(new OpenLayers.Size(1000,1000));
+        popup.keepInMap = false;
+        map.addPopup(popup);
+        map.setCenter(-180, -90);
+        var safeSizePan = popup.getSafeContentSize(new OpenLayers.Size(1000,1000));
+        t.ok(safeSizePan.equals(safeSizePanKeep), "Panning means that all sizes are equal");
+        t.ok(safeSize.w < safeSizePan.w, "Width of non-panning is less");    
+        t.ok(safeSize.h < safeSizePan.h, "Height of non-panning is less");    
+        OpenLayers.Util.getBrowserName = gb; 
+    }    
+    function test_Popup_draw(t) {
+        t.plan( 15 );
+        
+        var id = "chicken";
+        var x = 50;
+        var y = 100;
+        var w = 500;
+        var h = 400;
+        var content = "charlie";
+        var color = "red";
+        var hexColor = "#ff0000";
+        var opacity = 0.5;
+        var border = "1px solid";
+        map1 = new OpenLayers.Map("map");
+        popup = new OpenLayers.Popup(id);
+        popup.setSize(new OpenLayers.Size(w, h));
+        popup.setContentHTML(content);
+        popup.setBackgroundColor(color);
+        popup.setOpacity(opacity);
+        popup.setBorder(border);
+        map1.addPopup(popup);
+        popup.moveTo(new OpenLayers.Pixel(x, y));
+                                     
+        t.eq(popup.div.id, id, "popup.div.id set correctly");
+        t.eq(popup.div.style.left, x + "px", "left position of popup.div set correctly");
+        t.eq(popup.div.style.top, y + "px", "top position of popup.div set correctly");
+
+        var contentDiv = popup.div.childNodes[0].childNodes[0];
+        
+        t.eq(contentDiv.className, "olPopupContent", "correct content div className");
+        t.eq(contentDiv.id, "chicken_contentDiv", "correct content div id");
+        t.eq(contentDiv.style.position, "relative", "correct content div position");
+        //Safari 3 separates style overflow into overflow-x and overflow-y
+        var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+        t.eq(contentDiv.style[prop], "", "correct content div overflow");
+        t.eq(contentDiv.innerHTML, content, "correct content div content");
+
+        var bColor = popup.div.style.backgroundColor;
+        var goodColor = ( (bColor == color) || (bColor == hexColor));
+        t.ok(goodColor, "good default popup.backgroundColor");
+
+        if (navigator.appName.indexOf("Microsoft") == -1) {
+            t.eq(parseFloat(popup.div.style.opacity), opacity, "good default popup.opacity");
+        } else {
+            t.eq(popup.div.style.filter, "alpha(opacity=" + opacity*100 + ")", "good default popup.opacity");
+        }
+        //Safari 3 separates the border style into separate entities when reading it
+        if (OpenLayers.Util.getBrowserName() == 'safari') {
+          var s = border.split(' ');
+          t.ok(popup.div.style.borderTopWidth == s[0] && popup.div.style.borderTopStyle == s[1], "good default popup.border")
+        } else {
+          t.ok(popup.div.style.border.indexOf(border) != -1, "good default popup.border");
+        }
+
+        x += 50;
+        popup.moveTo(new OpenLayers.Pixel(x, y));
+        t.eq(popup.div.style.left, x + "px", "moveTo updates left position of popup.div correctly");
+        t.eq(popup.div.style.top, y + "px", "moveTo updates top position of popup.div correctly");
+
+
+    //closeOnMove
+        var checkMapEvent = function(map, popup) {
+            var startListeners = map.events.listeners['movestart'];
+            for(var i=0; i < startListeners.length; i++) {
+                var listener = startListeners[i];
+                
+                if ((listener.obj == popup) && (listener.func == popup.hide)) {
+                    return true;
+                }
+            }    
+            return false;
+        };
+        var registered = checkMapEvent(map1, popup);
+        t.ok(!registered, "when not 'closeOnMove', correctly not registered hide() on map's movestart.")    
+        
+        var popup2 = new OpenLayers.Popup('test');
+        popup2.closeOnMove = true;
+        map1.addPopup(popup2);
+        
+        registered = checkMapEvent(map1, popup2);
+        t.ok(registered, "when 'closeOnMove', correctly registered hide() on map's movestart.")    
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+</body>
+</html>
diff --git a/tests/Popup/Anchored.html b/tests/Popup/Anchored.html
new file mode 100644
index 0000000..be22abc
--- /dev/null
+++ b/tests/Popup/Anchored.html
@@ -0,0 +1,37 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var popup;
+
+    function test_Popup_Anchored_default_constructor(t) {
+        t.plan( 4 );
+
+        popup = new OpenLayers.Popup.Anchored();
+
+        t.ok( popup instanceof OpenLayers.Popup.Anchored, "new OpenLayers.Popup.Anchored returns Popup.Anchored object" );
+        t.ok(popup.id.startsWith("OpenLayers.Popup.Anchored"), "valid default popupid");
+        var firstID = popup.id;
+        t.eq(popup.contentHTML, null, "good default popup.contentHTML");
+
+        
+        popup = new OpenLayers.Popup.Anchored();
+        var newID = popup.id;
+        t.ok(newID != firstID, "default id generator creating unique ids");
+    }
+    function test_Popup_Anchored_updateRelPos(t) { 
+        t.plan(1);
+        var popup = new OpenLayers.Popup.Anchored();
+        popup.calculateNewPx = function () {}
+        popup.calculateRelativePosition = function() {
+            t.ok(true, "update relative position is called on moveTo");
+        }
+        popup.moveTo(new OpenLayers.Pixel(0,0));
+   } 
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Popup/AnchoredBubble.html b/tests/Popup/AnchoredBubble.html
new file mode 100644
index 0000000..a3ba599
--- /dev/null
+++ b/tests/Popup/AnchoredBubble.html
@@ -0,0 +1,59 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+   function test_Popup_Anchored_setOpacity(t) { 
+        t.plan(5);
+        var opacity = 0.5;
+        var id = "chicken";
+        var w = 500;
+        var h = 400;
+        var sz = new OpenLayers.Size(w,h);
+        var lon = 5;
+        var lat = 40;
+        var ll = new OpenLayers.LonLat(lon, lat);
+        var content = "foo";
+        var x = 50;
+        var y = 100;
+
+        var map = new OpenLayers.Map('map');
+        map.addLayer(new OpenLayers.Layer('name', {'isBaseLayer':true}));
+        map.zoomToMaxExtent();
+
+        var popup = new OpenLayers.Popup.AnchoredBubble(id,
+                                     ll,
+                                     sz,
+                                     content,
+                                     null,
+                                     false);
+        map.addPopup(popup);
+
+        popup.setOpacity(opacity);
+        popup.draw(new OpenLayers.Pixel(x, y));
+
+        if (navigator.appName.indexOf("Microsoft") == -1) {
+            t.eq(parseFloat(popup.div.style.opacity), opacity, "good default popup.opacity");
+        } else {
+            t.eq(popup.div.style.filter, "alpha(opacity=" + opacity*100 + ")", "good default popup.opacity");
+        }
+
+        t.ok(popup.groupDiv!=null, "popup.groupDiv exists");
+        t.ok(popup.groupDiv.parentNode!=null, "popup.groupDiv.parentNode exists");
+        t.ok(popup.groupDiv.parentNode.getElementsByTagName("span").length > 0, "popup.groupDiv.parentNode has SPAN children");
+
+        var ricoCornerDiv = popup.groupDiv.parentNode.getElementsByTagName("span")[0];
+        if (navigator.appName.indexOf("Microsoft") == -1) {
+            t.eq(parseFloat(ricoCornerDiv.style.opacity), opacity, "good default ricoCornerDiv.opacity");
+        } else {
+            t.eq(ricoCornerDiv.style.filter, "alpha(opacity=" + opacity*100 + ")", "good default ricoCornerDiv.opacity");
+        }
+        
+   }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+</body>
+</html>
diff --git a/tests/Popup/FramedCloud.html b/tests/Popup/FramedCloud.html
new file mode 100644
index 0000000..b7f3325
--- /dev/null
+++ b/tests/Popup/FramedCloud.html
@@ -0,0 +1,18 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+   function test_Popup_FramedCloud_setHTML(t) { 
+        t.plan(1);
+        popup = new OpenLayers.Popup.FramedCloud();
+        popup.setContentHTML("<p></p>");
+        t.ok("setHTML on popup not yet added to map doesn't fail");
+   }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+</body>
+</html>
diff --git a/tests/Projection.html b/tests/Projection.html
new file mode 100644
index 0000000..2c6d72c
--- /dev/null
+++ b/tests/Projection.html
@@ -0,0 +1,30 @@
+<html> 
+  <head> 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript"> 
+     function test_Projection_constructor(t) { 
+         t.plan(9); 
+      
+         var options = {'foo': 'bar'}; 
+         var projection = new OpenLayers.Projection("code", options); 
+         t.ok(projection instanceof OpenLayers.Projection, 
+              "new OpenLayers.Projection returns object" ); 
+         t.eq(projection.projCode, "code", "The proj code is maintained");  
+         t.eq(projection.getCode(), "code", "The proj code is maintained.");  
+         t.eq(projection.getUnits(), null, "Null units with no proj4js library.");  
+         t.eq(projection.foo, "bar", "constructor sets options correctly"); 
+  
+         var projection2 = new OpenLayers.Projection("epsg:4325", options); 
+         out = OpenLayers.Projection.transform({'x':10,'y':12}, projection, projection2); 
+         t.eq(out.x, 10, "Null transform has no effect"); 
+         t.eq(out.y, 12, "Null transform has no effect"); 
+
+         t.eq(projection.equals(null), false, "equals on null projection returns false");
+         t.eq(projection.equals({}), false, "equals on null projection object returns false (doesn't call getCode)");
+     } 
+       
+    </script> 
+  </head> 
+  <body> 
+  </body> 
+</html> 
diff --git a/tests/Protocol.html b/tests/Protocol.html
new file mode 100644
index 0000000..2cca760
--- /dev/null
+++ b/tests/Protocol.html
@@ -0,0 +1,63 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(4);
+        var options = {};
+        var protocol = new OpenLayers.Protocol(options);
+
+        t.ok(protocol instanceof OpenLayers.Protocol,
+             "new OpenLayers.Protocol returns object" );
+        t.eq(protocol.options, options, "constructor sets this.options");
+        t.eq(protocol.options.filter, null, "constructor sets defaultFilter to null");
+        t.eq(protocol.autoDestroy, true, "constructor does not modify this.autoDestroy");
+    }
+    
+    function test_read_defaultFilter(t) {
+        t.plan(4);
+
+        var protocol = new OpenLayers.Protocol({filter: "a"});
+        var options = {};
+        protocol.read(options);
+        // the line below is what happens in Protocol.WFS.v1::read
+        OpenLayers.Util.applyDefaults(options, protocol.options);
+        t.eq(options.filter, "a", "filter from protocol.options applied to options");
+        protocol.destroy();
+
+        var defaultFilter = 'a';
+        var options = {
+            defaultFilter: defaultFilter
+        };
+
+        protocol = new OpenLayers.Protocol(options);
+        var readFilter = 'b';
+        var options = { filter: readFilter };
+
+        protocol.read(options);
+
+        var filter = options.filter;
+        t.ok(filter instanceof OpenLayers.Filter.Logical, "read method merge default filter & options filter to a logical one");
+        t.eq(filter.type, OpenLayers.Filter.Logical.AND, "logical filter type is OpenLayers.Filter.Logical.AND");
+        t.eq(filter.filters, [defaultFilter, readFilter], "read method has merged filters");
+        protocol.destroy();
+    }
+
+    function test_destroy(t) {
+        t.plan(2);
+        var protocol = new OpenLayers.Protocol({
+            options: {foo: 'bar'},
+            format: 'foo'
+        });
+        protocol.destroy();
+
+        t.eq(protocol.format, null, "destroy nullify protocol.format");
+        t.eq(protocol.options, null, "destroy nullify protocol.options");
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Protocol/HTTP.html b/tests/Protocol/HTTP.html
new file mode 100644
index 0000000..16f6da2
--- /dev/null
+++ b/tests/Protocol/HTTP.html
@@ -0,0 +1,1087 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_constructor(t) {
+        t.plan(8);
+        var a = new OpenLayers.Protocol.HTTP({
+            url: "foo"
+        });
+
+        // 4 tests
+        t.eq(a.url, "foo", "constructor sets url");
+        t.eq(a.options.url, a.url, "constructor copies url to options.url");
+        t.eq(a.params, {}, "constructor sets params");
+        t.eq(a.options.params, undefined, "constructor do not copy params to options.params");
+
+        var params = {hello: "world"};
+        var b = new OpenLayers.Protocol.HTTP({
+            url: "bar",
+            params: params
+        });
+
+        // 4 tests
+        t.eq(b.url, "bar", "constructor sets url");
+        t.eq(b.options.url, b.url, "constructor copies url to options.url");
+        t.eq(b.params, params, "constructor sets params");
+        t.eq(b.options.params, b.params, "constructor copies params to options.params");
+    }
+
+    function test_destroy(t) {
+        t.plan(3);
+        var protocol = new OpenLayers.Protocol.HTTP({
+            url: "bar",
+            params: {hello: "world"}
+        });
+        protocol.destroy();
+        t.eq(protocol.options, null, "destroy nullifies options");
+        t.eq(protocol.params, null, "destroy nullifies params");
+        t.eq(protocol.headers, null, "destroy nullifies headers");
+    }
+
+    function test_read(t) {
+        t.plan(10);
+        var protocol = new OpenLayers.Protocol.HTTP({
+            'url': 'foo_url',
+            'params': {'k': 'foo_param'}
+        });
+
+        // fake XHR request object
+        var request = {'status': 200};
+
+        // options to pass to read
+        var readOptions = {
+            'url': 'bar_url',
+            'params': {'k': 'bar_param'},
+            'headers': {'k': 'bar_header'},
+            'scope': {'hello': 'world'},
+            'callback': function() {}
+        };
+
+        var response;
+
+        protocol.handleResponse = function(resp, opt) {
+            // 4 tests
+            var req = resp.priv;
+            t.ok(this == protocol,
+                'handleResponse called with correct scope');
+            t.ok(opt == readOptions,
+                'handleResponse called with correct options');
+            t.eq(resp.CLASS_NAME, 'OpenLayers.Protocol.Response',
+                'handleResponse called with a Response object');
+            t.eq(req, request,
+                'handleResponse called with correct request');
+
+            response = resp;
+        };
+
+        var _get = OpenLayers.Request.GET;
+
+        OpenLayers.Request.GET = function(options) {
+            // 5 tests
+            t.eq(options.url, readOptions.url,
+                'GET called with correct url in options');
+            t.eq(options.params['k'], readOptions.params['k'],
+                'GET called with correct params in options');
+            t.eq(options.headers['k'], readOptions.headers['k'],
+                'GET called with correct headers in options');
+            t.eq(options.scope, undefined,
+                'GET called with correct scope in options');
+            t.ok(typeof options.callback == 'function',
+                'GET called with a callback in options');
+            t.delay_call(0.1, function() {
+                options.callback(request);
+                t.ok(resp == response,
+                    'read returns the expected response object');        
+                // cleanup
+                protocol.destroy();
+                OpenLayers.Request.GET = _get;
+            });
+            return request;
+        };
+
+        var resp = protocol.read(readOptions);
+
+        OpenLayers.Request.GET = _get;
+    }
+
+    function test_readWithPOST(t) {
+        t.plan(10);
+        var protocol = new OpenLayers.Protocol.HTTP({
+            'url': 'foo_url',
+            'params': {'k': 'foo_param'}
+        });
+
+        // fake XHR request object
+        var request = {'status': 200};
+
+        // options to pass to read
+        var readOptions = {
+            'url': 'bar_url',
+            'params': {'k': 'bar_param'},
+            'scope': {'hello': 'world'},
+            'callback': function() {},
+            'readWithPOST': true
+        };
+
+        var response;
+
+        protocol.handleResponse = function(resp, opt) {
+            // 4 tests
+            var req = resp.priv;
+            t.ok(this == protocol,
+                'handleResponse called with correct scope');
+            t.ok(opt == readOptions,
+                'handleResponse called with correct options');
+            t.eq(resp.CLASS_NAME, 'OpenLayers.Protocol.Response',
+                'handleResponse called with a Response object');
+            t.eq(req, request,
+                'handleResponse called with correct request');
+
+            response = resp;
+        };
+
+        var _post = OpenLayers.Request.POST;
+
+        OpenLayers.Request.POST = function(options) {
+            // 5 tests
+            t.eq(options.url, readOptions.url,
+                'GET with POST called with correct url in options');
+            t.eq(options.data, OpenLayers.Util.getParameterString(readOptions.params),
+                'GET with POST called with correct params encoded in options');
+            t.eq(options.headers, {"Content-Type": "application/x-www-form-urlencoded"},
+                'GET with POST called with correct headers (application/x-www-form-urlencoded)');
+            t.eq(options.scope, undefined,
+                'GET with POST called with correct scope in options');
+            t.ok(typeof options.callback == 'function',
+                'GET with POST called with a callback in options');
+            t.delay_call(0.1, function() {
+                options.callback(request);
+                t.ok(resp == response,
+                    'read returns the expected response object');        
+                // cleanup
+                protocol.destroy();
+                OpenLayers.Request.POST = _post;
+            });
+            return request;
+        };
+
+        var resp = protocol.read(readOptions);
+
+        OpenLayers.Request.POST = _post;
+    }
+
+    function test_read_method(t) {
+        t.plan(4);
+
+        var _post = OpenLayers.Request.POST;
+        OpenLayers.Request.POST = function(options) { return 'post'; }
+        var _get = OpenLayers.Request.GET;
+        OpenLayers.Request.GET = function(options) { return 'get'; }
+
+        var protocol = new OpenLayers.Protocol.HTTP({});
+
+        t.eq(protocol.read({}).priv, 'get',
+            'readWithPOST is false by default');
+        t.eq(protocol.read({readWithPOST: true}).priv, 'post',
+            'readWithPOST can be set in read options');
+
+        var protocol = new OpenLayers.Protocol.HTTP({readWithPOST: true});
+
+        t.eq(protocol.read({}).priv, 'post',
+            'readWithPOST can be set in constructor');
+        t.eq(protocol.read({readWithPOST: false}).priv, 'get',
+            'readWithPOST can be overridden in read options');
+
+        OpenLayers.Request.POST = _post;
+        OpenLayers.Request.GET = _get;
+    }
+
+    function test_read_bbox(t) {
+        t.plan(1);
+        var protocol = new OpenLayers.Protocol.HTTP();
+
+        // fake XHR request object
+        var request = {'status': 200};
+
+        var _get = OpenLayers.Request.GET;
+
+        var bounds = new OpenLayers.Bounds(1, 2, 3, 4);
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value: bounds,
+            projection: "foo"
+        });
+        
+        OpenLayers.Request.GET = function(options) {
+            t.eq(options.params['bbox'].toString(), bounds.toArray().toString(),
+                'GET called with bbox filter in params');
+            return request;
+        };
+
+        var resp = protocol.read({filter: filter});
+
+        OpenLayers.Request.GET = _get;        
+    }
+
+    function test_parseFeatures(t) {
+        t.plan(5);
+
+        var protocol = new OpenLayers.Protocol.HTTP();
+
+        // test responseXML - 2 tests
+        var request = {
+            'responseXML': {
+                'documentElement': 'xml'
+            }
+        };
+        protocol.format = {
+            'read': function(doc) {
+                t.eq(doc.documentElement, 'xml',
+                    'format.read called with correct doc');
+                return doc.documentElement;
+            }
+        };
+        var ret = protocol.parseFeatures(request);
+        t.eq(ret, 'xml', 'parseFeatures returns expected value');
+
+        // test responseText - 2 tests
+        var request = {
+            'responseText': 'text'
+        };
+        protocol.format = {
+            'read': function(doc) {
+                t.eq(doc, 'text',
+                    'format.read called with correct doc');
+                return doc;
+            }
+        };
+        var ret = protocol.parseFeatures(request);
+        t.eq(ret, 'text', 'parseFeatures returns expected value');
+
+        // test empty responseText - 1 test
+        var request = {
+            'responseText': ''
+        };
+        protocol.format = {
+            'read': function(doc) {
+                t.fail('format.read should not be called');
+            }
+        };
+        var ret = protocol.parseFeatures(request);
+        t.eq(ret, null, 'parseFeatures returns expected value');
+    }
+
+    function test_filterToParams(t) {
+        t.plan(30);
+
+        // setup
+
+        var protocol, filter, params;
+
+        protocol = new OpenLayers.Protocol.HTTP();
+
+        // 1 test
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value: new OpenLayers.Bounds(0, 1, 2, 3)
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.bbox, [0, 1, 2, 3],
+             "filterToParams sets correct bbox param if passed a BBOX filter");
+
+        // 3 tests
+        var lon = 100, lat = 200, tolerance = 10;
+        filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.DWITHIN,
+            value: new OpenLayers.Geometry.Point(lon, lat),
+            distance: tolerance
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.lon, lon,
+             "filterToParams sets correct lon param if passed a DWITHIN filter");
+        t.eq(params.lat, lat,
+             "filterToParams sets correct lat param if passed a DWITHIN filter");
+        t.eq(params.tolerance, tolerance,
+             "filterToParams sets correct tolerance param if passed a DWITHIN filter");
+
+        // 2 tests
+        filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.WITHIN,
+            value: new OpenLayers.Geometry.Point(lon, lat)
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.lon, lon,
+             "filterToParams sets correct lon param if passed a WITHIN filter");
+        t.eq(params.lat, lat,
+             "filterToParams sets correct lat param if passed a WITHIN filter");
+
+        // Some bbox filters used in the next tests.
+
+        var bboxFilter1 = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value:  new OpenLayers.Bounds(0, 0, 10, 10)
+        });
+
+        var bboxFilter2 = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value:  new OpenLayers.Bounds(0, 0, 20, 20)
+        });
+
+        // 1 test
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: []
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params, {},
+             "filterToParams returns empty object if given empty AND Logical filter");
+
+        // 1 test
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.OR,
+            filters: [
+                bboxFilter1
+            ]
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params, {},
+             "filterToParams does not support OR Logical filter");
+
+        // 1 test
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: [
+                bboxFilter1
+            ]
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.bbox, [0, 0, 10, 10],
+             "filterToParams sets correct bbox param if passed " +
+             "a Logical filter containing a BBOX");
+
+        // 1 test
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: [
+                bboxFilter1, bboxFilter2
+            ]
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.bbox, [0, 0, 20, 20],
+             "filterToParams sets correct bbox param if passed " +
+             "multiple BBOX filter in a Logical filter");
+
+        // 2 tests
+        filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.EQUAL_TO,
+            property: "foo",
+            value: "bar"
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed an EQUAL_TO filter");
+        t.eq(params["foo__eq"], "bar",
+             "filterToParams sets correct param key and value if passed an EQUAL_TO filter");
+
+        // 2 tests
+        filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.NOT_EQUAL_TO,
+            property: "foo",
+            value: "bar"
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed an NOT_EQUAL_TO filter");
+        t.eq(params["foo__ne"], "bar",
+             "filterToParams sets correct param key and value if passed an NOT_EQUAL_TO filter");
+
+        // 2 tests
+        filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.LESS_THAN,
+            property: "foo",
+            value: "bar"
+        });
+        var params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed an LESS_THAN filter");
+        t.eq(params["foo__lt"], "bar",
+             "filterToParams sets correct param key and value if passed an LESS_THAN filter");
+
+        // 2 tests
+        filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO,
+            property: "foo",
+            value: "bar"
+        });
+        var params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed an LESS_THAN_OR_EQUAL_TO filter");
+        t.eq(params["foo__lte"], "bar",
+             "filterToParams sets correct param key and value if passed an LESS_THAN_OR_EQUAL_TO filter");
+
+        // 2 tests
+        filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.GREATER_THAN,
+            property: "foo",
+            value: "bar"
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed an GREATER_THAN filter");
+        t.eq(params["foo__gt"], "bar",
+             "filterToParams sets correct param key and value if passed an GREATER_THAN filter");
+
+        // 2 tests
+        filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO,
+            property: "foo",
+            value: "bar"
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed an GREATER_THAN_OR_EQUAL_TO filter");
+        t.eq(params["foo__gte"], "bar",
+             "filterToParams sets correct param key and value if passed an GREATER_THAN_OR_EQUAL_TO filter");
+
+        // 2 tests
+        filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.LIKE,
+            property: "foo",
+            value: "bar"
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed a LIKE filter");
+        t.eq(params["foo__ilike"], "bar",
+             "filterToParams sets correct param key and value if passed an LIKE filter");
+
+        // 4 tests
+        filter = new OpenLayers.Filter.Logical({
+            type: OpenLayers.Filter.Logical.AND,
+            filters: [
+                new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                    property: "foo",
+                    value: "bar"
+                }),
+                new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.LESS_THAN,
+                    property: "foo2",
+                    value: "baz"
+                })
+            ]
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed an EQUAL_TO filter within a AND filter");
+        t.eq(params["foo__eq"], "bar",
+             "filterToParams sets correct param key and value if passed an EQUAL_TO filter within a AND filter");
+        t.eq(params.queryable[1], "foo2",
+             "filterToParams sets correct queryable param if passed a LESS_THAN filter within a AND filter");
+        t.eq(params["foo2__lt"], "baz",
+             "filterToParams sets correct param key and value if passed a LESS_THAN filter within a AND filter");
+
+        // 2 tests
+        protocol = new OpenLayers.Protocol.HTTP({wildcarded: true});
+        filter = new OpenLayers.Filter.Comparison({
+            type: OpenLayers.Filter.Comparison.LIKE,
+            property: "foo",
+            value: "bar"
+        });
+        params = protocol.filterToParams(filter);
+        t.eq(params.queryable[0], "foo",
+             "filterToParams sets correct queryable param if passed a LIKE filter (wildcarded true)");
+        t.eq(params["foo__ilike"], "%bar%",
+             "filterToParams sets correct param key and value if passed an LIKE filter (wildcarded true)");
+    }
+
+    function test_regex2value(t) {
+        t.plan(16);
+
+        // setup
+
+        var protocol = new OpenLayers.Protocol.HTTP();
+        var value;
+
+        // test
+
+        value = protocol.regex2value("foo");
+        t.eq(value, "foo", 'regex2value converts "foo" to "foo"');
+
+        value = protocol.regex2value("foo%");
+        t.eq(value, "foo\\%", 'regex2value converts "foo%" to "foo\\%"');
+
+        value = protocol.regex2value("foo.*");
+        t.eq(value, "foo%", 'regex2value converts "foo.*" to "foo%"');
+
+        value = protocol.regex2value("f.*oo.*");
+        t.eq(value, "f%oo%", 'regex2value converts "f.*oo.*" to "f%oo%"');
+
+        value = protocol.regex2value("foo.");
+        t.eq(value, "foo_", 'regex2value converts "foo." to "foo_"');
+
+        value = protocol.regex2value("f.oo.");
+        t.eq(value, "f_oo_", 'regex2value converts "f.oo." to "f_oo_"');
+
+        value = protocol.regex2value("f.oo.*");
+        t.eq(value, "f_oo%", 'regex2value converts "f.oo.*" to "f_oo%"');
+
+        value = protocol.regex2value("foo\\\\");
+        t.eq(value, "foo\\\\", 'regex2value converts "foo\\\\" to "foo\\\\"');
+
+        value = protocol.regex2value("foo\\.");
+        t.eq(value, "foo.", 'regex2value converts "foo\\." to "foo."');
+
+        value = protocol.regex2value("foo\\\\.");
+        t.eq(value, "foo\\\\_", 'regex2value converts "foo\\\\." to "foo\\\\_"');
+
+        value = protocol.regex2value("foo\\*");
+        t.eq(value, "foo*", 'regex2value converts "foo\\*" to "foo*"');
+
+        value = protocol.regex2value("foo\\\\*");
+        t.eq(value, "foo\\\\*", 'regex2value converts "foo\\\\*" to "foo\\\\*"');
+
+        value = protocol.regex2value("foo\\\\.*");
+        t.eq(value, "foo\\\\%", 'regex2value converts "foo\\\\.*" to "foo\\\\%"');
+
+        value = protocol.regex2value("fo\\.o.*");
+        t.eq(value, "fo.o%", 'regex2value converts from "fo\\.o.*" to "fo.o%"');
+
+        value = protocol.regex2value("fo.*o\\.");
+        t.eq(value, "fo%o.", 'regex2value converts from "fo.*o\\." to "to%o."');
+
+        value = protocol.regex2value("\\*\\..*.\\\\.*\\\\.%");
+        t.eq(value, "*.%_\\\\%\\\\_\\%",
+             'regex2value converts from "\\*\\..*.\\\\.*\\\\.%" ' +
+             'to "*.%_\\\\%\\\\_\\%"');
+   }
+
+    function test_create(t) {
+        t.plan(10);
+        var protocol = new OpenLayers.Protocol.HTTP({
+            'url': 'foo_url',
+            'format': {'write': function() {}}
+        });
+
+        // fake XHR request object
+        var request = {'status': 200};
+
+        // features to pass to create
+        var features = ['feature'];
+
+        // options to pass to create
+        var createOptions = {
+            'url': 'bar_url',
+            'headers': {'k': 'bar_header'},
+            'scope': {'hello': 'world'},
+            'callback': function() {}
+        };
+
+        var response;
+
+        protocol.handleCreate = function(resp, opt) {
+            // 5 tests
+            var req = resp.priv;
+            t.ok(this == protocol,
+                'handleCreate called with correct scope');
+            t.ok(opt == createOptions,
+                'handleCreate called with correct options');
+            t.eq(resp.CLASS_NAME, 'OpenLayers.Protocol.Response',
+                'handleCreate called with a Response object');
+            t.ok(resp.reqFeatures == features,
+                'handleCreate called with correct requested features in response');
+            t.eq(req, request,
+                'handleCreate called with correct request');
+
+            response = resp;
+        };
+
+        var _post = OpenLayers.Request.POST;
+
+        OpenLayers.Request.POST = function(options) {
+            // 4 tests
+            t.eq(options.url, createOptions.url,
+                'POST called with correct url in options');
+            t.eq(options.headers['k'], createOptions.headers['k'],
+                'POST called with correct headers in options');
+            t.eq(options.scope, undefined,
+                'POST called with correct scope in options');
+            t.ok(typeof options.callback == 'function',
+                'POST called with a callback in options');
+            // call callback - delayed because this function has to return first
+            t.delay_call(0.1, function() {
+                options.callback(request);
+                t.ok(resp == response,
+                    'create returns the expected response object');
+                // cleanup
+                protocol.destroy();
+                OpenLayers.Request.POST = _post;
+            });
+            return request;
+        };
+
+        var resp = protocol.create(features, createOptions);
+        
+        OpenLayers.Request.POST = _post;
+    }
+
+    function test_update(t) {
+        t.plan(10);
+        var protocol = new OpenLayers.Protocol.HTTP({
+            'url': 'foo_url',
+            'format': {'write': function() {}}
+        });
+
+        // fake XHR request object
+        var request = {'status': 200};
+
+        // feature to pass to update
+        var feature = {'feature':'feature'};
+
+        // options to pass to update
+        var updateOptions = {
+            'url': 'bar_url',
+            'headers': {'k': 'bar_header'},
+            'scope': {'hello': 'world'},
+            'callback': function() {}
+        };
+
+        var response;
+
+        protocol.handleUpdate = function(resp, opt) {
+            var req = resp.priv;
+            // 5 tests
+            t.ok(this == protocol,
+                'handleUpdate called with correct scope');
+            t.ok(opt == updateOptions,
+                'handleUpdate called with correct options');
+            t.eq(resp.CLASS_NAME, 'OpenLayers.Protocol.Response',
+                'handleUpdate called with a Response object');
+            t.ok(resp.reqFeatures == feature,
+                'handleUpdate called with correct requested feature in response');
+            t.eq(req, request,
+                'handleUpdate called with correct request');
+
+            response = resp;
+        };
+
+        var _put = OpenLayers.Request.PUT;
+
+        OpenLayers.Request.PUT = function(options) {
+            // 4 tests
+            t.eq(options.url, updateOptions.url,
+                'PUT called with correct url in options');
+            t.eq(options.headers['k'], updateOptions.headers['k'],
+                'PUT called with correct headers in options');
+            t.eq(options.scope, undefined,
+                'PUT called with correct scope in options');
+            t.ok(typeof options.callback == 'function',
+                'PUT called with a callback in options');
+            // call callback - delayed because this function has to return first
+            t.delay_call(0.1, function() {
+                options.callback(request);
+                t.ok(resp == response,
+                    'update returns the expected response object');
+                // cleanup
+                protocol.destroy();
+                OpenLayers.Request.PUT = _put;
+            });
+            return request;
+        };
+
+        var resp = protocol.update(feature, updateOptions);
+        
+        OpenLayers.Request.PUT = _put;
+    }
+
+    function test_update_featureurl(t) {
+
+        // test that OpenLayers.Request.PUT receives the URL
+        // set in the feature
+        // http://trac.openlayers.org/ticket/2393#comment:11
+
+        t.plan(1);
+
+        var protocol = new OpenLayers.Protocol.HTTP({
+            'url': 'foo_url',
+            'format': {'write': function() {}}
+        });
+
+        // feature to pass to update
+        var feature = {'feature':'feature', 'url': 'bar_url'};
+
+        var _put = OpenLayers.Request.PUT;
+
+        OpenLayers.Request.PUT = function(options) {
+            t.eq(options.url, feature.url,
+                'PUT called with correct url in options');
+        };
+
+        protocol.update(feature);
+
+        OpenLayers.Request.PUT = _put;
+    }
+
+    function test_handleResponse(t) {
+        t.plan(6);
+
+        var protocol = new OpenLayers.Protocol.HTTP();
+
+        var options, response, request, features;
+
+        // test options - 2 tests
+        var scope = {'fake': 'scope'};
+        options = {
+            'scope': scope,
+            'callback': function(resp) {
+                t.ok(this == scope,
+                    '[no status] callback called with correct scope');
+                t.ok(resp == response,
+                    '[no status] callback called with correct response');
+            }
+        };
+        response = {priv: {}};
+        protocol.handleResponse(response, options);
+        
+        // test failure condition - 1 test
+        options = {
+            'callback': function(resp) {
+                t.eq(resp.code, OpenLayers.Protocol.Response.FAILURE,
+                    '[status 400] callback called with correct response code');
+            }
+        };
+        response = {priv: {status: 400}};
+        protocol.handleResponse(response, options);
+
+        // test success condition - 3 tests
+        features = {'fake': 'features'};
+        options = {
+            'callback': function(resp) {
+                t.eq(resp.code, OpenLayers.Protocol.Response.SUCCESS,
+                    '[status 200] callback called with correct response code');
+                t.eq(resp.features, features,
+                    '[status 200] callback called with correct features in response');
+            }
+        };
+        response = {priv: {status: 200}};
+        protocol.parseFeatures = function(request) {
+            t.ok(request == response.priv,
+                '[status 200] parseFeatures called with correct request');
+            return features;
+        }
+        protocol.handleResponse(response, options);
+
+        // cleanup
+        protocol.destroy();
+    }
+
+    function test_delete(t) {
+        t.plan(10);
+        var protocol = new OpenLayers.Protocol.HTTP({
+            'url': 'foo_url'
+        });
+
+        // fake XHR request object
+        var request = {'status': 200};
+
+        // feature to pass to delete
+        var feature = {'url': 'bar_url'};
+
+        // options to pass to delete
+        var deleteOptions = {
+            'url': 'bar_url',
+            'headers': {'k': 'bar_header'},
+            'scope': {'hello': 'world'},
+            'callback': function() {}
+        };
+
+        var response;
+
+        protocol.handleDelete = function(resp, opt) {
+            // 5 tests
+            var req = resp.priv;
+            t.ok(this == protocol,
+                'handleDelete called with correct scope');
+            t.ok(opt == deleteOptions,
+                'handleDelete called with correct options');
+            t.eq(resp.CLASS_NAME, 'OpenLayers.Protocol.Response',
+                'handleDelete called with a Response object');
+            t.ok(resp.reqFeatures == feature,
+                'handleDelete called with correct requested feature in response');
+            t.eq(req, request,
+                'handleDelete called with correct request');
+
+            response = resp;
+        };
+
+        var _delete = OpenLayers.Request.DELETE;
+
+        OpenLayers.Request.DELETE = function(options) {
+            // 4 tests
+            t.eq(options.url, deleteOptions.url,
+                'DELETE called with correct url in options');
+            t.eq(options.headers['k'], deleteOptions.headers['k'],
+                'DELETE called with correct headers in options');
+            t.eq(options.scope, undefined,
+                'DELETE called with correct scope in options');
+            t.ok(typeof options.callback == 'function',
+                'DELETE called with a callback in options');
+            // call callback - delayed because this function has to return first
+            t.delay_call(0.1, function() {
+                options.callback(request);
+                t.ok(resp == response,
+                    'read returns the expected response object');
+                // cleanup
+                protocol.destroy();
+                OpenLayers.Request.DELETE = _delete;
+            });
+            return request;
+        };
+
+        var resp = protocol['delete'](feature, deleteOptions);
+
+        OpenLayers.Request.DELETE = _delete;
+    }
+
+    function test_delete_featureurl(t) {
+
+        // test that OpenLayers.Request.DELETE receives the URL
+        // set in the feature
+        // http://trac.openlayers.org/ticket/2393#comment:11
+
+        t.plan(1);
+
+        var protocol = new OpenLayers.Protocol.HTTP({
+            'url': 'foo_url',
+            'format': {'write': function() {}}
+        });
+
+        // feature to pass to update
+        var feature = {'feature':'feature', 'url': 'bar_url'};
+
+        var _delete = OpenLayers.Request.DELETE;
+
+        OpenLayers.Request.DELETE = function(options) {
+            t.eq(options.url, feature.url,
+                'DELETE called with correct url in options');
+        };
+
+        protocol['delete'](feature);
+
+        OpenLayers.Request.DELETE = _delete;
+    }
+
+    function test_handleDelete(t) {
+        t.plan(4);
+
+        var protocol = new OpenLayers.Protocol.HTTP();
+
+        var options, response, request, features;
+
+        // test options - 2 tests
+        var scope = {'fake': 'scope'};
+        options = {
+            'scope': scope,
+            'callback': function(resp) {
+                t.ok(this == scope,
+                    'callback called with correct scope');
+                t.ok(resp == response,
+                    'callback called with correct response');
+            }
+        };
+        response = {priv: {}};
+        protocol.handleDelete(response, options);
+        
+        // test failure condition - 1 test
+        options = {
+            'callback': function(resp) {
+                t.eq(resp.code, OpenLayers.Protocol.Response.FAILURE,
+                    'callback called with correct response code');
+            }
+        };
+        response = {priv: {status: 400}};
+        protocol.handleDelete(response, options);
+
+        // test success condition - 1 test
+        options = {
+            'callback': function(resp) {
+                t.eq(resp.code, OpenLayers.Protocol.Response.SUCCESS,
+                    'callback called with correct response code');
+            }
+        };
+        response = {priv: {status: 200}};
+        protocol.handleDelete(response, options);
+
+        // cleanup
+        protocol.destroy();
+    }
+
+    function test_commit(t) {
+        t.plan(17);
+
+        var protocol = new OpenLayers.Protocol.HTTP();
+
+        // 6 features
+        var features = [
+            {'state': OpenLayers.State.INSERT},
+            {'state': OpenLayers.State.INSERT},
+            {'state': OpenLayers.State.UPDATE},
+            {'state': OpenLayers.State.UPDATE},
+            {'state': OpenLayers.State.DELETE},
+            {'state': OpenLayers.State.DELETE}
+        ];
+
+        var options = {
+            'create': {
+                'callback': function(resp) {
+                }
+            },
+            'update': {
+                'callback': function(resp) {
+                }
+            },
+            'delete': {
+                'callback': function(resp) {
+                }
+            }
+        };
+
+        var respCreate = new OpenLayers.Protocol.Response();
+        var respUpdate = new OpenLayers.Protocol.Response();
+        var respDelete = new OpenLayers.Protocol.Response();
+
+        // 2 tests
+        protocol['create'] = function(feature, options) {
+            t.ok(options.scope == protocol,
+                'create called with correct scope');
+            t.ok(typeof options.callback == 'function',
+                'create called with a callback in options');
+            options.callback.call(options.scope, respCreate);
+            return respCreate;
+        };
+        // 4 tests
+        protocol['update'] = function(feature, options) {
+            t.ok(options.scope == protocol,
+                'update called with correct scope');
+            t.ok(typeof options.callback == 'function',
+                'update called with a callback in options');
+            options.callback.call(options.scope, respUpdate);
+            return respUpdate;
+        };
+        // 4 tests
+        protocol['delete'] = function(feature, options) {
+            t.ok(options.scope == protocol,
+                'delete called with correct scope');
+            t.ok(typeof options.callback == 'function',
+                'delete called with a callback in options');
+            options.callback.call(options.scope, respDelete);
+            return respDelete;
+        };
+
+        var count = 0;
+
+        // 5 tests
+        protocol.callUserCallback = function(resp, opt) {
+            t.ok(opt == options,
+                'callUserCallback called with correction options map');
+            count++;
+        };
+
+        var resp = protocol.commit(features, options);
+
+        // 2 tests
+        t.eq(count, 5, 'callUserCallback called for each request');
+        t.eq(resp.length, 5, 'commit returns array with correct length');
+
+        // cleanup
+        protocol.destroy();
+    }
+
+    function test_callUserCallback(t) {
+        t.plan(1);
+
+        var protocol = new OpenLayers.Protocol.HTTP();
+
+        var scope = {'fake': 'scope'};
+
+        // test commit callback
+        var log = {};
+        var options = {
+            foo: {
+                callback: function() {
+                    log.scope = this;
+                },
+                scope: scope
+            }
+        };
+        var resp = {requestType: 'foo'};
+        protocol.callUserCallback(resp, options);
+        t.ok(log.scope, scope, 'correct callback called with correct scope');
+
+    }
+
+    function test_options(t) {
+        t.plan(6);
+        
+        var log1 = {};
+
+        // test that read with no options uses protocol options - 5 tests
+        var url = ".";
+        var headers = {};
+        var params = {};
+        var scope = {};
+        var protocol = new OpenLayers.Protocol.HTTP({
+            format: new OpenLayers.Format({
+                read: function() {},
+                write: function() {}
+            }),
+            url: url,
+            headers: headers,
+            params: params,
+            callback: function(resp) {
+                log1.callbackCalled = true;
+                log1.callbackScope = this;
+                log1.request = resp && resp.priv;
+                log1.requestType = resp && resp.requestType;
+            },
+            scope: scope
+        });        
+        protocol.read();
+        
+        t.delay_call(1, function() {
+            t.eq(log1.callbackCalled, true, "[read] callback called");
+            t.eq(log1.callbackScope, scope, "[read] correct scope");
+            t.ok(log1.request instanceof OpenLayers.Request.XMLHttpRequest, "[read] correct priv type");
+            t.eq(log1.requestType, "read", "[read] correct request type");
+        });
+        
+
+        // test that commit with no options uses protocol options - 2 tests
+        var log2 = {called: 0};
+        protocol.options.callback = function() {
+            log2.called++;
+            log2.scope = this;
+        };
+        protocol.commit([
+            {state: OpenLayers.State.INSERT},
+            {state: OpenLayers.State.INSERT},
+            {state: OpenLayers.State.UPDATE, url: "./1"},
+            {state: OpenLayers.State.UPDATE, url: "./2"},
+            {state: OpenLayers.State.DELETE, url: "./3"},
+            {state: OpenLayers.State.DELETE, url: "./4"}
+        ]);
+        t.delay_call(1, function() {
+            t.eq(log2.called, 1, "[commit] Callback called once.");
+            t.eq(log2.scope, scope, "[commit] Correct scope.");
+        });
+
+    }
+
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Protocol/SOS.html b/tests/Protocol/SOS.html
new file mode 100644
index 0000000..4e4277b
--- /dev/null
+++ b/tests/Protocol/SOS.html
@@ -0,0 +1,57 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_constructor(t) {
+        t.plan(4);
+        var a = new OpenLayers.Protocol.SOS({
+            url: "foo",
+            fois: ["a", "b", "c"]
+        });
+
+        t.eq(a.url, "foo", "constructor sets url");
+        t.eq(a.options.url, a.url, "constructor copies url to options.url");
+        t.eq(a.fois[0], "a", "constructor sets the fois correctly");
+        t.eq((a.format instanceof OpenLayers.Format.SOSGetFeatureOfInterest), true, "Constructor sets format correctly"); 
+    }
+
+    function test_read(t) {
+        t.plan(4);
+
+        var protocol = new OpenLayers.Protocol.SOS({
+            url: "http://some.url.org/sos?",
+            fois: ["foi1", "foi2"],
+            parseFeatures: function(request) {
+                t.eq(request.responseText, "foo", "parseFeatures called properly");
+                return "foo";
+            }
+        });
+
+        var _POST = OpenLayers.Request.POST;
+
+        var expected, status;
+        OpenLayers.Request.POST = function(obj) {
+            t.xml_eq(new OpenLayers.Format.XML().read(obj.data).documentElement, expected, "GetFeatureOfInterest request is correct");
+            obj.status = status;
+            obj.responseText = "foo";
+            obj.options = {};
+            t.delay_call(0.1, function() {obj.callback.call(this)});
+            return obj;
+        };
+
+        var xml = '<GetFeatureOfInterest xmlns="http://www.opengis.net/sos/1.0" version="1.0.0" service="SOS" xsi:schemaLocation="http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><FeatureOfInterestId>foi1</FeatureOfInterestId><FeatureOfInterestId>foi2</FeatureOfInterestId></GetFeatureOfInterest>';
+        expected = new OpenLayers.Format.XML().read(xml).documentElement;
+        status = 200;
+        var response = protocol.read({callback: function(response) {
+            t.eq(response.features, "foo", "user callback properly called with features");
+            t.eq(response.code, OpenLayers.Protocol.Response.SUCCESS, "success reported properly");
+        }});
+
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Protocol/SQL.html b/tests/Protocol/SQL.html
new file mode 100644
index 0000000..01377e0
--- /dev/null
+++ b/tests/Protocol/SQL.html
@@ -0,0 +1,23 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(3);
+        var options = {tableName: 'my_features', 
+                       databaseName: 'my_database_name'}
+        var protocol = new OpenLayers.Protocol.SQL(options);
+
+        t.ok(protocol instanceof OpenLayers.Protocol.SQL,
+             "new OpenLayers.Protocol.SQL returns object");
+
+        t.eq(protocol.tableName, options.tableName, "tableName property is set");
+        t.eq(protocol.databaseName, options.databaseName, "databaseName property is set");
+    }
+    
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Protocol/SQL/Gears.html b/tests/Protocol/SQL/Gears.html
new file mode 100644
index 0000000..6f97f1a
--- /dev/null
+++ b/tests/Protocol/SQL/Gears.html
@@ -0,0 +1,473 @@
+<html>
+<head>
+  <script src="../../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(5);
+
+        t.eq(protocol.CLASS_NAME, "OpenLayers.Protocol.SQL.Gears",
+             "ctor returns correct value");
+
+        t.eq(protocol.jsonParser.CLASS_NAME,
+             "OpenLayers.Format.JSON",
+             "ctor creates a JSON parser");
+
+        t.eq(protocol.wktParser.CLASS_NAME,
+             "OpenLayers.Format.WKT",
+             "ctor creates a WKT parser");
+
+        var str = protocol.FID_PREFIX + "foo_bar";
+        t.ok(str.match(protocol.fidRegExp),
+             "ctor creates correct regexp");
+
+        t.ok(typeof protocol.db == "object",
+             "ctor creates a db object");
+
+        protocol.clear();
+        protocol.destroy();
+    }
+
+    function test_destroy(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(3);
+
+        protocol.destroy();
+
+        t.eq(protocol.db, null,
+             "destroy nullifies db");
+        t.eq(protocol.jsonParser, null,
+             "destroy nullifies jsonParser");
+        t.eq(protocol.wktParser, null,
+             "destroy nullifies wktParser");
+     }
+
+    function test_read(t) {
+        var protocolCallback, readCallback;
+        var protocolOptions = {callback: protocolCallback};
+        var readOptions = {callback: readCallback};
+
+        var protocol = new OpenLayers.Protocol.SQL.Gears(protocolOptions);
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        function okCallback(resp) {
+            t.eq(resp.CLASS_NAME, "OpenLayers.Protocol.Response",
+                 "read calls correct callback with a response object");
+        }
+
+        function failCallback(resp) {
+            t.fail("read calls incorrect callback");
+        }
+
+        t.plan(4);
+
+        var resp;
+
+        // 2 tests
+        protocolOptions.callback = okCallback;
+        readOptions.callback = failCallback;
+        resp = protocol.read();
+        t.eq(resp.CLASS_NAME, "OpenLayers.Protocol.Response",
+             "read returns a response object");
+
+        // 2 test
+        protocolOptions.callback = failCallback;
+        readOptions.callback = okCallback;
+        resp = protocol.read(readOptions);
+        t.eq(resp.CLASS_NAME, "OpenLayers.Protocol.Response",
+             "read returns a response object");
+
+        protocol.clear();
+        protocol.destroy();
+    }
+
+    function test_unfreezeFeature(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(10);
+
+        var feature;
+        var wkt, json, fid, state;
+
+        json = "{\"fake\":\"properties\"}";
+        fid = "1000";
+        state = OpenLayers.State.INSERT;
+
+        var row = {
+            fieldByName: function(str) {
+                if (str == "geometry") {
+                    return wkt;
+                }
+                if (str == "properties") {
+                    return json;
+                }
+                if (str == "fid") {
+                    return fid;
+                }
+                if (str == "state") {
+                    return state;
+                }
+            }
+        };
+
+        // 5 tests
+        wkt = "POINT(1 2)";
+        feature = protocol.unfreezeFeature(row);
+        t.eq(feature.CLASS_NAME, "OpenLayers.Feature.Vector",
+             "unfreezeFeature returns an OpenLayers.Feature.Vector");
+        t.ok(feature.geometry.x == 1 && feature.geometry.y == 2,
+             "unfreezeFeature returns a feature with correct geometry");
+        t.eq(feature.attributes.fake, "properties",
+             "unfreezeFeature returns a feature with correct attributes");
+        t.eq(feature.fid, fid,
+             "unfreezeFeature returns a feature with fid");
+        t.eq(feature.state, state,
+             "unfreezeFeature returns a feature with state");
+
+        // 5 tests
+        wkt = protocol.NULL_GEOMETRY;
+        state = protocol.NULL_FEATURE_STATE;
+        feature = protocol.unfreezeFeature(row);
+        t.eq(feature.CLASS_NAME, "OpenLayers.Feature.Vector",
+             "unfreezeFeature returns an OpenLayers.Feature.Vector");
+        t.eq(feature.geometry, null,
+             "unfreezeFeature returns a feature with correct geometry");
+        t.eq(feature.attributes.fake, "properties",
+             "unfreezeFeature returns a feature with correct attributes");
+        t.eq(feature.fid, fid,
+             "unfreezeFeature returns a feature with fid");
+        t.eq(feature.state, null,
+             "unfreezeFeature returns a feature with state");
+
+        protocol.clear();
+        protocol.destroy();
+    }
+
+    function test_extractFidFromField(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(4);
+
+        var field, fid;
+
+        // fid is a string, field is not prefixed with FID_PREFIX
+        // 1 test
+        field = "10";
+        res = protocol.extractFidFromField(field);
+        t.eq(res, "10",
+             "extractFidFromField returns expected string");
+
+        // fid is a string, field is prefixed with FID_PREFIX
+        // 1 test
+        field = protocol.FIX_PREFIX + "10";
+        res = protocol.extractFidFromField(field);
+        t.eq(res, protocol.FIX_PREFIX + "10",
+             "extractFidFromField returns expected prefixed string");
+
+        // fid is a number, field is not prefixed with FIX_PREFIX
+        // 1 test
+        protocol.typeOfFid = "number";
+        field = "10";
+        res = protocol.extractFidFromField(field);
+        t.eq(res, 10,
+             "extractFidFromField returns expected number");
+
+        // fid is a number, field is prefixed with FIX_PREFIX
+        // 1 test
+        protocol.typeOfFid = "number";
+        field = protocol.FID_PREFIX + "10";
+        res = protocol.extractFidFromField(field);
+        t.eq(res, protocol.FID_PREFIX + "10",
+             "extractFidFromField returns expected prefixed string");
+    }
+
+    function test_freezeFeature(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(8);
+
+        var feature, res;
+
+        // 4 tests
+        feature = new OpenLayers.Feature.Vector();
+        feature.geometry = new OpenLayers.Geometry.Point(1, 2);
+        feature.attributes.fake = "properties";
+        feature.fid = "1000";
+        feature.state = OpenLayers.State.INSERT;
+        res = protocol.freezeFeature(feature);
+        t.eq(res[0], feature.fid,
+             "freezeFeature returns correct fid");
+        t.eq(res[1], "POINT(1 2)",
+             "freezeFeature returns correct WKT");
+        t.eq(res[2], "{\"fake\":\"properties\"}",
+             "freezeFeature returns correct JSON");
+        t.eq(res[3], feature.state,
+             "freezeFeature returns correct feature state");
+
+        // 4 tests
+        protocol.saveFeatureState = false;
+        feature = new OpenLayers.Feature.Vector();
+        feature.attributes.fake = "properties";
+        feature.fid = "1000";
+        feature.state = OpenLayers.State.INSERT;
+        res = protocol.freezeFeature(feature);
+        t.eq(res[0], feature.fid,
+             "freezeFeature returns correct fid");
+        t.eq(res[1], protocol.NULL_GEOMETRY,
+             "freezeFeature returns expected null geom string");
+        t.eq(res[2], "{\"fake\":\"properties\"}",
+             "freezeFeature returns correct JSON");
+        t.eq(res[3], protocol.NULL_FEATURE_STATE,
+             "freezeFeature returns expected null feature state string");
+
+        protocol.clear();
+        protocol.destroy();
+     }
+
+     function test_create(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(8);
+
+        var resp;
+        var scope = {"fake": "scope"};
+
+        var options = {
+            callback: function(resp) {
+                t.eq(resp.CLASS_NAME, "OpenLayers.Protocol.Response",
+                     "user callback is passed a response");
+                t.eq(resp.requestType, "create",
+                     "user callback is passed correct request type in resp");
+                t.ok(this == scope,
+                     "user callback called with correct scope");
+            },
+            scope: scope
+        };
+
+        // 4 tests
+        var feature = new OpenLayers.Feature.Vector();
+        feature.fid = "1000";
+        feature.attributes.fake = "properties";
+        feature.state = OpenLayers.State.INSERT;
+        resp = protocol.create([feature], options);
+        t.eq(resp.CLASS_NAME, "OpenLayers.Protocol.Response",
+             "create returns a response");
+
+        // check what we have in the DB
+        // 4 tests
+        resp = protocol.read({"noFeatureStateReset": true});
+        t.eq(resp.features.length, 1,
+             "create inserts feature in the DB");
+        t.eq(resp.features[0].fid, feature.fid,
+             "create inserts feature with correct fid");
+        t.eq(resp.features[0].attributes.fake, feature.attributes.fake,
+             "create inserts feature with correct attributes");
+        t.eq(resp.features[0].state, feature.state,
+             "create inserts feature with correct state");
+
+        protocol.clear();
+        protocol.destroy();
+    }
+
+     function test_createOrUpdate(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(5);
+
+        // 1 test
+        var feature = new OpenLayers.Feature.Vector();
+        feature.fid = "1000";
+        feature.attributes.fake = "properties";
+        feature.state = OpenLayers.State.INSERT;
+        resp = protocol.createOrUpdate([feature]);
+        t.eq(resp.CLASS_NAME, "OpenLayers.Protocol.Response",
+             "createOrUpdate returns a response");
+
+        // check what we have in the DB
+        // 4 tests
+        resp = protocol.read({"noFeatureStateReset": true});
+        t.eq(resp.features.length, 1,
+             "createOrUpdate inserts feature in the DB");
+        t.eq(resp.features[0].fid, feature.fid,
+             "createOrUpdate inserts feature with correct fid");
+        t.eq(resp.features[0].attributes.fake, feature.attributes.fake,
+             "createOrUpdate inserts feature with correct attributes");
+        t.eq(resp.features[0].state, feature.state,
+             "createOrUpdate inserts feature with correct state");
+
+        protocol.clear();
+        protocol.destroy();
+    }
+
+    function test_delete(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(4);
+
+        function createOneAndDeleteOne(fid, deleteOptions) {
+            var feature = new OpenLayers.Feature.Vector();
+            feature.fid = fid;
+            feature.attributes.fake = "properties";
+            feature.state = OpenLayers.State.INSERT;
+            var r = protocol.create([feature]);
+            protocol["delete"](r.reqFeatures, deleteOptions);
+        }
+
+        var resp, fid;
+
+        // 1 test
+        fid = 1000;
+        protocol.saveFeatureState = false;
+        createOneAndDeleteOne(fid)
+        resp = protocol.read();
+        t.eq(resp.features.length, 0,
+             "delete deletes feature if saveFeatureState is false");
+        protocol.clear();
+
+        // 1 test
+        fid = 1000;
+        protocol.saveFeatureState = true;
+        createOneAndDeleteOne(fid);
+        resp = protocol.read();
+        t.eq(resp.features.length, 1,
+             "delete does not delete feature if saveFeatureState is true");
+        protocol.clear();
+
+        // 1 test
+        fid = "1000";
+        protocol.saveFeatureState = true;
+        createOneAndDeleteOne(fid);
+        resp = protocol.read();
+        t.eq(resp.features.length, 1,
+             "delete does not delete feature if saveFeatureState is true");
+        protocol.clear();
+
+        // 1 test
+        fid = protocol.FID_PREFIX + "1000";
+        protocol.saveFeatureState = true;
+        createOneAndDeleteOne(fid, {dontDelete: true});
+        resp = protocol.read();
+        t.eq(resp.features.length, 0,
+             "delete deletes feature if saveFeatureState is true and fid is prefixed");
+        protocol.clear();
+
+        protocol.destroy();
+    }
+
+    function test_callUserCallback(t) {
+        var protocol = new OpenLayers.Protocol.SQL.Gears();
+        if (!protocol.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(6);
+
+        var options, resp;
+        var scope = {'fake': 'scope'};
+
+        // test commit callback
+        // 1 tests
+        options = {
+            'callback': function() {
+                t.ok(this == scope, 'callback called with correct scope');
+            },
+            'scope': scope
+        };
+        resp = {'requestType': 'create', 'last': true};
+        protocol.callUserCallback(options, resp);
+        // 0 test
+        resp = {'requestType': 'create', 'last': false};
+        protocol.callUserCallback(options, resp);
+
+        // test create callback
+        // 2 tests
+        options = {
+            'create': {
+                'callback': function(r) {
+                    t.ok(this == scope, 'callback called with correct scope');
+                    t.ok(r == resp, 'callback called with correct response');
+                },
+                'scope': scope
+            }
+        };
+        resp = {'requestType': 'create'};
+        protocol.callUserCallback(options, resp);
+
+        // test with both callbacks set
+        // 3 tests
+        options = {
+            'create': {
+                'callback': function(r) {
+                    t.ok(this == scope, 'callback called with correct scope');
+                    t.ok(r == resp, 'callback called with correct response');
+                },
+                'scope': scope
+            },
+            'callback': function() {
+                t.ok(this == scope, 'callback called with correct scope');
+            },
+            'scope': scope
+        };
+        resp = {'requestType': 'create', 'last': true};
+        protocol.callUserCallback(options, resp);
+
+        // no callback set
+        // 0 test
+        options = {
+            'delete': {
+                'callback': function(resp) {
+                    t.fail('callback should not get called');
+                }
+            }
+        };
+        resp = {'requestType': 'create'};
+        protocol.callUserCallback(options, resp);
+
+        // cleanup
+        protocol.destroy();
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Protocol/WFS.html b/tests/Protocol/WFS.html
new file mode 100644
index 0000000..0eb40fe
--- /dev/null
+++ b/tests/Protocol/WFS.html
@@ -0,0 +1,302 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(2);
+
+        var protocol = new OpenLayers.Protocol.WFS({
+            url: "http://some.url.org",
+            featureNS: "http://namespace.org",
+            featureType: "type"
+        });
+        t.ok(protocol instanceof OpenLayers.Protocol.WFS.v1_0_0,
+             "initialize returns instance of default versioned protocol")
+
+        var protocol = new OpenLayers.Protocol.WFS({
+            url: "http://some.url.org",
+            featureNS: "http://namespace.org",
+            featureType: "type",
+            version: "1.1.0"
+        });
+        t.ok(protocol instanceof OpenLayers.Protocol.WFS.v1_1_0,
+             "initialize returns instance of custom versioned protocol")
+    }
+
+    function test_read(t) {
+        t.plan(6);
+
+        var protocol = new OpenLayers.Protocol.WFS({
+            url: "http://some.url.org",
+            featureNS: "http://namespace.org",
+            featureType: "type",
+            parseFeatures: function(request) {
+                t.eq(request.responseText, "foo", "parseFeatures called properly");
+                return "foo";
+            }
+        });
+
+        var _POST = OpenLayers.Request.POST;
+
+        var expected, status;
+        OpenLayers.Request.POST = function(obj) {
+            t.xml_eq(new OpenLayers.Format.XML().read(obj.data).documentElement, expected, "GetFeature request is correct");
+            obj.status = status;
+            obj.responseText = "foo";
+            obj.options = {};
+            t.delay_call(0.1, function() {obj.callback.call(this)});
+            return obj;
+        };
+
+        expected = readXML("GetFeature_1");
+        status = 200;
+        var response = protocol.read({callback: function(response) {
+            t.eq(response.features, "foo", "user callback properly called with features");
+            t.eq(response.code, OpenLayers.Protocol.Response.SUCCESS, "success reported properly");
+        }});
+
+        options = {
+            maxFeatures: 10,
+            featureType: 'type2',
+            srsName: 'EPSG:900913',
+            featureNS: 'htttp://alternative.namespace.org',
+            callback: function(response) {
+                t.eq(response.code, OpenLayers.Protocol.Response.FAILURE, "failure reported properly to user callback");
+            }
+        };
+        expected = readXML("GetFeature_2");
+        status = 400;
+        var response = protocol.read(options);
+
+        OpenLayers.Request.POST = _POST;
+    }
+
+    function test_commit(t){
+        t.plan(4);
+
+        var url = "http://some.url.org";
+        var protocol = new OpenLayers.Protocol.WFS({
+            url: url,
+            featureNS: "http://namespace.org",
+            featureType: "type"
+        });
+        protocol.format.read = function(data) {
+            t.eq(data, "foo", "callback called with correct argument");
+            return {
+                insertIds: new Array(3),
+                success: true
+            }
+        };
+
+        var _POST = OpenLayers.Request.POST;
+
+        var expected;
+        OpenLayers.Request.POST = function(obj) {
+            t.xml_eq(new OpenLayers.Format.XML().read(obj.data).documentElement, expected, "Transaction XML with Insert, Update and Delete created correctly");
+            obj.responseText = "foo";
+            obj.options = {};
+            t.delay_call(0.1, function() {obj.callback.call(this)});
+            return obj;
+        };
+
+        var featureDelete = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(42, 7), {has : "cheeseburger"});
+        featureDelete.fid = "fid.37";
+        featureDelete.state = OpenLayers.State.DELETE;
+        featureDelete.layer = {
+            projection: {
+                getCode : function(){
+                    return "EPSG:4326";
+                }
+            }
+        }
+        var featureInsert = featureDelete.clone();
+        featureInsert.state = OpenLayers.State.INSERT;
+        var featureModify = featureDelete.clone();
+        featureModify.fid = "fid.37";
+        featureModify.state = OpenLayers.State.UPDATE;
+
+        options = {
+            featureNS: "http://some.namespace.org",
+            featureType: "type",
+            callback: function(response) {
+                t.eq(response.insertIds.length, 3, "correct response passed to user callback");
+                t.eq(response.code, OpenLayers.Protocol.Response.SUCCESS, "success properly reported to user callback");
+            }
+        }
+
+        expected = readXML("commit");
+        var response = protocol.commit([featureInsert, featureModify, featureDelete], options);
+
+        OpenLayers.Request.POST = _POST;
+
+    }
+
+    function test_filterDelete(t) {
+        t.plan(2)
+
+        var url = "http://some.url.org";
+        var protocol = new OpenLayers.Protocol.WFS({
+            url: url,
+            featureNS: "http://namespace.org",
+            featureType: "type"
+        });
+
+        var filter = new OpenLayers.Filter.Spatial({
+            type: OpenLayers.Filter.Spatial.BBOX,
+            value: new OpenLayers.Bounds(-5, -5, 5, 5)
+        });
+
+        var _POST = OpenLayers.Request.POST;
+
+        var expected = readXML("filter_delete");
+        OpenLayers.Request.POST = function(obj) {
+            t.xml_eq(new OpenLayers.Format.XML().read(obj.data).documentElement, expected, "request data correct");
+            t.delay_call(0.1, function() {obj.callback.call(this)});
+            return obj;
+        };
+
+        var response = protocol.filterDelete(filter, {
+            callback: function() {
+                t.ok("user callback function called");
+            }
+        });
+
+        OpenLayers.Request.POST = _POST;
+    }
+
+    function test_abort(t) {
+        t.plan(1);
+        var protocol = new OpenLayers.Protocol.WFS({
+            url: "http://example.com",
+            featureNS: "http://example.com#namespace",
+            featureType: "type"
+        });
+
+        var response = {
+            priv: {
+                abort: function() {
+                    aborted = true;
+                }
+            }
+        };
+
+        // call abort with mocked response
+        var aborted = false;
+        protocol.abort(response);
+        t.eq(aborted, true, "abort called on response.priv");
+
+    }
+
+    function test_fromWMSLayer(t) {
+        t.plan(8);
+        var map = new OpenLayers.Map("map", {
+            projection: "EPSG:1234"
+        });
+        var layer = new OpenLayers.Layer.WMS("foo", "htttp://foo/ows",
+            {layers: "topp:states"}
+        );
+        map.addLayer(layer);
+        var protocol = OpenLayers.Protocol.WFS.fromWMSLayer(layer);
+        t.eq(protocol.url, "htttp://foo/ows", "url taken from wms layer");
+        t.eq(protocol.featurePrefix, "topp", "feature prefix correctly extracted");
+        t.eq(protocol.featureType, "states", "typeName correctly extracted");
+        t.eq(protocol.srsName, "EPSG:1234", "srsName set correctly");
+        t.eq(protocol.version, "1.1.0", "version set correctly");
+
+        layer.params["LAYERS"] = ["topp:street_centerline", "topp:states"];
+        layer.projection = new OpenLayers.Projection("EPSG:900913");
+        protocol = OpenLayers.Protocol.WFS.fromWMSLayer(layer);
+        t.eq(protocol.featurePrefix, "topp", "featurePrefix from layer param array");
+        t.eq(protocol.featureType, "street_centerline", "first layer from layer param array as featureType");
+        t.eq(protocol.srsName, "EPSG:900913", "projection from layer preferred");
+    }
+
+    function test_readFormat(t) {
+        t.plan(1);
+
+        var protocol = new OpenLayers.Protocol.WFS({
+            url: "http://some.url.org",
+            featureNS: "http://namespace.org",
+            featureType: "type",
+            formatOptions: {outputFormat: 'json'},
+            readFormat: new OpenLayers.Format.GeoJSON()
+        });
+
+        var request = {};
+        request.responseText = '{"type":"FeatureCollection","features":[{"type":"Feature","id":"V_HECTOPUNTEN.108411","geometry":{"type":"MultiPoint","coordinates":[[190659.467,349576.19]]},"geometry_name":"ORA_GEOMETRY","properties":{"WEGNUMMER":"002","HECTOMTRNG_ORG":2200,"HECTOMTRNG":"220.00","bbox":[190659.467,349576.19,190659.467,349576.19]}}]}';
+        var features = protocol.parseFeatures(request);
+        t.eq(features.length, 1, "the right format is used to read the request (GeoJSON)");
+ 	}
+
+    function readXML(id) {
+        var xml = document.getElementById(id).firstChild.nodeValue;
+        return new OpenLayers.Format.XML().read(xml).documentElement;
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:512px; height:256px"> </div>
+<div id="GetFeature_1"><!--
+<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <wfs:Query typeName="feature:type" xmlns:feature="http://namespace.org"/>
+</wfs:GetFeature>
+--></div>
+<div id="GetFeature_2"><!--
+<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" maxFeatures="10" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <wfs:Query typeName="feature:type2" xmlns:feature="htttp://alternative.namespace.org"/>
+</wfs:GetFeature>
+--></div>
+<div id="commit"><!--
+<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-transaction.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <wfs:Insert>
+        <feature:type xmlns:feature="http://namespace.org">
+            <feature:the_geom>
+                <gml:Point xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
+                    <gml:coordinates decimal="." cs="," ts=" ">42,7</gml:coordinates>
+                </gml:Point>
+            </feature:the_geom>
+            <feature:has>cheeseburger</feature:has>
+        </feature:type>
+    </wfs:Insert>
+    <wfs:Update typeName="feature:type" xmlns:feature="http://namespace.org">
+        <wfs:Property>
+            <wfs:Name>the_geom</wfs:Name>
+            <wfs:Value>
+                <gml:Point xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
+                    <gml:coordinates decimal="." cs="," ts=" ">42,7</gml:coordinates>
+                </gml:Point>
+            </wfs:Value>
+        </wfs:Property>
+        <wfs:Property>
+            <wfs:Name>has</wfs:Name>
+            <wfs:Value>cheeseburger</wfs:Value>
+        </wfs:Property>
+        <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:FeatureId fid="fid.37"/>
+        </ogc:Filter>
+    </wfs:Update>
+    <wfs:Delete typeName="feature:type" xmlns:feature="http://namespace.org">
+        <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:FeatureId fid="fid.37"/>
+        </ogc:Filter>
+    </wfs:Delete>
+</wfs:Transaction>
+--></div>
+<div id="filter_delete"><!--
+<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0">
+    <wfs:Delete typeName="feature:type" xmlns:feature="http://namespace.org">
+        <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:BBOX>
+                <ogc:PropertyName/>
+                <gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
+                    <gml:coordinates decimal="." cs="," ts=" ">-5,-5 5,5</gml:coordinates>
+                </gml:Box>
+            </ogc:BBOX>
+        </ogc:Filter>
+    </wfs:Delete>
+</wfs:Transaction>
+--></div>
+</body>
+</html>
diff --git a/tests/README.txt b/tests/README.txt
new file mode 100644
index 0000000..dc1f192
--- /dev/null
+++ b/tests/README.txt
@@ -0,0 +1,16 @@
+This directory contains unit tests for the OpenLayers library.
+
+Tests use the Test.AnotherWay library from <http://openjsan.org>. The test
+runner is 'run-tests.html' and new test files need to be added to
+'list-tests.html'.
+
+The following file naming conventions are used:
+
+  * A filename that starts with `test_` and has an `.html` extension
+    contains tests. These should contain tests for a specific class.
+
+  * A filename starting with `page_` and has an `.html` extension is a
+    supporting HTML file used in one or more tests.
+
+  * A filename starting with 'data_` is a supporting data file used in one
+    or more tests.
diff --git a/tests/Renderer.html b/tests/Renderer.html
new file mode 100644
index 0000000..c3d0092
--- /dev/null
+++ b/tests/Renderer.html
@@ -0,0 +1,80 @@
+<html>
+<head>
+<script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_Renderer_constructor(t) {
+        t.plan(2);
+        var el = document.body;
+        el.id = "foo";
+        var r = new OpenLayers.Renderer(el.id);
+        
+        t.ok(r instanceof OpenLayers.Renderer, "new OpenLayers.Renderer returns Renderer object" );
+        t.ok(r.container == el, "renderer container is correctly set");
+    }
+    
+    function test_Renderer_supported(t) {
+        t.plan(1);
+        
+        var r = new OpenLayers.Renderer();
+        t.eq(r.supported(), false, "supported returns false by default");
+    }
+    
+    function test_Renderer_setextent(t) {
+        t.plan(2);
+        
+        var r = new OpenLayers.Renderer();
+        var extent = new OpenLayers.Bounds(1,2,3,4);
+        r.resolution = 1;
+        r.setExtent(extent, true);
+        t.ok(r.extent.equals(extent), "extent is correctly set");
+        t.eq(r.resolution, null, "resolution nullified");
+    }
+    
+    function test_Renderer_setsize(t) {
+        t.plan(2);
+        
+        var r = new OpenLayers.Renderer();
+        var size = new OpenLayers.Size(1,2);
+        r.resolution = 1;
+        r.setSize(size);
+        t.ok(r.size.equals(size), "size is correctly set");
+        t.eq(r.resolution, null, "resolution nullified");
+    }
+    
+    function test_Renderer_getresolution(t) {
+        t.plan(2);
+        
+        var r = new OpenLayers.Renderer();
+        var map = new OpenLayers.Map("map");
+        r.map = map;
+        var resolution = r.getResolution();
+        t.eq(resolution, map.getResolution(), "resolution matches the map resolution");
+        t.eq(r.resolution, resolution, "resolution is correctly set");
+    }
+
+    function test_Renderer_destroy(t) {
+        t.plan(5);
+
+        var r = new OpenLayers.Renderer();
+        r.container = document.createElement("div");
+        r.extent = new OpenLayers.Bounds(1,2,3,4);
+        r.size = new OpenLayers.Size(1,2);
+        r.resolution = 1;
+        r.map = {};
+
+        r.destroy();
+
+        t.eq(r.container, null, "container nullified");
+        t.eq(r.extent, null, "extent nullified");
+        t.eq(r.size, null, "size nullified");
+        t.eq(r.resolution, null, "resolution nullified");
+        t.eq(r.map, null, "map nullified");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Renderer/Canvas.html b/tests/Renderer/Canvas.html
new file mode 100644
index 0000000..d9a1810
--- /dev/null
+++ b/tests/Renderer/Canvas.html
@@ -0,0 +1,86 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var supported = OpenLayers.Renderer.Canvas.prototype.supported();
+    function test_Renderer_Canvas_constructor(t) {
+        if (!supported) { t.plan(0); return; }
+        t.plan(2);
+        var el = document.body;
+        el.id = "foo";
+        var r = new OpenLayers.Renderer.Canvas(el.id);
+        
+        t.ok(r instanceof OpenLayers.Renderer.Canvas, "new OpenLayers.Renderer.Canvas returns Renderer.Canvas object" );
+        t.ok(r.container == el, "renderer container is correctly set");
+    }
+    
+    function test_Renderer_Canvas_setextent(t) {
+        if (!supported) { t.plan(0); return; }
+        t.plan(2);
+        var el = document.body;
+        el.id = "foo";
+        var r = new OpenLayers.Renderer.Canvas(el.id);
+        
+        var extent = new OpenLayers.Bounds(1,2,3,4);
+        r.resolution = 1;
+        r.setExtent(extent);
+        t.ok(r.extent.equals(extent), "extent is correctly set");
+        t.eq(r.resolution, null, "resolution nullified");
+    }
+    
+    function test_Renderer_Canvas_setsize(t) {
+        if (!supported) { t.plan(0); return; }
+        t.plan(2);
+        
+        var el = document.body;
+        el.id = "foo";
+        var r = new OpenLayers.Renderer.Canvas(el.id);
+        var size = new OpenLayers.Size(1,2);
+        r.resolution = 1;
+        r.setSize(size);
+        t.ok(r.size.equals(size), "size is correctly set");
+        t.eq(r.resolution, null, "resolution nullified");
+    }
+    
+    function test_Renderer_Canvas_getresolution(t) {
+        if (!supported) { t.plan(0); return; }
+        t.plan(2);
+        
+        var el = document.body;
+        el.id = "foo";
+        var r = new OpenLayers.Renderer.Canvas(el.id);
+        var map = new OpenLayers.Map("map");
+        r.map = map;
+        var resolution = r.getResolution();
+        t.eq(resolution, map.getResolution(), "resolution matches the map resolution");
+        t.eq(r.resolution, resolution, "resolution is correctly set");
+    }
+
+    function test_Renderer_Canvas_destroy(t) {
+        if (!supported) { t.plan(0); return; }
+        t.plan(5);
+
+        var el = document.body;
+        el.id = "foo";
+        var r = new OpenLayers.Renderer.Canvas(el.id);
+        r.container = document.createElement("div");
+        r.extent = new OpenLayers.Bounds(1,2,3,4);
+        r.size = new OpenLayers.Size(1,2);
+        r.resolution = 1;
+        r.map = {};
+
+        r.destroy();
+
+        t.eq(r.container, null, "container nullified");
+        t.eq(r.extent, null, "extent nullified");
+        t.eq(r.size, null, "size nullified");
+        t.eq(r.resolution, null, "resolution nullified");
+        t.eq(r.map, null, "map nullified");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Renderer/Elements.html b/tests/Renderer/Elements.html
new file mode 100644
index 0000000..2111a59
--- /dev/null
+++ b/tests/Renderer/Elements.html
@@ -0,0 +1,571 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function setUp() {
+        // Stub out functions that are meant to be overridden by
+        // subclasses.
+        OpenLayers.Renderer.Elements.prototype._createRenderRoot =
+            OpenLayers.Renderer.Elements.prototype.createRenderRoot;
+        
+        var rendererRoot = document.createElement("div");
+        OpenLayers.Renderer.Elements.prototype.createRenderRoot = function() {
+            return rendererRoot;
+        };
+        
+        OpenLayers.Renderer.Elements.prototype._createRoot =
+            OpenLayers.Renderer.Elements.prototype.createRoot;
+        
+        OpenLayers.Renderer.Elements.prototype.createRoot = function() {
+            return document.createElement("div");
+        };
+        
+        OpenLayers.Renderer.Elements.prototype._createNode =
+            OpenLayers.Renderer.Elements.prototype.createNode;
+        
+        OpenLayers.Renderer.Elements.prototype.createNode = function() {
+            return document.createElement("div");
+        };
+    }
+    
+    // Create a new Elements renderer based on an id and an ordering
+    // type. For these tests, both of these parameters are optional.
+    function create_renderer(id, options) {
+        
+        rendererRoot = null;
+        
+        if (id == null) {
+            var el = document.createElement('div');
+            document.body.appendChild(el);
+            el.id = OpenLayers.Util.createUniqueID();
+            id = el.id;
+        }
+        
+        return new OpenLayers.Renderer.Elements(id, options);
+    }
+    
+    // Cleanup stubs made in the function above.
+    function tearDown() {
+        OpenLayers.Renderer.Elements.prototype.createRenderRoot =
+            OpenLayers.Renderer.Elements.prototype._createRenderRoot;
+        OpenLayers.Renderer.Elements.prototype.createRoot =
+            OpenLayers.Renderer.Elements.prototype._createRoot;
+        OpenLayers.Renderer.Elements.prototype.createNode =
+            OpenLayers.Renderer.Elements.prototype._createNode;
+    }
+
+    function test_Elements_constructor(t) {
+        t.plan(6);
+        
+        setUp();
+        
+        var r = create_renderer();
+        
+        t.ok(r instanceof OpenLayers.Renderer.Elements, "new OpenLayers.Renderer.Elements returns Elements object" );
+        t.ok(r.rendererRoot != null, "elements rendererRoot is not null");
+        t.ok(r.root != null, "elements root is not null");
+        t.ok(r.indexer == null, "indexer is null if unused.");
+        
+        t.ok(r.root.parentNode == r.rendererRoot, "elements root is correctly appended to rendererRoot");
+        t.ok(r.rendererRoot.parentNode == r.container, "elements rendererRoot is correctly appended to container");
+        
+        tearDown();
+    }
+    
+    function test_Elements_destroy(t) {
+        t.plan(5);
+        
+        var elems = {
+            'clear': function() {
+                t.ok(true, "clear called");
+            },
+            'rendererRoot': {},
+            'root': {},
+            'xmlns': {}
+        };
+
+        OpenLayers.Renderer.prototype._destroy = 
+            OpenLayers.Renderer.prototype.destroy;
+
+        var args = [{}, {}, {}];
+        OpenLayers.Renderer.prototype.destroy = function() {
+            t.ok((arguments[0] == args[0]) &&
+                 (arguments[1] == args[1]) &&
+                 (arguments[2] == args[2]), "correct arguments passed to OpenLayers.Renderer.destroy()");
+        };
+
+        OpenLayers.Renderer.Elements.prototype.destroy.apply(elems, args);
+
+        t.ok(elems.rendererRoot == null, "rendererRoot nullified");
+        t.ok(elems.root == null, "root nullified");
+        t.ok(elems.xmlns == null, "xmlns nullified");
+
+        OpenLayers.Renderer.prototype.destroy = 
+            OpenLayers.Renderer.prototype._destroy;
+
+    }
+    
+    function test_Elements_clear(t) {
+        t.plan(2);
+        
+        setUp();
+        
+        var r = create_renderer();
+        var element = document.createElement("div");
+        r.root = element;
+        
+        var node = document.createElement("div");
+        element.appendChild(node);
+        
+        r.clear();
+        
+        t.ok(r.vectorRoot.childNodes.length == 0, "vector root is correctly cleared");
+        t.ok(r.textRoot.childNodes.length == 0, "text root is correctly cleared");
+        
+        tearDown();
+    }
+    
+    function test_Elements_drawGeometry(t) {
+        t.plan(7);
+
+        setUp();
+
+        var r = create_renderer();
+        
+        var element = document.createElement("div");
+        r.vectorRoot = element;
+
+        r.nodeFactory = function(id, type) {
+            var element = document.createElement("div");
+            return element;
+        };
+        var g_Node = null;
+        var b_Node = null;
+        r.drawGeometryNode = function(node, geometry, style) {
+            g_Node = node;
+            return {node: node, complete: true};
+        };
+        r.redrawBackgroundNode = function(id, geometry, style, featureId) {
+            b_Node = r.nodeFactory();
+            b_Node.id = "foo_background";
+            element.appendChild(b_Node);
+        };
+
+        r.getNodeType = function(geometry, style) {
+            return "div";
+        };
+        var geometry = {
+            id: 'foo',
+            CLASS_NAME: 'bar',
+            getBounds: function() {return {bottom: 0}}
+        };
+        var style = {'backgroundGraphic': 'foo'};
+        var featureId = 'dude';
+        r.drawGeometry(geometry, style, featureId);
+        t.ok(g_Node.parentNode == element, "node is correctly appended to root");
+        t.ok(b_Node.parentNode == element, "redrawBackgroundNode appended background node");
+        t.eq(g_Node._featureId, 'dude', "_featureId is correct");
+        t.eq(g_Node._style.backgroundGraphic, "foo", "_style is correct");
+        t.eq(g_Node._geometryClass, 'bar', "_geometryClass is correct");
+
+        var returnNode = function(id) {
+        	return id == "foo_background" ? b_Node : g_Node;
+        }
+       	
+        var _getElement = document.getElementById;
+        document.getElementById = returnNode;
+        OpenLayers.Util.getElement = returnNode;
+        
+        style = {'display':'none'};
+        r.drawGeometry(geometry, style, featureId);
+        t.ok(g_Node.parentNode != element, "node is correctly removed");
+        t.ok(b_Node.parentNode != element, "background node correctly removed")
+        
+        document.getElementById = _getElement;
+            
+        tearDown();
+    }
+
+    function test_Elements_drawGeometry_2(t) {
+        t.plan(9);
+        
+        setUp();
+        
+        var geometry = {
+            getBounds: function() {return {bottom: 0}}
+        }
+        
+        var r = create_renderer();
+        
+        var element = document.createElement("div");
+        r.root = element;
+        
+        r.nodeFactory = function(id, type) {
+            var element = document.createElement("div");
+            return element;
+        };
+        r.setStyle = function(node, style, options, geometry) {
+            return node;
+        };
+        
+        // point
+        var properDraw = false;
+        r.drawPoint = function(node, geometry) {
+            properDraw = true;
+            return {};
+        };
+        var point = OpenLayers.Util.applyDefaults({CLASS_NAME: 'OpenLayers.Geometry.Point'}, geometry);
+        style = true;
+        r.drawGeometry(point, style);
+        t.ok(properDraw, "drawGeometry called drawPoint when passed a point");
+
+        // line string
+        var properDraw = false;
+        r.drawLineString = function(g) {
+            properDraw = true;
+            return {};
+        };
+        var linestring = OpenLayers.Util.applyDefaults({id: "foo", CLASS_NAME: 'OpenLayers.Geometry.LineString'}, geometry);
+        style = true;
+        r.drawGeometry(linestring, style);
+        t.ok(properDraw, "drawGeometry called drawLineString when passed a line string");
+
+        // linear ring
+        var properDraw = false;
+        r.drawLinearRing = function(g) {
+            properDraw = true;
+            return {};
+        };
+        var linearring = OpenLayers.Util.applyDefaults({CLASS_NAME: 'OpenLayers.Geometry.LinearRing'}, geometry);
+        style = true;
+        r.drawGeometry(linearring, style);
+        t.ok(properDraw, "drawGeometry called drawLinearRing when passed a linear ring");
+
+        // polygon
+        var properDraw = false;
+        r.drawPolygon = function(g) {
+            properDraw = true;
+            return {};
+        };
+        var polygon = OpenLayers.Util.applyDefaults({CLASS_NAME: 'OpenLayers.Geometry.Polygon'}, geometry);
+        style = true;
+        r.drawGeometry(polygon, style);
+        t.ok(properDraw, "drawGeometry called drawPolygon when passed a polygon");
+
+        // surface
+        var properDraw = false;
+        r.drawSurface = function(g) {
+            properDraw = true;
+            return {};
+        }
+        var surface = OpenLayers.Util.applyDefaults({CLASS_NAME: 'OpenLayers.Geometry.Surface'}, geometry);
+        style = true;
+        r.drawGeometry(surface, style);
+        t.ok(properDraw, "drawGeometry called drawSurface when passed a surface");
+
+        // rectangle
+        var properDraw = false;
+        r.drawRectangle = function(g) {
+            properDraw = true;
+            return {};
+        };
+        var rectangle = OpenLayers.Util.applyDefaults({CLASS_NAME: 'OpenLayers.Geometry.Rectangle'}, geometry);
+        style = true;
+        r.drawGeometry(rectangle, style);
+        t.ok(properDraw, "drawGeometry called drawRectangle when passed a rectangle");
+
+        // multi-point
+        var properDraw = false;
+        r.drawPoint = function(g) {
+            properDraw = true;
+            return {};
+        };
+        var multipoint = OpenLayers.Util.applyDefaults({
+            CLASS_NAME: 'OpenLayers.Geometry.MultiPoint',
+            components: [point]
+        }, geometry);
+        style = true;
+        r.drawGeometry(multipoint, style);
+        t.ok(properDraw, "drawGeometry called drawPoint when passed a multi-point");
+
+        // multi-linestring
+        var properDraw = false;
+        r.drawLineString = function(g) {
+            properDraw = true;
+            return {};
+        };
+        var multilinestring = OpenLayers.Util.applyDefaults({
+            CLASS_NAME: 'OpenLayers.Geometry.MultiLineString',
+            components: [linestring]
+        }, geometry);
+        style = true;
+        r.drawGeometry(multilinestring, style);
+        t.ok(properDraw, "drawGeometry called drawLineString when passed a multi-linestring");
+
+        // multi-polygon
+        var properDraw = false;
+        r.drawPolygon = function(g) {
+            properDraw = true;
+            return {};
+        };
+        var multipolygon = OpenLayers.Util.applyDefaults({
+            CLASS_NAME: 'OpenLayers.Geometry.MultiPolygon',
+            components: [polygon]
+        }, geometry);
+        style = true;
+        r.drawGeometry(multipolygon, style);
+        t.ok(properDraw, "drawGeometry called drawPolygon when passed a multi-polygon");
+      
+        tearDown();
+    }
+    
+    function test_Elements_getfeatureidfromevent(t) {
+        t.plan(2);
+        
+        var node = {
+            _featureId: 'foo'
+        };
+        var event = {
+            target: node
+        };
+        
+        var id = OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent(event);
+        t.eq(id, 'foo', "returned id is correct when event with target is passed");
+        
+        var event = {
+            srcElement: node
+        };
+        
+        var id = OpenLayers.Renderer.Elements.prototype.getFeatureIdFromEvent(event);
+        t.eq(id, 'foo', "returned id is correct when event with srcElement is passed");
+    }
+    
+    function test_Elements_erasegeometry(t) {
+        t.plan(15);
+
+        var elements = {
+            'eraseGeometry': function(geometry) {
+                gErased.push(geometry);
+            }
+        };
+        
+        var geometry = {
+            'components': [{}, {}, {}]
+        };
+        
+      //multipoint
+        geometry.CLASS_NAME = "OpenLayers.Geometry.MultiPoint";
+        gErased = [];
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        t.ok( (gErased[0] == geometry.components[0]) &&
+              (gErased[1] == geometry.components[1]) &&
+              (gErased[2] == geometry.components[2]), "multipoint all components of geometry correctly erased.");
+
+      //multilinestring
+        geometry.CLASS_NAME = "OpenLayers.Geometry.MultiLineString";
+        gErased = [];
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        t.ok( (gErased[0] == geometry.components[0]) &&
+              (gErased[1] == geometry.components[1]) &&
+              (gErased[2] == geometry.components[2]), "multilinestring all components of geometry correctly erased.");
+      
+      //multipolygon
+        geometry.CLASS_NAME = "OpenLayers.Geometry.MultiPolygon";
+        gErased = [];
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        t.ok( (gErased[0] == geometry.components[0]) &&
+              (gErased[1] == geometry.components[1]) &&
+              (gErased[2] == geometry.components[2]), "multipolygon all components of geometry correctly erased.");
+      
+      //collection
+        geometry.CLASS_NAME = "OpenLayers.Geometry.Collection";
+        gErased = [];
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        t.ok( (gErased[0] == geometry.components[0]) &&
+              (gErased[1] == geometry.components[1]) &&
+              (gErased[2] == geometry.components[2]), "collection all components of geometry correctly erased.");
+        
+
+    // OTHERS
+    //
+        geometry.CLASS_NAME = {};
+
+        gElement = null;
+        gBackElement = null;
+
+        OpenLayers.Util._getElement = OpenLayers.Util.getElement;
+        OpenLayers.Util.getElement = function(id) {
+            var retVal = null;
+            if (id != null) {
+                var hasBack = (id.indexOf(elements.BACKGROUND_ID_SUFFIX) != -1);
+                retVal = hasBack ? gBackElement : gElement;
+            }
+            return retVal;
+        };
+
+      //element null
+        geometry.id = null;
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        // (no tests here, just make sure it doesn't bomb)      
+      
+      //element.parentNode null
+        elements.BACKGROUND_ID_SUFFIX = 'BLAHBLAHBLAH';
+        geometry.id = "foo";        
+        gElement = {};
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        // (no tests here, just make sure it doesn't bomb)      
+      
+      //valid element.parentNode, element.geometry
+        elements.indexer = {
+            'remove': function(elem) {
+                gIndexerRemoved = elem;
+            }
+        };
+
+        gElement = {
+            'geometry': {
+                'destroy': function() { 
+                    t.ok(true, "geometry destroyed");
+                }
+            },
+            'parentNode': {
+                'removeChild': function(elem) {
+                    gElemRemoved = elem;
+                }
+            },
+            '_style' : {backgroundGraphic: "foo"}
+        };
+        gBackElement = {
+            'parentNode': {
+                'removeChild': function(elem) {
+                    gBackRemoved = elem;
+                }
+            }
+        };
+
+        gElemRemoved = gBackRemoved =  gIndexerRemoved = null;
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        t.ok( (gElement.geometry == null), "all normal: element's 'geometry' property nullified");
+        t.ok( (gElemRemoved == gElement), "all normal: main element properly removed from parent node");
+        t.ok( (gBackRemoved == gBackElement), "all normal: back element properly removed from parent node");
+        t.ok( (gIndexerRemoved == gElement), "all normal: main element properly removed from the indexer");
+
+      //valid element.parentNode, no element.geometry, no bElem
+        gBackElement = null;
+        gElement.geometry = null;
+        gElemRemoved = gBackRemoved =  gIndexerRemoved = null;
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        t.ok( (gElemRemoved == gElement), "no bElem: main element properly removed from parent node");
+        t.ok( (gBackRemoved == null), "no bElem: back element not tried to remove from parent node when it doesn't exist");
+        t.ok( (gIndexerRemoved == gElement), "no bElem: main element properly removed from the indexer");
+
+      //valid element.parentNode, no element.geometry, valid bElem, no bElem.parentNode 
+        gBackElement = {};
+        gElemRemoved = gBackRemoved =  gIndexerRemoved = null;
+        OpenLayers.Renderer.Elements.prototype.eraseGeometry.apply(elements, [geometry]);
+        t.ok( (gElemRemoved == gElement), "no bElem.parentNode: main element properly removed from parent node");
+        t.ok( (gBackRemoved == null), "no bElem.parentNode: back element not tried to remove from parent node when it has no parent node");
+        t.ok( (gIndexerRemoved == gElement), "no bElem.parentNode: main element properly removed from the indexer");
+
+
+        OpenLayers.Util.getElement = OpenLayers.Util._getElement;
+    }
+    
+    function test_Elements_drawAndErase(t) {
+        t.plan(20);
+
+        setUp();
+
+        var r = create_renderer(null, {zIndexing: true});
+        var element = document.createElement("div");
+        r.vectorRoot = element;
+        document.body.appendChild(element);
+
+        r.createNode = function(type, id) {
+            var element = document.createElement("div");
+            element.id = id;
+            return element;
+        };
+        r.nodeTypeCompare = function() {return true};
+        r.setStyle = function(node, style, options, geometry) {
+            return node;
+        };
+        
+        var geometry = {
+            id: 'foo',
+            CLASS_NAME: 'bar',
+            getBounds: function() {return {bottom: 0}}
+        };
+        var style = {
+            graphicZIndex: 10
+        };
+        var featureId = 'foo';
+        r.drawGeometry(geometry, style, featureId);
+
+        function count(obj) {
+            var result = 0;
+            for (var i in obj) {
+                result++;
+            }
+            return result;
+        }
+
+        t.eq(element.childNodes.length, 1, "root is correctly filled");
+        t.eq(r.indexer.maxZIndex, 10, "indexer.maxZIndex is correctly filled");
+        t.eq(r.indexer.order.length, 1, "indexer.order is correctly filled");
+        t.eq(count(r.indexer.indices), 1, "indexer.indices is correctly filled");
+
+        r.eraseGeometry(geometry);
+
+        t.eq(element.childNodes.length, 0, "root is correctly cleared");
+        t.eq(r.indexer.maxZIndex, 0, "indexer.maxZIndex is correctly reset");
+        t.eq(r.indexer.order.length, 0, "indexer.order is correctly reset");
+        t.eq(count(r.indexer.indices), 0, "indexer.indices is correctly reset");
+
+        delete(style.graphicZIndex);
+        r.drawGeometry(geometry, style, featureId);
+
+        t.eq(element.childNodes.length, 1, "root is correctly filled");
+        t.eq(r.indexer.maxZIndex, 0, "indexer.maxZIndex is correctly filled");
+        t.eq(r.indexer.order.length, 1, "indexer.order is correctly filled");
+        t.eq(count(r.indexer.indices), 1, "indexer.indices is correctly filled");
+
+        r.clear();
+
+        t.eq(element.childNodes.length, 0, "root is correctly cleared");
+        t.eq(r.indexer.maxZIndex, 0, "indexer.maxZIndex is correctly reset");
+        t.eq(r.indexer.order.length, 0, "indexer.order is correctly reset");
+        t.eq(count(r.indexer.indices), 0, "indexer.indices is correctly reset");
+
+        style.graphicZIndex = 12;
+        r.drawGeometry(geometry, style, featureId);
+
+        t.eq(element.childNodes.length, 1, "root is correctly filled");
+        t.eq(r.indexer.maxZIndex, 12, "indexer.maxZIndex is correctly filled");
+        t.eq(r.indexer.order.length, 1, "indexer.order is correctly filled");
+        t.eq(count(r.indexer.indices), 1, "indexer.indices is correctly filled");
+
+        tearDown();
+    }
+
+    function test_Elements_moveRoot(t) {
+        t.plan(2);
+        setUp();
+        var r1 = create_renderer();
+        var r2 = create_renderer();
+        r1.moveRoot(r2);
+        t.xml_eq(r1.root.parentNode, r2.root.parentNode, "root moved successfully");
+        r1.moveRoot(r1);
+        t.xml_eq(r1.root.parentNode, r1.rendererRoot, "root moved back successfully");
+        tearDown();        
+    }
+
+
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Renderer/SVG.html b/tests/Renderer/SVG.html
new file mode 100644
index 0000000..141a3ff
--- /dev/null
+++ b/tests/Renderer/SVG.html
@@ -0,0 +1,489 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var geometry = null, node = null;
+    
+    function test_SVG_constructor(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(1);
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        t.ok(r instanceof OpenLayers.Renderer.SVG, "new OpenLayers.Renderer.SVG returns SVG object" );
+    }
+    
+    function test_SVG_destroy(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(1);
+        
+        var g_Destroy = false;
+        
+        OpenLayers.Renderer.Elements.prototype._destroy = 
+            OpenLayers.Renderer.Elements.prototype.destroy;
+            
+        OpenLayers.Renderer.prototype.destroy = function() {
+            g_Destroy = true;
+        }
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        r.destroy();
+        
+        t.eq(g_Destroy, true, "OpenLayers.Renderer.Elements.destroy() called");
+        
+        OpenLayers.Renderer.prototype.destroy = 
+            OpenLayers.Renderer.prototype._destroy;
+    }
+    
+    function test_SVG_setextent(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(5);
+        
+        OpenLayers.Renderer.Elements.prototype._setExtent =
+            OpenLayers.Renderer.Elements.prototype.setExtent;
+        
+        var g_SetExtent = false;
+        OpenLayers.Renderer.Elements.prototype.setExtent = function() {
+            g_SetExtent = true;
+        }
+                
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        r.setSize(new OpenLayers.Size(4,4));
+        r.map = {
+            getResolution: function() {
+                return 0.5;
+            }
+        }
+        
+        var extent = new OpenLayers.Bounds(1,2,3,4);
+        r.setExtent(extent);
+        
+        t.eq(g_SetExtent, true, "Elements.setExtent() called");
+        
+        t.eq(r.left, -2, "left is correct");
+        t.eq(r.top, 8, "top is correct");
+        
+        t.eq(r.rendererRoot.getAttributeNS(null, "viewBox"), "0 0 4 4", "rendererRoot viewBox is correct");
+        
+        // test extent changes
+        var extent = new OpenLayers.Bounds(4,3,2,1);
+        r.setExtent(extent);
+        t.eq(r.root.getAttributeNS(null, "transform").replace(/ /g, ""), "translate(-6,-6)", "rendererRoot viewBox is correct after a new setExtent");
+
+        OpenLayers.Renderer.Elements.prototype.setExtent =
+            OpenLayers.Renderer.Elements.prototype._setExtent;
+    }
+    
+    function test_SVG_setsize(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(2);
+                
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        
+        var size = new OpenLayers.Size(1,2);
+        r.setSize(size);
+        t.eq(r.rendererRoot.getAttributeNS(null, "width"), size.w.toString(), "width is correct");
+        t.eq(r.rendererRoot.getAttributeNS(null, "height"), size.h.toString(), "height is correct");
+    }
+    
+    function test_SVG_drawpoint(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+    
+        t.plan(1);
+
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        
+        var properDraw = false;
+        var g_Radius = null;
+        r.drawCircle = function(n, g, r) {
+            properDraw = true;
+            g_Radius = 1;
+        }
+        r.drawPoint();
+        
+        t.ok(properDraw && g_Radius == 1, "drawPoint called drawCircle with radius set to 1");
+    }
+    
+    function test_SVG_drawcircle(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(5);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        r.resolution = 0.5;
+        r.left = 0;
+        r.top = 0;
+        
+        var node = document.createElement('div');
+        
+        var geometry = {
+            x: 1,
+            y: 2
+        }
+        
+        r.drawCircle(node, geometry, 3);
+        
+        t.eq(node.getAttributeNS(null, 'cx'), '2', "cx is correct");
+        t.eq(node.getAttributeNS(null, 'cy'), '-4', "cy is correct");
+        t.eq(node.getAttributeNS(null, 'r'), '3', "r is correct");
+       
+        // #1274: out of bound node fails when first added
+        var geometry = {
+            x: 10000000,
+            y: 200000000,
+            CLASS_NAME: "OpenLayers.Geometry.Point",
+            id: "foo",
+            getBounds: function() {return {bottom: 0}}
+        }
+        node.id = geometry.id;
+        r.root.appendChild(node);
+
+        var drawCircleCalled = false;
+        r.drawCircle = function() {
+            drawCircleCalled = true;
+            return OpenLayers.Renderer.SVG.prototype.drawCircle.apply(r, arguments);
+        }
+        
+        r.drawGeometry(geometry, {pointRadius: 3}, "blah_4000");
+        t.eq(drawCircleCalled, true, "drawCircle called on drawGeometry for a point geometry.")
+        t.ok(node.parentNode != r.root, "circle will not be drawn when coordinates are outside the valid range");
+    }
+    
+    function test_SVG_drawlinestring(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(2);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        
+        var node = document.createElement('div');
+        
+        var geometry = {
+            components: "foo"
+        }
+        g_GetString = false;
+        g_Components = null;
+        r.getComponentsString = function(c) {
+            g_GetString = true;
+            g_Components = c;
+            return {path: "bar", complete: true};
+        }
+        
+        r.drawLineString(node, geometry);
+        
+        t.ok(g_GetString && g_Components == "foo", "getComponentString is called with valid arguments");
+        t.eq(node.getAttributeNS(null, "points"), "bar", "points attribute is correct");
+    }
+    
+    function test_SVG_drawlinearring(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(2);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        
+        var node = document.createElement('div');
+        
+        var geometry = {
+            components: "foo"
+        }
+        g_GetString = false;
+        g_Components = null;
+        r.getComponentsString = function(c) {
+            g_GetString = true;
+            g_Components = c;
+            return {path: "bar", complete: true};
+        }
+        
+        r.drawLinearRing(node, geometry);
+        
+        t.ok(g_GetString, "getComponentString is called with valid arguments");
+        t.eq(node.getAttributeNS(null, "points"), "bar", "points attribute is correct");
+    }
+
+    function test_SVG_drawpolygon(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(4);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        
+        var node = document.createElement('div');
+        
+        var linearRings = [{
+            components: ["foo"]
+        },{
+            components: ["bar"]
+        }]
+        
+        var geometry = {
+            components: linearRings
+        }
+        g_GetString = false;
+        r.getShortString = function(c) {
+            g_GetString = true;
+            return c;
+        }
+        
+        r.drawPolygon(node, geometry);
+        
+        t.ok(g_GetString, "getShortString is called");
+        t.eq(node.getAttributeNS(null, "d"), " M foo M bar z", "d attribute is correctly set");
+        t.eq(node.getAttributeNS(null, "fill-rule"), "evenodd", "fill-rule attribute is correctly set");
+        
+        r.getShortString = function(c) {
+            return false;
+        }
+        t.eq(r.drawPolygon(node, geometry), false, "drawPolygon returns false if one linearRing cannot be drawn");
+    }
+
+    function test_SVG_drawrectangle(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(4);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        r.resolution = 0.5;
+        r.left = 0;
+        r.top = 0;
+        
+        var node = document.createElement('div');
+        
+        var geometry = {
+            x: 1,
+            y: 2,
+            width: 3,
+            height: 4
+        }
+        
+        r.drawRectangle(node, geometry);
+        
+        t.eq(node.getAttributeNS(null, "x"), "2", "x attribute is correctly set");
+        t.eq(node.getAttributeNS(null, "y"), "-4", "y attribute is correctly set");
+        t.eq(node.getAttributeNS(null, "width"), "6", "width attribute is correctly set");
+        t.eq(node.getAttributeNS(null, "height"), "8", "height attribute is correctly set");
+    }
+    
+    function test_SVG_drawsurface(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(3);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        
+        var node = document.createElement('div');
+        
+        var geometry = {
+            components: ['foo', 'bar', 'dude']
+        }
+        g_GetString = false;
+        r.getShortString = function(c) {
+            g_GetString = true;
+            return c;
+        }
+        
+        r.drawSurface(node, geometry);
+        
+        t.ok(g_GetString, "getShortString is called");
+        
+        t.eq(node.getAttributeNS(null, "d"), "M foo C bar dude Z", "d attribute is correctly set");
+        
+        r.getShortString = function(c) {
+            return false;
+        }
+
+        t.eq(r.drawSurface(node, geometry), false, "drawSurface returns false if one linearRing cannot be drawn");
+    }
+    
+    function test_SVG_getcomponentsstring(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(1);
+        
+        var components = ['foo', 'bar'];
+        
+        OpenLayers.Renderer.SVG.prototype._getShortString = 
+            OpenLayers.Renderer.SVG.prototype.getShortString;
+            
+        OpenLayers.Renderer.SVG.prototype.getShortString = function(p) {
+            return p;
+        };
+        
+        var string = OpenLayers.Renderer.SVG.prototype.getComponentsString(components).path;
+        t.eq(string, "foo,bar", "returned string is correct");
+        
+        OpenLayers.Renderer.SVG.prototype.getShortString = 
+            OpenLayers.Renderer.SVG.prototype._getShortString;
+    }
+    
+    
+    
+    function test_SVG_getshortstring(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(1);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        r.resolution = 0.5;
+        r.left = 0;
+        r.top = 0;
+        
+        var point = {
+            x: 1,
+            y: 2
+        };
+        
+        var string = r.getShortString(point);
+        t.eq(string, "2,-4", "returned string is correct");
+    }
+    
+    function test_svg_getnodetype(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(1);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+
+        var g = {CLASS_NAME: "OpenLayers.Geometry.Point"}
+        var s = {graphicName: "square"};
+        
+        t.eq(r.getNodeType(g, s), r.supportUse ? "use" : "svg", "Correct node type for well known symbols");
+    }
+        
+    function test_svg_importsymbol(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(2);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+
+        r.importSymbol("square");
+
+        var polygon = document.getElementById(r.container.id + "_defs").firstChild.firstChild;
+        
+        var pass = false;
+        for (var i = 0; i < polygon.points.numberOfItems; i++) {
+            var p = polygon.points.getItem(i);
+            pass = p.x === OpenLayers.Renderer.symbol.square[2*i] && 
+                   p.y === OpenLayers.Renderer.symbol.square[2*i+1];
+            if (!pass) {
+                break;
+            }
+        }
+        t.ok(pass, "Square symbol rendered correctly");
+        t.ok(r.symbolMetrics["-square"], "Symbol metrics cached correctly.");
+    }
+        
+    function test_svg_dashstyle(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(5);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+
+        t.eq(r.dashStyle({strokeWidth: 1, strokeDashstyle: "dot"}, 1), "1,4", "dot dasharray created correctly");
+        t.eq(r.dashStyle({strokeWidth: 1, strokeDashstyle: "dash"}, 1), "4,4", "dash dasharray created correctly");
+        t.eq(r.dashStyle({strokeWidth: 1, strokeDashstyle: "longdash"}, 1), "8,4", "longdash dasharray created correctly");
+        t.eq(r.dashStyle({strokeWidth: 1, strokeDashstyle: "dashdot"}, 1), "4,4,1,4", "dashdot dasharray created correctly");
+        t.eq(r.dashStyle({strokeWidth: 1, strokeDashstyle: "longdashdot"}, 1), "8,4,1,4", "dashdot dasharray created correctly");
+    }
+    
+    function test_svg_clipline(t) {
+        if (!OpenLayers.Renderer.SVG.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(3);
+        
+        var r = new OpenLayers.Renderer.SVG(document.body);
+        r.setSize(new OpenLayers.Size(0, 0));
+        r.map = {
+            getResolution: function() {
+                return 0.5;
+            }
+        }
+        r.setExtent(new OpenLayers.Bounds(0, 0, 0, 0));
+
+        var node = document.createElement('div');
+
+        var geometry = new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(0, -5000),
+            new OpenLayers.Geometry.Point(10000, 0),
+            new OpenLayers.Geometry.Point(0, 5000)
+        ]);
+        r.drawLineString(node, geometry);
+        t.eq(node.getAttribute("points"), "0,10000,15000,2500,15000,-2500,0,-10000", "Line with 3 points correctly clipped at inValidRange bounds");
+        
+        geometry = new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(0, -5000),
+            new OpenLayers.Geometry.Point(10000, 0)
+        ]);
+        r.drawLineString(node, geometry);
+        t.eq(node.getAttribute("points"), "0,10000,15000,2500", "2-point line with 2nd point outside range correctly clipped at inValidRange bounds");
+
+        var geometry = new OpenLayers.Geometry.LineString([
+            new OpenLayers.Geometry.Point(10000, 0),
+            new OpenLayers.Geometry.Point(0, 5000)
+        ]);
+        r.drawLineString(node, geometry);
+        t.eq(node.getAttribute("points"), "15000,-2500,0,-10000", "2-point line with 1st point outside range correctly clipped at inValidRange bounds");
+    }
+
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Renderer/VML.html b/tests/Renderer/VML.html
new file mode 100644
index 0000000..96da8f9
--- /dev/null
+++ b/tests/Renderer/VML.html
@@ -0,0 +1,468 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var geometry = null, node = null;
+
+    function test_VML_constructor(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(1);
+        var r = new OpenLayers.Renderer.VML(document.body);
+        t.ok(r instanceof OpenLayers.Renderer.VML, "new OpenLayers.Renderer.VML returns VML object" );
+    }
+    
+    function test_VML_destroy(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(1);
+        
+        var g_Destroy = false;
+        
+        OpenLayers.Renderer.Elements.prototype._destroy = 
+            OpenLayers.Renderer.Elements.prototype.destroy;
+            
+        OpenLayers.Renderer.prototype.destroy = function() {
+            g_Destroy = true;
+        }
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        r.destroy();
+        
+        t.eq(g_Destroy, true, "OpenLayers.Renderer.Elements.destroy() called");
+        
+        OpenLayers.Renderer.prototype.destroy = 
+            OpenLayers.Renderer.prototype._destroy;
+    }
+    
+    function test_VML_setextent(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(4);
+        
+        OpenLayers.Renderer.Elements.prototype._setExtent =
+            OpenLayers.Renderer.Elements.prototype.setExtent;
+        
+        var g_SetExtent = false;
+        OpenLayers.Renderer.Elements.prototype.setExtent = function() {
+            g_SetExtent = true;
+        }
+                
+        var r = new OpenLayers.Renderer.VML(document.body);
+        r.setSize(new OpenLayers.Size(4,4));
+        r.map = {
+            getResolution: function() {
+                return 0.5;
+            }
+        }
+        
+        var extent = new OpenLayers.Bounds(1,2,3,4);
+        r.setExtent(extent);
+        
+        t.eq(g_SetExtent, true, "Elements.setExtent() called");
+        
+        t.ok(r.root.coordorigin == "0,0", "coordorigin is correct");
+        t.ok(r.root.coordsize == "4,4", "coordsize is correct");
+        t.eq(r.offset, {x:2, y:4}, "offset is correct");
+        
+        OpenLayers.Renderer.Elements.prototype.setExtent =
+            OpenLayers.Renderer.Elements.prototype._setExtent;
+    }
+
+    function test_VML_setsize(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(4);
+                
+        var r = new OpenLayers.Renderer.VML(document.body);
+        
+        var size = new OpenLayers.Size(1,2);
+        r.setSize(size);
+        t.eq(r.rendererRoot.style.width, "1px", "rendererRoot width is correct");
+        t.eq(r.rendererRoot.style.height, "2px", "rendererRoot height is correct");
+        
+        t.eq(r.root.style.width, "1px", "root width is correct");
+        t.eq(r.root.style.height, "2px", "root height is correct");
+    }
+    
+    function test_VML_drawText(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(2);
+
+        var r = new OpenLayers.Renderer.VML(document.body);
+        r.offset = {x: 0, y: 0};
+        
+        r.LABEL_ID_SUFFIX = "";
+        r.getResolution = function() {
+            return 1;
+        };
+
+        var style = {
+            label: "myText",
+            fontColor: "blue"
+        }
+        
+        r.drawText("feature1", style, new OpenLayers.Geometry.Point(1,1));
+        
+        var textbox = document.getElementById("feature1_textbox");
+        
+        t.eq(textbox.innerText, style.label, "label set correctly");
+        t.eq(textbox.style.color, style.fontColor, "font color of label set correctly");
+    }
+
+    function test_VML_drawpoint(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+    
+        t.plan(1);
+
+        var r = new OpenLayers.Renderer.VML(document.body);
+        
+        var properDraw = false;
+        var g_Radius = null;
+        r.drawCircle = function(n, g, r) {
+            properDraw = true;
+            g_Radius = 1;
+        }
+        r.drawPoint();
+        
+        t.ok(properDraw && g_Radius == 1, "drawPoint called drawCircle with radius set to 1");
+    }
+
+    function test_VML_drawcircle(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(4);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        r.offset = {x: 0, y: 0};
+        r.resolution = 0.5;
+        
+        var node = document.createElement('div');
+        
+        var geometry = {
+            x: 1,
+            y: 2
+        }
+        
+        var radius = 3;
+        r.drawCircle(node, geometry, radius);
+        
+        t.eq(node.style.left, '-1px', "left is correct");
+        t.eq(node.style.top, '1px', "top is correct");
+        t.eq(node.style.width, (2 * radius) + "px", "width is correct");
+        t.eq(node.style.height, (2 * radius) + "px", "height is correct");
+    }
+    
+    function test_VML_drawGraphic(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(6);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        r.offset = {x: 0, y: 0};
+        r.resolution = 1;
+        
+        var node = document.createElement('div');
+        node.id = "test"
+        node._geometryClass = "OpenLayers.Geometry.Point";
+        
+        var geometry = {
+            x: 1,
+            y: 2
+        }
+        
+        var style = {
+            externalGraphic: "foo.png",
+            graphicWidth: 7,
+            graphicHeight: 10
+        }
+        
+        r.drawGeometryNode(node, geometry, style);
+
+        t.eq(node.childNodes[0].id, "test_fill", "fill child node correctly created");
+        t.eq(node.style.left, "-2px", "x of insertion point with calculated xOffset correct");
+        t.eq(node.style.top, "-3px", "y of insertion point with calculated yOffset correct");
+        
+        style.rotation = 90;
+        
+        r.drawGeometryNode(node, geometry, style);
+        
+        t.eq(node.childNodes[1].id, "test_image", "image child node correctly created");
+        t.eq(node.style.left, "-3px", "x of insertion point of rotated image correct");
+        t.eq(node.style.top, "-4px", "y of insertion point of rotated image correct");
+    }
+
+    function test_VML_drawlinestring(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(1);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        
+        g_DrawLine = false;
+        r.drawLine = function(c) {
+            g_DrawLine = true;
+        }
+        
+        r.drawLineString(node, geometry);
+        
+        t.ok(g_DrawLine, "drawLine is called");
+    }
+    
+    function test_VML_drawlinearring(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(1);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        
+        g_DrawLine = false;
+        r.drawLine = function(c) {
+            g_DrawLine = true;
+        }
+        
+        r.drawLinearRing(node, geometry);
+        
+        t.ok(g_DrawLine, "drawLine is called");
+    }
+
+    function test_VML_drawline(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(8);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        r.offset = {x: 0, y: 0};
+        r.resolution = 0.5;
+        
+        var node = document.createElement('div');
+        
+        var geometry = {
+            components: [{
+                x: 1,
+                y: 2
+            },{
+                x: 3,
+                y: 4
+            }],
+            getBounds: function() {
+                return new OpenLayers.Bounds(5,6,7,8);
+            }
+        };
+        
+        r.drawLine(node, geometry, true);
+        t.ok(node.path.indexOf("x") != -1, "path attribute is correct when passed closeLine = true");
+        
+        
+        r.drawLine(node, geometry, false);
+        t.eq(node.path, "m 2,4 l  6,8 l  e", "path attribute is correct");
+        t.eq(node.style.left, "10px", "node.style.left is correct");
+        t.eq(node.style.top, "16px", "node.style.top is correct");
+        t.eq(node.style.width, "4px", "node.style.width is correct");
+        t.eq(node.style.height, "4px", "node.style.height is correct");
+        t.eq(node.coordorigin, "10 16", "node.coordorigin is correct");
+        t.eq(node.coordsize, "4 4", "node.coordsize is correct");
+    }
+    
+    function test_VML_drawpolygon(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(2);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        r.offset = {x: 0, y: 0};
+        r.resolution = 0.5;
+        
+        g_SetNodeDimension = false;
+        r.setNodeDimension = function(){
+            g_SetNodeDimension = true;
+        };
+        
+        var node = document.createElement('div');
+        
+        var linearRing = {
+            components: [{
+                x: 1,
+                y: 2
+            },{
+                x: 3,
+                y: 4
+            }]
+        };
+        var linearRing2 = {
+            components: [{
+                x: 5,
+                y: 6
+            },{
+                x: 7,
+                y: 8
+            }]
+        };
+        var geometry = {
+            components: [linearRing, linearRing2]
+        };
+        r.drawPolygon(node, geometry, true);
+        t.ok(g_SetNodeDimension, "setNodeDimension is called");
+        t.eq(node.path, "m 2,4 l 6,8 x m 10,12 l 14,16 x e", "path attribute is correct");
+    }
+    
+    function test_VML_drawrectangle(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(4);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        r.offset = {x: 0, y: 0};
+        r.resolution = 0.5;
+        
+        var node = document.createElement('div');
+        
+        var geometry = {
+            x: 1,
+            y: 2,
+            width: 3,
+            height: 4
+        }
+        
+        r.drawRectangle(node, geometry);
+        
+        t.eq(node.style.left, "2px", "node.style.left is correct");
+        t.eq(node.style.top, "4px", "node.style.top is correct");
+        t.eq(node.style.width, "6px", "node.style.width is correct");
+        t.eq(node.style.height, "8px", "node.style.height is correct");
+    }
+    
+    function test_vml_getnodetype(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(1);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+
+        var g = {CLASS_NAME: "OpenLayers.Geometry.Point"}
+        var s = {graphicName: "square"};
+        
+        t.eq(r.getNodeType(g, s), "olv:shape", "Correct node type for well known symbols");
+    }
+
+    function test_vml_importsymbol(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+
+        t.plan(4);
+        
+        OpenLayers.Renderer.symbol.rect1 = [0,0, 10,0, 10,4, 0,4, 0,0];
+        OpenLayers.Renderer.symbol.rect2 = [0,0, 4,0, 4,10, 0,10, 0,0];
+
+        var r = new OpenLayers.Renderer.VML(document.body);
+
+        var cache = r.importSymbol("square");
+
+        t.eq(cache.path, "m 0 0 l 0 1 1 1 1 0 0 0 x e", "Square symbol rendered correctly");
+        t.ok(r.symbolCache["-square"], "Symbol has been cached correctly.");
+        
+        cache = r.importSymbol("rect1");
+        t.eq(cache.bottom, -3, "coordorigin bottom of landscape symbol set to -3 to move topmost part to the bottom (we are flipping y!)");
+        
+        cache = r.importSymbol("rect2");
+        t.eq(cache.left, -3, "coordorigin left of portrait symbol set to -3 to move leftmost part to the right");
+        
+        delete OpenLayers.Renderer.symbol.rect1;
+        delete OpenLayers.Renderer.symbol.rect2;
+        
+    }
+    
+    function test_vml_dashstyle(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        
+        t.plan(5);
+        
+        var r = new OpenLayers.Renderer.VML(document.body);
+        
+        t.eq(r.dashStyle({strokeDashstyle: "1 4"}), "dot", "dot pattern recognized correctly.");
+        t.eq(r.dashStyle({strokeDashstyle: "4 4"}), "dash", "dash pattern recognized correctly.");
+        t.eq(r.dashStyle({strokeDashstyle: "8 4"}), "longdash", "longdash pattern recognized correctly.");
+        t.eq(r.dashStyle({strokeDashstyle: "4 4 1 4"}), "dashdot", "dashdot pattern recognized correctly.");
+        t.eq(r.dashStyle({strokeDashstyle: "8 4 1 4"}), "longdashdot", "longdashdot pattern recognized correctly.");
+    }
+    
+    function test_vml_moveRoot(t) {
+        if (!OpenLayers.Renderer.VML.prototype.supported()) {
+            t.plan(0);
+            return;
+        }
+        t.plan(2);
+        
+        var map = new OpenLayers.Map("map");
+        var l1 = new OpenLayers.Layer.Vector("vector");
+        map.addLayer(l1);
+        var l2 = new OpenLayers.Layer.Vector.RootContainer("rootcontainer", {layers: [l1]});
+        
+        var clear = l1.renderer.clear;
+        l1.renderer.clear = function() {
+            // this should be called twice, once when l2 is added to the map,
+            // and once when removed from the map.
+            t.ok(true, "Clearing original layer");
+        };
+        map.addLayer(l2);
+        map.removeLayer(l2);
+        l1.renderer.clear = clear;
+        
+        map.removeLayer(l1);
+    }
+        
+  </script>
+</head>
+<body>
+<div id="map" style="width:500px;height:550px"></div>
+</body>
+</html>
diff --git a/tests/Request.html b/tests/Request.html
new file mode 100644
index 0000000..6fac6ef
--- /dev/null
+++ b/tests/Request.html
@@ -0,0 +1,394 @@
+<html>
+<head>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    function setup() {
+        window._xhr = OpenLayers.Request.XMLHttpRequest;
+        var anon = new Function();
+        OpenLayers.Request.XMLHttpRequest = function() {};
+        OpenLayers.Request.XMLHttpRequest.prototype = {
+            open: anon,
+            setRequestHeader: anon,
+            send: anon
+        };
+        OpenLayers.Request.XMLHttpRequest.DONE = 4;
+    }
+    function teardown() {
+        OpenLayers.Request.XMLHttpRequest = window._xhr;
+    }
+    
+    function test_issue(t) {
+        setup();
+
+        t.plan(21);
+        var request, config;
+        var proto = OpenLayers.Request.XMLHttpRequest.prototype;
+        var issue = OpenLayers.Function.bind(OpenLayers.Request.issue,
+                                             OpenLayers.Request);
+
+        // test that issue returns a new XMLHttpRequest - 1 test
+        request = issue();
+        t.ok(request instanceof OpenLayers.Request.XMLHttpRequest,
+             "returns an XMLHttpRequest instance");
+        
+        // test that issue calls xhr.open with correct args from config - 5 tests
+        var _open = proto.open;
+        config = {
+            method: "foo",
+            url: "http://nowhere",
+            async: "bar",
+            user: "uncle",
+            password: "sam"
+        };
+        proto.open = function(method, url, async, user, password) {
+            t.eq(method, config.method, "open called with correct method");
+            t.eq(url, config.url, "open called with correct url");
+            t.eq(async, config.async, "open called with correct async");
+            t.eq(user, config.user, "open called with correct user");
+            t.eq(password, config.password, "open called with correct password");
+        };
+        request = issue(config);
+        
+        // test that params are serialized as query string - 1 test
+        config = {
+            method: "GET",
+            url: "http://example.com/",
+            params: {"foo": "bar"}
+        };
+        proto.open = function(method, url, async, user, password) {
+            t.eq(url, config.url + "?foo=bar", "params serialized as query string");
+        };
+        request = issue(config);
+        
+        // test that empty params object doesn't produce query string - 1 test
+        config = {
+            method: "GET",
+            url: "http://example.com/",
+            params: {}
+        };
+        proto.open = function(method, url, async, user, password) {
+            t.eq(url, config.url, "empty params doesn't produce query string");
+        }
+        request = issue(config);
+        
+        // test that query string doesn't get two ? separators
+        config = {
+            method: "GET",
+            url: "http://example.com/?existing=query",
+            params: {"foo": "bar"}
+        };
+        proto.open = function(method, url, async, user, password) {
+            t.eq(url, config.url + "&foo=bar", "existing query string gets extended with &");
+        }
+        request = issue(config);
+
+        // reset open method
+        proto.open = _open;
+        
+        // test that headers are correctly set - 4 tests
+        var _setRequestHeader = proto.setRequestHeader;
+        config = {
+            headers: {
+                foo: "bar",
+                chicken: "soup"
+            }
+        };
+        proto.setRequestHeader = function(key, value) {
+            t.ok(key in config.headers, "setRequestHeader called with key: " + key);
+            t.eq(value, config.headers[key], "setRequestHeader called with correct value: " + value);
+        }
+        request = issue(config);
+        proto.setRequestHeader = _setRequestHeader;
+        
+        // test that callback is called (no scope) - 1 test
+        var unbound = function(request) {
+            t.ok(request instanceof OpenLayers.Request.XMLHttpRequest,
+                 "unbound callback called with xhr instance");
+        }
+        config = {
+            callback: unbound
+        };
+        request = issue(config);
+        request.readyState = OpenLayers.Request.XMLHttpRequest.DONE;
+        request.onreadystatechange();
+
+        // test that callback is called (with scope) - 2 tests
+        var obj = {};
+        var bound = function(request) {
+            t.ok(this === obj, "bound callback has correct scope");
+            t.ok(request instanceof OpenLayers.Request.XMLHttpRequest,
+                 "bound callback called with xhr instance");
+        }
+        config = {
+            callback: bound,
+            scope: obj
+        };
+        request = issue(config);
+        request.readyState = 4;
+        request.onreadystatechange();
+        
+        // test that optional success callback is only called with 200s and
+        // failure is only called with non-200s
+        var _send = proto.send;
+        proto.send = function() {};
+        
+        config = {
+            success: function(req) {
+                t.ok(!req.status || (req.status >= 200 && req.status < 300),
+                     "success callback called with " + req.status + " status");
+            },
+            failure: function(req) {
+                t.ok(req.status && (req.status < 200 || req.status >= 300),
+                     "failure callback called with " + req.status + " status");
+            }
+        };
+        request = issue(config);
+        request.readyState = 4;
+        
+        // mock up status 200 (1 test)
+        request.status = 200;
+        request.onreadystatechange();
+        
+        // mock up status 299 (1 test)
+        request.status = 299;
+        request.onreadystatechange();
+        
+        // mock up status 100 (1 test)
+        request.status = 100;
+        request.onreadystatechange();
+
+        // mock up status 300 (1 test)
+        request.status = 300;
+        request.onreadystatechange();
+        
+        // mock up a status null (1 test)
+        request.status = null;
+        request.onreadystatechange();
+
+        proto.send = _send;
+
+        teardown();
+    }
+    
+    function test_delayed_send(t) {
+        t.plan(1);
+        var proto = OpenLayers.Request.XMLHttpRequest.prototype;
+        var _send = proto.send;
+        
+        // test that send is called with data - 1 test
+        var config = {
+            method: "PUT",
+            data: "bling"
+        };
+        var got = {};
+        proto.send = function(data) {
+            got.data = data;
+        }
+        OpenLayers.Request.issue(config);
+        
+        t.delay_call(1, function() {
+            t.eq(got.data, config.data, "proper data sent");
+            proto.send = _send;
+        });        
+        
+    }
+    
+    function test_GET(t) {
+        t.plan(1);
+        var _issue = OpenLayers.Request.issue;
+        OpenLayers.Request.issue = function(config) {
+            t.eq(config.method, "GET", "calls issue with correct method");
+        }
+        OpenLayers.Request.GET();
+        OpenLayers.Request.issue = _issue;
+    }
+    function test_POST(t) {
+        t.plan(1);
+        var _issue = OpenLayers.Request.issue;
+        OpenLayers.Request.issue = function(config) {
+            t.eq(config.method, "POST", "calls issue with correct method");
+        }
+        OpenLayers.Request.POST();
+        OpenLayers.Request.issue = _issue;
+    }
+    function test_PUT(t) {
+        t.plan(1);
+        var _issue = OpenLayers.Request.issue;
+        OpenLayers.Request.issue = function(config) {
+            t.eq(config.method, "PUT", "calls issue with correct method");
+        }
+        OpenLayers.Request.PUT();
+        OpenLayers.Request.issue = _issue;
+    }
+    function test_DELETE(t) {
+        t.plan(1);
+        var _issue = OpenLayers.Request.issue;
+        OpenLayers.Request.issue = function(config) {
+            t.eq(config.method, "DELETE", "calls issue with correct method");
+        }
+        OpenLayers.Request.DELETE();
+        OpenLayers.Request.issue = _issue;
+    }
+    function test_HEAD(t) {
+        t.plan(1);
+        var _issue = OpenLayers.Request.issue;
+        OpenLayers.Request.issue = function(config) {
+            t.eq(config.method, "HEAD", "calls issue with correct method");
+        }
+        OpenLayers.Request.HEAD();
+        OpenLayers.Request.issue = _issue;
+    }
+    function test_OPTIONS(t) {
+        t.plan(1);
+        var _issue = OpenLayers.Request.issue;
+        OpenLayers.Request.issue = function(config) {
+            t.eq(config.method, "OPTIONS", "calls issue with correct method");
+        }
+        OpenLayers.Request.OPTIONS();
+        OpenLayers.Request.issue = _issue;
+    }
+    
+    function test_events_success(t) {
+        
+        t.plan(5);
+
+        var events = [];
+        function listener(event) {
+            events.push(event);
+        }
+        
+        // set up event listeners
+        OpenLayers.Request.events.on({
+            complete: listener,
+            success: listener,
+            failure: listener
+        });
+
+        // issue a request that succeeds
+        OpenLayers.Request.GET({
+            url: ".", params: {bar: "baz"}, async: false
+        });
+        t.eq(events.length, 2, "two events logged");
+        t.eq(events[0].type, "complete", "first event is complete");
+        t.eq(events[1].type, "success", "second event is success");
+        t.ok(events[1].config, "success listener sent config");
+        t.eq(events[1].requestUrl, ".?bar=baz", "success listener sent config.url");
+
+        // remove event listeners
+        OpenLayers.Request.events.un({
+            complete: listener,
+            success: listener,
+            failure: listener
+        });
+        
+    }
+
+    function test_events_failure(t) {
+        
+        t.plan(5);
+
+        var events = [];
+        function listener(event) {
+            events.push(event);
+        }
+        
+        // set up event listeners
+        OpenLayers.Request.events.on({
+            complete: listener,
+            success: listener,
+            failure: listener
+        });
+
+        // issue a request that succeeds
+        OpenLayers.Request.GET({
+            url: "foo", params: {bar: "baz"}, async: false
+        });
+        t.eq(events.length, 2, "two events logged");
+        t.eq(events[0].type, "complete", "first event is complete");
+        t.eq(events[1].type, "failure", "second event is failure");
+        t.ok(events[1].config, "failure listener sent config");
+        t.eq(events[1].requestUrl, "foo?bar=baz", "failure listener sent requestUrl");
+
+        // remove event listeners
+        OpenLayers.Request.events.un({
+            complete: listener,
+            success: listener,
+            failure: listener
+        });
+        
+    }
+
+    function test_ProxyHost(t) {
+        t.plan(4);
+
+        /*
+         * Setup
+         */
+
+        setup();
+
+        var expectedURL;
+
+        var _ProxyHost = OpenLayers.ProxyHost;
+
+        var proto = OpenLayers.Request.XMLHttpRequest.prototype;
+        var _open = proto.open;
+        var log = [];
+        proto.open = function(method, url, async, user, password) {
+            log.push(url);
+        };
+
+        /*
+         * Test
+         */
+
+        // 2 tests
+        log = [];
+        OpenLayers.ProxyHost = "http://fooproxy/?url=";
+        expectedURL = "http://fooproxy/?url=http%3A%2F%2Fbar%3Fk1%3Dv1%26k2%3Dv2";        
+        OpenLayers.Request.GET({url: "http://bar?k1=v1&k2=v2"});
+        t.eq(log.length, 1, "[1] XHR.open called once");
+        t.eq(log[0], expectedURL, "[1] the URL used for XHR is correct (" + log[0] + ")");
+
+        // 2 tests
+        log = []
+        OpenLayers.ProxyHost = function(url) {
+            var p = OpenLayers.Util.getParameters(url);
+            var p = OpenLayers.Util.getParameterString(p);
+            return "http://barproxy/?" + p;
+        };
+        expectedURL = "http://barproxy/?k1=v1&k2=v2";
+        OpenLayers.Request.GET({url: "http://bar?k1=v1&k2=v2"});
+        t.eq(log.length, 1, "[2] XHR.open called once");
+        t.eq(log[0], expectedURL, "[2] the URL used for XHR is correct (" + log[0] + ")");
+
+        /*
+         * Teardown
+         */
+
+        OpenLayers.Request.XMLHttpRequest.prototype.open = _open;
+        OpenLayers.ProxyHost = _ProxyHost;
+        teardown();
+    }
+
+    function test_abort(t) {
+        t.plan(0);
+        var fail = false;
+        OpenLayers.Request.XMLHttpRequest.onsend = function(args) {
+            fail = true;
+        }
+        t.delay_call(0.5, function() {
+            if (fail === true) {
+                t.fail("Send should not be called because request is aborted");
+            }
+            OpenLayers.Request.XMLHttpRequest.onsend = null;
+        });
+        var protocol = new OpenLayers.Protocol.HTTP();
+        protocol.abort(protocol.read());
+    }
+
+    </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Request/XMLHttpRequest.html b/tests/Request/XMLHttpRequest.html
new file mode 100644
index 0000000..be7a7e8
--- /dev/null
+++ b/tests/Request/XMLHttpRequest.html
@@ -0,0 +1,14 @@
+<html>
+<head>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        function test_constructor(t) {
+            t.plan(1);
+            t.ok(new OpenLayers.Request.XMLHttpRequest(),
+                 "constructor didn't fail and we trust the code is well tested in OpenLayers.Request methods");
+        }
+    </script>
+</head>
+<body>
+</body>
+</html>
diff --git a/tests/Rule.html b/tests/Rule.html
new file mode 100644
index 0000000..00ef26b
--- /dev/null
+++ b/tests/Rule.html
@@ -0,0 +1,123 @@
+<html> 
+<head> 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_Rule_constructor(t) { 
+        t.plan(3); 
+         
+        var options = {'foo': 'bar'}; 
+        var rule = new OpenLayers.Rule(options); 
+        t.ok(rule instanceof OpenLayers.Rule, 
+             "new OpenLayers.Rule returns object" ); 
+        t.eq(rule.foo, "bar", "constructor sets options correctly"); 
+        t.eq(typeof rule.evaluate, "function", "rule has an evaluate function"); 
+    }
+    
+    function test_Rule_getContext(t) { 
+        t.plan(2);
+        var rule, options;
+        
+        var feature = {
+            attributes: {
+                'dude': 'hello'
+            },
+            'foobar': 'world'
+        }
+        
+        rule = new OpenLayers.Rule();
+        var context = rule.getContext(feature);
+        t.eq(context.dude, "hello", "value returned by getContext is correct"
+            + " if no context is specified"); 
+        
+        var options = {
+            context: function(feature){
+                return feature;
+            }
+        };
+        rule = new OpenLayers.Rule(options);
+        var context = rule.getContext(feature);
+        t.eq(context.foobar, "world", "value returned by getContext is correct"
+            + " if a context is given in constructor options"); 
+    }
+    
+    function test_clone(t) {
+        
+        t.plan(9);
+        
+        var rule = new OpenLayers.Rule({
+            name: "test rule",
+            minScaleDenominator: 10,
+            maxScaleDenominator: 20,
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                property: "prop",
+                value: "value"
+            }),
+            symbolizer: {
+                fillColor: "black"
+            },
+            context: {
+                foo: "bar"
+            }
+        });
+        var clone = rule.clone();
+        t.eq(clone.name, "test rule", "name copied");
+        t.eq(clone.minScaleDenominator, 10, "minScaleDenominator copied");
+        t.eq(clone.filter.type, OpenLayers.Filter.Comparison.EQUAL_TO, "clone has correct filter type");
+        
+        // modify original
+        rule.filter.property = "new";
+        rule.symbolizer.fillColor = "white";
+        rule.context.foo = "baz";
+        
+        // confirm that clone didn't change
+        t.eq(clone.filter.property, "prop", "clone has clone of filter");
+        t.eq(clone.symbolizer.fillColor, "black", "clone has clone of symbolizer");
+        t.eq(clone.context.foo, "bar", "clone has clone of context");
+        
+        // confirm that ids are different
+        t.ok(clone.id !== rule.id, "clone has different id");
+        
+        rule.destroy();
+        clone.destroy();
+
+        // test multiple symbolizers
+        rule = new OpenLayers.Rule({
+            name: "test rule",
+            minScaleDenominator: 10,
+            maxScaleDenominator: 20,
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                property: "prop",
+                value: "value"
+            }),
+            symbolizers: [
+                new OpenLayers.Symbolizer.Line({
+                    strokeColor: "black"
+                })
+            ]
+        });
+        clone = rule.clone();
+
+        t.eq(clone.symbolizers.length, 1, "clone has one symbolizer");
+        t.ok(clone.symbolizers[0] !== rule.symbolizers[0], "clone has different symbolizers than original");
+        
+        clone.destroy();
+        rule.destroy();
+        
+    }
+
+    function test_Rule_destroy(t) {
+        t.plan(1);
+        
+        var rule = new OpenLayers.Rule();
+        rule.destroy();
+        t.eq(rule.symbolizer, null, "symbolizer hash nulled properly");
+    }
+
+    </script> 
+</head> 
+<body> 
+</body> 
+</html> 
diff --git a/tests/Strategy.html b/tests/Strategy.html
new file mode 100644
index 0000000..99521f6
--- /dev/null
+++ b/tests/Strategy.html
@@ -0,0 +1,94 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(5);
+        var options = {};
+        var strategy = new OpenLayers.Strategy(options);
+
+        t.ok(strategy instanceof OpenLayers.Strategy,
+             "new OpenLayers.Strategy returns object" );
+        t.eq(strategy.options, options, "constructor sets this.options");
+        t.eq(strategy.active, false, "constructor sets this.active to false");
+        t.eq(strategy.autoActivate, true, "constructor does not modify this.autoActivate");
+        t.eq(strategy.autoDestroy, true, "constructor does not modify this.autoDestroy");
+    }
+
+    function test_activate(t) {
+        t.plan(1);
+        var options = {
+            activate: function() {
+                t.ok(true, "OpenLayer.Map.addLayer calls activate");
+            }
+        };
+        
+        var layer = new OpenLayers.Layer.Vector("Vector Layer", {
+            strategies: [new OpenLayers.Strategy(options)]
+        });
+
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+    }
+    
+    function test_destroy(t) {
+        t.plan(3);
+
+        var strategy = new OpenLayers.Strategy({
+            deactivate: function() {
+                t.ok(true, "destroy calls deactivate");
+            },
+            
+            options: {foo: 'bar'},
+            layer: 'foo'
+        });
+        strategy.destroy();
+
+        t.eq(strategy.layer, null, "destroy nullify protocol.layer");
+        t.eq(strategy.options, null, "destroy nullify protocol.options");
+    }
+
+    function test_activate(t) {
+        t.plan(4);
+        var strategy = new OpenLayers.Strategy({
+            layer: 'foo'
+        });
+
+        var ret;
+        ret = strategy.activate();
+
+        t.eq(strategy.active, true, "activate sets this.active to true on first call");
+        t.eq(ret, true, "activate returns true on first call");
+
+        ret = strategy.activate();
+
+        t.eq(strategy.active, true, "activate does not modify this.active on second call");
+        t.eq(ret, false, "activate returns false on second call");
+    }
+
+    function test_deactivate(t) {
+        t.plan(4);
+        var strategy = new OpenLayers.Strategy({
+            layer: 'foo'
+        });
+        strategy.activate();
+
+        var ret;
+        ret = strategy.deactivate();
+
+        t.eq(strategy.active, false, "deactivate sets this.active to false on first call");
+        t.eq(ret, true, "deactivate returns true on first call");
+
+        ret = strategy.deactivate();
+
+        t.eq(strategy.active, false, "deactivate does not modify this.active on second call");
+        t.eq(ret, false, "deactivate returns false on second call");
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map"/>
+</body>
+</html>
diff --git a/tests/Strategy/BBOX.html b/tests/Strategy/BBOX.html
new file mode 100644
index 0000000..f03dd65
--- /dev/null
+++ b/tests/Strategy/BBOX.html
@@ -0,0 +1,278 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_initialize(t) {
+        t.plan(1);
+
+        var ratio = 4;
+
+        var s = new OpenLayers.Strategy.BBOX({ratio: ratio});
+        t.eq(s.ratio, ratio, "ctor sets ratio");
+    }
+
+    function test_activate(t) {
+        t.plan(5);
+
+        var l = new OpenLayers.Layer.Vector();
+        var s = new OpenLayers.Strategy.BBOX();
+        s.setLayer(l);
+
+        t.eq(s.active, false, "not active after construction");
+
+        var activated = s.activate();
+        t.eq(activated, true, "activate returns true");
+        t.eq(s.active, true, "activated after activate");
+        t.ok(l.events.listeners["moveend"][0].obj == s &&
+             l.events.listeners["moveend"][0].func == s.update,
+             "activates registers moveend listener");
+        t.ok(l.events.listeners["refresh"][0].obj == s &&
+             l.events.listeners["refresh"][0].func == s.update,
+             "activates registers refresh listener");
+    }
+
+    function test_update(t) {
+        t.plan(5);
+
+        // Create a dummy layer that can act as the map base layer.
+        // This will be unnecessary if #1921 is addressed (allowing
+        // map to have different projection than base layer).
+        var dummy = new OpenLayers.Layer(null, {isBaseLayer: true});
+
+        var strategy = new OpenLayers.Strategy.BBOX({
+            ratio: 1 // makes for easier comparison to map bounds
+        });
+        var layer = new OpenLayers.Layer.Vector(null, {
+            isBaseLayer: true,
+            protocol: new OpenLayers.Protocol(),
+            strategies: [strategy]
+        });
+
+        // create a map with the layers and a center
+        var map = new OpenLayers.Map("map");
+        map.addLayers([dummy, layer]);
+        map.zoomToMaxExtent();
+        
+        /**
+         * The setCenter call above should set strategy bounds.  I *think* this
+         * issue is captured in http://trac.openlayers.org/ticket/1835.
+         * For now, I'm going to force an update on the strategy.  This line
+         * should be removed when the issue(s) described in #1835 are addressed.
+         */
+        strategy.update({force: true});
+        
+        // test that the strategy bounds were set
+        t.ok(map.getExtent().equals(strategy.bounds), "[set center] bounds set to map extent");
+        
+        // zoom and test that bounds are not reset
+        var old = strategy.bounds.clone();
+        map.zoomIn();
+        t.ok(strategy.bounds.equals(old), "[zoom in] bounds not reset");
+        
+        // force update and check that bounds change
+        strategy.update({force: true});
+        t.ok(!strategy.bounds.equals(old), "[force update] bounds changed");
+        t.ok(strategy.bounds.equals(map.getExtent()), "[force update] bounds set to map extent");
+        
+        // change the layer projection to confirm strategy uses same
+        layer.projection = new OpenLayers.Projection("EPSG:900913");
+        strategy.update({force: true});
+        var from = map.getProjectionObject();
+        var to = layer.projection;
+        t.ok(strategy.bounds.equals(map.getExtent().transform(from, to)), "[force update different proj] bounds transformed");
+        
+
+    }
+    
+    function test_events(t) {
+        
+        t.plan(2);
+        var log = {
+            loadstart: 0,
+            loadend: 0
+        };
+
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector(null, {
+            strategies: [new OpenLayers.Strategy.BBOX()],
+            protocol: new OpenLayers.Protocol({
+                read: function(config) {
+                    config.callback.call(config.scope, {});
+                }
+            }),
+            isBaseLayer: true,
+            eventListeners: {
+                loadstart: function() {
+                    ++log.loadstart;
+                },
+                loadend: function() {
+                    ++log.loadend;
+                }
+            }            
+        });
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        t.eq(log.loadstart, 1, "loadstart triggered");
+        t.eq(log.loadend, 1, "loadend triggered");
+        
+        map.destroy();
+        
+    }
+
+    function test_triggerRead(t) {
+        t.plan(4);
+
+        var s = new OpenLayers.Strategy.BBOX();
+
+        var filter = {"fake": "filter"};
+
+        s.createFilter = function() {
+            return filter;
+        };
+        s.response = {"fake": "response"};
+        
+        var log = {};
+
+        var protocol = new OpenLayers.Protocol({
+            read: function(options) {
+                log.options = options;
+            },
+            abort: function(response) {
+                log.abort = response.fake;
+            }
+        });
+        
+        var layer = new OpenLayers.Layer.Vector(null, {
+            strategies: [s],
+            protocol: protocol,
+            isBaseLayer: true
+        });
+        var map = new OpenLayers.Map("map");
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        t.ok(log.options.filter == filter,
+                "protocol read called with correct filter");
+        t.ok(log.options.callback == s.merge,
+                "protocol read called with correct callback");
+        t.ok(log.options.scope == s,
+                "protocol read called with correct scope");
+        t.eq(log.abort, "response",
+                "protocol abort called with correct response");
+
+        map.destroy();
+
+    }
+    
+    function test_resFactor(t) {
+        t.plan(2);
+        
+        var map = new OpenLayers.Map("map");
+        var bbox = new OpenLayers.Strategy.BBOX();
+        var fakeProtocol = new OpenLayers.Protocol({
+            'read': function() { 
+                t.ok(true, "read called once without resfactor"); 
+            }
+        });
+        var layer = new OpenLayers.Layer.Vector("test", {
+            strategies: [bbox],
+            protocol: fakeProtocol,
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+        map.zoomIn();
+        
+        fakeProtocol.read = function() { 
+            t.ok("read called again on zooming with resFactor: 1");
+        }
+        bbox.resFactor = 1;
+        map.zoomIn();
+        
+    }
+
+    function test_createFilter(t) {
+        t.plan(3);
+
+        var s = new OpenLayers.Strategy.BBOX();
+
+        var f;
+
+        // 2 test
+        s.setLayer({});
+        f = s.createFilter();
+        t.ok(f.CLASS_NAME.search(/^OpenLayers.Filter.Spatial/) != -1,
+             "createFilter returns a spatial filter object");
+        t.eq(f.type, OpenLayers.Filter.Spatial.BBOX,
+             "createFilter returns a BBOX-typed filter");
+
+        // 1 test
+        s.setLayer({filter: {fake: "filter"}});
+        f = s.createFilter();
+        t.ok(f.CLASS_NAME.search(/^OpenLayers.Filter.Logical/) != -1,
+             "createFilter returns a logical filter object");
+    }
+
+    function test_merge(t) {
+        t.plan(4);
+        
+        var strategy = new OpenLayers.Strategy.BBOX();
+                
+        // create map with default projection
+        var map = new OpenLayers.Map("map");
+        
+        // create layer with custom projection
+        var layer = new OpenLayers.Layer.Vector(null, {
+            isBaseLayer: true,
+            strategies: [strategy],
+            protocol: new OpenLayers.Protocol(),
+            projection: new OpenLayers.Projection("EPSG:900913")
+        });
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        // create some features
+        var geometries = [
+            new OpenLayers.Geometry.Point(100, 200),
+            new OpenLayers.Geometry.Point(1000, 2000)
+        ];
+        var features = [
+            new OpenLayers.Feature.Vector(geometries[0].clone()),
+            new OpenLayers.Feature.Vector(geometries[1].clone())
+        ];
+
+        // call merge with a mocked up response
+        strategy.merge({features: features});
+        
+        // test that feature geometries have been transformed to map projection
+        var from = layer.projection;
+        var to = map.getProjectionObject();
+        t.geom_eq(layer.features[0].geometry, features[0].geometry.transform(from, to), "[different proj] feature 0 geometry transformed");
+        t.geom_eq(layer.features[1].geometry, features[1].geometry.transform(from, to), "[different proj] feature 1 geometry transformed");
+        
+        // same as above but with same map/layer projection
+        layer.destroyFeatures();
+        layer.projection = map.getProjectionObject();
+        
+        features = [
+            new OpenLayers.Feature.Vector(geometries[0].clone()),
+            new OpenLayers.Feature.Vector(geometries[1].clone())
+        ];
+        
+        // call merge again with mocked up response
+        strategy.merge({features: features});
+
+        // test that feature geometries have not been transformed
+        t.geom_eq(layer.features[0].geometry, features[0].geometry, "[same proj] feature 0 geometry not transformed");
+        t.geom_eq(layer.features[1].geometry, features[1].geometry, "[same proj] feature 1 geometry not transformed");
+        
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 200px" />
+</body>
+</html>
diff --git a/tests/Strategy/Cluster.html b/tests/Strategy/Cluster.html
new file mode 100644
index 0000000..18e5a6f
--- /dev/null
+++ b/tests/Strategy/Cluster.html
@@ -0,0 +1,130 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_activate(t) {
+        t.plan(2);
+
+        var strategy = new OpenLayers.Strategy.Cluster();
+        t.eq(strategy.active, false, "not active after construction");
+
+        var layer = new OpenLayers.Layer.Vector("Vector Layer", {
+            strategies: [strategy]
+        });
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        
+        t.eq(strategy.active, true, "active after adding to map");
+    }
+
+    function test_clusters(t) {
+        t.plan(17);
+
+        function featuresEq(got, exp) {
+            var eq = false;
+            if(got instanceof Array && exp instanceof Array) {
+                if(got.length === exp.length) {
+                    for(var i=0; i<got.length; ++i) {
+                        if(got[i] !== exp[i]) {
+                            console.log(got[i], exp[i]);
+                            break;
+                        }
+                    }
+                    eq = (i == got.length);
+                }
+            }
+            return eq;
+        }
+
+        var strategy = new OpenLayers.Strategy.Cluster();
+        var layer = new OpenLayers.Layer.Vector("Vector Layer", {
+            strategies: [strategy],
+            isBaseLayer: true
+        });
+        var map = new OpenLayers.Map('map', {
+            resolutions: [4, 2, 1],
+            maxExtent: new OpenLayers.Bounds(-40, -40, 40, 40)
+        });
+        map.addLayer(layer);
+        
+        // create features in a line, 1 unit apart
+        var features = new Array(80);
+        for(var i=0; i<80; ++i) {
+            features[i] = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(-40 + i, 0)
+            );
+        }
+        
+        // add one additional feature, with no geometry - just to confirm it doesn't break things
+        features.push(new OpenLayers.Feature.Vector());
+        
+        layer.addFeatures(features);
+        map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+        
+        // resolution 4
+        // threshold: 4 * 20 = 80 units
+        // one cluster
+        t.eq(layer.features.length, 1, "[4] layer has one cluster");
+        t.ok(featuresEq(layer.features[0].cluster, features.slice(0, 80)), "[4] cluster includes all features with geometries");
+        
+        // resolution 2
+        // threshold: 2 * 20 = 40 units
+        // two clusters (41 and 39) - first cluster includes all features within 40 units of the first (0-40 or 41 features)
+        map.zoomIn();
+        t.eq(layer.features.length, 2, "[2] layer has two clusters");
+        t.ok(featuresEq(layer.features[0].cluster, features.slice(0, 41)), "[2] first cluster includes first 41 features");
+        t.ok(featuresEq(layer.features[1].cluster, features.slice(41, 80)), "[2] second cluster includes last 39 features");
+        
+        // resolution 1
+        // threshold: 1 * 20 = 20 units
+        // four clusters (21, 21, 21, and 17)
+        map.zoomIn();
+        t.eq(layer.features.length, 4, "[1] layer has four clusters");
+        t.ok(featuresEq(layer.features[0].cluster, features.slice(0, 21)), "[1] first cluster includes first 21 features");
+        t.ok(featuresEq(layer.features[1].cluster, features.slice(21, 42)), "[1] second cluster includes second 21 features");
+        t.ok(featuresEq(layer.features[2].cluster, features.slice(42, 63)), "[1] third cluster includes third 21 features");
+        t.ok(featuresEq(layer.features[3].cluster, features.slice(63, 80)), "[1] fourth cluster includes last 17 features");
+        
+        // zoom out and back in to test threshold property (21)
+        map.zoomOut();
+        strategy.threshold = 21;
+        map.zoomIn();
+        t.eq(layer.features.length, 20, "[1-threshold 21] layer has 20 clusters");
+        t.ok(featuresEq(layer.features[0].cluster, features.slice(0, 21)), "[1-threshold 21] first cluster includes first 21 features");
+        t.ok(featuresEq(layer.features[1].cluster, features.slice(21, 42)), "[1-threshold 21] second cluster includes second 21 features");
+        t.ok(featuresEq(layer.features[2].cluster, features.slice(42, 63)), "[1-threshold 21] third cluster includes third 21 features");
+        t.ok(featuresEq(layer.features.slice(3, 20), features.slice(63, 80)), "[1-threshold 21] last 17 features are not clustered");
+        
+        // zoom out and back in to test high threshold
+        map.zoomOut();
+        strategy.threshold = 100; // clusters must contain 100 features or more
+        map.zoomIn();
+        // the one feature with no geometry is not added to the layer
+        t.eq(layer.features.length, features.length-1, "[1-threshold 100] layer has " + (features.length-1) + " clusters");
+        t.ok(featuresEq(layer.features, features.slice(0, 80)), "[1-threshold 100] layer has all features with geometry");
+        
+    }
+
+    function test_deactivate(t) {
+        t.plan(2);
+
+        var strategy = new OpenLayers.Strategy.Cluster();
+        var layer = new OpenLayers.Layer.Vector("Vector Layer", {
+            strategies: [strategy]
+        });
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        
+        t.eq(strategy.active, true, "active after adding to map");
+        
+        map.removeLayer(layer);
+        t.eq(strategy.active, false, "not active after removing from map");
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 200px" />
+</body>
+</html>
diff --git a/tests/Strategy/Filter.html b/tests/Strategy/Filter.html
new file mode 100644
index 0000000..46a93ec
--- /dev/null
+++ b/tests/Strategy/Filter.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+<script>
+
+var features = [];
+for (var i=0; i<20; ++i) {
+    features.push(
+        new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(0, 0), {index: i}
+        )
+    );
+}
+
+var filter = new OpenLayers.Filter.Comparison({
+    type: OpenLayers.Filter.Comparison.LESS_THAN,
+    property: "index",
+    value: 10
+});
+
+function test_initialize(t) {
+    
+    t.plan(3);
+    
+    var strategy = new OpenLayers.Strategy.Filter({filter: filter});
+
+    t.ok(strategy instanceof OpenLayers.Strategy, "is strategy");
+    t.ok(strategy instanceof OpenLayers.Strategy.Filter, "is filter strategy");
+    
+    t.ok(strategy.filter === filter, "has filter");
+    
+    strategy.destroy();
+
+}
+
+function test_autoActivate(t) {
+
+    t.plan(2);
+
+    var strategy = new OpenLayers.Strategy.Filter({filter: filter});
+    
+    var layer = new OpenLayers.Layer.Vector(null, {
+        strategies: [strategy]
+    });
+    
+    t.ok(!strategy.active, "strategy not active before adding to map");
+
+    var map = new OpenLayers.Map({
+        div: "map",
+        allOverlays: true,
+        layers: [layer],
+        center: new OpenLayers.LonLat(0, 0),
+        zoom: 1
+    });
+
+    t.ok(strategy.active, "strategy active after adding to map");
+    
+    map.destroy();
+    
+}
+
+function test_setFilter(t) {
+    
+    t.plan(7);
+
+    var strategy = new OpenLayers.Strategy.Filter({filter: filter});
+    var layer = new OpenLayers.Layer.Vector(null, {
+        strategies: [strategy]
+    });
+
+    var map = new OpenLayers.Map({
+        div: "map",
+        allOverlays: true,
+        layers: [layer],
+        center: new OpenLayers.LonLat(0, 0),
+        zoom: 1
+    });
+
+    // add all features
+    layer.addFeatures(features);
+    t.eq(features.length, 20, "collection of 20 features")
+    t.eq(layer.features.length, 10, "layer got 10 with filter 'index < 10'");
+    t.eq(strategy.cache.length, 10, "strategy cached 10 with filter 'index < 10'");
+
+    // update filter
+    filter.value = 5;
+    strategy.setFilter(filter);
+    t.eq(layer.features.length, 5, "layer got 5 with filter 'index < 5'");
+    t.eq(strategy.cache.length, 15, "strategy cached 15 with filter 'index < 5'");
+
+    // update filter
+    filter.value = 15;
+    strategy.setFilter(filter);
+    t.eq(layer.features.length, 15, "layer got 15 with filter 'index < 15'");
+    t.eq(strategy.cache.length, 5, "strategy cached 5 with filter 'index < 15'");
+    
+    map.destroy();
+    
+}
+
+
+
+</script></head>
+<body>
+    <div id="map" style="width: 512px; height: 256px" />
+</body>
+</html>
\ No newline at end of file
diff --git a/tests/Strategy/Fixed.html b/tests/Strategy/Fixed.html
new file mode 100644
index 0000000..120786f
--- /dev/null
+++ b/tests/Strategy/Fixed.html
@@ -0,0 +1,193 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_activate(t) {
+        t.plan(5);
+
+        var featureList = ['foo', 'bar'];
+        // a fake protocol
+        var protocol = {
+            read: function(options) {
+                options.callback.call(options.scope, {features: featureList});
+            }
+        };
+        
+        // Create a dummy layer that can act as the map base layer.
+        // This will be unnecessary if #1920 is addressed or if base layer
+        // handling is changed.
+        var dummy = new OpenLayers.Layer(null, {isBaseLayer: true});
+
+        var layer = new OpenLayers.Layer.Vector("Vector Layer", {
+            strategies: [new OpenLayers.Strategy.Fixed()],
+            protocol: protocol,
+            addFeatures: function(features) {
+                t.eq(features, featureList, "Features added to the layer");
+            }
+        });
+        
+        var layerp = new OpenLayers.Layer.Vector("Hidden preload Layer", {
+            strategies: [new OpenLayers.Strategy.Fixed({preload:true})],
+            protocol: protocol,
+            visibility: false,
+            addFeatures: function(features) {
+                t.ok(!this.visibility, "Features preloaded before visible");
+            }
+        });
+
+        var s = new OpenLayers.Strategy.Fixed();
+        var layer2 = new OpenLayers.Layer.Vector("Hidden lazyload Layer", {
+            strategies: [s],
+            protocol: protocol,
+            visibility: false,
+            addFeatures: function(features) {
+                t.ok(this.visibility, "Layer visible when features added");
+            }
+        });
+
+        var map = new OpenLayers.Map('map');
+        map.addLayers([dummy, layer, layerp, layer2]);
+
+        t.ok(layer2.events.listeners["visibilitychanged"][0].obj == s &&
+                layer2.events.listeners["visibilitychanged"][0].func == s.load,
+                "activate registers visibilitychanged listener if layer hidden"+
+                " and is lazyloading");
+
+        layer2.setVisibility(true);
+        
+        t.ok(layer2.events.listeners["visibilitychanged"] == false,
+                "visibilitychanged listener unregistered");
+    }
+    
+    function test_events(t) {
+        
+        t.plan(3);
+        
+        var log = {
+            loadstart: 0,
+            loadend: 0
+        };
+        
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector(null, {
+            strategies: [new OpenLayers.Strategy.Fixed()],
+            protocol: new OpenLayers.Protocol({
+                read: function(config) {
+                    config.callback.call(config.scope, {});
+                }
+            }),
+            isBaseLayer: true,
+            eventListeners: {
+                loadstart: function() {
+                    ++log.loadstart;
+                },
+                loadend: function() {
+                    ++log.loadend;
+                }
+            }
+        });
+
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        t.eq(log.loadstart, 1, "loadstart triggered");
+        t.eq(log.loadend, 1, "loadend triggered");
+        var log = {};
+        layer.protocol.read = function(obj) {
+            log.obj = obj;
+        }
+        layer.refresh({whee: 'chicken'});
+
+        t.eq(log.obj && log.obj.whee, "chicken", "properties passed to read on refresh correctly.");
+        
+        map.destroy();
+        
+    }
+    
+    
+    function test_merge(t) {
+        
+        t.plan(6);
+        
+        var strategy = new OpenLayers.Strategy.Fixed();
+        
+        // create map with default projection
+        var map = new OpenLayers.Map("map");
+        
+        var log = {
+            loadend: 0
+        };
+        
+        // create layer with custom projection
+        var layer = new OpenLayers.Layer.Vector(null, {
+            isBaseLayer: true,
+            strategies: [strategy],
+            protocol: new OpenLayers.Protocol(),
+            projection: new OpenLayers.Projection("EPSG:900913"),
+            eventListeners: {
+                loadend: function() {
+                    ++log.loadend;
+                }
+            }
+        });
+        
+        // give the layer some existing features (one)
+        layer.addFeatures([
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(0, 0)
+            )
+        ]);
+        
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        // create some features
+        var geometries = [
+            new OpenLayers.Geometry.Point(100, 200),
+            new OpenLayers.Geometry.Point(1000, 2000)
+        ];
+        var features = [
+            new OpenLayers.Feature.Vector(geometries[0].clone()),
+            new OpenLayers.Feature.Vector(geometries[1].clone())
+        ];
+
+        // call merge with a mocked up response
+        strategy.merge({features: features});
+        
+        // confirm that the original features were destroyed
+        t.eq(layer.features.length, 2, "old features destroyed");
+        
+        // confirm that loadend was called
+        t.eq(log.loadend, 1, "merge triggers loadend");
+        
+        // test that feature geometries have been transformed to map projection
+        var from = layer.projection;
+        var to = map.getProjectionObject();
+        t.geom_eq(layer.features[0].geometry, features[0].geometry.transform(from, to), "[different proj] feature 0 geometry transformed");
+        t.geom_eq(layer.features[1].geometry, features[1].geometry.transform(from, to), "[different proj] feature 1 geometry transformed");
+        
+        // same as above but with same map/layer projection
+        layer.destroyFeatures();
+        layer.projection = map.getProjectionObject();
+        
+        features = [
+            new OpenLayers.Feature.Vector(geometries[0].clone()),
+            new OpenLayers.Feature.Vector(geometries[1].clone())
+        ];
+        
+        // call merge again with mocked up response
+        strategy.merge({features: features});
+
+        // test that feature geometries have not been transformed
+        t.geom_eq(layer.features[0].geometry, features[0].geometry, "[same proj] feature 0 geometry not transformed");
+        t.geom_eq(layer.features[1].geometry, features[1].geometry, "[same proj] feature 1 geometry not transformed");
+        
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 200px" />
+</body>
+</html>
diff --git a/tests/Strategy/Paging.html b/tests/Strategy/Paging.html
new file mode 100644
index 0000000..221cd5c
--- /dev/null
+++ b/tests/Strategy/Paging.html
@@ -0,0 +1,113 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    function test_activate(t) {
+        t.plan(2);
+
+        var strategy = new OpenLayers.Strategy.Paging();
+        t.eq(strategy.active, false, "not active after construction");
+
+        var layer = new OpenLayers.Layer.Vector("Vector Layer", {
+            strategies: [strategy]
+        });
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        
+        t.eq(strategy.active, true, "active after adding to map");
+    }
+    
+    function test_paging(t) {
+        t.plan(18);
+
+        var strategy = new OpenLayers.Strategy.Paging();
+        var layer = new OpenLayers.Layer.Vector("Vector Layer", {
+            strategies: [strategy],
+            drawFeature: function() {}
+        });
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        
+        var features = new Array(25);
+        for(var i=0; i<features.length; ++i) {
+            features[i] = {destroy: function() {}};
+        }
+        
+        function featuresEq(got, exp) {
+            var eq = false;
+            if(got instanceof Array && exp instanceof Array) {
+                if(got.length === exp.length) {
+                    for(var i=0; i<got.length; ++i) {
+                        if(got[i] !== exp[i]) {
+                            console.log(got[i], exp[i]);
+                            break;
+                        }
+                    }
+                    eq = (i == got.length);
+                }
+            }
+            return eq;
+        }
+        
+        var len = strategy.pageLength();
+        t.eq(len, 10, "page length defaults to 10");
+        
+        // add 25 features to the layer
+        layer.addFeatures(features);
+        t.eq(strategy.features.length, features.length, "strategy caches all features");
+        t.eq(layer.features.length, len, "layer gets one page of features");
+        t.ok(featuresEq(layer.features, features.slice(0, len)), "layer gets first page initially");
+        t.eq(strategy.pageNum(), 0, "strategy reports 0 based page number");
+        t.eq(strategy.pageCount(), Math.ceil(features.length / len), "strategy reports correct number of pages");
+        
+        // load next page of features
+        var changed = strategy.pageNext();
+        t.eq(changed, true, "(1) strategy reports change");
+        t.eq(strategy.pageNum(), 1, "second page");
+        t.ok(featuresEq(layer.features, features.slice(len, 2*len)), "layer has second page of features");
+        
+        // load next page of features (half page)
+        changed = strategy.pageNext();
+        t.eq(changed, true, "(2) strategy reports change");
+        t.eq(strategy.pageNum(), 2, "third page");
+        
+        // try to change forward again
+        changed = strategy.pageNext();
+        t.eq(changed, false, "strategy reports no change");
+        t.eq(layer.features.length, features.length % len, "layer has partial page");
+        t.ok(featuresEq(layer.features, features.slice(2*len, 3*len)), "layer has third page of features");
+        t.eq(strategy.pageNum(), 2, "still on third page");
+        
+        // change back a page
+        changed = strategy.pagePrevious();
+        t.eq(changed, true, "(3) strategy reports change");
+        t.eq(strategy.pageNum(), 1, "back on second page");
+        t.ok(featuresEq(layer.features, features.slice(len, 2*len)), "layer has second page of features again");
+        
+        layer.destroy();
+        
+    }
+
+    function test_deactivate(t) {
+        t.plan(2);
+
+        var strategy = new OpenLayers.Strategy.Paging();
+        var layer = new OpenLayers.Layer.Vector("Vector Layer", {
+            strategies: [strategy]
+        });
+        var map = new OpenLayers.Map('map');
+        map.addLayer(layer);
+        
+        t.eq(strategy.active, true, "active after adding to map");
+        
+        map.removeLayer(layer);
+        t.eq(strategy.active, false, "not active after removing from map");
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 200px" />
+</body>
+</html>
diff --git a/tests/Strategy/Refresh.html b/tests/Strategy/Refresh.html
new file mode 100644
index 0000000..d04b55a
--- /dev/null
+++ b/tests/Strategy/Refresh.html
@@ -0,0 +1,162 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+
+    var interval = 5000;
+    
+    function test_initialize(t) {
+        t.plan(2);
+
+        var s = new OpenLayers.Strategy.Refresh({interval: interval});
+        t.ok(typeof s.interval === "number", "interval must be a number");
+        t.eq(s.interval, interval, "ctor sets interval");
+    }
+
+    function test_activate(t) {
+        t.plan(4);
+
+        var l = new OpenLayers.Layer.Vector();
+        l.setVisibility(false);
+        var s = new OpenLayers.Strategy.Refresh();
+        s.setLayer(l);
+
+        t.eq(s.active, false, "not active after construction");
+
+        var activated = s.activate();
+        t.eq(activated, true, "activate returns true");
+        t.eq(s.active, true, "activated after activate");
+        t.ok(l.events.listeners.visibilitychanged[0].obj == s &&
+            l.events.listeners.visibilitychanged[0].func == s.reset,
+            "activates registers visibilitychanged listener");
+    }
+
+    function test_activateWithVisibleLayer(t) {
+        t.plan(5);
+
+        var l = new OpenLayers.Layer.Vector();
+        l.setVisibility(true);
+        var s = new OpenLayers.Strategy.Refresh({interval: interval});
+        s.setLayer(l);
+
+        t.eq(s.active, false, "not active after construction");
+
+        var activated = s.activate();
+        t.eq(activated, true, "activate returns true");
+        t.eq(s.active, true, "activated after activate");
+        t.ok(l.events.listeners.visibilitychanged[0].obj == s &&
+            l.events.listeners.visibilitychanged[0].func == s.reset,
+            "activates registers visibilitychanged listener");
+        t.ok(s.timer !== null, "timer should be set on activate if layer is visible");
+
+        // reset the timer!!
+        s.stop();
+    }
+
+    function test_events(t) {
+        
+        t.plan(1);
+        var log = {
+            visibilitychanged: 0
+        };
+
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector(null, {
+            strategies: [new OpenLayers.Strategy.Refresh({interval: interval})],
+            protocol: new OpenLayers.Protocol({
+                read: function(config) {
+                    config.callback.call(config.scope, {});
+                }
+            }),
+            isBaseLayer: true,
+            eventListeners: {
+                visibilitychanged: function() {
+                    ++log.visibilitychanged;
+                }
+            }            
+        });
+        map.addLayer(layer);
+
+        layer.setVisibility(false);
+        t.eq(log.visibilitychanged, 1, "visibilitychanged triggered");
+        
+        map.destroy();
+        
+    }
+
+    function test_refreshWithNormalProgress(t) {
+        
+        t.plan(1);
+        var log = {
+            refreshcalled: 0
+        };
+
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector(null, {
+            strategies: [new OpenLayers.Strategy.Refresh({
+                interval: interval,
+                refresh: function() {
+                    if (this.layer && this.layer.refresh) {
+                        ++log.refreshcalled;
+                    }
+                }
+            })],
+            protocol: new OpenLayers.Protocol({
+                read: function(config) {
+                    config.callback.call(config.scope, {});
+                }
+            }),
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+
+        t.delay_call((5 * (interval / 1000)) + 0.5, function() { 
+            t.eq(log.refreshcalled, 5, "number of refreshes");
+            map.destroy();
+        });
+        
+    }
+
+    function test_refreshWithSwitchingVisibility(t) {
+        
+        t.plan(1);
+        var log = {
+            refreshcalled: 0
+        };
+
+        var map = new OpenLayers.Map("map");
+        var layer = new OpenLayers.Layer.Vector(null, {
+            strategies: [new OpenLayers.Strategy.Refresh({
+                interval: interval,
+                refresh: function() {
+                    if (this.layer && this.layer.refresh) {
+                        ++log.refreshcalled;
+                    }
+                }
+            })],
+            protocol: new OpenLayers.Protocol({
+                read: function(config) {
+                    config.callback.call(config.scope, {});
+                }
+            }),
+            isBaseLayer: true
+        });
+        map.addLayer(layer);
+
+        window.setTimeout(function() {
+            layer.setVisibility(false);
+        }, 2.5 * interval);
+        
+        t.delay_call((5 * (interval / 1000)) + 0.5, function() { 
+            t.eq(log.refreshcalled, 2, "number of refreshes");
+            map.destroy();
+        });
+        
+    }
+
+    </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 200px;"></div>
+</body>
+</html>
diff --git a/tests/Strategy/Save.html b/tests/Strategy/Save.html
new file mode 100644
index 0000000..bbab07f
--- /dev/null
+++ b/tests/Strategy/Save.html
@@ -0,0 +1,127 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+  
+    function test_initialize(t) {
+        t.plan(1);
+        var strategy = new OpenLayers.Strategy.Save();
+        t.eq(strategy.auto, false, "auto is false by default");
+    }
+
+    function test_activate(t) {
+        
+        t.plan(3);
+        
+        var strategy = new OpenLayers.Strategy.Save();
+        var layer = new OpenLayers.Layer.Vector(null, {
+            isBaseLayer: true,
+            protocol: new OpenLayers.Protocol(),
+            strategies: [strategy]
+        });
+        var map = new OpenLayers.Map("map");
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        // check that auto true registers listeners
+        strategy.deactivate();
+        strategy.auto = true;
+        strategy.activate();
+        t.ok(layer.events.listeners["featureadded"][0].func === strategy.triggerSave,
+             "[auto true] triggerSave registered as listener for featureadded");
+        t.ok(layer.events.listeners["afterfeaturemodified"][0].func === strategy.triggerSave,
+             "[auto true] triggerSave registered as listener for afterfeaturemodified");
+
+        // check that auto can be set to interval
+        strategy.deactivate();
+        strategy.auto = 1;
+        strategy.activate();
+        t.ok(strategy.timer != null, "[auto number] timer set")
+        
+        map.destroy();
+        
+    }
+    
+    function test_save(t) {
+        t.plan(9);
+
+        var strategy = new OpenLayers.Strategy.Save();
+        
+        // mock up a protocol for synchronous and successful commits
+        var protocol = new OpenLayers.Protocol({
+            commit: function(features, options) {
+                var response = new OpenLayers.Protocol.Response();
+                response.reqFeatures = features;
+                response.insertIds = [];
+                for(var i=0; i<features.length; ++i) {
+                    // test feature.url first
+                    t.eq(features[i].url, "url" + i,
+                         "feature.url correctly set (url" + i + ")");
+                    if(features[i].state == OpenLayers.State.INSERT) {
+                        response.insertIds.push("new_" + i);
+                    }
+                }
+                response.code = OpenLayers.Protocol.Response.SUCCESS;
+                options.callback.call(options.scope, response);
+            }
+        });
+
+        var layer = new OpenLayers.Layer.Vector(null, {
+            isBaseLayer: true,
+            protocol: protocol,
+            strategies: [strategy],
+            projection: "EPSG:4326"
+        });
+        var map = new OpenLayers.Map("map", {
+            getProjectionObject: function() {
+                return new OpenLayers.Projection("EPSG:900913");
+            }
+        })
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        
+        // give the layer some features
+        var features = [
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(5, 45)
+            ), // insert
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(6, 46)
+            ), // delete
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(7, 47)
+            ), // update
+            new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(8, 48)
+            )  // nothing
+        ];
+        features[0].state = OpenLayers.State.INSERT;
+        features[0].url = "url0";
+        features[1].state = OpenLayers.State.DELETE;
+        features[1].url = "url1";
+        features[2].state = OpenLayers.State.UPDATE;
+        features[2].url = "url2";
+        features[3].url = "url3";
+        layer.addFeatures(features);
+        
+        // save feature modifications
+        strategy.save(features);
+        
+        // confirm that newly created feature has an id and no longer has insert state
+        t.eq(features[0].fid, "new_0", "newly created feature gets fid");
+        t.ok(features[0].state == null, "newly created feature no longer insert state");
+        
+        // confirm that deleted features are not on layer
+        t.eq(layer.features.length, 3, "layer only has three features");
+        t.ok(features[1].layer == null, "deleted feature has no layer");
+        
+        // confirm that updated feature no longer has update state
+        t.ok(features[2].state == null, "updated feature no longer update state");
+    }
+
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 400px; height: 200px" />
+</body>
+</html>
diff --git a/tests/Style.html b/tests/Style.html
new file mode 100644
index 0000000..392c2f0
--- /dev/null
+++ b/tests/Style.html
@@ -0,0 +1,395 @@
+<html> 
+<head> 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_Style_constructor(t) { 
+        t.plan(6); 
+         
+        var rules = [
+            new OpenLayers.Rule({
+                symbolizer: {fillColor: "red"},
+                filter: new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                    property: "type",
+                    value: "fire engine"
+                })
+            }),
+            new OpenLayers.Rule({
+                symbolizer: {fillColor: "yellow"},
+                filter: new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                    property: "type",
+                    value: "sports car"
+                })
+            })
+        ];
+        var style = new OpenLayers.Style(null, {
+            foo: "bar",
+            rules: rules
+        }); 
+        t.ok(style instanceof OpenLayers.Style, 
+             "new OpenLayers.Style returns object" ); 
+        t.eq(style.foo, "bar", "constructor sets options correctly");
+        t.eq(style.rules.length, 2, "correct number of rules added");
+        t.ok(style.rules[0] === rules[0], "correct first rule added");
+        t.ok(style.rules[1] === rules[1], "correct second rule added");
+        t.eq(typeof style.createSymbolizer, "function", "style has a createSymbolizer function"); 
+    }
+    
+    function test_Style_create(t) {
+        t.plan(10);
+        
+        var map = new OpenLayers.Map("map");
+        
+        var layer = new OpenLayers.Layer.Vector("layer");
+         
+        var baseStyle = OpenLayers.Util.extend(
+            OpenLayers.Feature.Vector.style["default"],
+            {externalGraphic: "bar${foo}.png"}
+        );
+        
+        var style = new OpenLayers.Style(baseStyle);
+        
+        var rule1 = new OpenLayers.Rule({
+            symbolizer: {"Point": {fillColor: "green"}},
+            maxScaleDenominator: 500000,
+            filter: new OpenLayers.Filter.FeatureId({
+                fids: ["1"]
+            })
+        });
+        var rule2 = new OpenLayers.Rule({
+            symbolizer: {"Point": {fillColor: "yellow"}},
+            minScaleDenominator: 500000,
+            maxScaleDenominator: 1000000,
+            filter: new OpenLayers.Filter.FeatureId({
+                fids: ["1"]
+            })
+        });
+        var rule3 = new OpenLayers.Rule({
+            symbolizer: {"Point": {fillColor: "red"}},
+            minScaleDenominator: 1000000,
+            maxScaleDenominator: 2500000,
+            filter: new OpenLayers.Filter.FeatureId({
+                fids: ["1"]
+            })
+        });
+        
+        var feature = new OpenLayers.Feature.Vector(
+            new OpenLayers.Geometry.Point(3,5),
+            {"foo": "bar"}
+        );
+
+        feature.fid = "1";
+        // for this fid, the above rule should apply
+        
+        layer.styleMap = new OpenLayers.StyleMap(style);
+                
+        layer.addFeatures([feature]);
+        map.addLayer(layer);
+        map.setBaseLayer(layer);
+
+        map.setCenter(new OpenLayers.LonLat(3,5), 10);
+
+        var createdStyle = style.createSymbolizer(feature);
+        t.eq(createdStyle.externalGraphic, "barbar.png", "Calculated property style for default symbolizer correctly.");
+        
+        style.addRules([rule1, rule2, rule3]);
+        createdStyle = style.createSymbolizer(feature);
+        
+        // at this scale, the feature should be green
+        t.eq(createdStyle.display, undefined, "Feature is visible at scale "+map.getScale());
+        t.eq(createdStyle.fillColor, "green", "Point symbolizer from rule applied correctly.");
+
+        map.setCenter(new OpenLayers.LonLat(3,5), 9);
+        // at this scale, the feature should be red
+        createdStyle = style.createSymbolizer(feature);
+        t.eq(createdStyle.display, undefined, "Feature is visible at scale "+map.getScale());
+        t.eq(createdStyle.fillColor, "yellow", "Point symbolizer from rule applied correctly.");
+
+        map.setCenter(new OpenLayers.LonLat(3,5), 8);
+        // at this scale, the feature should be yellow
+        createdStyle = style.createSymbolizer(feature);
+        t.eq(createdStyle.display, undefined, "Feature is visible at scale "+map.getScale());
+        t.eq(createdStyle.fillColor, "red", "Point symbolizer from rule applied correctly.");
+
+        map.setCenter(new OpenLayers.LonLat(3,5), 7);
+        // at this scale, the feature should be invisible
+        createdStyle = style.createSymbolizer(feature);
+        t.eq(createdStyle.display, "none", "Feature is invisible at scale "+map.getScale());
+        t.eq(createdStyle.fillColor, baseStyle.fillColor, "Point symbolizer from base style applied correctly.");
+        
+        feature.fid = "2";
+        // now the rule should not apply
+        
+        createdStyle = style.createSymbolizer(feature);
+        t.eq(createdStyle.fillColor, baseStyle.fillColor, "Correct style for rule that does not apply to fid=\"2\".");
+    }
+    
+    function test_Style_createSymbolizer(t) {
+        t.plan(2);
+        var style = new OpenLayers.Style();
+        var rule = new OpenLayers.Rule({
+            id: Math.random()
+        });
+        var elseRule = new OpenLayers.Rule({
+            id: Math.random(),
+            elseFilter: true
+        });
+        style.addRules([rule, elseRule]);
+
+        // test that applySymbolizer is only called with rule
+        style.applySymbolizer = function(r) {
+            t.eq(r.id, rule.id, "(plain) applySymbolizer called with correct rule");
+        }
+        style.createSymbolizer(new OpenLayers.Feature.Vector());
+
+        rule.evaluate = function() {return false;};
+        style.applySymbolizer = function(r) {
+            t.eq(r.id, elseRule.id, "(else) applySymbolizer called with correct rule");
+        };
+        style.createSymbolizer(new OpenLayers.Feature.Vector());
+    }
+    
+    function test_Style_applySymbolizer(t) {
+        t.plan(15);
+
+        var feature = new OpenLayers.Feature.Vector();
+        var defaults = OpenLayers.Feature.Vector.style["default"];
+        var style, symbolizer;
+
+        style = new OpenLayers.Style();
+        symbolizer = style.createSymbolizer(feature);
+        t.eq(symbolizer.pointRadius, defaults.pointRadius, "symbolizer has the correct pointRadius");
+        t.eq(symbolizer.strokeWidth, defaults.strokeWidth, "symbolizer has the correct strokeWidth");
+        t.eq(symbolizer.fillColor, defaults.fillColor, "symbolizer has the correct fillColor");
+        t.eq(symbolizer.graphicName, defaults.graphicName, "symbolizer has the correct graphicName");
+
+        style = new OpenLayers.Style(null, {
+            defaultsPerSymbolizer: true,
+            rules: [
+                new OpenLayers.Rule({
+                    symbolizer: {
+                        stroke: true
+                    }
+                })
+            ]
+        });
+        symbolizer = style.createSymbolizer(feature);
+        t.eq(symbolizer.strokeWidth, defaults.strokeWidth, "symbolizer has the correct strokeWidth");
+        t.ok(symbolizer.fillColor == undefined, "fillColor is undefined");
+
+        style = new OpenLayers.Style(null, {
+            defaultsPerSymbolizer: true,
+            rules: [
+                new OpenLayers.Rule({
+                    symbolizer: {
+                    }
+                })
+            ]
+        });
+        symbolizer = style.createSymbolizer(feature);
+        t.eq(symbolizer.pointRadius, defaults.pointRadius, "symbolizer has the correct pointRadius");
+        t.ok(symbolizer.strokeWidth == undefined, "strokeWidth is undefined");
+        t.ok(symbolizer.fillColor == undefined, "fillColor is undefined");
+        t.ok(symbolizer.graphicName == undefined, "graphicName is undefined");
+
+        style = new OpenLayers.Style(null, {
+            defaultsPerSymbolizer: true,
+            rules: [
+                new OpenLayers.Rule({
+                    symbolizer: {
+                        stroke: true
+                    }
+                })
+            ]
+        });
+        symbolizer = style.createSymbolizer(feature);
+        t.eq(symbolizer.strokeWidth, defaults.strokeWidth, "symbolizer has the correct strokeWidth");
+        t.ok(symbolizer.fillColor == undefined, "fillColor is undefined");
+
+        style = new OpenLayers.Style(null, {
+            defaultsPerSymbolizer: true,
+            rules: [
+                new OpenLayers.Rule({
+                    symbolizer: {
+                        fill: true
+                    }
+                })
+            ]
+        });
+        symbolizer = style.createSymbolizer(feature);
+        t.eq(symbolizer.fillColor, defaults.fillColor, "symbolizer has the correct fillColor");
+        t.ok(symbolizer.strokeWidth == undefined, "strokeWidth is undefined");
+
+        style = new OpenLayers.Style(null, {
+            defaultsPerSymbolizer: true,
+            rules: [
+                new OpenLayers.Rule({
+                    symbolizer: {
+                        graphic: true
+                    }
+                })
+            ]
+        });
+        symbolizer = style.createSymbolizer(feature);
+        t.eq(symbolizer.graphicName, defaults.graphicName, "symbolizer has the correct graphicName");
+    }
+    
+    function test_Style_context(t) {
+        t.plan(4);
+        var rule = new OpenLayers.Rule({
+            symbolizer: {"Point": {externalGraphic: "${img1}"}},
+            filter: new OpenLayers.Filter.Comparison({
+                type: OpenLayers.Filter.Comparison.LESS_THAN,
+                property: "size",
+                value: 11
+            })
+        });
+        var style = new OpenLayers.Style();
+        style.context = {
+            "img1": "myImage.png"
+        };
+        style.addRules([rule]);
+        var feature = new OpenLayers.Feature.Vector();
+        feature.attributes = {size: 10};
+        var styleHash = style.createSymbolizer(feature);
+        t.eq(styleHash.externalGraphic, "myImage.png", "correctly evaluated rule and calculated property styles from a custom context");
+        
+        // same as above, but without rule (#1526)
+        style = new OpenLayers.Style(
+            {externalGraphic: "${getExternalGraphic}"},
+            {context: {
+                getExternalGraphic: function(feature) {
+                    return "foo" + feature.attributes.size + ".png";
+                }
+            }});
+        t.eq(style.createSymbolizer(feature).externalGraphic, "foo10.png", "correctly evaluated symbolizer without rule");
+        
+        style = new OpenLayers.Style(
+            {externalGraphic: "${getExternalGraphic}",
+             pointRadius: "${size}"},
+            {context: {
+                getExternalGraphic: function(feature) {
+                    return "foo" + feature.attributes.size + ".png";
+                }
+            }});
+        t.eq(style.createSymbolizer(feature).externalGraphic, "foo10.png", "correctly evaluated symbolizer from context");
+        t.eq(style.createSymbolizer(feature).pointRadius, 10, "correctly evaluated symbolizer from attributes");
+        
+    };
+        
+    function test_Style_findPropertyStyles(t) {
+        t.plan(4);
+        var rule1 = new OpenLayers.Rule({symbolizer: {
+            pointRadius: 3,
+            externalGraphic: "${foo}.bar"
+        }});
+        var rule2 = new OpenLayers.Rule({symbolizer: {"Point": {
+            strokeWidth: "${foo}"
+        }}});
+        var style = new OpenLayers.Style({
+            strokeOpacity: 1,
+            strokeColor: "${foo}"
+        });
+        style.addRules([rule1, rule2]);
+        var propertyStyles = style.findPropertyStyles();
+        t.ok(propertyStyles.externalGraphic, "detected externalGraphic from rule correctly");
+        t.ok(propertyStyles.strokeWidth, "detected strokeWidth from Point symbolizer correctly");
+        t.ok(propertyStyles.strokeColor, "detected strokeColor from style correctly");
+        t.eq(typeof propertyStyles.pointRadius, "undefined", "correctly detected pointRadius as non-property style");
+    }
+    
+    function test_createLiteral(t) {
+        t.plan(6);
+        
+        var value, context, feature, result, expected;
+        var func = OpenLayers.Style.createLiteral;
+
+        // without templates
+        value = "foo";
+        expected = value;
+        result = func(value);
+        t.eq(result, expected, "(no template) preserves literal");
+        
+        // with templates
+        value = "${foo}"
+        expected = "bar";
+        context = {foo: expected};
+        result = func(value, context);
+        t.eq(result, expected, "(template) preserves literal");
+        
+        expected = "";
+        context = {foo: expected};
+        result = func(value, context);
+        t.eq(result, expected, "(template) preserves empty string");
+        
+        expected = "16/03/2008";
+        context = {foo: expected};
+        result = func(value, context);
+        t.eq(result, expected, "(template) preserves string with numbers");
+        
+        expected = 16;
+        context = {foo: expected + ""};
+        result = func(value, context);
+        t.eq(result, expected, "(template) casts integer in a string");
+
+        expected = 16;
+        context = {foo: " " + expected + " "};
+        result = func(value, context);
+        t.eq(result, expected, "(template) casts integer in a space padded string");
+
+    }
+
+    function test_clone(t) {
+        
+        t.plan(7);
+        
+        var style = new OpenLayers.Style({bar: "baz"}, {
+            name: "test style",
+            rules: [new OpenLayers.Rule({
+                name: "test rule"
+            })],
+            context: {
+                foo: "bar"
+            }
+        });
+        var clone = style.clone();
+        t.eq(clone.name, "test style", "name copied");
+        t.eq(clone.rules[0].name, "test rule", "clone has correct rule");
+        
+        // modify original
+        style.name = "new";
+        style.addRules([new OpenLayers.Rule({
+			name: "new rule"
+		})]);
+        style.context.foo = "baz";
+        
+        // confirm that clone didn't change
+        t.eq(clone.defaultStyle.bar, "baz", "clone has clone of defaultStyle");
+        t.eq(clone.name, "test style", "clone has clone of name");
+        t.eq(clone.rules.length, 1, "clone has clone of rules");
+        t.eq(clone.context.foo, "bar", "clone has clone of context");
+        
+        // confirm that ids are different
+        t.ok(clone.id !== style.id, "clone has different id");
+
+        style.destroy();
+        clone.destroy();
+        
+    }
+
+    function test_Style_destroy(t) {
+        t.plan(1);
+        
+        var style = new OpenLayers.Style();
+        style.destroy();
+        t.eq(style.rules, null, "rules array nulled properly");
+    }
+
+    </script> 
+</head> 
+<body> 
+  <div id="map" style="width:500px;height:500px"></div>
+</body> 
+</html> 
diff --git a/tests/Style2.html b/tests/Style2.html
new file mode 100644
index 0000000..9127f33
--- /dev/null
+++ b/tests/Style2.html
@@ -0,0 +1,56 @@
+<html> 
+<head> 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(4); 
+
+        var rules = [
+            new OpenLayers.Rule({
+                symbolizer: {fillColor: "red"},
+                filter: new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                    property: "type",
+                    value: "fire engine"
+                })
+            }),
+            new OpenLayers.Rule({
+                symbolizer: {fillColor: "yellow"},
+                filter: new OpenLayers.Filter.Comparison({
+                    type: OpenLayers.Filter.Comparison.EQUAL_TO,
+                    property: "type",
+                    value: "sports car"
+                })
+            })
+        ];
+        var style = new OpenLayers.Style2({rules: rules}); 
+        t.ok(style instanceof OpenLayers.Style2, "correct type"); 
+        t.eq(style.rules.length, 2, "correct number of rules added");
+        t.ok(style.rules[0] === rules[0], "correct first rule added");
+        t.ok(style.rules[1] === rules[1], "correct second rule added");
+    }
+    
+    function test_destroy(t) {
+        t.plan(1);
+        
+        var style = new OpenLayers.Style2({
+            rules: [
+                new OpenLayers.Rule({
+                    symbolizers: [
+                        new OpenLayers.Symbolizer.Point({
+                            fillColor: "fuchsia"
+                        })
+                    ]
+                })
+            ]
+        });
+        style.destroy();
+        t.ok(!style.rules, "rules array gone");
+    }
+
+
+    </script> 
+</head>
+<body></body> 
+</html> 
diff --git a/tests/StyleMap.html b/tests/StyleMap.html
new file mode 100644
index 0000000..2213352
--- /dev/null
+++ b/tests/StyleMap.html
@@ -0,0 +1,44 @@
+<html> 
+<head> 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_StyleMap_constructor(t) { 
+        t.plan(6);
+         
+        var options = {'foo': 'bar'}; 
+        var styleMap = new OpenLayers.StyleMap(null, options); 
+        t.ok(styleMap instanceof OpenLayers.StyleMap, 
+             "new OpenLayers.StyleMap returns object" ); 
+        t.eq(styleMap.foo, "bar", "constructor sets options correctly"); 
+
+        var style = new OpenLayers.Style();
+        var styleMap = new OpenLayers.StyleMap(style);
+        t.eq(styleMap.styles["default"].defaultStyle.strokeColor, style.defaultStyle.strokeColor, "default style set correctly from style object");
+
+        var style = {strokeColor: "blue"};
+        var styleMap = new OpenLayers.StyleMap(style);
+        t.eq(styleMap.styles["default"].defaultStyle.strokeColor, "blue", "default style set correctly from style hash");
+        
+        var style = {
+            "default": new OpenLayers.Style({strokeColor: "yellow"}),
+            "select": {strokeColor: "blue"}};
+        var styleMap = new OpenLayers.StyleMap(style);
+        t.eq(styleMap.styles["default"].defaultStyle.strokeColor, "yellow", "default style set correctly from a mixed hash of renderIntents");
+        t.eq(styleMap.styles["select"].defaultStyle.strokeColor, "blue", "select style set correctly from a mixed hash of renderIntents");
+    }
+    
+    function test_StyleMap_destroy(t) {
+        t.plan(2);
+        var styleMap = new OpenLayers.StyleMap();
+        t.ok(styleMap.styles["default"], "Got a default style after initialisation");
+        styleMap.destroy();
+        t.ok(!styleMap.styles, "StyleMap styles successfully destroyed");
+    }
+    
+    </script> 
+</head> 
+<body> 
+  <div id="map" style="width:500px;height:500px"></div>
+</body> 
+</html> 
diff --git a/tests/Symbolizer.html b/tests/Symbolizer.html
new file mode 100644
index 0000000..5f51e91
--- /dev/null
+++ b/tests/Symbolizer.html
@@ -0,0 +1,31 @@
+<html> 
+<head> 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(2); 
+        
+        var symbolizer = new OpenLayers.Symbolizer({foo: "bar"});
+        
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer, "correct type");
+        t.eq(symbolizer.foo, "bar", "constructor applies config properties");
+
+    }
+    
+    function test_clone(t) {
+        t.plan(2);
+        
+        var symbolizer = new OpenLayers.Symbolizer({foo: "bar"});
+        var clone = symbolizer.clone();
+        
+        t.ok(clone instanceof OpenLayers.Symbolizer, "correct type");
+        t.eq(clone.foo, "bar", "clone copies properties");
+        
+    }
+
+
+    </script> 
+</head>
+<body></body> 
+</html> 
diff --git a/tests/Symbolizer/Line.html b/tests/Symbolizer/Line.html
new file mode 100644
index 0000000..ed321f1
--- /dev/null
+++ b/tests/Symbolizer/Line.html
@@ -0,0 +1,32 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(3); 
+        
+        var symbolizer = new OpenLayers.Symbolizer.Line({foo: "bar"});
+        
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer.Line, "instance of OpenLayers.Symbolizer.Line");
+        t.eq(symbolizer.foo, "bar", "constructor applies config properties");
+
+    }
+    
+    function test_clone(t) {
+        t.plan(2);
+        
+        var symbolizer = new OpenLayers.Symbolizer.Line({foo: "bar"});
+        var clone = symbolizer.clone();
+        
+        t.ok(clone instanceof OpenLayers.Symbolizer.Line, "correct type");
+        t.eq(clone.foo, "bar", "clone copies properties");
+        
+    }
+
+
+    </script> 
+</head>
+<body></body> 
+</html> 
diff --git a/tests/Symbolizer/Point.html b/tests/Symbolizer/Point.html
new file mode 100644
index 0000000..e308191
--- /dev/null
+++ b/tests/Symbolizer/Point.html
@@ -0,0 +1,32 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(3); 
+        
+        var symbolizer = new OpenLayers.Symbolizer.Point({foo: "bar"});
+        
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer.Point, "instance of OpenLayers.Symbolizer.Point");
+        t.eq(symbolizer.foo, "bar", "constructor applies config properties");
+
+    }
+    
+    function test_clone(t) {
+        t.plan(2);
+        
+        var symbolizer = new OpenLayers.Symbolizer.Point({foo: "bar"});
+        var clone = symbolizer.clone();
+        
+        t.ok(clone instanceof OpenLayers.Symbolizer.Point, "correct type");
+        t.eq(clone.foo, "bar", "clone copies properties");
+        
+    }
+
+
+    </script> 
+</head>
+<body></body> 
+</html> 
diff --git a/tests/Symbolizer/Polygon.html b/tests/Symbolizer/Polygon.html
new file mode 100644
index 0000000..84dc03a
--- /dev/null
+++ b/tests/Symbolizer/Polygon.html
@@ -0,0 +1,32 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(3); 
+        
+        var symbolizer = new OpenLayers.Symbolizer.Polygon({foo: "bar"});
+        
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer.Polygon, "instance of OpenLayers.Symbolizer.Polygon");
+        t.eq(symbolizer.foo, "bar", "constructor applies config properties");
+
+    }
+    
+    function test_clone(t) {
+        t.plan(2);
+        
+        var symbolizer = new OpenLayers.Symbolizer.Polygon({foo: "bar"});
+        var clone = symbolizer.clone();
+        
+        t.ok(clone instanceof OpenLayers.Symbolizer.Polygon, "correct type");
+        t.eq(clone.foo, "bar", "clone copies properties");
+        
+    }
+
+
+    </script> 
+</head>
+<body></body> 
+</html> 
diff --git a/tests/Symbolizer/Raster.html b/tests/Symbolizer/Raster.html
new file mode 100644
index 0000000..ff4bb04
--- /dev/null
+++ b/tests/Symbolizer/Raster.html
@@ -0,0 +1,32 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(3); 
+        
+        var symbolizer = new OpenLayers.Symbolizer.Raster({foo: "bar"});
+        
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer.Raster, "instance of OpenLayers.Symbolizer.Raster");
+        t.eq(symbolizer.foo, "bar", "constructor applies config properties");
+
+    }
+    
+    function test_clone(t) {
+        t.plan(2);
+        
+        var symbolizer = new OpenLayers.Symbolizer.Raster({foo: "bar"});
+        var clone = symbolizer.clone();
+        
+        t.ok(clone instanceof OpenLayers.Symbolizer.Raster, "correct type");
+        t.eq(clone.foo, "bar", "clone copies properties");
+        
+    }
+
+
+    </script> 
+</head>
+<body></body> 
+</html> 
diff --git a/tests/Symbolizer/Text.html b/tests/Symbolizer/Text.html
new file mode 100644
index 0000000..482afb5
--- /dev/null
+++ b/tests/Symbolizer/Text.html
@@ -0,0 +1,32 @@
+<html> 
+<head> 
+    <script src="../../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_constructor(t) { 
+        t.plan(3); 
+        
+        var symbolizer = new OpenLayers.Symbolizer.Text({foo: "bar"});
+        
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer, "instance of OpenLayers.Symbolizer");
+        t.ok(symbolizer instanceof OpenLayers.Symbolizer.Text, "instance of OpenLayers.Symbolizer.Text");
+        t.eq(symbolizer.foo, "bar", "constructor applies config properties");
+
+    }
+    
+    function test_clone(t) {
+        t.plan(2);
+        
+        var symbolizer = new OpenLayers.Symbolizer.Text({foo: "bar"});
+        var clone = symbolizer.clone();
+        
+        t.ok(clone instanceof OpenLayers.Symbolizer.Text, "correct type");
+        t.eq(clone.foo, "bar", "clone copies properties");
+        
+    }
+
+
+    </script> 
+</head>
+<body></body> 
+</html> 
diff --git a/tests/Tile.html b/tests/Tile.html
new file mode 100644
index 0000000..930f2e6
--- /dev/null
+++ b/tests/Tile.html
@@ -0,0 +1,95 @@
+<html>
+<head>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var tile; 
+    
+    function test_Tile_constructor (t) {
+        t.plan( 12 );
+     
+        var layer = {}; // bogus layer
+        var position = new OpenLayers.Pixel(10,20);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "bobob";
+        var size = new OpenLayers.Size(5,6);
+        
+        tile = new OpenLayers.Tile(layer, position, bounds, url, size);
+
+        t.ok( tile instanceof OpenLayers.Tile, "new OpenLayers.Tile returns Tile object" );
+        t.eq( tile.layer, layer, "tile.layer set correctly");
+        t.ok( tile.position.equals(position), "tile.position set correctly");
+        t.ok( tile.position != position, "tile.position set not by reference");
+        t.ok( tile.bounds.equals(bounds), "tile.bounds set correctly");
+        t.ok( tile.bounds != bounds, "tile.bounds set not by reference");
+        t.eq( tile.url, url, "tile.url set correctly");        
+        t.ok( tile.size.equals(size), "tile.size is set correctly" );
+        t.ok( tile.size != size, "tile.size set not by reference");
+
+        t.ok( tile.id != null, "tile is given an id");
+        t.ok(OpenLayers.String.startsWith(tile.id, "Tile_"),
+             "tile's id starts correctly");
+        t.ok( tile.events != null, "tile's events intitialized");
+    }
+
+    function test_Tile_clone (t) {
+        t.plan( 10 );
+     
+        var layer = {}; // bogus layer
+        var position = new OpenLayers.Pixel(10,20);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "bobob";
+        var size = new OpenLayers.Size(5,6);
+        
+        tile = new OpenLayers.Tile(layer, position, bounds, url, size);
+        var clone = tile.clone();
+        
+        t.ok( clone instanceof OpenLayers.Tile, "OpenLayers.Tile.clone returns Tile object" );
+        t.eq( clone.layer, layer, "clone.layer set correctly");
+        t.ok( clone.position.equals(position), "clone.position set correctly");
+        t.ok( clone.bounds.equals(bounds), "clone.bounds set correctly");
+        t.eq( clone.url, url, "clone.url set correctly");        
+        t.ok( clone.size.equals(size), "clone.size is set correctly" );
+
+        t.ok( clone.id != null, "clone is given an id");
+        t.ok( clone.id != tile.id, "clone is given a new id");
+        t.ok(OpenLayers.String.startsWith(clone.id, "Tile_"),
+             "clone's id starts correctly");
+        t.ok( clone.events != null, "clone's events intitialized");
+    }
+
+    function test_Tile_destroy(t) {
+        t.plan( 6 );
+
+        var layer = {
+            SUPPORTED_TRANSITIONS: [],
+            events: {
+                unregister: function() {}
+            }
+        }; // bogus layer
+        var position = new OpenLayers.Pixel(10,20);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "bobob";
+        var size = new OpenLayers.Size(5,6);
+        
+        tile = new OpenLayers.Tile(layer, position, bounds, url, size);
+        tile.events.destroy = function() {
+            t.ok(true, "tile events destroy() called");
+        };
+
+ 
+        tile.destroy();
+
+        t.ok(tile.layer == null, "tile.layer set to null");
+        t.ok(tile.bounds == null, "tile.bounds set to null");
+        t.ok(tile.size == null, "tile.size set to null");
+        t.ok(tile.position == null, "tile.position set to null");
+        
+        t.ok(tile.events == null, "tile.events set to null");
+    }
+
+  </script>
+</head>
+<body>
+</body>
+</html>
+
diff --git a/tests/Tile/Image.html b/tests/Tile/Image.html
new file mode 100644
index 0000000..f5f327b
--- /dev/null
+++ b/tests/Tile/Image.html
@@ -0,0 +1,302 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var tile; 
+    
+    function test_Tile_Image_constructor (t) {
+        t.plan( 6 );
+        
+        var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}); 
+
+        var position = new OpenLayers.Pixel(20,30);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "http://www.openlayers.org/dev/tests/tileimage";
+        var size = new OpenLayers.Size(5,6);
+        tile = new OpenLayers.Tile.Image(layer, position, bounds, url, size);
+        
+        t.ok( tile instanceof OpenLayers.Tile.Image, "new OpenLayers.Tile returns Tile object" );
+        t.ok( tile.layer == layer, "tile.layer is set correctly");
+        t.ok( tile.position.equals(position), "tile.position is set correctly");
+        t.ok( tile.bounds.equals(bounds), "tile.bounds is set correctly");
+        t.eq( tile.url, url, "tile.url is set correctly");
+        t.ok( tile.size.equals(size), "tile.size is set correctly");
+    }
+
+    function test_destroy_observers(t) {
+        t.plan(2);
+
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}); 
+        map.addLayer(layer);
+
+        var position = new OpenLayers.Pixel(20,30);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var size = new OpenLayers.Size(5,6);
+
+        // with alpha hack
+        var withAlpha = new OpenLayers.Tile.Image(layer, position, bounds, null, size);
+        withAlpha.layerAlphaHack = true;
+
+        withAlpha.draw();
+        var cacheID = withAlpha.imgDiv._eventCacheID;
+        withAlpha.destroy();
+        
+        t.eq(OpenLayers.Event.observers[cacheID], undefined, 
+             "With alpha hack: imgDiv observers are cleared in destroy");
+
+        // without alpha hack
+        var withoutAlpha = new OpenLayers.Tile.Image(layer, position, bounds, null, size);
+        withoutAlpha.layerAlphaHack = false;
+
+        withoutAlpha.draw();
+        var cacheID = withoutAlpha.imgDiv._eventCacheID;
+        withoutAlpha.destroy();
+
+        t.eq(OpenLayers.Event.observers[cacheID], undefined, 
+             "Without alpha hack: imgDiv observers are cleared in destroy");
+
+        map.destroy();
+    }
+
+    function test_Tile_Image_clone (t) {
+        t.plan( 9 );
+        
+        var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}); 
+
+        var position = new OpenLayers.Pixel(20,30);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "http://www.openlayers.org/dev/tests/tileimage";
+        var size = new OpenLayers.Size(5,6);
+        tile = new OpenLayers.Tile.Image(layer, position, bounds, url, size);
+        tile.imgDiv = {};
+        var clone = tile.clone();
+        
+        t.ok( clone instanceof OpenLayers.Tile.Image, "OpenLayers.Tile.clone returns Tile.Image object" );
+        t.ok( clone.layer == layer, "clone.layer is set correctly");
+        t.ok( clone.position.equals(position), "clone.position is set correctly");
+        t.ok( clone.bounds.equals(bounds), "clone.bounds is set correctly");
+        t.eq( clone.url, url, "clone.url is set correctly");
+        t.ok( clone.size.equals(size), "clone.size is set correctly");
+        t.ok( clone.frame, "clone has a frame");
+        t.ok( clone.frame != tile.frame, "clone's frame is a new one");
+        t.ok( clone.imgDiv == null, "clone's imgDiv was not copied");
+    }
+    
+    function test_Tile_Image_draw (t) {
+        t.plan( 7 );
+
+        var map = new OpenLayers.Map('map');
+        
+        var size = new OpenLayers.Size(5,6);
+        layer = new OpenLayers.Layer.WMS("Name",
+                                         "http://labs.metacarta.com/TESTURL",
+                                         null,
+                                         {tileSize: size});  
+        map.addLayer(layer);  
+        var position = new OpenLayers.Pixel(20,30);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "http://www.openlayers.org/dev/tests/tileimage";
+        tile = new OpenLayers.Tile.Image(layer, position, bounds, url, size);
+        
+        tile.events.register("loadstart", this, function() { 
+            t.ok(true, "loadstart triggered");
+        });
+        tile.events.register("reload", this, function() { 
+            t.ok(true, "reload triggered");
+        });
+                
+        //this should trigger a "loadstart" event
+        tile.draw();
+        
+        var img = tile.imgDiv;
+        
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( tile.imgDiv instanceof HTMLElement, "tile.draw creates an image");
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( img instanceof HTMLImageElement, "tile.draw creates an image");
+        var tParams = {
+            SERVICE: "WMS", VERSION: "1.1.1",
+            REQUEST: "GetMap", STYLES: "",
+            EXCEPTIONS: "application/vnd.ogc.se_inimage", FORMAT: "image/jpeg",
+            SRS: "EPSG:4326", BBOX: [1,2,3,4],
+            WIDTH: String(size.w), HEIGHT: String(size.h)
+        };
+        t.eq( img.src,
+             "http://labs.metacarta.com/TESTURL?" + OpenLayers.Util.getParameterString(tParams),
+             "tile.draw creates an image");
+        t.eq( tile.imgDiv.style.width, "5px", "Image width is correct" );
+        t.eq( tile.imgDiv.style.height, "6px", "Image height is correct" );
+
+        // this should trigger a "reload" event (since the image never actually
+        // loads in tests)
+        tile.draw();
+        
+    }
+    function test_Tile_Image_OutsideMaxExtent(t) {
+        t.plan( 11 );
+        var position = new OpenLayers.Pixel(20,30);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "http://www.openlayers.org/dev/tests/tileimage";
+        var size = new OpenLayers.Size(5,6);
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}, {reproject:false, encodeBBOX: true}); 
+        map.addLayer(layer);
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-185,-90,-180,90), url, size);
+        tile.draw()
+        t.eq(tile.imgDiv, null, "Images against side of maxextent don't load");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-181,-91,180,90), url, size);
+        tile.draw()
+        var tParams = {
+            LAYERS: "basic", SERVICE: "WMS", VERSION: "1.1.1",
+            REQUEST: "GetMap", STYLES: "",
+            EXCEPTIONS: "application/vnd.ogc.se_inimage", FORMAT: "image/jpeg",
+            SRS: "EPSG:4326", BBOX: "-181,-91,180,90",
+            WIDTH: "256", HEIGHT: "256"
+        };
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Images over edges of maxextent do load");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-181,-90,180,90), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-181,-90,180,90"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Images over edges of maxextent do load");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-180,-90,180,90), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-180,-90,180,90"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Image covering all of extent loads");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-80,-45,80,45), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-80,-45,80,45"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Image covering small part of extent loads");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-185,-95,185,95), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-185,-95,185,95"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Image covering more than all of extent loads");
+
+        layer.displayOutsideMaxExtent=1;
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-185,-90,-180,90), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-185,-90,-180,90"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Images against side of maxextent do load with displayOutsideMaxExtent");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-181,-90,180,90), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-181,-90,180,90"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Images over edges of maxextent do load with displayOutsideMaxExtent set");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-180,-90,180,90), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-180,-90,180,90"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Image covering all of extent loads with display outside max extent");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-80,-45,80,45), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-80,-45,80,45"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Image covering small part of extent loads with display outside max extent");
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-185,-95,185,95), url, size);
+        tile.draw()
+        tParams = OpenLayers.Util.extend(tParams, {BBOX: "-185,-95,185,95"});
+        t.eq(tile.imgDiv.src,
+             "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams),
+             "Image covering more than all of extent loads");
+    } 
+    function test_Tile_Image_Display_After_Move(t) {
+        t.plan(2);
+        var position = new OpenLayers.Pixel(20,30);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "http://www.openlayers.org/dev/tests/tileimage";
+        var size = new OpenLayers.Size(5,6);
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}, {'reproject': true}); 
+        map.addLayer(layer);
+        map.zoomToMaxExtent();
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-90,-85,-90,85), url, size);
+        tile.draw();
+        tile.moveTo(new OpenLayers.Bounds(-185,-90,-180,-80), new OpenLayers.Pixel(-180,-85), true);
+        t.delay_call( 1, function() { t.eq(tile.imgDiv, null, "Tile imgDiv is null.") } );
+        var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+            "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}, {'reproject': true, 'alpha':true});
+        map.addLayer(layer);
+        tile = new OpenLayers.Tile.Image(layer, position, new OpenLayers.Bounds(-90,-85,-90,85), url, size);
+        tile.draw();
+        tile.moveTo(new OpenLayers.Bounds(-185,-90,-180,-80), new OpenLayers.Pixel(-180,-85), true)
+        t.delay_call( 1, function() { t.eq(tile.imgDiv, null, "Alpha tile imgDiv is null.") } );
+        
+    }
+
+    function test_Tile_Image_gutters(t) {
+        t.plan(5);
+        
+        var gutter = 0;
+        var name = 'Test Layer';
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        var params = { map: '/mapdata/vmap_wms.map', 
+                       layers: 'basic', 
+                       format: 'image/png'};
+
+
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS(name, url, params, {gutter: gutter});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        
+        var tile = layer.grid[0][0];
+        t.ok(tile.layer.imageSize == null,
+             "zero size gutter doesn't set image size"); 
+
+        t.ok(tile.layer.imageOffset == null,
+             "zero size gutter doesn't set image offset");
+        
+        var zero_gutter_bounds = tile.bounds;
+        
+        map.destroy();
+        
+        var gutter = 15;
+        var map = new OpenLayers.Map('map');
+        var layer = new OpenLayers.Layer.WMS(name, url, params, {gutter: gutter});
+        map.addLayer(layer);
+        map.setCenter(new OpenLayers.LonLat(0,0), 5);
+        var tile = layer.grid[0][0];
+        t.ok(tile.layer.imageSize.equals(new OpenLayers.Size(tile.size.w + (2 * gutter),
+                                                             tile.size.h + (2 * gutter))),
+             "gutter properly changes image size"); 
+
+        t.ok(tile.layer.imageOffset.equals(new OpenLayers.Pixel(-gutter, -gutter)),
+             "gutter properly sets image offset");
+        t.ok(tile.bounds.equals(zero_gutter_bounds),
+             "gutter doesn't affect tile bounds");
+
+        map.destroy();
+    }
+    
+  </script>
+</head>
+<body>
+<div id="map" style="height:550px;width:500px"></div>
+</body>
+</html>
+
diff --git a/tests/Tile/Image/IFrame.html b/tests/Tile/Image/IFrame.html
new file mode 100644
index 0000000..5a3da99
--- /dev/null
+++ b/tests/Tile/Image/IFrame.html
@@ -0,0 +1,225 @@
+<html>
+<head>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var isOpera   = (navigator.userAgent.indexOf("Opera") != -1);
+    var isIE      = (navigator.userAgent.indexOf("MSIE") != -1);
+
+    var map, layer;
+    var position = new OpenLayers.Pixel(20,30);
+    var bounds   = new OpenLayers.Bounds(1,2,3,4);
+    var url      = "http://www.openlayers.org/dev/tests/tileimage";
+    var size     = new OpenLayers.Size(5,6);
+    var name     = "OpenaLayers WMS";
+    var wmsUrl   = "http://labs.metacarta.com/wms/vmap0?";
+    
+    function test_Tile_Image_IFrame_constructor (t) {
+        t.plan( 2 );
+        layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'}); 
+        var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
+        
+        t.ok( tile instanceof OpenLayers.Tile.Image.IFrame, "new OpenLayers.Tile.Image.IFrame returns Tile object" );
+        t.eq( tile.layerAlphaHack, false, "layerAlphaHack is set to false.");
+    
+        layer.destroy();
+    }
+
+    function test_Tile_Image_IFrame_destroy (t) {
+        t.plan( 2 );
+        map   = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'}); 
+        map.addLayer(layer);
+
+        var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, null, size);
+        tile.renderTile();
+        tile.positionImage();
+        
+        tile.destroy();
+        t.eq( tile.imgDiv, null, "IFrame successfully removed from DOM");
+        t.eq( tile.frame, null, "Event div successfully removed from DOM");
+
+        map.destroy();
+    }
+
+    function test_Tile_Image_IFrame_clone (t) {
+        t.plan( 9 );
+        
+        layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'}); 
+        tile  = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
+        tile.iFrame = {};
+        var clone = tile.clone();
+        
+        t.ok( clone instanceof OpenLayers.Tile.Image.IFrame, "clone is a Tile.Image.IFrame object" );
+        t.ok( clone.layer == layer, "clone.layer is set correctly");
+        t.ok( clone.position.equals(position), "clone.position is set correctly");
+        t.ok( clone.bounds.equals(bounds), "clone.bounds is set correctly");
+        t.eq( clone.url, url, "clone.url is set correctly");
+        t.ok( clone.size.equals(size), "clone.size is set correctly");
+        t.ok( clone.frame, "clone has a frame");
+        t.ok( clone.frame != tile.frame, "clone's frame is a new one");
+        t.ok( clone.imgDiv == null, "clone's imgDiv was not copied");
+    }
+    
+    function test_Tile_Image_IFrame_clear (t) {
+        t.plan( 1 );
+        
+        map   = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'}); 
+        map.addLayer(layer);  
+        tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
+        tile.draw();
+        tile.clear();
+
+        t.ok(
+            tile.imgDiv.firstChild.nodeName != "IFRAME",
+            "IFrame successfully removed from DOM");
+        map.destroy();
+    }
+
+    function test_Tile_Image_IFrame_initImgDiv (t) {
+        t.plan( 4 );
+
+        map   = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'}); 
+        map.addLayer(layer);  
+        tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
+        tile.initImgDiv();
+
+        if(isMozilla) {
+            t.ok( tile.imgDiv instanceof HTMLElement, "tile.iFrame successfully created.");
+        }
+        else {
+            t.ok( tile.imgDiv != null, "tile.iFrame successfully created.");
+        }
+        t.eq( tile.imgDiv.id, tile.id, "imgDiv id correctly set.");
+        t.eq( tile.imgDiv.className, "olTileImage", "iFrame's className correctly set.");
+        t.ok( tile.imgDiv.map == map, "map correctly added to iFrame.");
+
+        map.destroy();
+    }
+
+    function test_Tile_Image_IFrame_createImgDiv (t) {
+        t.plan( 3 );
+
+        map   = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'}); 
+        map.addLayer(layer);  
+        var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
+        tile.renderTile();
+        var imgDiv = tile.imgDiv;
+        var iFrame    = imgDiv.firstChild;
+        var eventPane = imgDiv.childNodes[1];
+
+        if(isIE) {
+            t.ok(iFrame != null, "IFrame successfully created.");
+            t.eq(eventPane.style.backgroundColor, '#ffffff', "backgroundColor of overlay pane is set in InternetExplorer.");
+            t.eq(eventPane.style.filter, 'chroma(color=#FFFFFF)', "filter of overlay pane is set in InternetExplorer.");
+        }
+        else {
+            t.ok(iFrame instanceof HTMLElement, "IFrame successfully created.");
+            t.ok(true, 'Skip eventPane backgroundColor test outside IE');
+            t.ok(true, 'Skip eventPane filter test outside IE');
+        }
+        map.destroy();
+    }
+
+    function test_Tile_Image_IFrame_createIFrame (t) {
+        t.plan( 8 );
+        
+        map   = new OpenLayers.Map('map');
+        layer = new OpenLayers.Layer.WMS.Post(name, wmsUrl, {layers: 'basic'}); 
+        map.addLayer(layer);  
+        var tile = new OpenLayers.Tile.Image.IFrame(layer, position, bounds, url, size);
+        var iFrame = tile.createIFrame();
+
+        var id = tile.id+'_iFrame';
+        t.eq(iFrame.id, id, "iframe id correctly set.");
+        t.eq(iFrame.name, id, "iframe name correctly set.");
+        
+        if(isIE) {
+            t.eq(iFrame.style.backgroundColor, '#ffffff', "backgroundColor correctly set.");
+            t.eq(iFrame.style.filter, 'chroma(color=#FFFFFF)', "filter correctly set.");
+        }
+        else {
+            t.eq(iFrame.style.backgroundColor, 'transparent', "backgroundColor correctly set.");
+            t.ok(true, "Skip filter test outside InternetExplorer.");
+        }
+        t.eq( iFrame.scrolling, 'no', "no scrolling");
+        t.eq( parseFloat(iFrame.marginWidth), 0, "no margin width");
+        t.eq( parseFloat(iFrame.marginHeight), 0, "no margin height");
+        t.eq( parseFloat(iFrame.frameBorder), 0, "no iframe border");
+    }
+
+    function test_Tile_Image_IFrame_createRequestForm (t) {
+        t.plan( 6 );
+
+        var tParams = {
+            SERVICE: "WMS", VERSION: "1.1.1",
+            REQUEST: "GetMap", STYLES: "",
+            EXCEPTIONS: "application/vnd.ogc.se_inimage", FORMAT: "image/jpeg",
+            SRS: "EPSG:4326", BBOX: [1,2,3,4],
+            WIDTH: String(size.w), HEIGHT: String(size.h)
+        };
+        var newLayer = new OpenLayers.Layer.WMS.Post("Name",
+                                         "http://labs.metacarta.com/TESTURL",
+                                         tParams,
+                                         {tileSize: size});  
+        map = new OpenLayers.Map('map'); 
+        map.addLayer(newLayer);  
+        tile = new OpenLayers.Tile.Image.IFrame(newLayer, position, bounds, url, size);
+        tile.initImgDiv();
+
+        var form = tile.createRequestForm();
+        if(isMozilla) {
+            t.ok( form instanceof HTMLElement, "created html form successfully.");
+        }
+        else {
+            t.ok( form != null, "created html form successfully.");
+        }
+
+        
+        var cacheId = newLayer.params["_OLSALT"];
+        cacheId     = (cacheId ? cacheId + "_" : "") + tile.bounds.toBBOX();
+        var url = OpenLayers.Util.urlAppend(newLayer.url, cacheId);
+
+        t.eq( form.method.toLowerCase(), 'post', "form method correctly set.");
+        t.eq( form.target, tile.id+'_iFrame', "form target correctly set.");
+        t.eq( form.action, url, "form action correctly set.");
+
+        var contain  = true;
+        var children = form.childNodes;
+        for(var par in newLayer.params) {
+            var test = false;
+            
+            for(var i=0; i<children.length; i++) {
+                if(children.item(i).name == par && children.item(i).value == newLayer.params[par]) {
+                    test = true;
+                    break;
+                }
+            }
+
+            if(test == false) {
+                contain = false;
+                break;
+            }
+
+        }
+        t.eq( contain, true, "html form elements equal layer's parameters.");
+
+        tile.draw();
+        tile.clear();
+        tile.createRequestForm();
+        t.ok(
+            tile.imgDiv.firstChild.nodeName == "IFRAME",
+            "Iframe has been reinserted properly"
+        );
+
+        map.destroy();
+    }
+</script>
+</head>
+<body>
+<div id="map" style="height:550px;width:500px"></div>
+</body>
+</html>
diff --git a/tests/Tile/WFS.html b/tests/Tile/WFS.html
new file mode 100644
index 0000000..c0b57c9
--- /dev/null
+++ b/tests/Tile/WFS.html
@@ -0,0 +1,173 @@
+<html>
+<head>
+  <script src="../../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var tile; 
+    
+    function test_Tile_WFS_constructor (t) {
+        t.plan( 8 );
+     
+        var layer = {}; // bogus layer
+        var position = new OpenLayers.Pixel(10,20);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "bobob";
+        var size = new OpenLayers.Size(5,6);
+        
+        tile = new OpenLayers.Tile.WFS(layer, position, bounds, url, size);
+
+        t.ok( tile instanceof OpenLayers.Tile.WFS, "new OpenLayers.Tile.WFS returns Tile.WFS object" );
+        t.eq( tile.layer, layer, "tile.layer set correctly");
+        t.ok( tile.position.equals(position), "tile.position set correctly");
+        t.ok( tile.bounds.equals(bounds), "tile.bounds set correctly");
+        t.eq( tile.url, url, "tile.url set correctly");        
+        t.ok( tile.size.equals(size), "tile.size is set correctly" );
+
+        t.ok( tile.id != null, "tile is given an id");
+        t.ok( tile.events != null, "tile's events intitialized");
+    }
+
+    function test_Tile_WFS_requestSuccess(t) {
+        t.plan(2);
+
+        var tile = {
+            'request': {}
+        };
+            
+        OpenLayers.Tile.WFS.prototype.requestSuccess.apply(tile, []);
+        
+        t.ok(tile.request == null, "request property on tile set to null");
+
+        var layer = {
+            SUPPORTED_TRANSITIONS: [],
+            events: {
+                unregister: function() {}
+            }
+        }; // bogus layer
+        var position = new OpenLayers.Pixel(10,20);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "bobob";
+        var size = new OpenLayers.Size(5,6);
+        
+        tile = new OpenLayers.Tile.WFS(layer, position, bounds, url, size);
+        tile.destroy();
+        tile.requestSuccess({'requestText': '<xml><foo /></xml>'});
+        t.ok(true, "Didn't fail after calling requestSuccess on destroyed tile.");
+        
+    }
+    
+    function test_Tile_WFS_loadFeaturesForRegion(t) {
+        t.plan(9);
+        
+        var tile = {
+            'url': {}
+        };
+
+        var g_Success = {};        
+
+        var _get = OpenLayers.Request.GET;
+        OpenLayers.Request.GET = function(config) {
+            t.ok(config.url == tile.url, "tile's url correctly passed");
+            t.ok(config.params == null, "null params");
+            t.ok(config.scope == tile, "tile passed as scope");
+            t.ok(config.success == g_Success, "success passed");
+        };
+        
+      //no running request -- 4 tests
+        OpenLayers.Tile.WFS.prototype.loadFeaturesForRegion.apply(tile, [g_Success]);
+
+      //running request (cancelled) -- 4 tests + 1 test (for request abort)
+        tile.request = {
+            'abort': function() {
+                    t.ok(true, "request aborted");
+            }
+        };
+        OpenLayers.Tile.WFS.prototype.loadFeaturesForRegion.apply(tile, [g_Success]);
+
+        OpenLayers.Request.GET = _get;
+    }
+    
+    function test_Tile_WFS_destroy(t) {
+        t.plan(9);
+
+        var layer = {
+            SUPPORTED_TRANSITIONS: [],
+            events: {
+                unregister: function() {}
+            }
+        }; // bogus layer
+        var position = new OpenLayers.Pixel(10,20);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "bobob";
+        var size = new OpenLayers.Size(5,6);
+        
+        tile = new OpenLayers.Tile.WFS(layer, position, bounds, url, size);
+        tile.events.destroy = function() {
+            t.ok(true, "tile events destroy() called");
+        };
+
+ 
+        var _gAbort = false; 
+        tile.request = { 
+            abort: function() { 
+                _gAbort = true; 
+            } 
+        } 
+
+        
+        tile.destroy();
+
+        t.ok(tile.layer == null, "tile.layer set to null");
+        t.ok(tile.bounds == null, "tile.bounds set to null");
+        t.ok(tile.size == null, "tile.size set to null");
+        t.ok(tile.position == null, "tile.position set to null");
+        t.ok(_gAbort, "request transport is aborted");
+        t.ok(tile.request == null, "tile.request set to null");
+        
+        t.ok(tile.events == null, "tile.events set to null");
+        
+        tile.requestSuccess({'requestText': '<xml><foo /></xml>'});
+        t.ok(true, "Didn't fail after calling requestSuccess on destroyed tile.");
+    }
+    function test_nonxml_format(t) {
+        t.plan(1);
+        var data = '{"type":"Feature", "id":"OpenLayers.Feature.Vector_135", "properties":{}, "geometry":{"type":"Point", "coordinates":[118.125, -18.6328125]}, "crs":{"type":"OGC", "properties":{"urn":"urn:ogc:def:crs:OGC:1.3:CRS84"}}}'
+        var position = new OpenLayers.Pixel(10,20);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "bobob";
+        var size = new OpenLayers.Size(5,6);
+        
+        var tile = new OpenLayers.Tile.WFS({
+            vectorMode: true, 
+            formatObject: new OpenLayers.Format.GeoJSON(), 
+            addFeatures: function(features) { 
+                t.eq(features.length, 1, "GeoJSON format returned a single feature which was added.")
+            }
+        }, position, bounds, url, size);
+        tile.requestSuccess({responseText: data});
+    }  
+     
+    function test_xml_string_and_dom(t) {
+        t.plan(2);
+        var data = '<?xml version="1.0" encoding="ISO-8859-1" ?><wfs:FeatureCollection   xmlns:bsc="http://www.bsc-eoc.org/bsc"   xmlns:wfs="http://www.opengis.net/wfs"   xmlns:gml="http://www.opengis.net/gml"   xmlns:ogc="http://www.opengis.net/ogc"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-basic.xsd                        http://www.bsc-eoc.org/bsc http://www.bsc-eoc.org/cgi- [...]
+        var position = new OpenLayers.Pixel(10,20);
+        var bounds = new OpenLayers.Bounds(1,2,3,4);
+        var url = "bobob";
+        var size = new OpenLayers.Size(5,6);
+        var tile = new OpenLayers.Tile.WFS({
+        }, position, bounds, url, size);
+        tile.addResults = function(results) {
+            t.eq(results.length, 1, "results count is correct when passing in XML as a string into non-vectormode");
+        } 
+        tile.requestSuccess({responseText: data});
+        
+        tile.addResults = function(results) {
+            t.eq(results.length, 1, "results count is correct when passing in XML as DOM into non-vectormode");
+        } 
+        tile.requestSuccess({responseXML: OpenLayers.Format.XML.prototype.read(data)}); 
+    }         
+  </script>
+</head>
+<body>
+</body>
+</html>
+
diff --git a/tests/Tween.html b/tests/Tween.html
new file mode 100644
index 0000000..be159a7
--- /dev/null
+++ b/tests/Tween.html
@@ -0,0 +1,68 @@
+<html> 
+<head> 
+    <script src="../lib/OpenLayers.js"></script> 
+    <script type="text/javascript">
+
+    function test_Tween_constructor(t) { 
+        t.plan(3);
+        
+        var tween = new OpenLayers.Tween();
+        t.ok(tween instanceof OpenLayers.Tween, 
+             "new OpenLayers.Tween returns object" );
+        t.eq(typeof tween.easing, "function", 
+            "constructor sets easing correctly"); 
+        t.eq(typeof tween.start, "function", "tween has a start function"); 
+    }
+    
+    function test_Tween_start(t) {
+        t.plan(5);
+        
+        var tween = new OpenLayers.Tween();
+
+        var start = {foo: 0, bar: 10};
+        var finish = {foo: 10, bar: 0};
+        var _start = false;
+        var _done = false;
+        var _eachStep = false;
+        var callbacks = {
+            start: function() {
+                _start = true;
+            },
+            done: function() {
+                _done = true;
+            },
+            eachStep: function() {
+                _eachStep = true;
+            }
+        }
+        tween.start(start, finish, 10, {callbacks: callbacks});
+        t.ok(tween.interval != null, "interval correctly set");
+        t.delay_call(0.8, function() {
+            t.eq(_start, true, "start callback called");
+            t.eq(_done, true, "finish callback called");
+            t.eq(_eachStep, true, "eachStep callback called");
+            t.eq(tween.time, 11, "Number of steps reached is correct");
+        });
+    }
+
+    function test_Tween_stop(t) {
+        t.plan(2);
+        
+        var tween = new OpenLayers.Tween();
+        tween.interval = window.setInterval(function() {}, 10);
+        tween.playing = true;
+        tween.stop();
+        t.eq(tween.interval, null, "tween correctly stopped");
+        
+        tween.interval = window.setInterval(function() {}, 10);
+        tween.playing = false;
+        tween.stop();
+        t.ok(tween.interval != null, "stop method doesn't do anything if tween isn't running");
+    }
+
+    </script> 
+</head> 
+<body> 
+  <div id="map" style="width:500px;height:500px"></div>
+</body> 
+</html> 
diff --git a/tests/Util.html b/tests/Util.html
new file mode 100644
index 0000000..a79ff2e
--- /dev/null
+++ b/tests/Util.html
@@ -0,0 +1,1083 @@
+<html>
+<head>
+  <script>
+    var custom$ = function() {};
+    window.$ = custom$;
+  </script>
+  <script src="../lib/OpenLayers.js"></script>
+  <script type="text/javascript">
+    var isMozilla = (navigator.userAgent.indexOf("compatible") == -1);
+    var map; 
+
+    function test_isElement(t) {
+        t.plan(3);
+
+        // set up
+        var o;
+
+        // tests
+        o = {};
+        t.eq(OpenLayers.Util.isElement(o), false,
+             "isElement reports that {} isn't an Element");
+        o = document.createElement("div");
+        t.eq(OpenLayers.Util.isElement(o), true,
+             "isElement reports that object returned by createElement is an Element");
+        o = OpenLayers.Util.getElement("map");
+        t.eq(OpenLayers.Util.isElement(o), true,
+             "isElement reports that object returned by getElement is an Element");
+    }
+    
+    function test_$(t) {
+        t.plan(1);
+        t.ok($ === custom$, "OpenLayers doesn't clobber existing definition of $.");
+    }
+    
+    function test_Util_getImagesLocation (t) {
+        t.plan( 1 );
+        t.ok( OpenLayers.Util.getImagesLocation(), "../img/",
+                    "getImagesLocation()" );
+    }
+
+    function test_Util_IndexOf(t) {
+        t.plan( 3 );
+        var array = new Array(1, "bar");
+        t.eq(OpenLayers.Util.indexOf(array, 1), 0);
+        t.eq(OpenLayers.Util.indexOf(array, "bar"), 1);
+        t.eq(OpenLayers.Util.indexOf(array, "foo"), -1);
+    }
+
+    function test_Util_Array(t) {
+        t.plan( 2 );
+
+        var array = new Array(1,2,3,4,4,5);
+
+        OpenLayers.Util.removeItem(array, 3);
+        t.eq( array.toString(), "1,2,4,4,5", "Util.removeItem works on one element");    
+        OpenLayers.Util.removeItem(array, 4);
+        t.eq( array.toString(), "1,2,5", "Util.removeItem works on more than one element ");    
+    }
+    
+    function test_Util_pagePosition(t) {
+        t.plan( 1 );
+        var pp = OpenLayers.Util.pagePosition(window);
+        t.eq( pp.toString(), "0,0", "Page position doesn't bail if passed 'window'")
+        
+    }
+
+    function test_Util_createDiv(t) {
+        t.plan( 24 );
+
+        var id = "boo";
+        var px = new OpenLayers.Pixel(5,5);
+        var sz = new OpenLayers.Size(10,10);
+        var img = "http://www.openlayers.org/images/OpenLayers.trac.png";
+        var position = "absolute";
+        var border = "13px solid";
+        var overflow = "hidden";
+        var opacity = 0.5;
+
+        var div = OpenLayers.Util.createDiv(id, px, sz, img, position, border, overflow, opacity);
+
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( div instanceof HTMLDivElement, "createDiv creates a valid HTMLDivElement" );
+        t.eq( div.id, id, "div.id set correctly");    
+        t.eq( div.style.left, px.x + "px", "div.style.left set correctly");    
+        t.eq( div.style.top, px.y + "px", "div.style.top set correctly");    
+
+        t.eq( div.style.width, sz.w + "px", "div.style.width set correctly");    
+        t.eq( div.style.height, sz.h + "px", "div.style.height set correctly");    
+
+        bImg = div.style.backgroundImage;
+        imgCorrect = ( (bImg == "url(" + img + ")") ||  
+                       (bImg == "url(\"" + img + "\")") );
+        t.ok(imgCorrect, "div.style.backgroundImage correctly");    
+
+        t.eq( div.style.position, position, "div.style.positionset correctly");    
+        //Safari 3 separates the border style into separate entities when reading it
+        if (OpenLayers.Util.getBrowserName() == 'safari') {
+          var s = border.split(' ');
+          t.ok(div.style.borderTopWidth == s[0] && div.style.borderTopStyle == s[1], "good default popup.border")
+        } else {
+          t.ok( (div.style.border.indexOf(border) != -1), "div.style.border set correctly");
+        }
+            
+        //Safari 3 separates style overflow into overflow-x and overflow-y
+        var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+        t.eq( div.style[prop], overflow, "div.style.overflow set correctly");    
+        t.eq( parseFloat(div.style.opacity), opacity, "element.style.opacity set correctly");    
+        //Safari 3 returns null for this value, which is okay
+        var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        t.eq( div.style.filter, filterString, "element.style.filter set correctly");
+
+        //test defaults
+        var div = OpenLayers.Util.createDiv();
+
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( div instanceof HTMLDivElement, "createDiv creates a valid HTMLDivElement" );
+        t.ok( (div.id != ""), "div.id set correctly");    
+        t.eq(div.style.left, "", "div.style.left set correctly");    
+        t.eq(div.style.top, "", "div.style.top set correctly");    
+
+        t.eq( div.style.width, "", "div.style.width set correctly");    
+        t.eq( div.style.height, "", "div.style.height set correctly");    
+
+        t.eq(div.style.backgroundImage, "", "div.style.backgroundImage correctly");    
+
+        t.eq( div.style.position, "absolute", "div.style.positionset correctly");    
+        //Safari 3 separates the border style into separate entities when reading it
+        if (OpenLayers.Util.getBrowserName() == 'safari') {
+          t.ok(div.style.borderTopWidth == '' && div.style.borderTopStyle == '', "good default popup.border")
+        } else {
+          t.eq( div.style.border, "", "div.style.border set correctly");    
+        }
+        //Safari 3 separates style overflow into overflow-x and overflow-y
+        var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+        t.eq(div.style[prop], "", "div.style.overflow set correctly");    
+        t.ok( !div.style.opacity, "element.style.opacity set correctly");    
+        t.ok( !div.style.filter, "element.style.filter set correctly");
+
+    }
+
+    function test_Util_createImage(t) {
+        t.plan( 22 );
+
+        var img = "http://www.openlayers.org/images/OpenLayers.trac.png";
+        var sz = new OpenLayers.Size(10,10);
+        var xy = new OpenLayers.Pixel(5,5);
+        var position = "absolute";
+        var id = "boo";
+        var border = "1px solid";
+        var opacity = 0.5;
+
+        var image = OpenLayers.Util.createImage(id, xy, sz, img, position, border, opacity);
+
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( image.nodeName == "IMG", "createImage creates a valid HTMLImageElement" );
+        t.eq( image.id, id, "image.id set correctly");    
+        t.eq( image.style.left, xy.x + "px", "image.style.left set correctly");    
+        t.eq( image.style.top, xy.y + "px", "image.style.top set correctly");    
+
+        t.eq( image.style.width, sz.w + "px", "image.style.width set correctly");    
+        t.eq( image.style.height, sz.h + "px", "image.style.height set correctly");    
+
+        //Safari 3 separates the border style into separate entities when reading it
+        if (OpenLayers.Util.getBrowserName() == 'safari') {
+          var s = border.split(' ');
+          t.ok(image.style.borderTopWidth == s[0] && image.style.borderTopStyle == s[1], "good default popup.border")
+        } else {
+          t.ok( (image.style.border.indexOf(border) != -1), "image.style.border set correctly");
+        }
+        t.eq( image.src, img, "image.style.backgroundImage correctly");    
+        t.eq( image.style.position, position, "image.style.position set correctly");    
+        t.eq( parseFloat(image.style.opacity), opacity, "image.style.opacity set correctly");    
+        //Safari 3 returns null for this value, which is okay
+        var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        t.eq( image.style.filter, filterString, "element.style.filter set correctly");
+
+        //test defaults
+        var image = OpenLayers.Util.createImage();
+
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( image.nodeName == "IMG", "createDiv creates a valid HTMLDivElement" );
+        t.ok( (image.id != ""), "image.id set to something");    
+        t.eq( image.style.left, "", "image.style.left set correctly");    
+        t.eq( image.style.top, "", "image.style.top set correctly");    
+
+        t.eq( image.style.width, "", "image.style.width set correctly");    
+        t.eq( image.style.height, "", "image.style.height set correctly");    
+
+        t.ok((image.style.border == ""), "image.style.border set correctly");    
+        t.eq(image.src, "", "image.style.backgroundImage correctly");    
+        t.eq( image.style.position, "relative", "image.style.positionset correctly");    
+        t.ok( !image.style.opacity, "element.style.opacity default unset");    
+        t.ok( !image.style.filter, "element.style.filter default unset");
+
+    }
+
+    function test_Util_imageLoadError(t) {
+        t.plan(2);
+
+        var img = OpenLayers.Util.createImage(null, null, null, null, null, null, null, false);
+
+        // mock up image load failure
+        img._attempts = OpenLayers.IMAGE_RELOAD_ATTEMPTS + 1;
+        OpenLayers.Util.onImageLoadError.call(img);
+        t.ok(OpenLayers.Element.hasClass(img, 'olImageLoadError'), 'broken image has class olImageLoadError');
+
+        // mock up image load success
+        OpenLayers.Util.onImageLoad.call(img);
+        t.ok(!OpenLayers.Element.hasClass(img, 'olImageLoadError'), 'good image does not have class olImageLoadError');
+    }
+
+    function test_Util_applyDefaults(t) {
+    
+        t.plan(12);
+        
+        var to = { 
+            'a': "abra",
+            'b': "blorg",
+            'n': null
+        };
+
+        var from = { 
+            'b': "zoink",
+            'c': "press",
+            'toString': function() {return 'works'},
+            'n': "broken"
+        };
+
+        OpenLayers.Util.applyDefaults(to, from);
+
+        t.ok( to instanceof Object, " applyDefaults returns an object");
+        t.eq( to["a"], "abra", "key present in to but not from maintained");
+        t.eq( to["b"], "blorg", "key present in to and from, maintained in to");
+        t.eq( to["c"], "press", "key present in from and not to successfully copied to to");
+
+        var ret = OpenLayers.Util.applyDefaults({'a': "abra",'b': "blorg"}, from);
+        t.ok( ret instanceof Object, " applyDefaults returns an object");
+        t.eq( ret["a"], "abra", "key present in ret but not from maintained");
+        t.eq( ret["b"], "blorg", "key present in ret and from, maintained in ret");
+        t.eq( ret["c"], "press", "key present in from and not ret successfully copied to ret");
+        t.eq(to.toString(), "works", "correctly applies custom toString");
+        t.eq(to.n, null, "correctly preserves null");
+        
+        var to;
+        var from = {rand: Math.random()};
+        
+        var ret = OpenLayers.Util.applyDefaults(to, from);
+        t.eq(ret.rand, from.rand, "works with undefined to");
+
+        //regression test for #1716 -- allow undefined from
+        try {
+            OpenLayers.Util.applyDefaults({}, undefined);
+            t.ok(true, "no exception thrown when from is undefined");
+        } catch(err) {
+            t.fail("exception thrown when from is undefined:" + err);
+        }
+
+    }
+
+    function test_Util_getParameterString(t) {
+        t.plan(6);
+
+        var params = { 
+            'foo': "bar",
+            'chicken': 1.5
+        };
+
+        t.eq( OpenLayers.Util.getParameterString(params), "foo=bar&chicken=1.5", "getParameterString returns correctly");    
+        t.eq( OpenLayers.Util.getParameterString({'a:':'b='}), "a%3A=b%3D", "getParameterString returns correctly with non-ascii keys/values");    
+        
+        t.eq(OpenLayers.Util.getParameterString({chars: "~!*()'"}), "chars=~!*()'", "~!*()' are unreserved or have no reserved purpose in a URI component");
+        
+
+        // Parameters which are a list should end up being a comma-seperated
+        // list of the URL encoded strings
+        var params = { foo: ["bar,baz"] };
+        t.eq( OpenLayers.Util.getParameterString(params), "foo=bar%2Cbaz", "getParameterString encodes , correctly in arrays");    
+        
+        var params = { foo: ["bar","baz,"] };
+        t.eq( OpenLayers.Util.getParameterString(params), "foo=bar,baz%2C", "getParameterString returns with list of CSVs when given a list. ");
+        
+        var params = { foo: [null, undefined, 0, "", "bar"] }
+        t.eq( OpenLayers.Util.getParameterString(params), "foo=,,0,,bar", "getParameterString works fine with null values in array.");
+    }
+    
+    function test_Util_urlAppend(t) {
+
+        var params = "foo=bar";
+        
+        t.plan( 7 );
+
+  // without ?        
+        var url = "http://octo.metacarta.com/cgi-bin/mapserv";
+        var str = OpenLayers.Util.urlAppend(url, params);
+        t.eq(str, url + '?' + params, "urlAppend() works for url sans ?");
+
+
+  // with ?        
+        url = "http://octo.metacarta.com/cgi-bin/mapserv?";
+        str = OpenLayers.Util.urlAppend(url, params);
+        t.eq(str, url + params, "urlAppend() works for url with ?");
+
+  // with ?param1=5
+        url = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5";
+        str = OpenLayers.Util.urlAppend(url, params);
+        t.eq(str, url + '&' + params, "urlAppend() works for url with ?param1=5");
+  
+  // with ?param1=5&
+        url = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&";
+        str = OpenLayers.Util.urlAppend(url, params);
+        t.eq(str, url + params, "urlAppend() works for url with ?param1=5&");
+ 
+  // with ?param1=5&param2=6
+        url = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5&param2=6";
+        str = OpenLayers.Util.urlAppend(url, params);
+        t.eq(str, url + "&" + params, "urlAppend() works for url with ?param1=5&param2=6");
+        
+  // with empty paramStr
+        url = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5"
+        str = OpenLayers.Util.urlAppend(url, "");
+        t.eq(str, url, "urlAppend() works with empty paramStr")
+
+  // with null paramStr
+        url = "http://octo.metacarta.com/cgi-bin/mapserv?param1=5"
+        str = OpenLayers.Util.urlAppend(url, null);
+        t.eq(str, url, "urlAppend() works with null paramStr")
+    }
+
+    function test_Util_createAlphaImageDiv(t) {
+        t.plan( 19 );
+
+        var img = "http://www.openlayers.org/images/OpenLayers.trac.png";
+        var sz = new OpenLayers.Size(10,10);
+        var xy = new OpenLayers.Pixel(5,5);
+        var position = "absolute";
+        var id = "boo";
+        var border = "1px solid";
+        var sizing = "crop";
+        var opacity = 0.5;
+
+        var imageDiv = OpenLayers.Util.createAlphaImageDiv(id, xy, sz, img, position, border, sizing, opacity);
+
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( imageDiv instanceof HTMLDivElement, "createDiv creates a valid HTMLDivElement" );
+
+        t.eq( imageDiv.id, id, "image.id set correctly");    
+        t.eq( imageDiv.style.left, xy.x + "px", "image.style.left set correctly");    
+        t.eq( imageDiv.style.top, xy.y + "px", "image.style.top set correctly");    
+
+        t.eq( imageDiv.style.width, sz.w + "px", "image.style.width set correctly");    
+        t.eq( imageDiv.style.height, sz.h + "px", "image.style.height set correctly");    
+
+        t.eq( imageDiv.style.position, position, "image.style.positionset correctly");    
+        t.eq( parseFloat(imageDiv.style.opacity), opacity, "element.style.opacity set correctly");    
+        
+        var filterString;
+        if (OpenLayers.Util.alphaHack()) {
+            filterString = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://www.openlayers.org/images/OpenLayers.trac.png', sizingMethod='crop') alpha(opacity=50)";
+        } else {
+            //Safari 3 returns null for this value, which is okay
+            var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        }        
+        t.eq( imageDiv.style.filter, filterString, "element.style.filter set correctly");
+
+
+        image = imageDiv.firstChild;
+        if (!isMozilla)
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( image.nodeName == "IMG", "createImage creates a valid HTMLImageElement" );
+        t.eq( image.id, id + "_innerImage", "image.id set correctly");    
+
+        t.eq( image.style.width, sz.w + "px", "image.style.width set correctly");    
+        t.eq( image.style.height, sz.h + "px", "image.style.height set correctly");    
+
+        //Safari 3 separates the border style into separate entities when reading it
+        if (OpenLayers.Util.getBrowserName() == 'safari') {
+          var s = border.split(' ');
+          t.ok(image.style.borderTopWidth == s[0] && image.style.borderTopStyle == s[1], "good default popup.border")
+        } else {
+          t.ok( (image.style.border.indexOf(border) != -1), "image.style.border set correctly");
+        }
+        
+        t.eq( image.style.position, "relative", "image.style.positionset correctly");    
+
+        if (OpenLayers.Util.alphaHack()) {
+        
+            t.eq(imageDiv.style.display, "inline-block", "imageDiv.style.display set correctly");
+
+            var filter = "progid:DXImageTransform.Microsoft" +
+                         ".AlphaImageLoader(src='" + img + "', " +
+                         "sizingMethod='" + sizing + "') alpha(opacity=50)";
+            t.eq(imageDiv.style.filter, filter, "div filter value correctly set");
+
+            filter = "alpha(opacity=0)";
+            t.eq(image.style.filter, filter, "image filter set correctly");
+
+        } else {
+            t.eq( image.src, img, "image.style.backgroundImage correctly");    
+            t.ok(true, "div filter value not set (not in IE)");
+            t.ok(true, "image filter value not set (not in IE)");
+        }
+
+        var imageDiv = OpenLayers.Util.createAlphaImageDiv(id, xy, sz, img, position, border);
+        if (OpenLayers.Util.alphaHack()) {
+            var filter = "progid:DXImageTransform.Microsoft" +
+                         ".AlphaImageLoader(src='" + img + "', " +
+                         "sizingMethod='scale')";
+            t.eq(imageDiv.style.filter, filter, "sizingMethod default correctly set to scale");
+        } else {
+            t.ok(true);
+        }        
+
+    }
+
+    function test_Util_modifyDOMElement_opacity(t) {
+        t.plan(8);
+
+        var opacity = 0.2;
+
+        var element = document.createElement("div");
+
+        OpenLayers.Util.modifyDOMElement(element, null, null, null, null, 
+                                         null, null, opacity);
+
+        t.eq(parseFloat(element.style.opacity), opacity, 
+             "element.style.opacity set correctly when opacity = " + opacity);
+        //Safari 3 returns null for this value, which is okay
+        var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        t.eq(element.style.filter, filterString, 
+             "element.style.filter set correctly when opacity = " + opacity);
+
+        OpenLayers.Util.modifyDOMElement(element, null, null, null, null, 
+                                         null, null, "5");
+    
+        t.eq(parseFloat(element.style.opacity), opacity, 
+             "element.style.opacity not changed if the value is incorrect");
+        //Safari 3 returns null for this value, which is okay
+        var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        t.eq(element.style.filter, filterString, 
+             "element.style.filter not changed if the value is incorrect");
+
+        OpenLayers.Util.modifyDOMElement(element, null, null, null, null, 
+                                         null, null, "hello");
+    
+        t.eq(parseFloat(element.style.opacity), opacity, 
+             "element.style.opacity not changed if the value is incorrect");
+        //Safari 3 returns null for this value, which is okay
+        var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        t.eq(element.style.filter, filterString, 
+             "element.style.filter not changed if the value is incorrect");
+
+        opacity = 1.00;
+        OpenLayers.Util.modifyDOMElement(element, null, null, null, null, 
+                                         null, null, opacity);
+
+        t.eq(element.style.opacity, '', 
+             "element.style.opacity is removed when opacity = " + opacity);
+        //Safari 3 returns null for this value, which is okay
+        var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : '';
+        t.eq(element.style.filter, filterString, 
+             "element.style.filter is removed when opacity = " + opacity);
+    }
+
+    function test_Util_modifyDOMElement(t) {
+        t.plan( 10 );
+
+        var id = "boo";
+        var px = new OpenLayers.Pixel(5,5);
+        var sz = new OpenLayers.Size(10,10);
+        var position = "absolute";
+        var border = "1px solid";
+        var overflow = "hidden";
+        var opacity = 1/2;
+
+        var element = document.createElement("div");
+
+        OpenLayers.Util.modifyDOMElement(element, id, px, sz, position, 
+                                         border, overflow, opacity);
+
+        t.eq( element.id, id, "element.id set correctly");    
+        t.eq( element.style.left, px.x + "px", "element.style.left set correctly");    
+        t.eq( element.style.top, px.y + "px", "element.style.top set correctly");    
+
+        t.eq( element.style.width, sz.w + "px", "element.style.width set correctly");    
+        t.eq( element.style.height, sz.h + "px", "element.style.height set correctly");    
+
+        t.eq( element.style.position, position, "element.style.position set correctly");    
+        //Safari 3 separates the border style into separate entities when reading it
+        if (OpenLayers.Util.getBrowserName() == 'safari') {
+          var s = border.split(' ');
+          t.ok(element.style.borderTopWidth == s[0] && element.style.borderTopStyle == s[1], "good default popup.border")
+        } else {
+          t.ok( (element.style.border.indexOf(border) != -1), "element.style.border set correctly");
+        }
+        //Safari 3 separates style overflow into overflow-x and overflow-y
+        var prop = (OpenLayers.Util.getBrowserName() == 'safari') ? 'overflowX' : 'overflow';
+        t.eq( element.style[prop], overflow, "element.style.overflow set correctly");    
+        t.eq( parseFloat(element.style.opacity), opacity, "element.style.opacity set correctly");    
+        //Safari 3 returns null for this value, which is okay
+        var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+        t.eq( element.style.filter, filterString, "element.style.filter set correctly");
+    }
+
+    function test_Util_modifyAlphaImageDiv(t) {
+        t.plan( 21 );
+
+        var imageDiv = OpenLayers.Util.createAlphaImageDiv();
+
+        var img = "http://www.openlayers.org/images/OpenLayers.trac.png";
+        var sz = new OpenLayers.Size(10,10);
+        var xy = new OpenLayers.Pixel(5,5);
+        var position = "absolute";
+        var id = "boo";
+        var border = "1px solid";
+        var sizing = "crop";
+        var opacity = 0.5;
+
+        OpenLayers.Util.modifyAlphaImageDiv(imageDiv, id, xy, sz, img, position, border, sizing, opacity);
+        if (OpenLayers.Util.alphaHack())
+            t.ok( true, "skipping element test outside of Mozilla");
+        else
+            t.ok( imageDiv.nodeName == "DIV", "createDiv creates a valid HTMLDivElement" );
+
+        t.eq( imageDiv.id, id, "image.id set correctly");    
+        t.eq( imageDiv.style.left, xy.x + "px", "image.style.left set correctly");    
+        t.eq( imageDiv.style.top, xy.y + "px", "image.style.top set correctly");    
+
+        t.eq( imageDiv.style.width, sz.w + "px", "image.style.width set correctly");    
+        t.eq( imageDiv.style.height, sz.h + "px", "image.style.height set correctly");    
+
+        t.eq( imageDiv.style.position, position, "image.style.position set correctly");    
+        t.eq( parseFloat(imageDiv.style.opacity), opacity, "element.style.opacity set correctly");    
+
+        
+
+        image = imageDiv.firstChild;
+
+        var filterString;
+        if (OpenLayers.Util.alphaHack()) {
+            filterString = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://www.openlayers.org/images/OpenLayers.trac.png', sizingMethod='crop') alpha(opacity=50)";
+            t.ok( true, "skipping element test outside of Mozilla");
+        } else {
+            //Safari 3 returns null for this value, which is okay
+            var filterString = (OpenLayers.Util.getBrowserName() == 'safari') ? null : 'alpha(opacity=' + (opacity * 100) + ')';
+            t.ok( image.nodeName == "IMG", "createImage creates a valid HTMLImageElement" );
+        }
+        t.eq( imageDiv.style.filter, filterString, "element.style.filter set correctly");
+        t.eq( image.id, id + "_innerImage", "image.id set correctly");    
+
+        t.eq( image.style.width, sz.w + "px", "image.style.width set correctly");    
+        t.eq( image.style.height, sz.h + "px", "image.style.height set correctly");    
+
+        //Safari 3 separates the border style into separate entities when reading it
+        if (OpenLayers.Util.getBrowserName() == 'safari') {
+          var s = border.split(' ');
+          t.ok(image.style.borderTopWidth == s[0] && image.style.borderTopStyle == s[1], "good default popup.border")
+        } else {
+          t.ok( (image.style.border.indexOf(border) != -1), "image.style.border set correctly");
+        }
+
+        t.eq( image.style.position, "relative", "image.style.positionset correctly");    
+        t.eq( image.src, img, "image.style.backgroundImage correctly");
+        
+        if (OpenLayers.Util.alphaHack()) {
+        
+            var filter = "progid:DXImageTransform.Microsoft" +
+                         ".AlphaImageLoader(src='" + img + "', " +
+                         "sizingMethod='" + sizing + "') alpha(opacity=" + opacity *100 + ")";
+            t.eq(imageDiv.style.filter, filter, "div filter value correctly set");
+
+            filter = "alpha(opacity=0)";
+            t.eq(image.style.filter, filter, "image filter set correctly");
+
+        } else {  
+            t.ok(true, "div filter value not set (not in IE)");
+            t.ok(true, "image filter value not set (not in IE)");
+        }
+
+        var imageDiv = OpenLayers.Util.createAlphaImageDiv();
+        var display = "none";
+        imageDiv.style.display = display;
+        OpenLayers.Util.modifyAlphaImageDiv(imageDiv, id, xy, sz, img, position, border, sizing, opacity);
+        t.eq(imageDiv.style.display, display, "imageDiv.style.display set correctly, if 'none'");
+
+        var imageDiv = OpenLayers.Util.createAlphaImageDiv();
+        var display = "block";
+        imageDiv.style.display = display;
+        OpenLayers.Util.modifyAlphaImageDiv(imageDiv, id, xy, sz, img, position, border, sizing, opacity);
+        if(OpenLayers.Util.alphaHack()) {
+            t.eq(imageDiv.style.display, "inline-block", "imageDiv.style.display set correctly, if not 'none'");
+        } else {
+            t.ok(true, "inline-block is not part of CSS2 and is not supported by Firefox 2");
+        }
+
+        
+
+        var imageDiv = OpenLayers.Util.createAlphaImageDiv(id, xy, sz, img, position, border, "scale", opacity);
+        if (OpenLayers.Util.alphaHack()) {
+            var filter = "progid:DXImageTransform.Microsoft" +
+                         ".AlphaImageLoader(src='" + img + "', " +
+                         "sizingMethod='scale') alpha(opacity=" + opacity *100 + ")";
+            t.eq(imageDiv.style.filter, filter, "sizingMethod default correctly set to scale");
+        } else {
+            t.ok(true);
+        }        
+   
+    }
+       
+    function test_Util_upperCaseObject(t) {
+        t.plan(8);
+        
+        var aKey = "chicken";
+        var aValue = "pot pie";
+
+        var bKey = "blorg";
+        var bValue = "us maximus";
+        
+        var obj = {};
+        obj[aKey] = aValue;        
+        obj[bKey] = bValue;        
+             
+        var uObj = OpenLayers.Util.upperCaseObject(obj);          
+
+        //make sure old object not modified
+        t.eq(obj[aKey], aValue, "old lowercase value still present in old obj");
+        t.eq(obj[bKey], bValue, "old lowercase value still present in old obj");
+
+        t.eq(obj[aKey.toUpperCase()], null, "new uppercase value not present in old obj");
+        t.eq(obj[bKey.toUpperCase()], null, "new uppercase value not present in old obj");
+
+        //make sure new object modified
+        t.eq(uObj[aKey], null, "old lowercase value not present");
+        t.eq(uObj[bKey], null, "old lowercase value not present");
+
+        t.eq(uObj[aKey.toUpperCase()], aValue, "new uppercase value present");
+        t.eq(uObj[bKey.toUpperCase()], bValue, "new uppercase value present");
+    }
+    
+    function test_Util_createUniqueID(t) {
+        t.plan(2);
+        
+        var id = OpenLayers.Util.createUniqueID();
+        t.ok(OpenLayers.String.startsWith(id, "id_"),
+             "default OpenLayers.Util.createUniqueID starts id correctly");
+
+        var id = OpenLayers.Util.createUniqueID("chicken");
+        t.ok(OpenLayers.String.startsWith(id, "chicken"),
+             "OpenLayers.Util.createUniqueID starts id correctly");
+    }
+        
+    function test_Util_normalizeScale(t) {
+        t.plan(2); 
+        
+        //normal scale
+        var scale = 1/5;
+        t.eq( OpenLayers.Util.normalizeScale(scale), scale, "normalizing a normal scale does nothing");
+
+        //funky scale
+        var scale = 5;
+        t.eq( OpenLayers.Util.normalizeScale(scale), 1/5, "normalizing a wrong scale works!");
+    }
+    
+    function test_Util_getScaleResolutionTranslation(t) {
+        t.plan(5); 
+        
+        var scale = 1/150000000; 
+        var resolution = OpenLayers.Util.getResolutionFromScale(scale);
+        t.eq(resolution.toFixed(6), "0.476217", "Calculated correct resolution for " + scale);
+
+        var scale = 1/150000000; 
+        var resolution = OpenLayers.Util.getResolutionFromScale(scale, 'm');
+        t.eq(resolution.toFixed(6), "52916.638092", "Calculated correct resolution for " + scale);
+
+        scale = 150000000; 
+        resolution = OpenLayers.Util.getResolutionFromScale(scale);
+        t.eq(resolution.toFixed(6), "0.476217", "Calculated correct resolution for " + scale);
+
+        scale = 150000000; 
+        resolution = OpenLayers.Util.getResolutionFromScale(scale);
+        t.eq(OpenLayers.Util.getScaleFromResolution(resolution), scale, "scale->resolution->scale works");
+        
+        scale = null;
+        resolution = OpenLayers.Util.getResolutionFromScale(scale);
+        t.eq(resolution, undefined, "falsey scale results in undefined resolution");
+        
+    }
+    
+    function test_Util_getImgLocation(t) {
+        t.plan(3);
+
+        OpenLayers.ImgPath = "foo/";
+        t.eq(OpenLayers.Util.getImagesLocation(), "foo/", "ImgPath works as expected."); 
+        OpenLayers.ImgPath = null;
+        t.eq(OpenLayers.Util.getImagesLocation().substr(OpenLayers.Util.getImagesLocation().length-4,4), "img/", "ImgPath works as expected when not set."); 
+
+        OpenLayers.ImgPath = '';
+        t.eq(OpenLayers.Util.getImagesLocation().substr(OpenLayers.Util.getImagesLocation().length-4,4), "img/", "ImgPath works as expected when set to ''."); 
+    }
+
+    function test_Util_isEquivalentUrl(t) {
+        t.plan(9);
+        
+        var url1, url2, options;
+
+  //CASE
+
+        url1 = "http://www.openlayers.org";
+        url2 = "HTTP://WWW.OPENLAYERS.ORG";
+
+        t.ok(OpenLayers.Util.isEquivalentUrl(url1, url2), "default ignoreCase works"); 
+
+  //ARGS
+
+        url1 = "http://www.openlayers.org?foo=5;bar=6";
+        url2 = "http://www.openlayers.org?bar=6;foo=5";
+
+        t.ok(OpenLayers.Util.isEquivalentUrl(url1, url2), "shuffled arguments works"); 
+
+  //PORT
+
+        url1 = "http://www.openlayers.org:80";
+        url2 = "http://www.openlayers.org";
+
+        t.ok(OpenLayers.Util.isEquivalentUrl(url1, url2), "default ignorePort80 works"); 
+
+        options = {
+            'ignorePort80': false
+        }        
+        url1 = "http://www.openlayers.org:80";
+        url2 = "http://www.openlayers.org:50";
+
+        t.ok(!OpenLayers.Util.isEquivalentUrl(url1, url2, options), "port check works"); 
+
+
+  //HASH
+
+        url1 = "http://www.openlayers.org#barf";
+        url2 = "http://www.openlayers.org";
+
+        t.ok(OpenLayers.Util.isEquivalentUrl(url1, url2), "default ignoreHash works"); 
+        options = {
+            'ignoreHash': false
+        }        
+        t.ok(!OpenLayers.Util.isEquivalentUrl(url1, url2, options), "ignoreHash FALSE works"); 
+
+  //PROTOCOL
+
+        url1 = "http://www.openlayers.org";
+        url2 = "ftp://www.openlayers.org";
+
+        t.ok(!OpenLayers.Util.isEquivalentUrl(url1, url2), "default ignoreHash works"); 
+
+
+  //PATHNAME
+        url1 = "foo.html?bar=now#go";
+        url2 = "../tests/../tests/foo.html?bar=now#go";
+
+        t.ok(OpenLayers.Util.isEquivalentUrl(url1, url2), "relative vs. absolute paths works");
+        
+        url1 = "/foo/bar";
+        url2 = new Array(window.location.pathname.split("/").length-1).join("../")+"foo/bar";
+        
+        t.ok(OpenLayers.Util.isEquivalentUrl(url1, url2), "absolute and relative path without host works for "+url2) 
+    }
+    
+    function test_createUrlObject(t) {
+        
+        var cases = [{
+            url: "http://example.com/",
+            exp: {
+                protocol: "http:",
+                host: "example.com",
+                port: "80",
+                pathname: "/",
+                args: {},
+                hash: ""
+            }
+        }, {
+            url: "http://example.com:80/",
+            opt: {ignorePort80: true},
+            exp: {
+                protocol: "http:",
+                host: "example.com",
+                port: "",
+                pathname: "/",
+                args: {},
+                hash: ""
+            }
+        }, {
+            url: "http://example.com/",
+            opt: {ignorePort80: true},
+            exp: {
+                protocol: "http:",
+                host: "example.com",
+                port: "",
+                pathname: "/",
+                args: {},
+                hash: ""
+            }
+        }, {
+            url: "http://example.com:88/",
+            exp: {
+                protocol: "http:",
+                host: "example.com",
+                port: "88",
+                pathname: "/",
+                args: {},
+                hash: ""
+            }
+        }, {
+            url: "http://example.com:88/foo#bar",
+            exp: {
+                protocol: "http:",
+                host: "example.com",
+                port: "88",
+                pathname: "/foo",
+                args: {},
+                hash: "#bar"
+            }
+        }, {
+            url: "http://example.com:88/?foo=bar",
+            exp: {
+                protocol: "http:",
+                host: "example.com",
+                port: "88",
+                pathname: "/",
+                args: {foo: "bar"},
+                hash: ""
+            }
+        }, {
+            url: "http://example.com/bogus/../bogus/../path",
+            exp: {
+                protocol: "http:",
+                host: "example.com",
+                port: "80",
+                pathname: "/path",
+                args: {},
+                hash: ""
+            }
+        }, {
+            url: "/relative#foo",
+            exp: {
+                protocol: window.location.protocol,
+                host: window.location.hostname,
+                port: window.location.port || "80",
+                pathname: "/relative",
+                args: {},
+                hash: "#foo"
+            }
+        }, {
+            url: "../foo",
+            exp: {
+                protocol: window.location.protocol,
+                host: window.location.hostname,
+                port: window.location.port || "80",
+                pathname: (function() {
+                    var parts = window.location.pathname.split("/");
+                    return parts.slice(0, parts.length -2).join("/") + "/foo";
+                })(),
+                args: {},
+                hash: ""
+            }
+        }];
+        
+        t.plan(cases.length);
+
+        var c, obj;
+        for(var i=0; i<cases.length; ++i) {
+            c = cases[i];
+            obj = OpenLayers.Util.createUrlObject(c.url, c.opt);
+            t.eq(obj, c.exp, i + ": '" + c.url + "'");
+        }
+        
+    }
+    
+    function test_Util_createUniqueIDSeq(t) {
+        t.plan(1);
+
+        OpenLayers.Util.lastSeqID = 0;
+        OpenLayers.Util.createDiv();
+        OpenLayers.Util.createDiv();
+        t.eq(OpenLayers.Util.createDiv().id, "OpenLayersDiv3", "Div created is sequential, starting at lastSeqID in Util.");
+    }
+
+    function test_Util_getParameters(t) {
+        t.plan(13);
+
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com'), {},
+             "getParameters works when args = ''");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?'), {},
+             "getParameters works when args = '?'");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?hello=world&foo=bar'),
+             {'hello' : 'world', 'foo': 'bar'},
+             "getParameters works when args = '?hello=world&foo=bar'");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?hello=&foo=bar'),
+             {'hello' : '', 'foo': 'bar'},
+             "getParameters works when args = '?hello=&foo=bar'");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?foo=bar#bugssucks'),
+             {'foo': 'bar'},
+             "getParameters works when using a fragment identifier");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?foo=bar%3Aone'),
+             {'foo': 'bar:one'},
+             "getParameters works with percent encoded values");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?foo=bar:one,pub,disco'),
+             {'foo': ['bar:one', 'pub', 'disco']},
+             "getParameters works with a comma-separated value (parses into array)");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?foo=bar%3Aone%2Cpub%2Cdisco'),
+             {'foo': ['bar:one', 'pub', 'disco']},
+             "getParameters works with a URL encoded comma-separated values (parses into array)");
+        
+        var value = "%20";  // say you wanted to have a query string parameter value be literal "%20"
+        var encoded = encodeURIComponent(value); // this is the proper URI component encoding
+        var url = "http://example.com/path?key=" + encoded; // this is a properly encoded URL
+        var params = OpenLayers.Util.getParameters(url);
+        t.eq(params.key, value, "a properly encoded value of '%20' is properly decoded");
+
+        /**
+         * IETF RFC 2396 (http://www.ietf.org/rfc/rfc2396.txt) says spaces
+         * should be encoded as "%20".  However, the "+" is used widely to
+         * indicate a space in a URL.
+         */
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?foo=bar+one'),
+             {'foo': 'bar one'},
+             "getParameters works with + instead of %20 in values");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?foo=bar%20one'),
+             {'foo': 'bar one'},
+             "getParameters works with properly encoded space character");
+        t.eq(OpenLayers.Util.getParameters('http://www.example.com?foo=bar%2Bone'),
+             {'foo': 'bar+one'},
+             "getParameters works with properly encoded + character");
+             
+        // Let's do some round tripping to make it harder to introduce regressions
+        var obj = {
+            "a key": "a value with spaces  (and +)",
+            "see%2B%2B": "C++",
+            "C++": "see%2B%2B",
+            "~%257E": "+%252B",
+            "who?": "me?",
+            "#yes": "#you",
+            "url": "http://example.com:80/?question=%3F&hash=%23&amp=&26#id"
+        };
+        var str = OpenLayers.Util.getParameterString(obj);
+        t.eq(OpenLayers.Util.getParameters("?" + str), obj, "round tripped parameters");
+
+    }
+
+    function test_Util_getArgs(t) {
+        //DEPRECATED -- to be removed in 3.0
+        t.plan(3);
+        
+        OpenLayers.Lang.setCode(OpenLayers.Lang.defaultCode);
+        
+        var temp = OpenLayers.Console.warn;
+        OpenLayers.Console.warn = function(err) {
+            t.ok(err != null, "warning is fired on use of getArgs()");
+        }
+
+        var temp2 = OpenLayers.Util.getParameters;
+        OpenLayers.Util.getParameters = function(url) {
+            t.eq(url, g_Url, "correct url passed to getParameters()");
+            return g_Params;
+        }
+        
+        g_Params = {};
+        g_Url = {};
+        
+        var ret = OpenLayers.Util.getArgs(g_Url);
+        t.ok( ret == g_Params, "correctly returns value from getParameters");
+
+        OpenLayers.Console.warn = temp;
+        OpenLayers.Util.getParameters = temp2;
+    }
+
+    function tests_Util_extend(t) {
+        t.plan(7);
+
+        var source = {
+            num: Math.random(),
+            obj: {
+                foo: "bar"
+            },
+            method: function() {
+                return "method";
+            },
+            toString: function() {
+                return "source";
+            },
+            nada: undefined
+        };
+        var destination = OpenLayers.Util.extend({nada: "untouched"}, source);
+        t.eq(destination.num, source.num,
+             "extend properly sets primitive property on destination");
+        t.eq(destination.obj, source.obj,
+             "extend properly sets object property on destination");
+        t.eq(destination.method(), "method",
+             "extend properly sets function property on destination");
+        t.eq(destination.toString(), "source",
+             "extend properly sets custom toString method");
+        t.eq(destination.nada, "untouched",
+             "undefined source properties don't clobber existing properties");
+        t.eq(window.property, undefined, "Property variable not clobbered.");
+        
+        var destination;
+        var source = {rand: Math.random()};
+        var ret = OpenLayers.Util.extend(destination, source);
+        t.eq(destination.rand, source.rand, "works with undefined destination");
+        
+    }
+    
+    function test_XX_Util_Try(t) {
+        t.plan(7);
+
+        var func1 = function() {
+            t.ok(true, "func1 executed");
+            throw "error";
+        };
+        
+        var func2 = function() {
+            t.ok(true, "func2 executed");
+            throw "error";
+        };
+
+        g_TestVal3 = {};
+        var func3 = function() {
+            t.ok(true, "func3 executed");
+            return g_TestVal3;            
+        };
+
+        g_TestVal4 = {};
+        var func4 = function() {
+            t.fail("func4 should *not* be executed");
+            return g_TestVal4;            
+        };
+
+        var ret = OpenLayers.Util.Try(func1, func2);
+        t.ok(ret == null, "if all functions throw exceptions, null returned");
+
+        var ret = OpenLayers.Util.Try(func1, func2, func3, func4);
+        t.ok(ret == g_TestVal3, "try returns first sucessfully executed function's return");
+
+    }
+    
+    function test_getRenderedDimensions(t) {
+        t.plan(2);
+        var content = (new Array(100)).join("foo ");
+        
+        // test with fixed width
+        var fw = OpenLayers.Util.getRenderedDimensions(content, {w: 20});
+        t.eq(fw.w, 20, "got the fixed width");
+        
+        // test with fixed height
+        var fh = OpenLayers.Util.getRenderedDimensions(content, {h: 15});
+        t.eq(fh.h, 15, "got the fixed height");
+        
+    }
+
+    function test_toFloat(t) {
+        t.plan(2);
+        // actual possible computed Mercator tile coordinates, more or less
+        var a1=40075016.67999999, b1=-20037508.33999999,
+            a2=40075016.68, b2=-20037508.34;
+        t.eq(OpenLayers.Util.toFloat(a1), OpenLayers.Util.toFloat(a2),
+            "toFloat rounds large floats correctly #1");
+        t.eq(OpenLayers.Util.toFloat(b1), OpenLayers.Util.toFloat(b2),
+            "toFloat rounds large floats correctly #2");
+    }
+  </script>
+</head>
+<body>
+    <div id="map" style="width: 1024px; height: 512px;"/>
+</body>
+</html>
diff --git a/tests/atom-1.0.xml b/tests/atom-1.0.xml
new file mode 100644
index 0000000..f0d5d6f
--- /dev/null
+++ b/tests/atom-1.0.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom"
+      xmlns:georss="http://www.georss.org/georss">
+
+  <title>tumulus</title>
+  <link rel="self"
+        href="http://pleiades.stoa.org/places/tumulus"/>
+  <updated/>
+  <author/>
+  <id>http://pleiades.stoa.org/places/tumulus</id>
+    
+  <entry>
+    <title>Unnamed Tumulus</title>
+    <link rel="alternate"
+          href="http://pleiades.stoa.org/places/638896"
+    />
+    <id>http://pleiades.stoa.org/places/638896</id>
+    <updated/>
+    <summary>An ancient tumulus, attested during the Classical period (modern location: Karaburun). Its ancient name is not known.</summary>
+    <georss:point>36.7702 29.9805</georss:point>
+  </entry>
+  <entry>
+    <title>Unnamed Tumulus</title>
+    <link rel="alternate"
+          href="http://pleiades.stoa.org/places/638924"
+    />
+    <id>http://pleiades.stoa.org/places/638924</id>
+    <updated/>
+    <summary>An ancient tumulus, attested during the Classical period (modern location: Kızılbel). Its ancient name is not known.</summary>
+    <georss:point>36.7263 29.8619</georss:point>
+  </entry>
+  
+</feed>
+
diff --git a/tests/auto-tests.html b/tests/auto-tests.html
new file mode 100644
index 0000000..f467e41
--- /dev/null
+++ b/tests/auto-tests.html
@@ -0,0 +1,2447 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head>
+<meta http-equiv="refresh" content="1200" />
+<title> Run the testsuite</title>
+<noscript>Javascript is disabled in your browser. This page cannot be displayed correctly without Javascript. Sorry. <br/> If you want to view this page, please change your browser settings so that Javascript is enabled.</noscript>
+<!--
+Test.AnotherWay version 0.5
+
+Copyright (c) 2005 Artem Khodush, http://straytree.org
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+-->
+<style type="text/css">
+* { padding: 0; margin: 0; }
+html { height: 99%; }
+body { height: 98%; font: normal normal 10pt sans-serif }
+#col1 {  float: left; width: 27em; margin: 0 0 0 1em; overflow: visible; }
+#col2 {  position: relative; height: 98%; margin: 0 0.5em 0 28em; }
+#col1_header { margin-top: 0.5em; }
+#scroller { height: 400px; overflow: auto;}
+#testtable { margin: 0 0 2em 0; width: 97%; }
+#run_buttons { margin-bottom: 4em; }
+
+#right_header { padding-top: 0.8em; }
+#results_count { float: left; }
+.active_tab 			{ float: right; padding: 0 1em 0.2em 1em; background: #0af; border: 1px solid #048; border-bottom: none; cursor: pointer; cursor: hand;
+					 position: relative; top: -0.2em; }
+.inactive_tab 			{ float: right; padding: 0 1em 0 1em; background: #9bb; color: #444; border: 1px solid #9bb; border-bottom: none; cursor: pointer; cursor: hand; }
+.inactive_mouseover_tab 	{ float: right; padding: 0 1em 0 1em; background: #9bb; color: #062; border: 1px solid #062; border-bottom: none; cursor: pointer; cursor: hand; }
+
+#right_frame { overflow: auto; position: relative; top: -0.2em; clear: right; height: 95%; border: 1px solid #048; }
+
+#debug { display: none; }
+#debug p { margin: 2px 0 0 5em; text-indent: -4.8em; }
+
+#error { display: none; color: #c22; }
+
+#results p { margin: 0 0 2px 0; }
+/* cursor indicating that detailed results may be expanded/contracted */
+#results p.badtest { cursor: text; }
+#results p.ok, #results p.fail { cursor: pointer; cursor: hand; }
+
+/* colored squares in the results window at the left of test page names */
+#results p.ok .bullet { background: #6d6; }
+#results p.fail .bullet { background:  #d46; }
+#results p.badtest .bullet { background: #ea3; }
+#results p.loading .bullet { background: #48f; }
+#results p.running .bullet { background: #26e; }
+#results p.waiting .bullet { background: #04d; }
+/* highlight in the results line */
+#results p .warning { background: #ffc; }
+
+/* layout of the detailed results */
+.result_detail { padding-left: 3em; }
+.result_exception_detail { padding-left: 4em; }
+.result_exception_stack_detail { padding-left: 5em;  }
+.result_micro_detail { padding-left: 6em; }
+/* colouring in the detailed results */
+.result_detail .fail, .result_exception_detail .fail,  .result_micro_detail .fail { background: #ffd8d8; }
+
+/* "start recording" controls*/
+#record_div { margin-top: 3em; }
+#record_div p { margin-bottom: 0.5em; }
+#record_select { width: 88%; }
+#record_input { width: 53%; }
+</style>
+<script type="text/javascript">
+<!--
+
+function report_results() {
+    req = false;
+    // branch for native XMLHttpRequest object
+    if(window.XMLHttpRequest && !(window.ActiveXObject)) {
+        try {
+            req = new XMLHttpRequest();
+        } catch(e) {
+            req = false;
+        }
+    // branch for IE/Windows ActiveX version
+    } else if(window.ActiveXObject) {
+        try {
+            req = new ActiveXObject("Msxml2.XMLHTTP");
+        } catch(e) {
+            try {
+                req = new ActiveXObject("Microsoft.XMLHTTP");
+            } catch(e) {
+                req = false;
+            }
+        }
+    } 
+    req.open("POST", "/test/results.cgi");
+    req.setRequestHeader("Content-Type", 'application/x-www-form-urlencoded');
+    var results = document.getElementById('total').innerHTML;
+    var test_text = "";
+    if (results.match("fail")) {
+        test_text = document.getElementById("results").innerHTML;
+    }    
+    req.send("results="+escape(results)+"&test_text="+escape(test_text));
+}
+
+if( typeof( Test )=="undefined" ) {
+	Test={};
+}
+Test.AnotherWay={};
+
+Test.AnotherWay._g_test_iframe=null; // frame where to load test pages
+Test.AnotherWay._g_test_frame_no_clear=false; // true - leave last page displayed after tests end
+Test.AnotherWay._g_test_page_urls=[]; // array of: { url: url, convention: "anotherway" or "jsan" }
+Test.AnotherWay._g_test_object_for_jsan=null; // test object for filling by tests that adhere to jsan Test.Simple calling convention
+Test.AnotherWay._g_pages_to_run=null; // list of pages to run automatically after loading
+Test.AnotherWay._g_run_on_main_load=false; // special handling for run_pages_to_run when it might be called before onload or before list of test pages is known.
+Test.AnotherWay._g_run_on_list_load=false;
+Test.AnotherWay._g_main_loaded=false;
+
+Test.AnotherWay._run_pages_to_run=function( called_from_outside )
+{
+	if( !Test.AnotherWay._g_main_loaded ) {
+		Test.AnotherWay._g_run_on_main_load=true;
+	}else {
+		var a_pages=Test.AnotherWay._g_pages_to_run;
+		if( a_pages=="all" ) {
+			for( var i=0; i<Test.AnotherWay._g_test_page_urls.length; ++i ) {
+				Test.AnotherWay._run_test_page( "test"+i );
+			}
+		}else if( a_pages!=null ) {
+			for( var run_i=0; run_i<a_pages.length; ++run_i ) {
+				var run_page=a_pages[run_i];
+				var found=false;
+				for( var all_i=0; all_i<Test.AnotherWay._g_test_page_urls.length; ++all_i ) {
+					if( run_page==Test.AnotherWay._g_test_page_urls[all_i].url ) {
+						Test.AnotherWay._run_test_page( "test"+all_i, called_from_outside );
+						found=true;
+						break;
+					}
+				}
+				if( !found ) {
+					Test.AnotherWay._show_error( "page specified to run is not found in the page list: "+run_page );
+					break;
+				}
+			}
+		}
+	}
+}
+
+Test.AnotherWay._add_test_page_url=function( test_url, convention )
+{
+	var table=document.getElementById( "testtable" );
+	var record_select=document.getElementById( "record_select" );
+	var index=Test.AnotherWay._g_test_page_urls.length;
+
+	// trim spaces.
+	if( test_url.match( "^(\\s*)(.*\\S)(\\s*)$" ) ) {
+		test_url=RegExp.$2;
+	}
+
+	Test.AnotherWay._g_test_page_urls[index]={ url: test_url, convention: convention };
+	var row=table.insertRow( -1 );
+
+	var cell;
+	var cell_child;
+	cell=row.insertCell( -1 );
+	cell_child=document.createElement( "input" );
+	cell_child.type="checkbox";
+	cell_child.id="checkbox"+index;
+    cell_child.checked='checked';
+    cell_child.defaultChecked='checked';
+	cell.appendChild( cell_child );
+
+	cell=row.insertCell( -1 );
+	cell.setAttribute( "width", "75%" );
+	cell.appendChild( document.createTextNode( test_url ) );
+
+	cell=row.insertCell( -1 );
+	cell_child=document.createElement( "input" );
+	cell_child.type="button";
+	cell_child.id="test"+index;
+	cell_child.value=" run ";
+	cell_child.onclick=Test.AnotherWay._run_one_onclick;
+	cell.appendChild( cell_child );
+
+	cell=row.insertCell( -1 );
+	cell.setAttribute( "width", "8em" );
+	cell_child=document.createElement( "span" );
+	cell.appendChild( cell_child );
+
+	var option=document.createElement( "option" );
+	option.appendChild( document.createTextNode( test_url ) );
+	record_select.appendChild( option );
+}
+Test.AnotherWay._show_error=function( msg )
+{
+	var error_div=document.getElementById( "error" );
+	error_div.innerHTML="";
+	error_div.appendChild( document.createTextNode( msg ) );
+	error_div.style.display="block";
+}
+
+// read urls from the list in the html file inside the list_iframe
+// fill on-screen list with urls and "run" buttons, and fill the g_test_page_urls object.
+Test.AnotherWay._list_iframe_onload=function()
+{
+	if( window.frames.list_iframe!=null && window.frames.list_iframe.location!="" && window.frames.list_iframe.location!="about:blank" ) {
+		var list_doc=window.frames.list_iframe.document;
+		var list=list_doc.getElementById( "testlist" );
+		if( list!=null ) {
+			for( var i=0; i<list.childNodes.length; ++i ) {
+				var item=list.childNodes[i];
+				if( item.nodeName=="LI" || item.nodeName=="li" ) {
+					var convention="anotherway";
+					if( Test.AnotherWay._get_css_class( item )=="jsan" ) {
+						convention="jsan";
+					}
+					Test.AnotherWay._add_test_page_url( item.innerHTML, convention );
+				}
+			}
+			if( Test.AnotherWay._g_run_on_list_load ) {
+				Test.AnotherWay._g_run_on_list_load=false;
+				Test.AnotherWay._run_pages_to_run();
+			}
+		}else {
+			Test.AnotherWay._show_error( "no list with id 'testlist' in a list file "+window.frames.list_iframe.location );
+		}
+	}
+}
+
+Test.AnotherWay._map_checkboxes=function( f )
+{
+	var table=document.getElementById( "testtable" );
+	var checks=table.getElementsByTagName( "INPUT" );
+	for( var i=0; i<checks.length; ++i ) {
+		if( checks[i].type=="checkbox" && checks[i].id.match( /^checkbox(\d+)$/ ) ) {
+			f( checks[i], RegExp.$1 );
+		}
+	}
+}
+Test.AnotherWay._run_all_onclick=function()
+{
+	Test.AnotherWay._map_checkboxes( function( c, id ) { Test.AnotherWay._run_test_page( "test"+id ); } );
+}
+Test.AnotherWay._run_selected_onclick=function()
+{
+	Test.AnotherWay._map_checkboxes( function( c, id ) { if( c.checked ) Test.AnotherWay._run_test_page( "test"+id ); } );
+}
+Test.AnotherWay._unselect_all_onclick=function()
+{
+	Test.AnotherWay._map_checkboxes( function( c, id ) { c.checked=false; } );
+}
+Test.AnotherWay._run_one_onclick=function()
+{
+	Test.AnotherWay._run_test_page( this.id );
+}
+
+// construct an object that will gather results of running one test function
+Test.AnotherWay._test_object_t=function( fun_name )
+{
+	this.name=fun_name; // name of the test function
+	this.n_plan=null; // planned number of assertions
+	this.n_ok=0; // # of ok assertions
+	this.n_fail=0; // # of failed assertions
+	this.exception=""; // if the function throwed an exception, it's its message
+	this.exception_stack=[]; // strings: function call stack from the exception
+	this.assertions=[]; // assertion results: array of { ok: 1 or 0, name: string }
+	this.wait_result_milliseconds=0; // how long to wait before collecting results from the test
+	this.second_wait_msg=null; // <p> status message (in addition to the page wait_msg)
+	this.delay_actions=[]; // array of actions to be perfomed after the test function returns
+				//	action : { acton_kind: "call" | "window" | "replay"
+				//				when "call": 		{ call_fn call_delay_milliseconds } call_fn takes nothing
+				//				when "window" : 	{ wnd_url wnd_wnd wnd_fn wnd_timeout_milliseconds wnd_dont_close } wnd_fn takes wnd
+				//				wnen "replay" : 	{ replay_wnd replay_events replay_event_i replay_checkpoints } checkpoint_fn takes this, wnd
+				//	}
+	this.delay_action_i=null; // index of delay action currently being performed
+	this.delay_prev_timer_time=0;	// for counting time while performing delay_actions
+	this.delay_current_milliseconds_left=0; // time left before the next action, runs down
+	this.delay_total_milliseconds_left=0; 	// for indication: total estimated time for all actions, runs up and down
+}
+
+Test.AnotherWay._test_object_t.prototype.ok=function( cond, name )
+{
+	if( cond ) {
+		++this.n_ok;
+		cond=1;
+	}else {
+		++this.n_fail;
+		cond=0;
+	}
+	this.assertions.push( { ok: cond, name: name } );
+}
+Test.AnotherWay._test_object_t.prototype.fail=function( name )
+{
+	this.ok( false, name );
+}
+Test.AnotherWay._test_object_t.prototype.plan=function( n )
+{
+	this.n_plan=n;
+}
+Test.AnotherWay._test_object_t.prototype.wait_result=function( seconds )
+{
+	this.wait_result_milliseconds=1000*seconds;
+}
+Test.AnotherWay._eq_fail_msg=function( path, what, expected, got )
+{
+	return "eq: "+path+" "+what+" differ: got "+got+", but expected "+expected;
+}
+Test.AnotherWay._array_eq=function( expected, got, path, msg )
+{
+	if( expected.length!=got.length ) {
+		msg.msg=Test.AnotherWay._eq_fail_msg( path, "array length", expected.length, got.length );
+		return false;
+	}
+	for( var i=0; i<expected.length; ++i ) {
+		if( !Test.AnotherWay._thing_eq( expected[i], got[i], path+"["+i+"]", msg ) ) {
+			return false;
+		}
+	}
+	return true;
+}
+Test.AnotherWay._object_eq=function( expected, got, path, msg )
+{
+	var v;
+	for( v in expected ) {
+		if( ! (v in got) ) {
+			msg.msg=Test.AnotherWay._eq_fail_msg( path+"."+v, "properties", expected[v], "undefined" );
+			return false;
+		}
+		if( !Test.AnotherWay._thing_eq( expected[v], got[v], path+"."+v, msg ) ) {
+			return false;
+		}
+	}
+	for( v in got ) {
+		if( ! (v in expected) ) {
+			msg.msg=Test.AnotherWay._eq_fail_msg( path+"."+v, "properties", "undefined", got[v] );
+			return false;
+		}
+	}
+	return true;
+}
+Test.AnotherWay._constructor_name=function( x )
+{
+	if( x==null ) {
+		return "";
+	}
+	var s="unknown";
+	try {
+		s=typeof( x.constructor );
+		if( s!="unknown" ) {
+			s=x.constructor.toString();
+		}
+	}catch( e ) {
+		s="unknown";
+	}
+	if( s=="unknown" ) {
+		// hackish attempt to guess a type
+		var is_array=true;
+		var index=0;
+		for( i in x ) {
+			if( i!=index ) {
+				is_array=false;
+			}
+			++index;
+		}
+		return is_array ? "Array" : "Object"; // for empty arrays/objects, this will be wrong half the time
+	}else if( s.match( /^\s*function\s+(\w+)\s*\(/ ) ) {
+		return RegExp.$1;
+	}else {
+	  var c = '';
+	  switch(typeof x) {
+	    case 'string':
+	      c = 'String';
+	      break;
+	    case 'object':
+	      c = 'Object';
+	      break;
+	    default:
+	      c = '';
+	  }
+		return c;	}
+}
+Test.AnotherWay._is_array=function( x )
+{
+	return Test.AnotherWay._constructor_name( x )=="Array";
+}
+Test.AnotherWay._is_value_type=function( x )
+{
+	cn=Test.AnotherWay._constructor_name( x );
+	return cn=="Number" || cn=="String" || cn=="Boolean" || cn=="Date";
+}
+Test.AnotherWay._thing_eq=function( expected, got, path, msg )
+{
+	if( expected==null && got==null ) {
+		return true;
+	}else if( (expected==null && got!=null) || (expected!=null && got==null) ) {
+		msg.msg=Test.AnotherWay._eq_fail_msg( path, "values", expected, got );
+		return false;
+	}else {
+		var expected_cn=Test.AnotherWay._constructor_name( expected );
+		var got_cn=Test.AnotherWay._constructor_name( got );
+		if( expected_cn!=got_cn ) {
+			msg.msg=Test.AnotherWay._eq_fail_msg( path, "types", expected_cn, got_cn );
+			return false;
+		}else {
+			if( Test.AnotherWay._is_array( expected ) ) {
+				return Test.AnotherWay._array_eq( expected, got, path, msg );
+			}else if( Test.AnotherWay._is_value_type( expected ) ) {
+				if( expected!=got ) {
+					msg.msg=Test.AnotherWay._eq_fail_msg( path, "values", expected, got );
+					return false;
+				}else {
+					return true;
+				}
+			}else { // just a plain object
+				return Test.AnotherWay._object_eq( expected, got, path, msg );
+			}
+		}
+	}
+}
+Test.AnotherWay._test_object_t.prototype.eq=function( got, expected, name )
+{
+	var msg={};
+	if( Test.AnotherWay._thing_eq( expected, got, "", msg ) ) {
+		this.ok( 1, name );
+	}else {
+		this.fail( name+". "+msg.msg );
+	}
+}
+Test.AnotherWay._test_object_t.prototype.like=function( got, expected, name )
+{
+	if( got.match( expected )!=null ) {
+		this.ok( 1, name );
+	}else {
+		this.fail( name+": got "+got+", but expected it to match: "+expected );
+	}
+}
+Test.AnotherWay._g_html_eq_span=null;
+Test.AnotherWay._html_eq_string_to_node=function( string_or_node, what, msg )
+{
+	if( string_or_node.nodeType!=null ) {
+		string_or_node=Test.AnotherWay._html_eq_node_to_string( string_or_node ); // double trip - to make properties assigned in scripts available as html node attributes
+	}
+	if( Test.AnotherWay._g_html_eq_span==null ) {
+		Test.AnotherWay._g_html_eq_span=document.createElement( "span" );
+	}
+	Test.AnotherWay._g_html_eq_span.innerHTML=string_or_node;
+	if( Test.AnotherWay._g_html_eq_span.childNodes.length!=1 ) {
+		msg.msg="bad "+what+" html string given (should contain exactly one outermost element): "+string_or_node;
+	}
+	return Test.AnotherWay._g_html_eq_span.childNodes[0].cloneNode( true );
+}
+Test.AnotherWay._html_eq_node_to_string=function( node ) {
+	if( Test.AnotherWay._g_html_eq_span==null ) {
+		Test.AnotherWay._g_html_eq_span=document.createElement( "span" );
+	}
+	Test.AnotherWay._g_html_eq_span.innerHTML="";
+	if( node.outerHTML!=null ) {
+		Test.AnotherWay._g_html_eq_span.innerHTML=node.outerHTML;
+	}else {
+            var clone = node.cloneNode(true);
+            var node = Test.AnotherWay._g_html_eq_span;
+            if(node.ownerDocument && node.ownerDocument.importNode) {
+                if(node.ownerDocument != clone.ownerDocument) {
+                    clone = node.ownerDocument.importNode(clone, true);
+                }
+            }
+            node.appendChild(clone);
+	}
+	return Test.AnotherWay._g_html_eq_span.innerHTML;
+}
+Test.AnotherWay._html_eq_path_msg=function( path )
+{
+	var msg="";
+	for( var i=0; i<path.length; ++i ) {
+		msg+=" [node "+path[i].node;
+		if( path[i].id!=null && path[i].id!="" ) {
+			msg+=" id "+path[i].id;
+		}else if( path[i].index!=null ) {
+			msg+=" at index "+path[i].index;
+		}
+		msg+="] "
+	}
+	return msg;
+}
+Test.AnotherWay._html_eq_fail_msg=function( path, what, expected, got )
+{
+	return Test.AnotherWay._html_eq_path_msg( path )+": "+what+" differ: got "+got+", but expected "+expected;
+}
+Test.AnotherWay._html_eq_remove_blank=function( text )
+{
+	if( text==null ) {
+		return "";
+	}else if( text.match( "^(\\s*)(.*\\S)(\\s*)$" ) ) {
+		return RegExp.$2;
+	}else if( text.match( "\s*" ) ) {
+		return "";
+	}
+	return text;
+}
+Test.AnotherWay._html_eq_remove_blank_nodes=function( node )
+{
+	var to_remove=[];
+	for( var child=node.firstChild; child!=null; child=child.nextSibling ) {
+		if( child.nodeType==3 ) {
+			var value=Test.AnotherWay._html_eq_remove_blank( child.nodeValue );
+			if( value=="" ) {
+				to_remove.push( child );
+			}else {
+				child.nodeValue=value;
+			}
+		}
+	}
+	for( var i=0; i<to_remove.length; ++i ) {
+		node.removeChild( to_remove[i] );
+	}
+}
+Test.AnotherWay._html_node_type_text=function( node_type )
+{
+	if( node_type==1 ) {
+		return "1 (html element)";
+	}else if( node_type==3 ) {
+		return "3 (text)";
+	}else {
+		return node_type;
+	}
+}
+Test.AnotherWay._html_eq_node=function( expected, got, path, msg, expected_loc_base, got_loc_base )
+{
+	if( expected.nodeType!=got.nodeType ) {
+		msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "node types", Test.AnotherWay._html_node_type_text( expected.nodeType ), Test.AnotherWay._html_node_type_text( got.nodeType ) );
+		return false;
+	}else if( expected.nodeType==3 ) {
+		if( expected.nodeValue!=got.nodeValue ) {
+			msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "text", expected.nodeValue, got.nodeValue );
+			return false;
+		}
+	}else if( expected.nodeType==1 ) {
+		if( expected.nodeName!=got.nodeName ) {
+			msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "node names", expected.nodeName, got.nodeName );
+			return false;
+		}
+		// compare attributes
+		var expected_attrs={};
+		var got_attrs={};
+		var i;
+		var a;
+		for( i=0; i<expected.attributes.length; ++i ) {
+			a=expected.attributes[i];
+			if( a.specified ) {
+				expected_attrs[a.name]=1;
+			}
+		}
+		for( i=0; i<got.attributes.length; ++i ) {
+			a=got.attributes[i];
+			if( a.specified ) {
+				got_attrs[a.name]=1;
+			}
+		}
+		for( a in expected_attrs ) {
+			if( ! (a in got_attrs) ) {
+				msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute sets differ: expected attribute "+a+" is missing";
+				return false;
+			}
+		}
+		for( a in got_attrs ) {
+			if( ! (a in expected_attrs) ) {
+				msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute sets differ: got extra attribute "+a;
+				return false;
+			}
+		}
+		for( a in expected_attrs ) {
+			var expected_value=expected.getAttribute( a );
+			var got_value=got.getAttribute( a );
+			if( typeof( expected_value )=="string" && typeof( got_value )=="string" ) {
+				expected_value=Test.AnotherWay._html_eq_remove_blank( expected_value );
+				got_value=Test.AnotherWay._html_eq_remove_blank( got_value );
+				var ok=expected_value==got_value;
+				if( !ok && (a=="href" || a=="HREF" )  ) { // try relative hrefs
+					var expected_relative_value=expected_value;
+					if( expected_loc_base!=null && expected_value.substring( 0, expected_loc_base.length )==expected_loc_base ) {
+						expected_relative_value=expected_value.substring( expected_loc_base.length );
+					}
+					var got_relative_value=got_value;
+					if( got_loc_base!=null && got_value.substring( 0, got_loc_base.length )==got_loc_base ) {
+						got_relative_value=got_value.substring( got_loc_base.length );
+					}
+					ok=expected_relative_value==got_relative_value;
+				}
+				if( !ok ) {
+					msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "attribute "+a+" values", expected_value, got_value );
+					return false;
+				}
+			}else if( typeof( expected_value )=="function" && typeof( got_value )=="function" ) {
+				expected_value=expected_value.toString();
+				got_value=got_value.toString();
+				if( expected_value!=got_value ) {
+					msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "attribute "+a+" values", expected_value, got_value );
+					return false;
+				}
+			}else {
+				var value_msg={};
+				if( !Test.AnotherWay._thing_eq( expected_value, got_value, "", value_msg ) ) {
+					msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute "+a+" values differ: "+value_msg.msg;
+					return false;
+				}
+			}
+		}
+		// compare child nodes
+		Test.AnotherWay._html_eq_remove_blank_nodes( expected );
+		Test.AnotherWay._html_eq_remove_blank_nodes( got );
+		var expected_length=expected.childNodes.length;
+		var got_length=got.childNodes.length;
+		if( expected_length<got_length ) {
+			msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": got "+(got_length-expected_length)+" extra child nodes";
+			return false;
+		}else if( expected_length>got_length ) {
+			msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": expected "+(expected_length-got_length)+" more child nodes";
+			return false;
+		}else {
+			for( i=0; i<expected_length; ++i ) {
+				var expected_node=expected.childNodes[i];
+				path.push( { node: expected_node.nodeName, id: expected_node.id, index: i } );
+				var eq=Test.AnotherWay._html_eq_node( expected_node, got.childNodes[i], path, msg, expected_loc_base, got_loc_base );
+				path.pop();
+				if( !eq ) {
+					return false;
+				}
+			}
+		}
+	}
+	return true;
+}
+Test.AnotherWay._html_eq_get_loc_base=function( node )
+{
+	var loc_base=document.location;
+	if( node.ownerDocument!=null ) {
+		loc_base=node.ownerDocument.location;
+	}
+	if( loc_base!=null ) {
+		loc_base=loc_base.href;
+		var slash_pos=loc_base.lastIndexOf( "/" );
+		if( slash_pos!=-1 ) {
+			loc_base=loc_base.substring( 0, slash_pos+1 );
+		}
+	}
+	return loc_base;
+}
+Test.AnotherWay._test_object_t.prototype.html_eq=function( got, expected, name )
+{
+	var msg={};
+	var expected_node=Test.AnotherWay._html_eq_string_to_node( expected, "expected", msg );
+	if( msg.msg!=null ) {
+		this.fail( name+" html_eq: "+msg.msg );
+	}else {
+		var got_node=Test.AnotherWay._html_eq_string_to_node( got, "got", msg );
+		if( msg.msg!=null ) {
+			this.fail( name+" html_eq: "+msg.msg );
+		}else {
+			var expected_loc_base=Test.AnotherWay._html_eq_get_loc_base( expected );
+			var got_loc_base=Test.AnotherWay._html_eq_get_loc_base( got );
+			if( Test.AnotherWay._html_eq_node( expected_node, got_node, [], msg, expected_loc_base, got_loc_base ) ) {
+				this.ok( 1, name );
+			}else {
+				var msg=name+" html_eq "+msg.msg;
+				var expected_str=Test.AnotherWay._html_eq_node_to_string( expected_node );
+				var got_str=Test.AnotherWay._html_eq_node_to_string( got_node );
+				msg+=".\n got html: "+got_str;
+				msg+=".\n expected html: "+expected_str;
+				this.fail( msg );
+			}
+		}
+	}
+}
+Test.AnotherWay._debug_pane_print=function( msg )
+{
+	var d=new Date();
+	var p=document.createElement( "p" );
+	p.appendChild( document.createTextNode( d.toLocaleTimeString()+" "+msg ) );
+	var debug_pane=document.getElementById( "debug" );
+	debug_pane.appendChild( p );
+	var debug_tab=document.getElementById( "debug_tab" );
+	var results_tab=document.getElementById( "results_tab" );
+	debug_tab.style.visibility="visible";
+	results_tab.style.visibility="visible";
+}
+Test.AnotherWay._test_object_t.prototype.debug_print=function( msg )
+{
+	Test.AnotherWay._debug_pane_print( this.name+": "+msg );
+}
+Test.AnotherWay._test_object_t.prototype.delay_call=function()
+{
+	var timeout_ms=200;
+	for( var i=0; i<arguments.length; ++i ) {
+		if( typeof( arguments[i] )!="function" ) {
+			timeout_ms=3000*arguments[i];
+		}else {
+			var action={ action_kind: "call", call_delay_milliseconds: timeout_ms, call_fn: arguments[i] };
+			this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
+			this.delay_actions.push( action );
+		}
+	}
+}
+Test.AnotherWay._test_object_t.prototype.open_window=function( url, fn, timeout_seconds )
+{
+	if( timeout_seconds==null ) {
+		timeout_seconds=4;
+	}
+	var no_close=document.getElementById( "dont_close_test_windows" );
+	var action={ action_kind: "window", wnd_url: url.toString(), wnd_wnd: null, wnd_fn: fn, wnd_timeout_milliseconds: timeout_seconds*1000, wnd_no_close: no_close.checked };
+	this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
+	this.delay_actions.push( action );
+}
+Test.AnotherWay._test_object_t.prototype.replay_events=function( wnd, events )
+{
+	if( Test.AnotherWay._g_no_record_msg!=null ) {
+		this.fail( "replay_events: "+Test.AnotherWay._g_no_record_msg );
+	}else {
+		var action={ action_kind: "replay", replay_wnd: wnd, replay_events: events.events, replay_event_i: null, replay_checkpoints: events.checkpoints };
+		this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
+		this.delay_actions.push( action );
+	}
+}
+Test.AnotherWay._action_estimate_milliseconds=function( action )
+{
+	var ms=0;
+	if( action.action_kind=="call" ) {
+		ms=action.call_delay_milliseconds;
+	}else if( action.action_kind=="window" ) {
+		ms=0;
+	}else if( action.action_kind=="replay" ) {
+		ms=0;
+		for( var i=0; i<action.replay_events.length; ++i ) {
+			ms+=action.replay_events[i]["time"]-0;
+		}
+	}
+	return ms;
+}
+
+Test.AnotherWay._g_timeout_granularity=200;
+Test.AnotherWay._g_tests_queue=[]; // vector of { url: string, test_objects : array of test_object_t, test_object_i: int, wait_msg: <p> object, loading_timeout_milliseconds: int, timeout_id: id }
+
+// load one html page, schedule further processing
+Test.AnotherWay._run_test_page=function( id, called_from_outside )
+{
+	if( id.match( /^test(\d+)/ ) ) {
+		id=RegExp.$1;
+		Test.AnotherWay._g_tests_queue.push( {
+			url: Test.AnotherWay._g_test_page_urls[id].url,
+			convention: Test.AnotherWay._g_test_page_urls[id].convention,
+			test_objects: []
+			} );
+		if( Test.AnotherWay._g_tests_queue.length==1 ) {
+			if( !called_from_outside ) {
+				// Crap. Be careful stepping around.
+				// For Mozilla and Opera, when this file is included into the frameset page that is in another directory (and _g_outside_path_correction!=null)
+				// but the test pages are started from within it (by "run" buttons), then:
+				// depending on whether the page is the first one loaded into the test frame or not,
+				// the base url for relative test pages differs.
+				// Crap, like I said.
+				Test.AnotherWay._g_tests_queue[0].suppress_outside_path_correction=true;
+			}
+			Test.AnotherWay._start_loading_page();
+		}
+	}
+}
+Test.AnotherWay._load_next_page=function()
+{
+	Test.AnotherWay._g_tests_queue.splice( 0, 1 );
+	if( Test.AnotherWay._g_tests_queue.length>0 ) {
+		Test.AnotherWay._start_loading_page();
+	}else {
+		if( !Test.AnotherWay._g_test_frame_no_clear ) {
+			Test.AnotherWay._g_test_iframe.location.replace( "about:blank" );
+		}
+        report_results();
+    }
+}
+Test.AnotherWay._g_opera_path_correction=null; // ugly wart to support opera
+Test.AnotherWay._g_outside_path_correction=null; // ugly wart to accomodate Opera and Mozilla, where relative url relates to the directory where the page that calls this function is located
+Test.AnotherWay._set_iframe_location=function( iframe, loc, outside_path_correction )
+{
+	// allow to load only locations with the same origin
+	var proto_end=loc.indexOf( "://" );
+	if( proto_end!=-1 ) { // otherwise, it's safe to assume (for Opera, Mozilla and IE ) that loc will be treated as relative
+		var main_loc=window.location.href;
+		var host_end=loc.substring( proto_end+3 ).indexOf( "/" );
+		var ok=false;
+		if( host_end!=-1 ) {
+			var loc_origin=loc.substring( 0, proto_end+3+host_end+1 );
+			if( main_loc.length>=loc_origin.length && main_loc.substring( 0, loc_origin.length )==loc_origin ) {
+				ok=true;
+			}
+		}
+		if( !ok ) {
+			return { msg: "test pages may have only urls with the same origin as "+main_loc };
+		}
+	}
+	// opera cannot handle urls relative to file:// without assistance
+	if( window.opera!=null && window.location.protocol=="file:" && loc.indexOf( ":" )==-1 ) {
+		var base=window.location.href;
+		var q_pos=base.indexOf( "?" );
+		if( q_pos!=-1 ) {
+			base=base.substring( 0, q_pos );
+		}
+		var slash_pos=base.lastIndexOf( "/" );
+		if( slash_pos!=-1 ) {
+			base=base.substring( 0, slash_pos+1 );
+			Test.AnotherWay._g_opera_path_correction=base;
+			loc=base+loc;
+		}
+	}
+	// if this function is called from another page, and if that page is in another directory, correction is needed
+	if( outside_path_correction!=null ) {
+		var pos=loc.indexOf( outside_path_correction );
+		if( pos==0 ) {
+			loc=loc.substring( outside_path_correction.length+1 );
+		}
+	}
+	if( iframe.location!=null ) {
+		iframe.location.replace( loc );
+	}else {
+		iframe.src=loc;
+	}
+	return {};
+}
+Test.AnotherWay._start_loading_page=function()
+{
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	test_page.loading_timeout_milliseconds=20000;
+	test_page.timeout_id=setTimeout( Test.AnotherWay._loading_timeout, Test.AnotherWay._g_timeout_granularity );
+	test_page.wait_msg=Test.AnotherWay._print_counter_result( test_page.url, "loading...", test_page.loading_timeout_milliseconds, "loading" );
+	if( test_page.convention=="jsan" ) {
+		// the tests in that page will run when it's loading, so the test object must be ready
+		Test.AnotherWay._g_test_object_for_jsan=new Test.AnotherWay._test_object_t( test_page.url );
+	}
+	var outside_path_correction=null;
+	if( Test.AnotherWay._g_outside_path_correction!=null && !test_page.suppress_outside_path_correction ) {
+		outside_path_correction=Test.AnotherWay._g_outside_path_correction;
+	}
+	var result=Test.AnotherWay._set_iframe_location( Test.AnotherWay._g_test_iframe, test_page.url, outside_path_correction );
+	if( result.msg!=null ) {
+		Test.AnotherWay._unprint_result( test_page.wait_msg );
+		Test.AnotherWay._print_result( test_page.url, result.msg, "badtest", null );
+		Test.AnotherWay._load_next_page();
+	}
+}
+
+Test.AnotherWay._loading_timeout=function()
+{
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	test_page.loading_timeout_milliseconds-=Test.AnotherWay._g_timeout_granularity;
+	if( test_page.loading_timeout_milliseconds>0 ) {
+		Test.AnotherWay._update_msg_counter( test_page.wait_msg, (test_page.loading_timeout_milliseconds/1000).toFixed() );
+		test_page.timeout_id=setTimeout( Test.AnotherWay._loading_timeout, Test.AnotherWay._g_timeout_granularity );
+	}else {
+		Test.AnotherWay._unprint_result( test_page.wait_msg );
+		Test.AnotherWay._print_result( test_page.url, "Unable to load test page. Timeout expired", "badtest", null );
+		Test.AnotherWay._load_next_page();
+	}
+}
+
+Test.AnotherWay._strip_query_and_hash=function( s )
+{
+	var i=s.lastIndexOf( "#" );
+	if( i!=-1 ) {
+		s=s.substring( 0, i );
+	}
+	i=s.lastIndexOf( "?" );
+	if( i!=-1 ) {
+		s=s.substring( 0, i );
+	}
+	return s;
+}
+Test.AnotherWay._is_url_loaded=function( url, wnd )
+{
+	var loaded=false;
+	if( wnd!=null && wnd.location!=null ) {
+		// after some popup blocker interference, location may behave strange..
+		var location_s="";
+		location_s+=wnd.location;
+		if( location_s!="" ) {
+			var pathname=wnd.location.pathname;
+			var expected_url=url;
+			var i=expected_url.lastIndexOf( "#" );
+			if( i!=-1 ) {
+				expected_url=expected_url.substring( 0, i );
+			}
+			i=expected_url.lastIndexOf( "?" );
+			if( i!=-1 ) {
+				expected_url=expected_url.substring( 0, i );
+			}
+			i=expected_url.lastIndexOf( "/" );
+			if( i!=-1 && i!=expected_url.length-1 ) {
+				expected_url=expected_url.substring( i+1 );
+			}
+			i=pathname.indexOf( expected_url )
+			if( wnd.location.href==url || (i!=-1 && i==pathname.length-expected_url.length) ) {
+				if( /*window.opera==null*/wnd.document.readyState==null || wnd.document.readyState=="complete" ) { // for opera (and IE?), getElementById does not work until..
+					loaded=true;
+				}
+			}
+		}
+	}
+	return loaded;
+}
+// find and run all test functions in the g_cur_page html page.
+Test.AnotherWay._test_page_onload=function()
+{
+	if( Test.AnotherWay._g_tests_queue.length==0 ) {
+		return;
+	}
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	if( !Test.AnotherWay._is_url_loaded( test_page.url, Test.AnotherWay._g_test_iframe ) ) {
+		return;
+	}
+	clearTimeout( test_page.timeout_id );
+	Test.AnotherWay._unprint_result( test_page.wait_msg );
+
+	if( test_page.convention=="anotherway" ) {
+		// get test function names (those beginning with "test")
+		if( typeof( Test.AnotherWay._g_test_iframe.document.scripts )!='undefined' ) { // IE
+			for( var i=0; i<Test.AnotherWay._g_test_iframe.document.scripts.length; ++i ) {
+				var script_text=Test.AnotherWay._g_test_iframe.document.scripts[i].text;
+				var fun_sig="function test";
+				var fun_start=script_text.indexOf( fun_sig );
+
+				while( fun_start!=-1 ) {
+					script_text=script_text.substring( fun_start, script_text.length );
+					var fun_end=script_text.indexOf( '(' );
+					var fun_name=script_text.substring( "function ".length,  fun_end );
+                                        var whitespace = fun_name.indexOf( ' ' );
+                                        if (whitespace >= 0)
+                                            fun_name = fun_name.substring( 0, whitespace );
+					test_page.test_objects.push( new Test.AnotherWay._test_object_t( fun_name ) );
+					script_text=script_text.substring( fun_end, script_text.length );
+					fun_start=script_text.indexOf( fun_sig  );
+				}
+			}
+		}else { // otherwise (not IE) it ought to work like this
+			for( var i in Test.AnotherWay._g_test_iframe) {
+				// Hack to prevent failure in FF3.0b1 
+                if (i == "innerWidth" || i == "innerHeight") { continue; }
+				if( typeof( Test.AnotherWay._g_test_iframe[i] )=='function' ) {
+					if( i.substring( 0, 4 )=="test" ) {
+						test_page.test_objects.push( new Test.AnotherWay._test_object_t( i ) );
+					}
+				}
+			}
+		}
+	}else if( test_page.convention=="jsan" ) {
+		// the test object is already filled with results
+		test_page.test_objects.push( Test.AnotherWay._g_test_object_for_jsan );
+	}
+
+	if( test_page.test_objects.length==0 ) {
+		Test.AnotherWay._print_result( test_page.url,  "No test functions defined in the page", "badtest", null );
+		Test.AnotherWay._load_next_page();
+		return;
+	}
+
+	test_page.wait_msg=Test.AnotherWay._print_result( test_page.url, "running tests..<span class=\"counter\">"+test_page.test_objects.length+"</span>", "running", null );
+
+	test_page.test_object_i=0;
+	Test.AnotherWay._run_more_tests();
+}
+
+Test.AnotherWay._handle_exception=function( o, e, title )
+{
+	var s=title+": "+typeof( e )+": ";
+	if( e.message!=null ) {
+		s+=e.message;
+	}else if( e.description!=null ) {
+		s+=e.description;
+	}else {
+		s+=e.toString();
+	}
+//	if( e.location!=null ) {  // XXX figure out how to display exception location if it's present (like in mozilla)
+//		s+=" location: "+e.location.toString();
+//	}
+	o.exception=s;
+	s=[];
+	if( e.stack ) {
+		var lines=e.stack.split( "\n" );
+		for( var i=0; i<lines.length; ++i ) {
+			// format of the line: func_name(args)@file_name:line_no
+			if( lines[i].match( /(\w*)\(([^\)]*)\)@(.*):([^:]*)$/ ) ) {
+				var func_name=RegExp.$1;
+				if( func_name.length==0 ) {
+					func_name="<anonymous>";
+				}
+				s.push( "in "+func_name+"( "+RegExp.$2+") at "+RegExp.$3+" line "+RegExp.$4+"\n" );
+			}
+		}
+	}
+	o.exception_stack=s;
+}
+
+Test.AnotherWay._run_more_tests=function()
+{
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	while( test_page.test_object_i<test_page.test_objects.length ) {
+		Test.AnotherWay._update_msg_counter( test_page.wait_msg, (1+test_page.test_object_i)+"/"+test_page.test_objects.length );
+		var o=test_page.test_objects[test_page.test_object_i];
+		if( test_page.convention=="anotherway" ) {
+			try {
+				Test.AnotherWay._g_test_iframe[o.name]( o );
+			}catch( e ) {
+				Test.AnotherWay._handle_exception( o, e, "" );
+			}
+		} // for "jsan" convention, test has run already
+		if( o.delay_actions.length>0 || o.wait_result_milliseconds>0 ) {
+			o.delay_total_milliseconds_left+=o.wait_result_milliseconds;
+			Test.AnotherWay._delay_actions_timeout();
+			return;
+		}
+		++test_page.test_object_i;
+	}
+	Test.AnotherWay._unprint_result( test_page.wait_msg );
+	Test.AnotherWay._print_result( test_page.url, null, null, test_page.test_objects );
+	Test.AnotherWay._load_next_page();
+}
+
+Test.AnotherWay._delay_actions_timeout=function()
+{
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	var test_object=test_page.test_objects[test_page.test_object_i];
+	var finished=true;
+	if( test_object.delay_action_i==null ) {
+		// set up to start first action
+		test_object.delay_action_i=-1;
+	}else {
+		// perform current action
+		var milliseconds_passed=(new Date()).getTime()-test_object.delay_prev_timer_time;
+		test_object.delay_current_milliseconds_left-=milliseconds_passed;
+		test_object.delay_total_milliseconds_left-=milliseconds_passed;
+		finished=Test.AnotherWay._delay_continue_action( test_object, milliseconds_passed );
+	}
+	while( finished && test_object.delay_action_i<test_object.delay_actions.length ) {
+		++test_object.delay_action_i; // start next action
+		finished=Test.AnotherWay._delay_start_action( test_object );
+	}
+	if( test_object.delay_action_i<=test_object.delay_actions.length ) { // any more actions left ?
+		test_object.delay_prev_timer_time=(new Date()).getTime();
+		var next_timeout=Test.AnotherWay._g_timeout_granularity;
+		if( test_object.delay_current_milliseconds_left<next_timeout ) {
+			next_timeout=test_object.delay_current_milliseconds_left;
+		}
+		if( test_object.second_wait_msg!=null ) {
+			Test.AnotherWay._update_msg_counter( test_object.second_wait_msg, (test_object.delay_total_milliseconds_left/1000).toFixed() );
+		}
+		setTimeout( Test.AnotherWay._delay_actions_timeout, next_timeout );
+	}else { // no more actions left. run the next test.
+		if( test_object.second_wait_msg!=null ) {
+			Test.AnotherWay._unprint_result( test_object.second_wait_msg );
+			test_object.second_wait_msg=null;
+		}
+		++test_page.test_object_i;
+		Test.AnotherWay._run_more_tests();
+	}
+}
+Test.AnotherWay._delay_start_action=function( test_object )
+{
+	var finished=false;
+	var wait_msg="";
+	if( test_object.delay_action_i==test_object.delay_actions.length ) {
+		if( test_object.wait_result_milliseconds>0 ) {
+			test_object.delay_current_milliseconds_left=test_object.wait_result_milliseconds; // wait for result
+			wait_msg="waiting for results..";
+		}else {
+			++test_object.delay_action_i; // dont wait for result
+		}
+	}else {
+		var action=test_object.delay_actions[test_object.delay_action_i];
+		if( action.action_kind=="call" ) {
+			test_object.delay_current_milliseconds_left=action.call_delay_milliseconds;
+			wait_msg="performing delayed calls..";
+		}else if( action.action_kind=="window" ) {
+			if( Test.AnotherWay._g_opera_path_correction!=null && action.wnd_url.indexOf( ":" )==-1 ) {
+				action.wnd_url=Test.AnotherWay._g_opera_path_correction+action.wnd_url;
+			}
+			action.wnd_wnd=window.open( action.wnd_url, "_blank" );
+			if( action.wnd_wnd==null ) {
+				finished=true;
+				test_object.fail( "unable to open window for "+action.wnd_url );
+			}else {
+				test_object.delay_current_milliseconds_left=action.wnd_timeout_milliseconds;
+				wait_msg="opening window..";
+			}
+		}else if( action.action_kind=="replay" ) {
+			if( action.replay_events.length==0 ) {
+				finished=true;
+			}else {
+				action.replay_event_i=0;
+				test_object.delay_current_milliseconds_left=action.replay_events[0]["time"];
+				wait_msg="replaying events..";
+			}
+		}
+	}
+	if( test_object.second_wait_msg!=null ) {
+		Test.AnotherWay._unprint_result( test_object.second_wait_msg );
+	}
+	if( wait_msg!="" ) {
+		var test_page=Test.AnotherWay._g_tests_queue[0];
+		test_object.second_wait_msg=Test.AnotherWay._print_counter_result( test_page.url, wait_msg, test_object.delay_total_milliseconds_left, "waiting" );
+	}else {
+		test_object.second_wait_msg=null;
+	}
+	return finished;
+}
+Test.AnotherWay._delay_continue_action=function( test_object, milliseconds_passed )
+{
+	var finished=test_object.delay_current_milliseconds_left<=0;
+	if( test_object.delay_action_i==test_object.delay_actions.length ) { // action is "waiting for results"
+		if( test_object.n_plan!=null && test_object.n_plan==test_object.n_ok+test_object.n_fail ) {
+			finished=true; // if all assertions results are recorded, don't wait any more
+		}
+		if( finished ) {
+			++test_object.delay_action_i; // move on to the next test
+		}
+	}else {
+		var action=test_object.delay_actions[test_object.delay_action_i];
+		if( action.action_kind=="call" ) {
+			if( finished ) {
+				try {
+					action.call_fn();
+				}catch( e ) {
+					Test.AnotherWay._handle_exception( test_object, e, "in delay_call" );
+				}
+			}
+		}else if( action.action_kind=="window" ) {
+			test_object.delay_total_milliseconds_left+=milliseconds_passed; // for "window", the countdown is suspended since it's unknown how long it will take
+			if( Test.AnotherWay._is_url_loaded( action.wnd_url, action.wnd_wnd ) ) {
+				try {
+					action.wnd_fn( action.wnd_wnd );
+				}catch( e ) {
+					Test.AnotherWay._handle_exception( test_object, e, "in open_window function call" );
+				}
+				finished=true;
+			}else if( finished ) {
+				test_object.fail(  "unable to open window for url '"+action.wnd_url+"'. timeout expired" );
+			}
+		}else if( action.action_kind=="replay" ) {
+			if( finished ) {
+//				try {
+					Test.AnotherWay._delay_replay_event( test_object, action.replay_wnd, action.replay_events[action.replay_event_i], action.replay_checkpoints );
+//				}catch( e ) { // disabled, until I know how to gel location info from an exception
+//					Test.AnotherWay._handle_exception( test_object, e, "while replaying event" );
+//				}
+				++action.replay_event_i;
+				finished=action.replay_event_i==action.replay_events.length;
+				if( !finished ) {
+					test_object.delay_current_milliseconds_left=action.replay_events[action.replay_event_i]["time"];
+				}
+			}
+		}
+	}
+	return finished;
+}
+Test.AnotherWay._delay_replay_event=function( test_object, wnd, event, checkpoints )
+{
+	if( event.type=="_checkpoint" ) {
+		var checkpoint_n=event.which;
+		var prev_n_fail=test_object.n_fail;
+		checkpoints[checkpoint_n]( test_object, wnd );
+		var flash_color= prev_n_fail==test_object.n_fail ? "#2f2" : "#f22" ;
+		Test.AnotherWay._record_flash_border( flash_color );
+	}else if( event.type=="click" || event.type=="mouseover" || event.type=="mouseout" || event.type=="mousemove" || event.type=="mousedown" || event.type=="mouseup" ) {
+		var target=Test.AnotherWay._record_node_path_to_node( event["target"], wnd.document );
+		if( target!=null ) {
+			Test.AnotherWay._record_control_update_highlight( target, "ball", event );
+			var e=wnd.document.createEvent( "MouseEvents" );
+			var related_target=Test.AnotherWay._record_node_path_to_node( event["relatedTarget"], wnd.document );
+			e.initMouseEvent(
+				event["type"],
+				event["cancelable"],
+				event["bubbles"],
+				wnd.document.defaultView,
+				event["detail"],
+				event["screenX"],
+				event["screenY"],
+				event["clientX"],
+				event["clientY"],
+				event["ctrlKey"],
+				event["altKey"],
+				event["shiftKey"],
+				event["metaKey"],
+				event["button"],
+				Test.AnotherWay._record_node_path_to_node( event["relatedTarget"], wnd.document )
+			);
+			// Firefox 1.0.6 somehow loses relatedTarget somewhere on the way. Pass through our own, for those who choose to care.
+			e.passThroughRelatedTarget=related_target;
+			target.dispatchEvent( e );
+		}
+	}else if( event.type=="keyup" || event.type=="keydown" || event.type=="keypress" ) {
+		var e=wnd.document.createEvent( "KeyboardEvents" ); // forget it. Apparently it's not supported neither by mozilla nor by opera.
+		e.initKeyboardEvent(
+				event["type"],
+				event["cancelable"],
+				event["bubbles"],
+				wnd.document.defaultView,
+				event["which"],
+				event["which"],
+				event["ctrlKey"],
+				event["altKey"],
+				event["shiftKey"],
+				event["metaKey"],
+				false
+		);
+		wnd.document.dispatchEvent( e );
+	}
+}
+
+Test.AnotherWay._print_counter_result=function( url, msg, milliseconds, style )
+{
+	return Test.AnotherWay._print_result( url, msg+"<span class=\"counter\">"+(milliseconds/1000).toFixed()+"</span>", style, null );
+}
+
+Test.AnotherWay._g_result_count=0; // for assigning unique ids to result paragraphs
+
+// number of pages tested
+Test.AnotherWay._g_ok_pages=0;
+Test.AnotherWay._g_fail_pages=0;
+
+Test.AnotherWay._print_result=function( url, msg, style, test_objects )
+{
+	var results=document.getElementById( "results" );
+	var r=results.appendChild( document.createElement( "p" ) );
+	r.id="result"+Test.AnotherWay._g_result_count;
+	++Test.AnotherWay._g_result_count;
+	r.onclick=Test.AnotherWay._toggle_detail;
+	var text="<span class=\"bullet\">   </span> ";
+	if( url!="" ) {
+		text+=url+":  ";
+	}
+	if( msg!=null ) {
+		text+=msg;
+	}
+	if( test_objects!=null ) {
+		// compose summary and detail texts
+		var total_ok=0;
+		var total_detail_ok=0;
+		var total_fail=0;
+		var total_detail_fail=0;
+		var no_plan=0;
+
+		var detail=results.appendChild( document.createElement( "div" ) );
+
+		if( r.id.match( /^result(\d+)$/ ) ) {
+			detail.id="result_detail"+RegExp.$1;
+		}
+
+		for( var i=0; i<test_objects.length; ++i ) {
+			var o=test_objects[i];
+			var p;
+			var p_text;
+			p=document.createElement( "P" );
+			Test.AnotherWay._set_css_class( p, "result_detail" );
+			p_text=o.name;
+			if( o.n_fail>0 || o.exception || (o.n_plan!=null && o.n_plan!=o.n_ok+o.n_fail) || (o.n_plan==null && o.n_ok==0 && o.n_fail==0)) {
+				++total_fail;
+				p_text+=" <span class=\"fail\">";
+				if( o.n_plan!=null && o.n_plan!=o.n_ok+o.n_fail) {
+					p_text+="planned "+o.n_plan+" assertions but got "+(o.n_ok+o.n_fail)+"; ";
+				}
+				if(o.n_plan==null && o.n_ok==0 && o.n_fail==0) {
+					p_text+="test did not output anything";
+				}else {
+					p_text+=" fail "+o.n_fail;
+				}
+				p_text+="</span>";
+			}else {
+				++total_ok;
+			}
+			p_text+=" ok "+o.n_ok;
+			if( o.n_plan==null ) {
+				no_plan=1;
+				p_text+=" <span class=\"warning\">no plan</span>";
+			}
+			p.innerHTML=p_text;
+			detail.appendChild( p );
+			if( o.exception ) {
+				p=document.createElement( "P" );
+				Test.AnotherWay._set_css_class( p, "result_exception_detail" );
+				p.innerHTML="<span class=\"fail\">exception:</span> "+o.exception;
+				detail.appendChild( p );
+				p=document.createElement( "P" );
+				Test.AnotherWay._set_css_class( p, "result_exception_stack_detail" );
+				p.innerHTML=o.exception_stack.join( "<br/>" );
+				detail.appendChild( p );
+			}
+			for( var ii=0; ii<o.assertions.length; ++ii ) {
+				var oo=o.assertions[ii];
+				var status=oo.ok ? "ok" : "<span class=\"fail\">fail</span>";
+				p=document.createElement( "P" );
+				Test.AnotherWay._set_css_class( p, "result_micro_detail" );
+				p.innerHTML=status;
+				p.appendChild( document.createTextNode( " "+oo.name ) );
+				detail.appendChild( p );
+			}
+			total_detail_ok+=o.n_ok;
+			total_detail_fail+=o.n_fail;
+		}
+		if( total_fail || total_detail_fail ) {
+			text+=" fail "+total_fail;
+		}
+		text+=" ok "+total_ok+" (detailed:";
+		if( total_fail || total_detail_fail ) {
+			text+=" fail "+total_detail_fail;
+		}
+		text+=" ok "+total_detail_ok+")";
+		if( no_plan ) {
+			text+=" <span class=\"warning\">no plan</span>";
+		}
+		style= total_fail==0 ? "ok" : "fail";
+		detail.style.display= style=="fail" ? "block" : "none";
+		detail.style.cursor="text";
+	}
+	if( style!=null ) {
+		Test.AnotherWay._set_css_class( r, style );
+		if( style=="ok" ) {
+			++Test.AnotherWay._g_ok_pages;
+		}else if( style=="fail" || style=="badtest" ) {
+			++Test.AnotherWay._g_fail_pages;
+		}
+		var pages_total="";
+		if( Test.AnotherWay._g_fail_pages>0 ) {
+			pages_total+=" fail "+Test.AnotherWay._g_fail_pages;
+		}
+		pages_total+=" ok "+Test.AnotherWay._g_ok_pages;
+		Test.AnotherWay._update_results_total( pages_total );
+	}
+	r.innerHTML=text;
+	if( results.scrollHeight!=null && results.scrollTop!=null && results.offsetHeight!=null ) {
+		results.scrollTop=results.scrollHeight-results.offsetHeight;
+	}
+	// when test_objects is not null, the results are final - good time to clean up
+	if( test_objects!=null ) {
+		for( var i=0; i<test_objects.length; ++i ) {
+			var actions=test_objects[i].delay_actions;
+			for( var action_i=0; action_i<actions.length; ++action_i ) {
+				var action=actions[action_i];
+				if( action.action_kind=="window" && action.wnd_wnd!=null && !action.wnd_no_close ) {
+					action.wnd_wnd.close();
+					action.wnd_wnd=null;
+				}
+			}
+		}
+	}
+	return r;
+}
+Test.AnotherWay._unprint_result=function( child )
+{
+	var results=document.getElementById( "results" );
+	results.removeChild( child );
+}
+Test.AnotherWay._toggle_detail=function()
+{
+	if( this.id.match( /^result(\d+)$/ ) ) {
+		var detail=document.getElementById( "result_detail"+RegExp.$1 );
+		if( detail!=null ) {
+			if( detail.style.display=="none" ) {
+				detail.style.display="block";
+			}else if( detail.style.display=="block" ) {
+				detail.style.display="none";
+			}
+		}
+	}
+}
+Test.AnotherWay._update_msg_counter=function( msg, text )
+{
+	for( var i=0; i<msg.childNodes.length; ++i ) {
+		var item=msg.childNodes[i];
+		if( item.nodeName=="SPAN" && Test.AnotherWay._get_css_class( item )=="counter" ) {
+			item.innerHTML=text;
+		}
+	}
+}
+Test.AnotherWay._update_results_total=function( msg )
+{
+	var total=document.getElementById( "total" );
+	if( total ) {
+		total.innerHTML=msg;
+	}
+}
+Test.AnotherWay._results_clear_onclick=function()
+{
+	var results=document.getElementById( "results" );
+	results.innerHTML="";
+	Test.AnotherWay._update_results_total( "" );
+	Test.AnotherWay._g_ok_pages=0;
+	Test.AnotherWay._g_fail_pages=0;
+	var debug=document.getElementById( "debug" );
+	debug.innerHTML="";
+}
+
+Test.AnotherWay._get_css_class=function( o )
+{
+	var c=o.getAttribute( "className" );
+	if( c==null || c=="" ) {
+		c=o.getAttribute( "class" );
+	}
+	return c;
+}
+Test.AnotherWay._set_css_class=function( o, css_class )
+{
+	o.setAttribute( "className", css_class );
+	o.setAttribute( "class", css_class );
+}
+
+Test.AnotherWay._tab_onclick=function()
+{
+	var tab=this;
+	var tabs=[ document.getElementById( "debug_tab" ), document.getElementById( "results_tab" ) ];
+	var panes=[ document.getElementById( "debug" ), document.getElementById( "results" ) ];
+	for( var i=0; i<tabs.length; ++i ) {
+		if( tab==tabs[i] ) {
+			Test.AnotherWay._set_css_class( tabs[i], "active_tab" );
+			panes[i].style.display="block";
+		}else {
+			Test.AnotherWay._set_css_class( tabs[i], "inactive_tab" );
+			panes[i].style.display="none";
+		}
+	}
+}
+Test.AnotherWay._tab_mouseover=function()
+{
+	if( Test.AnotherWay._get_css_class( this )=="inactive_tab" ) {
+		Test.AnotherWay._set_css_class( this, "inactive_mouseover_tab" );
+	}
+}
+Test.AnotherWay._tab_mouseout=function()
+{
+	if( Test.AnotherWay._get_css_class( this )=="inactive_mouseover_tab" ) {
+		Test.AnotherWay._set_css_class( this, "inactive_tab" );
+	}
+}
+
+// recording mouse input
+Test.AnotherWay._record_check_onfocus=function()
+{
+	var o=this;
+	var check_select=o.type!="text";
+	var div=document.getElementById( "record_div" );
+	var inputs=div.getElementsByTagName( "input" );
+	for( var i=0; i<inputs.length; ++i ) {
+		var input=inputs[i];
+		if( input.type=="radio" ) {
+			if( input.value=="select" ) {
+				input.checked=check_select;
+			}else if( input.value=="input" ) {
+				input.checked=!check_select;
+			}
+		}
+	}
+}
+
+Test.AnotherWay._g_no_record_msg=null; // not null - recording is unavailable
+Test.AnotherWay._g_record_timeout_cnt=0; // opening window for a page for recording
+Test.AnotherWay._g_record_url=null;
+Test.AnotherWay._g_record_wnd=null;
+Test.AnotherWay._g_record_random_id=null; // added to element ids of record_control div so that they do not clash with ids already in the page for which input is recorded
+Test.AnotherWay._g_record_keydown=null; // recording control - which key is down
+Test.AnotherWay._g_record_ctrl_keydown=false;
+Test.AnotherWay._g_record_shift_keydown=false;
+Test.AnotherWay._g_record_control_visible=true; // recording control ui state
+Test.AnotherWay._g_record_started;
+Test.AnotherWay._g_record_paused;
+Test.AnotherWay._g_record_include_mousemove=false;
+Test.AnotherWay._g_record_start_time; // for time references
+Test.AnotherWay._g_record_pause_start_time;
+Test.AnotherWay._g_record_update_time_interval; // showing time in the control ui
+Test.AnotherWay._g_record_waiting_for_results=false; // waiting for results window to open
+Test.AnotherWay._g_record_events; // recorded events
+Test.AnotherWay._g_record_under_cursor; // track element under cursor
+Test.AnotherWay._g_record_checkpoint_count; // for checkpoint numbering
+Test.AnotherWay._g_record_mouse_over_record_control; // for avoiding record control highlight on mouseover
+Test.AnotherWay._g_record_highlighted_element={ element: null, x: null, y: null };
+
+Test.AnotherWay._record_control_get_element=function( id )
+{
+	if( Test.AnotherWay._g_record_wnd!=null && Test.AnotherWay._g_record_wnd.document!=null ) {
+		return Test.AnotherWay._g_record_wnd.document.getElementById( id+Test.AnotherWay._g_record_random_id );
+	}else {
+		return null;
+	}
+}
+Test.AnotherWay._record_start_onclick=function() // "record" button on the run_tests.html: open a window for a page for which input is recorded
+{
+	if( Test.AnotherWay._g_no_record_msg!=null ) {
+		alert( Test.AnotherWay._g_no_record_msg );
+		return;
+	}
+	if( Test.AnotherWay._g_record_timeout_cnt>0
+	    || (Test.AnotherWay._g_record_wnd!=null && (Test.AnotherWay._g_record_wnd.closed!=null && !Test.AnotherWay._g_record_wnd.closed)) ) { // in opera, closed is null.
+		alert( "there is already window opened for recording input for a page "+Test.AnotherWay._g_record_url );
+		return;
+	}
+	var div=document.getElementById( "record_div" );
+	var inputs=div.getElementsByTagName( "input" );
+	var url=null;
+	for( var i=0; i<inputs.length; ++i ) {
+		var input=inputs[i];
+		if( input.type=="radio" ) {
+			if( input.value=="select" && input.checked ) {
+				var index=document.getElementById( "record_select" ).selectedIndex;
+				if( index>0 ) {
+					url=Test.AnotherWay._g_test_page_urls[index-1].url;
+				}
+			}else if( input.value=="input" && input.checked ) {
+				url=document.getElementById( "record_input" ).value;
+			}
+		}
+	}
+	if( url!=null ) {
+		Test.AnotherWay._g_record_url=url;
+		Test.AnotherWay._g_record_wnd=window.open( url, "_blank" );
+		if( Test.AnotherWay._g_record_wnd==null ) {
+			alert( "unable to open new window for a page: "+url );
+		}else {
+			Test.AnotherWay._g_record_timeout_cnt=50;
+			setTimeout( Test.AnotherWay._record_window_timeout, 100 );
+		}
+	}
+}
+Test.AnotherWay._record_window_timeout=function()
+{
+	if( Test.AnotherWay._is_url_loaded( Test.AnotherWay._g_record_url, Test.AnotherWay._g_record_wnd ) ) {
+		Test.AnotherWay._record_window_setup( Test.AnotherWay._g_record_wnd );
+	}else {
+		if( --Test.AnotherWay._g_record_timeout_cnt>0 ) {
+			setTimeout( Test.AnotherWay._record_window_timeout, 100 );
+		}else {
+			alert( "timeout expired while opening new window for a page: "+Test.AnotherWay._g_record_url );
+			Test.AnotherWay._g_record_wnd=null;
+			Test.AnotherWay._g_record_url=null;
+			Test.AnotherWay._g_record_timeout_cnt=0;
+		}
+	}
+}
+Test.AnotherWay._record_control_randomize_id=function( e, r )
+{
+	if( e.id!="" ) {
+		e.id=e.id+r;
+	}
+	for( var c=e.firstChild; c!=null; c=c.nextSibling ) {
+		Test.AnotherWay._record_control_randomize_id( c, r );
+	}
+}
+Test.AnotherWay._record_window_setup=function( wnd ) // insert recording control into the page for which input is recorded
+{
+	Test.AnotherWay._g_record_timeout_cnt=0;
+	var this_div=document.getElementById( "record_control" );
+	var record_control=wnd.document.importNode( this_div, true );
+	Test.AnotherWay._g_record_random_id=(1000*Math.random()).toFixed();
+	Test.AnotherWay._record_control_randomize_id( record_control, Test.AnotherWay._g_record_random_id );
+	Test.AnotherWay._g_record_control_visible=true;
+	Test.AnotherWay._g_record_started=false;
+	Test.AnotherWay._g_record_paused=false;
+	Test.AnotherWay._g_record_checkpoint_count=0;
+	Test.AnotherWay._g_record_mouse_over_record_control=false;
+	var doc=wnd.document;
+	doc.body.appendChild( record_control );
+	// opera sans-serif font is different
+	if( window.opera ) {
+		cursor_over_indicator=Test.AnotherWay._record_control_get_element( "record_cursor_over" );
+		cursor_over_indicator.style.width="18em";
+		cursor_over_indicator.style.height="2em";
+		cursor_over_indicator.style.fontSize="7pt";
+	}
+	doc.addEventListener( "keydown", Test.AnotherWay._record_control_keydown, true );
+	doc.addEventListener( "keyup", Test.AnotherWay._record_control_keyup, true );
+//	doc.addEventListener( "keypress", Test.AnotherWay._record_event, true ); // replaying is not supported by any known browser
+
+	doc.body.addEventListener( "mousemove", Test.AnotherWay._record_on_mousemove, true );
+	doc.body.addEventListener( "click", Test.AnotherWay._record_event, true );
+	doc.body.addEventListener( "mouseover", Test.AnotherWay._record_event, true );
+	doc.body.addEventListener( "mouseout", Test.AnotherWay._record_event, true );
+	doc.body.addEventListener( "mousedown", Test.AnotherWay._record_event, true );
+	doc.body.addEventListener( "mouseup", Test.AnotherWay._record_event, true );
+}
+Test.AnotherWay._record_control_key_disabled=function( k )
+{
+	if( k=="c" ) {
+		return !Test.AnotherWay._g_record_started;
+	}else if( k=="p" ) {
+		return !Test.AnotherWay._g_record_started;
+	}else if( k=="s" ) {
+		return Test.AnotherWay._g_record_waiting_for_results;
+	}else {
+		return false;
+	}
+}
+
+Test.AnotherWay._record_control_update_ui=function()
+{
+	var keydown_color="#fff";
+	var disabled_color="#aaa";
+	var button_color="#adf";
+	var active_color="#fdf";
+
+	var display={};
+	display[false]="none";
+	display[true]="inline";
+
+	var s_button=Test.AnotherWay._record_control_get_element( "record_s" );
+	var record_on=Test.AnotherWay._record_control_get_element( "record_on" );
+	var record_off=Test.AnotherWay._record_control_get_element( "record_off" );
+
+	s_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "s" ) ? disabled_color
+		: Test.AnotherWay._g_record_keydown=="s" ? keydown_color : Test.AnotherWay._g_record_started ? active_color : button_color;
+	record_on.style.display=display[!Test.AnotherWay._g_record_started];
+	record_off.style.display=display[Test.AnotherWay._g_record_started];
+
+	var h_button=Test.AnotherWay._record_control_get_element( "record_h" );
+	h_button.style.backgroundColor= Test.AnotherWay._g_record_keydown=="h" ? keydown_color : button_color;
+
+	var p_button=Test.AnotherWay._record_control_get_element( "record_p" );
+	var record_pause_on=Test.AnotherWay._record_control_get_element( "record_pause_on" );
+	var record_pause_off=Test.AnotherWay._record_control_get_element( "record_pause_off" );
+	p_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "p" ) ? disabled_color
+		: Test.AnotherWay._g_record_keydown=="p" ? keydown_color : Test.AnotherWay._g_record_paused ? active_color : button_color;
+	record_pause_on.style.display=display[!Test.AnotherWay._g_record_paused];
+	record_pause_off.style.display=display[Test.AnotherWay._g_record_paused];
+
+	var m_button=Test.AnotherWay._record_control_get_element( "record_m" );
+	var record_include_mousemove=Test.AnotherWay._record_control_get_element( "record_include_mousemove" );
+	var record_omit_mousemove=Test.AnotherWay._record_control_get_element( "record_omit_mousemove" );
+	m_button.style.backgroundColor= Test.AnotherWay._g_record_keydown=="m" ? keydown_color : Test.AnotherWay._g_record_include_mousemove ? active_color : button_color;
+	record_include_mousemove.style.display=display[!Test.AnotherWay._g_record_include_mousemove];
+	record_omit_mousemove.style.display=display[Test.AnotherWay._g_record_include_mousemove];
+
+	var c_button=Test.AnotherWay._record_control_get_element( "record_c" );
+	c_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "c" ) ? disabled_color
+		: Test.AnotherWay._g_record_keydown=="c" ? keydown_color : button_color;
+
+	var record_indicator=Test.AnotherWay._record_control_get_element( "record_indicator" );
+	record_indicator.style.display=display[Test.AnotherWay._g_record_started];
+
+	var pause_indicator=Test.AnotherWay._record_control_get_element( "record_pause_indicator" );
+	pause_indicator.style.display=display[Test.AnotherWay._g_record_paused];
+
+	var record_control=Test.AnotherWay._record_control_get_element( "record_control" );
+	record_control.style.display= Test.AnotherWay._g_record_control_visible ? "block" : "none";
+
+	var shift_button=Test.AnotherWay._record_control_get_element( "record_shift_key" );
+	shift_button.style.backgroundColor= Test.AnotherWay._g_record_shift_keydown ? keydown_color : button_color;
+
+	var ctrl_button=Test.AnotherWay._record_control_get_element( "record_ctrl_key" );
+	ctrl_button.style.backgroundColor= Test.AnotherWay._g_record_ctrl_keydown ? keydown_color : button_color;
+}
+Test.AnotherWay._record_format_time=function( t )
+{
+	t=new Date( t );
+	var m=t.getMinutes();
+	var s=t.getSeconds();
+	var str= m==0 ? "" : m+"m ";
+	str+=s+"s.";
+	return str;
+}
+Test.AnotherWay._record_control_update_time=function()
+{
+	var time_display=Test.AnotherWay._record_control_get_element( "record_time" );
+	if( time_display!=null ) {
+		time_display.innerHTML=Test.AnotherWay._record_format_time( (new Date()).getTime()-Test.AnotherWay._g_record_start_time );
+	}
+}
+Test.AnotherWay._record_control_update_highlight=function( elem, style, event )
+{
+	if( elem==null ) {
+		Test.AnotherWay._record_highlight_border( null );
+	}else {
+		var pos=Test.AnotherWay._get_page_coords( elem );
+		if( style=="ball" || elem!=Test.AnotherWay._g_record_highlighted_element.element || pos.x!=Test.AnotherWay._g_record_highlighted_element.x || pos.y!=Test.AnotherWay._g_record_highlighted_element.y ) {
+			Test.AnotherWay._g_record_highlighted_element={ element: elem, x: pos.x, y: pos.y };
+			Test.AnotherWay._record_highlight_border( elem, style, event );
+		}
+	}
+}
+Test.AnotherWay._record_decode_key=function( event )
+{
+	var k=null;
+	if( event==null ) {
+		k=Test.AnotherWay._g_record_wnd.event.keyCode;
+	}else {
+		k=event.which;
+	}
+	if( k==83 ) {
+		return "s";
+	}else if( k==72 ) {
+		return "h";
+	}else if( k==73 ) {
+		return "i";
+	}else if( k==80 ) {
+		return "p";
+	}else if( k==67 ) {
+		return "c";
+	}else if( k==77 ) {
+		return "m";
+	}else if( k==16 ) {
+		return "shift";
+	}else if( k==17 ) {
+		return "ctrl";
+	}else if( k==18 ) {
+		return "alt";
+	}else if( k==19 ) {
+		return "pause";
+	}else if( k==123 ) {
+		return "f12";
+	}
+	return "";
+}
+Test.AnotherWay._record_control_keydown=function( event )
+{
+	var handled=false;
+	var k=Test.AnotherWay._record_decode_key( event );
+	if( k=="shift" ) {
+		Test.AnotherWay._g_record_shift_keydown=true;
+	}else if( k=="ctrl" ) {
+		Test.AnotherWay._g_record_ctrl_keydown=true;
+	}else if( k!="" && (Test.AnotherWay._g_record_keydown==null || Test.AnotherWay._g_record_keydown==k) ) {
+		if( Test.AnotherWay._g_record_ctrl_keydown && Test.AnotherWay._g_record_shift_keydown && !Test.AnotherWay._record_control_key_disabled( k ) ) {
+			Test.AnotherWay._g_record_keydown=k;
+			handled=true;
+		}
+	}else {
+		Test.AnotherWay._g_record_keydown="";
+	}
+	Test.AnotherWay._record_control_update_ui();
+	if( !handled ) {
+//		Test.AnotherWay._record_event( event ); // replaying is not supported in any known browser
+	}
+	return;
+}
+Test.AnotherWay._record_control_keyup=function( event )
+{
+	var handled=false;
+	var k=Test.AnotherWay._record_decode_key( event );
+	if( k=="shift" ) {
+		Test.AnotherWay._g_record_shift_keydown=false;
+	}else if( k=="ctrl" ) {
+		Test.AnotherWay._g_record_ctrl_keydown=false;
+	}else if( k!="" && k==Test.AnotherWay._g_record_keydown && Test.AnotherWay._g_record_ctrl_keydown && Test.AnotherWay._g_record_shift_keydown  ) {
+		if( k=="s" ) {
+			Test.AnotherWay._g_record_started=!Test.AnotherWay._g_record_started;
+			if( Test.AnotherWay._g_record_started ) {
+				Test.AnotherWay._g_record_events=[];
+				Test.AnotherWay._g_record_start_time=(new Date()).getTime();
+				Test.AnotherWay._record_control_update_time();
+				Test.AnotherWay._g_record_update_time_interval=window.setInterval( Test.AnotherWay._record_control_update_time, 200 );
+			}else {
+				Test.AnotherWay._record_control_update_highlight( null );
+				if( !Test.AnotherWay._g_record_paused ) {
+					window.clearInterval( Test.AnotherWay._g_record_update_time_interval );
+				}
+				Test.AnotherWay._g_record_waiting_for_results=true;
+				// open a new window for self, pass a parameter to dump recorded events as javascript code there
+				// (the easiest way to obtain a document from the same origin, so it's writable, is to open this same page again)
+				Test.AnotherWay._g_record_paused=false;
+				var loc=window.location;
+				loc=loc.protocol+"//"+loc.host+loc.pathname+"?recording_results="+Test.AnotherWay._g_record_random_id;
+				if( window.open( loc, "_blank" )==null ) {
+					alert( "unable to open new window for results" );
+				}
+			}
+			handled=true;
+		}else if( k=="h" ) {
+			Test.AnotherWay._g_record_control_visible=!Test.AnotherWay._g_record_control_visible;
+			handled=true;
+		}else if( k=="p" ) {
+			Test.AnotherWay._g_record_paused=!Test.AnotherWay._g_record_paused;
+			if( Test.AnotherWay._g_record_paused ) {
+				Test.AnotherWay._g_record_pause_start_time=(new Date()).getTime();
+				if( Test.AnotherWay._g_record_started ) {
+					window.clearInterval( Test.AnotherWay._g_record_update_time_interval );
+				}
+				Test.AnotherWay._record_control_update_highlight( null );
+			}else {
+				var pause_duration=(new Date()).getTime()-Test.AnotherWay._g_record_pause_start_time;
+				Test.AnotherWay._g_record_start_time+=pause_duration;
+				Test.AnotherWay._g_record_update_time_interval=window.setInterval( Test.AnotherWay._record_control_update_time, 200 );
+			}
+			handled=true;
+		}else if( k=="m" ) {
+			Test.AnotherWay._g_record_include_mousemove=!Test.AnotherWay._g_record_include_mousemove;
+			handled=true;
+		}else if( k=="c" ) {
+			var o=Test.AnotherWay._record_checkpoint();
+			Test.AnotherWay._record_display_checkpoint( o );
+			Test.AnotherWay._record_flash_border( "#24d" );
+			handled=true;
+		}
+	}
+	Test.AnotherWay._g_record_keydown=null;
+	Test.AnotherWay._record_control_update_ui();
+	if( !handled ) {
+//		Test.AnotherWay._record_event( event ); // replaying is not supported in any known browser
+	}
+	return;
+}
+Test.AnotherWay._record_html_node_path=function( node )
+{
+	if( node==null ) {
+		return null;
+	}
+	var path=[];
+	while( true ) {
+		if( node.id!=null && node.id!="" ) {
+			path.unshift( "#"+node.id+" "+node.nodeName );
+			break;
+		}else {
+			var parent_node=node.parentNode;
+			if( parent_node==null ) {
+				return []; // no BODY up the path - this node is screwed (browsers differ in what's above the body), discard
+			}else {
+				var i=0;
+				var found=false;
+				for( var child=parent_node.firstChild; child!=null; child=child.nextSibling ) {
+					if( child==node ) {
+						found=true;
+						break;
+					}
+					if( child.nodeType==1 ) { // count only HTML element nodes
+						++i;
+					}
+				}
+				if( !found ) {
+					i=-1;
+				}
+				path.unshift( i+" "+node.nodeName );
+				if( parent_node.nodeName=="BODY" || parent_node.nodeName=="body" ) {
+					break;
+				}
+				node=parent_node;
+			}
+		}
+	}
+	return path;
+}
+Test.AnotherWay._record_node_path_to_string=function( path )
+{
+	var s="";
+	if( path!=null ) {
+		for( var i=0; i<path.length; ++i ) {
+			s+= i==0 ? "" : ", ";
+			var elem=path[i].split( " " );
+			if( elem[0].charAt( 0 )=="#" ) {
+				s+=elem[1]+" "+elem[0];
+			}else {
+				s+=elem[1]+" ["+elem[0]+"]";
+			}
+		}
+	}
+	return s;
+}
+Test.AnotherWay._record_node_path_to_node=function( path_str, doc )
+{
+	if( path_str==null ) {
+		return null;
+	}
+	var path=path_str.split( "," );
+	var node=doc.body;
+	for( var i=0; i<path.length; ++i ) {
+		var node_i=path[i].split( " " )[0];
+		if( node_i.charAt( 0 )=="#" ) {
+			node=doc.getElementById( node_i.substring( 1 ) );
+		}else {
+			if( node_i<0 || node_i>=node.childNodes.length ) {
+				node=null;
+			}else {
+				node=node.firstChild;
+				while( node!=null ) {
+					if( node.nodeType==1 ) {  // count only HTML element nodes
+						if( node_i==0 ) {
+							break;
+						}
+						--node_i;
+					}
+					node=node.nextSibling;
+				}
+			}
+		}
+		if( node==null ) {
+			return null;
+		}
+	}
+	return node;
+}
+Test.AnotherWay._record_control_contains_id=function( s )
+{
+	return s.match( /^#record_[\w_]+/ ) && s.match( Test.AnotherWay._g_record_random_id );
+}
+Test.AnotherWay._record_checkpoint=function()
+{
+	var o={ type: "_checkpoint", time: (new Date()).getTime()-Test.AnotherWay._g_record_start_time, which: Test.AnotherWay._g_record_checkpoint_count++,
+			target: Test.AnotherWay._record_html_node_path( Test.AnotherWay._g_record_under_cursor ) };
+	Test.AnotherWay._g_record_events.push( o );
+	return o;
+}
+Test.AnotherWay._record_event=function( event )
+{
+	var unneeded=["rangeOffset","eventPhase","timeStamp","isTrusted","popupWindowFeatures","rangeOffset"];
+	if( Test.AnotherWay._g_record_started && !Test.AnotherWay._g_record_paused ) {
+		var o={};
+		for( var n in event ) {
+			var needed=!n.match( /^[A-Z0-9_]+$/ );
+			if( needed ) {
+				for( var ui=0; ui<unneeded.length; ++ui ) {
+					if( unneeded[ui]==n ) {
+						needed=false;
+						break;
+					}
+				}
+				if( needed ) {
+					var value=event[n];
+					if( typeof( value )!="object" && typeof( value )!="function" ) {
+						o[n]=value;
+					}else if( n=="target" || n=="relatedTarget" ) {
+						o[n]=Test.AnotherWay._record_html_node_path( value );
+					}
+				}
+			}
+		}
+		o["time"]=(new Date()).getTime()-Test.AnotherWay._g_record_start_time;
+		var over_record_control= o["target"]!=null && o["target"][0]!=null && Test.AnotherWay._record_control_contains_id( o["target"][0] );
+		if( !over_record_control ) {
+			Test.AnotherWay._g_record_events.push( o );
+		}
+	}
+	return true;
+}
+Test.AnotherWay._record_on_mousemove=function( event )
+{
+	var path=Test.AnotherWay._record_html_node_path( event.target );
+	var new_mouse_over_record_control= path!=null && path[0]!=null && Test.AnotherWay._record_control_contains_id( path[0] );
+	if( new_mouse_over_record_control!=Test.AnotherWay._g_record_mouse_over_record_control ) {
+		Test.AnotherWay._g_record_mouse_over_record_control=new_mouse_over_record_control;
+		Test.AnotherWay._record_control_update_ui();
+	}
+	if( event.target!=null && event.target!=Test.AnotherWay._g_record_under_cursor ) {
+		Test.AnotherWay._g_record_under_cursor=event.target;
+		var s="";
+		if( path==null || path[0]==null || !Test.AnotherWay._record_control_contains_id( path[0] ) ) {
+			s=Test.AnotherWay._record_node_path_to_string( path );
+		}
+		if( s=="" ) {
+			s=" ";
+		}
+		var cursor_over_indicator=Test.AnotherWay._record_control_get_element( "record_cursor_over" );
+		cursor_over_indicator.innerHTML=s;
+	}
+
+	var highlight_element=null;
+	if( !Test.AnotherWay._g_record_mouse_over_record_control && Test.AnotherWay._g_record_started && !Test.AnotherWay._g_record_paused ) {
+		highlight_element=event.target;
+	}
+	// highlight border disabled on recording - it causes page to scroll, issuing spurious mouseover/mouseout event
+	//Test.AnotherWay._record_control_update_highlight( highlight_element, "border" );
+
+	if( Test.AnotherWay._g_record_include_mousemove ) {
+		Test.AnotherWay._record_event( event );
+	}
+	return true;
+}
+Test.AnotherWay._record_display_checkpoint=function( o )
+{
+	var checkpoints_div=Test.AnotherWay._record_control_get_element( "record_checkpoints" );
+	var p=checkpoints_div.appendChild( checkpoints_div.ownerDocument.createElement( "div" ) );
+	p.style.marginTop="3px";
+	p.style.font="normal normal 8pt sans-serif";
+	p.style.color="#000";
+	p.style.textAligh="left";
+	p.style.position="relative";
+	p.style.width="100%";
+	var checkpoint_text="";
+	checkpoint_text+="#"+(o.which+1);
+	checkpoint_text+="  "+Test.AnotherWay._record_format_time( o.time );
+	if( o.target!=null ) {
+		checkpoint_text+=Test.AnotherWay._record_node_path_to_string( o.target );
+	}
+	p.appendChild( p.ownerDocument.createTextNode( checkpoint_text ) );
+}
+Test.AnotherWay._record_save_results=function( doc )
+{
+	// strange, but DOM-style append does not work here in opera 8.
+	var append=function( s ) { doc.write( "<div>"+s+"</div>" ); };
+	append( "/* paste this data into your javascript and pass it as an argument to replay_events method */" );
+	append( "{ checkpoints: [" );
+	var first_checkpoint=true;
+	for( var i=0; i<Test.AnotherWay._g_record_events.length; ++i ) {
+		var o=Test.AnotherWay._g_record_events[i];
+		if( o.type=="_checkpoint" ) {
+			var str= first_checkpoint ? "" : "}, ";
+			str+="function( tst, wnd ) { // #"+o.which+" time "+Test.AnotherWay._record_format_time( o.time )+" cursor was over "+Test.AnotherWay._record_node_path_to_string( o.target );
+			append( str );
+			first_checkpoint=false;
+		}
+	}
+	if( !first_checkpoint ) {
+		append( "}" );
+	}
+	append( "], events: [ " );
+	var prev_time=0;
+	for( var i=0; i<Test.AnotherWay._g_record_events.length; ++i ) {
+		var o=Test.AnotherWay._g_record_events[i];
+		var s="";
+		s+= "{";
+		var n_first=true;
+		for( var n in o ) {
+			if( n=="time" ) { // convert to relative time
+				var cur_time=o[n]-0;
+				o[n]=cur_time-prev_time;
+				prev_time=cur_time;
+			}
+			s+=n_first ? n : ", "+n;
+			s+=":";
+			if( o[n]==null ) {
+				s+="null";
+			}else {
+				s+="\""+o[n]+"\"";
+			}
+			n_first=false;
+		}
+		s+= i==Test.AnotherWay._g_record_events.length-1 ? "}" : "},";
+		append( s );
+	}
+	append( "] }" );
+	append( ";" );
+}
+
+Test.AnotherWay._g_record_border; // border highlighting element under cursor
+Test.AnotherWay._g_record_border_flashes=[]; // array of { color: color, timeout: milliseconds }
+Test.AnotherWay._g_record_border_flashing=false;
+Test.AnotherWay._g_record_border_normal_color="#d4b";
+Test.AnotherWay._record_flash_border_timeout=function()
+{
+	var color=Test.AnotherWay._g_record_border_normal_color;
+	var timeout=null;
+	if( Test.AnotherWay._g_record_border_flashes.length!=0 ) {
+		color=Test.AnotherWay._g_record_border_flashes[0].color;
+		timeout=Test.AnotherWay._g_record_border_flashes[0].timeout;
+		Test.AnotherWay._g_record_border_flashes.splice( 0, 1 );
+	}
+	if( Test.AnotherWay._g_record_border!=null ) {
+		for( var i=0; i<Test.AnotherWay._g_record_border.length; ++i ) {
+			Test.AnotherWay._g_record_border[i].style.backgroundColor=color;
+		}
+	}
+	if( timeout!=null ) {
+		setTimeout( Test.AnotherWay._record_flash_border_timeout, timeout );
+	}else {
+		Test.AnotherWay._g_record_border_flashing=false;
+	}
+}
+Test.AnotherWay._get_page_coords=function( elm )
+{
+	var point = { x: 0, y: 0 };
+	while( elm )  {
+		point.x+=elm.offsetLeft;
+		point.y+=elm.offsetTop;
+		elm=elm.offsetParent;
+	 }
+	return point;
+}
+Test.AnotherWay._set_page_coords=function( elm, x, y )
+{
+	var parent_coords={ x: 0, y: 0 };
+	if( elm.offsetParent )  {
+		parent_coords=Test.AnotherWay._get_page_coords( elm.offsetParent );
+	}
+	var new_x=x-parent_coords.x;
+	if( new_x<0 ) {
+		new_x=0;
+	}
+	elm.style.left=new_x+'px';
+	var new_y=y-parent_coords.y;
+	if( new_y<0 ) {
+		new_y=0;
+	}
+	elm.style.top=new_y+'px';
+}
+Test.AnotherWay._record_setup_highlight_positions=function( element, style, coords, positions )
+{
+	if( style=="border" ) {
+		var width=element.clientWidth;
+		var height=element.clientHeight;
+		var step=0;
+		var thickness=2;
+		var fudge_expand=4;
+		positions.push( { x: coords.x-step-thickness, y: coords.y-step-thickness, width: width+2*step+2*thickness+fudge_expand, height: thickness } );
+		positions.push( { x: coords.x+width+step+fudge_expand, y: coords.y-step-thickness, width: thickness, height: height+2*step+2*thickness+fudge_expand } );
+		positions.push( { x:positions[0].x, y:positions[0].y, width:positions[0].width, height:positions[0].height } );
+		positions.push( { x:positions[1].x, y:positions[1].y, width:positions[1].width, height:positions[1].height } );
+		positions[2].y+=height+thickness+2*step+fudge_expand;
+		positions[3].x-=width+thickness+2*step+fudge_expand;
+	}else if( style=="ball" ) {
+		positions.push( { x: coords.x+2, y: coords.y, width: 2, height: 6 } );
+		positions.push( { x: coords.x, y: coords.y+2, width: 6, height: 2 } );
+		positions.push( { x: coords.x+1, y: coords.y+1, width: 4, height: 4 } );
+	}
+}
+Test.AnotherWay._record_highlight_border=function( element, style, event ) // null - hide border
+{
+	if( element!=null ) {
+		if( Test.AnotherWay._g_record_border==null || Test.AnotherWay._g_record_border[0].ownerDocument!=element.ownerDocument ) {
+			Test.AnotherWay._g_record_border=[];
+			var n= style=="border" ? 4 : style=="ball" ? 3 : 0;
+			for( var i=0; i<4; ++i ) {
+				var b=element.ownerDocument.createElement( "div" );
+				b.style.position="absolute";
+				b.style.zIndex="1";
+				b.style.backgroundColor=Test.AnotherWay._g_record_border_normal_color;
+				element.ownerDocument.body.appendChild( b );
+				Test.AnotherWay._g_record_border.push( b );
+			}
+		}
+		var coords=null;
+		if( style=="border" ) {
+			coords=Test.AnotherWay._get_page_coords( element );
+		}else if( style=="ball" ) {
+			if( event!=null ) {
+				if( event.pageX!=null && event.pageY!=null ) {
+					coords={ x: event.pageX-0, y: event.pageY-0 };
+				}else if( event.clientX!=null && event.clientY!=null ) {
+					var doc=element.ownerDocument;
+					if( doc!=null ) {
+						coords={ x: (event.clientX-0)+doc.body.scrollLeft, y: (event.clientY-0)+doc.body.scrollTop };
+					}
+				}
+			}
+		}
+		if( coords!=null && element.clientWidth!=null && element.clientHeight!=null ) {
+			var positions=[];
+			Test.AnotherWay._record_setup_highlight_positions( element, style, coords, positions );
+			for( var i=0; i<positions.length; ++i ) {
+				var b=Test.AnotherWay._g_record_border[i];
+				var p=positions[i];
+				Test.AnotherWay._set_page_coords( b, p.x, p.y );
+				b.style.width=p.width+"px";
+				b.style.height=p.height+"px";
+				b.style.display="block";
+			}
+		}
+	}else {
+		if( Test.AnotherWay._g_record_border!=null ) {
+			for( var i=0; i<Test.AnotherWay._g_record_border.length; ++i ) {
+				Test.AnotherWay._g_record_border[i].style.display="none";
+			}
+		}
+	}
+}
+Test.AnotherWay._record_flash_border=function( color )
+{
+	if( Test.AnotherWay._g_record_border_flashing ) { //already
+		Test.AnotherWay._g_record_border_flashes.push( { color: Test.AnotherWay._g_record_border_normal_color, timeout:300 } );
+		Test.AnotherWay._g_record_border_flashes.push( { color: color, timeout:600 } );
+	}else {
+		Test.AnotherWay._g_record_border_flashing=true;
+		Test.AnotherWay._g_record_border_flashes.push( { color: color, timeout:600 } );
+		Test.AnotherWay._record_flash_border_timeout();
+	}
+}
+Test.AnotherWay._record_prepare_doc_for_results=function()
+{
+	document.open();
+	document.write( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" );
+	document.write( "<html><head><title> Input recording results</title>" );
+	document.write( "<style type=\"text/css\">" );
+	document.write( "body { font: normal normal smaller sans-serif; }" );
+	document.write( "div { margin-top: 3px; }" );
+	document.write( "</style></head><body>" );
+	// opera and mozilla disagree over who the opener is.
+	if( typeof( window.opener.Test )!="undefined" && typeof( window.opener.Test.AnotherWay )!="undefined" ) {
+		window.opener.Test.AnotherWay._record_save_results( document );
+		window.opener.Test.AnotherWay._g_record_waiting_for_results=false;
+		window.opener.Test.AnotherWay._record_control_update_ui();
+	}else if( typeof( window.opener.opener.Test  )!="undefined" && typeof( window.opener.opener.Test.AnotherWay )!="undefined" ) {
+		window.opener.opener.Test.AnotherWay._record_save_results( document );
+		window.opener.opener.Test.AnotherWay._g_record_waiting_for_results=false;
+		window.opener.opener.Test.AnotherWay._record_control_update_ui();
+	}
+	document.write( "</body>" );
+	document.close();
+}
+
+// global initialization
+onload=function()
+{
+	if( window.opera ) {
+		var good_opera=typeof( window.opera.version )=="function";
+		good_opera=good_opera && window.opera.version().match( /^\s*(\d+)/ );
+		good_opera=good_opera && RegExp.$1>=8;
+	}
+	var span=document.createElement( "SPAN" );
+	span.innerHTML="<!--[if IE]><br /><![endif]-"+"->";
+	var is_ie=span.getElementsByTagName( "BR" ).length>0;
+
+	Test.AnotherWay._g_test_iframe=window.frames.test_iframe;
+
+	var query_str=window.location.search;
+	if( query_str.charAt( 0 )=="?" ) {
+		query_str=query_str.substring( 1 );
+	}
+	var testlist_page="list-tests.html";
+	var auto_run=false;
+	if( query_str!="" ) {
+		var params=[query_str];
+		if( query_str.indexOf( ";" )!=-1 ) {
+			params=query_str.split( ";" );
+		}else if( query_str.indexOf( "&" )!=-1 ) {
+			params=query_str.split( "&" );
+		}
+		for( var param_i=0; param_i<params.length; ++param_i ) {
+			var param=params[param_i].split( "=" );
+			if( param[0]=="recording_results" ) {
+				if( window.opener!=null ) {
+					// we were told to show recording results - replace everything in the document with the results
+					Test.AnotherWay._record_prepare_doc_for_results();
+					return;
+				}
+			}else if( param[0]=="testpage" ) {
+				Test.AnotherWay._add_test_page_url( decodeURIComponent( param[1] ), "anotherway" );
+			}else if( param[0]=="jsantestpage" ) {
+				Test.AnotherWay._add_test_page_url( decodeURIComponent( param[1] ), "jsan" );
+			}else if( param[0]=="testlist" ) {
+				testlist_page=decodeURIComponent( param[1] );
+			}else if( param[0]=="testframe" ) {
+				if( window.opera && !good_opera ) {
+					Test.AnotherWay._show_error( "testframe parameter does not work in versions of Opera prior to 8.0. Sorry (pathches are welcome)." );
+					// Opera 7 barfs on attempt to access frame.frameElement.
+					// if someone knows a way to assign onload handler to that iframe in Opera 7
+					// without disrupting code that works in other browsers, patches are welcome.
+				}else {
+					var frame_path=param[1].split( "." );
+					var frame=top;
+					for( var frame_path_i=0; frame_path_i<frame_path.length; ++frame_path_i ) {
+						frame=frame[frame_path[frame_path_i]];
+					}
+					if( frame==null ) {
+						Test.AnotherWay._show_error( "unable to find frame specified for loading test pages: "+param[1] );
+					}else {
+						if( frame.frameElement!=null ) { // for the following assignement to onload to work, frameElement is required
+							frame=frame.frameElement;
+						}
+						Test.AnotherWay._g_test_iframe=frame;
+					}
+				}
+			}else if( param[0]=="testframe_no_clear" ) {
+				Test.AnotherWay._g_test_frame_no_clear=true;
+			}else if( param[0]=="windows" ) {
+                if (param[1] == "none") {
+                }
+			}else if( param[0]=="run" ) {
+				auto_run=true;
+				if( param[1]=="all" ) {
+					Test.AnotherWay._g_pages_to_run="all";
+				}else {
+					if( Test.AnotherWay._g_pages_to_run==null || Test.AnotherWay._g_pages_to_run=="all" ) {
+						Test.AnotherWay._g_pages_to_run=[];
+					}
+					var pages=param[1].split( "," );
+					for( var i=0; i<pages.length; ++i ) {
+						Test.AnotherWay._g_pages_to_run.push( pages[i] );
+					}
+				}
+			}
+		}
+	}
+	if( Test.AnotherWay._g_test_page_urls.length==0 ) {  // if no individual pages were given on the command line, load the list
+		var result=Test.AnotherWay._set_iframe_location( window.frames["list_iframe"], testlist_page );
+		if( result.msg!=null ) {
+			Test.AnotherWay._show_error( result.msg );
+		}
+		Test.AnotherWay._g_run_on_list_load=auto_run;
+	}else {
+		Test.AnotherWay._g_run_on_main_load=auto_run;
+	}
+
+	var f=Test.AnotherWay._g_test_iframe;
+	try {
+		if( f.attachEvent!=null ) {
+			f.attachEvent( "onload", Test.AnotherWay._test_page_onload );
+		}else {
+			f.onload=Test.AnotherWay._test_page_onload;
+		}
+		if( Test.AnotherWay._g_test_iframe.nodeType!=null && Test.AnotherWay._g_test_iframe.contentWindow!=null ) { // it's iframe element, not the iframe. we need iframe.
+			Test.AnotherWay._g_test_iframe=Test.AnotherWay._g_test_iframe.contentWindow;
+		}
+	}catch(e) {
+		// ignore stupid opera error if the frame has onload handler assigned in the inline html
+	}
+	var handlers={
+		"run_all": { "onclick": Test.AnotherWay._run_all_onclick },
+		"run_selected": { "onclick": Test.AnotherWay._run_selected_onclick },
+		"unselect_all": { "onclick": Test.AnotherWay._unselect_all_onclick },
+		"record_select": { "onfocus": Test.AnotherWay._record_check_onfocus },
+		"record_input": { "onfocus": Test.AnotherWay._record_check_onfocus },
+		"record_start": { "onclick": Test.AnotherWay._record_start_onclick },
+		"clear_btn": { "onclick": Test.AnotherWay._results_clear_onclick },
+		"results_tab": { "onclick": Test.AnotherWay._tab_onclick, "onmouseover": Test.AnotherWay._tab_mouseover, "onmouseout": Test.AnotherWay._tab_mouseout },
+		"debug_tab": { "onclick": Test.AnotherWay._tab_onclick, "onmouseover": Test.AnotherWay._tab_mouseover, "onmouseout": Test.AnotherWay._tab_mouseout }
+	};
+	for( var hs in handlers ) {
+		var o=document.getElementById( hs );
+		if( o!=null ) {
+			for( var h in handlers[hs] ) {
+				o[h]=handlers[hs][h];
+			}
+		}else {
+			Test.AnotherWay._show_error( "unable to set "+h+" handler: id "+hs+" not found" );
+		}
+	}
+
+	if( window.opera && !good_opera ) {
+		Test.AnotherWay._g_no_record_msg="Input events recording and replaying is not available in opera versions prior to 8.0.";
+	}
+	if( is_ie ) {
+		Test.AnotherWay._g_no_record_msg="Input events recording and replaying is not available in internet explorer.";
+	}
+ 	if( Test.AnotherWay._g_no_record_msg!=null ) {
+		var no_record_p=document.getElementById( "record_not_supported" );
+		no_record_p.style.display="block";
+		no_record_p.appendChild( document.createTextNode( Test.AnotherWay._g_no_record_msg ) );
+	}
+
+	Test.AnotherWay._g_main_loaded=true;
+	if( Test.AnotherWay._g_run_on_main_load ) {
+		Test.AnotherWay._g_run_on_main_load=false;
+		Test.AnotherWay._run_pages_to_run();
+	}
+}
+Test.AnotherWay._test_object_t.prototype.open_window=null;
+// -->
+</script>
+<script type="text/javascript" src="xml_eq.js"></script>
+<script type="text/javascript" src="geom_eq.js"></script>
+</head><body>
+
+<div id="col1">
+<div id="col1_header">Test pages:</div>
+<div id="scroller">
+<table id="testtable">
+</table>
+</div>
+<div id="run_buttons">
+<input type="button" value=" clear " id="clear_btn" />
+<input type="button" value=" run all " id="run_all" />
+<input type="button" value=" run selected " id="run_selected" />
+<input type="button" value=" unselect all " id="unselect_all" />
+</div>
+<input type="checkbox" id="dont_close_test_windows" /> do not close windows opened by tests
+<div id="error"></div>
+<div id="record_div">
+<p id="record_not_supported" style="display:none"></p>
+<p>Record mouse input for the page:</p>
+<p><input type="radio" name="record_choose" value="select" checked="checked" /> <select id="record_select"><option selected="selected">-- select a page: --</option></select></p>
+<p><input type="radio" name="record_choose" value="input" /> or enter page url: <input type="text" id="record_input" /></p>
+<p><input type="button" value=" record " id="record_start" /></p>
+</div>
+</div>
+
+<div id="col2">
+<div id="right_header">
+<span id="results_count">Results: <span id="total"></span></span>
+<span id="results_tab" class="active_tab" style="visibility:hidden">Results</span>
+<span id="debug_tab" class="inactive_tab" style="visibility:hidden">Debug</span>
+</div>
+<div id="right_frame">
+<div id="results"></div>
+<div id="debug"></div>
+</div>
+</div>
+
+<span style="display:none">
+<iframe name="list_iframe" onload="Test.AnotherWay._list_iframe_onload();"></iframe>
+<iframe name="test_iframe" onload="Test.AnotherWay._test_page_onload();"></iframe>
+
+<!-- record_control div is to be imported into other documents, so all its styles are inline -->
+-<div id="record_control" style="position:absolute;bottom:0;left:0;margin:0;padding:0.5em;width:22em;height:22em;border:1px solid;background:#ffd;font: normal normal 8pt sans-serif; color:#000; text-align: left">
+
+<p style="margin:0 0 0 0; padding:0">
+ 
+<span style="display:none;font-weight:bold;color:#408" id="record_indicator">
+recording. <span style="font-weight:normal">time: <span id="record_time"></span></span><span id="record_pause_indicator"> paused</span>
+</span>
+</p>
+
+<div id="record_cursor_over" style="margin:0;padding:2px;width:14em;height:1.1em;overflow:hidden;float:right;border:1px solid #777;background:#fff;font: normal normal 8pt sans-serif;position:relative;top:3px;color:#000;text-align:left;"> </div>
+<p style="margin:2px 0 0 0; padding:0">
+cursor is over
+</p>
+
+<p style="margin:8px 0 0 0; padding:0;">
+ keyboard control: press
+ <span id="record_ctrl_key" style="border:1px solid #226;background:#adf;padding:0 0.5em">ctrl</span> -
+ <span id="record_shift_key" style="border:1px solid #226;background:#adf;padding:0 0.5em">shift</span> -
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_s" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">s</span>
+<span id="record_on">to <b>start</b> recording</span>
+<span id="record_off" style="display:none">to <b>stop</b> recording</span>
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_h" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">h</span>
+<span>to <b>hide/show</b> this window</span>
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_m" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">m</span>
+<span id="record_include_mousemove">to <b> record</b> mousemove</span>
+<span id="record_omit_mousemove" style="display:none">to <b>omit</b> mousemove</span>
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_p" style="border:1px solid #226;background:#aaa;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">p</span>
+<span id="record_pause_on">to <b> pause</b> recording</span>
+<span id="record_pause_off" style="display:none">to <b>continue</b> recording</span>
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_c" style="border:1px solid #226;background:#aaa;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">c</span>
+<span>to add checkpoint</span>
+</p>
+
+<p style="margin:6px 0 0 0; padding:0">
+checkpoints:
+</p>
+<div id="record_checkpoints" style="position:relative;width:100%;height:6em;overflow:auto;font: normal normal 8pt sans-serif; color:#000; text-align: left">
+</div>
+</div>
+
+</span>
+</body></html>
diff --git a/tests/data/geos_wkt_intersects.js b/tests/data/geos_wkt_intersects.js
new file mode 100644
index 0000000..e0a355b
--- /dev/null
+++ b/tests/data/geos_wkt_intersects.js
@@ -0,0 +1,495 @@
+var geos_test_data = [
+{'wkt1':'POLYGON ((100 100,100 200,200 200,200 100,100 100))', 'wkt2':'POLYGON ((100 100,1000000000000000.0 110.0,1000000000000000.0 100.0,100 100))', result:true},
+{'wkt1':'POLYGON ((120 100,120 200,200 200,200 100,120 100))', 'wkt2':'POLYGON ((100 100,1000000000000000.0 110.0,1000000000000000.0 100.0,100 100))', result:true},
+{'wkt1':'POLYGON ((20 20,20 100,120 100,140 20,20 20))', 'wkt2':'POLYGON ((20 20,20 100,120 100,140 20,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 100,120 100,140 20,20 20))', 'wkt2':'POLYGON ((20 20,140 20,120 100,20 100,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 100,120 100,140 20,20 20))', 'wkt2':'POLYGON ((120 100,140 20,20 20,20 100,120 100))', result:true},
+{'wkt1':'POLYGON ((20 20,20 100,120 100,140 20,20 20))', 'wkt2':'POLYGON ((20 100,60 100,120 100,140 20,80 20,20 20,20 100))', result:true},
+{'wkt1':'POLYGON ((0 0,80 0,80 80,0 80,0 0))', 'wkt2':'POLYGON ((100 200,100 140,180 140,180 200,100 200))', result:false},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((140 120,140 200,240 200,240 120,140 120))', result:true},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((80 180,140 260,260 200,200 60,80 180))', result:true},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((240 80,140 120,180 240,280 200,240 80))', result:true},
+{'wkt1':'POLYGON ((140 160,20 20,270 20,150 160,230 40,60 40,140 160))', 'wkt2':'POLYGON ((140 40,180 80,120 100,140 40))', result:true},
+{'wkt1':'POLYGON ((140 160,20 20,270 20,150 160,230 40,60 40,140 160))', 'wkt2':'POLYGON ((120 100,180 80,130 40,120 100))', result:true},
+{'wkt1':'POLYGON ((20 20,180 20,140 140,20 140,20 20))', 'wkt2':'POLYGON ((180 100,80 200,180 280,260 200,180 100))', result:true},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((140 140,20 120,0 220,120 240,140 140))', result:true},
+{'wkt1':'POLYGON ((160 200,210 70,120 70,160 200))', 'wkt2':'POLYGON ((160 200,260 40,70 40,160 200,20 20,310 20,160 200))', result:true},
+{'wkt1':'POLYGON ((110 140,200 70,200 160,110 140))', 'wkt2':'POLYGON ((110 140,110 50,60 50,60 90,160 190,20 110,20 20,200 20,110 140))', result:true},
+{'wkt1':'POLYGON ((20 120,20 20,260 20,260 120,200 40,140 120,80 40,20 120))', 'wkt2':'POLYGON ((20 120,20 240,260 240,260 120,200 200,140 120,80 200,20 120))', result:true},
+{'wkt1':'POLYGON ((20 120,20 20,260 20,260 120,180 40,140 120,100 40,20 120))', 'wkt2':'POLYGON ((20 120,300 120,140 240,20 120))', result:true},
+{'wkt1':'POLYGON ((20 20,20 300,280 300,280 260,220 260,60 100,60 60,280 60,280 20,20 20))', 'wkt2':'POLYGON ((100 140,160 80,280 180,200 240,220 160,160 200,180 120,100 140))', result:true},
+{'wkt1':'POLYGON ((20 20,20 300,280 300,280 260,220 260,60 100,60 60,280 60,280 20,20 20))', 'wkt2':'POLYGON ((260 200,180 80,120 160,200 160,180 220,260 200))', result:true},
+{'wkt1':'POLYGON ((20 20,280 20,280 140,220 60,140 140,80 60,20 140,20 20))', 'wkt2':'POLYGON ((0 140,300 140,140 240,0 140))', result:true},
+{'wkt1':'POLYGON ((20 20,280 20,280 140,220 60,140 140,80 60,20 140,20 20))', 'wkt2':'POLYGON ((20 240,20 140,320 140,180 240,20 240))', result:true},
+{'wkt1':'POLYGON ((20 20,280 20,280 140,220 60,140 140,80 60,20 140,20 20))', 'wkt2':'POLYGON ((20 240,20 140,80 180,140 140,220 180,280 140,280 240,20 240))', result:true},
+{'wkt1':'POLYGON ((120 120,180 60,20 20,20 120,120 120))', 'wkt2':'POLYGON ((120 120,220 20,280 20,240 160,120 120))', result:true},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((140 120,160 20,260 120,220 200,140 120))', result:true},
+{'wkt1':'POLYGON ((20 140,120 40,20 40,20 140))', 'wkt2':'POLYGON ((190 140,190 20,140 20,20 140,190 140))', result:true},
+{'wkt1':'POLYGON ((120 120,180 60,20 20,20 120,120 120))', 'wkt2':'POLYGON ((300 20,220 20,120 120,260 160,300 20))', result:true},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((140 120,240 160,280 60,160 20,140 120))', result:true},
+{'wkt1':'POLYGON ((120 120,180 60,20 20,20 120,120 120))', 'wkt2':'POLYGON ((280 60,180 60,120 120,260 180,280 60))', result:true},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((120 200,120 120,40 120,40 200,120 200))', result:true},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((160 220,140 120,60 120,40 220,160 220))', result:true},
+{'wkt1':'POLYGON ((140 120,160 20,20 20,20 120,140 120))', 'wkt2':'POLYGON ((140 120,20 120,20 220,140 220,140 120))', result:true},
+{'wkt1':'POLYGON ((120 120,180 60,20 20,20 120,120 120))', 'wkt2':'POLYGON ((320 20,220 20,80 160,240 140,320 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((60 40,60 140,180 140,180 40,60 40))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,80 140,160 60,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((160 60,20 20,100 140,160 60))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 100,140 160,160 40,20 100))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((160 40,20 100,160 160,160 40))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 180,180 120,80 40,20 180))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((180 120,100 40,20 180,180 120))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,140 40,140 120,20 160,80 80,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,140 40,140 140,20 180,80 100,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((40 180,60 100,180 100,200 180,120 120,40 180))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 180,60 80,180 80,220 180,120 120,20 180))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((40 60,20 180,100 100,140 180,160 120,220 100,140 40,40 60))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((60 100,180 100,220 180,120 140,20 180,60 100))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,20 140,120 120,120 40,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,20 180,140 140,140 60,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,120 40,120 120,20 140,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((120 40,20 20,20 140,120 120,120 40))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,140 60,140 140,20 180,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((140 60,20 20,20 180,140 140,140 60))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,60 120,140 120,180 20,20 20))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 40,120 40,120 120,20 140,20 40))', result:true},
+{'wkt1':'POLYGON ((20 20,20 180,220 180,220 20,20 20))', 'wkt2':'POLYGON ((20 20,20 180,60 120,100 180,140 120,220 180,200 120,140 60,20 20))', result:true},
+{'wkt1':'POLYGON ((150 150,330 150,250 70,70 70,150 150))', 'wkt2':'POLYGON ((150 150,270 150,140 20,20 20,150 150))', result:true},
+{'wkt1':'POLYGON ((150 150,270 150,330 150,250 70,190 70,70 70,150 150))', 'wkt2':'POLYGON ((150 150,270 150,190 70,140 20,20 20,70 70,150 150))', result:true},
+{'wkt1':'POLYGON ((20 20,60 50,20 40,60 70,20 60,60 90,20 90,70 110,20 130,80 130,20 150,80 160,20 170,80 180,20 200,80 200,30 240,80 220,50 260,100 220,100 260,120 220,130 260,140 220,150 280,150 190,160 280,170 190,180 280,190 190,200 280,210 190,220 280,230 190,240 260,250 230,260 260,260 220,290 270,290 220,330 260,300 210,340 240,290 180,340 210,290 170,350 170,240 150,350 150,240 140,350 130,240 120,350 120,240 110,350 110,240 100,350 100,240 90,350 90,240 80,350 80,300 70,340 60,2 [...]
+{'wkt1':'POLYGON ((70 150,20 160,110 160,20 180,100 200,20 200,190 210,20 210,160 220,20 220,150 230,60 240,180 250,20 260,170 260,60 270,160 270,100 310,170 280,200 260,180 230,210 260,130 330,230 250,210 290,240 250,230 210,260 300,250 230,270 300,270 240,300 340,280 250,320 330,290 250,340 350,290 240,350 360,270 190,350 340,290 200,350 330,300 190,360 320,310 190,360 300,320 200,360 280,330 200,360 260,340 200,370 260,340 180,390 290,340 170,400 260,350 170,400 250,350 160,410 240,35 [...]
+{'wkt1':'POLYGON ((60 160,220 160,220 20,60 20,60 160))', 'wkt2':'POLYGON ((60 160,20 200,260 200,220 160,140 80,60 160))', result:true},
+{'wkt1':'POLYGON ((60 160,220 160,220 20,60 20,60 160))', 'wkt2':'POLYGON ((60 160,20 200,260 200,140 80,60 160))', result:true},
+{'wkt1':'POLYGON ((60 160,220 160,220 20,60 20,60 160))', 'wkt2':'POLYGON ((20 200,140 80,260 200,20 200))', result:true},
+{'wkt1':'POLYGON ((60 160,220 160,220 20,60 20,60 160))', 'wkt2':'POLYGON ((20 200,60 160,140 80,220 160,260 200,20 200))', result:true},
+{'wkt1':'POLYGON ((60 160,220 160,220 20,60 20,60 160))', 'wkt2':'POLYGON ((20 200,60 160,140 80,260 200,20 200))', result:true},
+{'wkt1':'POLYGON ((0 0,0 200,200 200,200 0,0 0))', 'wkt2':'POLYGON ((100 100,1000000 110,10000000 100,100 100))', result:true},
+{'wkt1':'POLYGON ((100 0,100 200,200 200,200 0,100 0))', 'wkt2':'POLYGON ((100 100,1000000 110,10000000 100,100 100))', result:true},
+{'wkt1':'POLYGON ((120 0,120 200,200 200,200 0,120 0))', 'wkt2':'POLYGON ((100 100,1000000 110,10000000 100,100 100))', result:true},
+{'wkt1':'POLYGON ((0 0,0 200,110 200,110 0,0 0))', 'wkt2':'POLYGON ((100 100,1000000 110,10000000 100,100 100))', result:true},
+{'wkt1':'POLYGON ((100 100,100 200,200 200,200 100,100 100))', 'wkt2':'POLYGON ((100 100,2100 110,2100 100,100 100))', result:true},
+{'wkt1':'POLYGON ((100 100,100 200,200 200,200 100,100 100))', 'wkt2':'POLYGON ((100 100,2101 110,2101 100,100 100))', result:true},
+{'wkt1':'POLYGON ((100 100,200 200,200 100,100 100))', 'wkt2':'POLYGON ((100 100,2101 110,2101 100,100 100))', result:true},
+{'wkt1':'POLYGON ((100 100,100 200,200 200,200 100,100 100))', 'wkt2':'POLYGON ((100 100,1000000 110,1000000 100,100 100))', result:true},
+{'wkt1':'POLYGON ((120 100,120 200,200 200,200 100,120 100))', 'wkt2':'POLYGON ((100 100,500 110,500 100,100 100))', result:true},
+{'wkt1':'POLYGON ((120 100,120 200,200 200,200 100,120 100))', 'wkt2':'POLYGON ((100 100,501 110,501 100,100 100))', result:true},
+{'wkt1':'POLYGON ((120 100,130 200,200 200,200 100,120 100))', 'wkt2':'POLYGON ((100 100,501 110,501 100,100 100))', result:true},
+{'wkt1':'POLYGON ((120 100,17 200,200 200,200 100,120 100))', 'wkt2':'POLYGON ((100 100,501 110,501 100,100 100))', result:true},
+{'wkt1':'POLYGON ((120 100,120 200,200 200,200 100,120 100))', 'wkt2':'POLYGON ((100 100,1000000 110,1000000 100,100 100))', result:true},
+{'wkt1':'POLYGON ((101 99,101 1000000,102 1000000,101 99))', 'wkt2':'POLYGON ((100 100,1000000 110,1000000 100,100 100))', result:true},
+{'wkt1':'POLYGON ((100 100,200 101,200 100,100 100))', 'wkt2':'POLYGON ((100 100,2101 110,2101 100,100 100))', result:true},
+{'wkt1':'POLYGON ((16 319,150 39,25 302,160 20,265 20,127 317,16 319))', 'wkt2':'POLYGON ((10 307,22 307,153 34,22 34,10 307))', result:true},
+{'wkt1':'POLYGON ((160 200,210 70,120 70,160 200))', 'wkt2':'POLYGON ((160 200,310 20,20 20,160 200),(160 200,260 40,70 40,160 200))', result:true},
+{'wkt1':'POLYGON ((170 120,240 100,260 50,190 70,170 120))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((270 90,200 50,150 80,210 120,270 90))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((170 120,260 100,240 60,150 80,170 120))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((220 120,270 80,200 60,160 100,220 120))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((260 50,180 70,180 110,260 90,260 50))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((230 110,290 80,190 60,140 90,230 110))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((170 120,330 120,260 50,100 50,170 120))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((170 120,330 120,280 70,120 70,170 120))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((170 120,300 120,250 70,120 70,170 120))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((190 100,310 100,260 50,140 50,190 100))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((280 130,360 130,270 40,190 40,280 130))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,250 120,180 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((220 80,180 40,80 40,170 130,270 130,230 90,300 90,250 30,280 30,390 140,150 140,40 30,230 30,280 80,220 80))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,250 120,180 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((260 130,360 130,280 40,170 40,260 130))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,250 120,180 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((240 110,340 110,290 60,190 60,240 110))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,250 120,180 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((250 120,350 120,280 50,180 50,250 120))', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,250 120,180 50,100 50,170 120))', result:true},
+{'wkt1':'POLYGON ((230 210,230 20,20 20,20 210,230 210),(120 180,50 50,200 50,120 180))', 'wkt2':'POLYGON ((230 210,230 20,20 20,20 210,230 210),(120 180,50 50,200 50,120 180))', result:true},
+{'wkt1':'POLYGON ((230 210,230 20,20 20,20 210,230 210),(140 40,40 40,40 170,140 40),(110 190,210 190,210 50,110 190))', 'wkt2':'POLYGON ((230 210,230 20,20 20,20 210,230 210),(140 40,40 40,40 170,140 40),(110 190,210 190,210 50,110 190))', result:true},
+{'wkt1':'POLYGON ((280 190,330 150,200 110,150 150,280 190))', 'wkt2':'MULTIPOLYGON (((140 110,260 110,170 20,50 20,140 110)),((300 270,420 270,340 190,220 190,300 270)))', result:true},
+{'wkt1':'POLYGON ((80 190,220 190,140 110,0 110,80 190))', 'wkt2':'MULTIPOLYGON (((140 110,260 110,170 20,50 20,140 110)),((300 270,420 270,340 190,220 190,300 270)))', result:true},
+{'wkt1':'POLYGON ((330 150,200 110,150 150,280 190,330 150))', 'wkt2':'MULTIPOLYGON (((140 110,260 110,170 20,50 20,140 110)),((300 270,420 270,340 190,220 190,300 270)))', result:true},
+{'wkt1':'POLYGON ((290 190,340 150,220 120,170 170,290 190))', 'wkt2':'MULTIPOLYGON (((140 110,260 110,170 20,50 20,140 110)),((300 270,420 270,340 190,220 190,300 270)))', result:true},
+{'wkt1':'POLYGON ((220 190,340 190,260 110,140 110,220 190))', 'wkt2':'MULTIPOLYGON (((140 110,260 110,170 20,50 20,140 110)),((300 270,420 270,340 190,220 190,300 270)))', result:true},
+{'wkt1':'POLYGON ((140 190,220 190,100 70,20 70,140 190))', 'wkt2':'MULTIPOLYGON (((140 110,260 110,170 20,50 20,140 110)),((300 270,420 270,340 190,220 190,300 270)))', result:true},
+{'wkt1':'POLYGON ((140 220,60 140,140 60,220 140,140 220))', 'wkt2':'MULTIPOLYGON (((100 20,180 20,180 100,100 100,100 20)),((20 100,100 100,100 180,20 180,20 100)),((100 180,180 180,180 260,100 260,100 180)),((180 100,260 100,260 180,180 180,180 100)))', result:true},
+{'wkt1':'MULTIPOLYGON (((110 110,70 200,150 200,110 110)),((110 110,150 20,70 20,110 110)))', 'wkt2':'MULTIPOLYGON (((110 110,160 160,210 110,160 60,110 110)),((110 110,60 60,10 110,60 160,110 110)))', result:true},
+{'wkt1':'MULTIPOLYGON (((110 110,70 200,150 200,110 110),(110 110,100 180,120 180,110 110)),((110 110,150 20,70 20,110 110),(110 110,120 40,100 40,110 110)))', 'wkt2':'MULTIPOLYGON (((110 110,160 160,210 110,160 60,110 110),(110 110,160 130,160 90,110 110)),((110 110,60 60,10 110,60 160,110 110),(110 110,60 90,60 130,110 110)))', result:true},
+{'wkt1':'MULTIPOLYGON (((110 110,70 200,200 200,110 110),(110 110,100 180,120 180,110 110)),((110 110,200 20,70 20,110 110),(110 110,120 40,100 40,110 110)))', 'wkt2':'MULTIPOLYGON (((110 110,160 160,210 110,160 60,110 110),(110 110,160 130,160 90,110 110)),((110 110,60 60,10 110,60 160,110 110),(110 110,60 90,60 130,110 110)))', result:true},
+{'wkt1':'MULTIPOLYGON (((110 110,20 200,200 200,110 110),(110 110,100 180,120 180,110 110)),((110 110,200 20,20 20,110 110),(110 110,120 40,100 40,110 110)))', 'wkt2':'MULTIPOLYGON (((110 110,160 160,210 110,160 60,110 110),(110 110,160 130,160 90,110 110)),((110 110,60 60,10 110,60 160,110 110),(110 110,60 90,60 130,110 110)))', result:true},
+{'wkt1':'MULTIPOLYGON (((110 110,70 200,200 200,110 110),(110 110,100 180,120 180,110 110)),((110 110,200 20,70 20,110 110),(110 110,120 40,100 40,110 110)))', 'wkt2':'MULTIPOLYGON (((110 110,160 160,210 110,160 60,110 110),(110 110,160 130,160 90,110 110)),((110 110,60 60,10 110,60 160,110 110),(110 110,60 90,60 130,110 110)))', result:true},
+{'wkt1':'MULTIPOLYGON (((110 110,70 200,200 200,110 110),(110 110,100 180,120 180,110 110)),((110 110,200 20,70 20,110 110),(110 110,120 40,100 40,110 110)))', 'wkt2':'MULTIPOLYGON (((110 110,70 200,210 110,70 20,110 110),(110 110,110 140,150 110,110 80,110 110)),((110 110,60 60,10 110,60 160,110 110),(110 110,60 90,60 130,110 110)))', result:true},
+{'wkt1':'POLYGON ((100 60,140 100,100 140,60 100,100 60))', 'wkt2':'MULTIPOLYGON (((80 40,120 40,120 80,80 80,80 40)),((120 80,160 80,160 120,120 120,120 80)),((80 120,120 120,120 160,80 160,80 120)),((40 80,80 80,80 120,40 120,40 80)))', result:true},
+{'wkt1':'LINESTRING (150 150,40 230)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (40 40,50 130,130 130)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (40 230,150 150)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (210 150,330 150)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (200 150,310 150,360 220)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (180 150,250 150,230 250,370 250,410 150)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (210 210,220 150,320 150,370 210)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (20 60,150 60)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (60 90,310 180)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (90 210,210 90)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (290 10,130 170)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (30 100,100 100,180 100)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (20 100,100 100,360 100,410 100)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (90 210,150 150,210 90)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (180 90,280 120)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (70 70,80 20)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (130 20,150 60)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (70 70,80 20,140 20,150 60)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (170 50,170 20,240 20,260 60)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150))', result:true},
+{'wkt1':'LINESTRING (50 100,140 190,280 190)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:false},
+{'wkt1':'LINESTRING (140 60,180 100,290 100)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:false},
+{'wkt1':'LINESTRING (170 120,210 80,270 80)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'LINESTRING (170 120,260 50)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'LINESTRING (190 90,190 270)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(190 190,280 50,100 50,190 190))', result:true},
+{'wkt1':'LINESTRING (60 160,150 70)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(110 110,250 100,140 30,110 110))', result:true},
+{'wkt1':'LINESTRING (60 160,150 70)', 'wkt2':'POLYGON ((190 190,20 20,360 20,190 190),(250 100,110 110,140 30,250 100))', result:true},
+{'wkt1':'LINESTRING (60 160,150 70)', 'wkt2':'POLYGON ((190 190,20 20,360 20,190 190),(250 100,110 110,140 30,250 100))', result:true},
+{'wkt1':'LINESTRING (190 90,190 190,190 270)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(190 190,280 50,100 50,190 190))', result:true},
+{'wkt1':'LINESTRING (60 160,110 110,150 70)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(110 110,250 100,140 30,110 110))', result:true},
+{'wkt1':'LINESTRING (60 160,110 110,150 70)', 'wkt2':'POLYGON ((190 190,20 20,360 20,190 190),(250 100,110 110,140 30,250 100))', result:true},
+{'wkt1':'LINESTRING (60 160,110 110,150 70)', 'wkt2':'POLYGON ((190 190,110 110,20 20,360 20,190 190),(250 100,110 110,140 30,250 100))', result:true},
+{'wkt1':'LINESTRING (130 110,180 110,190 60)', 'wkt2':'POLYGON ((20 200,240 200,240 20,20 20,20 200),(130 110,60 180,60 40,130 110),(130 110,200 40,200 180,130 110))', result:true},
+{'wkt1':'LINESTRING (80 110,180 110)', 'wkt2':'POLYGON ((20 200,240 200,240 20,20 20,20 200),(130 110,60 180,60 40,130 110),(130 110,200 40,200 180,130 110))', result:true},
+{'wkt1':'LINESTRING (80 110,180 110)', 'wkt2':'POLYGON ((20 200,20 20,240 20,240 200,20 200),(60 180,130 110,60 40,60 180),(130 110,200 40,200 180,130 110))', result:true},
+{'wkt1':'LINESTRING (80 110,170 110)', 'wkt2':'POLYGON ((20 200,20 20,240 20,240 200,20 200),(130 110,60 40,60 180,130 110),(130 180,130 40,200 110,130 180))', result:true},
+{'wkt1':'LINESTRING (80 110,130 110,170 110)', 'wkt2':'POLYGON ((20 200,20 20,240 20,240 200,20 200),(130 110,60 40,60 180,130 110),(130 180,130 40,200 110,130 180))', result:true},
+{'wkt1':'LINESTRING (80 110,130 110,180 110)', 'wkt2':'POLYGON ((20 200,240 200,240 20,20 20,20 200),(130 110,60 180,60 40,130 110),(130 110,200 40,200 180,130 110))', result:true},
+{'wkt1':'LINESTRING (80 110,130 110,180 110)', 'wkt2':'POLYGON ((20 200,20 20,240 20,240 200,20 200),(60 180,130 110,60 40,60 180),(130 110,200 40,200 180,130 110))', result:true},
+{'wkt1':'LINESTRING (80 110,130 110,170 110)', 'wkt2':'POLYGON ((20 200,20 20,240 20,240 200,20 200),(130 110,60 40,60 180,130 110),(130 180,130 40,200 110,130 180))', result:true},
+{'wkt1':'LINESTRING (160 70,320 230)', 'wkt2':'MULTIPOLYGON (((140 110,260 110,170 20,50 20,140 110)),((300 270,420 270,340 190,220 190,300 270)))', result:true},
+{'wkt1':'LINESTRING (160 70,200 110,280 190,320 230)', 'wkt2':'MULTIPOLYGON (((140 110,260 110,170 20,50 20,140 110)),((300 270,420 270,340 190,220 190,300 270)))', result:true},
+{'wkt1':'LINESTRING (70 50,70 150)', 'wkt2':'MULTIPOLYGON (((0 0,0 100,140 100,140 0,0 0)),((20 170,70 100,130 170,20 170)))', result:true},
+{'wkt1':'LINESTRING (110 110,20 200,200 200,110 110)', 'wkt2':'POLYGON ((20 20,200 20,110 110,20 20))', result:true},
+{'wkt1':'LINESTRING (150 70,160 110,200 60,150 70)', 'wkt2':'POLYGON ((20 20,200 20,110 110,20 20))', result:true},
+{'wkt1':'LINESTRING (80 60,120 40,120 70,80 60)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,50 30,170 30,110 90))', result:true},
+{'wkt1':'LINESTRING (20 20,200 20,110 110,20 20)', 'wkt2':'POLYGON ((20 20,200 20,110 110,20 20))', result:true},
+{'wkt1':'LINESTRING (110 90,170 30,50 30,110 90)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,50 30,170 30,110 90))', result:true},
+{'wkt1':'LINESTRING (110 110,170 50,170 110,110 110)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,50 30,170 30,110 90))', result:true},
+{'wkt1':'LINESTRING (110 90,70 50,130 50,110 90)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,50 30,170 30,110 90))', result:true},
+{'wkt1':'LINESTRING (110 60,20 150,200 150,110 60)', 'wkt2':'POLYGON ((20 20,200 20,110 110,20 20))', result:true},
+{'wkt1':'LINESTRING (110 130,110 70,200 100,110 130)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,50 30,170 30,110 90))', result:true},
+{'wkt1':'LINESTRING (110 90,160 40,60 40,110 90)', 'wkt2':'POLYGON ((20 20,200 20,110 110,20 20))', result:true},
+{'wkt1':'LINESTRING (110 100,40 30,180 30,110 100)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,60 40,160 40,110 90))', result:true},
+{'wkt1':'LINESTRING (110 110,180 30,40 30,110 110)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,60 40,160 40,110 90))', result:true},
+{'wkt1':'LINESTRING (110 90,180 30,40 30,110 90)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,60 40,160 40,110 90))', result:true},
+{'wkt1':'LINESTRING (110 90,50 30,180 30,110 90)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110),(110 90,60 40,160 40,110 90))', result:true},
+{'wkt1':'LINESTRING (110 110,200 200,200 110,110 200)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'LINESTRING (110 110,200 200,110 110,20 200,20 110,200 110)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'LINESTRING (110 110,20 110,200 110,50 110,110 170)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'LINESTRING (110 110,20 200,110 200,110 110,200 200)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'LINESTRING (110 110,170 50,20 200,20 110,200 110)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'LINESTRING (110 110,180 40,110 40,110 180)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'LINESTRING (110 60,50 30,170 30,90 70)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'LINESTRING (110 110,180 40,110 40,110 110,70 40)', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'LINESTRING (230 70,170 120,190 60,140 60,170 120,270 90)', 'wkt2':'POLYGON ((150 150,410 150,280 20,20 20,150 150),(170 120,330 120,260 50,100 50,170 120))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110),(200 200,110 110,20 210,110 110))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110),(60 180,60 110,160 110,110 110))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110),(200 200,110 110,20 200,110 200,110 110))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110),(110 50,110 170,110 70,110 150,200 150))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110),(50 110,170 110,110 170,110 50,110 170,110 50))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110),(110 60,110 160,200 160))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110),(110 60,110 160,200 160))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((110 100,40 30,180 30),(170 30,110 90,50 30))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((110 110,60 40,70 20,150 20,170 40),(180 30,40 30,110 80))', 'wkt2':'POLYGON ((110 110,200 20,20 20,110 110))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110,200 160),(110 110,200 110,200 70,20 150))', 'wkt2':'MULTIPOLYGON (((110 110,20 20,200 20,110 110)),((110 110,20 200,200 200,110 110)))', result:true},
+{'wkt1':'MULTILINESTRING ((20 160,70 110,150 110,200 160),(110 110,20 110,50 80,70 110,200 110))', 'wkt2':'MULTIPOLYGON (((110 110,20 20,200 20,110 110)),((110 110,20 200,200 200,110 110)))', result:true},
+{'wkt1':'MULTILINESTRING ((20 110,200 110),(110 110,20 170,20 130,200 90))', 'wkt2':'MULTIPOLYGON (((110 110,20 20,200 20,110 110)),((110 110,20 200,200 200,110 110)))', result:true},
+{'wkt1':'LINESTRING (0 0,0 50,50 50,50 0,0 0)', 'wkt2':'MULTILINESTRING ((0 0,0 50),(0 50,50 50),(50 50,50 0),(50 0,0 0))', result:true},
+{'wkt1':'LINESTRING (40 180,140 180)', 'wkt2':'MULTIPOLYGON (((20 320,180 320,180 180,20 180,20 320)),((20 180,20 80,180 80,180 180,20 180)))', result:true},
+{'wkt1':'LINESTRING (40 180,140 180)', 'wkt2':'MULTIPOLYGON (((20 320,180 320,180 180,20 180,20 320)),((60 180,60 80,180 80,180 180,60 180)))', result:true},
+{'wkt1':'LINESTRING (0 0,60 0,60 60,60 0,120 0)', 'wkt2':'MULTILINESTRING ((0 0,60 0),(60 0,120 0),(60 0,60 60))', result:true},
+{'wkt1':'LINESTRING (40 40,120 120)', 'wkt2':'LINESTRING (40 40,60 120)', result:true},
+{'wkt1':'LINESTRING (40 40,120 120)', 'wkt2':'LINESTRING (60 240,40 40)', result:true},
+{'wkt1':'LINESTRING (40 40,180 180)', 'wkt2':'LINESTRING (120 120,20 200)', result:true},
+{'wkt1':'LINESTRING (40 40,120 120)', 'wkt2':'LINESTRING (60 240,120 120)', result:true},
+{'wkt1':'LINESTRING (40 40,180 180)', 'wkt2':'LINESTRING (20 180,140 140)', result:true},
+{'wkt1':'LINESTRING (40 40,120 120)', 'wkt2':'LINESTRING (40 120,120 40)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100)', 'wkt2':'LINESTRING (40 40,100 100)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100)', 'wkt2':'LINESTRING (100 100,40 40)', result:true},
+{'wkt1':'LINESTRING (40 40,120 120)', 'wkt2':'LINESTRING (40 120,120 160)', result:false},
+{'wkt1':'LINESTRING (20 20,180 180)', 'wkt2':'LINESTRING (20 20,180 180)', result:true},
+{'wkt1':'LINESTRING (20 20,180 180)', 'wkt2':'LINESTRING (20 20,110 110)', result:true},
+{'wkt1':'LINESTRING (20 20,180 180)', 'wkt2':'LINESTRING (50 50,140 140)', result:true},
+{'wkt1':'LINESTRING (180 180,40 40)', 'wkt2':'LINESTRING (120 120,260 260)', result:true},
+{'wkt1':'LINESTRING (40 40,180 180)', 'wkt2':'LINESTRING (260 260,120 120)', result:true},
+{'wkt1':'LINESTRING (40 40,180 180)', 'wkt2':'LINESTRING (120 120,260 260)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (40 40,20 100,40 160,20 200)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (20 200,40 160,20 100,40 40)', result:true},
+{'wkt1':'LINESTRING (80 240,200 120,100 100,40 40)', 'wkt2':'LINESTRING (20 200,40 160,20 100,40 40)', result:true},
+{'wkt1':'LINESTRING (60 60,60 230,140 230,250 160)', 'wkt2':'LINESTRING (20 20,60 60,250 160,310 230)', result:true},
+{'wkt1':'LINESTRING (60 60,60 230,140 230,250 160)', 'wkt2':'LINESTRING (20 20,110 110,200 110,320 230)', result:true},
+{'wkt1':'LINESTRING (60 110,60 250,360 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (60 110,60 250,360 210)', 'wkt2':'LINESTRING (360 210,310 160,110 160,60 110)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (160 160,240 240)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (240 240,160 160)', result:true},
+{'wkt1':'LINESTRING (60 60,60 230,140 230,250 160)', 'wkt2':'LINESTRING (60 150,110 100,170 100,110 230)', result:true},
+{'wkt1':'LINESTRING (60 60,60 230,140 230,250 160)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (200 120,200 190,150 240,200 240)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (200 240,150 240,200 200,200 120)', result:true},
+{'wkt1':'LINESTRING (60 60,60 230,140 230,250 160)', 'wkt2':'LINESTRING (60 230,80 140,120 140,140 230)', result:true},
+{'wkt1':'LINESTRING (60 110,200 110,250 160,300 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (60 110,200 110,250 160,300 210,360 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (60 110,220 110,250 160,280 110)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (60 110,150 110,200 160,250 110,360 110,360 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (130 160,160 110,220 110,250 160,250 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (130 160,160 110,190 110,230 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (130 160,160 110,200 110,230 160,260 210,360 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (130 160,160 110,200 110,230 160,260 210,360 210,380 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (130 160,160 110,200 110,230 160,260 210,380 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (110 160,160 110,200 110,250 160,250 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (110 160,180 110,250 160,320 110)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (140 160,180 80,220 160,250 80)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,130 190)', 'wkt2':'LINESTRING (20 130,70 130,160 40)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,130 190)', 'wkt2':'LINESTRING (40 160,40 100,110 40,170 40)', result:true},
+{'wkt1':'LINESTRING (130 110,180 160,230 110,280 160,330 110)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,130 190)', 'wkt2':'LINESTRING (30 140,80 140,100 100,200 30)', result:true},
+{'wkt1':'LINESTRING (110 110,110 160,180 110,250 160,250 110)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (20 20,80 80,160 80,240 80,300 140)', 'wkt2':'LINESTRING (20 60,60 60,60 140,80 80,100 20,140 140,180 20,200 80,220 20,240 80,300 80,270 110,200 110)', result:true},
+{'wkt1':'LINESTRING (20 20,230 20,20 30,170 30,20 40,230 40,20 50,230 60,60 60,230 70,20 70,180 80,60 80,230 90,20 90,230 100,30 100,210 110,20 110,80 120,20 130,170 130,90 120,230 130,170 140,230 140,80 150,160 140,20 140,70 150,20 150,230 160,80 160,230 170,20 160,180 170,20 170,230 180,20 180,40 190,230 190,20 200,230 200)', 'wkt2':'LINESTRING (30 210,30 60,40 210,40 30,50 190,50 20,60 160,60 50,70 220,70 50,80 20,80 210,90 50,90 150,100 30,100 210,110 20,110 190,120 50,120 180,130 21 [...]
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (40 40,100 100,200 120,80 240)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (80 240,200 120,100 100,40 40)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (80 240,120 200,200 120,100 100,80 80,40 40)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (260 210,240 130,280 120,260 40)', result:false},
+{'wkt1':'LINESTRING (100 20,20 20,20 160,210 160,210 20,110 20,50 120,120 150,200 150)', 'wkt2':'LINESTRING (140 130,100 110,120 60,170 60)', result:false},
+{'wkt1':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (60 110,110 160,310 160,360 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', result:true},
+{'wkt1':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', 'wkt2':'LINESTRING (60 110,110 160,250 160)', result:true},
+{'wkt1':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', 'wkt2':'LINESTRING (110 160,310 160,340 190)', result:true},
+{'wkt1':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', 'wkt2':'LINESTRING (140 160,250 160,310 160,340 190)', result:true},
+{'wkt1':'LINESTRING (60 110,110 160,250 160,310 160,360 210)', 'wkt2':'LINESTRING (110 160,250 160,310 160)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (200 120,100 100,40 40,140 80,200 40)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (280 240,240 140,200 120,100 100,40 40)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (80 190,140 140,40 40)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (240 200,200 260,80 240,140 180)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (140 180,80 240,200 260,240 200)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (280 240,240 140,200 120,80 240)', result:true},
+{'wkt1':'LINESTRING (20 20,80 80,160 80,240 80,300 140)', 'wkt2':'LINESTRING (20 80,120 80,200 80,260 20)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (100 100,200 120,240 140,280 240)', result:true},
+{'wkt1':'LINESTRING (40 40,100 100,200 120,80 240)', 'wkt2':'LINESTRING (280 240,240 140,200 120,100 100)', result:true},
+{'wkt1':'LINESTRING (20 20,80 80,160 80,240 80,300 140)', 'wkt2':'LINESTRING (80 20,80 80,240 80,300 20)', result:true},
+{'wkt1':'LINESTRING (20 20,80 80,160 80,240 80,300 140)', 'wkt2':'LINESTRING (20 80,80 80,120 80,140 140,160 80,200 80,220 20,240 80,270 110,300 80)', result:true},
+{'wkt1':'LINESTRING (100 100,20 180,180 180)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (20 100,180 100,100 180)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (100 40,100 160,180 160)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (20 100,100 100,180 100,100 180)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (100 100,160 40)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (100 100,180 20)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (60 60,100 100,140 60)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (100 100,190 10,190 100)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (100 100,160 40,160 100)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (60 140,160 40,160 140)', 'wkt2':'LINESTRING (100 100,180 20,20 20,100 100)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (80 80,20 80,140 80,80 20,80 140)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (80 80,20 80,140 80)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (80 80,140 80,80 20,80 140)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (80 80,20 80,140 80,80 20,80 80)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (80 80,20 80,140 80,80 80)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (80 80,20 80,20 140,140 20,80 20,80 80)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (20 140,140 20,100 20,100 80)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (140 80,20 80,120 80,80 20,80 140)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (140 80,20 80,140 80)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (140 80,20 80,80 140,80 20)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (140 80,80 80,20 80,50 140,50 60)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (140 80,20 80,120 80,80 20,80 80,80 140)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (140 80,20 80,80 80,140 80)', result:true},
+{'wkt1':'LINESTRING (20 20,140 140)', 'wkt2':'LINESTRING (140 80,20 80,80 140,80 80,80 20)', result:true},
+{'wkt1':'LINESTRING (130 150,220 150,220 240)', 'wkt2':'LINESTRING (130 240,130 150,220 20,50 20,130 150)', result:true},
+{'wkt1':'LINESTRING (30 150,130 150,250 150)', 'wkt2':'LINESTRING (130 240,130 150,220 20,50 20,130 150)', result:true},
+{'wkt1':'LINESTRING (30 150,250 150)', 'wkt2':'LINESTRING (130 240,130 150,220 20,50 20,130 150)', result:true},
+{'wkt1':'LINESTRING (30 150,130 150,250 150)', 'wkt2':'LINESTRING (130 240,130 20,30 20,130 150)', result:true},
+{'wkt1':'LINESTRING (30 150,250 150)', 'wkt2':'LINESTRING (120 240,120 20,20 20,120 170)', result:true},
+{'wkt1':'LINESTRING (200 200,20 20,200 20,110 110,20 200,110 200,110 110)', 'wkt2':'LINESTRING (110 110,200 110)', result:true},
+{'wkt1':'LINESTRING (110 110,200 110)', 'wkt2':'LINESTRING (200 200,20 20,200 20,110 110,20 200,110 200,110 110)', result:true},
+{'wkt1':'LINESTRING (20 110,200 110)', 'wkt2':'LINESTRING (200 200,20 20,200 20,110 110,20 200,110 200,110 110)', result:true},
+{'wkt1':'LINESTRING (200 200,20 20,200 20,110 110,20 200,110 200,110 110)', 'wkt2':'LINESTRING (20 110,200 110)', result:true},
+{'wkt1':'LINESTRING (90 200,90 130,110 110,150 200)', 'wkt2':'LINESTRING (200 200,20 20,200 20,20 200,20 130,90 130)', result:true},
+{'wkt1':'LINESTRING (200 110,110 110,90 130,90 200)', 'wkt2':'LINESTRING (200 200,20 20,200 20,20 200,20 130,90 130)', result:true},
+{'wkt1':'LINESTRING (80 80,150 80,210 80)', 'wkt2':'MULTILINESTRING ((20 20,140 140),(20 140,140 20))', result:true},
+{'wkt1':'LINESTRING (40 80,160 200,260 20,40 80)', 'wkt2':'LINESTRING (40 80,160 200,260 20,40 80)', result:true},
+{'wkt1':'LINESTRING (40 80,160 200,260 20,40 80)', 'wkt2':'LINESTRING (40 80,260 20,160 200,40 80)', result:true},
+{'wkt1':'LINESTRING (40 80,160 200,260 20,40 80)', 'wkt2':'LINESTRING (260 20,40 80,160 200,260 20)', result:true},
+{'wkt1':'LINESTRING (40 80,160 200,260 20,40 80)', 'wkt2':'LINESTRING (100 140,160 200,260 20,40 80,100 140)', result:true},
+{'wkt1':'LINESTRING (100 100,180 20,20 20,100 100)', 'wkt2':'LINESTRING (100 100,180 180,20 180,100 100)', result:true},
+{'wkt1':'LINESTRING (40 150,40 40,150 40,150 150,40 150)', 'wkt2':'LINESTRING (40 150,150 40,170 20,170 190,40 150)', result:true},
+{'wkt1':'LINESTRING (100 100,180 20,20 20,100 100)', 'wkt2':'LINESTRING (180 100,20 100,100 180,180 100)', result:true},
+{'wkt1':'LINESTRING (100 100,180 20,20 20,100 100)', 'wkt2':'LINESTRING (180 180,100 100,20 180,180 180)', result:true},
+{'wkt1':'LINESTRING (20 180,100 100,20 20,20 180)', 'wkt2':'LINESTRING (100 20,100 180,180 100,100 20)', result:true},
+{'wkt1':'LINESTRING (40 150,40 40,150 40,150 150,40 150)', 'wkt2':'LINESTRING (170 20,20 170,170 170,170 20)', result:true},
+{'wkt1':'LINESTRING (40 150,40 40,150 40,150 150,40 150)', 'wkt2':'LINESTRING (40 150,150 150,90 210,40 150)', result:true},
+{'wkt1':'LINESTRING (40 150,40 40,150 40,150 150,40 150)', 'wkt2':'LINESTRING (20 150,170 150,90 230,20 150)', result:true},
+{'wkt1':'LINESTRING (40 150,40 40,150 40,150 150,40 150)', 'wkt2':'LINESTRING (40 150,150 150,150 40,20 40,20 150,40 150)', result:true},
+{'wkt1':'LINESTRING (110 110,200 20,20 20,110 110)', 'wkt2':'LINESTRING (110 110,200 200,110 110,20 200,20 110,200 110)', result:true},
+{'wkt1':'LINESTRING (110 110,200 20,20 20,110 110)', 'wkt2':'LINESTRING (110 110,20 110,200 110,50 110,110 170)', result:true},
+{'wkt1':'LINESTRING (110 110,200 20,20 20,110 110)', 'wkt2':'LINESTRING (110 110,20 200,110 200,110 110,200 200)', result:true},
+{'wkt1':'LINESTRING (110 110,200 20,20 20,110 110)', 'wkt2':'LINESTRING (200 20,20 200,200 200,110 110,110 40)', result:true},
+{'wkt1':'LINESTRING (110 110,200 20,20 20,110 110)', 'wkt2':'LINESTRING (200 20,20 200,200 200,20 20)', result:true},
+{'wkt1':'LINESTRING (110 110,20 110,110 20,20 20,110 110)', 'wkt2':'LINESTRING (110 110,200 200,110 200,200 110,110 110)', result:true},
+{'wkt1':'LINESTRING (20 120,120 120,20 20,120 20,20 120)', 'wkt2':'LINESTRING (170 100,70 100,170 170,70 170,170 100)', result:true},
+{'wkt1':'LINESTRING (20 110,110 110,20 20,110 20,20 110)', 'wkt2':'LINESTRING (110 160,70 110,60 160,20 130,110 160)', result:true},
+{'wkt1':'LINESTRING (20 200,200 200,20 20,200 20,20 200)', 'wkt2':'LINESTRING (20 110,200 110,200 160,20 60,20 110)', result:true},
+{'wkt1':'LINESTRING (20 110,110 110,20 20,110 20,20 110)', 'wkt2':'LINESTRING (200 200,110 110,200 110,110 200,200 200)', result:true},
+{'wkt1':'LINESTRING (20 120,120 120,20 20,120 20,20 120)', 'wkt2':'LINESTRING (220 120,120 20,220 20,120 120,220 120)', result:true},
+{'wkt1':'MULTILINESTRING ((70 20,20 90,70 170),(70 170,120 90,70 20))', 'wkt2':'MULTILINESTRING ((70 20,20 90,70 170),(70 170,120 90,70 20))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 140,90 60,90 20),(170 20,130 20,20 20))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 20,170 100,170 140),(170 60,90 20,20 60),(130 100,130 60,90 20,50 90))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 20,170 100,170 140),(130 140,130 60,90 20,20 90,90 20,130 60,170 60))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 20,170 100,170 140),(170 60,90 20,20 60))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 20,170 100,170 140),(170 60,90 20,20 60),(130 100,90 20))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 20,170 100,170 140),(170 60,90 20,20 60),(120 100,170 100,90 20))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 20,170 100,170 140),(170 60,90 20,20 60),(120 100,170 100,90 20))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 20,170 100,170 140),(130 140,130 60,90 20,20 90,90 20))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 20,170 20),(90 20,90 80,90 140))', 'wkt2':'MULTILINESTRING ((90 20,170 100,170 140),(170 60,90 20,20 60,20 140,90 20))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 90,20 160),(90 160,90 20))', 'wkt2':'MULTILINESTRING ((160 160,90 90,160 20),(160 120,120 120,90 90,160 60))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 90,20 160),(90 160,90 20))', 'wkt2':'MULTILINESTRING ((160 160,90 90,160 20),(160 120,120 120,90 90,120 60,160 60))', result:true},
+{'wkt1':'MULTILINESTRING ((20 20,90 90,20 160),(90 160,90 20))', 'wkt2':'MULTILINESTRING ((160 160,90 90,160 20),(160 120,90 90,160 60))', result:true},
+{'wkt1':'POINT (20 20)', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:false},
+{'wkt1':'POINT (70 170)', 'wkt2':'POLYGON ((110 230,80 160,20 160,20 20,200 20,200 160,140 160,110 230))', result:false},
+{'wkt1':'POINT (110 130)', 'wkt2':'POLYGON ((20 160,80 160,110 100,140 160,200 160,200 20,20 20,20 160))', result:false},
+{'wkt1':'POINT (100 70)', 'wkt2':'POLYGON ((20 150,100 150,40 50,170 50,110 150,190 150,190 20,20 20,20 150))', result:false},
+{'wkt1':'POINT (100 70)', 'wkt2':'POLYGON ((20 150,100 150,40 50,160 50,100 150,180 150,180 20,20 20,20 150))', result:false},
+{'wkt1':'POINT (60 120)', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'POINT (110 120)', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'POINT (160 120)', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'POINT (100 150)', 'wkt2':'POLYGON ((20 150,100 150,40 50,160 50,100 150,180 150,180 20,20 20,20 150))', result:true},
+{'wkt1':'POINT (100 80)', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'POINT (60 160)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:false},
+{'wkt1':'POINT (190 90)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:false},
+{'wkt1':'POINT (190 190)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:true},
+{'wkt1':'POINT (360 20)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:true},
+{'wkt1':'POINT (130 130)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:true},
+{'wkt1':'POINT (280 50)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:true},
+{'wkt1':'POINT (150 100)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:true},
+{'wkt1':'POINT (100 50)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:true},
+{'wkt1':'POINT (140 120)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:true},
+{'wkt1':'POINT (190 50)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(90 50,150 110,190 50,90 50),(190 50,230 110,290 50,190 50))', result:true},
+{'wkt1':'POINT (180 90)', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(180 140,180 40,80 40,180 140),(180 90,210 140,310 40,230 40,180 90))', result:true},
+{'wkt1':'MULTIPOINT ((20 80),(110 160),(20 160))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:false},
+{'wkt1':'MULTIPOINT ((20 80),(60 120),(20 160))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((10 80),(110 170),(110 120))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((10 80),(110 170),(160 120))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((20 120),(60 120),(110 120),(160 120),(200 120))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((60 120),(110 120),(160 120))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((60 120),(160 120),(160 40),(60 40))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((20 150),(60 120),(110 80))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((110 80),(160 120),(200 160))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((110 80),(110 120),(110 160))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((110 170),(110 80))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((60 120),(160 120),(110 80),(110 170))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((90 80),(130 80))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((60 120),(160 120),(110 80))', 'wkt2':'POLYGON ((60 120,60 40,160 40,160 120,60 120))', result:true},
+{'wkt1':'MULTIPOINT ((40 170),(40 90),(130 170))', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:false},
+{'wkt1':'MULTIPOINT ((90 170),(280 170),(190 90))', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:false},
+{'wkt1':'MULTIPOINT ((190 110),(150 70),(230 70))', 'wkt2':'POLYGON ((190 190,360 20,20 20,190 190),(280 50,100 50,190 140,280 50))', result:false},
+{'wkt1':'POINT (100 100)', 'wkt2':'MULTIPOLYGON (((20 100,20 20,100 20,100 100,20 100)),((100 180,100 100,180 100,180 180,100 180)))', result:true},
+{'wkt1':'POINT (20 100)', 'wkt2':'MULTIPOLYGON (((20 100,20 20,100 20,100 100,20 100)),((100 180,100 100,180 100,180 180,100 180)))', result:true},
+{'wkt1':'POINT (60 100)', 'wkt2':'MULTIPOLYGON (((20 100,20 20,100 20,100 100,20 100)),((100 180,100 100,180 100,180 180,100 180)))', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'MULTIPOLYGON (((110 110,20 200,200 200,110 110),(110 110,80 180,140 180,110 110)),((110 110,20 20,200 20,110 110),(110 110,80 40,140 40,110 110)))', result:true},
+{'wkt1':'POINT (110 200)', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:false},
+{'wkt1':'POINT (90 80)', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'POINT (340 240)', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'POINT (230 150)', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'POINT (160 150)', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'POINT (90 150)', 'wkt2':'LINESTRING (150 150,20 20,280 20,150 150)', result:false},
+{'wkt1':'POINT (150 80)', 'wkt2':'LINESTRING (150 150,20 20,280 20,150 150)', result:false},
+{'wkt1':'POINT (150 150)', 'wkt2':'LINESTRING (150 150,20 20,280 20,150 150)', result:true},
+{'wkt1':'POINT (100 20)', 'wkt2':'LINESTRING (150 150,20 20,280 20,150 150)', result:true},
+{'wkt1':'POINT (20 20)', 'wkt2':'LINESTRING (150 150,20 20,280 20,150 150)', result:true},
+{'wkt1':'POINT (220 220)', 'wkt2':'LINESTRING (110 110,220 20,20 20,110 110,220 220)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,220 20,20 20,110 110,220 220)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,220 20,20 20,220 220)', result:true},
+{'wkt1':'POINT (110 20)', 'wkt2':'LINESTRING (110 110,220 20,20 20,220 220)', result:true},
+{'wkt1':'POINT (220 20)', 'wkt2':'LINESTRING (110 110,220 20,20 20,220 220)', result:true},
+{'wkt1':'POINT (110 20)', 'wkt2':'LINESTRING (220 220,20 20,220 20,110 110)', result:true},
+{'wkt1':'POINT (20 20)', 'wkt2':'LINESTRING (220 220,20 20,220 20,110 110)', result:true},
+{'wkt1':'POINT (20 110)', 'wkt2':'LINESTRING (20 200,20 20,110 20,20 110,110 200)', result:true},
+{'wkt1':'POINT (20 200)', 'wkt2':'LINESTRING (20 200,200 20,20 20,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (20 200,200 20,140 20,140 80,80 140,20 140)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (20 200,200 20,20 20,200 200)', result:true},
+{'wkt1':'POINT (80 140)', 'wkt2':'LINESTRING (20 200,110 110,200 20,140 20,140 80,110 110,80 140,20 140)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (20 200,110 110,200 20,140 20,140 80,110 110,80 140,20 140)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (20 200,200 20,140 20,140 80,110 110,80 140,20 140)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (20 200,110 110,200 20,20 20,110 110,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (20 200,200 20,20 20,110 110,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (20 200,110 110,20 20,200 20,110 110,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,110 200,20 200,110 110,200 20,140 20,140 80,110 110,80 140,20 140)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,110 200,20 200,200 20,140 20,140 80,110 110,80 140,20 140)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,110 200,20 200,200 20,140 20,140 80,80 140,20 140)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,110 200,20 200,110 110,200 20,20 20,110 110,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,110 200,20 200,200 20,20 20,110 110,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,110 200,20 200,200 20,20 20,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,110 200,20 200,110 110,20 20,200 20,110 110,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,110 200,20 200,200 20,200 110,110 110,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,110 110,20 20,200 20,110 110,20 200,110 200,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,20 20,200 20,110 110,20 200,110 200,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,20 20,200 20,20 200,110 200,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,110 110,200 20,20 20,110 110,20 200,110 200,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,20 20,20 110,110 110,20 200,110 200,110 110)', result:true},
+{'wkt1':'POINT (110 160)', 'wkt2':'LINESTRING (110 160,200 250,110 250,110 160,110 110,110 20,20 20,110 110)', result:true},
+{'wkt1':'POINT (110 160)', 'wkt2':'LINESTRING (110 160,200 250,110 250,110 110,110 20,20 20,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 160,200 250,110 250,110 160,110 110,110 20,20 20,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 160,200 250,110 250,110 160,110 20,20 20,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,200 200,110 200,110 110,110 20,20 20,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,200 200,110 200,110 20,20 20,110 110)', result:true},
+{'wkt1':'POINT (140 200)', 'wkt2':'LINESTRING (110 110,200 200,110 200,110 110,110 20,20 20,110 110)', result:true},
+{'wkt1':'POINT (110 200)', 'wkt2':'LINESTRING (110 110,200 200,110 200,110 110,110 20,20 20,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,200 200,110 200,110 110,110 20,200 20,110 110)', result:true},
+{'wkt1':'POINT (140 200)', 'wkt2':'LINESTRING (110 110,200 200,110 200,110 110,110 20,200 20,110 110)', result:true},
+{'wkt1':'POINT (110 200)', 'wkt2':'LINESTRING (110 110,200 200,110 200,110 110,110 20,200 20,110 110)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (90 130,20 130,20 200,90 130,200 20,20 20,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (90 130,20 130,20 200,90 130,200 20,20 20,200 200)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (90 130,20 130,20 200,200 20,20 20,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (90 130,20 130,20 200,200 20,20 20,200 200)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (200 200,20 20,200 20,90 130,20 200,20 130,90 130)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,20 20,200 20,90 130,20 200,20 130,90 130)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (200 200,20 20,200 20,20 200,20 130,90 130)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,20 20,200 20,20 200,20 130,90 130)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,20 130,20 200,110 110,200 20,20 20,110 110,200 200,200 130,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,20 130,20 200,200 20,20 20,200 200,200 130,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,80 200,20 200,110 110,200 20,20 20,110 110,200 200,140 200,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 110,80 200,20 200,200 20,20 20,200 200,140 200,110 110)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,20 20,200 20,20 200,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,110 110,20 20,200 20,110 110,20 200,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (200 200,110 110,200 20,20 20,110 110,20 200,200 200)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (90 130,20 130,20 200,90 130,110 110,200 20,20 20,110 110,200 200,90 130)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (90 130,20 130,20 200,110 110,200 20,20 20,110 110,200 200,90 130)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (90 130,90 200,20 200,90 130,110 110,200 20,20 20,110 110,200 200,90 130)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (90 130,90 200,20 200,200 20,20 20,200 200,90 130)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (90 130,90 200,20 200,110 110,200 20,20 20,110 110,200 200,90 130)', result:true},
+{'wkt1':'POINT (90 130)', 'wkt2':'LINESTRING (90 130,90 200,20 200,200 20,20 20,200 200,90 130)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (90 130,90 200,20 200,200 20,20 20,200 200,90 130)', result:true},
+{'wkt1':'POINT (110 200)', 'wkt2':'LINESTRING (110 200,110 110,20 20,200 20,110 110,110 200,200 200)', result:true},
+{'wkt1':'POINT (110 150)', 'wkt2':'LINESTRING (110 200,110 110,20 20,200 20,110 110,110 200,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 200,110 110,20 20,200 20,110 110,110 200,200 200)', result:true},
+{'wkt1':'POINT (110 200)', 'wkt2':'LINESTRING (110 200,110 110,20 20,200 20,110 110,110 200)', result:true},
+{'wkt1':'POINT (110 150)', 'wkt2':'LINESTRING (110 200,110 110,20 20,200 20,110 110,110 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (110 200,110 110,20 20,200 20,110 110,110 200)', result:true},
+{'wkt1':'POINT (110 150)', 'wkt2':'LINESTRING (20 200,110 200,110 110,20 20,200 20,110 110,110 200,200 200)', result:true},
+{'wkt1':'POINT (110 110)', 'wkt2':'LINESTRING (20 200,110 200,110 110,20 20,200 20,110 110,110 200,200 200)', result:true},
+{'wkt1':'POINT (110 200)', 'wkt2':'LINESTRING (20 200,110 200,110 110,20 20,200 20,110 110,110 200,200 200)', result:true},
+{'wkt1':'MULTIPOINT ((50 250),(90 220),(130 190))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:false},
+{'wkt1':'MULTIPOINT ((180 180),(230 130),(280 80))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:false},
+{'wkt1':'MULTIPOINT ((50 120),(90 80),(130 40))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((300 280),(340 240),(380 200))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((230 150),(260 120),(290 90))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((200 190),(240 150),(270 110))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((160 150),(190 120),(220 90))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((120 190),(160 150),(200 110))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((90 80),(160 150),(340 240))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((90 80),(160 150),(300 150))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((90 80),(160 150),(240 150))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((90 80),(130 120),(210 150))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((130 120),(210 150),(340 200))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((160 150),(240 150),(340 210))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((160 150),(300 150),(340 150))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'MULTIPOINT ((160 150),(240 150),(340 240))', 'wkt2':'LINESTRING (90 80,160 150,300 150,340 150,340 240)', result:true},
+{'wkt1':'POINT (20 20)', 'wkt2':'POINT (20 20)', result:true},
+{'wkt1':'POINT (20 20)', 'wkt2':'POINT (40 60)', result:false},
+{'wkt1':'POINT (40 40)', 'wkt2':'MULTIPOINT ((20 20),(80 80),(20 120))', result:false},
+{'wkt1':'POINT (20 20)', 'wkt2':'MULTIPOINT ((20 20),(80 80),(20 120))', result:true},
+{'wkt1':'MULTIPOINT ((40 40),(80 60),(120 100))', 'wkt2':'MULTIPOINT ((40 40),(80 60),(120 100))', result:true},
+{'wkt1':'MULTIPOINT ((40 40),(80 60),(120 100))', 'wkt2':'MULTIPOINT ((40 40),(120 100),(80 60))', result:true},
+{'wkt1':'MULTIPOINT ((40 40),(60 100),(100 60),(120 120))', 'wkt2':'MULTIPOINT ((20 120),(60 60),(100 100),(140 40))', result:false},
+{'wkt1':'MULTIPOINT ((20 20),(80 70),(140 120),(200 170))', 'wkt2':'MULTIPOINT ((20 20),80 70),(140 120),(200 170))', result:true},
+{'wkt1':'MULTIPOINT ((20 20),(140 120),(80 70),(200 170))', 'wkt2':'MULTIPOINT ((80 70),20 20),(200 170),(140 120))', result:true},
+{'wkt1':'MULTIPOINT ((20 20),(80 70),(140 120),(200 170))', 'wkt2':'MULTIPOINT ((80 70),(140 120))', result:true},
+{'wkt1':'MULTIPOINT ((80 70),(20 20),(200 170),(140 120))', 'wkt2':'MULTIPOINT ((140 120),(80 70))', result:true},
+{'wkt1':'MULTIPOINT ((80 70),(20 20),(200 170),(140 120))', 'wkt2':'MULTIPOINT ((80 170),(140 120),(200 80))', result:true},
+{'wkt1':'MULTIPOINT ((80 70),(20 20),(200 170),(140 120))', 'wkt2':'MULTIPOINT ((80 170),(140 120),(200 80),(80 70))', result:true},
+{'wkt1':'POLYGON((-8239529.462853361 4980952.065110421,-8224242.057199065 4980952.065110421,-8224242.057199064 4988844.188279452,-8239529.462853361 4988844.188279452,-8239529.462853361 4980952.065110421))', 'wkt2':'POINT(-8225445.94039435  4982695.78481786)', result:true},
+{'wkt1':'POLYGON((-8239529.462853361 4980952.065110421,-8224242.057199065 4980952.065110421,-8224242.057199064 4988844.188279452,-8239529.462853361 4988844.188279452,-8239529.462853361 4980952.065110421))', 'wkt2':'POINT(-8224242.0571985  4982695.78481786)', result:false},
+{'wkt1':'POLYGON((-8239529.462853361 4980952.065110421,-8224242.057199065 4980952.065110421,-8224242.057199064 4988844.188279452,-8239529.462853361 4988844.188279452,-8239529.462853361 4980952.065110421))', 'wkt2':'POINT(-8224242.0571995  4982695.78481786)', result:true}
+];
diff --git a/tests/data/osm.js b/tests/data/osm.js
new file mode 100644
index 0000000..6c94459
--- /dev/null
+++ b/tests/data/osm.js
@@ -0,0 +1,14 @@
+var osm_test_data = {
+    'node': '<?xml version="1.0" encoding="UTF-8"?><osm version="0.5" generator="OpenStreetMap server">  <node id="200545" lat="52.5503033" lon="-1.8166417" user="blackadder" visible="true" timestamp="2006-03-22T16:33:41+00:00"/></osm>',     
+    'node_with_tags': '<?xml version="1.0" encoding="UTF-8"?><osm version="0.5" generator="OpenStreetMap server">  <node id="200545" lat="52.5503033" lon="-1.8166417" user="blackadder" visible="true" timestamp="2006-03-22T16:33:41+00:00"><tag k="a" v="b" /></node></osm>',     
+    'way': '<?xml version="1.0" encoding="UTF-8"?><osm version="0.5" generator="OpenStreetMap server">  <node id="29783468" lat="52.5506446" lon="-1.8141177" user="blackadder" visible="true" timestamp="2007-05-30T14:22:33+01:00">    <tag k="created_by" v="JOSM"/>  </node>  <node id="29783470" lat="52.5501275" lon="-1.8151451" user="blackadder" visible="true" timestamp="2007-05-30T14:22:33+01:00">    <tag k="created_by" v="JOSM"/>  </node>  <node id="29783471" lat="52.5505521" lon="-1.815 [...]
+    'node_way': '<?xml version="1.0" encoding="UTF-8"?><osm version="0.5" generator="OpenStreetMap server">  <node id="200565" lat="52.5526654" lon="-1.8146664" user="blackadder" visible="true" timestamp="2006-03-22T16:34:29+00:00"/>  <node id="200571" lat="52.5535575" lon="-1.8148566" user="blackadder" visible="true" timestamp="2007-11-15T12:54:40+00:00"/>  <node id="200572" lat="52.5522848" lon="-1.8145676" user="blackadder" visible="true" timestamp="2008-01-15T17:36:32+00:00">    <tag [...]
+};
+
+var osm_serialized_data = {
+    'node':'<osm version="0.5" generator="OpenLayers '+OpenLayers.VERSION_NUMBER+'"><node id="200545" lon="-1.8166417" lat="52.5503033"/></osm>',
+    'node_with_tags':'<osm version="0.5" generator="OpenLayers '+OpenLayers.VERSION_NUMBER+'"><node id="200545" lon="-1.8166417" lat="52.5503033"><tag k="a" v="b"/></node></osm>',
+    'way':'<osm version="0.5" generator="OpenLayers '+OpenLayers.VERSION_NUMBER+'"><node id="29783472" lon="-1.8164007" lat="52.5501836"/><node id="29783473" lon="-1.8170311" lat="52.5506035"/><node id="29783474" lon="-1.8164092" lat="52.5509559"/><node id="29783476" lon="-1.8169385" lat="52.5513103"/><node id="29783477" lon="-1.8159626" lat="52.5517893"/><node id="29783478" lon="-1.8145067" lat="52.5518461"/><node id="29783479" lon="-1.8143197" lat="52.5511883"/><node id="29783468" lon= [...]
+    'node_way':'<osm version="0.5" generator="OpenLayers '+OpenLayers.VERSION_NUMBER+'"><node id="645730" lon="-1.8134657" lat="52.5491787"><tag k="created_by" v="JOSM"/><tag k="ref" v="0562201"/><tag k="both_sides" v="true"/><tag k="route_ref" v="167|757"/><tag k="highway" v="bus_stop"/><tag k="location" v="East View Road, Recretaion Ground"/><tag k="amenity" v="bus_stop"/></node><node id="200572" lon="-1.8145676" lat="52.5522848"><tag k="ref" v="0562901"/><tag k="both_sides" v="true"/> [...]
+};
+
diff --git a/tests/data_Layer_Text_textfile.txt b/tests/data_Layer_Text_textfile.txt
new file mode 100644
index 0000000..8250988
--- /dev/null
+++ b/tests/data_Layer_Text_textfile.txt
@@ -0,0 +1,3 @@
+point	image
+10,20	http://boston.openguides.org/markers/ORANGE.png
+15,25	http://boston.openguides.org/markers/ORANGE.png
diff --git a/tests/data_Layer_Text_textfile_2.txt b/tests/data_Layer_Text_textfile_2.txt
new file mode 100644
index 0000000..91a8093
--- /dev/null
+++ b/tests/data_Layer_Text_textfile_2.txt
@@ -0,0 +1,3 @@
+point	title	description	image
+10,20	a	b	http://boston.openguides.org/markers/ORANGE.png
+15,25	c	d	http://boston.openguides.org/markers/ORANGE.png
diff --git a/tests/data_Layer_Text_textfile_overflow.txt b/tests/data_Layer_Text_textfile_overflow.txt
new file mode 100644
index 0000000..bb4768e
--- /dev/null
+++ b/tests/data_Layer_Text_textfile_overflow.txt
@@ -0,0 +1,3 @@
+overflow	point	title	description	image
+auto	10,20	a	b	http://boston.openguides.org/markers/ORANGE.png
+hidden	15,25	c	d	http://boston.openguides.org/markers/ORANGE.png
diff --git a/tests/geom_eq.js b/tests/geom_eq.js
new file mode 100644
index 0000000..26f3a95
--- /dev/null
+++ b/tests/geom_eq.js
@@ -0,0 +1,110 @@
+/**
+ * File: xml_eq.js
+ * Adds a xml_eq method to AnotherWay test objects.
+ *
+ */
+
+(function() {
+    
+    /**
+     * Function assertEqual
+     * Test two objects for equivalence (based on ==).  Throw an exception
+     *     if not equivalent.
+     * 
+     * Parameters:
+     * got - {Object}
+     * expected - {Object}
+     * msg - {String} The message to be thrown.  This message will be appended
+     *     with ": got {got} but expected {expected}" where got and expected are
+     *     replaced with string representations of the above arguments.
+     */
+    function assertEqual(got, expected, msg) {
+        if(got === undefined) {
+            got = "undefined";
+        } else if (got === null) {
+            got = "null";
+        }
+        if(expected === undefined) {
+            expected = "undefined";
+        } else if (expected === null) {
+            expected = "null";
+        }
+        if(got != expected) {
+            throw msg + ": got '" + got + "' but expected '" + expected + "'";
+        }
+    }
+    
+    /**
+     * Function assertGeometryEqual
+     * Test two geometries for equivalence.  Geometries are considered
+     *     equivalent if they are of the same class, and given component
+     *     geometries, if all components are equivalent. Throws a message as
+     *     exception if not equivalent.
+     * 
+     * Parameters:
+     * got - {OpenLayers.Geometry}
+     * expected - {OpenLayers.Geometry}
+     * options - {Object} Optional object for configuring test options.
+     */
+    function assertGeometryEqual(got, expected, options) {
+        
+        var OpenLayers = Test.AnotherWay._g_test_iframe.OpenLayers;
+
+        // compare types
+        assertEqual(typeof got, typeof expected, "Object types mismatch");
+        
+        // compare classes
+        assertEqual(got.CLASS_NAME, expected.CLASS_NAME, "Object class mismatch");
+        
+        if(got instanceof OpenLayers.Geometry.Point) {
+            // compare points
+            assertEqual(got.x, expected.x, "x mismatch");
+            assertEqual(got.y, expected.y, "y mismatch");
+            assertEqual(got.z, expected.z, "z mismatch");
+        } else {
+            // compare components
+            assertEqual(
+                got.components.length, expected.components.length,
+                "Component length mismatch for " + got.CLASS_NAME
+            );
+            for(var i=0; i<got.components.length; ++i) {
+                try {
+                    assertGeometryEqual(
+                        got.components[i], expected.components[i], options
+                    );
+                } catch(err) {
+                    throw "Bad component " + i + " for " + got.CLASS_NAME + ": " + err;
+                }
+            }
+        }
+        return true;
+    }
+    
+    /**
+     * Function: Test.AnotherWay._test_object_t.geom_eq
+     * Test if two geometry objects are equivalent.  Tests for same geometry
+     *     class, same number of components (if any), equivalent component
+     *     geometries, and same coordinates.
+     *
+     * (code)
+     * t.geom_eq(got, expected, message);
+     * (end)
+     * 
+     * Parameters:
+     * got - {OpenLayers.Geometry} Any geometry instance.
+     * expected - {OpenLayers.Geometry} The expected geometry.
+     * msg - {String} A message to print with test output.
+     * options - {Object} Optional object for configuring test options.
+     */
+    var proto = Test.AnotherWay._test_object_t.prototype;
+    proto.geom_eq = function(got, expected, msg, options) {        
+        // test geometries for equivalence
+        try {
+            assertGeometryEqual(got, expected, options);
+            this.ok(true, msg);
+        } catch(err) {
+            this.fail(msg + ": " + err);
+        }
+    }
+    
+})();
\ No newline at end of file
diff --git a/tests/georss.txt b/tests/georss.txt
new file mode 100644
index 0000000..053749b
--- /dev/null
+++ b/tests/georss.txt
@@ -0,0 +1,378 @@
+<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/css" href="/css/rss.css" ?>
+
+<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xmlns="http://purl.org/rss/1.0/"
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns:georss="http://www.georss.org/georss">
+<docs>This is an RSS file.  Copy the URL into your aggregator of choice.  If you don't know what this means and want to learn more, please see: <span>http://platial.typepad.com/news/2006/04/really_simple_t.html</span> for more info.</docs><channel rdf:about="http://platial.com">
+<link>http://platial.com</link>
+<title>Crschmidt's Places At Platial</title>
+<description></description>
+<items>
+<rdf:Seq>
+<rdf:li resource="http://platial.com/place/90306"/>
+<rdf:li resource="http://platial.com/place/67230"/>
+<rdf:li resource="http://platial.com/place/65645"/>
+<rdf:li resource="http://platial.com/place/62200"/>
+<rdf:li resource="http://platial.com/place/28232"/>
+<rdf:li resource="http://platial.com/place/43666"/>
+<rdf:li resource="http://platial.com/place/28394"/>
+<rdf:li resource="http://platial.com/place/28251"/>
+<rdf:li resource="http://platial.com/place/28392"/>
+<rdf:li resource="http://platial.com/place/28391"/>
+<rdf:li resource="http://platial.com/place/28231"/>
+<rdf:li resource="http://platial.com/place/28393"/>
+<rdf:li resource="http://platial.com/place/31685"/>
+<rdf:li resource="http://platial.com/place/28596"/>
+<rdf:li resource="http://platial.com/place/28595"/>
+<rdf:li resource="http://platial.com/place/28594"/>
+<rdf:li resource="http://platial.com/place/28593"/>
+<rdf:li resource="http://platial.com/place/28592"/>
+<rdf:li resource="http://platial.com/place/28591"/>
+<rdf:li resource="http://platial.com/place/28590"/>
+<rdf:li resource="http://platial.com/place/28589"/>
+<rdf:li resource="http://platial.com/place/28588"/>
+<rdf:li resource="http://platial.com/place/28587"/>
+<rdf:li resource="http://platial.com/place/28586"/>
+<rdf:li resource="http://platial.com/place/28585"/>
+<rdf:li resource="http://platial.com/place/28584"/>
+<rdf:li resource="http://platial.com/place/28583"/>
+<rdf:li resource="http://platial.com/place/28582"/>
+<rdf:li resource="http://platial.com/place/28581"/>
+<rdf:li resource="http://platial.com/place/28580"/>
+<rdf:li resource="http://platial.com/place/28579"/>
+<rdf:li resource="http://platial.com/place/28578"/>
+<rdf:li resource="http://platial.com/place/28577"/>
+<rdf:li resource="http://platial.com/place/28576"/>
+<rdf:li resource="http://platial.com/place/28575"/>
+<rdf:li resource="http://platial.com/place/28574"/>
+<rdf:li resource="http://platial.com/place/28573"/>
+<rdf:li resource="http://platial.com/place/28572"/>
+<rdf:li resource="http://platial.com/place/28571"/>
+<rdf:li resource="http://platial.com/place/28570"/>
+</rdf:Seq>
+</items>
+</channel>
+<item rdf:about="http://platial.com/place/90306">
+<link>http://platial.com/place/90306</link>
+<title>Knitting Room</title>
+<description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington [...]
+<georss:point>42.405696 -71.142197</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-06-08T17:35:01.942452+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/67230">
+<link>http://platial.com/place/67230</link>
+<title>Knitting Room</title>
+<description><![CDATA[This little shop is jammed full. Yarn, yarn everywhere. They make the most of every possible nook and cranny. I like this place also because they have a lot of different kinds of knitting needles in all different sizes. Also, the people who work here are younger and hipper than in the other stores I go to. I reccomend buying supplies here and then knitting your way through a good documentary at the Capitol Theater across the street.<br/>Address: 2 lake St, Arlington [...]
+<georss:point>42.405524 -71.142273</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-24T11:35:26.733857+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/65645">
+<link>http://platial.com/place/65645</link>
+<title>†¢¢™£ˆøœ</title>
+<description><![CDATA[ijeª£∆µˆ˚î<br/>Address: 151 Erie St., Cambridge, MA<br/>Tags: platial graffiti<br /><br /><a href="http://platial.com/place/65645">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/65645">Grab this on Platial</a> ]]></description>
+<georss:point>42.352455 -71.110210</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-20T08:56:12.696224+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/62200">
+<link>http://platial.com/place/62200</link>
+<title>Allen Hall</title>
+<description><![CDATA[My dorm at UIUC.<br/>Address: 1301 W Gregory Dr, Urbana, IL<br/>Tags: dorm, uiuc, college<br/><a href="http://platial.com/place/62200"><img src="http://platial.comhttp://static.flickr.com/4/8576450_0d59cc2531_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/62200">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/62200">Grab this on Platial</a> ]]></description>
+<georss:point>40.104172 -88.220623</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-04-14T08:01:01.872873+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28232">
+<link>http://platial.com/place/28232</link>
+<title>Bagby Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C. However, the area around the springs are not exactly well looked upon by people who know the place.
+
+<br/>Tags: 20s, rosalie, romance, childhood, hike, camping, soak, relax, beautiful, hot springs, bathhouse, favorite, popular, crowded, organized, honeymoon tub, plumbing made from hollowed out trees, hot springs, mt hood, notorious car break in spot, rash, bacteria<br /><br /><a href="http://platial.com/place/28232">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28232">Grab this on Platial</a> ]]></description>
+<georss:point>44.936000 -122.173000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:10:18.553063+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/43666">
+<link>http://platial.com/place/43666</link>
+<title>Shooting Location for "The Field of Dreams" Film</title>
+<description><![CDATA[1989's Field of Dreams was a Best Picture Academy Award nominee, and the baseball field in the cornfield still stands today, and has become quite a tourist destination.  Games are occasionally played at the field, re-enacting professional baseball at the turn of the 20th Century.<br/>Address: Dyersville, Iowa<br/>Tags: iowa, baseball, movie locations, field of dreams, kevin costner, costner, dyersville, kinsella, james earl jones, chicago black sox, shoeless joe, jo [...]
+<georss:point>42.481213 -91.111679</georss:point>
+<dc:creator>echinodermata</dc:creator>
+<dc:date>2006-03-23T11:40:17.654061+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28394">
+<link>http://platial.com/place/28394</link>
+<title>Moffetts (Bonneville) Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 97  degress F, 36  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28394">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28394">Grab this on Platial</a> ]]></description>
+<georss:point>45.658000 -121.962000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:27.329816+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28251">
+<link>http://platial.com/place/28251</link>
+<title>Austin Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 186  degress F, 86  degress C<br/>Tags: soak, hot springs, relax, nature, popular, crowded<br /><br /><a href="http://platial.com/place/28251">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28251">Grab this on Platial</a> ]]></description>
+<georss:point>45.021000 -122.009000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:11:04.489886+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28392">
+<link>http://platial.com/place/28392</link>
+<title>Rock Creek Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br/>Tags: soak, hot springs, relax, nature<br /><br /><a href="http://platial.com/place/28392">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28392">Grab this on Platial</a> ]]></description>
+<georss:point>45.723000 -121.927000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:22.636855+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28391">
+<link>http://platial.com/place/28391</link>
+<title>St. Martins (Wind River) Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 120  degress F, 49  degress C<br/>Tags: hot springs, soak, relax, nature, wonderful<br /><br /><a href="http://platial.com/place/28391">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28391">Grab this on Platial</a> ]]></description>
+<georss:point>45.728000 -121.800000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:20.383244+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28231">
+<link>http://platial.com/place/28231</link>
+<title>Breitenbush Hot Springs, OR</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br/>Tags: hot springs, resort, relax, nature, beautiful, http:www.breitenbush.com, soaking<br /><br /><a href="http://platial.com/place/28231">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28231">Grab this on Platial</a> ]]></description>
+<georss:point>44.782000 -121.975000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:10:16.529195+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28393">
+<link>http://platial.com/place/28393</link>
+<title>Collins Hot Springs, WA</title>
+<description><![CDATA[Hot spring, temperature: 122  degress F, 50  degress C<br/>Tags: portland, nice, hot springs, soak<br /><br /><a href="http://platial.com/place/28393">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28393">Grab this on Platial</a> ]]></description>
+<georss:point>45.701000 -121.728000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:16:24.648745+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/31685">
+<link>http://platial.com/place/31685</link>
+<title>Darwin's Ltd.</title>
+<description><![CDATA[Nice little coffee shop/cafe, free Wifi, close enough to walk from Harvard Square.<br/>Address: 148 Mount Auburn St, Cambridge, MA<br/>Tags: coffee, beer, sandwiches, freewifi<br/><a href="http://platial.com/place/31685"><img src="http://platial.comhttp://static.flickr.com/38/84885937_74fd3d1025_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/31685">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/31685">Grab this on Platial</a> ]] [...]
+<georss:point>42.373974 -71.125053</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-10T09:24:08.152985+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28596">
+<link>http://platial.com/place/28596</link>
+<title>Huckleberry Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, Boiling  degress C<br /><br /><a href="http://platial.com/place/28596">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28596">Grab this on Platial</a> ]]></description>
+<georss:point>44.115000 -110.684000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:32.283094+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28595">
+<link>http://platial.com/place/28595</link>
+<title>South Entrance Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 156  degress F, 69  degress C<br/><a href="http://platial.com/place/28595"><img src="http://platial.comhttp://static.flickr.com/52/130989872_f1457f68b5_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28595">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28595">Grab this on Platial</a> ]]></description>
+<georss:point>44.142000 -110.656000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:30.279497+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28594">
+<link>http://platial.com/place/28594</link>
+<title>Crawfish Creek Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br/><a href="http://platial.com/place/28594"><img src="http://platial.comhttp://static.flickr.com/52/128312256_d6a879924c_s.jpg"/></a><br/><br /><br /><a href="http://platial.com/place/28594">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28594">Grab this on Platial</a> ]]></description>
+<georss:point>44.157000 -110.699000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:28.280271+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28593">
+<link>http://platial.com/place/28593</link>
+<title>Crawfish Creek Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 138  degress F, 59  degress C<br /><br /><a href="http://platial.com/place/28593">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28593">Grab this on Platial</a> ]]></description>
+<georss:point>44.165000 -110.723000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:20.364077+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28592">
+<link>http://platial.com/place/28592</link>
+<title>Snake Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 136  degress F, 58  degress C<br /><br /><a href="http://platial.com/place/28592">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28592">Grab this on Platial</a> ]]></description>
+<georss:point>44.169000 -110.583000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:12.234974+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28591">
+<link>http://platial.com/place/28591</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 142  degress F, 61  degress C<br /><br /><a href="http://platial.com/place/28591">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28591">Grab this on Platial</a> ]]></description>
+<georss:point>44.187000 -110.726000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:10.027857+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28590">
+<link>http://platial.com/place/28590</link>
+<title>Hot Springs on Upper Snake River, WY</title>
+<description><![CDATA[Hot spring, temperature: 167  degress F, 75  degress C<br /><br /><a href="http://platial.com/place/28590">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28590">Grab this on Platial</a> ]]></description>
+<georss:point>44.204000 -110.486000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:07.79658+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28589">
+<link>http://platial.com/place/28589</link>
+<title>Hot Springs on lewis Lake, WY</title>
+<description><![CDATA[Hot spring, temperature: 154  degress F, 68  degress C<br /><br /><a href="http://platial.com/place/28589">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28589">Grab this on Platial</a> ]]></description>
+<georss:point>44.276000 -110.636000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:05.683418+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28588">
+<link>http://platial.com/place/28588</link>
+<title>Rustic Geyser, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28588">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28588">Grab this on Platial</a> ]]></description>
+<georss:point>44.282000 -110.506000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:03.66329+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28587">
+<link>http://platial.com/place/28587</link>
+<title>Bechler River Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 194  degress F, 90  degress C<br /><br /><a href="http://platial.com/place/28587">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28587">Grab this on Platial</a> ]]></description>
+<georss:point>44.285000 -110.900000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:24:01.611442+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28586">
+<link>http://platial.com/place/28586</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28586">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28586">Grab this on Platial</a> ]]></description>
+<georss:point>44.290000 -110.504000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:59.658699+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28585">
+<link>http://platial.com/place/28585</link>
+<title>Heart Lake Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature:  Middle Group  degress F, 174  degress C<br /><br /><a href="http://platial.com/place/28585">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28585">Grab this on Platial</a> ]]></description>
+<georss:point>44.299000 -110.517000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:57.181801+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28584">
+<link>http://platial.com/place/28584</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Boiling  degress F, 201  degress C<br /><br /><a href="http://platial.com/place/28584">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28584">Grab this on Platial</a> ]]></description>
+<georss:point>44.307000 -110.526000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:55.240485+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28583">
+<link>http://platial.com/place/28583</link>
+<title>Hot Springs on lewis Lake, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28583">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28583">Grab this on Platial</a> ]]></description>
+<georss:point>44.309000 -110.654000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:53.22295+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28582">
+<link>http://platial.com/place/28582</link>
+<title>Shoshone Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28582">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28582">Grab this on Platial</a> ]]></description>
+<georss:point>44.354000 -110.800000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:51.179049+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28581">
+<link>http://platial.com/place/28581</link>
+<title>Hot Springs on Continental Divide, WY</title>
+<description><![CDATA[Hot spring, temperature: 189  degress F, 87  degress C<br /><br /><a href="http://platial.com/place/28581">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28581">Grab this on Platial</a> ]]></description>
+<georss:point>44.401000 -110.936000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:49.077176+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28580">
+<link>http://platial.com/place/28580</link>
+<title>Hot Springs on Upper Firehole River, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28580">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28580">Grab this on Platial</a> ]]></description>
+<georss:point>44.404000 -110.824000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:47.054664+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28579">
+<link>http://platial.com/place/28579</link>
+<title>Summit Lake Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 162  degress F, 72  degress C<br /><br /><a href="http://platial.com/place/28579">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28579">Grab this on Platial</a> ]]></description>
+<georss:point>44.410000 -110.953000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:45.039394+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28578">
+<link>http://platial.com/place/28578</link>
+<title>Lone Star Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature:  Footbridge  degress F, 183  degress C<br /><br /><a href="http://platial.com/place/28578">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28578">Grab this on Platial</a> ]]></description>
+<georss:point>44.414000 -110.817000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:42.938808+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28577">
+<link>http://platial.com/place/28577</link>
+<title>West. Thumb Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28577">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28577">Grab this on Platial</a> ]]></description>
+<georss:point>44.417000 -110.570000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:40.90238+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28576">
+<link>http://platial.com/place/28576</link>
+<title>Lone Star Geyser, WY</title>
+<description><![CDATA[Hot spring, temperature: 199  degress F, 93  degress C<br /><br /><a href="http://platial.com/place/28576">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28576">Grab this on Platial</a> ]]></description>
+<georss:point>44.418000 -110.805000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:38.844625+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28575">
+<link>http://platial.com/place/28575</link>
+<title>Smoke Jumper Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28575">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28575">Grab this on Platial</a> ]]></description>
+<georss:point>44.421000 -110.952000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:36.818513+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28574">
+<link>http://platial.com/place/28574</link>
+<title>West. Thumb Geyser Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 196  degress F, 91  degress C<br /><br /><a href="http://platial.com/place/28574">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28574">Grab this on Platial</a> ]]></description>
+<georss:point>44.422000 -110.574000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:34.767729+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28573">
+<link>http://platial.com/place/28573</link>
+<title>Potts Hot Spring Basin, WY</title>
+<description><![CDATA[Hot spring, temperature: 203  degress F, 95  degress C<br /><br /><a href="http://platial.com/place/28573">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28573">Grab this on Platial</a> ]]></description>
+<georss:point>44.433000 -110.581000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:32.749915+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28572">
+<link>http://platial.com/place/28572</link>
+<title>Hot Springs, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28572">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28572">Grab this on Platial</a> ]]></description>
+<georss:point>44.433000 -110.813000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:30.829745+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28571">
+<link>http://platial.com/place/28571</link>
+<title>Hot Springs on Continental Divide, WY</title>
+<description><![CDATA[Hot spring, temperature: Hot  degress F, Hot  degress C<br /><br /><a href="http://platial.com/place/28571">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28571">Grab this on Platial</a> ]]></description>
+<georss:point>44.438000 -110.977000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:28.730401+00:00</dc:date>
+</item>
+<item rdf:about="http://platial.com/place/28570">
+<link>http://platial.com/place/28570</link>
+<title>SouthEastern Group, WY</title>
+<description><![CDATA[Hot spring, temperature: 198  degress F, 92  degress C<br /><br /><a href="http://platial.com/place/28570">Map this on Platial</a><br /> <a href="http://platial.com/place_grab/28570">Grab this on Platial</a> ]]></description>
+<georss:point>44.459000 -110.817000</georss:point>
+<dc:creator>crschmidt</dc:creator>
+<dc:date>2006-01-03T23:23:26.706763+00:00</dc:date>
+</item>
+</rdf:RDF>
\ No newline at end of file
diff --git a/tests/grid_inittiles.html b/tests/grid_inittiles.html
new file mode 100644
index 0000000..40035a2
--- /dev/null
+++ b/tests/grid_inittiles.html
@@ -0,0 +1,30 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <style type="text/css">
+        #map {
+            width: 800px;
+            height: 475px;
+            border: 1px solid black;
+        }
+    </style>
+    <script src="../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        function init(){
+            var map = new OpenLayers.Map('map', {'maxResolution': 1.40625/2, tileSize: new OpenLayers.Size(256,256)});
+            ww = new OpenLayers.Layer.WMS( "Basic", 
+            "http://labs.metacarta.com/wms-c/Basic.py?", 
+            {layers:"basic"});
+            map.addLayers([ww]);
+            map.zoomToMaxExtent();
+            map.zoomIn();
+            map.zoomOut();
+            map.zoomOut();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1>Grid Test</h1>
+    <p>Map should display with two centered tiles. If there appear to be a combination of two zoom levels, then this test is failed, and something is broken in OpenLayers.</p>
+    <div id="map"></div>
+  </body>
+</html>
diff --git a/tests/index.html b/tests/index.html
new file mode 100644
index 0000000..86ec617
--- /dev/null
+++ b/tests/index.html
@@ -0,0 +1,6 @@
+<html>
+    <head>
+        <meta http-equiv="refresh" content="0;url=run-tests.html">
+    </head>
+    <body></body>
+</html>
\ No newline at end of file
diff --git a/tests/list-tests.html b/tests/list-tests.html
new file mode 100644
index 0000000..708bd28
--- /dev/null
+++ b/tests/list-tests.html
@@ -0,0 +1,202 @@
+<ul id="testlist">
+    <li>Ajax.html</li>
+    <li>BaseTypes.html</li>
+    <li>BaseTypes/Bounds.html</li>
+    <li>BaseTypes/Class.html</li>
+    <li>BaseTypes/Element.html</li>
+    <li>BaseTypes/LonLat.html</li>
+    <li>BaseTypes/Pixel.html</li>
+    <li>BaseTypes/Size.html</li>
+    <li>Console.html</li>
+    <li>Control.html</li>
+    <li>Control/Attribution.html</li>
+    <li>Control/Button.html</li>
+    <li>Control/DragFeature.html</li>
+    <li>Control/DragPan.html</li>
+    <li>Control/DrawFeature.html</li>
+    <li>Control/GetFeature.html</li>
+    <li>Control/Graticule.html</li>
+    <li>Control/KeyboardDefaults.html</li>
+    <li>Control/LayerSwitcher.html</li>
+    <li>Control/Measure.html</li>
+    <li>Control/ModifyFeature.html</li>
+    <li>Control/MousePosition.html</li>
+    <li>Control/MouseToolbar.html</li>
+    <li>Control/Navigation.html</li>
+    <li>Control/NavigationHistory.html</li>
+    <li>Control/NavToolbar.html</li>
+    <li>Control/OverviewMap.html</li>
+    <li>Control/Panel.html</li>
+    <li>Control/PanZoom.html</li>
+    <li>Control/PanZoomBar.html</li>
+    <li>Control/Permalink.html</li>
+    <li>Control/Scale.html</li>
+    <li>Control/ScaleLine.html</li>
+    <li>Control/SelectFeature.html</li>
+    <li>Control/Snapping.html</li>
+    <li>Control/Split.html</li>
+    <li>Control/TransformFeature.html</li>
+    <li>Control/WMSGetFeatureInfo.html</li>
+    <li>Control/WMTSGetFeatureInfo.html</li>
+    <li>Control/PanPanel.html</li>
+    <li>Control/SLDSelect.html</li>
+    <li>Events.html</li>
+    <li>Extras.html</li>
+    <li>Feature.html</li>
+    <li>Feature/Vector.html</li>
+    <li>Filter.html</li>
+    <li>Filter/Comparison.html</li>
+    <li>Filter/FeatureId.html</li>
+    <li>Filter/Logical.html</li>
+    <li>Filter/Spatial.html</li>
+    <li>Format.html</li>
+    <li>Format/Atom.html</li>
+    <li>Format/ArcXML.html</li>
+    <li>Format/ArcXML/Features.html</li>
+    <li>Format/GeoJSON.html</li>
+    <li>Format/GeoRSS.html</li>
+    <li>Format/GML.html</li>
+    <li>Format/GML/v2.html</li>
+    <li>Format/GML/v3.html</li>
+    <li>Format/GPX.html</li>
+    <li>Format/JSON.html</li>
+    <li>Format/KML.html</li>
+    <li>Format/OSM.html</li>
+    <li>Format/Text.html</li>
+    <li>Format/SLD.html</li>
+    <li>Format/SLD/v1_0_0.html</li>
+    <li>Format/Filter.html</li>
+    <li>Format/Filter/v1.html</li>
+    <li>Format/Filter/v1_0_0.html</li>
+    <li>Format/Filter/v1_1_0.html</li>
+    <li>Format/WFS.html</li>
+    <li>Format/WFSCapabilities.html</li>
+    <li>Format/WFSCapabilities/v1.html</li>
+    <li>Format/WFSDescribeFeatureType.html</li>
+    <li>Format/WFST.html</li>
+    <li>Format/WFST/v1.html</li>
+    <li>Format/WFST/v1_0_0.html</li>
+    <li>Format/WFST/v1_1_0.html</li>
+    <li>Format/WKT.html</li>
+    <li>Format/WMC.html</li>
+    <li>Format/WMC/v1_1_0.html</li>
+    <li>Format/WMC/v1.html</li>
+    <li>Format/WMSCapabilities.html</li>
+    <li>Format/WMSCapabilities/v1_1_1.html</li>
+    <li>Format/WMSCapabilities/v1_3_0.html</li>
+    <li>Format/WMSDescribeLayer.html</li>
+    <li>Format/WMSGetFeatureInfo.html</li>
+    <li>Format/WMTSCapabilities.html</li>
+    <li>Format/WMTSCapabilities/v1_0_0.html</li>
+    <li>Format/CSWGetDomain.html</li>
+    <li>Format/CSWGetDomain/v2_0_2.html</li>
+    <li>Format/CSWGetRecords.html</li>
+    <li>Format/CSWGetRecords/v2_0_2.html</li>
+    <li>Format/SOSCapabilities/v1_0_0.html</li>
+    <li>Format/SOSGetObservation.html</li>
+    <li>Format/SOSGetFeatureOfInterest.html</li>
+    <li>Format/OWSContext/v0_3_1.html</li>
+    <li>Format/XML.html</li>
+    <li>Geometry.html</li>
+    <li>Geometry/Collection.html</li>
+    <li>Geometry/Curve.html</li>
+    <li>Geometry/LinearRing.html</li>
+    <li>Geometry/LineString.html</li>
+    <li>Geometry/MultiLineString.html</li>
+    <li>Geometry/MultiPoint.html</li>
+    <li>Geometry/MultiPolygon.html</li>
+    <li>Geometry/Point.html</li>
+    <li>Geometry/Polygon.html</li>
+    <li>Geometry/Rectangle.html</li>
+    <li>Geometry/Surface.html</li>
+    <li>Handler.html</li>
+    <li>Handler/Click.html</li>
+    <li>Handler/Drag.html</li>
+    <li>Handler/Feature.html</li>
+    <li>Handler/Hover.html</li>
+    <li>Handler/Keyboard.html</li>
+    <li>Handler/MouseWheel.html</li>
+    <li>Handler/Path.html</li>
+    <li>Handler/Point.html</li>
+    <li>Handler/Polygon.html</li>
+    <li>Handler/RegularPolygon.html</li>
+    <li>Icon.html</li>
+    <li>Lang.html</li>
+    <li>Layer.html</li>
+    <li>Layer/ArcIMS.html</li> 
+    <li>Layer/ArcGIS93Rest.html</li>
+    <li>Layer/EventPane.html</li>
+    <li>Layer/FixedZoomLevels.html</li>
+    <li>Layer/GeoRSS.html</li>
+    <li>Layer/GML.html</li>
+    <li>Layer/Google.html</li>
+    <li>Layer/Google/v3.html</li>
+    <li>Layer/Grid.html</li>
+    <li>Layer/HTTPRequest.html</li>
+    <li>Layer/Image.html</li>
+    <li>Layer/KaMap.html</li>
+    <li>Layer/MapGuide.html</li>
+    <li>Layer/MapServer.html</li>
+    <li>Layer/Markers.html</li>
+    <script type="text/javascript">if(window.location.host.match(/^(www.)?openlayers.org$/)){document.write('<li>Layer/MultiMap.html</li>');}</script>
+    <li>Layer/PointTrack.html</li>
+    <li>Layer/SphericalMercator.html</li>
+    <li>Layer/Text.html</li>
+    <li>Layer/TileCache.html</li>
+    <li>Layer/TMS.html</li>
+    <li>Layer/Vector.html</li>
+    <li>Layer/Vector/RootContainer.html</li>
+    <li>Layer/WFS.html</li>
+    <li>Layer/WMS.html</li>
+    <li>Layer/WMS/Post.html</li>
+    <li>Layer/WMTS.html</li>
+    <li>Layer/WrapDateLine.html</li>
+    <li>Layer/XYZ.html</li>
+    <li>Layer/Yahoo.html</li>
+    <li>Map.html</li>
+    <li>Marker.html</li>
+    <li>Marker/Box.html</li>
+    <li>OpenLayers.html</li>
+    <li>Popup.html</li>
+    <li>Popup/Anchored.html</li>
+    <li>Popup/AnchoredBubble.html</li>
+    <li>Popup/FramedCloud.html</li>
+    <li>Projection.html</li>
+    <li>Protocol.html</li>
+    <li>Protocol/HTTP.html</li>
+    <li>Protocol/SQL.html</li>
+    <li>Protocol/SQL/Gears.html</li>
+    <li>Protocol/WFS.html</li>
+    <li>Protocol/SOS.html</li>
+    <li>Renderer.html</li>
+    <li>Renderer/Canvas.html</li>
+    <li>Renderer/Elements.html</li>
+    <li>Renderer/SVG.html</li>
+    <li>Renderer/VML.html</li>
+    <li>Request.html</li>
+    <li>Request/XMLHttpRequest.html</li>
+    <li>Rule.html</li>
+    <li>Strategy.html</li>
+    <li>Strategy/BBOX.html</li>
+    <li>Strategy/Cluster.html</li>
+    <li>Strategy/Filter.html</li>
+    <li>Strategy/Fixed.html</li>
+    <li>Strategy/Paging.html</li>
+    <li>Strategy/Save.html</li>
+    <li>Strategy/Refresh.html</li>
+    <li>Style.html</li>
+    <li>Style2.html</li>
+    <li>StyleMap.html</li>
+    <li>Symbolizer.html</li>
+    <li>Symbolizer/Line.html</li>
+    <li>Symbolizer/Point.html</li>
+    <li>Symbolizer/Polygon.html</li>
+    <li>Symbolizer/Raster.html</li>
+    <li>Symbolizer/Text.html</li>
+    <li>Tile.html</li>
+    <li>Tile/Image.html</li>
+    <li>Tile/Image/IFrame.html</li>
+    <li>Tile/WFS.html</li>
+    <li>Tween.html</li>
+    <li>Util.html</li>
+</ul>
diff --git a/tests/manual/ajax.html b/tests/manual/ajax.html
new file mode 100644
index 0000000..be038ad
--- /dev/null
+++ b/tests/manual/ajax.html
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>XHR Acceptance Test</title>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var url = "ajax.txt";
+        function sendSynchronous(){
+            var request = OpenLayers.Request.GET({
+                url: url,
+                async: false,
+                callback: function() {
+                    document.getElementById('send_sync').value += 'request completed\n';
+                }
+            });
+            document.getElementById('send_sync').value += 'other processing\n';
+        }
+        function sendAsynchronous(){
+            var request = OpenLayers.Request.GET({
+                url: url,
+                callback: function() {
+                    document.getElementById('send_sync').value += 'request completed\n';
+                }
+            });
+            document.getElementById('send_sync').value += 'other processing\n';
+        }
+        function sendAndAbort(){
+            var request = OpenLayers.Request.GET({
+                url: url,
+                callback: function() {
+                    document.getElementById('send_sync').value += 'never called\n';
+                }
+            });
+            request.abort();
+            document.getElementById('send_sync').value += 'other processing\n';
+        }
+
+        </script>
+    </head>
+    <body >
+        <button onclick="sendSynchronous()">synchronous</button>
+        expected output: "request completed" then "other processing"<br />
+        <button onclick="sendAsynchronous()">asynchronous</button>
+        expected output: "other processing" then "request completed"<br />
+        <button onclick="sendAndAbort()">send and abort</button>
+        expected output: "other processing" (and not "never called")<br />
+        <textarea id="send_sync" rows="6"></textarea><br />
+        <button onclick="document.getElementById('send_sync').value = ''">Clear</button>
+  </body>
+</html>
diff --git a/tests/manual/ajax.txt b/tests/manual/ajax.txt
new file mode 100644
index 0000000..b10a427
--- /dev/null
+++ b/tests/manual/ajax.txt
@@ -0,0 +1 @@
+one fake text file
\ No newline at end of file
diff --git a/tests/manual/arcims-2117.html b/tests/manual/arcims-2117.html
new file mode 100644
index 0000000..08dc4aa
--- /dev/null
+++ b/tests/manual/arcims-2117.html
@@ -0,0 +1,103 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>ArcIMS Test Ticket #2117</title>
+    <link rel="stylesheet" href="../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="../../examples/style.css" type="text/css" />
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 0;
+        var lat = 0;
+        var zoom = 1;
+        var map, layer;
+
+        function init(){
+            OpenLayers.ProxyHost = "../../examples/proxy.cgi?url=";
+            
+            map = new OpenLayers.Map( 'map' );
+            
+            var options = {
+              serviceName: "OpenLayers_Sample",
+              async: true,
+							layers: [{
+								id:1,
+								visible:'true',
+								/*query:{
+									where: '1=1',
+									spatialfilter: true
+								},*/
+								renderer:{
+									type: 'valuemaplabel',
+									lookupfield: 'FIPS_ID',
+									labelfield: 'FIPS_CNTRY',
+									exacts:[{
+										value: '227',
+										symbol: {
+											type: 'text',
+											antialiasing: 'true',
+											interval: 6,
+											blockout: '255,255,255',
+											font: 'Arial',
+											fontcolor: '0,0,0',
+											fontsize: 11,
+											transparency: 0.7
+										}
+									},{
+										value: '150',
+										symbol: {
+											type: 'text',
+											antialiasing: 'true',
+											interval: 6,
+											blockout: '255,255,255',
+											font: 'Arial',
+											fontcolor: '0,0,0',
+											fontsize: 11,
+											transparency: 0.7
+										}
+									},{
+										value: '75',
+										symbol: {
+											type: 'text',
+											antialiasing: 'true',
+											interval: 6,
+											blockout: '255,255,255',
+											font: 'Arial',
+											fontcolor: '0,0,0',
+											fontsize: 11,
+											transparency: 0.7
+										}
+									}]
+								}
+							}]
+            };
+            
+            layer = new OpenLayers.Layer.ArcIMS( "Global Sample Map",
+                    "http://sample.avencia.com/servlet/com.esri.esrimap.Esrimap", options );
+            map.addLayer(layer);
+
+            map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
+            map.addControl( new OpenLayers.Control.LayerSwitcher() );
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">ArcIMS Test Ticket #2117</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        <a href="http://trac.openlayers.org/ticket/2117">Testing ticket #2117</a>
+    </p>
+
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+        This is an example of a bug in the ArcXML format writer.
+         If you don't see a map, it's broken.
+    </div>
+
+  </body>
+</html>
+
+
+
+
diff --git a/tests/manual/arkansas.rss b/tests/manual/arkansas.rss
new file mode 100644
index 0000000..926d357
--- /dev/null
+++ b/tests/manual/arkansas.rss
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss" version="2.0"><channel><title>topp:states</title><description>Feed auto-generated by GeoServer</description><link><![CDATA[http://localhost:8080/geoserver/wms?format_options=ENCODING:simple;&width=512&featureid=states.21&transparent=false&version=1.1.1&service=wms&srs=EPSG:4326&styles=population&height=216&bbox=-124.731422,24.955967,-66.969849,49.371735&request= [...]
+</title><link><![CDATA[http://localhost:8080/geoserver/wfs?request=getfeature&service=wfs&version=1.0.0&featureid=states.21]]></link><guid><![CDATA[http://localhost:8080/geoserver/wfs?request=getfeature&service=wfs&version=1.0.0&featureid=states.21]]></guid><description><![CDATA[This is the state of Arkansas.  
+2350725.0 people live in an area of 134875.075 square 
+kilometers, and only 5096.0 take public transportation.
+<br>
+<br>
+
+Map by:<br> <a href="http://topp.openplans.org/geoserver"><img alt="TOPP" src="http://topp.openplans.org/images/logo.jpg"></a>
+]]></description><georss:polygon>34.19665500000001 -94.461479 34.508326999999994 -94.452408 34.735504000000006 -94.44574 34.929050000000004 -94.439102 35.400454999999994 -94.428337 35.641003 -94.468269 35.760227 -94.485718 36.106753999999995 -94.542198 36.164444 -94.552895 36.478714 -94.607231 36.489338000000004 -94.617035 36.49095199999999 -94.080849 36.489716 -93.857323 36.489891 -93.59626 36.490196 -93.328163 36.490616 -93.297142 36.489819 -92.852104 36.489918 -92.777466 36.4908559999 [...]
\ No newline at end of file
diff --git a/tests/manual/big-georss.html b/tests/manual/big-georss.html
new file mode 100644
index 0000000..6be290c
--- /dev/null
+++ b/tests/manual/big-georss.html
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+      <title>OpenLayers GML Layer Example</title>
+    <link rel="stylesheet" href="../../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="../../examples/style.css" type="text/css" />
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var lon = 5;
+        var lat = 40;
+        var zoom = 5;
+        var map, layer;
+
+        function init(){
+            map = new OpenLayers.Map('map');
+            layer = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                    "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
+            map.addLayer(layer);
+            map.zoomToExtent(new OpenLayers.Bounds(-94.617035,33.010025,-89.645401,36.492752));
+            map.addLayer(new OpenLayers.Layer.GML("GML", "arkansas.rss", {format: OpenLayers.Format.GeoRSS}));
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <p>Does this map look like arkansas?</p>
+    <div id="map" class="smallmap"></div>
+  </body>
+</html>
diff --git a/tests/manual/clip-features-svg.html b/tests/manual/clip-features-svg.html
new file mode 100644
index 0000000..f4137ea
--- /dev/null
+++ b/tests/manual/clip-features-svg.html
@@ -0,0 +1,128 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>SVG inValidRange Test Case</title><link
+href="../../theme/default/style.css"
+rel="stylesheet" type="text/css">
+<style>
+        #map {
+            width: 512px;
+            height: 512px;
+            border: 1px solid #4B3624;
+            background: White;
+        }
+
+        /* avoid pink tiles */
+        .olImageLoadError {
+            background-color: transparent !important;
+        }
+
+       .olControlAttribution { bottom: 0px!important }
+</style>
+<script src="../../lib/OpenLayers.js"
+type="text/javascript"></script>
+<script type="text/javascript">var map;
+
+      // increase reload attempts 
+      OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
+
+      var vectorLayer;
+      var markerLayer, boxes, newPoint;
+
+      function init(){
+              var options = {
+                  projection: new OpenLayers.Projection("EPSG:900913"),
+                  units: "m",
+                  numZoomLevels: 19,
+                  maxResolution: 156543.0339,
+                  maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
+                                                   20037508, 20037508.34)
+              };
+              map = new OpenLayers.Map('map', options);
+
+              map.addControl(new OpenLayers.Control.MousePosition());
+
+              vectorLayer = new OpenLayers.Layer.Vector("Trails", {isBaseLayer: true});
+              markerLayer = new OpenLayers.Layer.Markers("WayPoints");
+
+              map.addLayers([vectorLayer,markerLayer]);
+
+              var style_trail = OpenLayers.Util.extend({},
+                  OpenLayers.Feature.Vector.style['default']);
+              style_trail.strokeColor = "green";
+              style_trail.strokeWidth = 5;
+
+              var pointList = [];
+
+              newPoint = new OpenLayers.Geometry.Point(-13653735.8487833,5726045.3578081);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-13653731.3960036,5726056.5070679);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-13653730.8394062,5726044.7207079);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-13653743.1958697,5726043.9243328);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-13653754.1051798,5726046.9505586);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-13653760.4503907,5726056.5070679);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-13653767.4635187,5726065.5857612);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-13653830.136392,5726052.2066375);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-13653846.5003571,5726042.3315828);
+              pointList.push(newPoint);
+
+              var lineFeature = new OpenLayers.Feature.Vector(
+                      new OpenLayers.Geometry.LineString(pointList));
+              lineFeature.fid = 52730;
+              vectorLayer.addFeatures(lineFeature);
+
+              pointList = [];
+              
+              newPoint = new OpenLayers.Geometry.Point(-12250153.3626406,4852001.6114048);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-12194315.5060664,4800503.5113048);
+              pointList.push(newPoint);
+              newPoint = new OpenLayers.Geometry.Point(-12180445.0975155,4873109.008858);
+              pointList.push(newPoint);
+
+              lineFeature = new OpenLayers.Feature.Vector(
+                  new OpenLayers.Geometry.LineString(pointList),null,style_trail);
+              lineFeature.fid = 52751;
+              vectorLayer.addFeatures([lineFeature]);
+
+              var size = new OpenLayers.Size(15, 15);
+              var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
+              var icon = new OpenLayers.Icon('../../img/marker.png', size, offset);
+              markerLayer.addMarker(new OpenLayers.Marker(
+                  new OpenLayers.LonLat((newPoint.x + 400), (newPoint.y - 400)), icon));
+
+              map.setCenter(new OpenLayers.LonLat(newPoint.x, newPoint.y), 13)
+      }
+
+      function zoomToScale(zoom) {
+         if (zoom == 8) map.zoomToScale(3385.5001275);
+         else if(zoom == 7) map.zoomToScale(6771.000255);
+         else if (zoom == 6) map.zoomToScale(13542);
+         else if (zoom == 5) map.zoomToScale(27084.001020);
+         else if (zoom == 4) map.zoomToScale(54168.001020);
+         else if (zoom == 3) map.zoomToScale(108337);
+         else if (zoom == 2) map.zoomToScale(3466752.1306573446);
+         else if (zoom == 1) map.zoomToScale(13867008.522629378);
+         else if (zoom == 0) map.zoomToScale(55468034.09051751);
+      }
+
+</script>
+</head>
+<body onLoad="init()">
+<h1 id="title">SVG inValidRange Clipping Test Case</h1>
+<p>Behavior before fixing #1631: Push Zoom 5.  You see lines.  Push
+Zoom 6.  No lines.</p>
+    <div id="map">
+    </div>
+    <button onClick="zoomToScale(5);">Zoom 5</button>
+    <button onClick="zoomToScale(6);">Zoom 6</button>
+    <button onClick="zoomToScale(7);">Zoom 7</button>
+    <button onClick="zoomToScale(8);">Zoom 8</button>
+</body>
+</html>
diff --git a/tests/manual/draw-feature.html b/tests/manual/draw-feature.html
new file mode 100644
index 0000000..8872b63
--- /dev/null
+++ b/tests/manual/draw-feature.html
@@ -0,0 +1,73 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Draw Feature Acceptance Test</title>
+    <style type="text/css">
+    
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        
+        .map {
+            margin: 1em;
+            float: left;
+            width: 256px;
+            height: 256px;
+        }
+
+    </style>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+ 
+        var map1, map2;
+
+        function init(){
+            var wms, vector, ctrl;
+            var goodMaxRes = OpenLayers.Map.prototype.maxResolution;
+            var badMaxRes = 0.00000001;
+
+            map1 = new OpenLayers.Map('map1');
+            wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'});
+            vector = new OpenLayers.Layer.Vector("vector1");
+            map1.addLayers([wms, vector]);
+            ctrl = new OpenLayers.Control.DrawFeature(vector,
+                OpenLayers.Handler.Path);
+            map1.addControl(ctrl);
+            ctrl.activate();
+ 
+            map2 = new OpenLayers.Map('map2',
+                {maxResolution: badMaxRes});
+            wms = new OpenLayers.Layer.WMS( "OpenLayers WMS",
+                "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'},
+                {maxResolution: goodMaxRes});
+            vector = new OpenLayers.Layer.Vector("vector2",
+                {maxResolution: goodMaxRes});
+            map2.addLayers([wms, vector]);
+            ctrl = new OpenLayers.Control.DrawFeature(vector,
+                OpenLayers.Handler.Path);
+            map2.addControl(ctrl);
+            ctrl.activate();
+
+            map1.setCenter(new OpenLayers.LonLat(0, 0), 3);
+            map2.setCenter(new OpenLayers.LonLat(0, 0), 3);
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="map1" class="map"></div>
+    <p><b>Resolution properties set at the map level.</b></p>
+    <p>Points should draw as you draw lines. Click to start
+    drawing and double-click to draw the last point.</p>
+    <br style="clear: both;" />
+
+    <div id="map2" class="map"></div>
+    <p><b>Resolution properties set at the layer level.</b></p>
+    <p>Points should draw as you draw lines. Click to start
+    drawing and double-click to draw the last point.</p>
+  </body>
+</html>
diff --git a/tests/manual/feature-handler.html b/tests/manual/feature-handler.html
new file mode 100644
index 0000000..f9b8892
--- /dev/null
+++ b/tests/manual/feature-handler.html
@@ -0,0 +1,126 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Feature Handler Acceptance Test</title>
+    <style type="text/css">
+    
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        li {
+            list-style: none;
+        }
+        #output {
+            width: 300px;
+            height: 300px;
+        }
+        #west {
+            width: 425px;
+        }
+
+        #east {
+            position: absolute;
+            left: 450px;
+            top: 5px;
+        }
+        #map {
+            width: 400px;
+            height: 400px;
+            border: 1px solid gray;
+        }
+
+    </style>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript"> 
+
+        var map, draw, handler, controls;
+        OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
+
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            var vectors = new OpenLayers.Layer.Vector(
+                "Vector Layer",
+                {isBaseLayer: true}
+            );
+            map.addLayer(vectors);
+            
+            
+            draw = new OpenLayers.Control.DrawFeature(
+                vectors, OpenLayers.Handler.Polygon
+            );
+            map.addControl(draw);
+            
+            var callbacks = {
+                "over": function(feature) {
+                    log("over " + feature.id);
+                },
+                "out": function(feature) {
+                    log("out " + feature.id);
+                },
+                "click": function(feature) {
+                    log("click " + feature.id);
+                },
+                "dblclick": function(feature) {
+                    log("dblclick " + feature.id);
+                },
+                "clickout": function(feature) {
+                    log("clickout " + feature.id);
+                }
+            };
+            
+            handler = new OpenLayers.Handler.Feature(
+                {map: map}, vectors, callbacks
+            );
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+
+        }
+        
+        function log(msg) {
+            document.getElementById('output').value += msg + "\n";
+        }
+        
+        function clearLog() {
+            document.getElementById('output').value = "";
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="west">
+        <div id="map"></div>
+        <p>
+            Draw a few polygons on the map.  Some overlapping.  Activate the
+            feature handler and ensure that "over" and "out" are called only
+            when mousing over/out of a feature for the first time.  The
+            "click" callback should be called for every click on a feature.
+            The "clickout" callback should be called when?
+        </p>
+    </div>
+    <div id="east">
+        <ul>
+            <li>
+                <input type="radio" name="type" value="none" id="noneToggle"
+                       onclick="draw.deactivate();handler.deactivate();" checked="checked" />
+                <label for="noneToggle">navigate</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="polygon" id="polygonToggle"
+                       onclick="draw.activate();handler.deactivate();" />
+                <label for="polygonToggle">draw polygon</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="feature" id="featureToggle"
+                       onclick="draw.deactivate();handler.activate();" />
+                <label for="featureToggle">activate feature handler</label>
+            </li>
+        </ul>
+        <button onclick="clearLog();">clear log</button><br />
+        <textarea id="output"></textarea>
+    </div>
+  </body>
+</html>
diff --git a/tests/manual/geodesic.html b/tests/manual/geodesic.html
new file mode 100644
index 0000000..e642558
--- /dev/null
+++ b/tests/manual/geodesic.html
@@ -0,0 +1,160 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../../theme/default/style.css" type="text/css" />
+    <style type="text/css">
+        #controlToggle li {
+            list-style: none;
+        }
+        #options {
+            position: relative;
+            width: 512px;
+        }
+        #output {
+            float: right;
+        }
+
+        /* avoid pink tiles */
+        .olImageLoadError {
+            background-color: transparent !important;
+        }
+    </style>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, measureControls;
+        function init(){
+            map = new OpenLayers.Map('map');
+            
+            var wmsLayer = new OpenLayers.Layer.OSM(); 
+
+            map.addLayers([wmsLayer]);
+            map.setCenter(new OpenLayers.LonLat(0,0), 5);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.MousePosition());
+            map.addControl(new OpenLayers.Control.ScaleLine({geodesic: true}))
+            
+            // style the sketch fancy
+            var sketchSymbolizers = {
+                "Point": {
+                    pointRadius: 4,
+                    graphicName: "square",
+                    fillColor: "white",
+                    fillOpacity: 1,
+                    strokeWidth: 1,
+                    strokeOpacity: 1,
+                    strokeColor: "#333333"
+                },
+                "Line": {
+                    strokeWidth: 3,
+                    strokeOpacity: 1,
+                    strokeColor: "#666666",
+                    strokeDashstyle: "dash"
+                },
+                "Polygon": {
+                    strokeWidth: 2,
+                    strokeOpacity: 1,
+                    strokeColor: "#666666",
+                    fillColor: "white",
+                    fillOpacity: 0.3
+                }
+            };
+            var style = new OpenLayers.Style();
+            style.addRules([
+                new OpenLayers.Rule({symbolizer: sketchSymbolizers})
+            ]);
+            var styleMap = new OpenLayers.StyleMap({"default": style});
+            
+            measureControls = {
+                line: new OpenLayers.Control.Measure(
+                    OpenLayers.Handler.Path, {
+                        geodesic: true,
+                        persist: true,
+                        handlerOptions: {
+                            layerOptions: {styleMap: styleMap}
+                        }
+                    }
+                ),
+                polygon: new OpenLayers.Control.Measure(
+                    OpenLayers.Handler.Polygon, {
+                        geodesic: true,
+                        persist: true,
+                        handlerOptions: {
+                            layerOptions: {styleMap: styleMap}
+                        }
+                    }
+                )
+            };
+            
+            var control;
+            for(var key in measureControls) {
+                control = measureControls[key];
+                control.events.on({
+                    "measure": handleMeasurements,
+                    "measurepartial": handleMeasurements
+                });
+                map.addControl(control);
+            }
+            
+            map.setCenter(new OpenLayers.LonLat(0, 0), 3);
+            
+            document.getElementById('noneToggle').checked = true;
+        }
+        
+        function handleMeasurements(event) {
+            var geometry = event.geometry;
+            var units = event.units;
+            var order = event.order;
+            var measure = event.measure;
+            var element = document.getElementById('output');
+            var out = "";
+            if(order == 1) {
+                out += "measure: " + measure.toFixed(3) + " " + units;
+            } else {
+                out += "measure: " + measure.toFixed(3) + " " + units + "<sup>2</" + "sup>";
+            }
+            element.innerHTML = out;
+        }
+
+        function toggleControl(element) {
+            for(key in measureControls) {
+                var control = measureControls[key];
+                if(element.value == key && element.checked) {
+                    control.activate();
+                } else {
+                    control.deactivate();
+                }
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Geodesic Measurement & ScaleLine</h1>
+    <p id="shortdesc">
+        Tests geodesic measurement of distances and areas against a geodesic ScaleLine.
+    </p>
+    <div id="map" style="width: 512px; height: 300px;"></div>
+    <div id="options">
+        <div id="output">
+        </div>
+        <ul id="controlToggle">
+            <li>
+                <input type="radio" name="type" value="none" id="noneToggle"
+                       onclick="toggleControl(this);" checked="checked" />
+                <label for="noneToggle">navigate</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="line" id="lineToggle" onclick="toggleControl(this);" />
+                <label for="lineToggle">measure distance</label>
+            </li>
+            <li>
+                <input type="radio" name="type" value="polygon" id="polygonToggle" onclick="toggleControl(this);" />
+                <label for="polygonToggle">measure area</label>
+            </li>
+        </ul>
+    </div>
+    <p>Zoom in so the ScaleLine shows units in the range of 10-100 km. Measure
+    the length of the ScaleLine. The result should be approximately the same
+    as the distance printed on the ScaleLine.</p>
+    <p>Zoom out so the ScaleLine shows units in the range of 100-500 km. Drag
+    the map to the South or North and see how the ScaleLine length changes.</p>
+  </body>
+</html>
diff --git a/tests/manual/geojson-geomcoll-reprojection.html b/tests/manual/geojson-geomcoll-reprojection.html
new file mode 100644
index 0000000..e82e08a
--- /dev/null
+++ b/tests/manual/geojson-geomcoll-reprojection.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+    <head>
+        <style type="text/css" media="screen">
+            #map { height: 500px; }
+        </style>
+        <script src="../../lib/OpenLayers.js" type="text/javascript" charset="utf-8"></script>
+        <script src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js" type="text/javascript" charset="utf-8"></script>
+        <script type="text/javascript" charset="utf-8">
+            function init(){
+                var map = new OpenLayers.Map ("map", {
+                    controls: [
+                        new OpenLayers.Control.Navigation(),
+                        new OpenLayers.Control.Attribution()
+                    ],
+                    maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
+                    maxResolution: 156543.0399,
+                    numZoomLevels: 19,
+                    units: 'm',
+                    projection: new OpenLayers.Projection("EPSG:900913"),
+                    displayProjection: new OpenLayers.Projection("EPSG:4326")
+                });
+                
+                var osm = new OpenLayers.Layer.OSM.Mapnik('OSM');
+                map.addLayer(osm);
+                var lonLat = new OpenLayers.LonLat(5, 40).transform(new OpenLayers.Projection("EPSG:4326"), map.getProjectionObject());
+                map.setCenter (lonLat, 5);
+                
+                var featurecollection = {
+                    "type": "FeatureCollection", 
+                    "features": [{
+                        "geometry": {
+                            "type": "GeometryCollection", 
+                            "geometries": [
+                                {
+                                    "type": "LineString", 
+                                    "coordinates": 
+                                        [[11.0878902207, 45.1602390564], 
+                                        [15.01953125, 48.1298828125]]
+                                },
+                                {
+                                    "type": "Polygon", 
+                                    "coordinates": 
+                                        [[[11.0878902207, 45.1602390564], 
+                                          [14.931640625, 40.9228515625], 
+                                          [0.8251953125, 41.0986328125], 
+                                          [7.63671875, 48.96484375], 
+                                          [11.0878902207, 45.1602390564]]]
+                                },
+                                {
+                                    "type":"Point", 
+                                    "coordinates":[15.87646484375, 44.1748046875]                                    
+                                }
+                            ]
+                        }, 
+                        "type": "Feature", 
+                        "properties": {}    
+                    }]
+                };
+                var geojson_format = new OpenLayers.Format.GeoJSON({
+                    'internalProjection': new OpenLayers.Projection("EPSG:900913"),
+                    'externalProjection': new OpenLayers.Projection("EPSG:4326")
+                });
+                var vector_layer = new OpenLayers.Layer.Vector(); 
+                map.addLayer(vector_layer);
+                vector_layer.addFeatures(geojson_format.read(featurecollection));
+            };
+        </script>
+    </head>
+    <body onload="init()">
+        <div id="map"></div>
+    </body>
+</html>
diff --git a/tests/manual/google-panning.html b/tests/manual/google-panning.html
new file mode 100644
index 0000000..0ccdaf2
--- /dev/null
+++ b/tests/manual/google-panning.html
@@ -0,0 +1,122 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Google Panning Acceptance Test</title>
+    <style type="text/css">
+    
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        
+        #evenmap {
+            margin: 1em;
+            float: left;
+            width: 256px;
+            height: 256px;
+        }
+
+        #oddmap {
+            margin: 1em;
+            float: left;
+            width: 255px;
+            height: 255px;
+        }
+
+        /* avoid pink tiles */
+        .olImageLoadError {
+            background-color: transparent !important;
+        }
+
+    </style>
+
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+ 
+        var evenmap, oddmap;
+
+        // increase reload attempts 
+        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
+
+        function init(){
+            evenmap = new OpenLayers.Map('evenmap');
+            var evenlayer = new OpenLayers.Layer.Google(
+                "Imagery",
+                {type: G_SATELLITE_MAP}
+            );
+            evenmap.addLayer(evenlayer);
+            var epc = document.getElementById("epc");
+            var emc = document.getElementById("emc");
+            var ee = document.getElementById("ee");
+            evenmap.events.register("moveend", null, function() {
+                var px = new OpenLayers.Pixel(evenmap.size.w / 2,
+                                              evenmap.size.h / 2);
+                var pc = evenmap.getLonLatFromViewPortPx(px);
+                pc.lon = parseFloat(pc.lon.toPrecision(6));
+                pc.lat = parseFloat(pc.lat.toPrecision(6));
+                var mc = evenmap.baseLayer.getOLLonLatFromMapObjectLonLat(
+                    evenmap.baseLayer.mapObject.getCenter()
+                );
+                mc.lon = parseFloat(mc.lon.toPrecision(6));
+                mc.lat = parseFloat(mc.lat.toPrecision(6));
+                epc.innerHTML = "(" + pc.lon + ", " + pc.lat + ")";
+                emc.innerHTML = "(" + mc.lon + ", " + mc.lat + ")";
+                ee.innerHTML = pc.equals(mc);
+            });
+            evenmap.zoomToMaxExtent();
+
+            oddmap = new OpenLayers.Map('oddmap');
+            var oddlayer = new OpenLayers.Layer.Google(
+                "Imagery",
+                {type: G_SATELLITE_MAP}
+            );
+            oddmap.addLayer(oddlayer);
+            var opc = document.getElementById("opc");
+            var omc = document.getElementById("omc");
+            var oe = document.getElementById("oe");
+            oddmap.events.register("moveend", null, function() {
+                var px = new OpenLayers.Pixel(oddmap.size.w / 2,
+                                              oddmap.size.h / 2);
+                var pc = oddmap.getLonLatFromViewPortPx(px);
+                pc.lon = parseFloat(pc.lon.toPrecision(6));
+                pc.lat = parseFloat(pc.lat.toPrecision(6));
+                var mc = oddmap.baseLayer.getOLLonLatFromMapObjectLonLat(
+                    oddmap.baseLayer.mapObject.getCenter()
+                );
+                mc.lon = parseFloat(mc.lon.toPrecision(6));
+                mc.lat = parseFloat(mc.lat.toPrecision(6));
+                opc.innerHTML = "(" + pc.lon + ", " + pc.lat + ")";
+                omc.innerHTML = "(" + mc.lon + ", " + mc.lat + ")";
+                oe.innerHTML = pc.equals(mc);
+            });
+            oddmap.zoomToMaxExtent();
+
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="evenmap"></div>
+    <p><b>Even sized map.</b> The map on the left should pan regularly, and the
+    two centers below should be equivalent.  Both dragging and panning with
+    buttons should maintain the same center.</p>
+    <p><b>pixel center:</b> <span id="epc"></span>
+    <br /><b>map center:</b> <span id="emc"></span>
+    <br /><b>equvalent:</b> <span id="ee"></span>
+    </p>
+    <br style="clear: both;" />
+
+    <div id="oddmap"></div>
+    <p><b>Odd sized map.</b> The map on the left should pan regularly, and the
+    two centers below should be equivalent.  Both dragging and panning with
+    buttons should maintain the same center.</p>
+    <p><b>pixel center:</b> <span id="opc"></span>
+    <br /><b>map center:</b> <span id="omc"></span>
+    <br /><b>equvalent:</b> <span id="oe"></span>
+    </p>
+    </ul>
+  </body>
+</html>
diff --git a/tests/manual/google-resize.html b/tests/manual/google-resize.html
new file mode 100644
index 0000000..c1384df
--- /dev/null
+++ b/tests/manual/google-resize.html
@@ -0,0 +1,55 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>OpenLayers Google Layer Example</title>
+    <link rel="stylesheet" href="../../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="../../examples/style.css" type="text/css" />
+    <!-- this gmaps key generated for http://openlayers.org/dev/ -->
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+
+        function init() {
+            var mapOptions = {
+                projection: "EPSG:900913",
+                displayProjection: new OpenLayers.Projection("EPSG:4326"), //Pour afficher les coord lat long
+                units: "m",
+                maxResolution: 156543.0339,
+                maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
+                controls: [new OpenLayers.Control.LayerSwitcher()],
+                numZoomLevels: 20
+            };
+            map = new OpenLayers.Map('map', mapOptions);
+
+            var dummy = new OpenLayers.Layer(
+                "Dummy",
+                {isBaseLayer: true}
+            );
+            var gmap = new OpenLayers.Layer.Google(
+                "Google Streets", {sphericalMercator: true}
+            );
+
+            map.addLayers([dummy, gmap]);
+
+            map.setCenter(new OpenLayers.LonLat(-7712190.388467473, 6567469.498697457), 6);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Google Layer Resize Issue</h1>
+
+    <div id="tags"></div>
+
+    <p id="shortdesc">
+        <ol>
+            <li>Click
+                <button onclick="var m = document.getElementById('map').style; m.height = '400px'; m.width = '800px'; map.updateSize(); return false;">Resize</button></li>
+            <li>Open the LayerSwitcher and switch to Google Streets</li>
+            <li>Confirm that the whole map area is populated with tiles</li>
+        </ol>
+    </p>
+
+    <div id="map" style="width: 200px; height: 200px"></div>
+
+  </body>
+</html>
diff --git a/tests/manual/memory/Marker-2258.html b/tests/manual/memory/Marker-2258.html
new file mode 100644
index 0000000..b2d8a37
--- /dev/null
+++ b/tests/manual/memory/Marker-2258.html
@@ -0,0 +1,60 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Memory Test - Layer.Markers / Marker</title>
+    <style type="text/css">
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        #map {
+            width: 256px;
+            height: 256px;
+            border: 1px solid black;
+        }
+    </style>
+
+    <script src="../../../lib/Firebug/firebug.js"></script>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer, marker;
+        
+        function init(){
+            map = new OpenLayers.Map('map');
+            map.addLayer(new OpenLayers.Layer.WMS( "OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} ));
+            map.setCenter(new OpenLayers.LonLat(0, 0), 0);
+            
+            layer = new OpenLayers.Layer.Markers( "Markers" );
+            map.addLayer(layer);
+            
+            marker = new OpenLayers.Marker(new OpenLayers.LonLat(0,0));
+            layer.addMarker(marker);
+            
+            window.setTimeout(function() {
+                layer.removeMarker(marker);
+                layer.addMarker(marker);
+                
+                // people SHOULD call marker.destroy(). But if they don't
+                // we leak memory.
+                //marker.destroy();
+                
+                window.alert("Setup - hit STOP in the leak detector now");
+            }, 100);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Memory Test - Layer.Markers / Marker</h1>
+    <pre id="status"></pre>
+    <div id="map"></div>
+    <p>
+    This test is a memory leak test for usage of Layer.Markers / Marker.
+    </p>
+    <p>
+    Run this test in IE6/7 with <a href="http://blogs.msdn.com/gpde/pages/javascript-memory-leak-detector-v2.aspx">JavaScript Memory Leak Detector v2</a>
+    and watch it identify a leak unless this is fixed.
+    </p>
+  </body>
+</html>
diff --git a/tests/manual/memory/PanZoom-2323.html b/tests/manual/memory/PanZoom-2323.html
new file mode 100644
index 0000000..de629a6
--- /dev/null
+++ b/tests/manual/memory/PanZoom-2323.html
@@ -0,0 +1,41 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Memory Test - PanZoom.getSlideFactor</title>
+    <style type="text/css">
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        #map {
+            width: 256px;
+            height: 256px;
+            border: 1px solid black;
+        }
+    </style>
+
+    <script src="../../../lib/Firebug/firebug.js"></script>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        var layer;
+        
+        function init(){
+            map = new OpenLayers.Map('map');
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Memory Test - PanZoom.getSlideFactor</h1>
+    <pre id="status"></pre>
+    <div id="map"></div>
+    <p>
+    This test is a memory leak test for: PanZoom.getSlideFactor.
+    </p>
+    <p>
+    Run this test in IE6/7 with <a href="http://blogs.msdn.com/gpde/pages/javascript-memory-leak-detector-v2.aspx">JavaScript Memory Leak Detector v2</a>
+    and watch it identify a leak unless this is fixed.
+    </p>
+  </body>
+</html>
diff --git a/tests/manual/memory/RemoveChild-2170.html b/tests/manual/memory/RemoveChild-2170.html
new file mode 100644
index 0000000..abe9249
--- /dev/null
+++ b/tests/manual/memory/RemoveChild-2170.html
@@ -0,0 +1,56 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Memory Test - DOMNode.removeChild</title>
+    <style type="text/css">
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        #map {
+            width: 512px;
+            height: 512px;
+            border: 1px solid black;
+        }
+    </style>
+
+    <script src="../../../lib/Firebug/firebug.js"></script>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layer;
+        
+        function tearDown() {
+            layer.events.unregister("loadend", layer, tearDown);
+            window.setTimeout(function() {
+                map.removeLayer(layer);
+                //map.addLayer(layer);
+                layer.destroy();
+                window.alert("Setup - hit STOP in the leak detector now");
+            }, 100);
+        }
+        
+        function init(){
+            map = new OpenLayers.Map( 'map', {maxResolution:1.40625/2} );
+            layer = new OpenLayers.Layer.TMS( "TMS",
+                    "http://labs.metacarta.com/wms-c/Basic.py/", {layername: 'basic', type:'png'} );
+            map.addLayer(layer);
+            map.setCenter(new OpenLayers.LonLat(5, 40), 5);
+            
+            layer.events.register("loadend", layer, tearDown);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Memory Test - DOMNode.removeChild</h1>
+    <pre id="status"></pre>
+    <div id="map"></div>
+    <p>
+    This test is a memory leak test for usage of DOMNode.removeChild
+    </p>
+    <p>
+    Run this test in IE6/7 with <a href="http://blogs.msdn.com/gpde/pages/javascript-memory-leak-detector-v2.aspx">JavaScript Memory Leak Detector v2</a>
+    and watch it identify a leak unless this is fixed.
+    </p>
+  </body>
+</html>
diff --git a/tests/manual/memory/VML-2170.html b/tests/manual/memory/VML-2170.html
new file mode 100644
index 0000000..2f72300
--- /dev/null
+++ b/tests/manual/memory/VML-2170.html
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Memory Test - Renderer.VML - onselectstart</title>
+    <style type="text/css">
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        #map {
+            width: 256px;
+            height: 256px;
+            border: 1px solid black;
+        }
+    </style>
+
+    <script src="../../../lib/Firebug/firebug.js"></script>
+    <script src="../../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        var layer;
+        
+        function init(){
+            map = new OpenLayers.Map('map');
+            
+            layer = new OpenLayers.Layer.Vector("Test-VML", {renderers:['VML']});
+            map.addLayers([layer]);
+            
+            window.setTimeout(function() {
+                layer.redraw();
+                window.alert("Setup - hit STOP in the leak detector now");
+            }, 100);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Memory Test - Renderer.VML - onselectstart</h1>
+    <pre id="status"></pre>
+    <div id="map"></div>
+    <p>
+    This test is a memory leak test for usage of "onselectstart" event handler in Renderer.VML
+    </p>
+    <p>
+    Run this test in IE6/7 with <a href="http://blogs.msdn.com/gpde/pages/javascript-memory-leak-detector-v2.aspx">JavaScript Memory Leak Detector v2</a>
+    and watch it identify a leak unless this is fixed.
+    </p>
+  </body>
+</html>
diff --git a/tests/manual/multiple-google-layers.html b/tests/manual/multiple-google-layers.html
new file mode 100644
index 0000000..df5c4f0
--- /dev/null
+++ b/tests/manual/multiple-google-layers.html
@@ -0,0 +1,135 @@
+<html>
+    <head>
+        <title>Multiple Google Layers Acceptance Test</title>
+        <script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ"></script> 
+        <script src="../../lib/OpenLayers.js"></script>
+        <link rel="stylesheet" href="../../theme/default/style.css" type="text/css" />
+        <link rel="stylesheet" href="../../theme/default/google.css" type="text/css" />
+        <style>
+            .col {
+                position: relative;
+                width: 50%;
+            }
+            #col1 {
+                float: left;
+            }
+            #col2 {
+                float: right;
+            }
+            .map {
+                position: relative;
+                height: 300px;
+            }
+            .wrap {
+                position: relative;
+                padding: 10px;
+            }
+            ul {
+                padding: 0;
+            }
+            ul li {
+                list-style: none;
+            }
+            p.clear {
+                clear: both;
+            }
+        </style>
+    </head>
+    <body>
+        <div id="col1" class="col">
+            <div class="wrap">
+                <div id="map1" class="map"></div>
+                layers for map1
+                <ul>
+                    <li><input type="checkbox" checked="checked" name="streets1" id="streets1"><label for="streets1">streets</label></li>
+                    <li><input type="checkbox" checked="checked" name="sat1" id="sat1"><label for="sat1">imagery</label></li>
+                    <li><input type="checkbox" checked="checked" name="topo1" id="topo1"><label for="topo1">topography</label></li>
+                </ul>
+            </div>
+        </div>
+        <div id="col2" class="col">
+            <div class="wrap">
+                <div id="map2" class="map"></div>
+                layers for map2
+                <ul>
+                    <li><input type="checkbox" name="streets2" id="streets2"><label for="streets2">streets</label></li>
+                    <li><input type="checkbox" name="sat2" id="sat2"><label for="sat2">imagery</label></li>
+                    <li><input type="checkbox" name="topo2" id="topo2"><label for="topo2">topography</label></li>
+                </ul>
+            </div>
+        </div>
+        <p class="clear">
+            This example is used to confirm that resizable maps with multiple
+            Google layers work properly.  Click the checkboxes to add/remove
+            layers from the maps.  Use the layer switcher to change the map's
+            base layer.  You should be able to confirm the following:
+            <ol>
+                <li>Adding and removing layers doesn't raise any errors
+                (regardless of how many times the same layer is added/removed).</li>
+                <li>The Google "Powered By" link is always visible and clickable
+                when a Google layer is displayed.</li>
+                <li>The Google "Terms of Use" link is always visible and clickable
+                when a Google layer is displayed.</li>
+                <li>Resizing a map (by resizing the browser window) and then
+                changing base layer works well.  That is, the center & scale are
+                preserved and all tiles are well aligned.</li>
+                <li>Setting the base layer to the "Dummy Layer" hides all other
+                Google base layers, "Powered By" link, and "Terms of Use" link.</li>
+            </ol>
+        </p>
+        <script>
+        
+            var map1 = new OpenLayers.Map("map1");
+            var streets1 = new OpenLayers.Layer.Google("Streets", {
+                type: G_NORMAL_MAP
+            });
+            var sat1 = new OpenLayers.Layer.Google("Imagery", {
+                type: G_SATELLITE_MAP
+            });
+            var topo1 = new OpenLayers.Layer.Google("Topography", {
+                type: G_PHYSICAL_MAP
+            });
+            var dummy1 = new OpenLayers.Layer("Dummy Layer", {
+                isBaseLayer: true
+            });
+            map1.addLayers([streets1, sat1, topo1, dummy1]);
+            map1.addControl(new OpenLayers.Control.LayerSwitcher);
+            map1.zoomToMaxExtent();
+        
+            var map2 = new OpenLayers.Map("map2");
+            var streets2 = new OpenLayers.Layer.Google("Streets", {
+                type: G_NORMAL_MAP
+            });
+            var sat2 = new OpenLayers.Layer.Google("Imagery", {
+                type: G_SATELLITE_MAP
+            });
+            var topo2 = new OpenLayers.Layer.Google("Topography", {
+                type: G_PHYSICAL_MAP
+            });
+            var dummy2 = new OpenLayers.Layer("Dummy Layer", {
+                isBaseLayer: true
+            });
+            map2.addLayer(dummy2);
+            map2.addControl(new OpenLayers.Control.LayerSwitcher);
+            map2.zoomToMaxExtent();
+            
+            // add behavior to checkboxes
+            var check, inputs = document.getElementsByTagName("input");
+            for (var i=0, len=inputs.length; i<len; ++i) {
+                check = inputs[i];
+                check.onclick = function() {
+                    var name = this.name;
+                    var num = name.match(/\d$/)[0];
+                    var layer = window[name];
+                    var map = window["map" + num];
+                    if (this.checked) {
+                        map.addLayer(layer);
+                    } else {
+                        map.removeLayer(layer);
+                    }
+                }
+            }
+
+        </script>
+    </body>
+</html>
\ No newline at end of file
diff --git a/tests/manual/overviewmap-projection.html b/tests/manual/overviewmap-projection.html
new file mode 100644
index 0000000..bb15c9f
--- /dev/null
+++ b/tests/manual/overviewmap-projection.html
@@ -0,0 +1,70 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../../theme/default/style.css" type="text/css" />
+    <link rel="stylesheet" href="../../examples/style.css" type="text/css" />
+    <style type="text/css">
+        .olControlAttribution { bottom: 0px!important }
+        #map {
+            height: 512px;
+        }
+    </style>
+
+    <script src='http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+
+        // make map available for easy debugging
+        var map;
+
+        function init(){
+            var options = {
+                projection: new OpenLayers.Projection("EPSG:900913"),
+                displayProjection: new OpenLayers.Projection("EPSG:4326"),
+                units: "m",
+                maxResolution: 156543.0339,
+                maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
+                                                 20037508, 20037508.34)
+            };
+            map = new OpenLayers.Map('map', options);
+
+            // create Google Mercator layers
+            var gmap = new OpenLayers.Layer.Google(
+                "Google Streets",
+                {'sphericalMercator': true}
+            );
+            map.addLayers([gmap]);
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.Permalink());
+            map.addControl(new OpenLayers.Control.MousePosition());
+            var ovmap = new OpenLayers.Control.OverviewMap({
+                maxRatio: 16,
+                layers: [new OpenLayers.Layer.WMS("OpenLayers WMS", 
+                    "http://labs.metacarta.com/wms/vmap0",
+                    {layers: 'basic'})]
+            });
+            map.addControl(ovmap);
+            ovmap.maximizeControl();
+            if (!map.getCenter()) {map.zoomToMaxExtent()};
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">OpenLayers Overview Map Projection Test</h1>
+
+    <div id="tags">
+    </div>
+    <p id="shortdesc">
+        Acceptance test for different projections in map and overview map.
+        The map uses EPSG:900913, the overview map EPSG:4326. Zoom the map and
+        drag both the map and the overview map to see it in action.
+    </p>
+    <div id="map" class="smallmap"></div>
+
+    <div id="docs">
+    </div>
+  </body>
+</html>
+
+
+
diff --git a/tests/manual/pan-redraw-svg.html b/tests/manual/pan-redraw-svg.html
new file mode 100644
index 0000000..ec1126b
--- /dev/null
+++ b/tests/manual/pan-redraw-svg.html
@@ -0,0 +1,58 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <link rel="stylesheet" href="../../theme/default/style.css" type="text/css" />
+    <style type="text/css">
+        #map {
+            width: 512px;
+            height: 512px;
+            border: 1px solid gray;
+        }
+    </style>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, point;
+
+        function init(){
+            var options = {
+                projection: new OpenLayers.Projection("EPSG:900913"),
+                displayProjection: new OpenLayers.Projection("EPSG:4326"),
+                units: "m",
+                maxResolution: 20, //0.07464553542137146,
+                maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
+                                                 20037508, 20037508.34)
+            };
+            map = new OpenLayers.Map('map', options);
+            var vector = new OpenLayers.Layer.Vector(
+                    "Vectors",
+                    {isBaseLayer: true}
+            );
+            map.addLayer(vector);
+
+            var x =  -20000;//4.33791754;
+            var y = 20000;
+            point = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Point(x, y)
+            );
+            
+            map.addLayer(vector);
+            vector.addFeatures([point]);
+            map.setCenter(new OpenLayers.LonLat(0, 0), 5);
+        }
+        
+        function pan(){
+            map.panTo(point.geometry.getBounds().getCenterLonLat());
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+    <h3 id="title">SVG inValidRange Redraw Test Case</h3>
+    <p>Before fixing #1631, after klicking Go! no point would have appeared. The Go! button
+    pans the map over a long distance. Before dragging, the point would have been
+    outside the valid range, and the pan operation would not have triggered the SVG
+    coordinate system to be recreated. The new vector rendering takes care of all this. </p>
+    <div id="map"></div>
+    <input type="button" value="Go!" onclick="pan();"></input>
+  </body>
+</html>
diff --git a/tests/manual/popup-keepInMap.html b/tests/manual/popup-keepInMap.html
new file mode 100644
index 0000000..4ba1c18
--- /dev/null
+++ b/tests/manual/popup-keepInMap.html
@@ -0,0 +1,100 @@
+<html xmlns="http://www.w3.org/1999/xhtml" debug="true">
+  <head>
+    <title>OpenLayers: Popup Mayhem</title>
+    <link rel="stylesheet" href="../../theme/default/style.css" type="text/css" />
+    <style type="text/css">
+        #map {
+            width: 900px;
+            height: 500px;
+            border: 1px solid black;
+        }
+    </style>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        var layer, markers;
+        
+        var currentPopup;
+        
+        
+        AutoSizeFramedCloud = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
+            'autoSize': true,
+            'panMapIfOutOfView': false
+        });
+
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            markers = new OpenLayers.Layer.Markers("zibo", {isBaseLayer: true});
+            map.addLayer(markers);
+
+            addMarkers();
+            map.zoomToMaxExtent();
+        }
+        
+        function addMarkers() {
+
+            var ll, popupClass, popupContentHTML;
+
+            //anchored bubble popup small contents autosize closebox
+            ll = new OpenLayers.LonLat(-35,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = "<div>This popup can't be panned to fit in view, so its popup text should fit inside the map. If it doens't, instead of expaning outside, it will simply make the content scroll. Scroll scroll scroll your boat, gently down the stream! Chicken chicken says the popup text is really boring to write. Did you ever see a popup a popup a popup did you ever see a popup a popup right now. With this way and that way and this way and that way did you ever see a popup a [...]
+            addMarker(ll, popupClass, popupContentHTML, true, true);
+ 
+
+        }
+
+        /**
+         * Function: addMarker
+         * Add a new marker to the markers layer given the following lonlat, 
+         *     popupClass, and popup contents HTML. Also allow specifying 
+         *     whether or not to give the popup a close box.
+         * 
+         * Parameters:
+         * ll - {<OpenLayers.LonLat>} Where to place the marker
+         * popupClass - {<OpenLayers.Class>} Which class of popup to bring up 
+         *     when the marker is clicked.
+         * popupContentHTML - {String} What to put in the popup
+         * closeBox - {Boolean} Should popup have a close box?
+         * overflow - {Boolean} Let the popup overflow scrollbars?
+         */
+        function addMarker(ll, popupClass, popupContentHTML, closeBox, overflow) {
+
+            var feature = new OpenLayers.Feature(markers, ll); 
+            feature.closeBox = closeBox;
+            feature.popupClass = popupClass;
+            feature.data.popupContentHTML = popupContentHTML;
+            feature.data.overflow = (overflow) ? "auto" : "hidden";
+                    
+            var marker = feature.createMarker();
+
+            var markerClick = function (evt) {
+                if (this.popup == null) {
+                    this.popup = this.createPopup(this.closeBox);
+                    map.addPopup(this.popup);
+                    this.popup.show();
+                } else {
+                    this.popup.toggle();
+                    this.popup.updateSize();
+                }
+                currentPopup = this.popup;
+                OpenLayers.Event.stop(evt);
+            };
+            marker.events.register("mousedown", feature, markerClick);
+
+            markers.addMarker(marker);
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+  <h1 id="title">Popup KeepInMap</h1>
+
+           <div id="map" class="smallmap"></div>
+      </div>
+      Click on popup, and the content should scroll rather than expanding outside the map.  
+   </div>
+  </body>
+</html>
diff --git a/tests/manual/reflow.html b/tests/manual/reflow.html
new file mode 100644
index 0000000..bb9585e
--- /dev/null
+++ b/tests/manual/reflow.html
@@ -0,0 +1,59 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <style type="text/css">
+        #map {
+            width: 800px;
+            height: 475px;
+            border: 1px solid black;
+        }
+    </style>
+    <script src="../../lib/OpenLayers.js" type="text/javascript"></script>
+    <script type="text/javascript">
+        
+        var map;
+        var vectors;
+        
+        function init(){
+            map = new OpenLayers.Map('map');
+            var wms = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0",
+                {layers: 'basic'}
+            );
+
+            vectors = new OpenLayers.Layer.Vector(
+                "Simple Geometry",
+                {
+                    styleMap: new OpenLayers.StyleMap({
+                        externalGraphic: "../../img/marker-gold.png",
+                        pointRadius: 10
+                    })
+                }
+            );
+            
+            map.addLayers([wms, vectors]);
+            
+            var features = [];
+            var x = -111.04;
+            var y = 45.68;
+            for(var i = 0; i < 10; i++){
+                x += i * .5;
+                y += i * .1;
+                features.push(
+                    new OpenLayers.Feature.Vector(
+                        new OpenLayers.Geometry.Point(x, y)
+                    )
+                );
+            }
+            
+            map.setCenter(new OpenLayers.LonLat(x, y), 5);
+            vectors.addFeatures(features);
+        };
+        
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="map"></div>
+    <p>Use the pan buttons.  See flicker at end of animated pan.</p>
+  </body>
+</html>
diff --git a/tests/manual/rendered-dimensions.html b/tests/manual/rendered-dimensions.html
new file mode 100644
index 0000000..41b0fcf
--- /dev/null
+++ b/tests/manual/rendered-dimensions.html
@@ -0,0 +1,48 @@
+<html>
+<head>
+<style type="text/css">
+ .testDims p{
+    padding: 20px; 
+}     
+</style>
+<script src="../../lib/OpenLayers.js"></script>
+<script>
+function run() {
+    var out = document.getElementById("out");    
+    var size = OpenLayers.Util.getRenderedDimensions("<p>Content</p>");
+    var bigger = OpenLayers.Util.getRenderedDimensions("<p>Content</p>", null, {displayClass: 'testDims'});
+    var overflow = OpenLayers.Util.getRenderedDimensions("<p style='overflow:auto'>Content</p>");
+    var width = OpenLayers.Util.getRenderedDimensions("<p>Content</p>", new OpenLayers.Size(250, null));
+    var height = OpenLayers.Util.getRenderedDimensions("<p>Content</p>", new OpenLayers.Size(null, 40));
+    if ((size.w + 40) == bigger.w && (size.h + 40) == bigger.h) {
+        out.innerHTML = "bigger Pass:  " + size + ", " + bigger;
+    } else { 
+        out.innerHTML = "bigger Fail:  " + size + ", " + bigger;
+    }
+
+    if (size.w == overflow.w && size.h == overflow.h) {
+        out.innerHTML += "<br/>overflow Pass:  " + size + ", " + overflow;
+    } else {
+        out.innerHTML += "<br/>overflow Fail:  " + size + ", " + overflow;
+    }
+
+    if (width.w == 250 && width.h == size.h) {
+        out.innerHTML += "<br/>width Pass:  " + size + ", " + width;
+    }
+    else {
+        out.innerHTML += "<br/>width Fail:  " + size + ", " + width;
+    }
+
+    if (height.h == 40 && height.w == size.w) {
+        out.innerHTML += "<br/>height Pass:  " + size + ", " + height;
+    }
+    else {
+        out.innerHTML += "<br/>height Fail:  " + size + ", " + height;
+    }
+} 
+</script>
+</head>
+<body onload="run()">
+<div id="out"></div>
+</body>
+</html>
diff --git a/tests/manual/renderedDimensions.html b/tests/manual/renderedDimensions.html
new file mode 100644
index 0000000..b01624b
--- /dev/null
+++ b/tests/manual/renderedDimensions.html
@@ -0,0 +1,113 @@
+<html xmlns="http://www.w3.org/1999/xhtml" debug="true">
+  <head>
+    <title>OpenLayers: Popup Mayhem</title>
+    <link rel="stylesheet" href="../../theme/default/style.css" type="text/css" />
+    <style type="text/css">
+        #map {
+            width: 900px;
+            height: 500px;
+            border: 1px solid black;
+        }
+    </style>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map;
+        var layer, markers;
+        
+        var currentPopup;
+        
+        
+// different popup types
+
+
+        //disable the autosize for the purpose of our matrix
+        OpenLayers.Popup.FramedCloud.prototype.autoSize = false;
+
+        AutoSizeFramedCloud = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
+            'autoSize': true
+        });
+
+        function init(){
+            map = new OpenLayers.Map('map');
+
+            layer = new OpenLayers.Layer(
+                "popupMatrix", 
+                {isBaseLayer: true}
+            );
+            map.addLayer(layer);
+
+            markers = new OpenLayers.Layer.Markers("zibo");
+            map.addLayer(markers);
+
+            addMarkers();
+            map.zoomToMaxExtent();
+        }
+        
+        function addMarkers() {
+
+            var ll, popupClass, popupContentHTML;
+
+            //anchored bubble popup small contents autosize closebox
+            ll = new OpenLayers.LonLat(-35,-15);
+            popupClass = AutoSizeFramedCloud;
+            popupContentHTML = "<div>This text's line-height is affected<br/>by it's parents. Thus we have to<br/>place the content inside<br/>the correct container to get<br/>the rendered size.</div>";
+            addMarker(ll, popupClass, popupContentHTML, true);
+ 
+
+        }
+
+        /**
+         * Function: addMarker
+         * Add a new marker to the markers layer given the following lonlat, 
+         *     popupClass, and popup contents HTML. Also allow specifying 
+         *     whether or not to give the popup a close box.
+         * 
+         * Parameters:
+         * ll - {<OpenLayers.LonLat>} Where to place the marker
+         * popupClass - {<OpenLayers.Class>} Which class of popup to bring up 
+         *     when the marker is clicked.
+         * popupContentHTML - {String} What to put in the popup
+         * closeBox - {Boolean} Should popup have a close box?
+         * overflow - {Boolean} Let the popup overflow scrollbars?
+         */
+        function addMarker(ll, popupClass, popupContentHTML, closeBox, overflow) {
+
+            var feature = new OpenLayers.Feature(markers, ll); 
+            feature.closeBox = closeBox;
+            feature.popupClass = popupClass;
+            feature.data.popupContentHTML = popupContentHTML;
+            feature.data.overflow = (overflow) ? "auto" : "hidden";
+                    
+            var marker = feature.createMarker();
+
+            var markerClick = function (evt) {
+                if (this.popup == null) {
+                    this.popup = this.createPopup(this.closeBox);
+                    map.addPopup(this.popup);
+                    this.popup.show();
+                } else {
+                    this.popup.toggle();
+                }
+                currentPopup = this.popup;
+                OpenLayers.Event.stop(evt);
+            };
+            marker.events.register("mousedown", feature, markerClick);
+
+            markers.addMarker(marker);
+        }
+
+    </script>
+  </head>
+  <body onload="init()">
+  <h1 id="title">Popup Matrix</h1>
+
+  <div id="tags">
+  </div>
+      <div style="line-height: 40px;">
+           <div id="map" class="smallmap"></div>
+      </div>
+      Click on popup, should be able to read a full sentence, not just two lines.  
+   </div>
+  </body>
+</html>
diff --git a/tests/manual/select-feature.html b/tests/manual/select-feature.html
new file mode 100644
index 0000000..6e1fba0
--- /dev/null
+++ b/tests/manual/select-feature.html
@@ -0,0 +1,75 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Select Feature Test</title>
+    <style type="text/css">
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        #map {
+            margin: 1em;
+            width: 512px;
+            height: 512px;
+        }
+    </style>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, selectControl1, selectControl2;
+
+        function init() {
+            map = new OpenLayers.Map('map');
+            var wmsLayer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0",
+                {layers: 'basic'}
+            ); 
+            var vectorLayer = new OpenLayers.Layer.Vector("Vector Layer");
+            var pointFeature = new OpenLayers.Feature.Vector(
+                 new OpenLayers.Geometry.Point(-50, -45)
+            );
+            var polygonFeature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon([
+                    new OpenLayers.Geometry.LinearRing([
+                        new OpenLayers.Geometry.Point(-50,-50),
+                        new OpenLayers.Geometry.Point(-40,-50),
+                        new OpenLayers.Geometry.Point(-40,-40),
+                        new OpenLayers.Geometry.Point(-50,-50)
+                    ])
+                ])
+            );
+            vectorLayer.addFeatures([pointFeature, polygonFeature]);
+            map.addLayers([wmsLayer, vectorLayer]);
+            selectControl1 = new OpenLayers.Control.SelectFeature(
+                vectorLayer, {geometryTypes: ['OpenLayers.Geometry.Point']}
+            );
+            selectControl2 = new OpenLayers.Control.SelectFeature(
+                vectorLayer, {
+                    geometryTypes: ['OpenLayers.Geometry.Polygon'],
+                    hover: true
+            });
+            map.addControl(new OpenLayers.Control.MousePosition());
+            map.addControl(selectControl1);
+            map.addControl(selectControl2);
+            selectControl1.activate();
+            selectControl2.activate();
+            map.setCenter(new OpenLayers.LonLat(-45, -45), 4);
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Select Feature Test</h1>
+    <div id="map"></div>
+    <p>
+    
+    The map includes two select feature controls. The first one operates on
+    geometries of type OpenLayers.Geometry.Point only and works on clicks. The
+    second one operates on geometries of type OpenLayers.Geometry.Polygon and
+    works on mouseover's. If you select the point geometry by clicking on it,
+    it shouldn't be unselected when the mouse moves out if it.
+    
+    </p>
+  </body>
+</html>
diff --git a/tests/manual/tiles-loading.html b/tests/manual/tiles-loading.html
new file mode 100644
index 0000000..cbd0e10
--- /dev/null
+++ b/tests/manual/tiles-loading.html
@@ -0,0 +1,122 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Tiles Loading Acceptance Test</title>
+    <style type="text/css">
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        #map {
+            margin: 1em;
+            float: left;
+            width: 512px;
+            height: 512px;
+        }
+
+    </style>
+
+    <script src='http://maps.google.com/maps?file=api&v=2.82&key=ABQIAAAAjpkAC9ePGem0lIq5XcMiuhR_wWLPFku8Ix9i2SXYRVK3e45q1BQUd_beF8dtzKET_EteAjPdGDwqpQ'></script>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        // make map available for easy debugging
+        var map;
+
+        // increase reload attempts 
+        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
+
+        function init(){
+            var options = {
+                controls: [],
+                projection: "EPSG:900913",
+                units: "m",
+                maxResolution: 156543.0339,
+                maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
+                                                 20037508, 20037508.34)
+            };
+            map = new OpenLayers.Map('map', options);
+            // create Google Mercator layers
+            var gmap = new OpenLayers.Layer.Google(
+                "Google Streets",
+                {'sphericalMercator': true}
+            );
+            // create WMS layer
+            var wmsMaxResolution = 78271.51695;
+            var wms = new OpenLayers.Layer.WMS(
+                "World Map",
+                "http://world.freemap.in/tiles/",
+                {'layers': 'factbook-overlay', 'format':'png'},
+                {
+                    'opacity': 0.4,
+                    'isBaseLayer': false,
+                    'wrapDateLine': true,
+                    'buffer': 0,
+                    'maxResolution' : wmsMaxResolution
+                }
+            );
+            map.addLayers([gmap, wms]);
+            map.addControl(new OpenLayers.Control.Navigation());
+            map.addControl(new OpenLayers.Control.LayerSwitcher());
+            map.addControl(new OpenLayers.Control.PanZoomBar());
+
+            function onLayerChanged() {
+                var html = '<p>WMS Layer state - in range: '
+                    + this.inRange
+                    + ', visibility: '
+                    + this.visibility;
+                    + '</p>';
+                document.getElementById('layerstate').innerHTML = html;
+            }
+            map.events.register('changelayer', wms, onLayerChanged);
+
+            function onTileLoaded() {
+                var html = '<p>Message: ';
+                if (this.numLoadingTiles > 0) {
+                    html += 'Loading tiles...';
+                } else {
+                    html += 'Done loading tiles';
+                }
+                html += '</p>';
+                document.getElementById('tilesloading').innerHTML = html;
+            }
+            wms.events.register('tileloaded', wms, onTileLoaded);
+
+            map.zoomToMaxExtent()
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="map"></div>
+    <p>
+
+      <b>Test 0</b> : at the initial zoom the WMS layer is in range, you should
+      therefore see the 'Loading tiles...' message when loading the page for
+      the first time.
+
+    </p>
+    <p>
+
+      <b>Test 1</b> : If you zoom out by one level (using the zoombar), the WMS
+      layer becomes out of range. No tile should be loaded so you shouldn't see
+      the 'Loading tiles...' message.
+
+    </p>
+    <p>
+
+      <b>Test 2</b> : Zoom in by one level to go back to initial state (the WMS
+      is back). Open the layer switcher and turn off the WMS layer. No tile
+      should be loaded so you shouldn't see the 'Loading tiles...' message.
+
+    </p>
+    <p>
+
+      <b>Test 3</b> : Keep the WMS layer turned off in the layer switcher. Zoom
+      out by one level again. The layer is both invisible and out of range, so
+      you shouldn't see the 'Loading tiles...' message.
+
+    </p>
+    <div id="layerstate"><p>WMS Layer state - in range: true, visibility: true</p></div>
+    <div id="tilesloading"><p>Message:</p></div>
+  </body>
+</html>
diff --git a/tests/manual/tween.html b/tests/manual/tween.html
new file mode 100644
index 0000000..88606cb
--- /dev/null
+++ b/tests/manual/tween.html
@@ -0,0 +1,82 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Tween Example</title>
+    <style type="text/css">
+        #viewport {
+            width: 500px;
+            height: 300px;
+            border: 1px solid black;
+        }
+        #block {
+            width: 10px;
+            height: 10px;
+            background-color: red;
+            position: absolute;
+        }
+    </style>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var tween, events;
+
+        function init(){
+            tween = new OpenLayers.Tween(OpenLayers.Easing.Linear.easeIn);
+            
+            events = new OpenLayers.Events(null, OpenLayers.Util.getElement('viewport'), null, true);
+            events.register("mousedown", null, moveBlock);
+            
+            changeTween();
+        }
+        function moveBlock(e) {
+            var block = OpenLayers.Util.getElement('block');
+            var viewport = OpenLayers.Util.getElement('viewport');
+            var blockPosition = OpenLayers.Util.pagePosition(block);
+            var viewportPosition = OpenLayers.Util.pagePosition(viewport);
+            e.xy = events.getMousePosition(e);
+            var from = {
+                x: blockPosition[0] - viewportPosition[0],
+                y: blockPosition[1] - viewportPosition[1]
+            };
+            var to = {
+                x: e.xy.x,
+                y: e.xy.y
+            }
+            var duration = OpenLayers.Util.getElement('duration').value;
+            var callbacks = {
+                eachStep: function(value) {
+                    block.style.left = (value.x + viewportPosition[0]) + 'px';
+                    block.style.top = (value.y + viewportPosition[1]) + 'px';
+                }
+            }
+            tween.start(from, to, duration, {callbacks: callbacks});
+            
+        }
+        function changeTween() {
+            var transition = OpenLayers.Util.getElement('transition').value;
+            var easing = OpenLayers.Util.getElement('easing').value;
+            tween.stop();
+            tween.easing = OpenLayers.Easing[transition][easing];
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <div id="title">Tween Example</div>
+    <div id="tags"></div>
+    <div id="shortdesc">Show transition effects</div>
+    <select name="transition" id="transition" onchange="changeTween()">
+        <option value="Linear">Linear</option>
+        <option value="Expo">Expo</option>
+        <option value="Quad">Quad</option>
+    </select>
+    <select name="easing" id="easing" onchange="changeTween()">
+        <option value="easeIn">EaseIn</option>
+        <option value="easeOut">EaseOut</option>
+    </select>
+    <input type="text" name="duration" id="duration" value="100"></input>
+    <div id="viewport">
+        <div id="block"></div>
+    </div>
+    <div id="docs">
+        This is an example of transition effects.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tests/manual/ve-opacity.html b/tests/manual/ve-opacity.html
new file mode 100644
index 0000000..22fa43a
--- /dev/null
+++ b/tests/manual/ve-opacity.html
@@ -0,0 +1,61 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <style type="text/css">
+        #map {
+            width: 512px;
+            height: 512px;
+            border: 1px solid gray;
+        }
+    </style>
+
+    <script src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1"></script>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+ 
+        // make map available for easy debugging
+        var map;
+
+        // increase reload attempts 
+        OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
+
+        function init(){
+            var options = {
+                projection: "EPSG:900913",
+                units: "m",
+                maxResolution: 156543.0339,
+                maxExtent: new OpenLayers.Bounds(-20037508, -20037508,
+                                                 20037508, 20037508.34)
+            };
+            map = new OpenLayers.Map('map', options);
+
+            // create Virtual Earth layers
+            var veroad = new OpenLayers.Layer.VirtualEarth(
+                "Virtual Earth Raods",
+                {'type': VEMapStyle.Road, 'sphericalMercator': true}
+            ); 
+
+            // create WMS layer
+            var wms = new OpenLayers.Layer.WMS(
+                "World Map",
+                "http://world.freemap.in/tiles/",
+                {'layers': 'factbook-overlay', 'format':'png'},
+                {
+                    'opacity': 0.4,
+                    'isBaseLayer': false,'wrapDateLine': true
+                }
+            );
+
+            map.addLayers([veroad, wms]);
+            map.zoomToMaxExtent()
+        }
+
+        
+    </script>
+  </head>
+  <body onload="init()">
+    <h3>VE Opacity</h3>
+    <p>The overlay should have an opacity of 40%.</p>  
+    <div id="map"></div>
+  </body>
+</html>
diff --git a/tests/manual/vector-features-performance.html b/tests/manual/vector-features-performance.html
new file mode 100644
index 0000000..62bd197
--- /dev/null
+++ b/tests/manual/vector-features-performance.html
@@ -0,0 +1,142 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Vector Features Performance Test</title>
+    <style type="text/css">
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        #map {
+            width: 512px;
+            height: 512px;
+            border: 1px solid black;
+        }
+    </style>
+
+    <script src="../../lib/Firebug/firebug.js"></script>
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, vectorLayer, drawFeature, features
+        
+        var run = 0;
+        
+        function nextRun() {
+            window.setTimeout(function() {
+                if (run < 5) {
+                    vectorLayer.removeFeatures(features);
+                }
+            }, 900);
+            
+            window.setTimeout(function(){
+                run++;
+                
+                switch(run) {
+                    case 1:
+                        console.log("First run - feature bboxes will be cached");
+                        map.setCenter(new OpenLayers.LonLat(-22.5, -22.5), 3);
+                        vectorTestNew()
+                        break;
+                    case 2:
+                        console.log("Test with all features inside extent");
+                        vectorTestOld();
+                        break;
+                    case 3:
+                        vectorTestNew();
+                        break;
+                    case 4:
+                        console.log("Test with some features outside extent");
+                        map.setCenter(new OpenLayers.LonLat(-22.5, -22.5), 5);
+                        vectorTestOld();
+                        break;
+                    case 5:
+                        vectorTestNew();
+                        break;
+                }
+            }, 1000);
+        }
+        
+        function vectorTestOld(){            
+            vectorLayer.renderer.drawFeature = function(feature, style) {
+                if(style == null) {
+                    style = feature.style;
+                }
+                if (feature.geometry) {
+                    this.drawGeometry(feature.geometry, style, feature.id);
+                }
+            };
+
+            console.time("addFeaturesOld");
+            vectorLayer.addFeatures(features);
+            console.timeEnd("addFeaturesOld");
+        }
+        
+        function vectorTestNew() {
+            vectorLayer.renderer.drawFeature = OpenLayers.Renderer[vectorLayer.renderer.CLASS_NAME.split(".")[2]].prototype.drawFeature;
+            
+            console.time("addFeatures");
+            vectorLayer.addFeatures(features);
+            console.timeEnd("addFeatures");
+        }
+
+        function init(){
+            map = new OpenLayers.Map('map');
+            
+            vectorLayer = new OpenLayers.Layer.Vector("Vector Layer", {isBaseLayer: true});
+
+            map.addLayers([vectorLayer]);
+            map.addControl(new OpenLayers.Control.MousePosition());
+            map.setCenter(new OpenLayers.LonLat(-22.5, -22.5), 3);
+
+            vectorLayer.events.register("featuresadded", this, nextRun);
+            
+            features = new Array(200);
+            var x, y
+            for (var i = 0; i < 200; i++) {
+                x = -Math.random()*45;
+                y = -Math.random()*45;
+                features[i] = new OpenLayers.Feature.Vector(
+                    new OpenLayers.Geometry.LinearRing([
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y),
+                        new OpenLayers.Geometry.Point(
+                            -Math.random()*5+x, -Math.random()*5+y)
+                    ]));
+                    
+            }
+            
+            nextRun();
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">New Rendering - Vector Features Performance Test</h1>
+    <div id="map"></div>
+    <p>
+    This test examines if checking for a feature being inside the visible
+    extent before rendering it has an impact on performance. Open the Firebug
+    console after running this test (hit F12) to see the results.
+    <br/>
+    After the performance test, you can drag around the map to see how the new
+    vector rendering feels where features get rendered only when they are visible
+    inside the map extent. 
+    </p>
+  </body>
+</html>
diff --git a/tests/manual/vector-layer-zindex.html b/tests/manual/vector-layer-zindex.html
new file mode 100644
index 0000000..d33c853
--- /dev/null
+++ b/tests/manual/vector-layer-zindex.html
@@ -0,0 +1,143 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Vector Layer ZIndex Test</title>
+    <style type="text/css">
+        body {
+            font-size: 0.8em;
+        }
+        p {
+            padding-top: 1em;
+        }
+        #map {
+            margin: 1em;
+            width: 512px;
+            height: 512px;
+        }
+    </style>
+
+    <script src="../../lib/OpenLayers.js"></script>
+    <script type="text/javascript">
+        var map, layerA, layerB, layerV, selectControl1, selectControl2;
+
+        function init() {
+            map = new OpenLayers.Map('map');
+            var wmsLayer = new OpenLayers.Layer.WMS(
+                "OpenLayers WMS", 
+                "http://labs.metacarta.com/wms/vmap0",
+                {layers: 'basic'}
+            );
+
+            layerV = new OpenLayers.Layer.Vector('v');
+            var feature = new OpenLayers.Feature.Vector(
+                new OpenLayers.Geometry.Polygon([
+                    new OpenLayers.Geometry.LinearRing([
+                        new OpenLayers.Geometry.Point(-110, 60),
+                        new OpenLayers.Geometry.Point(-110, 30),
+                        new OpenLayers.Geometry.Point(-80, 30),
+                        new OpenLayers.Geometry.Point(-110, 60)
+                    ])
+                ])
+            );
+            layerV.addFeatures([feature]);
+            selectControl1 = new OpenLayers.Control.SelectFeature(layerV);
+            selectControl2 = new OpenLayers.Control.SelectFeature(layerV, {
+                hover: true,
+                selectStyle: OpenLayers.Util.applyDefaults({fillColor: "red"}, OpenLayers.Feature.Vector.style["select"]),
+                onSelect: function(feature) {
+                    selectControl2.unselect(feature);
+                    layerV.drawFeature(feature, selectControl2.selectStyle);
+                }
+            });
+            selectControl2.events.register("beforefeatureselected", null, function(feature) {
+                layerV.drawFeature(feature, selectControl2.selectStyle);
+                return false;
+            })
+
+            layerA = new OpenLayers.Layer('a', {'isBaseLayer': false});
+            layerB = new OpenLayers.Layer.WMS(
+                'b', 'http://www2.dmsolutions.ca/cgi-bin/mswms_gmap', {
+                    'layers': [
+                        'bathymetry', 'land_fn', 'park', 'drain_fn', 'drainage',
+                        'prov_bound', 'fedlimit', 'rail', 'road', 'popplace'
+                    ],
+                    'transparent': 'true',
+                    'format': 'image/png'
+                }, {
+                    'reproject': false
+            });
+
+            map.addLayers([wmsLayer, layerV, layerA, layerB]);
+            map.addControl(selectControl2);
+            map.addControl(selectControl1);
+            map.addControl(new OpenLayers.Control.MousePosition());
+            selectControl2.activate();
+            selectControl1.activate();
+
+            map.setCenter(new OpenLayers.LonLat(-90, 20), 2);
+        }
+
+        function removeLayerA() {
+            if (OpenLayers.Util.indexOf(map.layers, layerA) > -1) {
+                map.removeLayer(layerA);
+            }
+        }
+        
+        function toggleSelectControl1() {
+            if (selectControl1.active) {
+                selectControl1.deactivate();
+                alert("SelectFeature control for clicks deactivated.");
+            } else {
+                selectControl1.activate();
+                alert("SelectFeature control for clicks activated.");
+            }
+        }
+
+        function toggleSelectControl2() {
+            if (selectControl2.active) {
+                selectControl2.deactivate();
+                alert("SelectFeature control for hover deactivated.");
+            } else {
+                selectControl2.activate();
+                alert("SelectFeature control for hover activated.");
+            }
+        }
+    </script>
+  </head>
+  <body onload="init()">
+    <h1 id="title">Vector Layer ZIndex Test</h1>
+    <div id="map"></div>
+    <p>
+
+    The map includes one base layer (vmap0) and three overlays, namely a vector
+    layer, a fake layer with no images, and a dmsolutions layer. The overlays are
+    added to the map in this order: the vector layer, the fake layer, and the
+    dmsolutions layer. The map also includes a select feature control, which
+    when activated bumped the vector layer z-index to some high value. This
+    makes feature selection work, even though other overlays were added after
+    the vector layer.
+       
+    </p>
+    <p>
+
+    If the fake layer is removed from the map (first link below), the vector layer's
+    z-index must not be reset, so the vector layer must not go under the
+    dmsolutions layer and feature selection must continue to function as
+    expected.
+       
+    </p>
+    <p>
+
+    If one of the SelectFeature controls is deactivated or activated (second
+    and third link below), the vector layer should change it's position in the
+    layer stack: on top if at least one of the controls is activated, covered
+    by other layers if both are deactivated.
+
+    </p>
+
+    <p>
+      <a href="javascript:removeLayerA()">Remove the fake layer</a>
+      <br/><a href="javascript:toggleSelectControl1()">Toggle the click SelectFeature control's active status</a>
+      <br/><a href="javascript:toggleSelectControl2()">Toggle the hover SelectFeature control's active status</a>
+    </p>
+  </body>
+</html>
diff --git a/tests/mice.xml b/tests/mice.xml
new file mode 100644
index 0000000..4a001ec
--- /dev/null
+++ b/tests/mice.xml
@@ -0,0 +1,156 @@
+<?xml version='1.0' encoding="ISO-8859-1" ?>
+<wfs:FeatureCollection
+   xmlns:bsc="http://www.bsc-eoc.org/bsc"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-basic.xsd 
+                       http://www.bsc-eoc.org/bsc http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=OWLS&OUTPUTFORMAT=XMLSCHEMA">
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-89.817223,45.005555 -74.755001,51.701388</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember><bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.771668,45.891110 -79.771668,45.891110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.771668,45.891110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.755834,46.365277 -83.755834,46.365277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:owlname>owl</bsc:owlname>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.755834,46.365277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.808612,46.175277 -83.808612,46.175277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.808612,46.175277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-84.111112,46.309166 -84.111112,46.309166</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-84.111112,46.309166</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.678612,46.821110 -83.678612,46.821110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.678612,46.821110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.664445,46.518888 -83.664445,46.518888</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.664445,46.518888</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-80.613334,46.730277 -80.613334,46.730277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-80.613334,46.730277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.676946,45.428054 -79.676946,45.428054</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.676946,45.428054</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.853056,46.236944 -83.853056,46.236944</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.853056,46.236944</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-82.289167,45.896388 -82.289167,45.896388</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-82.289167,45.896388</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+</wfs:FeatureCollection>
+
diff --git a/tests/owls.xml b/tests/owls.xml
new file mode 100644
index 0000000..4a001ec
--- /dev/null
+++ b/tests/owls.xml
@@ -0,0 +1,156 @@
+<?xml version='1.0' encoding="ISO-8859-1" ?>
+<wfs:FeatureCollection
+   xmlns:bsc="http://www.bsc-eoc.org/bsc"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-basic.xsd 
+                       http://www.bsc-eoc.org/bsc http://www.bsc-eoc.org/cgi-bin/bsc_ows.asp?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFeatureType&TYPENAME=OWLS&OUTPUTFORMAT=XMLSCHEMA">
+      <gml:boundedBy>
+      	<gml:Box srsName="EPSG:4326">
+      		<gml:coordinates>-89.817223,45.005555 -74.755001,51.701388</gml:coordinates>
+      	</gml:Box>
+      </gml:boundedBy>
+    <gml:featureMember><bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.771668,45.891110 -79.771668,45.891110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.771668,45.891110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.755834,46.365277 -83.755834,46.365277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:owlname>owl</bsc:owlname>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.755834,46.365277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.808612,46.175277 -83.808612,46.175277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.808612,46.175277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-84.111112,46.309166 -84.111112,46.309166</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-84.111112,46.309166</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.678612,46.821110 -83.678612,46.821110</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.678612,46.821110</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.664445,46.518888 -83.664445,46.518888</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.664445,46.518888</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-80.613334,46.730277 -80.613334,46.730277</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-80.613334,46.730277</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-79.676946,45.428054 -79.676946,45.428054</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-79.676946,45.428054</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-83.853056,46.236944 -83.853056,46.236944</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-83.853056,46.236944</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <bsc:OWLS>
+        <gml:boundedBy>
+        	<gml:Box srsName="EPSG:4326">
+        		<gml:coordinates>-82.289167,45.896388 -82.289167,45.896388</gml:coordinates>
+        	</gml:Box>
+        </gml:boundedBy>
+        <bsc:msGeometry>
+        <gml:Point srsName="EPSG:4326">
+          <gml:coordinates>-82.289167,45.896388</gml:coordinates>
+        </gml:Point>
+        </bsc:msGeometry>
+      </bsc:OWLS>
+    </gml:featureMember>
+</wfs:FeatureCollection>
+
diff --git a/tests/run-tests.html b/tests/run-tests.html
new file mode 100644
index 0000000..17040e6
--- /dev/null
+++ b/tests/run-tests.html
@@ -0,0 +1,2413 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html><head><title> Run the testsuite</title>
+<noscript>Javascript is disabled in your browser. This page cannot be displayed correctly without Javascript. Sorry. <br/> If you want to view this page, please change your browser settings so that Javascript is enabled.</noscript>
+<!--
+Test.AnotherWay version 0.5
+
+Copyright (c) 2005 Artem Khodush, http://straytree.org
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+-->
+<style type="text/css">
+* { padding: 0; margin: 0; }
+html { height: 99%; }
+body { height: 98%; font: normal normal 10pt sans-serif }
+#col1 {  float: left; width: 27em; margin: 0 0 0 1em; overflow: visible; }
+#col2 {  position: relative; height: 98%; margin: 0 0.5em 0 28em; }
+#col1_header { margin-top: 0.5em; }
+#scroller { height: 400px; overflow: auto;}
+#testtable { margin: 0 0 2em 0; width: 97%; }
+#run_buttons { margin-bottom: 4em; }
+
+#right_header { padding-top: 0.8em; }
+#results_count { float: left; }
+.active_tab 			{ float: right; padding: 0 1em 0.2em 1em; background: #0af; border: 1px solid #048; border-bottom: none; cursor: pointer; cursor: hand;
+					 position: relative; top: -0.2em; }
+.inactive_tab 			{ float: right; padding: 0 1em 0 1em; background: #9bb; color: #444; border: 1px solid #9bb; border-bottom: none; cursor: pointer; cursor: hand; }
+.inactive_mouseover_tab 	{ float: right; padding: 0 1em 0 1em; background: #9bb; color: #062; border: 1px solid #062; border-bottom: none; cursor: pointer; cursor: hand; }
+
+#right_frame { overflow: auto; position: relative; top: -0.2em; clear: right; height: 95%; border: 1px solid #048; }
+
+#debug { display: none; }
+#debug p { margin: 2px 0 0 5em; text-indent: -4.8em; }
+
+#error { display: none; color: #c22; }
+
+#results p { margin: 0 0 2px 0; }
+/* cursor indicating that detailed results may be expanded/contracted */
+#results p.badtest { cursor: text; }
+#results p.ok, #results p.fail { cursor: pointer; cursor: hand; }
+
+/* colored squares in the results window at the left of test page names */
+#results p.ok .bullet { background: #6d6; }
+#results p.fail .bullet { background:  #d46; }
+#results p.badtest .bullet { background: #ea3; }
+#results p.loading .bullet { background: #48f; }
+#results p.running .bullet { background: #26e; }
+#results p.waiting .bullet { background: #04d; }
+/* highlight in the results line */
+#results p .warning { background: #ffc; }
+
+/* layout of the detailed results */
+.result_detail { padding-left: 3em; }
+.result_exception_detail { padding-left: 4em; }
+.result_exception_stack_detail { padding-left: 5em;  }
+.result_micro_detail { padding-left: 6em; }
+/* colouring in the detailed results */
+.result_detail .fail, .result_exception_detail .fail,  .result_micro_detail .fail { background: #ffd8d8; }
+
+/* "start recording" controls*/
+#record_div { margin-top: 3em; }
+#record_div p { margin-bottom: 0.5em; }
+#record_select { width: 88%; }
+#record_input { width: 53%; }
+</style>
+<script type="text/javascript">
+<!--
+if( typeof( Test )=="undefined" ) {
+	Test={};
+}
+Test.AnotherWay={};
+
+Test.AnotherWay._g_test_iframe=null; // frame where to load test pages
+Test.AnotherWay._g_test_frame_no_clear=false; // true - leave last page displayed after tests end
+Test.AnotherWay._g_test_page_urls=[]; // array of: { url: url, convention: "anotherway" or "jsan" }
+Test.AnotherWay._g_test_object_for_jsan=null; // test object for filling by tests that adhere to jsan Test.Simple calling convention
+Test.AnotherWay._g_pages_to_run=null; // list of pages to run automatically after loading
+Test.AnotherWay._g_run_on_main_load=false; // special handling for run_pages_to_run when it might be called before onload or before list of test pages is known.
+Test.AnotherWay._g_run_on_list_load=false;
+Test.AnotherWay._g_main_loaded=false;
+
+Test.AnotherWay._run_pages_to_run=function( called_from_outside )
+{
+	if( !Test.AnotherWay._g_main_loaded ) {
+		Test.AnotherWay._g_run_on_main_load=true;
+	}else {
+		var a_pages=Test.AnotherWay._g_pages_to_run;
+		if( a_pages=="all" ) {
+			for( var i=0; i<Test.AnotherWay._g_test_page_urls.length; ++i ) {
+				Test.AnotherWay._run_test_page( "test"+i );
+			}
+		}else if( a_pages!=null ) {
+			for( var run_i=0; run_i<a_pages.length; ++run_i ) {
+				var run_page=a_pages[run_i];
+				var found=false;
+				for( var all_i=0; all_i<Test.AnotherWay._g_test_page_urls.length; ++all_i ) {
+					if( run_page==Test.AnotherWay._g_test_page_urls[all_i].url ) {
+						Test.AnotherWay._run_test_page( "test"+all_i, called_from_outside );
+						found=true;
+						break;
+					}
+				}
+				if( !found ) {
+					Test.AnotherWay._show_error( "page specified to run is not found in the page list: "+run_page );
+					break;
+				}
+			}
+		}
+	}
+}
+
+Test.AnotherWay._add_test_page_url=function( test_url, convention )
+{
+	var table=document.getElementById( "testtable" );
+	var record_select=document.getElementById( "record_select" );
+	var index=Test.AnotherWay._g_test_page_urls.length;
+
+	// trim spaces.
+	if( test_url.match( "^(\\s*)(.*\\S)(\\s*)$" ) ) {
+		test_url=RegExp.$2;
+	}
+
+	Test.AnotherWay._g_test_page_urls[index]={ url: test_url, convention: convention };
+	var row=table.insertRow( -1 );
+
+	var cell;
+	var cell_child;
+	cell=row.insertCell( -1 );
+	cell_child=document.createElement( "input" );
+	cell_child.type="checkbox";
+	cell_child.id="checkbox"+index;
+    cell_child.checked='checked';
+    cell_child.defaultChecked='checked';
+	cell.appendChild( cell_child );
+
+	cell=row.insertCell( -1 );
+	cell.setAttribute( "width", "75%" );
+	cell.appendChild( document.createTextNode( test_url ) );
+
+	cell=row.insertCell( -1 );
+	cell_child=document.createElement( "input" );
+	cell_child.type="button";
+	cell_child.id="test"+index;
+	cell_child.value=" run ";
+	cell_child.onclick=Test.AnotherWay._run_one_onclick;
+	cell.appendChild( cell_child );
+
+	cell=row.insertCell( -1 );
+	cell.setAttribute( "width", "8em" );
+	cell_child=document.createElement( "span" );
+	cell.appendChild( cell_child );
+
+	var option=document.createElement( "option" );
+	option.appendChild( document.createTextNode( test_url ) );
+	record_select.appendChild( option );
+}
+Test.AnotherWay._show_error=function( msg )
+{
+	var error_div=document.getElementById( "error" );
+	error_div.innerHTML="";
+	error_div.appendChild( document.createTextNode( msg ) );
+	error_div.style.display="block";
+}
+
+// read urls from the list in the html file inside the list_iframe
+// fill on-screen list with urls and "run" buttons, and fill the g_test_page_urls object.
+Test.AnotherWay._list_iframe_onload=function()
+{
+	if( window.frames.list_iframe!=null && window.frames.list_iframe.location!="" && window.frames.list_iframe.location!="about:blank" ) {
+		var list_doc=window.frames.list_iframe.document;
+		var list=list_doc.getElementById( "testlist" );
+		if( list!=null ) {
+			for( var i=0; i<list.childNodes.length; ++i ) {
+				var item=list.childNodes[i];
+				if( item.nodeName=="LI" || item.nodeName=="li" ) {
+					var convention="anotherway";
+					if( Test.AnotherWay._get_css_class( item )=="jsan" ) {
+						convention="jsan";
+					}
+					Test.AnotherWay._add_test_page_url( item.innerHTML, convention );
+				}
+			}
+			if( Test.AnotherWay._g_run_on_list_load ) {
+				Test.AnotherWay._g_run_on_list_load=false;
+				Test.AnotherWay._run_pages_to_run();
+			}
+		}else {
+			Test.AnotherWay._show_error( "no list with id 'testlist' in a list file "+window.frames.list_iframe.location );
+		}
+	}
+}
+
+Test.AnotherWay._map_checkboxes=function( f )
+{
+	var table=document.getElementById( "testtable" );
+	var checks=table.getElementsByTagName( "INPUT" );
+	for( var i=0; i<checks.length; ++i ) {
+		if( checks[i].type=="checkbox" && checks[i].id.match( /^checkbox(\d+)$/ ) ) {
+			f( checks[i], RegExp.$1 );
+		}
+	}
+}
+Test.AnotherWay._run_all_onclick=function()
+{
+	Test.AnotherWay._map_checkboxes( function( c, id ) { Test.AnotherWay._run_test_page( "test"+id ); } );
+}
+Test.AnotherWay._run_selected_onclick=function()
+{
+	Test.AnotherWay._map_checkboxes( function( c, id ) { if( c.checked ) Test.AnotherWay._run_test_page( "test"+id ); } );
+}
+Test.AnotherWay._unselect_all_onclick=function()
+{
+	Test.AnotherWay._map_checkboxes( function( c, id ) { c.checked=false; } );
+}
+Test.AnotherWay._run_one_onclick=function()
+{
+	Test.AnotherWay._run_test_page( this.id );
+}
+
+// construct an object that will gather results of running one test function
+Test.AnotherWay._test_object_t=function( fun_name )
+{
+	this.name=fun_name; // name of the test function
+	this.n_plan=null; // planned number of assertions
+	this.n_ok=0; // # of ok assertions
+	this.n_fail=0; // # of failed assertions
+	this.exception=""; // if the function throwed an exception, it's its message
+	this.exception_stack=[]; // strings: function call stack from the exception
+	this.assertions=[]; // assertion results: array of { ok: 1 or 0, name: string }
+	this.wait_result_milliseconds=0; // how long to wait before collecting results from the test
+	this.second_wait_msg=null; // <p> status message (in addition to the page wait_msg)
+	this.delay_actions=[]; // array of actions to be perfomed after the test function returns
+				//	action : { acton_kind: "call" | "window" | "replay"
+				//				when "call": 		{ call_fn call_delay_milliseconds } call_fn takes nothing
+				//				when "window" : 	{ wnd_url wnd_wnd wnd_fn wnd_timeout_milliseconds wnd_dont_close } wnd_fn takes wnd
+				//				wnen "replay" : 	{ replay_wnd replay_events replay_event_i replay_checkpoints } checkpoint_fn takes this, wnd
+				//	}
+	this.delay_action_i=null; // index of delay action currently being performed
+	this.delay_prev_timer_time=0;	// for counting time while performing delay_actions
+	this.delay_current_milliseconds_left=0; // time left before the next action, runs down
+	this.delay_total_milliseconds_left=0; 	// for indication: total estimated time for all actions, runs up and down
+}
+
+Test.AnotherWay._test_object_t.prototype.ok=function( cond, name )
+{
+	if( cond ) {
+		++this.n_ok;
+		cond=1;
+	}else {
+		++this.n_fail;
+		cond=0;
+	}
+	this.assertions.push( { ok: cond, name: name } );
+}
+Test.AnotherWay._test_object_t.prototype.fail=function( name )
+{
+	this.ok( false, name );
+}
+Test.AnotherWay._test_object_t.prototype.plan=function( n )
+{
+	this.n_plan=n;
+}
+Test.AnotherWay._test_object_t.prototype.wait_result=function( seconds )
+{
+	this.wait_result_milliseconds=1000*seconds;
+}
+Test.AnotherWay._eq_fail_msg=function( path, what, expected, got )
+{
+	return "eq: "+path+" "+what+" differ: got "+got+", but expected "+expected;
+}
+Test.AnotherWay._array_eq=function( expected, got, path, msg )
+{
+	if( expected.length!=got.length ) {
+		msg.msg=Test.AnotherWay._eq_fail_msg( path, "array length", expected.length, got.length );
+		return false;
+	}
+	for( var i=0; i<expected.length; ++i ) {
+		if( !Test.AnotherWay._thing_eq( expected[i], got[i], path+"["+i+"]", msg ) ) {
+			return false;
+		}
+	}
+	return true;
+}
+Test.AnotherWay._object_eq=function( expected, got, path, msg )
+{
+	var v;
+	for( v in expected ) {
+		if( ! (v in got) ) {
+			msg.msg=Test.AnotherWay._eq_fail_msg( path+"."+v, "properties", expected[v], "undefined" );
+			return false;
+		}
+		if( !Test.AnotherWay._thing_eq( expected[v], got[v], path+"."+v, msg ) ) {
+			return false;
+		}
+	}
+	for( v in got ) {
+		if( ! (v in expected) ) {
+			msg.msg=Test.AnotherWay._eq_fail_msg( path+"."+v, "properties", "undefined", got[v] );
+			return false;
+		}
+	}
+	return true;
+}
+Test.AnotherWay._constructor_name=function( x )
+{
+	if( x==null ) {
+		return "";
+	}
+	var s="unknown";
+	try {
+		s=typeof( x.constructor );
+		if( s!="unknown" ) {
+			s=x.constructor.toString();
+		}
+	}catch( e ) {
+		s="unknown";
+	}
+	if( s=="unknown" ) {
+		// hackish attempt to guess a type
+		var is_array=true;
+		var index=0;
+		for( i in x ) {
+			if( i!=index ) {
+				is_array=false;
+			}
+			++index;
+		}
+		return is_array ? "Array" : "Object"; // for empty arrays/objects, this will be wrong half the time
+	}else if( s.match( /^\s*function\s+(\w+)\s*\(/ ) ) {
+		return RegExp.$1;
+	}else {
+	  var c = '';
+	  switch(typeof x) {
+	    case 'string':
+	      c = 'String';
+	      break;
+	    case 'object':
+	      c = 'Object';
+	      break;
+	    default:
+	      c = '';
+	  }
+		return c;
+	}
+}
+Test.AnotherWay._is_array=function( x )
+{
+	return Test.AnotherWay._constructor_name( x )=="Array";
+}
+Test.AnotherWay._is_value_type=function( x )
+{
+	cn=Test.AnotherWay._constructor_name( x );
+	return cn=="Number" || cn=="String" || cn=="Boolean" || cn=="Date";
+}
+Test.AnotherWay._thing_eq=function( expected, got, path, msg )
+{
+	if( expected==null && got==null ) {
+		return true;
+	}else if( (expected==null && got!=null) || (expected!=null && got==null) ) {
+		msg.msg=Test.AnotherWay._eq_fail_msg( path, "values", expected, got );
+		return false;
+	}else {
+		var expected_cn=Test.AnotherWay._constructor_name( expected );
+		var got_cn=Test.AnotherWay._constructor_name( got );
+		if( expected_cn!=got_cn ) {
+			msg.msg=Test.AnotherWay._eq_fail_msg( path, "types", expected_cn, got_cn );
+			return false;
+		}else {
+			if( Test.AnotherWay._is_array( expected ) ) {
+				return Test.AnotherWay._array_eq( expected, got, path, msg );
+			}else if( Test.AnotherWay._is_value_type( expected ) ) {
+				if( expected!=got ) {
+					msg.msg=Test.AnotherWay._eq_fail_msg( path, "values", expected, got );
+					return false;
+				}else {
+					return true;
+				}
+			}else { // just a plain object
+				return Test.AnotherWay._object_eq( expected, got, path, msg );
+			}
+		}
+	}
+}
+Test.AnotherWay._test_object_t.prototype.eq=function( got, expected, name )
+{
+	var msg={};
+	if( Test.AnotherWay._thing_eq( expected, got, "", msg ) ) {
+		this.ok( 1, name );
+	}else {
+		this.fail( name+". "+msg.msg );
+	}
+}
+Test.AnotherWay._test_object_t.prototype.like=function( got, expected, name )
+{
+	if( got.match( expected )!=null ) {
+		this.ok( 1, name );
+	}else {
+		this.fail( name+": got "+got+", but expected it to match: "+expected );
+	}
+}
+Test.AnotherWay._g_html_eq_span=null;
+Test.AnotherWay._html_eq_string_to_node=function( string_or_node, what, msg )
+{
+	if( string_or_node.nodeType!=null ) {
+		string_or_node=Test.AnotherWay._html_eq_node_to_string( string_or_node ); // double trip - to make properties assigned in scripts available as html node attributes
+	}
+	if( Test.AnotherWay._g_html_eq_span==null ) {
+		Test.AnotherWay._g_html_eq_span=document.createElement( "span" );
+	}
+	Test.AnotherWay._g_html_eq_span.innerHTML=string_or_node;
+	if( Test.AnotherWay._g_html_eq_span.childNodes.length!=1 ) {
+		msg.msg="bad "+what+" html string given (should contain exactly one outermost element): "+string_or_node;
+	}
+	return Test.AnotherWay._g_html_eq_span.childNodes[0].cloneNode( true );
+}
+Test.AnotherWay._html_eq_node_to_string=function( node ) {
+	if( Test.AnotherWay._g_html_eq_span==null ) {
+		Test.AnotherWay._g_html_eq_span=document.createElement( "span" );
+	}
+	Test.AnotherWay._g_html_eq_span.innerHTML="";
+	if( node.outerHTML!=null ) {
+		Test.AnotherWay._g_html_eq_span.innerHTML=node.outerHTML;
+	}else {
+            var clone = node.cloneNode(true);
+            var node = Test.AnotherWay._g_html_eq_span;
+            if(node.ownerDocument && node.ownerDocument.importNode) {
+                if(node.ownerDocument != clone.ownerDocument) {
+                    clone = node.ownerDocument.importNode(clone, true);
+                }
+            }
+            node.appendChild(clone);
+	}
+	return Test.AnotherWay._g_html_eq_span.innerHTML;
+}
+Test.AnotherWay._html_eq_path_msg=function( path )
+{
+	var msg="";
+	for( var i=0; i<path.length; ++i ) {
+		msg+=" [node "+path[i].node;
+		if( path[i].id!=null && path[i].id!="" ) {
+			msg+=" id "+path[i].id;
+		}else if( path[i].index!=null ) {
+			msg+=" at index "+path[i].index;
+		}
+		msg+="] "
+	}
+	return msg;
+}
+Test.AnotherWay._html_eq_fail_msg=function( path, what, expected, got )
+{
+	return Test.AnotherWay._html_eq_path_msg( path )+": "+what+" differ: got "+got+", but expected "+expected;
+}
+Test.AnotherWay._html_eq_remove_blank=function( text )
+{
+	if( text==null ) {
+		return "";
+	}else if( text.match( "^(\\s*)(.*\\S)(\\s*)$" ) ) {
+		return RegExp.$2;
+	}else if( text.match( "\s*" ) ) {
+		return "";
+	}
+	return text;
+}
+Test.AnotherWay._html_eq_remove_blank_nodes=function( node )
+{
+	var to_remove=[];
+	for( var child=node.firstChild; child!=null; child=child.nextSibling ) {
+		if( child.nodeType==3 ) {
+			var value=Test.AnotherWay._html_eq_remove_blank( child.nodeValue );
+			if( value=="" ) {
+				to_remove.push( child );
+			}else {
+				child.nodeValue=value;
+			}
+		}
+	}
+	for( var i=0; i<to_remove.length; ++i ) {
+		node.removeChild( to_remove[i] );
+	}
+}
+Test.AnotherWay._html_node_type_text=function( node_type )
+{
+	if( node_type==1 ) {
+		return "1 (html element)";
+	}else if( node_type==3 ) {
+		return "3 (text)";
+	}else {
+		return node_type;
+	}
+}
+Test.AnotherWay._html_eq_node=function( expected, got, path, msg, expected_loc_base, got_loc_base )
+{
+	if( expected.nodeType!=got.nodeType ) {
+		msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "node types", Test.AnotherWay._html_node_type_text( expected.nodeType ), Test.AnotherWay._html_node_type_text( got.nodeType ) );
+		return false;
+	}else if( expected.nodeType==3 ) {
+		if( expected.nodeValue!=got.nodeValue ) {
+			msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "text", expected.nodeValue, got.nodeValue );
+			return false;
+		}
+	}else if( expected.nodeType==1 ) {
+		if( expected.nodeName!=got.nodeName ) {
+			msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "node names", expected.nodeName, got.nodeName );
+			return false;
+		}
+		// compare attributes
+		var expected_attrs={};
+		var got_attrs={};
+		var i;
+		var a;
+		for( i=0; i<expected.attributes.length; ++i ) {
+			a=expected.attributes[i];
+			if( a.specified ) {
+				expected_attrs[a.name]=1;
+			}
+		}
+		for( i=0; i<got.attributes.length; ++i ) {
+			a=got.attributes[i];
+			if( a.specified ) {
+				got_attrs[a.name]=1;
+			}
+		}
+		for( a in expected_attrs ) {
+			if( ! (a in got_attrs) ) {
+				msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute sets differ: expected attribute "+a+" is missing";
+				return false;
+			}
+		}
+		for( a in got_attrs ) {
+			if( ! (a in expected_attrs) ) {
+				msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute sets differ: got extra attribute "+a;
+				return false;
+			}
+		}
+		for( a in expected_attrs ) {
+			var expected_value=expected.getAttribute( a );
+			var got_value=got.getAttribute( a );
+			if( typeof( expected_value )=="string" && typeof( got_value )=="string" ) {
+				expected_value=Test.AnotherWay._html_eq_remove_blank( expected_value );
+				got_value=Test.AnotherWay._html_eq_remove_blank( got_value );
+				var ok=expected_value==got_value;
+				if( !ok && (a=="href" || a=="HREF" )  ) { // try relative hrefs
+					var expected_relative_value=expected_value;
+					if( expected_loc_base!=null && expected_value.substring( 0, expected_loc_base.length )==expected_loc_base ) {
+						expected_relative_value=expected_value.substring( expected_loc_base.length );
+					}
+					var got_relative_value=got_value;
+					if( got_loc_base!=null && got_value.substring( 0, got_loc_base.length )==got_loc_base ) {
+						got_relative_value=got_value.substring( got_loc_base.length );
+					}
+					ok=expected_relative_value==got_relative_value;
+				}
+				if( !ok ) {
+					msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "attribute "+a+" values", expected_value, got_value );
+					return false;
+				}
+			}else if( typeof( expected_value )=="function" && typeof( got_value )=="function" ) {
+				expected_value=expected_value.toString();
+				got_value=got_value.toString();
+				if( expected_value!=got_value ) {
+					msg.msg=Test.AnotherWay._html_eq_fail_msg( path, "attribute "+a+" values", expected_value, got_value );
+					return false;
+				}
+			}else {
+				var value_msg={};
+				if( !Test.AnotherWay._thing_eq( expected_value, got_value, "", value_msg ) ) {
+					msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": attribute "+a+" values differ: "+value_msg.msg;
+					return false;
+				}
+			}
+		}
+		// compare child nodes
+		Test.AnotherWay._html_eq_remove_blank_nodes( expected );
+		Test.AnotherWay._html_eq_remove_blank_nodes( got );
+		var expected_length=expected.childNodes.length;
+		var got_length=got.childNodes.length;
+		if( expected_length<got_length ) {
+			msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": got "+(got_length-expected_length)+" extra child nodes";
+			return false;
+		}else if( expected_length>got_length ) {
+			msg.msg=Test.AnotherWay._html_eq_path_msg( path )+": expected "+(expected_length-got_length)+" more child nodes";
+			return false;
+		}else {
+			for( i=0; i<expected_length; ++i ) {
+				var expected_node=expected.childNodes[i];
+				path.push( { node: expected_node.nodeName, id: expected_node.id, index: i } );
+				var eq=Test.AnotherWay._html_eq_node( expected_node, got.childNodes[i], path, msg, expected_loc_base, got_loc_base );
+				path.pop();
+				if( !eq ) {
+					return false;
+				}
+			}
+		}
+	}
+	return true;
+}
+Test.AnotherWay._html_eq_get_loc_base=function( node )
+{
+	var loc_base=document.location;
+	if( node.ownerDocument!=null ) {
+		loc_base=node.ownerDocument.location;
+	}
+	if( loc_base!=null ) {
+		loc_base=loc_base.href;
+		var slash_pos=loc_base.lastIndexOf( "/" );
+		if( slash_pos!=-1 ) {
+			loc_base=loc_base.substring( 0, slash_pos+1 );
+		}
+	}
+	return loc_base;
+}
+Test.AnotherWay._test_object_t.prototype.html_eq=function( got, expected, name )
+{
+	var msg={};
+	var expected_node=Test.AnotherWay._html_eq_string_to_node( expected, "expected", msg );
+	if( msg.msg!=null ) {
+		this.fail( name+" html_eq: "+msg.msg );
+	}else {
+		var got_node=Test.AnotherWay._html_eq_string_to_node( got, "got", msg );
+		if( msg.msg!=null ) {
+			this.fail( name+" html_eq: "+msg.msg );
+		}else {
+			var expected_loc_base=Test.AnotherWay._html_eq_get_loc_base( expected );
+			var got_loc_base=Test.AnotherWay._html_eq_get_loc_base( got );
+			if( Test.AnotherWay._html_eq_node( expected_node, got_node, [], msg, expected_loc_base, got_loc_base ) ) {
+				this.ok( 1, name );
+			}else {
+				var msg=name+" html_eq "+msg.msg;
+				var expected_str=Test.AnotherWay._html_eq_node_to_string( expected_node );
+				var got_str=Test.AnotherWay._html_eq_node_to_string( got_node );
+				msg+=".\n got html: "+got_str;
+				msg+=".\n expected html: "+expected_str;
+				this.fail( msg );
+			}
+		}
+	}
+}
+Test.AnotherWay._debug_pane_print=function( msg )
+{
+	var d=new Date();
+	var p=document.createElement( "p" );
+	p.appendChild( document.createTextNode( d.toLocaleTimeString()+" "+msg ) );
+	var debug_pane=document.getElementById( "debug" );
+	debug_pane.appendChild( p );
+	var debug_tab=document.getElementById( "debug_tab" );
+	var results_tab=document.getElementById( "results_tab" );
+	debug_tab.style.visibility="visible";
+	results_tab.style.visibility="visible";
+}
+Test.AnotherWay._test_object_t.prototype.debug_print=function( msg )
+{
+	Test.AnotherWay._debug_pane_print( this.name+": "+msg );
+}
+Test.AnotherWay._test_object_t.prototype.delay_call=function()
+{
+	var timeout_ms=200;
+	for( var i=0; i<arguments.length; ++i ) {
+		if( typeof( arguments[i] )!="function" ) {
+			timeout_ms=1000*arguments[i];
+		}else {
+			var action={ action_kind: "call", call_delay_milliseconds: timeout_ms, call_fn: arguments[i] };
+			this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
+			this.delay_actions.push( action );
+		}
+	}
+}
+Test.AnotherWay._test_object_t.prototype.open_window=function( url, fn, timeout_seconds )
+{
+	if( timeout_seconds==null ) {
+		timeout_seconds=4;
+	}
+	var no_close=document.getElementById( "dont_close_test_windows" );
+	var action={ action_kind: "window", wnd_url: url.toString(), wnd_wnd: null, wnd_fn: fn, wnd_timeout_milliseconds: timeout_seconds*1000, wnd_no_close: no_close.checked };
+	this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
+	this.delay_actions.push( action );
+}
+Test.AnotherWay._test_object_t.prototype.replay_events=function( wnd, events )
+{
+	if( Test.AnotherWay._g_no_record_msg!=null ) {
+		this.fail( "replay_events: "+Test.AnotherWay._g_no_record_msg );
+	}else {
+		var action={ action_kind: "replay", replay_wnd: wnd, replay_events: events.events, replay_event_i: null, replay_checkpoints: events.checkpoints };
+		this.delay_total_milliseconds_left+=Test.AnotherWay._action_estimate_milliseconds( action );
+		this.delay_actions.push( action );
+	}
+}
+Test.AnotherWay._action_estimate_milliseconds=function( action )
+{
+	var ms=0;
+	if( action.action_kind=="call" ) {
+		ms=action.call_delay_milliseconds;
+	}else if( action.action_kind=="window" ) {
+		ms=0;
+	}else if( action.action_kind=="replay" ) {
+		ms=0;
+		for( var i=0; i<action.replay_events.length; ++i ) {
+			ms+=action.replay_events[i]["time"]-0;
+		}
+	}
+	return ms;
+}
+
+Test.AnotherWay._g_timeout_granularity=200;
+Test.AnotherWay._g_tests_queue=[]; // vector of { url: string, test_objects : array of test_object_t, test_object_i: int, wait_msg: <p> object, loading_timeout_milliseconds: int, timeout_id: id }
+
+// load one html page, schedule further processing
+Test.AnotherWay._run_test_page=function( id, called_from_outside )
+{
+	if( id.match( /^test(\d+)/ ) ) {
+		id=RegExp.$1;
+		Test.AnotherWay._g_tests_queue.push( {
+			url: Test.AnotherWay._g_test_page_urls[id].url,
+			convention: Test.AnotherWay._g_test_page_urls[id].convention,
+			test_objects: []
+			} );
+		if( Test.AnotherWay._g_tests_queue.length==1 ) {
+			if( !called_from_outside ) {
+				// Crap. Be careful stepping around.
+				// For Mozilla and Opera, when this file is included into the frameset page that is in another directory (and _g_outside_path_correction!=null)
+				// but the test pages are started from within it (by "run" buttons), then:
+				// depending on whether the page is the first one loaded into the test frame or not,
+				// the base url for relative test pages differs.
+				// Crap, like I said.
+				Test.AnotherWay._g_tests_queue[0].suppress_outside_path_correction=true;
+			}
+			Test.AnotherWay._start_loading_page();
+		}
+	}
+}
+Test.AnotherWay._load_next_page=function()
+{
+	Test.AnotherWay._g_tests_queue.splice( 0, 1 );
+	if( Test.AnotherWay._g_tests_queue.length>0 ) {
+		Test.AnotherWay._start_loading_page();
+	}else {
+		if( !Test.AnotherWay._g_test_frame_no_clear ) {
+			Test.AnotherWay._g_test_iframe.location.replace( "about:blank" );
+		}
+	}
+}
+Test.AnotherWay._g_opera_path_correction=null; // ugly wart to support opera
+Test.AnotherWay._g_outside_path_correction=null; // ugly wart to accomodate Opera and Mozilla, where relative url relates to the directory where the page that calls this function is located
+Test.AnotherWay._set_iframe_location=function( iframe, loc, outside_path_correction )
+{
+	// allow to load only locations with the same origin
+	var proto_end=loc.indexOf( "://" );
+	if( proto_end!=-1 ) { // otherwise, it's safe to assume (for Opera, Mozilla and IE ) that loc will be treated as relative
+		var main_loc=window.location.href;
+		var host_end=loc.substring( proto_end+3 ).indexOf( "/" );
+		var ok=false;
+		if( host_end!=-1 ) {
+			var loc_origin=loc.substring( 0, proto_end+3+host_end+1 );
+			if( main_loc.length>=loc_origin.length && main_loc.substring( 0, loc_origin.length )==loc_origin ) {
+				ok=true;
+			}
+		}
+		if( !ok ) {
+			return { msg: "test pages may have only urls with the same origin as "+main_loc };
+		}
+	}
+	// opera cannot handle urls relative to file:// without assistance
+	if( window.opera!=null && window.location.protocol=="file:" && loc.indexOf( ":" )==-1 ) {
+		var base=window.location.href;
+		var q_pos=base.indexOf( "?" );
+		if( q_pos!=-1 ) {
+			base=base.substring( 0, q_pos );
+		}
+		var slash_pos=base.lastIndexOf( "/" );
+		if( slash_pos!=-1 ) {
+			base=base.substring( 0, slash_pos+1 );
+			Test.AnotherWay._g_opera_path_correction=base;
+			loc=base+loc;
+		}
+	}
+	// if this function is called from another page, and if that page is in another directory, correction is needed
+	if( outside_path_correction!=null ) {
+		var pos=loc.indexOf( outside_path_correction );
+		if( pos==0 ) {
+			loc=loc.substring( outside_path_correction.length+1 );
+		}
+	}
+	if( iframe.location!=null ) {
+		iframe.location.replace( loc );
+	}else {
+		iframe.src=loc;
+	}
+	return {};
+}
+Test.AnotherWay._start_loading_page=function()
+{
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	test_page.loading_timeout_milliseconds=12000;
+	test_page.timeout_id=setTimeout( Test.AnotherWay._loading_timeout, Test.AnotherWay._g_timeout_granularity );
+	test_page.wait_msg=Test.AnotherWay._print_counter_result( test_page.url, "loading...", test_page.loading_timeout_milliseconds, "loading" );
+	if( test_page.convention=="jsan" ) {
+		// the tests in that page will run when it's loading, so the test object must be ready
+		Test.AnotherWay._g_test_object_for_jsan=new Test.AnotherWay._test_object_t( test_page.url );
+	}
+	var outside_path_correction=null;
+	if( Test.AnotherWay._g_outside_path_correction!=null && !test_page.suppress_outside_path_correction ) {
+		outside_path_correction=Test.AnotherWay._g_outside_path_correction;
+	}
+	var result=Test.AnotherWay._set_iframe_location( Test.AnotherWay._g_test_iframe, test_page.url, outside_path_correction );
+	if( result.msg!=null ) {
+		Test.AnotherWay._unprint_result( test_page.wait_msg );
+		Test.AnotherWay._print_result( test_page.url, result.msg, "badtest", null );
+		Test.AnotherWay._load_next_page();
+	}
+}
+
+Test.AnotherWay._loading_timeout=function()
+{
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	test_page.loading_timeout_milliseconds-=Test.AnotherWay._g_timeout_granularity;
+	if( test_page.loading_timeout_milliseconds>0 ) {
+		Test.AnotherWay._update_msg_counter( test_page.wait_msg, (test_page.loading_timeout_milliseconds/1000).toFixed() );
+		test_page.timeout_id=setTimeout( Test.AnotherWay._loading_timeout, Test.AnotherWay._g_timeout_granularity );
+	}else {
+		Test.AnotherWay._unprint_result( test_page.wait_msg );
+		Test.AnotherWay._print_result( test_page.url, "Unable to load test page. Timeout expired", "badtest", null );
+		Test.AnotherWay._load_next_page();
+	}
+}
+
+Test.AnotherWay._strip_query_and_hash=function( s )
+{
+	var i=s.lastIndexOf( "#" );
+	if( i!=-1 ) {
+		s=s.substring( 0, i );
+	}
+	i=s.lastIndexOf( "?" );
+	if( i!=-1 ) {
+		s=s.substring( 0, i );
+	}
+	return s;
+}
+Test.AnotherWay._is_url_loaded=function( url, wnd )
+{
+	var loaded=false;
+	if( wnd!=null && wnd.location!=null ) {
+		// after some popup blocker interference, location may behave strange..
+		var location_s="";
+		location_s+=wnd.location;
+		if( location_s!="" ) {
+			var pathname=wnd.location.pathname;
+			var expected_url=url;
+			var i=expected_url.lastIndexOf( "#" );
+			if( i!=-1 ) {
+				expected_url=expected_url.substring( 0, i );
+			}
+			i=expected_url.lastIndexOf( "?" );
+			if( i!=-1 ) {
+				expected_url=expected_url.substring( 0, i );
+			}
+			i=expected_url.lastIndexOf( "/" );
+			if( i!=-1 && i!=expected_url.length-1 ) {
+				expected_url=expected_url.substring( i+1 );
+			}
+			i=pathname.indexOf( expected_url )
+			if( wnd.location.href==url || (i!=-1 && i==pathname.length-expected_url.length) ) {
+				if( /*window.opera==null*/wnd.document.readyState==null || wnd.document.readyState=="complete" ) { // for opera (and IE?), getElementById does not work until..
+					loaded=true;
+				}
+			}
+		}
+	}
+	return loaded;
+}
+// find and run all test functions in the g_cur_page html page.
+Test.AnotherWay._test_page_onload=function()
+{
+	if( Test.AnotherWay._g_tests_queue.length==0 ) {
+		return;
+	}
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	if( !Test.AnotherWay._is_url_loaded( test_page.url, Test.AnotherWay._g_test_iframe ) ) {
+		return;
+	}
+	clearTimeout( test_page.timeout_id );
+	Test.AnotherWay._unprint_result( test_page.wait_msg );
+
+	if( test_page.convention=="anotherway" ) {
+		// get test function names (those beginning with "test")
+		if( typeof( Test.AnotherWay._g_test_iframe.document.scripts )!='undefined' ) { // IE
+			for( var i=0; i<Test.AnotherWay._g_test_iframe.document.scripts.length; ++i ) {
+				var script_text=Test.AnotherWay._g_test_iframe.document.scripts[i].text;
+				var fun_sig="function test";
+				var fun_start=script_text.indexOf( fun_sig );
+
+				while( fun_start!=-1 ) {
+					script_text=script_text.substring( fun_start, script_text.length );
+					var fun_end=script_text.indexOf( '(' );
+					var fun_name=script_text.substring( "function ".length,  fun_end );
+                                        var whitespace = fun_name.indexOf( ' ' );
+                                        if (whitespace >= 0)
+                                            fun_name = fun_name.substring( 0, whitespace );
+					test_page.test_objects.push( new Test.AnotherWay._test_object_t( fun_name ) );
+					script_text=script_text.substring( fun_end, script_text.length );
+					fun_start=script_text.indexOf( fun_sig  );
+				}
+			}
+		}else { // otherwise (not IE) it ought to work like this
+			for( var i in Test.AnotherWay._g_test_iframe) {
+				// Hack to prevent failure in FF3.0b1 (innerWidth/innerHeight) and FF>=3.5 (sessionStorage)
+                if (i == "innerWidth" || i == "innerHeight" || i == "sessionStorage") { continue; }
+                if( typeof( Test.AnotherWay._g_test_iframe[i] )=='function' ) {
+					if( i.substring( 0, 4 )=="test" ) {
+						test_page.test_objects.push( new Test.AnotherWay._test_object_t( i ) );
+					}
+				}
+			}
+		}
+	}else if( test_page.convention=="jsan" ) {
+		// the test object is already filled with results
+		test_page.test_objects.push( Test.AnotherWay._g_test_object_for_jsan );
+	}
+
+	if( test_page.test_objects.length==0 ) {
+		Test.AnotherWay._print_result( test_page.url,  "No test functions defined in the page", "badtest", null );
+		Test.AnotherWay._load_next_page();
+		return;
+	}
+
+	test_page.wait_msg=Test.AnotherWay._print_result( test_page.url, "running tests..<span class=\"counter\">"+test_page.test_objects.length+"</span>", "running", null );
+
+	test_page.test_object_i=0;
+	Test.AnotherWay._run_more_tests();
+}
+
+Test.AnotherWay._handle_exception=function( o, e, title )
+{
+	var s=title+": "+typeof( e )+": ";
+	if( e.message!=null ) {
+		s+=e.message;
+	}else if( e.description!=null ) {
+		s+=e.description;
+	}else {
+		s+=e.toString();
+	}
+//	if( e.location!=null ) {  // XXX figure out how to display exception location if it's present (like in mozilla)
+//		s+=" location: "+e.location.toString();
+//	}
+	o.exception=s;
+	s=[];
+	if( e.stack ) {
+		var lines=e.stack.split( "\n" );
+		for( var i=0; i<lines.length; ++i ) {
+			// format of the line: func_name(args)@file_name:line_no
+			if( lines[i].match( /(\w*)\(([^\)]*)\)@(.*):([^:]*)$/ ) ) {
+				var func_name=RegExp.$1;
+				if( func_name.length==0 ) {
+					func_name="<anonymous>";
+				}
+				s.push( "in "+func_name+"( "+RegExp.$2+") at "+RegExp.$3+" line "+RegExp.$4+"\n" );
+			}
+		}
+	}
+	o.exception_stack=s;
+}
+
+Test.AnotherWay._run_more_tests=function()
+{
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	while( test_page.test_object_i<test_page.test_objects.length ) {
+		Test.AnotherWay._update_msg_counter( test_page.wait_msg, (1+test_page.test_object_i)+"/"+test_page.test_objects.length );
+		var o=test_page.test_objects[test_page.test_object_i];
+		if( test_page.convention=="anotherway" ) {
+			try {
+				Test.AnotherWay._g_test_iframe[o.name]( o );
+			}catch( e ) {
+				Test.AnotherWay._handle_exception( o, e, "" );
+			}
+		} // for "jsan" convention, test has run already
+		if( o.delay_actions.length>0 || o.wait_result_milliseconds>0 ) {
+			o.delay_total_milliseconds_left+=o.wait_result_milliseconds;
+			Test.AnotherWay._delay_actions_timeout();
+			return;
+		}
+		++test_page.test_object_i;
+	}
+	Test.AnotherWay._unprint_result( test_page.wait_msg );
+	Test.AnotherWay._print_result( test_page.url, null, null, test_page.test_objects );
+	Test.AnotherWay._load_next_page();
+}
+
+Test.AnotherWay._delay_actions_timeout=function()
+{
+	var test_page=Test.AnotherWay._g_tests_queue[0];
+	var test_object=test_page.test_objects[test_page.test_object_i];
+	var finished=true;
+	if( test_object.delay_action_i==null ) {
+		// set up to start first action
+		test_object.delay_action_i=-1;
+	}else {
+		// perform current action
+		var milliseconds_passed=(new Date()).getTime()-test_object.delay_prev_timer_time;
+		test_object.delay_current_milliseconds_left-=milliseconds_passed;
+		test_object.delay_total_milliseconds_left-=milliseconds_passed;
+		finished=Test.AnotherWay._delay_continue_action( test_object, milliseconds_passed );
+	}
+	while( finished && test_object.delay_action_i<test_object.delay_actions.length ) {
+		++test_object.delay_action_i; // start next action
+		finished=Test.AnotherWay._delay_start_action( test_object );
+	}
+	if( test_object.delay_action_i<=test_object.delay_actions.length ) { // any more actions left ?
+		test_object.delay_prev_timer_time=(new Date()).getTime();
+		var next_timeout=Test.AnotherWay._g_timeout_granularity;
+		if( test_object.delay_current_milliseconds_left<next_timeout ) {
+			next_timeout=test_object.delay_current_milliseconds_left;
+		}
+		if( test_object.second_wait_msg!=null ) {
+			Test.AnotherWay._update_msg_counter( test_object.second_wait_msg, (test_object.delay_total_milliseconds_left/1000).toFixed() );
+		}
+		setTimeout( Test.AnotherWay._delay_actions_timeout, next_timeout );
+	}else { // no more actions left. run the next test.
+		if( test_object.second_wait_msg!=null ) {
+			Test.AnotherWay._unprint_result( test_object.second_wait_msg );
+			test_object.second_wait_msg=null;
+		}
+		++test_page.test_object_i;
+		Test.AnotherWay._run_more_tests();
+	}
+}
+Test.AnotherWay._delay_start_action=function( test_object )
+{
+	var finished=false;
+	var wait_msg="";
+	if( test_object.delay_action_i==test_object.delay_actions.length ) {
+		if( test_object.wait_result_milliseconds>0 ) {
+			test_object.delay_current_milliseconds_left=test_object.wait_result_milliseconds; // wait for result
+			wait_msg="waiting for results..";
+		}else {
+			++test_object.delay_action_i; // dont wait for result
+		}
+	}else {
+		var action=test_object.delay_actions[test_object.delay_action_i];
+		if( action.action_kind=="call" ) {
+			test_object.delay_current_milliseconds_left=action.call_delay_milliseconds;
+			wait_msg="performing delayed calls..";
+		}else if( action.action_kind=="window" ) {
+			if( Test.AnotherWay._g_opera_path_correction!=null && action.wnd_url.indexOf( ":" )==-1 ) {
+				action.wnd_url=Test.AnotherWay._g_opera_path_correction+action.wnd_url;
+			}
+			action.wnd_wnd=window.open( action.wnd_url, "_blank" );
+			if( action.wnd_wnd==null ) {
+				finished=true;
+				test_object.fail( "unable to open window for "+action.wnd_url );
+			}else {
+				test_object.delay_current_milliseconds_left=action.wnd_timeout_milliseconds;
+				wait_msg="opening window..";
+			}
+		}else if( action.action_kind=="replay" ) {
+			if( action.replay_events.length==0 ) {
+				finished=true;
+			}else {
+				action.replay_event_i=0;
+				test_object.delay_current_milliseconds_left=action.replay_events[0]["time"];
+				wait_msg="replaying events..";
+			}
+		}
+	}
+	if( test_object.second_wait_msg!=null ) {
+		Test.AnotherWay._unprint_result( test_object.second_wait_msg );
+	}
+	if( wait_msg!="" ) {
+		var test_page=Test.AnotherWay._g_tests_queue[0];
+		test_object.second_wait_msg=Test.AnotherWay._print_counter_result( test_page.url, wait_msg, test_object.delay_total_milliseconds_left, "waiting" );
+	}else {
+		test_object.second_wait_msg=null;
+	}
+	return finished;
+}
+Test.AnotherWay._delay_continue_action=function( test_object, milliseconds_passed )
+{
+	var finished=test_object.delay_current_milliseconds_left<=0;
+	if( test_object.delay_action_i==test_object.delay_actions.length ) { // action is "waiting for results"
+		if( test_object.n_plan!=null && test_object.n_plan==test_object.n_ok+test_object.n_fail ) {
+			finished=true; // if all assertions results are recorded, don't wait any more
+		}
+		if( finished ) {
+			++test_object.delay_action_i; // move on to the next test
+		}
+	}else {
+		var action=test_object.delay_actions[test_object.delay_action_i];
+		if( action.action_kind=="call" ) {
+			if( finished ) {
+				try {
+					action.call_fn();
+				}catch( e ) {
+					Test.AnotherWay._handle_exception( test_object, e, "in delay_call" );
+				}
+			}
+		}else if( action.action_kind=="window" ) {
+			test_object.delay_total_milliseconds_left+=milliseconds_passed; // for "window", the countdown is suspended since it's unknown how long it will take
+			if( Test.AnotherWay._is_url_loaded( action.wnd_url, action.wnd_wnd ) ) {
+				try {
+					action.wnd_fn( action.wnd_wnd );
+				}catch( e ) {
+					Test.AnotherWay._handle_exception( test_object, e, "in open_window function call" );
+				}
+				finished=true;
+			}else if( finished ) {
+				test_object.fail(  "unable to open window for url '"+action.wnd_url+"'. timeout expired" );
+			}
+		}else if( action.action_kind=="replay" ) {
+			if( finished ) {
+//				try {
+					Test.AnotherWay._delay_replay_event( test_object, action.replay_wnd, action.replay_events[action.replay_event_i], action.replay_checkpoints );
+//				}catch( e ) { // disabled, until I know how to gel location info from an exception
+//					Test.AnotherWay._handle_exception( test_object, e, "while replaying event" );
+//				}
+				++action.replay_event_i;
+				finished=action.replay_event_i==action.replay_events.length;
+				if( !finished ) {
+					test_object.delay_current_milliseconds_left=action.replay_events[action.replay_event_i]["time"];
+				}
+			}
+		}
+	}
+	return finished;
+}
+Test.AnotherWay._delay_replay_event=function( test_object, wnd, event, checkpoints )
+{
+	if( event.type=="_checkpoint" ) {
+		var checkpoint_n=event.which;
+		var prev_n_fail=test_object.n_fail;
+		checkpoints[checkpoint_n]( test_object, wnd );
+		var flash_color= prev_n_fail==test_object.n_fail ? "#2f2" : "#f22" ;
+		Test.AnotherWay._record_flash_border( flash_color );
+	}else if( event.type=="click" || event.type=="mouseover" || event.type=="mouseout" || event.type=="mousemove" || event.type=="mousedown" || event.type=="mouseup" ) {
+		var target=Test.AnotherWay._record_node_path_to_node( event["target"], wnd.document );
+		if( target!=null ) {
+			Test.AnotherWay._record_control_update_highlight( target, "ball", event );
+			var e=wnd.document.createEvent( "MouseEvents" );
+			var related_target=Test.AnotherWay._record_node_path_to_node( event["relatedTarget"], wnd.document );
+			e.initMouseEvent(
+				event["type"],
+				event["cancelable"],
+				event["bubbles"],
+				wnd.document.defaultView,
+				event["detail"],
+				event["screenX"],
+				event["screenY"],
+				event["clientX"],
+				event["clientY"],
+				event["ctrlKey"],
+				event["altKey"],
+				event["shiftKey"],
+				event["metaKey"],
+				event["button"],
+				Test.AnotherWay._record_node_path_to_node( event["relatedTarget"], wnd.document )
+			);
+			// Firefox 1.0.6 somehow loses relatedTarget somewhere on the way. Pass through our own, for those who choose to care.
+			e.passThroughRelatedTarget=related_target;
+			target.dispatchEvent( e );
+		}
+	}else if( event.type=="keyup" || event.type=="keydown" || event.type=="keypress" ) {
+		var e=wnd.document.createEvent( "KeyboardEvents" ); // forget it. Apparently it's not supported neither by mozilla nor by opera.
+		e.initKeyboardEvent(
+				event["type"],
+				event["cancelable"],
+				event["bubbles"],
+				wnd.document.defaultView,
+				event["which"],
+				event["which"],
+				event["ctrlKey"],
+				event["altKey"],
+				event["shiftKey"],
+				event["metaKey"],
+				false
+		);
+		wnd.document.dispatchEvent( e );
+	}
+}
+
+Test.AnotherWay._print_counter_result=function( url, msg, milliseconds, style )
+{
+	return Test.AnotherWay._print_result( url, msg+"<span class=\"counter\">"+(milliseconds/1000).toFixed()+"</span>", style, null );
+}
+
+Test.AnotherWay._g_result_count=0; // for assigning unique ids to result paragraphs
+
+// number of pages tested
+Test.AnotherWay._g_ok_pages=0;
+Test.AnotherWay._g_fail_pages=0;
+
+Test.AnotherWay._print_result=function( url, msg, style, test_objects )
+{
+	var results=document.getElementById( "results" );
+	var r=results.appendChild( document.createElement( "p" ) );
+	r.id="result"+Test.AnotherWay._g_result_count;
+	++Test.AnotherWay._g_result_count;
+	r.onclick=Test.AnotherWay._toggle_detail;
+	var text="<span class=\"bullet\">   </span> ";
+	if( url!="" ) {
+		text+=url+":  ";
+	}
+	if( msg!=null ) {
+		text+=msg;
+	}
+	if( test_objects!=null ) {
+		// compose summary and detail texts
+		var total_ok=0;
+		var total_detail_ok=0;
+		var total_fail=0;
+		var total_detail_fail=0;
+		var no_plan=0;
+
+		var detail=results.appendChild( document.createElement( "div" ) );
+
+		if( r.id.match( /^result(\d+)$/ ) ) {
+			detail.id="result_detail"+RegExp.$1;
+		}
+
+		for( var i=0; i<test_objects.length; ++i ) {
+			var o=test_objects[i];
+			var p;
+			var p_text;
+			p=document.createElement( "P" );
+			Test.AnotherWay._set_css_class( p, "result_detail" );
+			p_text=o.name;
+			if( o.n_fail>0 || o.exception || (o.n_plan!=null && o.n_plan!=o.n_ok+o.n_fail) || (o.n_plan==null && o.n_ok==0 && o.n_fail==0)) {
+				++total_fail;
+				p_text+=" <span class=\"fail\">";
+				if( o.n_plan!=null && o.n_plan!=o.n_ok+o.n_fail) {
+					p_text+="planned "+o.n_plan+" assertions but got "+(o.n_ok+o.n_fail)+"; ";
+				}
+				if(o.n_plan==null && o.n_ok==0 && o.n_fail==0) {
+					p_text+="test did not output anything";
+				}else {
+					p_text+=" fail "+o.n_fail;
+				}
+				p_text+="</span>";
+			}else {
+				++total_ok;
+			}
+			p_text+=" ok "+o.n_ok;
+			if( o.n_plan==null ) {
+				no_plan=1;
+				p_text+=" <span class=\"warning\">no plan</span>";
+			}
+			p.innerHTML=p_text;
+			detail.appendChild( p );
+			if( o.exception ) {
+				p=document.createElement( "P" );
+				Test.AnotherWay._set_css_class( p, "result_exception_detail" );
+				p.innerHTML="<span class=\"fail\">exception:</span> "+o.exception;
+				detail.appendChild( p );
+				p=document.createElement( "P" );
+				Test.AnotherWay._set_css_class( p, "result_exception_stack_detail" );
+				p.innerHTML=o.exception_stack.join( "<br/>" );
+				detail.appendChild( p );
+			}
+			for( var ii=0; ii<o.assertions.length; ++ii ) {
+				var oo=o.assertions[ii];
+				var status=oo.ok ? "ok" : "<span class=\"fail\">fail</span>";
+				p=document.createElement( "P" );
+				Test.AnotherWay._set_css_class( p, "result_micro_detail" );
+				p.innerHTML=status;
+				p.appendChild( document.createTextNode( " "+oo.name ) );
+				detail.appendChild( p );
+			}
+			total_detail_ok+=o.n_ok;
+			total_detail_fail+=o.n_fail;
+		}
+		if( total_fail || total_detail_fail ) {
+			text+=" fail "+total_fail;
+		}
+		text+=" ok "+total_ok+" (detailed:";
+		if( total_fail || total_detail_fail ) {
+			text+=" fail "+total_detail_fail;
+		}
+		text+=" ok "+total_detail_ok+")";
+		if( no_plan ) {
+			text+=" <span class=\"warning\">no plan</span>";
+		}
+		style= total_fail==0 ? "ok" : "fail";
+		detail.style.display= style=="fail" ? "block" : "none";
+		detail.style.cursor="text";
+	}
+	if( style!=null ) {
+		Test.AnotherWay._set_css_class( r, style );
+		if( style=="ok" ) {
+			++Test.AnotherWay._g_ok_pages;
+		}else if( style=="fail" || style=="badtest" ) {
+			++Test.AnotherWay._g_fail_pages;
+		}
+		var pages_total="";
+		if( Test.AnotherWay._g_fail_pages>0 ) {
+			pages_total+=" fail "+Test.AnotherWay._g_fail_pages;
+		}
+		pages_total+=" ok "+Test.AnotherWay._g_ok_pages;
+		Test.AnotherWay._update_results_total( pages_total );
+	}
+	r.innerHTML=text;
+	if( results.scrollHeight!=null && results.scrollTop!=null && results.offsetHeight!=null ) {
+		results.scrollTop=results.scrollHeight-results.offsetHeight;
+	}
+	// when test_objects is not null, the results are final - good time to clean up
+	if( test_objects!=null ) {
+		for( var i=0; i<test_objects.length; ++i ) {
+			var actions=test_objects[i].delay_actions;
+			for( var action_i=0; action_i<actions.length; ++action_i ) {
+				var action=actions[action_i];
+				if( action.action_kind=="window" && action.wnd_wnd!=null && !action.wnd_no_close ) {
+					action.wnd_wnd.close();
+					action.wnd_wnd=null;
+				}
+			}
+		}
+	}
+	return r;
+}
+Test.AnotherWay._unprint_result=function( child )
+{
+	var results=document.getElementById( "results" );
+	results.removeChild( child );
+}
+Test.AnotherWay._toggle_detail=function()
+{
+	if( this.id.match( /^result(\d+)$/ ) ) {
+		var detail=document.getElementById( "result_detail"+RegExp.$1 );
+		if( detail!=null ) {
+			if( detail.style.display=="none" ) {
+				detail.style.display="block";
+			}else if( detail.style.display=="block" ) {
+				detail.style.display="none";
+			}
+		}
+	}
+}
+Test.AnotherWay._update_msg_counter=function( msg, text )
+{
+	for( var i=0; i<msg.childNodes.length; ++i ) {
+		var item=msg.childNodes[i];
+		if( item.nodeName=="SPAN" && Test.AnotherWay._get_css_class( item )=="counter" ) {
+			item.innerHTML=text;
+		}
+	}
+}
+Test.AnotherWay._update_results_total=function( msg )
+{
+	var total=document.getElementById( "total" );
+	if( total ) {
+		total.innerHTML=msg;
+	}
+}
+Test.AnotherWay._results_clear_onclick=function()
+{
+	var results=document.getElementById( "results" );
+	results.innerHTML="";
+	Test.AnotherWay._update_results_total( "" );
+	Test.AnotherWay._g_ok_pages=0;
+	Test.AnotherWay._g_fail_pages=0;
+	var debug=document.getElementById( "debug" );
+	debug.innerHTML="";
+}
+
+Test.AnotherWay._get_css_class=function( o )
+{
+	var c=o.getAttribute( "className" );
+	if( c==null || c=="" ) {
+		c=o.getAttribute( "class" );
+	}
+	return c;
+}
+Test.AnotherWay._set_css_class=function( o, css_class )
+{
+	o.setAttribute( "className", css_class );
+	o.setAttribute( "class", css_class );
+}
+
+Test.AnotherWay._tab_onclick=function()
+{
+	var tab=this;
+	var tabs=[ document.getElementById( "debug_tab" ), document.getElementById( "results_tab" ) ];
+	var panes=[ document.getElementById( "debug" ), document.getElementById( "results" ) ];
+	for( var i=0; i<tabs.length; ++i ) {
+		if( tab==tabs[i] ) {
+			Test.AnotherWay._set_css_class( tabs[i], "active_tab" );
+			panes[i].style.display="block";
+		}else {
+			Test.AnotherWay._set_css_class( tabs[i], "inactive_tab" );
+			panes[i].style.display="none";
+		}
+	}
+}
+Test.AnotherWay._tab_mouseover=function()
+{
+	if( Test.AnotherWay._get_css_class( this )=="inactive_tab" ) {
+		Test.AnotherWay._set_css_class( this, "inactive_mouseover_tab" );
+	}
+}
+Test.AnotherWay._tab_mouseout=function()
+{
+	if( Test.AnotherWay._get_css_class( this )=="inactive_mouseover_tab" ) {
+		Test.AnotherWay._set_css_class( this, "inactive_tab" );
+	}
+}
+
+// recording mouse input
+Test.AnotherWay._record_check_onfocus=function()
+{
+	var o=this;
+	var check_select=o.type!="text";
+	var div=document.getElementById( "record_div" );
+	var inputs=div.getElementsByTagName( "input" );
+	for( var i=0; i<inputs.length; ++i ) {
+		var input=inputs[i];
+		if( input.type=="radio" ) {
+			if( input.value=="select" ) {
+				input.checked=check_select;
+			}else if( input.value=="input" ) {
+				input.checked=!check_select;
+			}
+		}
+	}
+}
+
+Test.AnotherWay._g_no_record_msg=null; // not null - recording is unavailable
+Test.AnotherWay._g_record_timeout_cnt=0; // opening window for a page for recording
+Test.AnotherWay._g_record_url=null;
+Test.AnotherWay._g_record_wnd=null;
+Test.AnotherWay._g_record_random_id=null; // added to element ids of record_control div so that they do not clash with ids already in the page for which input is recorded
+Test.AnotherWay._g_record_keydown=null; // recording control - which key is down
+Test.AnotherWay._g_record_ctrl_keydown=false;
+Test.AnotherWay._g_record_shift_keydown=false;
+Test.AnotherWay._g_record_control_visible=true; // recording control ui state
+Test.AnotherWay._g_record_started;
+Test.AnotherWay._g_record_paused;
+Test.AnotherWay._g_record_include_mousemove=false;
+Test.AnotherWay._g_record_start_time; // for time references
+Test.AnotherWay._g_record_pause_start_time;
+Test.AnotherWay._g_record_update_time_interval; // showing time in the control ui
+Test.AnotherWay._g_record_waiting_for_results=false; // waiting for results window to open
+Test.AnotherWay._g_record_events; // recorded events
+Test.AnotherWay._g_record_under_cursor; // track element under cursor
+Test.AnotherWay._g_record_checkpoint_count; // for checkpoint numbering
+Test.AnotherWay._g_record_mouse_over_record_control; // for avoiding record control highlight on mouseover
+Test.AnotherWay._g_record_highlighted_element={ element: null, x: null, y: null };
+
+Test.AnotherWay._record_control_get_element=function( id )
+{
+	if( Test.AnotherWay._g_record_wnd!=null && Test.AnotherWay._g_record_wnd.document!=null ) {
+		return Test.AnotherWay._g_record_wnd.document.getElementById( id+Test.AnotherWay._g_record_random_id );
+	}else {
+		return null;
+	}
+}
+Test.AnotherWay._record_start_onclick=function() // "record" button on the run_tests.html: open a window for a page for which input is recorded
+{
+	if( Test.AnotherWay._g_no_record_msg!=null ) {
+		alert( Test.AnotherWay._g_no_record_msg );
+		return;
+	}
+	if( Test.AnotherWay._g_record_timeout_cnt>0
+	    || (Test.AnotherWay._g_record_wnd!=null && (Test.AnotherWay._g_record_wnd.closed!=null && !Test.AnotherWay._g_record_wnd.closed)) ) { // in opera, closed is null.
+		alert( "there is already window opened for recording input for a page "+Test.AnotherWay._g_record_url );
+		return;
+	}
+	var div=document.getElementById( "record_div" );
+	var inputs=div.getElementsByTagName( "input" );
+	var url=null;
+	for( var i=0; i<inputs.length; ++i ) {
+		var input=inputs[i];
+		if( input.type=="radio" ) {
+			if( input.value=="select" && input.checked ) {
+				var index=document.getElementById( "record_select" ).selectedIndex;
+				if( index>0 ) {
+					url=Test.AnotherWay._g_test_page_urls[index-1].url;
+				}
+			}else if( input.value=="input" && input.checked ) {
+				url=document.getElementById( "record_input" ).value;
+			}
+		}
+	}
+	if( url!=null ) {
+		Test.AnotherWay._g_record_url=url;
+		Test.AnotherWay._g_record_wnd=window.open( url, "_blank" );
+		if( Test.AnotherWay._g_record_wnd==null ) {
+			alert( "unable to open new window for a page: "+url );
+		}else {
+			Test.AnotherWay._g_record_timeout_cnt=50;
+			setTimeout( Test.AnotherWay._record_window_timeout, 100 );
+		}
+	}
+}
+Test.AnotherWay._record_window_timeout=function()
+{
+	if( Test.AnotherWay._is_url_loaded( Test.AnotherWay._g_record_url, Test.AnotherWay._g_record_wnd ) ) {
+		Test.AnotherWay._record_window_setup( Test.AnotherWay._g_record_wnd );
+	}else {
+		if( --Test.AnotherWay._g_record_timeout_cnt>0 ) {
+			setTimeout( Test.AnotherWay._record_window_timeout, 100 );
+		}else {
+			alert( "timeout expired while opening new window for a page: "+Test.AnotherWay._g_record_url );
+			Test.AnotherWay._g_record_wnd=null;
+			Test.AnotherWay._g_record_url=null;
+			Test.AnotherWay._g_record_timeout_cnt=0;
+		}
+	}
+}
+Test.AnotherWay._record_control_randomize_id=function( e, r )
+{
+	if( e.id!="" ) {
+		e.id=e.id+r;
+	}
+	for( var c=e.firstChild; c!=null; c=c.nextSibling ) {
+		Test.AnotherWay._record_control_randomize_id( c, r );
+	}
+}
+Test.AnotherWay._record_window_setup=function( wnd ) // insert recording control into the page for which input is recorded
+{
+	Test.AnotherWay._g_record_timeout_cnt=0;
+	var this_div=document.getElementById( "record_control" );
+	var record_control=wnd.document.importNode( this_div, true );
+	Test.AnotherWay._g_record_random_id=(1000*Math.random()).toFixed();
+	Test.AnotherWay._record_control_randomize_id( record_control, Test.AnotherWay._g_record_random_id );
+	Test.AnotherWay._g_record_control_visible=true;
+	Test.AnotherWay._g_record_started=false;
+	Test.AnotherWay._g_record_paused=false;
+	Test.AnotherWay._g_record_checkpoint_count=0;
+	Test.AnotherWay._g_record_mouse_over_record_control=false;
+	var doc=wnd.document;
+	doc.body.appendChild( record_control );
+	// opera sans-serif font is different
+	if( window.opera ) {
+		cursor_over_indicator=Test.AnotherWay._record_control_get_element( "record_cursor_over" );
+		cursor_over_indicator.style.width="18em";
+		cursor_over_indicator.style.height="2em";
+		cursor_over_indicator.style.fontSize="7pt";
+	}
+	doc.addEventListener( "keydown", Test.AnotherWay._record_control_keydown, true );
+	doc.addEventListener( "keyup", Test.AnotherWay._record_control_keyup, true );
+//	doc.addEventListener( "keypress", Test.AnotherWay._record_event, true ); // replaying is not supported by any known browser
+
+	doc.body.addEventListener( "mousemove", Test.AnotherWay._record_on_mousemove, true );
+	doc.body.addEventListener( "click", Test.AnotherWay._record_event, true );
+	doc.body.addEventListener( "mouseover", Test.AnotherWay._record_event, true );
+	doc.body.addEventListener( "mouseout", Test.AnotherWay._record_event, true );
+	doc.body.addEventListener( "mousedown", Test.AnotherWay._record_event, true );
+	doc.body.addEventListener( "mouseup", Test.AnotherWay._record_event, true );
+}
+Test.AnotherWay._record_control_key_disabled=function( k )
+{
+	if( k=="c" ) {
+		return !Test.AnotherWay._g_record_started;
+	}else if( k=="p" ) {
+		return !Test.AnotherWay._g_record_started;
+	}else if( k=="s" ) {
+		return Test.AnotherWay._g_record_waiting_for_results;
+	}else {
+		return false;
+	}
+}
+
+Test.AnotherWay._record_control_update_ui=function()
+{
+	var keydown_color="#fff";
+	var disabled_color="#aaa";
+	var button_color="#adf";
+	var active_color="#fdf";
+
+	var display={};
+	display[false]="none";
+	display[true]="inline";
+
+	var s_button=Test.AnotherWay._record_control_get_element( "record_s" );
+	var record_on=Test.AnotherWay._record_control_get_element( "record_on" );
+	var record_off=Test.AnotherWay._record_control_get_element( "record_off" );
+
+	s_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "s" ) ? disabled_color
+		: Test.AnotherWay._g_record_keydown=="s" ? keydown_color : Test.AnotherWay._g_record_started ? active_color : button_color;
+	record_on.style.display=display[!Test.AnotherWay._g_record_started];
+	record_off.style.display=display[Test.AnotherWay._g_record_started];
+
+	var h_button=Test.AnotherWay._record_control_get_element( "record_h" );
+	h_button.style.backgroundColor= Test.AnotherWay._g_record_keydown=="h" ? keydown_color : button_color;
+
+	var p_button=Test.AnotherWay._record_control_get_element( "record_p" );
+	var record_pause_on=Test.AnotherWay._record_control_get_element( "record_pause_on" );
+	var record_pause_off=Test.AnotherWay._record_control_get_element( "record_pause_off" );
+	p_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "p" ) ? disabled_color
+		: Test.AnotherWay._g_record_keydown=="p" ? keydown_color : Test.AnotherWay._g_record_paused ? active_color : button_color;
+	record_pause_on.style.display=display[!Test.AnotherWay._g_record_paused];
+	record_pause_off.style.display=display[Test.AnotherWay._g_record_paused];
+
+	var m_button=Test.AnotherWay._record_control_get_element( "record_m" );
+	var record_include_mousemove=Test.AnotherWay._record_control_get_element( "record_include_mousemove" );
+	var record_omit_mousemove=Test.AnotherWay._record_control_get_element( "record_omit_mousemove" );
+	m_button.style.backgroundColor= Test.AnotherWay._g_record_keydown=="m" ? keydown_color : Test.AnotherWay._g_record_include_mousemove ? active_color : button_color;
+	record_include_mousemove.style.display=display[!Test.AnotherWay._g_record_include_mousemove];
+	record_omit_mousemove.style.display=display[Test.AnotherWay._g_record_include_mousemove];
+
+	var c_button=Test.AnotherWay._record_control_get_element( "record_c" );
+	c_button.style.backgroundColor= Test.AnotherWay._record_control_key_disabled( "c" ) ? disabled_color
+		: Test.AnotherWay._g_record_keydown=="c" ? keydown_color : button_color;
+
+	var record_indicator=Test.AnotherWay._record_control_get_element( "record_indicator" );
+	record_indicator.style.display=display[Test.AnotherWay._g_record_started];
+
+	var pause_indicator=Test.AnotherWay._record_control_get_element( "record_pause_indicator" );
+	pause_indicator.style.display=display[Test.AnotherWay._g_record_paused];
+
+	var record_control=Test.AnotherWay._record_control_get_element( "record_control" );
+	record_control.style.display= Test.AnotherWay._g_record_control_visible ? "block" : "none";
+
+	var shift_button=Test.AnotherWay._record_control_get_element( "record_shift_key" );
+	shift_button.style.backgroundColor= Test.AnotherWay._g_record_shift_keydown ? keydown_color : button_color;
+
+	var ctrl_button=Test.AnotherWay._record_control_get_element( "record_ctrl_key" );
+	ctrl_button.style.backgroundColor= Test.AnotherWay._g_record_ctrl_keydown ? keydown_color : button_color;
+}
+Test.AnotherWay._record_format_time=function( t )
+{
+	t=new Date( t );
+	var m=t.getMinutes();
+	var s=t.getSeconds();
+	var str= m==0 ? "" : m+"m ";
+	str+=s+"s.";
+	return str;
+}
+Test.AnotherWay._record_control_update_time=function()
+{
+	var time_display=Test.AnotherWay._record_control_get_element( "record_time" );
+	if( time_display!=null ) {
+		time_display.innerHTML=Test.AnotherWay._record_format_time( (new Date()).getTime()-Test.AnotherWay._g_record_start_time );
+	}
+}
+Test.AnotherWay._record_control_update_highlight=function( elem, style, event )
+{
+	if( elem==null ) {
+		Test.AnotherWay._record_highlight_border( null );
+	}else {
+		var pos=Test.AnotherWay._get_page_coords( elem );
+		if( style=="ball" || elem!=Test.AnotherWay._g_record_highlighted_element.element || pos.x!=Test.AnotherWay._g_record_highlighted_element.x || pos.y!=Test.AnotherWay._g_record_highlighted_element.y ) {
+			Test.AnotherWay._g_record_highlighted_element={ element: elem, x: pos.x, y: pos.y };
+			Test.AnotherWay._record_highlight_border( elem, style, event );
+		}
+	}
+}
+Test.AnotherWay._record_decode_key=function( event )
+{
+	var k=null;
+	if( event==null ) {
+		k=Test.AnotherWay._g_record_wnd.event.keyCode;
+	}else {
+		k=event.which;
+	}
+	if( k==83 ) {
+		return "s";
+	}else if( k==72 ) {
+		return "h";
+	}else if( k==73 ) {
+		return "i";
+	}else if( k==80 ) {
+		return "p";
+	}else if( k==67 ) {
+		return "c";
+	}else if( k==77 ) {
+		return "m";
+	}else if( k==16 ) {
+		return "shift";
+	}else if( k==17 ) {
+		return "ctrl";
+	}else if( k==18 ) {
+		return "alt";
+	}else if( k==19 ) {
+		return "pause";
+	}else if( k==123 ) {
+		return "f12";
+	}
+	return "";
+}
+Test.AnotherWay._record_control_keydown=function( event )
+{
+	var handled=false;
+	var k=Test.AnotherWay._record_decode_key( event );
+	if( k=="shift" ) {
+		Test.AnotherWay._g_record_shift_keydown=true;
+	}else if( k=="ctrl" ) {
+		Test.AnotherWay._g_record_ctrl_keydown=true;
+	}else if( k!="" && (Test.AnotherWay._g_record_keydown==null || Test.AnotherWay._g_record_keydown==k) ) {
+		if( Test.AnotherWay._g_record_ctrl_keydown && Test.AnotherWay._g_record_shift_keydown && !Test.AnotherWay._record_control_key_disabled( k ) ) {
+			Test.AnotherWay._g_record_keydown=k;
+			handled=true;
+		}
+	}else {
+		Test.AnotherWay._g_record_keydown="";
+	}
+	Test.AnotherWay._record_control_update_ui();
+	if( !handled ) {
+//		Test.AnotherWay._record_event( event ); // replaying is not supported in any known browser
+	}
+	return;
+}
+Test.AnotherWay._record_control_keyup=function( event )
+{
+	var handled=false;
+	var k=Test.AnotherWay._record_decode_key( event );
+	if( k=="shift" ) {
+		Test.AnotherWay._g_record_shift_keydown=false;
+	}else if( k=="ctrl" ) {
+		Test.AnotherWay._g_record_ctrl_keydown=false;
+	}else if( k!="" && k==Test.AnotherWay._g_record_keydown && Test.AnotherWay._g_record_ctrl_keydown && Test.AnotherWay._g_record_shift_keydown  ) {
+		if( k=="s" ) {
+			Test.AnotherWay._g_record_started=!Test.AnotherWay._g_record_started;
+			if( Test.AnotherWay._g_record_started ) {
+				Test.AnotherWay._g_record_events=[];
+				Test.AnotherWay._g_record_start_time=(new Date()).getTime();
+				Test.AnotherWay._record_control_update_time();
+				Test.AnotherWay._g_record_update_time_interval=window.setInterval( Test.AnotherWay._record_control_update_time, 200 );
+			}else {
+				Test.AnotherWay._record_control_update_highlight( null );
+				if( !Test.AnotherWay._g_record_paused ) {
+					window.clearInterval( Test.AnotherWay._g_record_update_time_interval );
+				}
+				Test.AnotherWay._g_record_waiting_for_results=true;
+				// open a new window for self, pass a parameter to dump recorded events as javascript code there
+				// (the easiest way to obtain a document from the same origin, so it's writable, is to open this same page again)
+				Test.AnotherWay._g_record_paused=false;
+				var loc=window.location;
+				loc=loc.protocol+"//"+loc.host+loc.pathname+"?recording_results="+Test.AnotherWay._g_record_random_id;
+				if( window.open( loc, "_blank" )==null ) {
+					alert( "unable to open new window for results" );
+				}
+			}
+			handled=true;
+		}else if( k=="h" ) {
+			Test.AnotherWay._g_record_control_visible=!Test.AnotherWay._g_record_control_visible;
+			handled=true;
+		}else if( k=="p" ) {
+			Test.AnotherWay._g_record_paused=!Test.AnotherWay._g_record_paused;
+			if( Test.AnotherWay._g_record_paused ) {
+				Test.AnotherWay._g_record_pause_start_time=(new Date()).getTime();
+				if( Test.AnotherWay._g_record_started ) {
+					window.clearInterval( Test.AnotherWay._g_record_update_time_interval );
+				}
+				Test.AnotherWay._record_control_update_highlight( null );
+			}else {
+				var pause_duration=(new Date()).getTime()-Test.AnotherWay._g_record_pause_start_time;
+				Test.AnotherWay._g_record_start_time+=pause_duration;
+				Test.AnotherWay._g_record_update_time_interval=window.setInterval( Test.AnotherWay._record_control_update_time, 200 );
+			}
+			handled=true;
+		}else if( k=="m" ) {
+			Test.AnotherWay._g_record_include_mousemove=!Test.AnotherWay._g_record_include_mousemove;
+			handled=true;
+		}else if( k=="c" ) {
+			var o=Test.AnotherWay._record_checkpoint();
+			Test.AnotherWay._record_display_checkpoint( o );
+			Test.AnotherWay._record_flash_border( "#24d" );
+			handled=true;
+		}
+	}
+	Test.AnotherWay._g_record_keydown=null;
+	Test.AnotherWay._record_control_update_ui();
+	if( !handled ) {
+//		Test.AnotherWay._record_event( event ); // replaying is not supported in any known browser
+	}
+	return;
+}
+Test.AnotherWay._record_html_node_path=function( node )
+{
+	if( node==null ) {
+		return null;
+	}
+	var path=[];
+	while( true ) {
+		if( node.id!=null && node.id!="" ) {
+			path.unshift( "#"+node.id+" "+node.nodeName );
+			break;
+		}else {
+			var parent_node=node.parentNode;
+			if( parent_node==null ) {
+				return []; // no BODY up the path - this node is screwed (browsers differ in what's above the body), discard
+			}else {
+				var i=0;
+				var found=false;
+				for( var child=parent_node.firstChild; child!=null; child=child.nextSibling ) {
+					if( child==node ) {
+						found=true;
+						break;
+					}
+					if( child.nodeType==1 ) { // count only HTML element nodes
+						++i;
+					}
+				}
+				if( !found ) {
+					i=-1;
+				}
+				path.unshift( i+" "+node.nodeName );
+				if( parent_node.nodeName=="BODY" || parent_node.nodeName=="body" ) {
+					break;
+				}
+				node=parent_node;
+			}
+		}
+	}
+	return path;
+}
+Test.AnotherWay._record_node_path_to_string=function( path )
+{
+	var s="";
+	if( path!=null ) {
+		for( var i=0; i<path.length; ++i ) {
+			s+= i==0 ? "" : ", ";
+			var elem=path[i].split( " " );
+			if( elem[0].charAt( 0 )=="#" ) {
+				s+=elem[1]+" "+elem[0];
+			}else {
+				s+=elem[1]+" ["+elem[0]+"]";
+			}
+		}
+	}
+	return s;
+}
+Test.AnotherWay._record_node_path_to_node=function( path_str, doc )
+{
+	if( path_str==null ) {
+		return null;
+	}
+	var path=path_str.split( "," );
+	var node=doc.body;
+	for( var i=0; i<path.length; ++i ) {
+		var node_i=path[i].split( " " )[0];
+		if( node_i.charAt( 0 )=="#" ) {
+			node=doc.getElementById( node_i.substring( 1 ) );
+		}else {
+			if( node_i<0 || node_i>=node.childNodes.length ) {
+				node=null;
+			}else {
+				node=node.firstChild;
+				while( node!=null ) {
+					if( node.nodeType==1 ) {  // count only HTML element nodes
+						if( node_i==0 ) {
+							break;
+						}
+						--node_i;
+					}
+					node=node.nextSibling;
+				}
+			}
+		}
+		if( node==null ) {
+			return null;
+		}
+	}
+	return node;
+}
+Test.AnotherWay._record_control_contains_id=function( s )
+{
+	return s.match( /^#record_[\w_]+/ ) && s.match( Test.AnotherWay._g_record_random_id );
+}
+Test.AnotherWay._record_checkpoint=function()
+{
+	var o={ type: "_checkpoint", time: (new Date()).getTime()-Test.AnotherWay._g_record_start_time, which: Test.AnotherWay._g_record_checkpoint_count++,
+			target: Test.AnotherWay._record_html_node_path( Test.AnotherWay._g_record_under_cursor ) };
+	Test.AnotherWay._g_record_events.push( o );
+	return o;
+}
+Test.AnotherWay._record_event=function( event )
+{
+	var unneeded=["rangeOffset","eventPhase","timeStamp","isTrusted","popupWindowFeatures","rangeOffset"];
+	if( Test.AnotherWay._g_record_started && !Test.AnotherWay._g_record_paused ) {
+		var o={};
+		for( var n in event ) {
+			var needed=!n.match( /^[A-Z0-9_]+$/ );
+			if( needed ) {
+				for( var ui=0; ui<unneeded.length; ++ui ) {
+					if( unneeded[ui]==n ) {
+						needed=false;
+						break;
+					}
+				}
+				if( needed ) {
+					var value=event[n];
+					if( typeof( value )!="object" && typeof( value )!="function" ) {
+						o[n]=value;
+					}else if( n=="target" || n=="relatedTarget" ) {
+						o[n]=Test.AnotherWay._record_html_node_path( value );
+					}
+				}
+			}
+		}
+		o["time"]=(new Date()).getTime()-Test.AnotherWay._g_record_start_time;
+		var over_record_control= o["target"]!=null && o["target"][0]!=null && Test.AnotherWay._record_control_contains_id( o["target"][0] );
+		if( !over_record_control ) {
+			Test.AnotherWay._g_record_events.push( o );
+		}
+	}
+	return true;
+}
+Test.AnotherWay._record_on_mousemove=function( event )
+{
+	var path=Test.AnotherWay._record_html_node_path( event.target );
+	var new_mouse_over_record_control= path!=null && path[0]!=null && Test.AnotherWay._record_control_contains_id( path[0] );
+	if( new_mouse_over_record_control!=Test.AnotherWay._g_record_mouse_over_record_control ) {
+		Test.AnotherWay._g_record_mouse_over_record_control=new_mouse_over_record_control;
+		Test.AnotherWay._record_control_update_ui();
+	}
+	if( event.target!=null && event.target!=Test.AnotherWay._g_record_under_cursor ) {
+		Test.AnotherWay._g_record_under_cursor=event.target;
+		var s="";
+		if( path==null || path[0]==null || !Test.AnotherWay._record_control_contains_id( path[0] ) ) {
+			s=Test.AnotherWay._record_node_path_to_string( path );
+		}
+		if( s=="" ) {
+			s=" ";
+		}
+		var cursor_over_indicator=Test.AnotherWay._record_control_get_element( "record_cursor_over" );
+		cursor_over_indicator.innerHTML=s;
+	}
+
+	var highlight_element=null;
+	if( !Test.AnotherWay._g_record_mouse_over_record_control && Test.AnotherWay._g_record_started && !Test.AnotherWay._g_record_paused ) {
+		highlight_element=event.target;
+	}
+	// highlight border disabled on recording - it causes page to scroll, issuing spurious mouseover/mouseout event
+	//Test.AnotherWay._record_control_update_highlight( highlight_element, "border" );
+
+	if( Test.AnotherWay._g_record_include_mousemove ) {
+		Test.AnotherWay._record_event( event );
+	}
+	return true;
+}
+Test.AnotherWay._record_display_checkpoint=function( o )
+{
+	var checkpoints_div=Test.AnotherWay._record_control_get_element( "record_checkpoints" );
+	var p=checkpoints_div.appendChild( checkpoints_div.ownerDocument.createElement( "div" ) );
+	p.style.marginTop="3px";
+	p.style.font="normal normal 8pt sans-serif";
+	p.style.color="#000";
+	p.style.textAligh="left";
+	p.style.position="relative";
+	p.style.width="100%";
+	var checkpoint_text="";
+	checkpoint_text+="#"+(o.which+1);
+	checkpoint_text+="  "+Test.AnotherWay._record_format_time( o.time );
+	if( o.target!=null ) {
+		checkpoint_text+=Test.AnotherWay._record_node_path_to_string( o.target );
+	}
+	p.appendChild( p.ownerDocument.createTextNode( checkpoint_text ) );
+}
+Test.AnotherWay._record_save_results=function( doc )
+{
+	// strange, but DOM-style append does not work here in opera 8.
+	var append=function( s ) { doc.write( "<div>"+s+"</div>" ); };
+	append( "/* paste this data into your javascript and pass it as an argument to replay_events method */" );
+	append( "{ checkpoints: [" );
+	var first_checkpoint=true;
+	for( var i=0; i<Test.AnotherWay._g_record_events.length; ++i ) {
+		var o=Test.AnotherWay._g_record_events[i];
+		if( o.type=="_checkpoint" ) {
+			var str= first_checkpoint ? "" : "}, ";
+			str+="function( tst, wnd ) { // #"+o.which+" time "+Test.AnotherWay._record_format_time( o.time )+" cursor was over "+Test.AnotherWay._record_node_path_to_string( o.target );
+			append( str );
+			first_checkpoint=false;
+		}
+	}
+	if( !first_checkpoint ) {
+		append( "}" );
+	}
+	append( "], events: [ " );
+	var prev_time=0;
+	for( var i=0; i<Test.AnotherWay._g_record_events.length; ++i ) {
+		var o=Test.AnotherWay._g_record_events[i];
+		var s="";
+		s+= "{";
+		var n_first=true;
+		for( var n in o ) {
+			if( n=="time" ) { // convert to relative time
+				var cur_time=o[n]-0;
+				o[n]=cur_time-prev_time;
+				prev_time=cur_time;
+			}
+			s+=n_first ? n : ", "+n;
+			s+=":";
+			if( o[n]==null ) {
+				s+="null";
+			}else {
+				s+="\""+o[n]+"\"";
+			}
+			n_first=false;
+		}
+		s+= i==Test.AnotherWay._g_record_events.length-1 ? "}" : "},";
+		append( s );
+	}
+	append( "] }" );
+	append( ";" );
+}
+
+Test.AnotherWay._g_record_border; // border highlighting element under cursor
+Test.AnotherWay._g_record_border_flashes=[]; // array of { color: color, timeout: milliseconds }
+Test.AnotherWay._g_record_border_flashing=false;
+Test.AnotherWay._g_record_border_normal_color="#d4b";
+Test.AnotherWay._record_flash_border_timeout=function()
+{
+	var color=Test.AnotherWay._g_record_border_normal_color;
+	var timeout=null;
+	if( Test.AnotherWay._g_record_border_flashes.length!=0 ) {
+		color=Test.AnotherWay._g_record_border_flashes[0].color;
+		timeout=Test.AnotherWay._g_record_border_flashes[0].timeout;
+		Test.AnotherWay._g_record_border_flashes.splice( 0, 1 );
+	}
+	if( Test.AnotherWay._g_record_border!=null ) {
+		for( var i=0; i<Test.AnotherWay._g_record_border.length; ++i ) {
+			Test.AnotherWay._g_record_border[i].style.backgroundColor=color;
+		}
+	}
+	if( timeout!=null ) {
+		setTimeout( Test.AnotherWay._record_flash_border_timeout, timeout );
+	}else {
+		Test.AnotherWay._g_record_border_flashing=false;
+	}
+}
+Test.AnotherWay._get_page_coords=function( elm )
+{
+	var point = { x: 0, y: 0 };
+	while( elm )  {
+		point.x+=elm.offsetLeft;
+		point.y+=elm.offsetTop;
+		elm=elm.offsetParent;
+	 }
+	return point;
+}
+Test.AnotherWay._set_page_coords=function( elm, x, y )
+{
+	var parent_coords={ x: 0, y: 0 };
+	if( elm.offsetParent )  {
+		parent_coords=Test.AnotherWay._get_page_coords( elm.offsetParent );
+	}
+	var new_x=x-parent_coords.x;
+	if( new_x<0 ) {
+		new_x=0;
+	}
+	elm.style.left=new_x+'px';
+	var new_y=y-parent_coords.y;
+	if( new_y<0 ) {
+		new_y=0;
+	}
+	elm.style.top=new_y+'px';
+}
+Test.AnotherWay._record_setup_highlight_positions=function( element, style, coords, positions )
+{
+	if( style=="border" ) {
+		var width=element.clientWidth;
+		var height=element.clientHeight;
+		var step=0;
+		var thickness=2;
+		var fudge_expand=4;
+		positions.push( { x: coords.x-step-thickness, y: coords.y-step-thickness, width: width+2*step+2*thickness+fudge_expand, height: thickness } );
+		positions.push( { x: coords.x+width+step+fudge_expand, y: coords.y-step-thickness, width: thickness, height: height+2*step+2*thickness+fudge_expand } );
+		positions.push( { x:positions[0].x, y:positions[0].y, width:positions[0].width, height:positions[0].height } );
+		positions.push( { x:positions[1].x, y:positions[1].y, width:positions[1].width, height:positions[1].height } );
+		positions[2].y+=height+thickness+2*step+fudge_expand;
+		positions[3].x-=width+thickness+2*step+fudge_expand;
+	}else if( style=="ball" ) {
+		positions.push( { x: coords.x+2, y: coords.y, width: 2, height: 6 } );
+		positions.push( { x: coords.x, y: coords.y+2, width: 6, height: 2 } );
+		positions.push( { x: coords.x+1, y: coords.y+1, width: 4, height: 4 } );
+	}
+}
+Test.AnotherWay._record_highlight_border=function( element, style, event ) // null - hide border
+{
+	if( element!=null ) {
+		if( Test.AnotherWay._g_record_border==null || Test.AnotherWay._g_record_border[0].ownerDocument!=element.ownerDocument ) {
+			Test.AnotherWay._g_record_border=[];
+			var n= style=="border" ? 4 : style=="ball" ? 3 : 0;
+			for( var i=0; i<4; ++i ) {
+				var b=element.ownerDocument.createElement( "div" );
+				b.style.position="absolute";
+				b.style.zIndex="1";
+				b.style.backgroundColor=Test.AnotherWay._g_record_border_normal_color;
+				element.ownerDocument.body.appendChild( b );
+				Test.AnotherWay._g_record_border.push( b );
+			}
+		}
+		var coords=null;
+		if( style=="border" ) {
+			coords=Test.AnotherWay._get_page_coords( element );
+		}else if( style=="ball" ) {
+			if( event!=null ) {
+				if( event.pageX!=null && event.pageY!=null ) {
+					coords={ x: event.pageX-0, y: event.pageY-0 };
+				}else if( event.clientX!=null && event.clientY!=null ) {
+					var doc=element.ownerDocument;
+					if( doc!=null ) {
+						coords={ x: (event.clientX-0)+doc.body.scrollLeft, y: (event.clientY-0)+doc.body.scrollTop };
+					}
+				}
+			}
+		}
+		if( coords!=null && element.clientWidth!=null && element.clientHeight!=null ) {
+			var positions=[];
+			Test.AnotherWay._record_setup_highlight_positions( element, style, coords, positions );
+			for( var i=0; i<positions.length; ++i ) {
+				var b=Test.AnotherWay._g_record_border[i];
+				var p=positions[i];
+				Test.AnotherWay._set_page_coords( b, p.x, p.y );
+				b.style.width=p.width+"px";
+				b.style.height=p.height+"px";
+				b.style.display="block";
+			}
+		}
+	}else {
+		if( Test.AnotherWay._g_record_border!=null ) {
+			for( var i=0; i<Test.AnotherWay._g_record_border.length; ++i ) {
+				Test.AnotherWay._g_record_border[i].style.display="none";
+			}
+		}
+	}
+}
+Test.AnotherWay._record_flash_border=function( color )
+{
+	if( Test.AnotherWay._g_record_border_flashing ) { //already
+		Test.AnotherWay._g_record_border_flashes.push( { color: Test.AnotherWay._g_record_border_normal_color, timeout:300 } );
+		Test.AnotherWay._g_record_border_flashes.push( { color: color, timeout:600 } );
+	}else {
+		Test.AnotherWay._g_record_border_flashing=true;
+		Test.AnotherWay._g_record_border_flashes.push( { color: color, timeout:600 } );
+		Test.AnotherWay._record_flash_border_timeout();
+	}
+}
+Test.AnotherWay._record_prepare_doc_for_results=function()
+{
+	document.open();
+	document.write( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" );
+	document.write( "<html><head><title> Input recording results</title>" );
+	document.write( "<style type=\"text/css\">" );
+	document.write( "body { font: normal normal smaller sans-serif; }" );
+	document.write( "div { margin-top: 3px; }" );
+	document.write( "</style></head><body>" );
+	// opera and mozilla disagree over who the opener is.
+	if( typeof( window.opener.Test )!="undefined" && typeof( window.opener.Test.AnotherWay )!="undefined" ) {
+		window.opener.Test.AnotherWay._record_save_results( document );
+		window.opener.Test.AnotherWay._g_record_waiting_for_results=false;
+		window.opener.Test.AnotherWay._record_control_update_ui();
+	}else if( typeof( window.opener.opener.Test  )!="undefined" && typeof( window.opener.opener.Test.AnotherWay )!="undefined" ) {
+		window.opener.opener.Test.AnotherWay._record_save_results( document );
+		window.opener.opener.Test.AnotherWay._g_record_waiting_for_results=false;
+		window.opener.opener.Test.AnotherWay._record_control_update_ui();
+	}
+	document.write( "</body>" );
+	document.close();
+}
+
+// global initialization
+onload=function()
+{
+	if( window.opera ) {
+		var good_opera=typeof( window.opera.version )=="function";
+		good_opera=good_opera && window.opera.version().match( /^\s*(\d+)/ );
+		good_opera=good_opera && RegExp.$1>=8;
+	}
+	var span=document.createElement( "SPAN" );
+	span.innerHTML="<!--[if IE]><br /><![endif]-"+"->";
+	var is_ie=span.getElementsByTagName( "BR" ).length>0;
+
+	Test.AnotherWay._g_test_iframe=window.frames.test_iframe;
+
+	var query_str=window.location.search;
+	if( query_str.charAt( 0 )=="?" ) {
+		query_str=query_str.substring( 1 );
+	}
+	var testlist_page="list-tests.html";
+	var auto_run=false;
+	if( query_str!="" ) {
+		var params=[query_str];
+		if( query_str.indexOf( ";" )!=-1 ) {
+			params=query_str.split( ";" );
+		}else if( query_str.indexOf( "&" )!=-1 ) {
+			params=query_str.split( "&" );
+		}
+		for( var param_i=0; param_i<params.length; ++param_i ) {
+			var param=params[param_i].split( "=" );
+			if( param[0]=="recording_results" ) {
+				if( window.opener!=null ) {
+					// we were told to show recording results - replace everything in the document with the results
+					Test.AnotherWay._record_prepare_doc_for_results();
+					return;
+				}
+			}else if( param[0]=="testpage" ) {
+				Test.AnotherWay._add_test_page_url( decodeURIComponent( param[1] ), "anotherway" );
+			}else if( param[0]=="jsantestpage" ) {
+				Test.AnotherWay._add_test_page_url( decodeURIComponent( param[1] ), "jsan" );
+			}else if( param[0]=="testlist" ) {
+				testlist_page=decodeURIComponent( param[1] );
+			}else if( param[0]=="testframe" ) {
+				if( window.opera && !good_opera ) {
+					Test.AnotherWay._show_error( "testframe parameter does not work in versions of Opera prior to 8.0. Sorry (pathches are welcome)." );
+					// Opera 7 barfs on attempt to access frame.frameElement.
+					// if someone knows a way to assign onload handler to that iframe in Opera 7
+					// without disrupting code that works in other browsers, patches are welcome.
+				}else {
+					var frame_path=param[1].split( "." );
+					var frame=top;
+					for( var frame_path_i=0; frame_path_i<frame_path.length; ++frame_path_i ) {
+						frame=frame[frame_path[frame_path_i]];
+					}
+					if( frame==null ) {
+						Test.AnotherWay._show_error( "unable to find frame specified for loading test pages: "+param[1] );
+					}else {
+						if( frame.frameElement!=null ) { // for the following assignement to onload to work, frameElement is required
+							frame=frame.frameElement;
+						}
+						Test.AnotherWay._g_test_iframe=frame;
+					}
+				}
+			}else if( param[0]=="testframe_no_clear" ) {
+				Test.AnotherWay._g_test_frame_no_clear=true;
+			}else if( param[0]=="windows" ) {
+                if (param[1] == "none") {
+                    Test.AnotherWay._test_object_t.prototype.open_window=null;
+                }
+			}else if( param[0]=="run" ) {
+				auto_run=true;
+				if( param[1]=="all" ) {
+					Test.AnotherWay._g_pages_to_run="all";
+				}else {
+					if( Test.AnotherWay._g_pages_to_run==null || Test.AnotherWay._g_pages_to_run=="all" ) {
+						Test.AnotherWay._g_pages_to_run=[];
+					}
+					var pages=param[1].split( "," );
+					for( var i=0; i<pages.length; ++i ) {
+						Test.AnotherWay._g_pages_to_run.push( pages[i] );
+					}
+				}
+			}
+		}
+	}
+	if( Test.AnotherWay._g_test_page_urls.length==0 ) {  // if no individual pages were given on the command line, load the list
+		var result=Test.AnotherWay._set_iframe_location( window.frames["list_iframe"], testlist_page );
+		if( result.msg!=null ) {
+			Test.AnotherWay._show_error( result.msg );
+		}
+		Test.AnotherWay._g_run_on_list_load=auto_run;
+	}else {
+		Test.AnotherWay._g_run_on_main_load=auto_run;
+	}
+
+	var f=Test.AnotherWay._g_test_iframe;
+	try {
+		if( f.attachEvent!=null ) {
+			f.attachEvent( "onload", Test.AnotherWay._test_page_onload );
+		}else {
+			f.onload=Test.AnotherWay._test_page_onload;
+		}
+		if( Test.AnotherWay._g_test_iframe.nodeType!=null && Test.AnotherWay._g_test_iframe.contentWindow!=null ) { // it's iframe element, not the iframe. we need iframe.
+			Test.AnotherWay._g_test_iframe=Test.AnotherWay._g_test_iframe.contentWindow;
+		}
+	}catch(e) {
+		// ignore stupid opera error if the frame has onload handler assigned in the inline html
+	}
+	var handlers={
+		"run_all": { "onclick": Test.AnotherWay._run_all_onclick },
+		"run_selected": { "onclick": Test.AnotherWay._run_selected_onclick },
+		"unselect_all": { "onclick": Test.AnotherWay._unselect_all_onclick },
+		"record_select": { "onfocus": Test.AnotherWay._record_check_onfocus },
+		"record_input": { "onfocus": Test.AnotherWay._record_check_onfocus },
+		"record_start": { "onclick": Test.AnotherWay._record_start_onclick },
+		"clear_btn": { "onclick": Test.AnotherWay._results_clear_onclick },
+		"results_tab": { "onclick": Test.AnotherWay._tab_onclick, "onmouseover": Test.AnotherWay._tab_mouseover, "onmouseout": Test.AnotherWay._tab_mouseout },
+		"debug_tab": { "onclick": Test.AnotherWay._tab_onclick, "onmouseover": Test.AnotherWay._tab_mouseover, "onmouseout": Test.AnotherWay._tab_mouseout }
+	};
+	for( var hs in handlers ) {
+		var o=document.getElementById( hs );
+		if( o!=null ) {
+			for( var h in handlers[hs] ) {
+				o[h]=handlers[hs][h];
+			}
+		}else {
+			Test.AnotherWay._show_error( "unable to set "+h+" handler: id "+hs+" not found" );
+		}
+	}
+
+	if( window.opera && !good_opera ) {
+		Test.AnotherWay._g_no_record_msg="Input events recording and replaying is not available in opera versions prior to 8.0.";
+	}
+	if( is_ie ) {
+		Test.AnotherWay._g_no_record_msg="Input events recording and replaying is not available in internet explorer.";
+	}
+ 	if( Test.AnotherWay._g_no_record_msg!=null ) {
+		var no_record_p=document.getElementById( "record_not_supported" );
+		no_record_p.style.display="block";
+		no_record_p.appendChild( document.createTextNode( Test.AnotherWay._g_no_record_msg ) );
+	}
+
+	Test.AnotherWay._g_main_loaded=true;
+	if( Test.AnotherWay._g_run_on_main_load ) {
+		Test.AnotherWay._g_run_on_main_load=false;
+		Test.AnotherWay._run_pages_to_run();
+	}
+}
+// -->
+</script>
+<script type="text/javascript" src="xml_eq.js"></script>
+<script type="text/javascript" src="geom_eq.js"></script>
+</head><body>
+
+<div id="col1">
+<div id="col1_header">Test pages:</div>
+<div id="scroller">
+<table id="testtable">
+</table>
+</div>
+<div id="run_buttons">
+<input type="button" value=" clear " id="clear_btn" />
+<input type="button" value=" run all " id="run_all" />
+<input type="button" value=" run selected " id="run_selected" />
+<input type="button" value=" unselect all " id="unselect_all" />
+</div>
+<input type="checkbox" id="dont_close_test_windows" /> do not close windows opened by tests
+<div id="error"></div>
+<div id="record_div">
+<p id="record_not_supported" style="display:none"></p>
+<p>Record mouse input for the page:</p>
+<p><input type="radio" name="record_choose" value="select" checked="checked" /> <select id="record_select"><option selected="selected">-- select a page: --</option></select></p>
+<p><input type="radio" name="record_choose" value="input" /> or enter page url: <input type="text" id="record_input" /></p>
+<p><input type="button" value=" record " id="record_start" /></p>
+</div>
+</div>
+
+<div id="col2">
+<div id="right_header">
+<span id="results_count">Results: <span id="total"></span></span>
+<span id="results_tab" class="active_tab" style="visibility:hidden">Results</span>
+<span id="debug_tab" class="inactive_tab" style="visibility:hidden">Debug</span>
+</div>
+<div id="right_frame">
+<div id="results"></div>
+<div id="debug"></div>
+</div>
+</div>
+
+<span style="display:none">
+<iframe name="list_iframe" onload="Test.AnotherWay._list_iframe_onload();"></iframe>
+<iframe name="test_iframe" onload="Test.AnotherWay._test_page_onload();"></iframe>
+
+<!-- record_control div is to be imported into other documents, so all its styles are inline -->
+-<div id="record_control" style="position:absolute;bottom:0;left:0;margin:0;padding:0.5em;width:22em;height:22em;border:1px solid;background:#ffd;font: normal normal 8pt sans-serif; color:#000; text-align: left">
+
+<p style="margin:0 0 0 0; padding:0">
+ 
+<span style="display:none;font-weight:bold;color:#408" id="record_indicator">
+recording. <span style="font-weight:normal">time: <span id="record_time"></span></span><span id="record_pause_indicator"> paused</span>
+</span>
+</p>
+
+<div id="record_cursor_over" style="margin:0;padding:2px;width:14em;height:1.1em;overflow:hidden;float:right;border:1px solid #777;background:#fff;font: normal normal 8pt sans-serif;position:relative;top:3px;color:#000;text-align:left;"> </div>
+<p style="margin:2px 0 0 0; padding:0">
+cursor is over
+</p>
+
+<p style="margin:8px 0 0 0; padding:0;">
+ keyboard control: press
+ <span id="record_ctrl_key" style="border:1px solid #226;background:#adf;padding:0 0.5em">ctrl</span> -
+ <span id="record_shift_key" style="border:1px solid #226;background:#adf;padding:0 0.5em">shift</span> -
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_s" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">s</span>
+<span id="record_on">to <b>start</b> recording</span>
+<span id="record_off" style="display:none">to <b>stop</b> recording</span>
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_h" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">h</span>
+<span>to <b>hide/show</b> this window</span>
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_m" style="border:1px solid #226;background:#adf;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">m</span>
+<span id="record_include_mousemove">to <b> record</b> mousemove</span>
+<span id="record_omit_mousemove" style="display:none">to <b>omit</b> mousemove</span>
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_p" style="border:1px solid #226;background:#aaa;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">p</span>
+<span id="record_pause_on">to <b> pause</b> recording</span>
+<span id="record_pause_off" style="display:none">to <b>continue</b> recording</span>
+</p>
+
+<p style="margin:4px 0 0 0; padding:0">
+<span id="record_c" style="border:1px solid #226;background:#aaa;width:1.2em;float:left;font-weight:bold;text-align:center;margin-right:0.5em">c</span>
+<span>to add checkpoint</span>
+</p>
+
+<p style="margin:6px 0 0 0; padding:0">
+checkpoints:
+</p>
+<div id="record_checkpoints" style="position:relative;width:100%;height:6em;overflow:auto;font: normal normal 8pt sans-serif; color:#000; text-align: left">
+</div>
+</div>
+
+</span>
+</body></html>
diff --git a/tests/selenium/remotecontrol/config.cfg b/tests/selenium/remotecontrol/config.cfg
new file mode 100644
index 0000000..764bd3d
--- /dev/null
+++ b/tests/selenium/remotecontrol/config.cfg
@@ -0,0 +1,48 @@
+[config]
+server=http://openlayers.org/
+url=/dev/tests/run-tests.html?run=all&windows=none
+
+[local_ff]
+host=localhost
+browserCmd=firefox
+comment=Firefox on localhost
+
+[local_safari]
+host=localhost
+browserCmd=safari
+comment=Safari  on localhost
+
+#[ie6-winxp]
+#host=208.80.142.184
+#browserCmd=iexploreproxy C:\Program Files\MultipleIEs\IE6\iexplore.exe
+#comment=IE6 on WinXP
+
+[ie7-winxp]
+host=208.80.142.184
+browserCmd=iexploreproxy
+comment=IE7 on WinXP
+
+# Running on alta: debian etch
+[opera-winxp]
+host=208.80.142.184
+browserCmd=opera C:\Program Files\Opera 9\Opera.exe
+comment=Opera on WinXP 
+
+# Running on alta: debian etch
+[opera]
+host=208.80.142.140
+browserCmd=opera
+comment=Opera on Debian Etch
+
+# Running on alta: Debian Etch
+[firefox2]
+host=208.80.142.140
+browserCmd=firefox /usr/lib/iceweasel/firefox-bin
+comment=Iceweasel 2 on Debian Etch
+
+# Running on alta: Debian Etch
+[firefox3]
+host=208.80.142.105
+browserCmd=firefox /usr/lib/firefox-3.0.1/firefox-bin
+comment=FF3 on Ubuntu 
+
diff --git a/tests/selenium/remotecontrol/selenium.py b/tests/selenium/remotecontrol/selenium.py
new file mode 100644
index 0000000..e5505ed
--- /dev/null
+++ b/tests/selenium/remotecontrol/selenium.py
@@ -0,0 +1,1846 @@
+
+"""
+Copyright 2006 ThoughtWorks, Inc.
+
+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
+
+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.
+"""
+__docformat__ = "restructuredtext en"
+
+# This file has been automatically generated via XSL
+
+import httplib
+import urllib
+import re
+
+class selenium:
+    """
+    Defines an object that runs Selenium commands.
+    
+    Element Locators
+    ~~~~~~~~~~~~~~~~
+    
+    Element Locators tell Selenium which HTML element a command refers to.
+    The format of a locator is:
+    
+    \ *locatorType*\ **=**\ \ *argument*
+    
+    
+    We support the following strategies for locating elements:
+    
+    
+    *   \ **identifier**\ =\ *id*: 
+        Select the element with the specified @id attribute. If no match is
+        found, select the first element whose @name attribute is \ *id*.
+        (This is normally the default; see below.)
+    *   \ **id**\ =\ *id*:
+        Select the element with the specified @id attribute.
+    *   \ **name**\ =\ *name*:
+        Select the first element with the specified @name attribute.
+        
+        *   username
+        *   name=username
+        
+        
+        The name may optionally be followed by one or more \ *element-filters*, separated from the name by whitespace.  If the \ *filterType* is not specified, \ **value**\  is assumed.
+        
+        *   name=flavour value=chocolate
+        
+        
+    *   \ **dom**\ =\ *javascriptExpression*: 
+        
+        Find an element by evaluating the specified string.  This allows you to traverse the HTML Document Object
+        Model using JavaScript.  Note that you must not return a value in this string; simply make it the last expression in the block.
+        
+        *   dom=document.forms['myForm'].myDropdown
+        *   dom=document.images[56]
+        *   dom=function foo() { return document.links[1]; }; foo();
+        
+        
+    *   \ **xpath**\ =\ *xpathExpression*: 
+        Locate an element using an XPath expression.
+        
+        *   xpath=//img[@alt='The image alt text']
+        *   xpath=//table[@id='table1']//tr[4]/td[2]
+        *   xpath=//a[contains(@href,'#id1')]
+        *   xpath=//a[contains(@href,'#id1')]/@class
+        *   xpath=(//table[@class='stylee'])//th[text()='theHeaderText']/../td
+        *   xpath=//input[@name='name2' and @value='yes']
+        *   xpath=//\*[text()="right"]
+        
+        
+    *   \ **link**\ =\ *textPattern*:
+        Select the link (anchor) element which contains text matching the
+        specified \ *pattern*.
+        
+        *   link=The link text
+        
+        
+    *   \ **css**\ =\ *cssSelectorSyntax*:
+        Select the element using css selectors. Please refer to CSS2 selectors, CSS3 selectors for more information. You can also check the TestCssLocators test in the selenium test suite for an example of usage, which is included in the downloaded selenium core package.
+        
+        *   css=a[href="#id3"]
+        *   css=span#firstChild + span
+        
+        
+        Currently the css selector locator supports all css1, css2 and css3 selectors except namespace in css3, some pseudo classes(:nth-of-type, :nth-last-of-type, :first-of-type, :last-of-type, :only-of-type, :visited, :hover, :active, :focus, :indeterminate) and pseudo elements(::first-line, ::first-letter, ::selection, ::before, ::after). 
+        
+    
+    
+    
+    Without an explicit locator prefix, Selenium uses the following default
+    strategies:
+    
+    
+    *   \ **dom**\ , for locators starting with "document."
+    *   \ **xpath**\ , for locators starting with "//"
+    *   \ **identifier**\ , otherwise
+    
+    Element Filters
+    ~~~~~~~~~~~~~~~
+    
+    Element filters can be used with a locator to refine a list of candidate elements.  They are currently used only in the 'name' element-locator.
+    
+    Filters look much like locators, ie.
+    
+    \ *filterType*\ **=**\ \ *argument*
+    
+    Supported element-filters are:
+    
+    \ **value=**\ \ *valuePattern*
+    
+    
+    Matches elements based on their values.  This is particularly useful for refining a list of similarly-named toggle-buttons.
+    
+    \ **index=**\ \ *index*
+    
+    
+    Selects a single element based on its position in the list (offset from zero).
+    
+    String-match Patterns
+    ~~~~~~~~~~~~~~~~~~~~~
+    
+    Various Pattern syntaxes are available for matching string values:
+    
+    
+    *   \ **glob:**\ \ *pattern*:
+        Match a string against a "glob" (aka "wildmat") pattern. "Glob" is a
+        kind of limited regular-expression syntax typically used in command-line
+        shells. In a glob pattern, "\*" represents any sequence of characters, and "?"
+        represents any single character. Glob patterns match against the entire
+        string.
+    *   \ **regexp:**\ \ *regexp*:
+        Match a string using a regular-expression. The full power of JavaScript
+        regular-expressions is available.
+    *   \ **regexpi:**\ \ *regexpi*:
+        Match a string using a case-insensitive regular-expression.
+    *   \ **exact:**\ \ *string*:
+        
+        Match a string exactly, verbatim, without any of that fancy wildcard
+        stuff.
+    
+    
+    
+    If no pattern prefix is specified, Selenium assumes that it's a "glob"
+    pattern.
+    
+    
+    
+    For commands that return multiple values (such as verifySelectOptions),
+    the string being matched is a comma-separated list of the return values,
+    where both commas and backslashes in the values are backslash-escaped.
+    When providing a pattern, the optional matching syntax (i.e. glob,
+    regexp, etc.) is specified once, as usual, at the beginning of the
+    pattern.
+    
+    
+    """
+
+### This part is hard-coded in the XSL
+    def __init__(self, host, port, browserStartCommand, browserURL):
+        self.host = host
+        self.port = port
+        self.browserStartCommand = browserStartCommand
+        self.browserURL = browserURL
+        self.sessionId = None
+
+    def start(self):
+        result = self.get_string("getNewBrowserSession", [self.browserStartCommand, self.browserURL])
+        try:
+            self.sessionId = result
+        except ValueError:
+            raise Exception, result
+        
+    def stop(self):
+        self.do_command("testComplete", [])
+        self.sessionId = None
+
+    def do_command(self, verb, args):
+        conn = httplib.HTTPConnection(self.host, self.port)
+        commandString = u'/selenium-server/driver/?cmd=' + urllib.quote_plus(unicode(verb).encode('utf-8'))
+        for i in range(len(args)):
+            commandString = commandString + '&' + unicode(i+1) + '=' + urllib.quote_plus(unicode(args[i]).encode('utf-8'))
+        if (None != self.sessionId):
+            commandString = commandString + "&sessionId=" + unicode(self.sessionId)
+        conn.request("GET", commandString)
+    
+        response = conn.getresponse()
+        #print response.status, response.reason
+        data = unicode(response.read(), "UTF-8")
+        result = response.reason
+        #print "Selenium Result: " + repr(data) + "\n\n"
+        if (not data.startswith('OK')):
+            raise Exception, data
+        return data
+    
+    def get_string(self, verb, args):
+        result = self.do_command(verb, args)
+        return result[3:]
+    
+    def get_string_array(self, verb, args):
+        csv = self.get_string(verb, args)
+        token = ""
+        tokens = []
+        escape = False
+        for i in range(len(csv)):
+            letter = csv[i]
+            if (escape):
+                token = token + letter
+                escape = False
+                continue
+            if (letter == '\\'):
+                escape = True
+            elif (letter == ','):
+                tokens.append(token)
+                token = ""
+            else:
+                token = token + letter
+        tokens.append(token)
+        return tokens
+
+    def get_number(self, verb, args):
+        # Is there something I need to do here?
+        return self.get_string(verb, args)
+    
+    def get_number_array(self, verb, args):
+        # Is there something I need to do here?
+        return self.get_string_array(verb, args)
+
+    def get_boolean(self, verb, args):
+        boolstr = self.get_string(verb, args)
+        if ("true" == boolstr):
+            return True
+        if ("false" == boolstr):
+            return False
+        raise ValueError, "result is neither 'true' nor 'false': " + boolstr
+    
+    def get_boolean_array(self, verb, args):
+        boolarr = self.get_string_array(verb, args)
+        for i in range(len(boolarr)):
+            if ("true" == boolstr):
+                boolarr[i] = True
+                continue
+            if ("false" == boolstr):
+                boolarr[i] = False
+                continue
+            raise ValueError, "result is neither 'true' nor 'false': " + boolarr[i]
+        return boolarr
+    
+    
+
+### From here on, everything's auto-generated from XML
+
+
+    def click(self,locator):
+        """
+        Clicks on a link, button, checkbox or radio button. If the click action
+        causes a new page to load (like a link usually does), call
+        waitForPageToLoad.
+        
+        'locator' is an element locator
+        """
+        self.do_command("click", [locator,])
+
+
+    def double_click(self,locator):
+        """
+        Double clicks on a link, button, checkbox or radio button. If the double click action
+        causes a new page to load (like a link usually does), call
+        waitForPageToLoad.
+        
+        'locator' is an element locator
+        """
+        self.do_command("doubleClick", [locator,])
+
+
+    def context_menu(self,locator):
+        """
+        Simulates opening the context menu for the specified element (as might happen if the user "right-clicked" on the element).
+        
+        'locator' is an element locator
+        """
+        self.do_command("contextMenu", [locator,])
+
+
+    def click_at(self,locator,coordString):
+        """
+        Clicks on a link, button, checkbox or radio button. If the click action
+        causes a new page to load (like a link usually does), call
+        waitForPageToLoad.
+        
+        'locator' is an element locator
+        'coordString' is specifies the x,y position (i.e. - 10,20) of the mouse      event relative to the element returned by the locator.
+        """
+        self.do_command("clickAt", [locator,coordString,])
+
+
+    def double_click_at(self,locator,coordString):
+        """
+        Doubleclicks on a link, button, checkbox or radio button. If the action
+        causes a new page to load (like a link usually does), call
+        waitForPageToLoad.
+        
+        'locator' is an element locator
+        'coordString' is specifies the x,y position (i.e. - 10,20) of the mouse      event relative to the element returned by the locator.
+        """
+        self.do_command("doubleClickAt", [locator,coordString,])
+
+
+    def context_menu_at(self,locator,coordString):
+        """
+        Simulates opening the context menu for the specified element (as might happen if the user "right-clicked" on the element).
+        
+        'locator' is an element locator
+        'coordString' is specifies the x,y position (i.e. - 10,20) of the mouse      event relative to the element returned by the locator.
+        """
+        self.do_command("contextMenuAt", [locator,coordString,])
+
+
+    def fire_event(self,locator,eventName):
+        """
+        Explicitly simulate an event, to trigger the corresponding "on\ *event*"
+        handler.
+        
+        'locator' is an element locator
+        'eventName' is the event name, e.g. "focus" or "blur"
+        """
+        self.do_command("fireEvent", [locator,eventName,])
+
+
+    def focus(self,locator):
+        """
+        Move the focus to the specified element; for example, if the element is an input field, move the cursor to that field.
+        
+        'locator' is an element locator
+        """
+        self.do_command("focus", [locator,])
+
+
+    def key_press(self,locator,keySequence):
+        """
+        Simulates a user pressing and releasing a key.
+        
+        'locator' is an element locator
+        'keySequence' is Either be a string("\" followed by the numeric keycode  of the key to be pressed, normally the ASCII value of that key), or a single  character. For example: "w", "\119".
+        """
+        self.do_command("keyPress", [locator,keySequence,])
+
+
+    def shift_key_down(self):
+        """
+        Press the shift key and hold it down until doShiftUp() is called or a new page is loaded.
+        
+        """
+        self.do_command("shiftKeyDown", [])
+
+
+    def shift_key_up(self):
+        """
+        Release the shift key.
+        
+        """
+        self.do_command("shiftKeyUp", [])
+
+
+    def meta_key_down(self):
+        """
+        Press the meta key and hold it down until doMetaUp() is called or a new page is loaded.
+        
+        """
+        self.do_command("metaKeyDown", [])
+
+
+    def meta_key_up(self):
+        """
+        Release the meta key.
+        
+        """
+        self.do_command("metaKeyUp", [])
+
+
+    def alt_key_down(self):
+        """
+        Press the alt key and hold it down until doAltUp() is called or a new page is loaded.
+        
+        """
+        self.do_command("altKeyDown", [])
+
+
+    def alt_key_up(self):
+        """
+        Release the alt key.
+        
+        """
+        self.do_command("altKeyUp", [])
+
+
+    def control_key_down(self):
+        """
+        Press the control key and hold it down until doControlUp() is called or a new page is loaded.
+        
+        """
+        self.do_command("controlKeyDown", [])
+
+
+    def control_key_up(self):
+        """
+        Release the control key.
+        
+        """
+        self.do_command("controlKeyUp", [])
+
+
+    def key_down(self,locator,keySequence):
+        """
+        Simulates a user pressing a key (without releasing it yet).
+        
+        'locator' is an element locator
+        'keySequence' is Either be a string("\" followed by the numeric keycode  of the key to be pressed, normally the ASCII value of that key), or a single  character. For example: "w", "\119".
+        """
+        self.do_command("keyDown", [locator,keySequence,])
+
+
+    def key_up(self,locator,keySequence):
+        """
+        Simulates a user releasing a key.
+        
+        'locator' is an element locator
+        'keySequence' is Either be a string("\" followed by the numeric keycode  of the key to be pressed, normally the ASCII value of that key), or a single  character. For example: "w", "\119".
+        """
+        self.do_command("keyUp", [locator,keySequence,])
+
+
+    def mouse_over(self,locator):
+        """
+        Simulates a user hovering a mouse over the specified element.
+        
+        'locator' is an element locator
+        """
+        self.do_command("mouseOver", [locator,])
+
+
+    def mouse_out(self,locator):
+        """
+        Simulates a user moving the mouse pointer away from the specified element.
+        
+        'locator' is an element locator
+        """
+        self.do_command("mouseOut", [locator,])
+
+
+    def mouse_down(self,locator):
+        """
+        Simulates a user pressing the mouse button (without releasing it yet) on
+        the specified element.
+        
+        'locator' is an element locator
+        """
+        self.do_command("mouseDown", [locator,])
+
+
+    def mouse_down_at(self,locator,coordString):
+        """
+        Simulates a user pressing the mouse button (without releasing it yet) at
+        the specified location.
+        
+        'locator' is an element locator
+        'coordString' is specifies the x,y position (i.e. - 10,20) of the mouse      event relative to the element returned by the locator.
+        """
+        self.do_command("mouseDownAt", [locator,coordString,])
+
+
+    def mouse_up(self,locator):
+        """
+        Simulates the event that occurs when the user releases the mouse button (i.e., stops
+        holding the button down) on the specified element.
+        
+        'locator' is an element locator
+        """
+        self.do_command("mouseUp", [locator,])
+
+
+    def mouse_up_at(self,locator,coordString):
+        """
+        Simulates the event that occurs when the user releases the mouse button (i.e., stops
+        holding the button down) at the specified location.
+        
+        'locator' is an element locator
+        'coordString' is specifies the x,y position (i.e. - 10,20) of the mouse      event relative to the element returned by the locator.
+        """
+        self.do_command("mouseUpAt", [locator,coordString,])
+
+
+    def mouse_move(self,locator):
+        """
+        Simulates a user pressing the mouse button (without releasing it yet) on
+        the specified element.
+        
+        'locator' is an element locator
+        """
+        self.do_command("mouseMove", [locator,])
+
+
+    def mouse_move_at(self,locator,coordString):
+        """
+        Simulates a user pressing the mouse button (without releasing it yet) on
+        the specified element.
+        
+        'locator' is an element locator
+        'coordString' is specifies the x,y position (i.e. - 10,20) of the mouse      event relative to the element returned by the locator.
+        """
+        self.do_command("mouseMoveAt", [locator,coordString,])
+
+
+    def type(self,locator,value):
+        """
+        Sets the value of an input field, as though you typed it in.
+        
+        
+        Can also be used to set the value of combo boxes, check boxes, etc. In these cases,
+        value should be the value of the option selected, not the visible text.
+        
+        
+        'locator' is an element locator
+        'value' is the value to type
+        """
+        self.do_command("type", [locator,value,])
+
+
+    def type_keys(self,locator,value):
+        """
+        Simulates keystroke events on the specified element, as though you typed the value key-by-key.
+        
+        
+        This is a convenience method for calling keyDown, keyUp, keyPress for every character in the specified string;
+        this is useful for dynamic UI widgets (like auto-completing combo boxes) that require explicit key events.
+        
+        Unlike the simple "type" command, which forces the specified value into the page directly, this command
+        may or may not have any visible effect, even in cases where typing keys would normally have a visible effect.
+        For example, if you use "typeKeys" on a form element, you may or may not see the results of what you typed in
+        the field.
+        
+        In some cases, you may need to use the simple "type" command to set the value of the field and then the "typeKeys" command to
+        send the keystroke events corresponding to what you just typed.
+        
+        
+        'locator' is an element locator
+        'value' is the value to type
+        """
+        self.do_command("typeKeys", [locator,value,])
+
+
+    def set_speed(self,value):
+        """
+        Set execution speed (i.e., set the millisecond length of a delay which will follow each selenium operation).  By default, there is no such delay, i.e.,
+        the delay is 0 milliseconds.
+        
+        'value' is the number of milliseconds to pause after operation
+        """
+        self.do_command("setSpeed", [value,])
+
+
+    def get_speed(self):
+        """
+        Get execution speed (i.e., get the millisecond length of the delay following each selenium operation).  By default, there is no such delay, i.e.,
+        the delay is 0 milliseconds.
+        
+        See also setSpeed.
+        
+        """
+        return self.get_string("getSpeed", [])
+
+
+    def check(self,locator):
+        """
+        Check a toggle-button (checkbox/radio)
+        
+        'locator' is an element locator
+        """
+        self.do_command("check", [locator,])
+
+
+    def uncheck(self,locator):
+        """
+        Uncheck a toggle-button (checkbox/radio)
+        
+        'locator' is an element locator
+        """
+        self.do_command("uncheck", [locator,])
+
+
+    def select(self,selectLocator,optionLocator):
+        """
+        Select an option from a drop-down using an option locator.
+        
+        
+        
+        Option locators provide different ways of specifying options of an HTML
+        Select element (e.g. for selecting a specific option, or for asserting
+        that the selected option satisfies a specification). There are several
+        forms of Select Option Locator.
+        
+        
+        *   \ **label**\ =\ *labelPattern*:
+            matches options based on their labels, i.e. the visible text. (This
+            is the default.)
+            
+            *   label=regexp:^[Oo]ther
+            
+            
+        *   \ **value**\ =\ *valuePattern*:
+            matches options based on their values.
+            
+            *   value=other
+            
+            
+        *   \ **id**\ =\ *id*:
+            
+            matches options based on their ids.
+            
+            *   id=option1
+            
+            
+        *   \ **index**\ =\ *index*:
+            matches an option based on its index (offset from zero).
+            
+            *   index=2
+            
+            
+        
+        
+        
+        If no option locator prefix is provided, the default behaviour is to match on \ **label**\ .
+        
+        
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        'optionLocator' is an option locator (a label by default)
+        """
+        self.do_command("select", [selectLocator,optionLocator,])
+
+
+    def add_selection(self,locator,optionLocator):
+        """
+        Add a selection to the set of selected options in a multi-select element using an option locator.
+        
+        @see #doSelect for details of option locators
+        
+        'locator' is an element locator identifying a multi-select box
+        'optionLocator' is an option locator (a label by default)
+        """
+        self.do_command("addSelection", [locator,optionLocator,])
+
+
+    def remove_selection(self,locator,optionLocator):
+        """
+        Remove a selection from the set of selected options in a multi-select element using an option locator.
+        
+        @see #doSelect for details of option locators
+        
+        'locator' is an element locator identifying a multi-select box
+        'optionLocator' is an option locator (a label by default)
+        """
+        self.do_command("removeSelection", [locator,optionLocator,])
+
+
+    def remove_all_selections(self,locator):
+        """
+        Unselects all of the selected options in a multi-select element.
+        
+        'locator' is an element locator identifying a multi-select box
+        """
+        self.do_command("removeAllSelections", [locator,])
+
+
+    def submit(self,formLocator):
+        """
+        Submit the specified form. This is particularly useful for forms without
+        submit buttons, e.g. single-input "Search" forms.
+        
+        'formLocator' is an element locator for the form you want to submit
+        """
+        self.do_command("submit", [formLocator,])
+
+
+    def open(self,url):
+        """
+        Opens an URL in the test frame. This accepts both relative and absolute
+        URLs.
+        
+        The "open" command waits for the page to load before proceeding,
+        ie. the "AndWait" suffix is implicit.
+        
+        \ *Note*: The URL must be on the same domain as the runner HTML
+        due to security restrictions in the browser (Same Origin Policy). If you
+        need to open an URL on another domain, use the Selenium Server to start a
+        new browser session on that domain.
+        
+        'url' is the URL to open; may be relative or absolute
+        """
+        self.do_command("open", [url,])
+
+
+    def open_window(self,url,windowID):
+        """
+        Opens a popup window (if a window with that ID isn't already open).
+        After opening the window, you'll need to select it using the selectWindow
+        command.
+        
+        
+        This command can also be a useful workaround for bug SEL-339.  In some cases, Selenium will be unable to intercept a call to window.open (if the call occurs during or before the "onLoad" event, for example).
+        In those cases, you can force Selenium to notice the open window's name by using the Selenium openWindow command, using
+        an empty (blank) url, like this: openWindow("", "myFunnyWindow").
+        
+        
+        'url' is the URL to open, which can be blank
+        'windowID' is the JavaScript window ID of the window to select
+        """
+        self.do_command("openWindow", [url,windowID,])
+
+
+    def select_window(self,windowID):
+        """
+        Selects a popup window using a window locator; once a popup window has been selected, all
+        commands go to that window. To select the main window again, use null
+        as the target.
+        
+        
+        
+        
+        Window locators provide different ways of specifying the window object:
+        by title, by internal JavaScript "name," or by JavaScript variable.
+        
+        
+        *   \ **title**\ =\ *My Special Window*:
+            Finds the window using the text that appears in the title bar.  Be careful;
+            two windows can share the same title.  If that happens, this locator will
+            just pick one.
+            
+        *   \ **name**\ =\ *myWindow*:
+            Finds the window using its internal JavaScript "name" property.  This is the second 
+            parameter "windowName" passed to the JavaScript method window.open(url, windowName, windowFeatures, replaceFlag)
+            (which Selenium intercepts).
+            
+        *   \ **var**\ =\ *variableName*:
+            Some pop-up windows are unnamed (anonymous), but are associated with a JavaScript variable name in the current
+            application window, e.g. "window.foo = window.open(url);".  In those cases, you can open the window using
+            "var=foo".
+            
+        
+        
+        
+        If no window locator prefix is provided, we'll try to guess what you mean like this:
+        
+        1.) if windowID is null, (or the string "null") then it is assumed the user is referring to the original window instantiated by the browser).
+        
+        2.) if the value of the "windowID" parameter is a JavaScript variable name in the current application window, then it is assumed
+        that this variable contains the return value from a call to the JavaScript window.open() method.
+        
+        3.) Otherwise, selenium looks in a hash it maintains that maps string names to window "names".
+        
+        4.) If \ *that* fails, we'll try looping over all of the known windows to try to find the appropriate "title".
+        Since "title" is not necessarily unique, this may have unexpected behavior.
+        
+        If you're having trouble figuring out the name of a window that you want to manipulate, look at the Selenium log messages
+        which identify the names of windows created via window.open (and therefore intercepted by Selenium).  You will see messages
+        like the following for each window as it is opened:
+        
+        ``debug: window.open call intercepted; window ID (which you can use with selectWindow()) is "myNewWindow"``
+        
+        In some cases, Selenium will be unable to intercept a call to window.open (if the call occurs during or before the "onLoad" event, for example).
+        (This is bug SEL-339.)  In those cases, you can force Selenium to notice the open window's name by using the Selenium openWindow command, using
+        an empty (blank) url, like this: openWindow("", "myFunnyWindow").
+        
+        
+        'windowID' is the JavaScript window ID of the window to select
+        """
+        self.do_command("selectWindow", [windowID,])
+
+
+    def select_frame(self,locator):
+        """
+        Selects a frame within the current window.  (You may invoke this command
+        multiple times to select nested frames.)  To select the parent frame, use
+        "relative=parent" as a locator; to select the top frame, use "relative=top".
+        You can also select a frame by its 0-based index number; select the first frame with
+        "index=0", or the third frame with "index=2".
+        
+        
+        You may also use a DOM expression to identify the frame you want directly,
+        like this: ``dom=frames["main"].frames["subframe"]``
+        
+        
+        'locator' is an element locator identifying a frame or iframe
+        """
+        self.do_command("selectFrame", [locator,])
+
+
+    def get_whether_this_frame_match_frame_expression(self,currentFrameString,target):
+        """
+        Determine whether current/locator identify the frame containing this running code.
+        
+        
+        This is useful in proxy injection mode, where this code runs in every
+        browser frame and window, and sometimes the selenium server needs to identify
+        the "current" frame.  In this case, when the test calls selectFrame, this
+        routine is called for each frame to figure out which one has been selected.
+        The selected frame will return true, while all others will return false.
+        
+        
+        'currentFrameString' is starting frame
+        'target' is new frame (which might be relative to the current one)
+        """
+        return self.get_boolean("getWhetherThisFrameMatchFrameExpression", [currentFrameString,target,])
+
+
+    def get_whether_this_window_match_window_expression(self,currentWindowString,target):
+        """
+        Determine whether currentWindowString plus target identify the window containing this running code.
+        
+        
+        This is useful in proxy injection mode, where this code runs in every
+        browser frame and window, and sometimes the selenium server needs to identify
+        the "current" window.  In this case, when the test calls selectWindow, this
+        routine is called for each window to figure out which one has been selected.
+        The selected window will return true, while all others will return false.
+        
+        
+        'currentWindowString' is starting window
+        'target' is new window (which might be relative to the current one, e.g., "_parent")
+        """
+        return self.get_boolean("getWhetherThisWindowMatchWindowExpression", [currentWindowString,target,])
+
+
+    def wait_for_pop_up(self,windowID,timeout):
+        """
+        Waits for a popup window to appear and load up.
+        
+        'windowID' is the JavaScript window "name" of the window that will appear (not the text of the title bar)
+        'timeout' is a timeout in milliseconds, after which the action will return with an error
+        """
+        self.do_command("waitForPopUp", [windowID,timeout,])
+
+
+    def choose_cancel_on_next_confirmation(self):
+        """
+        By default, Selenium's overridden window.confirm() function will
+        return true, as if the user had manually clicked OK; after running
+        this command, the next call to confirm() will return false, as if
+        the user had clicked Cancel.  Selenium will then resume using the
+        default behavior for future confirmations, automatically returning 
+        true (OK) unless/until you explicitly call this command for each
+        confirmation.
+        
+        """
+        self.do_command("chooseCancelOnNextConfirmation", [])
+
+
+    def choose_ok_on_next_confirmation(self):
+        """
+        Undo the effect of calling chooseCancelOnNextConfirmation.  Note
+        that Selenium's overridden window.confirm() function will normally automatically
+        return true, as if the user had manually clicked OK, so you shouldn't
+        need to use this command unless for some reason you need to change
+        your mind prior to the next confirmation.  After any confirmation, Selenium will resume using the
+        default behavior for future confirmations, automatically returning 
+        true (OK) unless/until you explicitly call chooseCancelOnNextConfirmation for each
+        confirmation.
+        
+        """
+        self.do_command("chooseOkOnNextConfirmation", [])
+
+
+    def answer_on_next_prompt(self,answer):
+        """
+        Instructs Selenium to return the specified answer string in response to
+        the next JavaScript prompt [window.prompt()].
+        
+        'answer' is the answer to give in response to the prompt pop-up
+        """
+        self.do_command("answerOnNextPrompt", [answer,])
+
+
+    def go_back(self):
+        """
+        Simulates the user clicking the "back" button on their browser.
+        
+        """
+        self.do_command("goBack", [])
+
+
+    def refresh(self):
+        """
+        Simulates the user clicking the "Refresh" button on their browser.
+        
+        """
+        self.do_command("refresh", [])
+
+
+    def close(self):
+        """
+        Simulates the user clicking the "close" button in the titlebar of a popup
+        window or tab.
+        
+        """
+        self.do_command("close", [])
+
+
+    def is_alert_present(self):
+        """
+        Has an alert occurred?
+        
+        
+        
+        This function never throws an exception
+        
+        
+        
+        """
+        return self.get_boolean("isAlertPresent", [])
+
+
+    def is_prompt_present(self):
+        """
+        Has a prompt occurred?
+        
+        
+        
+        This function never throws an exception
+        
+        
+        
+        """
+        return self.get_boolean("isPromptPresent", [])
+
+
+    def is_confirmation_present(self):
+        """
+        Has confirm() been called?
+        
+        
+        
+        This function never throws an exception
+        
+        
+        
+        """
+        return self.get_boolean("isConfirmationPresent", [])
+
+
+    def get_alert(self):
+        """
+        Retrieves the message of a JavaScript alert generated during the previous action, or fail if there were no alerts.
+        
+        
+        Getting an alert has the same effect as manually clicking OK. If an
+        alert is generated but you do not get/verify it, the next Selenium action
+        will fail.
+        
+        NOTE: under Selenium, JavaScript alerts will NOT pop up a visible alert
+        dialog.
+        
+        NOTE: Selenium does NOT support JavaScript alerts that are generated in a
+        page's onload() event handler. In this case a visible dialog WILL be
+        generated and Selenium will hang until someone manually clicks OK.
+        
+        
+        """
+        return self.get_string("getAlert", [])
+
+
+    def get_confirmation(self):
+        """
+        Retrieves the message of a JavaScript confirmation dialog generated during
+        the previous action.
+        
+        
+        
+        By default, the confirm function will return true, having the same effect
+        as manually clicking OK. This can be changed by prior execution of the
+        chooseCancelOnNextConfirmation command. If an confirmation is generated
+        but you do not get/verify it, the next Selenium action will fail.
+        
+        
+        
+        NOTE: under Selenium, JavaScript confirmations will NOT pop up a visible
+        dialog.
+        
+        
+        
+        NOTE: Selenium does NOT support JavaScript confirmations that are
+        generated in a page's onload() event handler. In this case a visible
+        dialog WILL be generated and Selenium will hang until you manually click
+        OK.
+        
+        
+        
+        """
+        return self.get_string("getConfirmation", [])
+
+
+    def get_prompt(self):
+        """
+        Retrieves the message of a JavaScript question prompt dialog generated during
+        the previous action.
+        
+        
+        Successful handling of the prompt requires prior execution of the
+        answerOnNextPrompt command. If a prompt is generated but you
+        do not get/verify it, the next Selenium action will fail.
+        
+        NOTE: under Selenium, JavaScript prompts will NOT pop up a visible
+        dialog.
+        
+        NOTE: Selenium does NOT support JavaScript prompts that are generated in a
+        page's onload() event handler. In this case a visible dialog WILL be
+        generated and Selenium will hang until someone manually clicks OK.
+        
+        
+        """
+        return self.get_string("getPrompt", [])
+
+
+    def get_location(self):
+        """
+        Gets the absolute URL of the current page.
+        
+        """
+        return self.get_string("getLocation", [])
+
+
+    def get_title(self):
+        """
+        Gets the title of the current page.
+        
+        """
+        return self.get_string("getTitle", [])
+
+
+    def get_body_text(self):
+        """
+        Gets the entire text of the page.
+        
+        """
+        return self.get_string("getBodyText", [])
+
+
+    def get_value(self,locator):
+        """
+        Gets the (whitespace-trimmed) value of an input field (or anything else with a value parameter).
+        For checkbox/radio elements, the value will be "on" or "off" depending on
+        whether the element is checked or not.
+        
+        'locator' is an element locator
+        """
+        return self.get_string("getValue", [locator,])
+
+
+    def get_text(self,locator):
+        """
+        Gets the text of an element. This works for any element that contains
+        text. This command uses either the textContent (Mozilla-like browsers) or
+        the innerText (IE-like browsers) of the element, which is the rendered
+        text shown to the user.
+        
+        'locator' is an element locator
+        """
+        return self.get_string("getText", [locator,])
+
+
+    def highlight(self,locator):
+        """
+        Briefly changes the backgroundColor of the specified element yellow.  Useful for debugging.
+        
+        'locator' is an element locator
+        """
+        self.do_command("highlight", [locator,])
+
+
+    def get_eval(self,script):
+        """
+        Gets the result of evaluating the specified JavaScript snippet.  The snippet may
+        have multiple lines, but only the result of the last line will be returned.
+        
+        
+        Note that, by default, the snippet will run in the context of the "selenium"
+        object itself, so ``this`` will refer to the Selenium object.  Use ``window`` to
+        refer to the window of your application, e.g. ``window.document.getElementById('foo')``
+        
+        If you need to use
+        a locator to refer to a single element in your application page, you can
+        use ``this.browserbot.findElement("id=foo")`` where "id=foo" is your locator.
+        
+        
+        'script' is the JavaScript snippet to run
+        """
+        return self.get_string("getEval", [script,])
+
+
+    def is_checked(self,locator):
+        """
+        Gets whether a toggle-button (checkbox/radio) is checked.  Fails if the specified element doesn't exist or isn't a toggle-button.
+        
+        'locator' is an element locator pointing to a checkbox or radio button
+        """
+        return self.get_boolean("isChecked", [locator,])
+
+
+    def get_table(self,tableCellAddress):
+        """
+        Gets the text from a cell of a table. The cellAddress syntax
+        tableLocator.row.column, where row and column start at 0.
+        
+        'tableCellAddress' is a cell address, e.g. "foo.1.4"
+        """
+        return self.get_string("getTable", [tableCellAddress,])
+
+
+    def get_selected_labels(self,selectLocator):
+        """
+        Gets all option labels (visible text) for selected options in the specified select or multi-select element.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string_array("getSelectedLabels", [selectLocator,])
+
+
+    def get_selected_label(self,selectLocator):
+        """
+        Gets option label (visible text) for selected option in the specified select element.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string("getSelectedLabel", [selectLocator,])
+
+
+    def get_selected_values(self,selectLocator):
+        """
+        Gets all option values (value attributes) for selected options in the specified select or multi-select element.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string_array("getSelectedValues", [selectLocator,])
+
+
+    def get_selected_value(self,selectLocator):
+        """
+        Gets option value (value attribute) for selected option in the specified select element.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string("getSelectedValue", [selectLocator,])
+
+
+    def get_selected_indexes(self,selectLocator):
+        """
+        Gets all option indexes (option number, starting at 0) for selected options in the specified select or multi-select element.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string_array("getSelectedIndexes", [selectLocator,])
+
+
+    def get_selected_index(self,selectLocator):
+        """
+        Gets option index (option number, starting at 0) for selected option in the specified select element.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string("getSelectedIndex", [selectLocator,])
+
+
+    def get_selected_ids(self,selectLocator):
+        """
+        Gets all option element IDs for selected options in the specified select or multi-select element.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string_array("getSelectedIds", [selectLocator,])
+
+
+    def get_selected_id(self,selectLocator):
+        """
+        Gets option element ID for selected option in the specified select element.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string("getSelectedId", [selectLocator,])
+
+
+    def is_something_selected(self,selectLocator):
+        """
+        Determines whether some option in a drop-down menu is selected.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_boolean("isSomethingSelected", [selectLocator,])
+
+
+    def get_select_options(self,selectLocator):
+        """
+        Gets all option labels in the specified select drop-down.
+        
+        'selectLocator' is an element locator identifying a drop-down menu
+        """
+        return self.get_string_array("getSelectOptions", [selectLocator,])
+
+
+    def get_attribute(self,attributeLocator):
+        """
+        Gets the value of an element attribute. The value of the attribute may
+        differ across browsers (this is the case for the "style" attribute, for
+        example).
+        
+        'attributeLocator' is an element locator followed by an @ sign and then the name of the attribute, e.g. "foo at bar"
+        """
+        return self.get_string("getAttribute", [attributeLocator,])
+
+
+    def is_text_present(self,pattern):
+        """
+        Verifies that the specified text pattern appears somewhere on the rendered page shown to the user.
+        
+        'pattern' is a pattern to match with the text of the page
+        """
+        return self.get_boolean("isTextPresent", [pattern,])
+
+
+    def is_element_present(self,locator):
+        """
+        Verifies that the specified element is somewhere on the page.
+        
+        'locator' is an element locator
+        """
+        return self.get_boolean("isElementPresent", [locator,])
+
+
+    def is_visible(self,locator):
+        """
+        Determines if the specified element is visible. An
+        element can be rendered invisible by setting the CSS "visibility"
+        property to "hidden", or the "display" property to "none", either for the
+        element itself or one if its ancestors.  This method will fail if
+        the element is not present.
+        
+        'locator' is an element locator
+        """
+        return self.get_boolean("isVisible", [locator,])
+
+
+    def is_editable(self,locator):
+        """
+        Determines whether the specified input element is editable, ie hasn't been disabled.
+        This method will fail if the specified element isn't an input element.
+        
+        'locator' is an element locator
+        """
+        return self.get_boolean("isEditable", [locator,])
+
+
+    def get_all_buttons(self):
+        """
+        Returns the IDs of all buttons on the page.
+        
+        
+        If a given button has no ID, it will appear as "" in this array.
+        
+        
+        """
+        return self.get_string_array("getAllButtons", [])
+
+
+    def get_all_links(self):
+        """
+        Returns the IDs of all links on the page.
+        
+        
+        If a given link has no ID, it will appear as "" in this array.
+        
+        
+        """
+        return self.get_string_array("getAllLinks", [])
+
+
+    def get_all_fields(self):
+        """
+        Returns the IDs of all input fields on the page.
+        
+        
+        If a given field has no ID, it will appear as "" in this array.
+        
+        
+        """
+        return self.get_string_array("getAllFields", [])
+
+
+    def get_attribute_from_all_windows(self,attributeName):
+        """
+        Returns every instance of some attribute from all known windows.
+        
+        'attributeName' is name of an attribute on the windows
+        """
+        return self.get_string_array("getAttributeFromAllWindows", [attributeName,])
+
+
+    def dragdrop(self,locator,movementsString):
+        """
+        deprecated - use dragAndDrop instead
+        
+        'locator' is an element locator
+        'movementsString' is offset in pixels from the current location to which the element should be moved, e.g., "+70,-300"
+        """
+        self.do_command("dragdrop", [locator,movementsString,])
+
+
+    def set_mouse_speed(self,pixels):
+        """
+        Configure the number of pixels between "mousemove" events during dragAndDrop commands (default=10).
+        
+        Setting this value to 0 means that we'll send a "mousemove" event to every single pixel
+        in between the start location and the end location; that can be very slow, and may
+        cause some browsers to force the JavaScript to timeout.
+        
+        If the mouse speed is greater than the distance between the two dragged objects, we'll
+        just send one "mousemove" at the start location and then one final one at the end location.
+        
+        
+        'pixels' is the number of pixels between "mousemove" events
+        """
+        self.do_command("setMouseSpeed", [pixels,])
+
+
+    def get_mouse_speed(self):
+        """
+        Returns the number of pixels between "mousemove" events during dragAndDrop commands (default=10).
+        
+        """
+        return self.get_number("getMouseSpeed", [])
+
+
+    def drag_and_drop(self,locator,movementsString):
+        """
+        Drags an element a certain distance and then drops it
+        
+        'locator' is an element locator
+        'movementsString' is offset in pixels from the current location to which the element should be moved, e.g., "+70,-300"
+        """
+        self.do_command("dragAndDrop", [locator,movementsString,])
+
+
+    def drag_and_drop_to_object(self,locatorOfObjectToBeDragged,locatorOfDragDestinationObject):
+        """
+        Drags an element and drops it on another element
+        
+        'locatorOfObjectToBeDragged' is an element to be dragged
+        'locatorOfDragDestinationObject' is an element whose location (i.e., whose center-most pixel) will be the point where locatorOfObjectToBeDragged  is dropped
+        """
+        self.do_command("dragAndDropToObject", [locatorOfObjectToBeDragged,locatorOfDragDestinationObject,])
+
+
+    def window_focus(self):
+        """
+        Gives focus to the currently selected window
+        
+        """
+        self.do_command("windowFocus", [])
+
+
+    def window_maximize(self):
+        """
+        Resize currently selected window to take up the entire screen
+        
+        """
+        self.do_command("windowMaximize", [])
+
+
+    def get_all_window_ids(self):
+        """
+        Returns the IDs of all windows that the browser knows about.
+        
+        """
+        return self.get_string_array("getAllWindowIds", [])
+
+
+    def get_all_window_names(self):
+        """
+        Returns the names of all windows that the browser knows about.
+        
+        """
+        return self.get_string_array("getAllWindowNames", [])
+
+
+    def get_all_window_titles(self):
+        """
+        Returns the titles of all windows that the browser knows about.
+        
+        """
+        return self.get_string_array("getAllWindowTitles", [])
+
+
+    def get_html_source(self):
+        """
+        Returns the entire HTML source between the opening and
+        closing "html" tags.
+        
+        """
+        return self.get_string("getHtmlSource", [])
+
+
+    def set_cursor_position(self,locator,position):
+        """
+        Moves the text cursor to the specified position in the given input element or textarea.
+        This method will fail if the specified element isn't an input element or textarea.
+        
+        'locator' is an element locator pointing to an input element or textarea
+        'position' is the numerical position of the cursor in the field; position should be 0 to move the position to the beginning of the field.  You can also set the cursor to -1 to move it to the end of the field.
+        """
+        self.do_command("setCursorPosition", [locator,position,])
+
+
+    def get_element_index(self,locator):
+        """
+        Get the relative index of an element to its parent (starting from 0). The comment node and empty text node
+        will be ignored.
+        
+        'locator' is an element locator pointing to an element
+        """
+        return self.get_number("getElementIndex", [locator,])
+
+
+    def is_ordered(self,locator1,locator2):
+        """
+        Check if these two elements have same parent and are ordered siblings in the DOM. Two same elements will
+        not be considered ordered.
+        
+        'locator1' is an element locator pointing to the first element
+        'locator2' is an element locator pointing to the second element
+        """
+        return self.get_boolean("isOrdered", [locator1,locator2,])
+
+
+    def get_element_position_left(self,locator):
+        """
+        Retrieves the horizontal position of an element
+        
+        'locator' is an element locator pointing to an element OR an element itself
+        """
+        return self.get_number("getElementPositionLeft", [locator,])
+
+
+    def get_element_position_top(self,locator):
+        """
+        Retrieves the vertical position of an element
+        
+        'locator' is an element locator pointing to an element OR an element itself
+        """
+        return self.get_number("getElementPositionTop", [locator,])
+
+
+    def get_element_width(self,locator):
+        """
+        Retrieves the width of an element
+        
+        'locator' is an element locator pointing to an element
+        """
+        return self.get_number("getElementWidth", [locator,])
+
+
+    def get_element_height(self,locator):
+        """
+        Retrieves the height of an element
+        
+        'locator' is an element locator pointing to an element
+        """
+        return self.get_number("getElementHeight", [locator,])
+
+
+    def get_cursor_position(self,locator):
+        """
+        Retrieves the text cursor position in the given input element or textarea; beware, this may not work perfectly on all browsers.
+        
+        
+        Specifically, if the cursor/selection has been cleared by JavaScript, this command will tend to
+        return the position of the last location of the cursor, even though the cursor is now gone from the page.  This is filed as SEL-243.
+        
+        This method will fail if the specified element isn't an input element or textarea, or there is no cursor in the element.
+        
+        'locator' is an element locator pointing to an input element or textarea
+        """
+        return self.get_number("getCursorPosition", [locator,])
+
+
+    def get_expression(self,expression):
+        """
+        Returns the specified expression.
+        
+        
+        This is useful because of JavaScript preprocessing.
+        It is used to generate commands like assertExpression and waitForExpression.
+        
+        
+        'expression' is the value to return
+        """
+        return self.get_string("getExpression", [expression,])
+
+
+    def get_xpath_count(self,xpath):
+        """
+        Returns the number of nodes that match the specified xpath, eg. "//table" would give
+        the number of tables.
+        
+        'xpath' is the xpath expression to evaluate. do NOT wrap this expression in a 'count()' function; we will do that for you.
+        """
+        return self.get_number("getXpathCount", [xpath,])
+
+
+    def assign_id(self,locator,identifier):
+        """
+        Temporarily sets the "id" attribute of the specified element, so you can locate it in the future
+        using its ID rather than a slow/complicated XPath.  This ID will disappear once the page is
+        reloaded.
+        
+        'locator' is an element locator pointing to an element
+        'identifier' is a string to be used as the ID of the specified element
+        """
+        self.do_command("assignId", [locator,identifier,])
+
+
+    def allow_native_xpath(self,allow):
+        """
+        Specifies whether Selenium should use the native in-browser implementation
+        of XPath (if any native version is available); if you pass "false" to
+        this function, we will always use our pure-JavaScript xpath library.
+        Using the pure-JS xpath library can improve the consistency of xpath
+        element locators between different browser vendors, but the pure-JS
+        version is much slower than the native implementations.
+        
+        'allow' is boolean, true means we'll prefer to use native XPath; false means we'll only use JS XPath
+        """
+        self.do_command("allowNativeXpath", [allow,])
+
+
+    def ignore_attributes_without_value(self,ignore):
+        """
+        Specifies whether Selenium will ignore xpath attributes that have no
+        value, i.e. are the empty string, when using the non-native xpath
+        evaluation engine. You'd want to do this for performance reasons in IE.
+        However, this could break certain xpaths, for example an xpath that looks
+        for an attribute whose value is NOT the empty string.
+        
+        The hope is that such xpaths are relatively rare, but the user should
+        have the option of using them. Note that this only influences xpath
+        evaluation when using the ajaxslt engine (i.e. not "javascript-xpath").
+        
+        'ignore' is boolean, true means we'll ignore attributes without value                        at the expense of xpath "correctness"; false means                        we'll sacrifice speed for correctness.
+        """
+        self.do_command("ignoreAttributesWithoutValue", [ignore,])
+
+
+    def wait_for_condition(self,script,timeout):
+        """
+        Runs the specified JavaScript snippet repeatedly until it evaluates to "true".
+        The snippet may have multiple lines, but only the result of the last line
+        will be considered.
+        
+        
+        Note that, by default, the snippet will be run in the runner's test window, not in the window
+        of your application.  To get the window of your application, you can use
+        the JavaScript snippet ``selenium.browserbot.getCurrentWindow()``, and then
+        run your JavaScript in there
+        
+        
+        'script' is the JavaScript snippet to run
+        'timeout' is a timeout in milliseconds, after which this command will return with an error
+        """
+        self.do_command("waitForCondition", [script,timeout,])
+
+
+    def set_timeout(self,timeout):
+        """
+        Specifies the amount of time that Selenium will wait for actions to complete.
+        
+        
+        Actions that require waiting include "open" and the "waitFor\*" actions.
+        
+        The default timeout is 30 seconds.
+        
+        'timeout' is a timeout in milliseconds, after which the action will return with an error
+        """
+        self.do_command("setTimeout", [timeout,])
+
+
+    def wait_for_page_to_load(self,timeout):
+        """
+        Waits for a new page to load.
+        
+        
+        You can use this command instead of the "AndWait" suffixes, "clickAndWait", "selectAndWait", "typeAndWait" etc.
+        (which are only available in the JS API).
+        
+        Selenium constantly keeps track of new pages loading, and sets a "newPageLoaded"
+        flag when it first notices a page load.  Running any other Selenium command after
+        turns the flag to false.  Hence, if you want to wait for a page to load, you must
+        wait immediately after a Selenium command that caused a page-load.
+        
+        
+        'timeout' is a timeout in milliseconds, after which this command will return with an error
+        """
+        self.do_command("waitForPageToLoad", [timeout,])
+
+
+    def wait_for_frame_to_load(self,frameAddress,timeout):
+        """
+        Waits for a new frame to load.
+        
+        
+        Selenium constantly keeps track of new pages and frames loading, 
+        and sets a "newPageLoaded" flag when it first notices a page load.
+        
+        
+        See waitForPageToLoad for more information.
+        
+        'frameAddress' is FrameAddress from the server side
+        'timeout' is a timeout in milliseconds, after which this command will return with an error
+        """
+        self.do_command("waitForFrameToLoad", [frameAddress,timeout,])
+
+
+    def get_cookie(self):
+        """
+        Return all cookies of the current page under test.
+        
+        """
+        return self.get_string("getCookie", [])
+
+
+    def get_cookie_by_name(self,name):
+        """
+        Returns the value of the cookie with the specified name, or throws an error if the cookie is not present.
+        
+        'name' is the name of the cookie
+        """
+        return self.get_string("getCookieByName", [name,])
+
+
+    def is_cookie_present(self,name):
+        """
+        Returns true if a cookie with the specified name is present, or false otherwise.
+        
+        'name' is the name of the cookie
+        """
+        return self.get_boolean("isCookiePresent", [name,])
+
+
+    def create_cookie(self,nameValuePair,optionsString):
+        """
+        Create a new cookie whose path and domain are same with those of current page
+        under test, unless you specified a path for this cookie explicitly.
+        
+        'nameValuePair' is name and value of the cookie in a format "name=value"
+        'optionsString' is options for the cookie. Currently supported options include 'path', 'max_age' and 'domain'.      the optionsString's format is "path=/path/, max_age=60, domain=.foo.com". The order of options are irrelevant, the unit      of the value of 'max_age' is second.  Note that specifying a domain that isn't a subset of the current domain will      usually fail.
+        """
+        self.do_command("createCookie", [nameValuePair,optionsString,])
+
+
+    def delete_cookie(self,name,optionsString):
+        """
+        Delete a named cookie with specified path and domain.  Be careful; to delete a cookie, you
+        need to delete it using the exact same path and domain that were used to create the cookie.
+        If the path is wrong, or the domain is wrong, the cookie simply won't be deleted.  Also
+        note that specifying a domain that isn't a subset of the current domain will usually fail.
+        
+        Since there's no way to discover at runtime the original path and domain of a given cookie,
+        we've added an option called 'recurse' to try all sub-domains of the current domain with
+        all paths that are a subset of the current path.  Beware; this option can be slow.  In
+        big-O notation, it operates in O(n\*m) time, where n is the number of dots in the domain
+        name and m is the number of slashes in the path.
+        
+        'name' is the name of the cookie to be deleted
+        'optionsString' is options for the cookie. Currently supported options include 'path', 'domain'      and 'recurse.' The optionsString's format is "path=/path/, domain=.foo.com, recurse=true".      The order of options are irrelevant. Note that specifying a domain that isn't a subset of      the current domain will usually fail.
+        """
+        self.do_command("deleteCookie", [name,optionsString,])
+
+
+    def delete_all_visible_cookies(self):
+        """
+        Calls deleteCookie with recurse=true on all cookies visible to the current page.
+        As noted on the documentation for deleteCookie, recurse=true can be much slower
+        than simply deleting the cookies using a known domain/path.
+        
+        """
+        self.do_command("deleteAllVisibleCookies", [])
+
+
+    def set_browser_log_level(self,logLevel):
+        """
+        Sets the threshold for browser-side logging messages; log messages beneath this threshold will be discarded.
+        Valid logLevel strings are: "debug", "info", "warn", "error" or "off".
+        To see the browser logs, you need to
+        either show the log window in GUI mode, or enable browser-side logging in Selenium RC.
+        
+        'logLevel' is one of the following: "debug", "info", "warn", "error" or "off"
+        """
+        self.do_command("setBrowserLogLevel", [logLevel,])
+
+
+    def run_script(self,script):
+        """
+        Creates a new "script" tag in the body of the current test window, and 
+        adds the specified text into the body of the command.  Scripts run in
+        this way can often be debugged more easily than scripts executed using
+        Selenium's "getEval" command.  Beware that JS exceptions thrown in these script
+        tags aren't managed by Selenium, so you should probably wrap your script
+        in try/catch blocks if there is any chance that the script will throw
+        an exception.
+        
+        'script' is the JavaScript snippet to run
+        """
+        self.do_command("runScript", [script,])
+
+
+    def add_location_strategy(self,strategyName,functionDefinition):
+        """
+        Defines a new function for Selenium to locate elements on the page.
+        For example,
+        if you define the strategy "foo", and someone runs click("foo=blah"), we'll
+        run your function, passing you the string "blah", and click on the element 
+        that your function
+        returns, or throw an "Element not found" error if your function returns null.
+        
+        We'll pass three arguments to your function:
+        
+        *   locator: the string the user passed in
+        *   inWindow: the currently selected window
+        *   inDocument: the currently selected document
+        
+        
+        The function must return null if the element can't be found.
+        
+        'strategyName' is the name of the strategy to define; this should use only   letters [a-zA-Z] with no spaces or other punctuation.
+        'functionDefinition' is a string defining the body of a function in JavaScript.   For example: ``return inDocument.getElementById(locator);``
+        """
+        self.do_command("addLocationStrategy", [strategyName,functionDefinition,])
+
+
+    def capture_entire_page_screenshot(self,filename):
+        """
+        Saves the entire contents of the current window canvas to a PNG file.
+        Currently this only works in Mozilla and when running in chrome mode.
+        Contrast this with the captureScreenshot command, which captures the
+        contents of the OS viewport (i.e. whatever is currently being displayed
+        on the monitor), and is implemented in the RC only. Implementation
+        mostly borrowed from the Screengrab! Firefox extension. Please see
+        http://www.screengrab.org for details.
+        
+        'filename' is the path to the file to persist the screenshot as. No                  filename extension will be appended by default.                  Directories will not be created if they do not exist,                    and an exception will be thrown, possibly by native                  code.
+        """
+        self.do_command("captureEntirePageScreenshot", [filename,])
+
+
+    def set_context(self,context):
+        """
+        Writes a message to the status bar and adds a note to the browser-side
+        log.
+        
+        'context' is the message to be sent to the browser
+        """
+        self.do_command("setContext", [context,])
+
+
+    def attach_file(self,fieldLocator,fileLocator):
+        """
+        Sets a file input (upload) field to the file listed in fileLocator
+        
+        'fieldLocator' is an element locator
+        'fileLocator' is a URL pointing to the specified file. Before the file  can be set in the input field (fieldLocator), Selenium RC may need to transfer the file    to the local machine before attaching the file in a web page form. This is common in selenium  grid configurations where the RC server driving the browser is not the same  machine that started the test.   Supported Browsers: Firefox ("\*chrome") only.
+        """
+        self.do_command("attachFile", [fieldLocator,fileLocator,])
+
+
+    def capture_screenshot(self,filename):
+        """
+        Captures a PNG screenshot to the specified file.
+        
+        'filename' is the absolute path to the file to be written, e.g. "c:\blah\screenshot.png"
+        """
+        self.do_command("captureScreenshot", [filename,])
+
+
+    def shut_down_selenium_server(self):
+        """
+        Kills the running Selenium Server and all browser sessions.  After you run this command, you will no longer be able to send
+        commands to the server; you can't remotely start the server once it has been stopped.  Normally
+        you should prefer to run the "stop" command, which terminates the current browser session, rather than 
+        shutting down the entire server.
+        
+        """
+        self.do_command("shutDownSeleniumServer", [])
+
+
+    def key_down_native(self,keycode):
+        """
+        Simulates a user pressing a key (without releasing it yet) by sending a native operating system keystroke.
+        This function uses the java.awt.Robot class to send a keystroke; this more accurately simulates typing
+        a key on the keyboard.  It does not honor settings from the shiftKeyDown, controlKeyDown, altKeyDown and
+        metaKeyDown commands, and does not target any particular HTML element.  To send a keystroke to a particular
+        element, focus on the element first before running this command.
+        
+        'keycode' is an integer keycode number corresponding to a java.awt.event.KeyEvent; note that Java keycodes are NOT the same thing as JavaScript keycodes!
+        """
+        self.do_command("keyDownNative", [keycode,])
+
+
+    def key_up_native(self,keycode):
+        """
+        Simulates a user releasing a key by sending a native operating system keystroke.
+        This function uses the java.awt.Robot class to send a keystroke; this more accurately simulates typing
+        a key on the keyboard.  It does not honor settings from the shiftKeyDown, controlKeyDown, altKeyDown and
+        metaKeyDown commands, and does not target any particular HTML element.  To send a keystroke to a particular
+        element, focus on the element first before running this command.
+        
+        'keycode' is an integer keycode number corresponding to a java.awt.event.KeyEvent; note that Java keycodes are NOT the same thing as JavaScript keycodes!
+        """
+        self.do_command("keyUpNative", [keycode,])
+
+
+    def key_press_native(self,keycode):
+        """
+        Simulates a user pressing and releasing a key by sending a native operating system keystroke.
+        This function uses the java.awt.Robot class to send a keystroke; this more accurately simulates typing
+        a key on the keyboard.  It does not honor settings from the shiftKeyDown, controlKeyDown, altKeyDown and
+        metaKeyDown commands, and does not target any particular HTML element.  To send a keystroke to a particular
+        element, focus on the element first before running this command.
+        
+        'keycode' is an integer keycode number corresponding to a java.awt.event.KeyEvent; note that Java keycodes are NOT the same thing as JavaScript keycodes!
+        """
+        self.do_command("keyPressNative", [keycode,])
+
diff --git a/tests/selenium/remotecontrol/setup.txt b/tests/selenium/remotecontrol/setup.txt
new file mode 100644
index 0000000..d349491
--- /dev/null
+++ b/tests/selenium/remotecontrol/setup.txt
@@ -0,0 +1,8 @@
+ * Install selenium remote control from the latest snapshot:
+
+   http://nexus.openqa.org/content/repositories/snapshots/org/seleniumhq/selenium/selenium-remote-control/1.0-SNAPSHOT/
+
+ * Run the server with java -jar selenium-server.jar
+ * Run the python script
+
+ 
diff --git a/tests/selenium/remotecontrol/test_ol.py b/tests/selenium/remotecontrol/test_ol.py
new file mode 100644
index 0000000..cb8ad98
--- /dev/null
+++ b/tests/selenium/remotecontrol/test_ol.py
@@ -0,0 +1,95 @@
+from selenium import selenium
+import time
+import sys
+from ConfigParser import ConfigParser
+
+MAX_TEST_LENGTH = 300
+if len(sys.argv) > 2: 
+    filename = sys.argv[2]
+else:
+    filename = "config.cfg"
+
+c = ConfigParser()
+c.read(filename)
+
+targets = {}
+
+server = c.get('config', 'server') 
+url= c.get('config', 'url')
+if c.has_option('config', 'timeout'):
+    MAX_TEST_LENGTH = int(c.get('config', 'timeout'))
+
+
+sections = c.sections()
+for s in sections:
+    if s == 'config':
+       continue
+    targets[s] = dict(c.items(s))
+    targets[s]['name'] = s
+
+if sys.argv[1] == "all":
+    browsers = list(targets.values())
+elif sys.argv[1] not in targets:
+    print "Invalid target"
+    sys.exit()
+else:    
+    browsers = [targets[sys.argv[1]]]
+
+keep_going = True
+
+if 1:
+    for b in browsers:
+        if not keep_going: 
+            continue
+
+        print "Running %s on %s" % (b['name'], b['host']) 
+        s = selenium(b['host'], 4444, "*%s" % b['browsercmd'], server)
+        s.start()
+        try:
+            s.open_window(url, "test_running")
+            time.sleep(2)
+            s.select_window("test_running")
+            time.sleep(2)
+            s.refresh()
+            
+            count = 0
+            while count == 0: 
+                count = int(s.get_eval("window.document.getElementById('testtable').getElementsByTagName('tr').length"))
+                time.sleep(5)
+                
+            ok = 0 
+            fail = 0
+            last_change = time.time()
+            while True:
+                new_ok = int(s.get_eval('window.Test.AnotherWay._g_ok_pages'))
+                new_fail = int(s.get_eval('window.Test.AnotherWay._g_fail_pages'))
+                if new_ok != ok or new_fail != fail:
+                    ok = new_ok
+                    fail = new_fail
+                    last_change = time.time()
+                    
+                if (ok + fail) >= count:
+                    break 
+                if time.time() - last_change > MAX_TEST_LENGTH:
+                    raise Exception("Failed: with %s okay and %s failed, ran out of time: %s is more than %s" % (ok, fail, (time.time() - last_change), MAX_TEST_LENGTH))      
+                time.sleep(10)
+            
+            if fail:
+                print "Failed: %s" % fail
+                html = s.get_eval("window.document.getElementById('results').innerHTML").encode("utf-8")
+                all_html = """<html>
+  <head>    
+    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
+  </head>
+  <body>%s</body></html>""" % html
+
+                f = open("fail.%s.%s.html" % (time.time(), b['name']), "w")
+                f.write(all_html)
+                f.close()
+        except KeyboardInterrupt, E:
+            keep_going = False
+            print "Stopped by keyboard interrupt"
+        except Exception, E:
+            print "Error: ", E
+        s.stop()
+
diff --git a/tests/speed/geometry.html b/tests/speed/geometry.html
new file mode 100644
index 0000000..bc2b488
--- /dev/null
+++ b/tests/speed/geometry.html
@@ -0,0 +1,43 @@
+<html>
+<script src="../../lib/OpenLayers.js"></script>
+<script>
+
+var test_data = {};
+
+function setup_test() {
+    if (test_data['polygon']) { return; }
+    var f = new OpenLayers.Format.WKT();
+    var list = f.read("POLYGON((-78.046875 5.9765625, -78.75 5.9765625, -79.453125 5.2734375, -79.453125 4.5703125, -80.15625 3.8671875, -80.15625 2.4609375, -80.15625 1.0546875, -80.15625 -1.0546875, -80.15625 -2.4609375, -80.15625 -3.8671875, -80.15625 -4.5703125, -80.15625 -5.2734375, -80.15625 -5.9765625, -80.15625 -6.6796875, -80.15625 -8.0859375, -80.15625 -8.7890625, -80.15625 -9.4921875, -80.15625 -10.8984375, -79.453125 -13.0078125, -78.046875 -13.7109375, -78.046875 -15.1171875 [...]
+    test_data['polygon'] = list.geometry;
+    var list = f.read("POLYGON((-125.15625 48.1640625, -125.859375 48.1640625, -125.859375 46.7578125, -125.15625 46.7578125, -124.453125 46.0546875, -123.75 46.0546875, -123.046875 46.0546875, -122.34375 46.0546875, -120.9375 46.0546875, -116.71875 46.7578125, -113.90625 46.7578125, -113.203125 46.7578125, -112.5 46.7578125, -111.796875 46.7578125, -111.09375 46.7578125, -110.390625 46.7578125, -109.6875 46.7578125, -106.875 46.7578125, -102.65625 46.7578125, -95.625 47.4609375, -91.406 [...]
+    test_data['miss_polygon'] = list.geometry;
+    var list = f.read("POLYGON((-32.34375 13.0078125, -33.046875 13.0078125, -33.75 13.0078125, -34.453125 13.0078125, -35.15625 13.0078125, -35.859375 13.0078125, -36.5625 13.0078125, -37.265625 13.0078125, -37.96875 13.0078125, -37.96875 12.3046875, -38.671875 12.3046875, -39.375 12.3046875, -40.078125 12.3046875, -40.078125 11.6015625, -41.484375 11.6015625, -42.890625 10.8984375, -43.59375 10.8984375, -44.296875 10.1953125, -44.296875 9.4921875, -44.296875 8.7890625, -44.296875 8.085 [...]
+    test_data['hit_polygon'] = list.geometry; 
+
+}
+
+function run_test() { 
+    test_data['polygon'].intersects(test_data['hit_polygon']);
+    test_data['polygon'].intersects(test_data['miss_polygon']);
+}
+
+function run_many(x) {
+    var elapsed = 0;  
+    for (var i = 0; i < x; i++) {
+        var time = new Date();
+        run_test();
+        elapsed += (new Date() - time);
+    }
+    return elapsed;
+}
+
+function print_results(x) {
+    var t = run_many(x);
+    document.getElementById("out").innerHTML += (t +"ms to run " + x + " times<br />");  
+}
+    setup_test()
+</script>
+<body>   
+<input type="submit" value="Run" onclick="print_results(5)" /> 
+<div id="out"></div> 
+</body>
diff --git a/tests/speed/string_format.html b/tests/speed/string_format.html
new file mode 100644
index 0000000..39146b7
--- /dev/null
+++ b/tests/speed/string_format.html
@@ -0,0 +1,29 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+<script>
+
+function stringformat() {
+  var string = OpenLayers.String.format("${abc} 123 ${def}", {'abc': 456, 'def': 789}) 
+}    
+function run(x) {
+    var date = new Date();
+    for (var i = 0; i < x; i++) {
+        stringformat();
+    }
+    var elapsed = (new Date() - date);
+    return elapsed;
+}
+
+function show_time(x) 
+{
+    var t = run(x);
+    document.getElementById("out").innerHTML = t + "ms  for " + x + " runs";
+}
+</script>
+</head>
+<body>
+<a onclick="javascript:show_time(100000); return false" href="#">Run</a>
+<div id="out"></div>
+</body>
+</html>
diff --git a/tests/speed/wmc_speed.html b/tests/speed/wmc_speed.html
new file mode 100644
index 0000000..0dd0ce8
--- /dev/null
+++ b/tests/speed/wmc_speed.html
@@ -0,0 +1,30 @@
+<html>
+<head>
+<script src="../../lib/OpenLayers.js"></script>
+<script>
+var context = '<ViewContext xmlns="http://www.opengis.net/context" version="1.1.0" id="OpenLayers_Context_232" xsi:schemaLocation="http://www.opengis.net/context http://schemas.opengis.net/context/1.1.0/context.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><General><Window width="512" height="256"/><BoundingBox minx="-109.9709708" miny="27.01451459" maxx="-80.02902918" maxy="41.98548541" SRS="EPSG:4326"/><Title/><Extension><ol:maxExtent xmlns:ol="http://openlayers.org/contex [...]
+function parse_wmc() {
+  var format = new OpenLayers.Format.WMC.v1()
+  var data = format.read(context);
+}    
+function run(x) {
+    var date = new Date();
+    for (var i = 0; i < x; i++) {
+        parse_wmc();
+    }
+    var elapsed = (new Date() - date);
+    return elapsed;
+}
+
+function show_time(x) 
+{
+    var t = run(x);
+    document.getElementById("out").innerHTML = t + "ms  for " + x + " runs";
+}
+</script>
+</head>
+<body>
+<a onclick="javascript:show_time(100); return false" href="#">Run</a>
+<div id="out"></div>
+</body>
+</html>
diff --git a/tests/speed/wmscaps.html b/tests/speed/wmscaps.html
new file mode 100644
index 0000000..3cab542
--- /dev/null
+++ b/tests/speed/wmscaps.html
@@ -0,0 +1,52 @@
+<html>
+    <head>
+        <title>WMS Capabilities Speed Test</title>
+        <script src="../../lib/OpenLayers.js"></script>
+        <script src="wmscaps.js"></script>
+        <script>
+            var data;
+            var stats = [];
+
+            function parseCaps(id, done) {
+                var format = new OpenLayers.Format.WMSCapabilities();
+                data = format.read(caps);
+                done(id);
+            }
+
+            function run(func, x) {
+                document.getElementById("out").innerHTML = "running ...";
+                var starts = {};
+                var elapsed = 0;
+                completed = 0;
+                function callback(id) {
+                    elapsed += new Date() - starts[id];
+                    ++completed;
+                    if (completed === x) {
+                        report(x, elapsed);
+                    }
+                }
+                var runner;
+                for (var i=0; i<x; i++) {
+                    runner = createRunner(i, starts, func, callback);
+                    window.setTimeout(runner, 0);
+                }
+            }
+            
+            function createRunner(id, starts, func, done) {
+                return function() {
+                    starts[id] = new Date();
+                    func(id, done);
+                }
+            }
+
+            function report(x, elapsed) {
+                document.getElementById("out").innerHTML = elapsed + " ms for " + x + " runs (" + elapsed/x + " ms average)";
+            }
+
+        </script>
+    </head>
+    <body>
+        <a onclick="javascript:run(parseCaps, 5); return false" href="#">Run</a>
+        <div id="out"></div>
+    </body>
+</html>
diff --git a/tests/speed/wmscaps.js b/tests/speed/wmscaps.js
new file mode 100644
index 0000000..a186779
--- /dev/null
+++ b/tests/speed/wmscaps.js
@@ -0,0 +1,4956 @@
+var caps = 
+'<?xml version="1.0" encoding="UTF-8"?>' +
+'<!DOCTYPE WMT_MS_Capabilities SYSTEM "http://demo.opengeo.org/geoserver/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd">' +
+'<WMT_MS_Capabilities version="1.1.1" updateSequence="145">' +
+'  <Service>' +
+'    <Name>OGC:WMS</Name>' +
+'    <Title>GeoServer Web Map Service</Title>' +
+'    <Abstract>A compliant implementation of WMS 1.1.1 plus most of the SLD 1.0 extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS</Abstract>' +
+'    <KeywordList>' +
+'      <Keyword>WFS</Keyword>' +
+'      <Keyword>WMS</Keyword>' +
+'      <Keyword>GEOSERVER</Keyword>' +
+'    </KeywordList>' +
+'    <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms"/>' +
+'    <ContactInformation>' +
+'      <ContactPersonPrimary>' +
+'        <ContactPerson>Claudius Ptolomaeus</ContactPerson>' +
+'        <ContactOrganization>The ancient geographes INC</ContactOrganization>' +
+'      </ContactPersonPrimary>' +
+'      <ContactPosition>Chief geographer</ContactPosition>' +
+'      <ContactAddress>' +
+'        <AddressType>Work</AddressType>' +
+'        <Address/>' +
+'        <City>Alexandria</City>' +
+'        <StateOrProvince/>' +
+'        <PostCode/>' +
+'        <Country>Egypt</Country>' +
+'      </ContactAddress>' +
+'      <ContactVoiceTelephone/>' +
+'      <ContactFacsimileTelephone/>' +
+'      <ContactElectronicMailAddress>claudius.ptolomaeus at gmail.com</ContactElectronicMailAddress>' +
+'    </ContactInformation>' +
+'    <Fees>NONE</Fees>' +
+'    <AccessConstraints>NONE</AccessConstraints>' +
+'  </Service>' +
+'  <Capability>' +
+'    <Request>' +
+'      <GetCapabilities>' +
+'        <Format>application/vnd.ogc.wms_xml</Format>' +
+'        <DCPType>' +
+'          <HTTP>' +
+'            <Get>' +
+'              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>' +
+'            </Get>' +
+'            <Post>' +
+'              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>' +
+'            </Post>' +
+'          </HTTP>' +
+'        </DCPType>' +
+'      </GetCapabilities>' +
+'      <GetMap>' +
+'        <Format>image/png</Format>' +
+'        <Format>application/atom xml</Format>' +
+'        <Format>application/atom+xml</Format>' +
+'        <Format>application/openlayers</Format>' +
+'        <Format>application/pdf</Format>' +
+'        <Format>application/rss xml</Format>' +
+'        <Format>application/rss+xml</Format>' +
+'        <Format>application/vnd.google-earth.kml</Format>' +
+'        <Format>application/vnd.google-earth.kml xml</Format>' +
+'        <Format>application/vnd.google-earth.kml+xml</Format>' +
+'        <Format>application/vnd.google-earth.kmz</Format>' +
+'        <Format>application/vnd.google-earth.kmz xml</Format>' +
+'        <Format>application/vnd.google-earth.kmz+xml</Format>' +
+'        <Format>atom</Format>' +
+'        <Format>image/geotiff</Format>' +
+'        <Format>image/geotiff8</Format>' +
+'        <Format>image/gif</Format>' +
+'        <Format>image/jpeg</Format>' +
+'        <Format>image/png8</Format>' +
+'        <Format>image/svg</Format>' +
+'        <Format>image/svg xml</Format>' +
+'        <Format>image/svg+xml</Format>' +
+'        <Format>image/tiff</Format>' +
+'        <Format>image/tiff8</Format>' +
+'        <Format>kml</Format>' +
+'        <Format>kmz</Format>' +
+'        <Format>openlayers</Format>' +
+'        <Format>rss</Format>' +
+'        <DCPType>' +
+'          <HTTP>' +
+'            <Get>' +
+'              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>' +
+'            </Get>' +
+'          </HTTP>' +
+'        </DCPType>' +
+'      </GetMap>' +
+'      <GetFeatureInfo>' +
+'        <Format>text/plain</Format>' +
+'        <Format>text/html</Format>' +
+'        <Format>application/vnd.ogc.gml</Format>' +
+'        <DCPType>' +
+'          <HTTP>' +
+'            <Get>' +
+'              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>' +
+'            </Get>' +
+'            <Post>' +
+'              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>' +
+'            </Post>' +
+'          </HTTP>' +
+'        </DCPType>' +
+'      </GetFeatureInfo>' +
+'      <DescribeLayer>' +
+'        <Format>application/vnd.ogc.wms_xml</Format>' +
+'        <DCPType>' +
+'          <HTTP>' +
+'            <Get>' +
+'              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>' +
+'            </Get>' +
+'          </HTTP>' +
+'        </DCPType>' +
+'      </DescribeLayer>' +
+'      <GetLegendGraphic>' +
+'        <Format>image/png</Format>' +
+'        <Format>image/jpeg</Format>' +
+'        <Format>image/gif</Format>' +
+'        <DCPType>' +
+'          <HTTP>' +
+'            <Get>' +
+'              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>' +
+'            </Get>' +
+'          </HTTP>' +
+'        </DCPType>' +
+'      </GetLegendGraphic>' +
+'    </Request>' +
+'    <Exception>' +
+'      <Format>application/vnd.ogc.se_xml</Format>' +
+'    </Exception>' +
+'    <UserDefinedSymbolization SupportSLD="1" UserLayer="1" UserStyle="1" RemoteWFS="1"/>' +
+'    <Layer>' +
+'      <Title>GeoServer Web Map Service</Title>' +
+'      <Abstract>A compliant implementation of WMS 1.1.1 plus most of the SLD 1.0 extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS</Abstract>' +
+'      <!--All supported EPSG projections:-->' +
+'      <SRS>EPSG:WGS84(DD)</SRS>' +
+'      <SRS>EPSG:2000</SRS>' +
+'      <SRS>EPSG:2001</SRS>' +
+'      <SRS>EPSG:2002</SRS>' +
+'      <SRS>EPSG:2003</SRS>' +
+'      <SRS>EPSG:2004</SRS>' +
+'      <SRS>EPSG:2005</SRS>' +
+'      <SRS>EPSG:2006</SRS>' +
+'      <SRS>EPSG:2007</SRS>' +
+'      <SRS>EPSG:2008</SRS>' +
+'      <SRS>EPSG:2009</SRS>' +
+'      <SRS>EPSG:2010</SRS>' +
+'      <SRS>EPSG:2011</SRS>' +
+'      <SRS>EPSG:2012</SRS>' +
+'      <SRS>EPSG:2013</SRS>' +
+'      <SRS>EPSG:2014</SRS>' +
+'      <SRS>EPSG:2015</SRS>' +
+'      <SRS>EPSG:2016</SRS>' +
+'      <SRS>EPSG:2017</SRS>' +
+'      <SRS>EPSG:2018</SRS>' +
+'      <SRS>EPSG:2019</SRS>' +
+'      <SRS>EPSG:2020</SRS>' +
+'      <SRS>EPSG:2021</SRS>' +
+'      <SRS>EPSG:2022</SRS>' +
+'      <SRS>EPSG:2023</SRS>' +
+'      <SRS>EPSG:2024</SRS>' +
+'      <SRS>EPSG:2025</SRS>' +
+'      <SRS>EPSG:2026</SRS>' +
+'      <SRS>EPSG:2027</SRS>' +
+'      <SRS>EPSG:2028</SRS>' +
+'      <SRS>EPSG:2029</SRS>' +
+'      <SRS>EPSG:2030</SRS>' +
+'      <SRS>EPSG:2031</SRS>' +
+'      <SRS>EPSG:2032</SRS>' +
+'      <SRS>EPSG:2033</SRS>' +
+'      <SRS>EPSG:2034</SRS>' +
+'      <SRS>EPSG:2035</SRS>' +
+'      <SRS>EPSG:2036</SRS>' +
+'      <SRS>EPSG:2037</SRS>' +
+'      <SRS>EPSG:2038</SRS>' +
+'      <SRS>EPSG:2039</SRS>' +
+'      <SRS>EPSG:2040</SRS>' +
+'      <SRS>EPSG:2041</SRS>' +
+'      <SRS>EPSG:2042</SRS>' +
+'      <SRS>EPSG:2043</SRS>' +
+'      <SRS>EPSG:2044</SRS>' +
+'      <SRS>EPSG:2045</SRS>' +
+'      <SRS>EPSG:2046</SRS>' +
+'      <SRS>EPSG:2047</SRS>' +
+'      <SRS>EPSG:2048</SRS>' +
+'      <SRS>EPSG:2049</SRS>' +
+'      <SRS>EPSG:2050</SRS>' +
+'      <SRS>EPSG:2051</SRS>' +
+'      <SRS>EPSG:2052</SRS>' +
+'      <SRS>EPSG:2053</SRS>' +
+'      <SRS>EPSG:2054</SRS>' +
+'      <SRS>EPSG:2055</SRS>' +
+'      <SRS>EPSG:2056</SRS>' +
+'      <SRS>EPSG:2057</SRS>' +
+'      <SRS>EPSG:2058</SRS>' +
+'      <SRS>EPSG:2059</SRS>' +
+'      <SRS>EPSG:2060</SRS>' +
+'      <SRS>EPSG:2061</SRS>' +
+'      <SRS>EPSG:2062</SRS>' +
+'      <SRS>EPSG:2063</SRS>' +
+'      <SRS>EPSG:2064</SRS>' +
+'      <SRS>EPSG:2065</SRS>' +
+'      <SRS>EPSG:2066</SRS>' +
+'      <SRS>EPSG:2067</SRS>' +
+'      <SRS>EPSG:2068</SRS>' +
+'      <SRS>EPSG:2069</SRS>' +
+'      <SRS>EPSG:2070</SRS>' +
+'      <SRS>EPSG:2071</SRS>' +
+'      <SRS>EPSG:2072</SRS>' +
+'      <SRS>EPSG:2073</SRS>' +
+'      <SRS>EPSG:2074</SRS>' +
+'      <SRS>EPSG:2075</SRS>' +
+'      <SRS>EPSG:2076</SRS>' +
+'      <SRS>EPSG:2077</SRS>' +
+'      <SRS>EPSG:2078</SRS>' +
+'      <SRS>EPSG:2079</SRS>' +
+'      <SRS>EPSG:2080</SRS>' +
+'      <SRS>EPSG:2081</SRS>' +
+'      <SRS>EPSG:2082</SRS>' +
+'      <SRS>EPSG:2083</SRS>' +
+'      <SRS>EPSG:2084</SRS>' +
+'      <SRS>EPSG:2085</SRS>' +
+'      <SRS>EPSG:2086</SRS>' +
+'      <SRS>EPSG:2087</SRS>' +
+'      <SRS>EPSG:2088</SRS>' +
+'      <SRS>EPSG:2089</SRS>' +
+'      <SRS>EPSG:2090</SRS>' +
+'      <SRS>EPSG:2091</SRS>' +
+'      <SRS>EPSG:2092</SRS>' +
+'      <SRS>EPSG:2093</SRS>' +
+'      <SRS>EPSG:2094</SRS>' +
+'      <SRS>EPSG:2095</SRS>' +
+'      <SRS>EPSG:2096</SRS>' +
+'      <SRS>EPSG:2097</SRS>' +
+'      <SRS>EPSG:2098</SRS>' +
+'      <SRS>EPSG:2099</SRS>' +
+'      <SRS>EPSG:2100</SRS>' +
+'      <SRS>EPSG:2101</SRS>' +
+'      <SRS>EPSG:2102</SRS>' +
+'      <SRS>EPSG:2103</SRS>' +
+'      <SRS>EPSG:2104</SRS>' +
+'      <SRS>EPSG:2105</SRS>' +
+'      <SRS>EPSG:2106</SRS>' +
+'      <SRS>EPSG:2107</SRS>' +
+'      <SRS>EPSG:2108</SRS>' +
+'      <SRS>EPSG:2109</SRS>' +
+'      <SRS>EPSG:2110</SRS>' +
+'      <SRS>EPSG:2111</SRS>' +
+'      <SRS>EPSG:2112</SRS>' +
+'      <SRS>EPSG:2113</SRS>' +
+'      <SRS>EPSG:2114</SRS>' +
+'      <SRS>EPSG:2115</SRS>' +
+'      <SRS>EPSG:2116</SRS>' +
+'      <SRS>EPSG:2117</SRS>' +
+'      <SRS>EPSG:2118</SRS>' +
+'      <SRS>EPSG:2119</SRS>' +
+'      <SRS>EPSG:2120</SRS>' +
+'      <SRS>EPSG:2121</SRS>' +
+'      <SRS>EPSG:2122</SRS>' +
+'      <SRS>EPSG:2123</SRS>' +
+'      <SRS>EPSG:2124</SRS>' +
+'      <SRS>EPSG:2125</SRS>' +
+'      <SRS>EPSG:2126</SRS>' +
+'      <SRS>EPSG:2127</SRS>' +
+'      <SRS>EPSG:2128</SRS>' +
+'      <SRS>EPSG:2129</SRS>' +
+'      <SRS>EPSG:2130</SRS>' +
+'      <SRS>EPSG:2131</SRS>' +
+'      <SRS>EPSG:2132</SRS>' +
+'      <SRS>EPSG:2133</SRS>' +
+'      <SRS>EPSG:2134</SRS>' +
+'      <SRS>EPSG:2135</SRS>' +
+'      <SRS>EPSG:2136</SRS>' +
+'      <SRS>EPSG:2137</SRS>' +
+'      <SRS>EPSG:2138</SRS>' +
+'      <SRS>EPSG:2139</SRS>' +
+'      <SRS>EPSG:2140</SRS>' +
+'      <SRS>EPSG:2141</SRS>' +
+'      <SRS>EPSG:2142</SRS>' +
+'      <SRS>EPSG:2143</SRS>' +
+'      <SRS>EPSG:2144</SRS>' +
+'      <SRS>EPSG:2145</SRS>' +
+'      <SRS>EPSG:2146</SRS>' +
+'      <SRS>EPSG:2147</SRS>' +
+'      <SRS>EPSG:2148</SRS>' +
+'      <SRS>EPSG:2149</SRS>' +
+'      <SRS>EPSG:2150</SRS>' +
+'      <SRS>EPSG:2151</SRS>' +
+'      <SRS>EPSG:2152</SRS>' +
+'      <SRS>EPSG:2153</SRS>' +
+'      <SRS>EPSG:2154</SRS>' +
+'      <SRS>EPSG:2155</SRS>' +
+'      <SRS>EPSG:2156</SRS>' +
+'      <SRS>EPSG:2157</SRS>' +
+'      <SRS>EPSG:2158</SRS>' +
+'      <SRS>EPSG:2159</SRS>' +
+'      <SRS>EPSG:2160</SRS>' +
+'      <SRS>EPSG:2161</SRS>' +
+'      <SRS>EPSG:2162</SRS>' +
+'      <SRS>EPSG:2163</SRS>' +
+'      <SRS>EPSG:2164</SRS>' +
+'      <SRS>EPSG:2165</SRS>' +
+'      <SRS>EPSG:2166</SRS>' +
+'      <SRS>EPSG:2167</SRS>' +
+'      <SRS>EPSG:2168</SRS>' +
+'      <SRS>EPSG:2169</SRS>' +
+'      <SRS>EPSG:2170</SRS>' +
+'      <SRS>EPSG:2171</SRS>' +
+'      <SRS>EPSG:2172</SRS>' +
+'      <SRS>EPSG:2173</SRS>' +
+'      <SRS>EPSG:2174</SRS>' +
+'      <SRS>EPSG:2175</SRS>' +
+'      <SRS>EPSG:2176</SRS>' +
+'      <SRS>EPSG:2177</SRS>' +
+'      <SRS>EPSG:2178</SRS>' +
+'      <SRS>EPSG:2179</SRS>' +
+'      <SRS>EPSG:2180</SRS>' +
+'      <SRS>EPSG:2188</SRS>' +
+'      <SRS>EPSG:2189</SRS>' +
+'      <SRS>EPSG:2190</SRS>' +
+'      <SRS>EPSG:2191</SRS>' +
+'      <SRS>EPSG:2192</SRS>' +
+'      <SRS>EPSG:2193</SRS>' +
+'      <SRS>EPSG:2194</SRS>' +
+'      <SRS>EPSG:2195</SRS>' +
+'      <SRS>EPSG:2196</SRS>' +
+'      <SRS>EPSG:2197</SRS>' +
+'      <SRS>EPSG:2198</SRS>' +
+'      <SRS>EPSG:2199</SRS>' +
+'      <SRS>EPSG:2200</SRS>' +
+'      <SRS>EPSG:2201</SRS>' +
+'      <SRS>EPSG:2202</SRS>' +
+'      <SRS>EPSG:2203</SRS>' +
+'      <SRS>EPSG:2204</SRS>' +
+'      <SRS>EPSG:2205</SRS>' +
+'      <SRS>EPSG:2206</SRS>' +
+'      <SRS>EPSG:2207</SRS>' +
+'      <SRS>EPSG:2208</SRS>' +
+'      <SRS>EPSG:2209</SRS>' +
+'      <SRS>EPSG:2210</SRS>' +
+'      <SRS>EPSG:2211</SRS>' +
+'      <SRS>EPSG:2212</SRS>' +
+'      <SRS>EPSG:2213</SRS>' +
+'      <SRS>EPSG:2214</SRS>' +
+'      <SRS>EPSG:2215</SRS>' +
+'      <SRS>EPSG:2216</SRS>' +
+'      <SRS>EPSG:2217</SRS>' +
+'      <SRS>EPSG:2218</SRS>' +
+'      <SRS>EPSG:2219</SRS>' +
+'      <SRS>EPSG:2220</SRS>' +
+'      <SRS>EPSG:2221</SRS>' +
+'      <SRS>EPSG:2222</SRS>' +
+'      <SRS>EPSG:2223</SRS>' +
+'      <SRS>EPSG:2224</SRS>' +
+'      <SRS>EPSG:2225</SRS>' +
+'      <SRS>EPSG:2226</SRS>' +
+'      <SRS>EPSG:2227</SRS>' +
+'      <SRS>EPSG:2228</SRS>' +
+'      <SRS>EPSG:2229</SRS>' +
+'      <SRS>EPSG:2230</SRS>' +
+'      <SRS>EPSG:2231</SRS>' +
+'      <SRS>EPSG:2232</SRS>' +
+'      <SRS>EPSG:2233</SRS>' +
+'      <SRS>EPSG:2234</SRS>' +
+'      <SRS>EPSG:2235</SRS>' +
+'      <SRS>EPSG:2236</SRS>' +
+'      <SRS>EPSG:2237</SRS>' +
+'      <SRS>EPSG:2238</SRS>' +
+'      <SRS>EPSG:2239</SRS>' +
+'      <SRS>EPSG:2240</SRS>' +
+'      <SRS>EPSG:2241</SRS>' +
+'      <SRS>EPSG:2242</SRS>' +
+'      <SRS>EPSG:2243</SRS>' +
+'      <SRS>EPSG:2244</SRS>' +
+'      <SRS>EPSG:2245</SRS>' +
+'      <SRS>EPSG:2246</SRS>' +
+'      <SRS>EPSG:2247</SRS>' +
+'      <SRS>EPSG:2248</SRS>' +
+'      <SRS>EPSG:2249</SRS>' +
+'      <SRS>EPSG:2250</SRS>' +
+'      <SRS>EPSG:2251</SRS>' +
+'      <SRS>EPSG:2252</SRS>' +
+'      <SRS>EPSG:2253</SRS>' +
+'      <SRS>EPSG:2254</SRS>' +
+'      <SRS>EPSG:2255</SRS>' +
+'      <SRS>EPSG:2256</SRS>' +
+'      <SRS>EPSG:2257</SRS>' +
+'      <SRS>EPSG:2258</SRS>' +
+'      <SRS>EPSG:2259</SRS>' +
+'      <SRS>EPSG:2260</SRS>' +
+'      <SRS>EPSG:2261</SRS>' +
+'      <SRS>EPSG:2262</SRS>' +
+'      <SRS>EPSG:2263</SRS>' +
+'      <SRS>EPSG:2264</SRS>' +
+'      <SRS>EPSG:2265</SRS>' +
+'      <SRS>EPSG:2266</SRS>' +
+'      <SRS>EPSG:2267</SRS>' +
+'      <SRS>EPSG:2268</SRS>' +
+'      <SRS>EPSG:2269</SRS>' +
+'      <SRS>EPSG:2270</SRS>' +
+'      <SRS>EPSG:2271</SRS>' +
+'      <SRS>EPSG:2272</SRS>' +
+'      <SRS>EPSG:2273</SRS>' +
+'      <SRS>EPSG:2274</SRS>' +
+'      <SRS>EPSG:2275</SRS>' +
+'      <SRS>EPSG:2276</SRS>' +
+'      <SRS>EPSG:2277</SRS>' +
+'      <SRS>EPSG:2278</SRS>' +
+'      <SRS>EPSG:2279</SRS>' +
+'      <SRS>EPSG:2280</SRS>' +
+'      <SRS>EPSG:2281</SRS>' +
+'      <SRS>EPSG:2282</SRS>' +
+'      <SRS>EPSG:2283</SRS>' +
+'      <SRS>EPSG:2284</SRS>' +
+'      <SRS>EPSG:2285</SRS>' +
+'      <SRS>EPSG:2286</SRS>' +
+'      <SRS>EPSG:2287</SRS>' +
+'      <SRS>EPSG:2288</SRS>' +
+'      <SRS>EPSG:2289</SRS>' +
+'      <SRS>EPSG:2290</SRS>' +
+'      <SRS>EPSG:2291</SRS>' +
+'      <SRS>EPSG:2292</SRS>' +
+'      <SRS>EPSG:2294</SRS>' +
+'      <SRS>EPSG:2295</SRS>' +
+'      <SRS>EPSG:2296</SRS>' +
+'      <SRS>EPSG:2297</SRS>' +
+'      <SRS>EPSG:2298</SRS>' +
+'      <SRS>EPSG:2299</SRS>' +
+'      <SRS>EPSG:2300</SRS>' +
+'      <SRS>EPSG:2301</SRS>' +
+'      <SRS>EPSG:2302</SRS>' +
+'      <SRS>EPSG:2303</SRS>' +
+'      <SRS>EPSG:2304</SRS>' +
+'      <SRS>EPSG:2305</SRS>' +
+'      <SRS>EPSG:2306</SRS>' +
+'      <SRS>EPSG:2307</SRS>' +
+'      <SRS>EPSG:2308</SRS>' +
+'      <SRS>EPSG:2309</SRS>' +
+'      <SRS>EPSG:2310</SRS>' +
+'      <SRS>EPSG:2311</SRS>' +
+'      <SRS>EPSG:2312</SRS>' +
+'      <SRS>EPSG:2313</SRS>' +
+'      <SRS>EPSG:2314</SRS>' +
+'      <SRS>EPSG:2315</SRS>' +
+'      <SRS>EPSG:2316</SRS>' +
+'      <SRS>EPSG:2317</SRS>' +
+'      <SRS>EPSG:2318</SRS>' +
+'      <SRS>EPSG:2319</SRS>' +
+'      <SRS>EPSG:2320</SRS>' +
+'      <SRS>EPSG:2321</SRS>' +
+'      <SRS>EPSG:2322</SRS>' +
+'      <SRS>EPSG:2323</SRS>' +
+'      <SRS>EPSG:2324</SRS>' +
+'      <SRS>EPSG:2325</SRS>' +
+'      <SRS>EPSG:2326</SRS>' +
+'      <SRS>EPSG:2327</SRS>' +
+'      <SRS>EPSG:2328</SRS>' +
+'      <SRS>EPSG:2329</SRS>' +
+'      <SRS>EPSG:2330</SRS>' +
+'      <SRS>EPSG:2331</SRS>' +
+'      <SRS>EPSG:2332</SRS>' +
+'      <SRS>EPSG:2333</SRS>' +
+'      <SRS>EPSG:2334</SRS>' +
+'      <SRS>EPSG:2335</SRS>' +
+'      <SRS>EPSG:2336</SRS>' +
+'      <SRS>EPSG:2337</SRS>' +
+'      <SRS>EPSG:2338</SRS>' +
+'      <SRS>EPSG:2339</SRS>' +
+'      <SRS>EPSG:2340</SRS>' +
+'      <SRS>EPSG:2341</SRS>' +
+'      <SRS>EPSG:2342</SRS>' +
+'      <SRS>EPSG:2343</SRS>' +
+'      <SRS>EPSG:2344</SRS>' +
+'      <SRS>EPSG:2345</SRS>' +
+'      <SRS>EPSG:2346</SRS>' +
+'      <SRS>EPSG:2347</SRS>' +
+'      <SRS>EPSG:2348</SRS>' +
+'      <SRS>EPSG:2349</SRS>' +
+'      <SRS>EPSG:2350</SRS>' +
+'      <SRS>EPSG:2351</SRS>' +
+'      <SRS>EPSG:2352</SRS>' +
+'      <SRS>EPSG:2353</SRS>' +
+'      <SRS>EPSG:2354</SRS>' +
+'      <SRS>EPSG:2355</SRS>' +
+'      <SRS>EPSG:2356</SRS>' +
+'      <SRS>EPSG:2357</SRS>' +
+'      <SRS>EPSG:2358</SRS>' +
+'      <SRS>EPSG:2359</SRS>' +
+'      <SRS>EPSG:2360</SRS>' +
+'      <SRS>EPSG:2361</SRS>' +
+'      <SRS>EPSG:2362</SRS>' +
+'      <SRS>EPSG:2363</SRS>' +
+'      <SRS>EPSG:2364</SRS>' +
+'      <SRS>EPSG:2365</SRS>' +
+'      <SRS>EPSG:2366</SRS>' +
+'      <SRS>EPSG:2367</SRS>' +
+'      <SRS>EPSG:2368</SRS>' +
+'      <SRS>EPSG:2369</SRS>' +
+'      <SRS>EPSG:2370</SRS>' +
+'      <SRS>EPSG:2371</SRS>' +
+'      <SRS>EPSG:2372</SRS>' +
+'      <SRS>EPSG:2373</SRS>' +
+'      <SRS>EPSG:2374</SRS>' +
+'      <SRS>EPSG:2375</SRS>' +
+'      <SRS>EPSG:2376</SRS>' +
+'      <SRS>EPSG:2377</SRS>' +
+'      <SRS>EPSG:2378</SRS>' +
+'      <SRS>EPSG:2379</SRS>' +
+'      <SRS>EPSG:2380</SRS>' +
+'      <SRS>EPSG:2381</SRS>' +
+'      <SRS>EPSG:2382</SRS>' +
+'      <SRS>EPSG:2383</SRS>' +
+'      <SRS>EPSG:2384</SRS>' +
+'      <SRS>EPSG:2385</SRS>' +
+'      <SRS>EPSG:2386</SRS>' +
+'      <SRS>EPSG:2387</SRS>' +
+'      <SRS>EPSG:2388</SRS>' +
+'      <SRS>EPSG:2389</SRS>' +
+'      <SRS>EPSG:2390</SRS>' +
+'      <SRS>EPSG:2391</SRS>' +
+'      <SRS>EPSG:2392</SRS>' +
+'      <SRS>EPSG:2393</SRS>' +
+'      <SRS>EPSG:2394</SRS>' +
+'      <SRS>EPSG:2395</SRS>' +
+'      <SRS>EPSG:2396</SRS>' +
+'      <SRS>EPSG:2397</SRS>' +
+'      <SRS>EPSG:2398</SRS>' +
+'      <SRS>EPSG:2399</SRS>' +
+'      <SRS>EPSG:2400</SRS>' +
+'      <SRS>EPSG:2401</SRS>' +
+'      <SRS>EPSG:2402</SRS>' +
+'      <SRS>EPSG:2403</SRS>' +
+'      <SRS>EPSG:2404</SRS>' +
+'      <SRS>EPSG:2405</SRS>' +
+'      <SRS>EPSG:2406</SRS>' +
+'      <SRS>EPSG:2407</SRS>' +
+'      <SRS>EPSG:2408</SRS>' +
+'      <SRS>EPSG:2409</SRS>' +
+'      <SRS>EPSG:2410</SRS>' +
+'      <SRS>EPSG:2411</SRS>' +
+'      <SRS>EPSG:2412</SRS>' +
+'      <SRS>EPSG:2413</SRS>' +
+'      <SRS>EPSG:2414</SRS>' +
+'      <SRS>EPSG:2415</SRS>' +
+'      <SRS>EPSG:2416</SRS>' +
+'      <SRS>EPSG:2417</SRS>' +
+'      <SRS>EPSG:2418</SRS>' +
+'      <SRS>EPSG:2419</SRS>' +
+'      <SRS>EPSG:2420</SRS>' +
+'      <SRS>EPSG:2421</SRS>' +
+'      <SRS>EPSG:2422</SRS>' +
+'      <SRS>EPSG:2423</SRS>' +
+'      <SRS>EPSG:2424</SRS>' +
+'      <SRS>EPSG:2425</SRS>' +
+'      <SRS>EPSG:2426</SRS>' +
+'      <SRS>EPSG:2427</SRS>' +
+'      <SRS>EPSG:2428</SRS>' +
+'      <SRS>EPSG:2429</SRS>' +
+'      <SRS>EPSG:2430</SRS>' +
+'      <SRS>EPSG:2431</SRS>' +
+'      <SRS>EPSG:2432</SRS>' +
+'      <SRS>EPSG:2433</SRS>' +
+'      <SRS>EPSG:2434</SRS>' +
+'      <SRS>EPSG:2435</SRS>' +
+'      <SRS>EPSG:2436</SRS>' +
+'      <SRS>EPSG:2437</SRS>' +
+'      <SRS>EPSG:2438</SRS>' +
+'      <SRS>EPSG:2439</SRS>' +
+'      <SRS>EPSG:2440</SRS>' +
+'      <SRS>EPSG:2441</SRS>' +
+'      <SRS>EPSG:2442</SRS>' +
+'      <SRS>EPSG:2443</SRS>' +
+'      <SRS>EPSG:2444</SRS>' +
+'      <SRS>EPSG:2445</SRS>' +
+'      <SRS>EPSG:2446</SRS>' +
+'      <SRS>EPSG:2447</SRS>' +
+'      <SRS>EPSG:2448</SRS>' +
+'      <SRS>EPSG:2449</SRS>' +
+'      <SRS>EPSG:2450</SRS>' +
+'      <SRS>EPSG:2451</SRS>' +
+'      <SRS>EPSG:2452</SRS>' +
+'      <SRS>EPSG:2453</SRS>' +
+'      <SRS>EPSG:2454</SRS>' +
+'      <SRS>EPSG:2455</SRS>' +
+'      <SRS>EPSG:2456</SRS>' +
+'      <SRS>EPSG:2457</SRS>' +
+'      <SRS>EPSG:2458</SRS>' +
+'      <SRS>EPSG:2459</SRS>' +
+'      <SRS>EPSG:2460</SRS>' +
+'      <SRS>EPSG:2461</SRS>' +
+'      <SRS>EPSG:2462</SRS>' +
+'      <SRS>EPSG:2463</SRS>' +
+'      <SRS>EPSG:2464</SRS>' +
+'      <SRS>EPSG:2465</SRS>' +
+'      <SRS>EPSG:2466</SRS>' +
+'      <SRS>EPSG:2467</SRS>' +
+'      <SRS>EPSG:2468</SRS>' +
+'      <SRS>EPSG:2469</SRS>' +
+'      <SRS>EPSG:2470</SRS>' +
+'      <SRS>EPSG:2471</SRS>' +
+'      <SRS>EPSG:2472</SRS>' +
+'      <SRS>EPSG:2473</SRS>' +
+'      <SRS>EPSG:2474</SRS>' +
+'      <SRS>EPSG:2475</SRS>' +
+'      <SRS>EPSG:2476</SRS>' +
+'      <SRS>EPSG:2477</SRS>' +
+'      <SRS>EPSG:2478</SRS>' +
+'      <SRS>EPSG:2479</SRS>' +
+'      <SRS>EPSG:2480</SRS>' +
+'      <SRS>EPSG:2481</SRS>' +
+'      <SRS>EPSG:2482</SRS>' +
+'      <SRS>EPSG:2483</SRS>' +
+'      <SRS>EPSG:2484</SRS>' +
+'      <SRS>EPSG:2485</SRS>' +
+'      <SRS>EPSG:2486</SRS>' +
+'      <SRS>EPSG:2487</SRS>' +
+'      <SRS>EPSG:2488</SRS>' +
+'      <SRS>EPSG:2489</SRS>' +
+'      <SRS>EPSG:2490</SRS>' +
+'      <SRS>EPSG:2491</SRS>' +
+'      <SRS>EPSG:2492</SRS>' +
+'      <SRS>EPSG:2493</SRS>' +
+'      <SRS>EPSG:2494</SRS>' +
+'      <SRS>EPSG:2495</SRS>' +
+'      <SRS>EPSG:2496</SRS>' +
+'      <SRS>EPSG:2497</SRS>' +
+'      <SRS>EPSG:2498</SRS>' +
+'      <SRS>EPSG:2499</SRS>' +
+'      <SRS>EPSG:2500</SRS>' +
+'      <SRS>EPSG:2501</SRS>' +
+'      <SRS>EPSG:2502</SRS>' +
+'      <SRS>EPSG:2503</SRS>' +
+'      <SRS>EPSG:2504</SRS>' +
+'      <SRS>EPSG:2505</SRS>' +
+'      <SRS>EPSG:2506</SRS>' +
+'      <SRS>EPSG:2507</SRS>' +
+'      <SRS>EPSG:2508</SRS>' +
+'      <SRS>EPSG:2509</SRS>' +
+'      <SRS>EPSG:2510</SRS>' +
+'      <SRS>EPSG:2511</SRS>' +
+'      <SRS>EPSG:2512</SRS>' +
+'      <SRS>EPSG:2513</SRS>' +
+'      <SRS>EPSG:2514</SRS>' +
+'      <SRS>EPSG:2515</SRS>' +
+'      <SRS>EPSG:2516</SRS>' +
+'      <SRS>EPSG:2517</SRS>' +
+'      <SRS>EPSG:2518</SRS>' +
+'      <SRS>EPSG:2519</SRS>' +
+'      <SRS>EPSG:2520</SRS>' +
+'      <SRS>EPSG:2521</SRS>' +
+'      <SRS>EPSG:2522</SRS>' +
+'      <SRS>EPSG:2523</SRS>' +
+'      <SRS>EPSG:2524</SRS>' +
+'      <SRS>EPSG:2525</SRS>' +
+'      <SRS>EPSG:2526</SRS>' +
+'      <SRS>EPSG:2527</SRS>' +
+'      <SRS>EPSG:2528</SRS>' +
+'      <SRS>EPSG:2529</SRS>' +
+'      <SRS>EPSG:2530</SRS>' +
+'      <SRS>EPSG:2531</SRS>' +
+'      <SRS>EPSG:2532</SRS>' +
+'      <SRS>EPSG:2533</SRS>' +
+'      <SRS>EPSG:2534</SRS>' +
+'      <SRS>EPSG:2535</SRS>' +
+'      <SRS>EPSG:2536</SRS>' +
+'      <SRS>EPSG:2537</SRS>' +
+'      <SRS>EPSG:2538</SRS>' +
+'      <SRS>EPSG:2539</SRS>' +
+'      <SRS>EPSG:2540</SRS>' +
+'      <SRS>EPSG:2541</SRS>' +
+'      <SRS>EPSG:2542</SRS>' +
+'      <SRS>EPSG:2543</SRS>' +
+'      <SRS>EPSG:2544</SRS>' +
+'      <SRS>EPSG:2545</SRS>' +
+'      <SRS>EPSG:2546</SRS>' +
+'      <SRS>EPSG:2547</SRS>' +
+'      <SRS>EPSG:2548</SRS>' +
+'      <SRS>EPSG:2549</SRS>' +
+'      <SRS>EPSG:2550</SRS>' +
+'      <SRS>EPSG:2551</SRS>' +
+'      <SRS>EPSG:2552</SRS>' +
+'      <SRS>EPSG:2553</SRS>' +
+'      <SRS>EPSG:2554</SRS>' +
+'      <SRS>EPSG:2555</SRS>' +
+'      <SRS>EPSG:2556</SRS>' +
+'      <SRS>EPSG:2557</SRS>' +
+'      <SRS>EPSG:2558</SRS>' +
+'      <SRS>EPSG:2559</SRS>' +
+'      <SRS>EPSG:2560</SRS>' +
+'      <SRS>EPSG:2561</SRS>' +
+'      <SRS>EPSG:2562</SRS>' +
+'      <SRS>EPSG:2563</SRS>' +
+'      <SRS>EPSG:2564</SRS>' +
+'      <SRS>EPSG:2565</SRS>' +
+'      <SRS>EPSG:2566</SRS>' +
+'      <SRS>EPSG:2567</SRS>' +
+'      <SRS>EPSG:2568</SRS>' +
+'      <SRS>EPSG:2569</SRS>' +
+'      <SRS>EPSG:2570</SRS>' +
+'      <SRS>EPSG:2571</SRS>' +
+'      <SRS>EPSG:2572</SRS>' +
+'      <SRS>EPSG:2573</SRS>' +
+'      <SRS>EPSG:2574</SRS>' +
+'      <SRS>EPSG:2575</SRS>' +
+'      <SRS>EPSG:2576</SRS>' +
+'      <SRS>EPSG:2577</SRS>' +
+'      <SRS>EPSG:2578</SRS>' +
+'      <SRS>EPSG:2579</SRS>' +
+'      <SRS>EPSG:2580</SRS>' +
+'      <SRS>EPSG:2581</SRS>' +
+'      <SRS>EPSG:2582</SRS>' +
+'      <SRS>EPSG:2583</SRS>' +
+'      <SRS>EPSG:2584</SRS>' +
+'      <SRS>EPSG:2585</SRS>' +
+'      <SRS>EPSG:2586</SRS>' +
+'      <SRS>EPSG:2587</SRS>' +
+'      <SRS>EPSG:2588</SRS>' +
+'      <SRS>EPSG:2589</SRS>' +
+'      <SRS>EPSG:2590</SRS>' +
+'      <SRS>EPSG:2591</SRS>' +
+'      <SRS>EPSG:2592</SRS>' +
+'      <SRS>EPSG:2593</SRS>' +
+'      <SRS>EPSG:2594</SRS>' +
+'      <SRS>EPSG:2595</SRS>' +
+'      <SRS>EPSG:2596</SRS>' +
+'      <SRS>EPSG:2597</SRS>' +
+'      <SRS>EPSG:2598</SRS>' +
+'      <SRS>EPSG:2599</SRS>' +
+'      <SRS>EPSG:2600</SRS>' +
+'      <SRS>EPSG:2601</SRS>' +
+'      <SRS>EPSG:2602</SRS>' +
+'      <SRS>EPSG:2603</SRS>' +
+'      <SRS>EPSG:2604</SRS>' +
+'      <SRS>EPSG:2605</SRS>' +
+'      <SRS>EPSG:2606</SRS>' +
+'      <SRS>EPSG:2607</SRS>' +
+'      <SRS>EPSG:2608</SRS>' +
+'      <SRS>EPSG:2609</SRS>' +
+'      <SRS>EPSG:2610</SRS>' +
+'      <SRS>EPSG:2611</SRS>' +
+'      <SRS>EPSG:2612</SRS>' +
+'      <SRS>EPSG:2613</SRS>' +
+'      <SRS>EPSG:2614</SRS>' +
+'      <SRS>EPSG:2615</SRS>' +
+'      <SRS>EPSG:2616</SRS>' +
+'      <SRS>EPSG:2617</SRS>' +
+'      <SRS>EPSG:2618</SRS>' +
+'      <SRS>EPSG:2619</SRS>' +
+'      <SRS>EPSG:2620</SRS>' +
+'      <SRS>EPSG:2621</SRS>' +
+'      <SRS>EPSG:2622</SRS>' +
+'      <SRS>EPSG:2623</SRS>' +
+'      <SRS>EPSG:2624</SRS>' +
+'      <SRS>EPSG:2625</SRS>' +
+'      <SRS>EPSG:2626</SRS>' +
+'      <SRS>EPSG:2627</SRS>' +
+'      <SRS>EPSG:2628</SRS>' +
+'      <SRS>EPSG:2629</SRS>' +
+'      <SRS>EPSG:2630</SRS>' +
+'      <SRS>EPSG:2631</SRS>' +
+'      <SRS>EPSG:2632</SRS>' +
+'      <SRS>EPSG:2633</SRS>' +
+'      <SRS>EPSG:2634</SRS>' +
+'      <SRS>EPSG:2635</SRS>' +
+'      <SRS>EPSG:2636</SRS>' +
+'      <SRS>EPSG:2637</SRS>' +
+'      <SRS>EPSG:2638</SRS>' +
+'      <SRS>EPSG:2639</SRS>' +
+'      <SRS>EPSG:2640</SRS>' +
+'      <SRS>EPSG:2641</SRS>' +
+'      <SRS>EPSG:2642</SRS>' +
+'      <SRS>EPSG:2643</SRS>' +
+'      <SRS>EPSG:2644</SRS>' +
+'      <SRS>EPSG:2645</SRS>' +
+'      <SRS>EPSG:2646</SRS>' +
+'      <SRS>EPSG:2647</SRS>' +
+'      <SRS>EPSG:2648</SRS>' +
+'      <SRS>EPSG:2649</SRS>' +
+'      <SRS>EPSG:2650</SRS>' +
+'      <SRS>EPSG:2651</SRS>' +
+'      <SRS>EPSG:2652</SRS>' +
+'      <SRS>EPSG:2653</SRS>' +
+'      <SRS>EPSG:2654</SRS>' +
+'      <SRS>EPSG:2655</SRS>' +
+'      <SRS>EPSG:2656</SRS>' +
+'      <SRS>EPSG:2657</SRS>' +
+'      <SRS>EPSG:2658</SRS>' +
+'      <SRS>EPSG:2659</SRS>' +
+'      <SRS>EPSG:2660</SRS>' +
+'      <SRS>EPSG:2661</SRS>' +
+'      <SRS>EPSG:2662</SRS>' +
+'      <SRS>EPSG:2663</SRS>' +
+'      <SRS>EPSG:2664</SRS>' +
+'      <SRS>EPSG:2665</SRS>' +
+'      <SRS>EPSG:2666</SRS>' +
+'      <SRS>EPSG:2667</SRS>' +
+'      <SRS>EPSG:2668</SRS>' +
+'      <SRS>EPSG:2669</SRS>' +
+'      <SRS>EPSG:2670</SRS>' +
+'      <SRS>EPSG:2671</SRS>' +
+'      <SRS>EPSG:2672</SRS>' +
+'      <SRS>EPSG:2673</SRS>' +
+'      <SRS>EPSG:2674</SRS>' +
+'      <SRS>EPSG:2675</SRS>' +
+'      <SRS>EPSG:2676</SRS>' +
+'      <SRS>EPSG:2677</SRS>' +
+'      <SRS>EPSG:2678</SRS>' +
+'      <SRS>EPSG:2679</SRS>' +
+'      <SRS>EPSG:2680</SRS>' +
+'      <SRS>EPSG:2681</SRS>' +
+'      <SRS>EPSG:2682</SRS>' +
+'      <SRS>EPSG:2683</SRS>' +
+'      <SRS>EPSG:2684</SRS>' +
+'      <SRS>EPSG:2685</SRS>' +
+'      <SRS>EPSG:2686</SRS>' +
+'      <SRS>EPSG:2687</SRS>' +
+'      <SRS>EPSG:2688</SRS>' +
+'      <SRS>EPSG:2689</SRS>' +
+'      <SRS>EPSG:2690</SRS>' +
+'      <SRS>EPSG:2691</SRS>' +
+'      <SRS>EPSG:2692</SRS>' +
+'      <SRS>EPSG:2693</SRS>' +
+'      <SRS>EPSG:2694</SRS>' +
+'      <SRS>EPSG:2695</SRS>' +
+'      <SRS>EPSG:2696</SRS>' +
+'      <SRS>EPSG:2697</SRS>' +
+'      <SRS>EPSG:2698</SRS>' +
+'      <SRS>EPSG:2699</SRS>' +
+'      <SRS>EPSG:2700</SRS>' +
+'      <SRS>EPSG:2701</SRS>' +
+'      <SRS>EPSG:2702</SRS>' +
+'      <SRS>EPSG:2703</SRS>' +
+'      <SRS>EPSG:2704</SRS>' +
+'      <SRS>EPSG:2705</SRS>' +
+'      <SRS>EPSG:2706</SRS>' +
+'      <SRS>EPSG:2707</SRS>' +
+'      <SRS>EPSG:2708</SRS>' +
+'      <SRS>EPSG:2709</SRS>' +
+'      <SRS>EPSG:2710</SRS>' +
+'      <SRS>EPSG:2711</SRS>' +
+'      <SRS>EPSG:2712</SRS>' +
+'      <SRS>EPSG:2713</SRS>' +
+'      <SRS>EPSG:2714</SRS>' +
+'      <SRS>EPSG:2715</SRS>' +
+'      <SRS>EPSG:2716</SRS>' +
+'      <SRS>EPSG:2717</SRS>' +
+'      <SRS>EPSG:2718</SRS>' +
+'      <SRS>EPSG:2719</SRS>' +
+'      <SRS>EPSG:2720</SRS>' +
+'      <SRS>EPSG:2721</SRS>' +
+'      <SRS>EPSG:2722</SRS>' +
+'      <SRS>EPSG:2723</SRS>' +
+'      <SRS>EPSG:2724</SRS>' +
+'      <SRS>EPSG:2725</SRS>' +
+'      <SRS>EPSG:2726</SRS>' +
+'      <SRS>EPSG:2727</SRS>' +
+'      <SRS>EPSG:2728</SRS>' +
+'      <SRS>EPSG:2729</SRS>' +
+'      <SRS>EPSG:2730</SRS>' +
+'      <SRS>EPSG:2731</SRS>' +
+'      <SRS>EPSG:2732</SRS>' +
+'      <SRS>EPSG:2733</SRS>' +
+'      <SRS>EPSG:2734</SRS>' +
+'      <SRS>EPSG:2735</SRS>' +
+'      <SRS>EPSG:2736</SRS>' +
+'      <SRS>EPSG:2737</SRS>' +
+'      <SRS>EPSG:2738</SRS>' +
+'      <SRS>EPSG:2739</SRS>' +
+'      <SRS>EPSG:2740</SRS>' +
+'      <SRS>EPSG:2741</SRS>' +
+'      <SRS>EPSG:2742</SRS>' +
+'      <SRS>EPSG:2743</SRS>' +
+'      <SRS>EPSG:2744</SRS>' +
+'      <SRS>EPSG:2745</SRS>' +
+'      <SRS>EPSG:2746</SRS>' +
+'      <SRS>EPSG:2747</SRS>' +
+'      <SRS>EPSG:2748</SRS>' +
+'      <SRS>EPSG:2749</SRS>' +
+'      <SRS>EPSG:2750</SRS>' +
+'      <SRS>EPSG:2751</SRS>' +
+'      <SRS>EPSG:2752</SRS>' +
+'      <SRS>EPSG:2753</SRS>' +
+'      <SRS>EPSG:2754</SRS>' +
+'      <SRS>EPSG:2755</SRS>' +
+'      <SRS>EPSG:2756</SRS>' +
+'      <SRS>EPSG:2757</SRS>' +
+'      <SRS>EPSG:2758</SRS>' +
+'      <SRS>EPSG:2759</SRS>' +
+'      <SRS>EPSG:2760</SRS>' +
+'      <SRS>EPSG:2761</SRS>' +
+'      <SRS>EPSG:2762</SRS>' +
+'      <SRS>EPSG:2763</SRS>' +
+'      <SRS>EPSG:2764</SRS>' +
+'      <SRS>EPSG:2765</SRS>' +
+'      <SRS>EPSG:2766</SRS>' +
+'      <SRS>EPSG:2767</SRS>' +
+'      <SRS>EPSG:2768</SRS>' +
+'      <SRS>EPSG:2769</SRS>' +
+'      <SRS>EPSG:2770</SRS>' +
+'      <SRS>EPSG:2771</SRS>' +
+'      <SRS>EPSG:2772</SRS>' +
+'      <SRS>EPSG:2773</SRS>' +
+'      <SRS>EPSG:2774</SRS>' +
+'      <SRS>EPSG:2775</SRS>' +
+'      <SRS>EPSG:2776</SRS>' +
+'      <SRS>EPSG:2777</SRS>' +
+'      <SRS>EPSG:2778</SRS>' +
+'      <SRS>EPSG:2779</SRS>' +
+'      <SRS>EPSG:2780</SRS>' +
+'      <SRS>EPSG:2781</SRS>' +
+'      <SRS>EPSG:2782</SRS>' +
+'      <SRS>EPSG:2783</SRS>' +
+'      <SRS>EPSG:2784</SRS>' +
+'      <SRS>EPSG:2785</SRS>' +
+'      <SRS>EPSG:2786</SRS>' +
+'      <SRS>EPSG:2787</SRS>' +
+'      <SRS>EPSG:2788</SRS>' +
+'      <SRS>EPSG:2789</SRS>' +
+'      <SRS>EPSG:2790</SRS>' +
+'      <SRS>EPSG:2791</SRS>' +
+'      <SRS>EPSG:2792</SRS>' +
+'      <SRS>EPSG:2793</SRS>' +
+'      <SRS>EPSG:2794</SRS>' +
+'      <SRS>EPSG:2795</SRS>' +
+'      <SRS>EPSG:2796</SRS>' +
+'      <SRS>EPSG:2797</SRS>' +
+'      <SRS>EPSG:2798</SRS>' +
+'      <SRS>EPSG:2799</SRS>' +
+'      <SRS>EPSG:2800</SRS>' +
+'      <SRS>EPSG:2801</SRS>' +
+'      <SRS>EPSG:2802</SRS>' +
+'      <SRS>EPSG:2803</SRS>' +
+'      <SRS>EPSG:2804</SRS>' +
+'      <SRS>EPSG:2805</SRS>' +
+'      <SRS>EPSG:2806</SRS>' +
+'      <SRS>EPSG:2807</SRS>' +
+'      <SRS>EPSG:2808</SRS>' +
+'      <SRS>EPSG:2809</SRS>' +
+'      <SRS>EPSG:2810</SRS>' +
+'      <SRS>EPSG:2811</SRS>' +
+'      <SRS>EPSG:2812</SRS>' +
+'      <SRS>EPSG:2813</SRS>' +
+'      <SRS>EPSG:2814</SRS>' +
+'      <SRS>EPSG:2815</SRS>' +
+'      <SRS>EPSG:2816</SRS>' +
+'      <SRS>EPSG:2817</SRS>' +
+'      <SRS>EPSG:2818</SRS>' +
+'      <SRS>EPSG:2819</SRS>' +
+'      <SRS>EPSG:2820</SRS>' +
+'      <SRS>EPSG:2821</SRS>' +
+'      <SRS>EPSG:2822</SRS>' +
+'      <SRS>EPSG:2823</SRS>' +
+'      <SRS>EPSG:2824</SRS>' +
+'      <SRS>EPSG:2825</SRS>' +
+'      <SRS>EPSG:2826</SRS>' +
+'      <SRS>EPSG:2827</SRS>' +
+'      <SRS>EPSG:2828</SRS>' +
+'      <SRS>EPSG:2829</SRS>' +
+'      <SRS>EPSG:2830</SRS>' +
+'      <SRS>EPSG:2831</SRS>' +
+'      <SRS>EPSG:2832</SRS>' +
+'      <SRS>EPSG:2833</SRS>' +
+'      <SRS>EPSG:2834</SRS>' +
+'      <SRS>EPSG:2835</SRS>' +
+'      <SRS>EPSG:2836</SRS>' +
+'      <SRS>EPSG:2837</SRS>' +
+'      <SRS>EPSG:2838</SRS>' +
+'      <SRS>EPSG:2839</SRS>' +
+'      <SRS>EPSG:2840</SRS>' +
+'      <SRS>EPSG:2841</SRS>' +
+'      <SRS>EPSG:2842</SRS>' +
+'      <SRS>EPSG:2843</SRS>' +
+'      <SRS>EPSG:2844</SRS>' +
+'      <SRS>EPSG:2845</SRS>' +
+'      <SRS>EPSG:2846</SRS>' +
+'      <SRS>EPSG:2847</SRS>' +
+'      <SRS>EPSG:2848</SRS>' +
+'      <SRS>EPSG:2849</SRS>' +
+'      <SRS>EPSG:2850</SRS>' +
+'      <SRS>EPSG:2851</SRS>' +
+'      <SRS>EPSG:2852</SRS>' +
+'      <SRS>EPSG:2853</SRS>' +
+'      <SRS>EPSG:2854</SRS>' +
+'      <SRS>EPSG:2855</SRS>' +
+'      <SRS>EPSG:2856</SRS>' +
+'      <SRS>EPSG:2857</SRS>' +
+'      <SRS>EPSG:2858</SRS>' +
+'      <SRS>EPSG:2859</SRS>' +
+'      <SRS>EPSG:2860</SRS>' +
+'      <SRS>EPSG:2861</SRS>' +
+'      <SRS>EPSG:2862</SRS>' +
+'      <SRS>EPSG:2863</SRS>' +
+'      <SRS>EPSG:2864</SRS>' +
+'      <SRS>EPSG:2865</SRS>' +
+'      <SRS>EPSG:2866</SRS>' +
+'      <SRS>EPSG:2867</SRS>' +
+'      <SRS>EPSG:2868</SRS>' +
+'      <SRS>EPSG:2869</SRS>' +
+'      <SRS>EPSG:2870</SRS>' +
+'      <SRS>EPSG:2871</SRS>' +
+'      <SRS>EPSG:2872</SRS>' +
+'      <SRS>EPSG:2873</SRS>' +
+'      <SRS>EPSG:2874</SRS>' +
+'      <SRS>EPSG:2875</SRS>' +
+'      <SRS>EPSG:2876</SRS>' +
+'      <SRS>EPSG:2877</SRS>' +
+'      <SRS>EPSG:2878</SRS>' +
+'      <SRS>EPSG:2879</SRS>' +
+'      <SRS>EPSG:2880</SRS>' +
+'      <SRS>EPSG:2881</SRS>' +
+'      <SRS>EPSG:2882</SRS>' +
+'      <SRS>EPSG:2883</SRS>' +
+'      <SRS>EPSG:2884</SRS>' +
+'      <SRS>EPSG:2885</SRS>' +
+'      <SRS>EPSG:2886</SRS>' +
+'      <SRS>EPSG:2887</SRS>' +
+'      <SRS>EPSG:2888</SRS>' +
+'      <SRS>EPSG:2889</SRS>' +
+'      <SRS>EPSG:2890</SRS>' +
+'      <SRS>EPSG:2891</SRS>' +
+'      <SRS>EPSG:2892</SRS>' +
+'      <SRS>EPSG:2893</SRS>' +
+'      <SRS>EPSG:2894</SRS>' +
+'      <SRS>EPSG:2895</SRS>' +
+'      <SRS>EPSG:2896</SRS>' +
+'      <SRS>EPSG:2897</SRS>' +
+'      <SRS>EPSG:2898</SRS>' +
+'      <SRS>EPSG:2899</SRS>' +
+'      <SRS>EPSG:2900</SRS>' +
+'      <SRS>EPSG:2901</SRS>' +
+'      <SRS>EPSG:2902</SRS>' +
+'      <SRS>EPSG:2903</SRS>' +
+'      <SRS>EPSG:2904</SRS>' +
+'      <SRS>EPSG:2905</SRS>' +
+'      <SRS>EPSG:2906</SRS>' +
+'      <SRS>EPSG:2907</SRS>' +
+'      <SRS>EPSG:2908</SRS>' +
+'      <SRS>EPSG:2909</SRS>' +
+'      <SRS>EPSG:2910</SRS>' +
+'      <SRS>EPSG:2911</SRS>' +
+'      <SRS>EPSG:2912</SRS>' +
+'      <SRS>EPSG:2913</SRS>' +
+'      <SRS>EPSG:2914</SRS>' +
+'      <SRS>EPSG:2915</SRS>' +
+'      <SRS>EPSG:2916</SRS>' +
+'      <SRS>EPSG:2917</SRS>' +
+'      <SRS>EPSG:2918</SRS>' +
+'      <SRS>EPSG:2919</SRS>' +
+'      <SRS>EPSG:2920</SRS>' +
+'      <SRS>EPSG:2921</SRS>' +
+'      <SRS>EPSG:2922</SRS>' +
+'      <SRS>EPSG:2923</SRS>' +
+'      <SRS>EPSG:2924</SRS>' +
+'      <SRS>EPSG:2925</SRS>' +
+'      <SRS>EPSG:2926</SRS>' +
+'      <SRS>EPSG:2927</SRS>' +
+'      <SRS>EPSG:2928</SRS>' +
+'      <SRS>EPSG:2929</SRS>' +
+'      <SRS>EPSG:2930</SRS>' +
+'      <SRS>EPSG:2931</SRS>' +
+'      <SRS>EPSG:2932</SRS>' +
+'      <SRS>EPSG:2933</SRS>' +
+'      <SRS>EPSG:2934</SRS>' +
+'      <SRS>EPSG:2935</SRS>' +
+'      <SRS>EPSG:2936</SRS>' +
+'      <SRS>EPSG:2937</SRS>' +
+'      <SRS>EPSG:2938</SRS>' +
+'      <SRS>EPSG:2939</SRS>' +
+'      <SRS>EPSG:2940</SRS>' +
+'      <SRS>EPSG:2941</SRS>' +
+'      <SRS>EPSG:2942</SRS>' +
+'      <SRS>EPSG:2943</SRS>' +
+'      <SRS>EPSG:2944</SRS>' +
+'      <SRS>EPSG:2945</SRS>' +
+'      <SRS>EPSG:2946</SRS>' +
+'      <SRS>EPSG:2947</SRS>' +
+'      <SRS>EPSG:2948</SRS>' +
+'      <SRS>EPSG:2949</SRS>' +
+'      <SRS>EPSG:2950</SRS>' +
+'      <SRS>EPSG:2951</SRS>' +
+'      <SRS>EPSG:2952</SRS>' +
+'      <SRS>EPSG:2953</SRS>' +
+'      <SRS>EPSG:2954</SRS>' +
+'      <SRS>EPSG:2955</SRS>' +
+'      <SRS>EPSG:2956</SRS>' +
+'      <SRS>EPSG:2957</SRS>' +
+'      <SRS>EPSG:2958</SRS>' +
+'      <SRS>EPSG:2959</SRS>' +
+'      <SRS>EPSG:2960</SRS>' +
+'      <SRS>EPSG:2961</SRS>' +
+'      <SRS>EPSG:2962</SRS>' +
+'      <SRS>EPSG:2963</SRS>' +
+'      <SRS>EPSG:2964</SRS>' +
+'      <SRS>EPSG:2965</SRS>' +
+'      <SRS>EPSG:2966</SRS>' +
+'      <SRS>EPSG:2967</SRS>' +
+'      <SRS>EPSG:2968</SRS>' +
+'      <SRS>EPSG:2969</SRS>' +
+'      <SRS>EPSG:2970</SRS>' +
+'      <SRS>EPSG:2971</SRS>' +
+'      <SRS>EPSG:2972</SRS>' +
+'      <SRS>EPSG:2973</SRS>' +
+'      <SRS>EPSG:2975</SRS>' +
+'      <SRS>EPSG:2976</SRS>' +
+'      <SRS>EPSG:2977</SRS>' +
+'      <SRS>EPSG:2978</SRS>' +
+'      <SRS>EPSG:2979</SRS>' +
+'      <SRS>EPSG:2980</SRS>' +
+'      <SRS>EPSG:2981</SRS>' +
+'      <SRS>EPSG:2982</SRS>' +
+'      <SRS>EPSG:2983</SRS>' +
+'      <SRS>EPSG:2984</SRS>' +
+'      <SRS>EPSG:2985</SRS>' +
+'      <SRS>EPSG:2986</SRS>' +
+'      <SRS>EPSG:2987</SRS>' +
+'      <SRS>EPSG:2988</SRS>' +
+'      <SRS>EPSG:2989</SRS>' +
+'      <SRS>EPSG:2990</SRS>' +
+'      <SRS>EPSG:2991</SRS>' +
+'      <SRS>EPSG:2992</SRS>' +
+'      <SRS>EPSG:2993</SRS>' +
+'      <SRS>EPSG:2994</SRS>' +
+'      <SRS>EPSG:2995</SRS>' +
+'      <SRS>EPSG:2996</SRS>' +
+'      <SRS>EPSG:2997</SRS>' +
+'      <SRS>EPSG:2998</SRS>' +
+'      <SRS>EPSG:2999</SRS>' +
+'      <SRS>EPSG:3000</SRS>' +
+'      <SRS>EPSG:3001</SRS>' +
+'      <SRS>EPSG:3002</SRS>' +
+'      <SRS>EPSG:3003</SRS>' +
+'      <SRS>EPSG:3004</SRS>' +
+'      <SRS>EPSG:3005</SRS>' +
+'      <SRS>EPSG:3006</SRS>' +
+'      <SRS>EPSG:3007</SRS>' +
+'      <SRS>EPSG:3008</SRS>' +
+'      <SRS>EPSG:3009</SRS>' +
+'      <SRS>EPSG:3010</SRS>' +
+'      <SRS>EPSG:3011</SRS>' +
+'      <SRS>EPSG:3012</SRS>' +
+'      <SRS>EPSG:3013</SRS>' +
+'      <SRS>EPSG:3014</SRS>' +
+'      <SRS>EPSG:3015</SRS>' +
+'      <SRS>EPSG:3016</SRS>' +
+'      <SRS>EPSG:3017</SRS>' +
+'      <SRS>EPSG:3018</SRS>' +
+'      <SRS>EPSG:3019</SRS>' +
+'      <SRS>EPSG:3020</SRS>' +
+'      <SRS>EPSG:3021</SRS>' +
+'      <SRS>EPSG:3022</SRS>' +
+'      <SRS>EPSG:3023</SRS>' +
+'      <SRS>EPSG:3024</SRS>' +
+'      <SRS>EPSG:3025</SRS>' +
+'      <SRS>EPSG:3026</SRS>' +
+'      <SRS>EPSG:3027</SRS>' +
+'      <SRS>EPSG:3028</SRS>' +
+'      <SRS>EPSG:3029</SRS>' +
+'      <SRS>EPSG:3030</SRS>' +
+'      <SRS>EPSG:3031</SRS>' +
+'      <SRS>EPSG:3032</SRS>' +
+'      <SRS>EPSG:3033</SRS>' +
+'      <SRS>EPSG:3034</SRS>' +
+'      <SRS>EPSG:3035</SRS>' +
+'      <SRS>EPSG:3036</SRS>' +
+'      <SRS>EPSG:3037</SRS>' +
+'      <SRS>EPSG:3038</SRS>' +
+'      <SRS>EPSG:3039</SRS>' +
+'      <SRS>EPSG:3040</SRS>' +
+'      <SRS>EPSG:3041</SRS>' +
+'      <SRS>EPSG:3042</SRS>' +
+'      <SRS>EPSG:3043</SRS>' +
+'      <SRS>EPSG:3044</SRS>' +
+'      <SRS>EPSG:3045</SRS>' +
+'      <SRS>EPSG:3046</SRS>' +
+'      <SRS>EPSG:3047</SRS>' +
+'      <SRS>EPSG:3048</SRS>' +
+'      <SRS>EPSG:3049</SRS>' +
+'      <SRS>EPSG:3050</SRS>' +
+'      <SRS>EPSG:3051</SRS>' +
+'      <SRS>EPSG:3052</SRS>' +
+'      <SRS>EPSG:3053</SRS>' +
+'      <SRS>EPSG:3054</SRS>' +
+'      <SRS>EPSG:3055</SRS>' +
+'      <SRS>EPSG:3056</SRS>' +
+'      <SRS>EPSG:3057</SRS>' +
+'      <SRS>EPSG:3058</SRS>' +
+'      <SRS>EPSG:3059</SRS>' +
+'      <SRS>EPSG:3060</SRS>' +
+'      <SRS>EPSG:3061</SRS>' +
+'      <SRS>EPSG:3062</SRS>' +
+'      <SRS>EPSG:3063</SRS>' +
+'      <SRS>EPSG:3064</SRS>' +
+'      <SRS>EPSG:3065</SRS>' +
+'      <SRS>EPSG:3066</SRS>' +
+'      <SRS>EPSG:3067</SRS>' +
+'      <SRS>EPSG:3068</SRS>' +
+'      <SRS>EPSG:3069</SRS>' +
+'      <SRS>EPSG:3070</SRS>' +
+'      <SRS>EPSG:3071</SRS>' +
+'      <SRS>EPSG:3072</SRS>' +
+'      <SRS>EPSG:3073</SRS>' +
+'      <SRS>EPSG:3074</SRS>' +
+'      <SRS>EPSG:3075</SRS>' +
+'      <SRS>EPSG:3076</SRS>' +
+'      <SRS>EPSG:3077</SRS>' +
+'      <SRS>EPSG:3078</SRS>' +
+'      <SRS>EPSG:3079</SRS>' +
+'      <SRS>EPSG:3080</SRS>' +
+'      <SRS>EPSG:3081</SRS>' +
+'      <SRS>EPSG:3082</SRS>' +
+'      <SRS>EPSG:3083</SRS>' +
+'      <SRS>EPSG:3084</SRS>' +
+'      <SRS>EPSG:3085</SRS>' +
+'      <SRS>EPSG:3086</SRS>' +
+'      <SRS>EPSG:3087</SRS>' +
+'      <SRS>EPSG:3088</SRS>' +
+'      <SRS>EPSG:3089</SRS>' +
+'      <SRS>EPSG:3090</SRS>' +
+'      <SRS>EPSG:3091</SRS>' +
+'      <SRS>EPSG:3092</SRS>' +
+'      <SRS>EPSG:3093</SRS>' +
+'      <SRS>EPSG:3094</SRS>' +
+'      <SRS>EPSG:3095</SRS>' +
+'      <SRS>EPSG:3096</SRS>' +
+'      <SRS>EPSG:3097</SRS>' +
+'      <SRS>EPSG:3098</SRS>' +
+'      <SRS>EPSG:3099</SRS>' +
+'      <SRS>EPSG:3100</SRS>' +
+'      <SRS>EPSG:3101</SRS>' +
+'      <SRS>EPSG:3102</SRS>' +
+'      <SRS>EPSG:3103</SRS>' +
+'      <SRS>EPSG:3104</SRS>' +
+'      <SRS>EPSG:3105</SRS>' +
+'      <SRS>EPSG:3106</SRS>' +
+'      <SRS>EPSG:3107</SRS>' +
+'      <SRS>EPSG:3108</SRS>' +
+'      <SRS>EPSG:3109</SRS>' +
+'      <SRS>EPSG:3110</SRS>' +
+'      <SRS>EPSG:3111</SRS>' +
+'      <SRS>EPSG:3112</SRS>' +
+'      <SRS>EPSG:3113</SRS>' +
+'      <SRS>EPSG:3114</SRS>' +
+'      <SRS>EPSG:3115</SRS>' +
+'      <SRS>EPSG:3116</SRS>' +
+'      <SRS>EPSG:3117</SRS>' +
+'      <SRS>EPSG:3118</SRS>' +
+'      <SRS>EPSG:3119</SRS>' +
+'      <SRS>EPSG:3120</SRS>' +
+'      <SRS>EPSG:3121</SRS>' +
+'      <SRS>EPSG:3122</SRS>' +
+'      <SRS>EPSG:3123</SRS>' +
+'      <SRS>EPSG:3124</SRS>' +
+'      <SRS>EPSG:3125</SRS>' +
+'      <SRS>EPSG:3126</SRS>' +
+'      <SRS>EPSG:3127</SRS>' +
+'      <SRS>EPSG:3128</SRS>' +
+'      <SRS>EPSG:3129</SRS>' +
+'      <SRS>EPSG:3130</SRS>' +
+'      <SRS>EPSG:3131</SRS>' +
+'      <SRS>EPSG:3132</SRS>' +
+'      <SRS>EPSG:3133</SRS>' +
+'      <SRS>EPSG:3134</SRS>' +
+'      <SRS>EPSG:3135</SRS>' +
+'      <SRS>EPSG:3136</SRS>' +
+'      <SRS>EPSG:3137</SRS>' +
+'      <SRS>EPSG:3138</SRS>' +
+'      <SRS>EPSG:3139</SRS>' +
+'      <SRS>EPSG:3140</SRS>' +
+'      <SRS>EPSG:3141</SRS>' +
+'      <SRS>EPSG:3142</SRS>' +
+'      <SRS>EPSG:3143</SRS>' +
+'      <SRS>EPSG:3144</SRS>' +
+'      <SRS>EPSG:3145</SRS>' +
+'      <SRS>EPSG:3146</SRS>' +
+'      <SRS>EPSG:3147</SRS>' +
+'      <SRS>EPSG:3148</SRS>' +
+'      <SRS>EPSG:3149</SRS>' +
+'      <SRS>EPSG:3150</SRS>' +
+'      <SRS>EPSG:3151</SRS>' +
+'      <SRS>EPSG:3152</SRS>' +
+'      <SRS>EPSG:3153</SRS>' +
+'      <SRS>EPSG:3154</SRS>' +
+'      <SRS>EPSG:3155</SRS>' +
+'      <SRS>EPSG:3156</SRS>' +
+'      <SRS>EPSG:3157</SRS>' +
+'      <SRS>EPSG:3158</SRS>' +
+'      <SRS>EPSG:3159</SRS>' +
+'      <SRS>EPSG:3160</SRS>' +
+'      <SRS>EPSG:3161</SRS>' +
+'      <SRS>EPSG:3162</SRS>' +
+'      <SRS>EPSG:3163</SRS>' +
+'      <SRS>EPSG:3164</SRS>' +
+'      <SRS>EPSG:3165</SRS>' +
+'      <SRS>EPSG:3166</SRS>' +
+'      <SRS>EPSG:3167</SRS>' +
+'      <SRS>EPSG:3168</SRS>' +
+'      <SRS>EPSG:3169</SRS>' +
+'      <SRS>EPSG:3170</SRS>' +
+'      <SRS>EPSG:3171</SRS>' +
+'      <SRS>EPSG:3172</SRS>' +
+'      <SRS>EPSG:3173</SRS>' +
+'      <SRS>EPSG:3174</SRS>' +
+'      <SRS>EPSG:3175</SRS>' +
+'      <SRS>EPSG:3176</SRS>' +
+'      <SRS>EPSG:3177</SRS>' +
+'      <SRS>EPSG:3178</SRS>' +
+'      <SRS>EPSG:3179</SRS>' +
+'      <SRS>EPSG:3180</SRS>' +
+'      <SRS>EPSG:3181</SRS>' +
+'      <SRS>EPSG:3182</SRS>' +
+'      <SRS>EPSG:3183</SRS>' +
+'      <SRS>EPSG:3184</SRS>' +
+'      <SRS>EPSG:3185</SRS>' +
+'      <SRS>EPSG:3186</SRS>' +
+'      <SRS>EPSG:3187</SRS>' +
+'      <SRS>EPSG:3188</SRS>' +
+'      <SRS>EPSG:3189</SRS>' +
+'      <SRS>EPSG:3190</SRS>' +
+'      <SRS>EPSG:3191</SRS>' +
+'      <SRS>EPSG:3192</SRS>' +
+'      <SRS>EPSG:3193</SRS>' +
+'      <SRS>EPSG:3194</SRS>' +
+'      <SRS>EPSG:3195</SRS>' +
+'      <SRS>EPSG:3196</SRS>' +
+'      <SRS>EPSG:3197</SRS>' +
+'      <SRS>EPSG:3198</SRS>' +
+'      <SRS>EPSG:3199</SRS>' +
+'      <SRS>EPSG:3200</SRS>' +
+'      <SRS>EPSG:3201</SRS>' +
+'      <SRS>EPSG:3202</SRS>' +
+'      <SRS>EPSG:3203</SRS>' +
+'      <SRS>EPSG:3204</SRS>' +
+'      <SRS>EPSG:3205</SRS>' +
+'      <SRS>EPSG:3206</SRS>' +
+'      <SRS>EPSG:3207</SRS>' +
+'      <SRS>EPSG:3208</SRS>' +
+'      <SRS>EPSG:3209</SRS>' +
+'      <SRS>EPSG:3210</SRS>' +
+'      <SRS>EPSG:3211</SRS>' +
+'      <SRS>EPSG:3212</SRS>' +
+'      <SRS>EPSG:3213</SRS>' +
+'      <SRS>EPSG:3214</SRS>' +
+'      <SRS>EPSG:3215</SRS>' +
+'      <SRS>EPSG:3216</SRS>' +
+'      <SRS>EPSG:3217</SRS>' +
+'      <SRS>EPSG:3218</SRS>' +
+'      <SRS>EPSG:3219</SRS>' +
+'      <SRS>EPSG:3220</SRS>' +
+'      <SRS>EPSG:3221</SRS>' +
+'      <SRS>EPSG:3222</SRS>' +
+'      <SRS>EPSG:3223</SRS>' +
+'      <SRS>EPSG:3224</SRS>' +
+'      <SRS>EPSG:3225</SRS>' +
+'      <SRS>EPSG:3226</SRS>' +
+'      <SRS>EPSG:3227</SRS>' +
+'      <SRS>EPSG:3228</SRS>' +
+'      <SRS>EPSG:3229</SRS>' +
+'      <SRS>EPSG:3230</SRS>' +
+'      <SRS>EPSG:3231</SRS>' +
+'      <SRS>EPSG:3232</SRS>' +
+'      <SRS>EPSG:3233</SRS>' +
+'      <SRS>EPSG:3234</SRS>' +
+'      <SRS>EPSG:3235</SRS>' +
+'      <SRS>EPSG:3236</SRS>' +
+'      <SRS>EPSG:3237</SRS>' +
+'      <SRS>EPSG:3238</SRS>' +
+'      <SRS>EPSG:3239</SRS>' +
+'      <SRS>EPSG:3240</SRS>' +
+'      <SRS>EPSG:3241</SRS>' +
+'      <SRS>EPSG:3242</SRS>' +
+'      <SRS>EPSG:3243</SRS>' +
+'      <SRS>EPSG:3244</SRS>' +
+'      <SRS>EPSG:3245</SRS>' +
+'      <SRS>EPSG:3246</SRS>' +
+'      <SRS>EPSG:3247</SRS>' +
+'      <SRS>EPSG:3248</SRS>' +
+'      <SRS>EPSG:3249</SRS>' +
+'      <SRS>EPSG:3250</SRS>' +
+'      <SRS>EPSG:3251</SRS>' +
+'      <SRS>EPSG:3252</SRS>' +
+'      <SRS>EPSG:3253</SRS>' +
+'      <SRS>EPSG:3254</SRS>' +
+'      <SRS>EPSG:3255</SRS>' +
+'      <SRS>EPSG:3256</SRS>' +
+'      <SRS>EPSG:3257</SRS>' +
+'      <SRS>EPSG:3258</SRS>' +
+'      <SRS>EPSG:3259</SRS>' +
+'      <SRS>EPSG:3260</SRS>' +
+'      <SRS>EPSG:3261</SRS>' +
+'      <SRS>EPSG:3262</SRS>' +
+'      <SRS>EPSG:3263</SRS>' +
+'      <SRS>EPSG:3264</SRS>' +
+'      <SRS>EPSG:3265</SRS>' +
+'      <SRS>EPSG:3266</SRS>' +
+'      <SRS>EPSG:3267</SRS>' +
+'      <SRS>EPSG:3268</SRS>' +
+'      <SRS>EPSG:3269</SRS>' +
+'      <SRS>EPSG:3270</SRS>' +
+'      <SRS>EPSG:3271</SRS>' +
+'      <SRS>EPSG:3272</SRS>' +
+'      <SRS>EPSG:3273</SRS>' +
+'      <SRS>EPSG:3274</SRS>' +
+'      <SRS>EPSG:3275</SRS>' +
+'      <SRS>EPSG:3276</SRS>' +
+'      <SRS>EPSG:3277</SRS>' +
+'      <SRS>EPSG:3278</SRS>' +
+'      <SRS>EPSG:3279</SRS>' +
+'      <SRS>EPSG:3280</SRS>' +
+'      <SRS>EPSG:3281</SRS>' +
+'      <SRS>EPSG:3282</SRS>' +
+'      <SRS>EPSG:3283</SRS>' +
+'      <SRS>EPSG:3284</SRS>' +
+'      <SRS>EPSG:3285</SRS>' +
+'      <SRS>EPSG:3286</SRS>' +
+'      <SRS>EPSG:3287</SRS>' +
+'      <SRS>EPSG:3288</SRS>' +
+'      <SRS>EPSG:3289</SRS>' +
+'      <SRS>EPSG:3290</SRS>' +
+'      <SRS>EPSG:3291</SRS>' +
+'      <SRS>EPSG:3292</SRS>' +
+'      <SRS>EPSG:3293</SRS>' +
+'      <SRS>EPSG:3294</SRS>' +
+'      <SRS>EPSG:3295</SRS>' +
+'      <SRS>EPSG:3296</SRS>' +
+'      <SRS>EPSG:3297</SRS>' +
+'      <SRS>EPSG:3298</SRS>' +
+'      <SRS>EPSG:3299</SRS>' +
+'      <SRS>EPSG:3300</SRS>' +
+'      <SRS>EPSG:3301</SRS>' +
+'      <SRS>EPSG:3302</SRS>' +
+'      <SRS>EPSG:3303</SRS>' +
+'      <SRS>EPSG:3304</SRS>' +
+'      <SRS>EPSG:3305</SRS>' +
+'      <SRS>EPSG:3306</SRS>' +
+'      <SRS>EPSG:3307</SRS>' +
+'      <SRS>EPSG:3308</SRS>' +
+'      <SRS>EPSG:3309</SRS>' +
+'      <SRS>EPSG:3310</SRS>' +
+'      <SRS>EPSG:3311</SRS>' +
+'      <SRS>EPSG:3312</SRS>' +
+'      <SRS>EPSG:3313</SRS>' +
+'      <SRS>EPSG:3314</SRS>' +
+'      <SRS>EPSG:3315</SRS>' +
+'      <SRS>EPSG:3316</SRS>' +
+'      <SRS>EPSG:3317</SRS>' +
+'      <SRS>EPSG:3318</SRS>' +
+'      <SRS>EPSG:3319</SRS>' +
+'      <SRS>EPSG:3320</SRS>' +
+'      <SRS>EPSG:3321</SRS>' +
+'      <SRS>EPSG:3322</SRS>' +
+'      <SRS>EPSG:3323</SRS>' +
+'      <SRS>EPSG:3324</SRS>' +
+'      <SRS>EPSG:3325</SRS>' +
+'      <SRS>EPSG:3326</SRS>' +
+'      <SRS>EPSG:3327</SRS>' +
+'      <SRS>EPSG:3328</SRS>' +
+'      <SRS>EPSG:3329</SRS>' +
+'      <SRS>EPSG:3330</SRS>' +
+'      <SRS>EPSG:3331</SRS>' +
+'      <SRS>EPSG:3332</SRS>' +
+'      <SRS>EPSG:3333</SRS>' +
+'      <SRS>EPSG:3334</SRS>' +
+'      <SRS>EPSG:3335</SRS>' +
+'      <SRS>EPSG:3336</SRS>' +
+'      <SRS>EPSG:3337</SRS>' +
+'      <SRS>EPSG:3338</SRS>' +
+'      <SRS>EPSG:3339</SRS>' +
+'      <SRS>EPSG:3340</SRS>' +
+'      <SRS>EPSG:3341</SRS>' +
+'      <SRS>EPSG:3342</SRS>' +
+'      <SRS>EPSG:3343</SRS>' +
+'      <SRS>EPSG:3344</SRS>' +
+'      <SRS>EPSG:3345</SRS>' +
+'      <SRS>EPSG:3346</SRS>' +
+'      <SRS>EPSG:3347</SRS>' +
+'      <SRS>EPSG:3348</SRS>' +
+'      <SRS>EPSG:3349</SRS>' +
+'      <SRS>EPSG:3350</SRS>' +
+'      <SRS>EPSG:3351</SRS>' +
+'      <SRS>EPSG:3352</SRS>' +
+'      <SRS>EPSG:3353</SRS>' +
+'      <SRS>EPSG:3354</SRS>' +
+'      <SRS>EPSG:3355</SRS>' +
+'      <SRS>EPSG:3356</SRS>' +
+'      <SRS>EPSG:3357</SRS>' +
+'      <SRS>EPSG:3358</SRS>' +
+'      <SRS>EPSG:3359</SRS>' +
+'      <SRS>EPSG:3360</SRS>' +
+'      <SRS>EPSG:3361</SRS>' +
+'      <SRS>EPSG:3362</SRS>' +
+'      <SRS>EPSG:3363</SRS>' +
+'      <SRS>EPSG:3364</SRS>' +
+'      <SRS>EPSG:3365</SRS>' +
+'      <SRS>EPSG:3366</SRS>' +
+'      <SRS>EPSG:3367</SRS>' +
+'      <SRS>EPSG:3368</SRS>' +
+'      <SRS>EPSG:3369</SRS>' +
+'      <SRS>EPSG:3370</SRS>' +
+'      <SRS>EPSG:3371</SRS>' +
+'      <SRS>EPSG:3372</SRS>' +
+'      <SRS>EPSG:3373</SRS>' +
+'      <SRS>EPSG:3374</SRS>' +
+'      <SRS>EPSG:3375</SRS>' +
+'      <SRS>EPSG:3376</SRS>' +
+'      <SRS>EPSG:3377</SRS>' +
+'      <SRS>EPSG:3378</SRS>' +
+'      <SRS>EPSG:3379</SRS>' +
+'      <SRS>EPSG:3380</SRS>' +
+'      <SRS>EPSG:3381</SRS>' +
+'      <SRS>EPSG:3382</SRS>' +
+'      <SRS>EPSG:3383</SRS>' +
+'      <SRS>EPSG:3384</SRS>' +
+'      <SRS>EPSG:3385</SRS>' +
+'      <SRS>EPSG:3386</SRS>' +
+'      <SRS>EPSG:3387</SRS>' +
+'      <SRS>EPSG:3388</SRS>' +
+'      <SRS>EPSG:3389</SRS>' +
+'      <SRS>EPSG:3390</SRS>' +
+'      <SRS>EPSG:3391</SRS>' +
+'      <SRS>EPSG:3392</SRS>' +
+'      <SRS>EPSG:3393</SRS>' +
+'      <SRS>EPSG:3394</SRS>' +
+'      <SRS>EPSG:3395</SRS>' +
+'      <SRS>EPSG:3396</SRS>' +
+'      <SRS>EPSG:3397</SRS>' +
+'      <SRS>EPSG:3398</SRS>' +
+'      <SRS>EPSG:3399</SRS>' +
+'      <SRS>EPSG:3400</SRS>' +
+'      <SRS>EPSG:3401</SRS>' +
+'      <SRS>EPSG:3402</SRS>' +
+'      <SRS>EPSG:3403</SRS>' +
+'      <SRS>EPSG:3404</SRS>' +
+'      <SRS>EPSG:3405</SRS>' +
+'      <SRS>EPSG:3406</SRS>' +
+'      <SRS>EPSG:3407</SRS>' +
+'      <SRS>EPSG:3408</SRS>' +
+'      <SRS>EPSG:3409</SRS>' +
+'      <SRS>EPSG:3410</SRS>' +
+'      <SRS>EPSG:3411</SRS>' +
+'      <SRS>EPSG:3412</SRS>' +
+'      <SRS>EPSG:3413</SRS>' +
+'      <SRS>EPSG:3414</SRS>' +
+'      <SRS>EPSG:3415</SRS>' +
+'      <SRS>EPSG:3416</SRS>' +
+'      <SRS>EPSG:3417</SRS>' +
+'      <SRS>EPSG:3418</SRS>' +
+'      <SRS>EPSG:3419</SRS>' +
+'      <SRS>EPSG:3420</SRS>' +
+'      <SRS>EPSG:3421</SRS>' +
+'      <SRS>EPSG:3422</SRS>' +
+'      <SRS>EPSG:3423</SRS>' +
+'      <SRS>EPSG:3424</SRS>' +
+'      <SRS>EPSG:3425</SRS>' +
+'      <SRS>EPSG:3426</SRS>' +
+'      <SRS>EPSG:3427</SRS>' +
+'      <SRS>EPSG:3428</SRS>' +
+'      <SRS>EPSG:3429</SRS>' +
+'      <SRS>EPSG:3430</SRS>' +
+'      <SRS>EPSG:3431</SRS>' +
+'      <SRS>EPSG:3432</SRS>' +
+'      <SRS>EPSG:3433</SRS>' +
+'      <SRS>EPSG:3434</SRS>' +
+'      <SRS>EPSG:3435</SRS>' +
+'      <SRS>EPSG:3436</SRS>' +
+'      <SRS>EPSG:3437</SRS>' +
+'      <SRS>EPSG:3438</SRS>' +
+'      <SRS>EPSG:3439</SRS>' +
+'      <SRS>EPSG:3440</SRS>' +
+'      <SRS>EPSG:3441</SRS>' +
+'      <SRS>EPSG:3442</SRS>' +
+'      <SRS>EPSG:3443</SRS>' +
+'      <SRS>EPSG:3444</SRS>' +
+'      <SRS>EPSG:3445</SRS>' +
+'      <SRS>EPSG:3446</SRS>' +
+'      <SRS>EPSG:3447</SRS>' +
+'      <SRS>EPSG:3448</SRS>' +
+'      <SRS>EPSG:3449</SRS>' +
+'      <SRS>EPSG:3450</SRS>' +
+'      <SRS>EPSG:3451</SRS>' +
+'      <SRS>EPSG:3452</SRS>' +
+'      <SRS>EPSG:3453</SRS>' +
+'      <SRS>EPSG:3454</SRS>' +
+'      <SRS>EPSG:3455</SRS>' +
+'      <SRS>EPSG:3456</SRS>' +
+'      <SRS>EPSG:3457</SRS>' +
+'      <SRS>EPSG:3458</SRS>' +
+'      <SRS>EPSG:3459</SRS>' +
+'      <SRS>EPSG:3460</SRS>' +
+'      <SRS>EPSG:3461</SRS>' +
+'      <SRS>EPSG:3462</SRS>' +
+'      <SRS>EPSG:3463</SRS>' +
+'      <SRS>EPSG:3464</SRS>' +
+'      <SRS>EPSG:3560</SRS>' +
+'      <SRS>EPSG:3561</SRS>' +
+'      <SRS>EPSG:3562</SRS>' +
+'      <SRS>EPSG:3563</SRS>' +
+'      <SRS>EPSG:3564</SRS>' +
+'      <SRS>EPSG:3565</SRS>' +
+'      <SRS>EPSG:3566</SRS>' +
+'      <SRS>EPSG:3567</SRS>' +
+'      <SRS>EPSG:3568</SRS>' +
+'      <SRS>EPSG:3569</SRS>' +
+'      <SRS>EPSG:3570</SRS>' +
+'      <SRS>EPSG:3571</SRS>' +
+'      <SRS>EPSG:3572</SRS>' +
+'      <SRS>EPSG:3573</SRS>' +
+'      <SRS>EPSG:3574</SRS>' +
+'      <SRS>EPSG:3575</SRS>' +
+'      <SRS>EPSG:3576</SRS>' +
+'      <SRS>EPSG:3577</SRS>' +
+'      <SRS>EPSG:3920</SRS>' +
+'      <SRS>EPSG:3991</SRS>' +
+'      <SRS>EPSG:3992</SRS>' +
+'      <SRS>EPSG:3993</SRS>' +
+'      <SRS>EPSG:4001</SRS>' +
+'      <SRS>EPSG:4002</SRS>' +
+'      <SRS>EPSG:4003</SRS>' +
+'      <SRS>EPSG:4004</SRS>' +
+'      <SRS>EPSG:4005</SRS>' +
+'      <SRS>EPSG:4006</SRS>' +
+'      <SRS>EPSG:4007</SRS>' +
+'      <SRS>EPSG:4008</SRS>' +
+'      <SRS>EPSG:4009</SRS>' +
+'      <SRS>EPSG:4010</SRS>' +
+'      <SRS>EPSG:4011</SRS>' +
+'      <SRS>EPSG:4012</SRS>' +
+'      <SRS>EPSG:4013</SRS>' +
+'      <SRS>EPSG:4014</SRS>' +
+'      <SRS>EPSG:4015</SRS>' +
+'      <SRS>EPSG:4016</SRS>' +
+'      <SRS>EPSG:4018</SRS>' +
+'      <SRS>EPSG:4019</SRS>' +
+'      <SRS>EPSG:4020</SRS>' +
+'      <SRS>EPSG:4021</SRS>' +
+'      <SRS>EPSG:4022</SRS>' +
+'      <SRS>EPSG:4024</SRS>' +
+'      <SRS>EPSG:4025</SRS>' +
+'      <SRS>EPSG:4027</SRS>' +
+'      <SRS>EPSG:4028</SRS>' +
+'      <SRS>EPSG:4029</SRS>' +
+'      <SRS>EPSG:4030</SRS>' +
+'      <SRS>EPSG:4031</SRS>' +
+'      <SRS>EPSG:4032</SRS>' +
+'      <SRS>EPSG:4033</SRS>' +
+'      <SRS>EPSG:4034</SRS>' +
+'      <SRS>EPSG:4035</SRS>' +
+'      <SRS>EPSG:4036</SRS>' +
+'      <SRS>EPSG:4041</SRS>' +
+'      <SRS>EPSG:4042</SRS>' +
+'      <SRS>EPSG:4043</SRS>' +
+'      <SRS>EPSG:4044</SRS>' +
+'      <SRS>EPSG:4045</SRS>' +
+'      <SRS>EPSG:4047</SRS>' +
+'      <SRS>EPSG:4052</SRS>' +
+'      <SRS>EPSG:4053</SRS>' +
+'      <SRS>EPSG:4054</SRS>' +
+'      <SRS>EPSG:4120</SRS>' +
+'      <SRS>EPSG:4121</SRS>' +
+'      <SRS>EPSG:4122</SRS>' +
+'      <SRS>EPSG:4123</SRS>' +
+'      <SRS>EPSG:4124</SRS>' +
+'      <SRS>EPSG:4125</SRS>' +
+'      <SRS>EPSG:4126</SRS>' +
+'      <SRS>EPSG:4127</SRS>' +
+'      <SRS>EPSG:4128</SRS>' +
+'      <SRS>EPSG:4129</SRS>' +
+'      <SRS>EPSG:4130</SRS>' +
+'      <SRS>EPSG:4131</SRS>' +
+'      <SRS>EPSG:4132</SRS>' +
+'      <SRS>EPSG:4133</SRS>' +
+'      <SRS>EPSG:4134</SRS>' +
+'      <SRS>EPSG:4135</SRS>' +
+'      <SRS>EPSG:4136</SRS>' +
+'      <SRS>EPSG:4137</SRS>' +
+'      <SRS>EPSG:4138</SRS>' +
+'      <SRS>EPSG:4139</SRS>' +
+'      <SRS>EPSG:4140</SRS>' +
+'      <SRS>EPSG:4141</SRS>' +
+'      <SRS>EPSG:4142</SRS>' +
+'      <SRS>EPSG:4143</SRS>' +
+'      <SRS>EPSG:4144</SRS>' +
+'      <SRS>EPSG:4145</SRS>' +
+'      <SRS>EPSG:4146</SRS>' +
+'      <SRS>EPSG:4147</SRS>' +
+'      <SRS>EPSG:4148</SRS>' +
+'      <SRS>EPSG:4149</SRS>' +
+'      <SRS>EPSG:4150</SRS>' +
+'      <SRS>EPSG:4151</SRS>' +
+'      <SRS>EPSG:4152</SRS>' +
+'      <SRS>EPSG:4153</SRS>' +
+'      <SRS>EPSG:4154</SRS>' +
+'      <SRS>EPSG:4155</SRS>' +
+'      <SRS>EPSG:4156</SRS>' +
+'      <SRS>EPSG:4157</SRS>' +
+'      <SRS>EPSG:4158</SRS>' +
+'      <SRS>EPSG:4159</SRS>' +
+'      <SRS>EPSG:4160</SRS>' +
+'      <SRS>EPSG:4161</SRS>' +
+'      <SRS>EPSG:4162</SRS>' +
+'      <SRS>EPSG:4163</SRS>' +
+'      <SRS>EPSG:4164</SRS>' +
+'      <SRS>EPSG:4165</SRS>' +
+'      <SRS>EPSG:4166</SRS>' +
+'      <SRS>EPSG:4167</SRS>' +
+'      <SRS>EPSG:4168</SRS>' +
+'      <SRS>EPSG:4169</SRS>' +
+'      <SRS>EPSG:4170</SRS>' +
+'      <SRS>EPSG:4171</SRS>' +
+'      <SRS>EPSG:4172</SRS>' +
+'      <SRS>EPSG:4173</SRS>' +
+'      <SRS>EPSG:4174</SRS>' +
+'      <SRS>EPSG:4175</SRS>' +
+'      <SRS>EPSG:4176</SRS>' +
+'      <SRS>EPSG:4178</SRS>' +
+'      <SRS>EPSG:4179</SRS>' +
+'      <SRS>EPSG:4180</SRS>' +
+'      <SRS>EPSG:4181</SRS>' +
+'      <SRS>EPSG:4182</SRS>' +
+'      <SRS>EPSG:4183</SRS>' +
+'      <SRS>EPSG:4184</SRS>' +
+'      <SRS>EPSG:4185</SRS>' +
+'      <SRS>EPSG:4188</SRS>' +
+'      <SRS>EPSG:4189</SRS>' +
+'      <SRS>EPSG:4190</SRS>' +
+'      <SRS>EPSG:4191</SRS>' +
+'      <SRS>EPSG:4192</SRS>' +
+'      <SRS>EPSG:4193</SRS>' +
+'      <SRS>EPSG:4194</SRS>' +
+'      <SRS>EPSG:4195</SRS>' +
+'      <SRS>EPSG:4196</SRS>' +
+'      <SRS>EPSG:4197</SRS>' +
+'      <SRS>EPSG:4198</SRS>' +
+'      <SRS>EPSG:4199</SRS>' +
+'      <SRS>EPSG:4200</SRS>' +
+'      <SRS>EPSG:4201</SRS>' +
+'      <SRS>EPSG:4202</SRS>' +
+'      <SRS>EPSG:4203</SRS>' +
+'      <SRS>EPSG:4204</SRS>' +
+'      <SRS>EPSG:4205</SRS>' +
+'      <SRS>EPSG:4206</SRS>' +
+'      <SRS>EPSG:4207</SRS>' +
+'      <SRS>EPSG:4208</SRS>' +
+'      <SRS>EPSG:4209</SRS>' +
+'      <SRS>EPSG:4210</SRS>' +
+'      <SRS>EPSG:4211</SRS>' +
+'      <SRS>EPSG:4212</SRS>' +
+'      <SRS>EPSG:4213</SRS>' +
+'      <SRS>EPSG:4214</SRS>' +
+'      <SRS>EPSG:4215</SRS>' +
+'      <SRS>EPSG:4216</SRS>' +
+'      <SRS>EPSG:4218</SRS>' +
+'      <SRS>EPSG:4219</SRS>' +
+'      <SRS>EPSG:4220</SRS>' +
+'      <SRS>EPSG:4221</SRS>' +
+'      <SRS>EPSG:4222</SRS>' +
+'      <SRS>EPSG:4223</SRS>' +
+'      <SRS>EPSG:4224</SRS>' +
+'      <SRS>EPSG:4225</SRS>' +
+'      <SRS>EPSG:4226</SRS>' +
+'      <SRS>EPSG:4227</SRS>' +
+'      <SRS>EPSG:4228</SRS>' +
+'      <SRS>EPSG:4229</SRS>' +
+'      <SRS>EPSG:4230</SRS>' +
+'      <SRS>EPSG:4231</SRS>' +
+'      <SRS>EPSG:4232</SRS>' +
+'      <SRS>EPSG:4233</SRS>' +
+'      <SRS>EPSG:4234</SRS>' +
+'      <SRS>EPSG:4235</SRS>' +
+'      <SRS>EPSG:4236</SRS>' +
+'      <SRS>EPSG:4237</SRS>' +
+'      <SRS>EPSG:4238</SRS>' +
+'      <SRS>EPSG:4239</SRS>' +
+'      <SRS>EPSG:4240</SRS>' +
+'      <SRS>EPSG:4241</SRS>' +
+'      <SRS>EPSG:4242</SRS>' +
+'      <SRS>EPSG:4243</SRS>' +
+'      <SRS>EPSG:4244</SRS>' +
+'      <SRS>EPSG:4245</SRS>' +
+'      <SRS>EPSG:4246</SRS>' +
+'      <SRS>EPSG:4247</SRS>' +
+'      <SRS>EPSG:4248</SRS>' +
+'      <SRS>EPSG:4249</SRS>' +
+'      <SRS>EPSG:4250</SRS>' +
+'      <SRS>EPSG:4251</SRS>' +
+'      <SRS>EPSG:4252</SRS>' +
+'      <SRS>EPSG:4253</SRS>' +
+'      <SRS>EPSG:4254</SRS>' +
+'      <SRS>EPSG:4255</SRS>' +
+'      <SRS>EPSG:4256</SRS>' +
+'      <SRS>EPSG:4257</SRS>' +
+'      <SRS>EPSG:4258</SRS>' +
+'      <SRS>EPSG:4259</SRS>' +
+'      <SRS>EPSG:4260</SRS>' +
+'      <SRS>EPSG:4261</SRS>' +
+'      <SRS>EPSG:4262</SRS>' +
+'      <SRS>EPSG:4263</SRS>' +
+'      <SRS>EPSG:4264</SRS>' +
+'      <SRS>EPSG:4265</SRS>' +
+'      <SRS>EPSG:4266</SRS>' +
+'      <SRS>EPSG:4267</SRS>' +
+'      <SRS>EPSG:4268</SRS>' +
+'      <SRS>EPSG:4269</SRS>' +
+'      <SRS>EPSG:4270</SRS>' +
+'      <SRS>EPSG:4271</SRS>' +
+'      <SRS>EPSG:4272</SRS>' +
+'      <SRS>EPSG:4273</SRS>' +
+'      <SRS>EPSG:4274</SRS>' +
+'      <SRS>EPSG:4275</SRS>' +
+'      <SRS>EPSG:4276</SRS>' +
+'      <SRS>EPSG:4277</SRS>' +
+'      <SRS>EPSG:4278</SRS>' +
+'      <SRS>EPSG:4279</SRS>' +
+'      <SRS>EPSG:4280</SRS>' +
+'      <SRS>EPSG:4281</SRS>' +
+'      <SRS>EPSG:4282</SRS>' +
+'      <SRS>EPSG:4283</SRS>' +
+'      <SRS>EPSG:4284</SRS>' +
+'      <SRS>EPSG:4285</SRS>' +
+'      <SRS>EPSG:4286</SRS>' +
+'      <SRS>EPSG:4287</SRS>' +
+'      <SRS>EPSG:4288</SRS>' +
+'      <SRS>EPSG:4289</SRS>' +
+'      <SRS>EPSG:4291</SRS>' +
+'      <SRS>EPSG:4292</SRS>' +
+'      <SRS>EPSG:4293</SRS>' +
+'      <SRS>EPSG:4294</SRS>' +
+'      <SRS>EPSG:4295</SRS>' +
+'      <SRS>EPSG:4296</SRS>' +
+'      <SRS>EPSG:4297</SRS>' +
+'      <SRS>EPSG:4298</SRS>' +
+'      <SRS>EPSG:4299</SRS>' +
+'      <SRS>EPSG:4300</SRS>' +
+'      <SRS>EPSG:4301</SRS>' +
+'      <SRS>EPSG:4302</SRS>' +
+'      <SRS>EPSG:4303</SRS>' +
+'      <SRS>EPSG:4304</SRS>' +
+'      <SRS>EPSG:4306</SRS>' +
+'      <SRS>EPSG:4307</SRS>' +
+'      <SRS>EPSG:4308</SRS>' +
+'      <SRS>EPSG:4309</SRS>' +
+'      <SRS>EPSG:4310</SRS>' +
+'      <SRS>EPSG:4311</SRS>' +
+'      <SRS>EPSG:4312</SRS>' +
+'      <SRS>EPSG:4313</SRS>' +
+'      <SRS>EPSG:4314</SRS>' +
+'      <SRS>EPSG:4315</SRS>' +
+'      <SRS>EPSG:4316</SRS>' +
+'      <SRS>EPSG:4317</SRS>' +
+'      <SRS>EPSG:4318</SRS>' +
+'      <SRS>EPSG:4319</SRS>' +
+'      <SRS>EPSG:4322</SRS>' +
+'      <SRS>EPSG:4324</SRS>' +
+'      <SRS>EPSG:4326</SRS>' +
+'      <SRS>EPSG:4327</SRS>' +
+'      <SRS>EPSG:4328</SRS>' +
+'      <SRS>EPSG:4329</SRS>' +
+'      <SRS>EPSG:4330</SRS>' +
+'      <SRS>EPSG:4331</SRS>' +
+'      <SRS>EPSG:4332</SRS>' +
+'      <SRS>EPSG:4333</SRS>' +
+'      <SRS>EPSG:4334</SRS>' +
+'      <SRS>EPSG:4335</SRS>' +
+'      <SRS>EPSG:4336</SRS>' +
+'      <SRS>EPSG:4337</SRS>' +
+'      <SRS>EPSG:4338</SRS>' +
+'      <SRS>EPSG:4339</SRS>' +
+'      <SRS>EPSG:4340</SRS>' +
+'      <SRS>EPSG:4341</SRS>' +
+'      <SRS>EPSG:4342</SRS>' +
+'      <SRS>EPSG:4343</SRS>' +
+'      <SRS>EPSG:4344</SRS>' +
+'      <SRS>EPSG:4345</SRS>' +
+'      <SRS>EPSG:4346</SRS>' +
+'      <SRS>EPSG:4347</SRS>' +
+'      <SRS>EPSG:4348</SRS>' +
+'      <SRS>EPSG:4349</SRS>' +
+'      <SRS>EPSG:4350</SRS>' +
+'      <SRS>EPSG:4351</SRS>' +
+'      <SRS>EPSG:4352</SRS>' +
+'      <SRS>EPSG:4353</SRS>' +
+'      <SRS>EPSG:4354</SRS>' +
+'      <SRS>EPSG:4355</SRS>' +
+'      <SRS>EPSG:4356</SRS>' +
+'      <SRS>EPSG:4357</SRS>' +
+'      <SRS>EPSG:4358</SRS>' +
+'      <SRS>EPSG:4359</SRS>' +
+'      <SRS>EPSG:4360</SRS>' +
+'      <SRS>EPSG:4361</SRS>' +
+'      <SRS>EPSG:4362</SRS>' +
+'      <SRS>EPSG:4363</SRS>' +
+'      <SRS>EPSG:4364</SRS>' +
+'      <SRS>EPSG:4365</SRS>' +
+'      <SRS>EPSG:4366</SRS>' +
+'      <SRS>EPSG:4367</SRS>' +
+'      <SRS>EPSG:4368</SRS>' +
+'      <SRS>EPSG:4369</SRS>' +
+'      <SRS>EPSG:4370</SRS>' +
+'      <SRS>EPSG:4371</SRS>' +
+'      <SRS>EPSG:4372</SRS>' +
+'      <SRS>EPSG:4373</SRS>' +
+'      <SRS>EPSG:4374</SRS>' +
+'      <SRS>EPSG:4375</SRS>' +
+'      <SRS>EPSG:4376</SRS>' +
+'      <SRS>EPSG:4377</SRS>' +
+'      <SRS>EPSG:4378</SRS>' +
+'      <SRS>EPSG:4379</SRS>' +
+'      <SRS>EPSG:4380</SRS>' +
+'      <SRS>EPSG:4381</SRS>' +
+'      <SRS>EPSG:4382</SRS>' +
+'      <SRS>EPSG:4383</SRS>' +
+'      <SRS>EPSG:4384</SRS>' +
+'      <SRS>EPSG:4385</SRS>' +
+'      <SRS>EPSG:4386</SRS>' +
+'      <SRS>EPSG:4387</SRS>' +
+'      <SRS>EPSG:4388</SRS>' +
+'      <SRS>EPSG:4389</SRS>' +
+'      <SRS>EPSG:4600</SRS>' +
+'      <SRS>EPSG:4601</SRS>' +
+'      <SRS>EPSG:4602</SRS>' +
+'      <SRS>EPSG:4603</SRS>' +
+'      <SRS>EPSG:4604</SRS>' +
+'      <SRS>EPSG:4605</SRS>' +
+'      <SRS>EPSG:4606</SRS>' +
+'      <SRS>EPSG:4607</SRS>' +
+'      <SRS>EPSG:4608</SRS>' +
+'      <SRS>EPSG:4609</SRS>' +
+'      <SRS>EPSG:4610</SRS>' +
+'      <SRS>EPSG:4611</SRS>' +
+'      <SRS>EPSG:4612</SRS>' +
+'      <SRS>EPSG:4613</SRS>' +
+'      <SRS>EPSG:4614</SRS>' +
+'      <SRS>EPSG:4615</SRS>' +
+'      <SRS>EPSG:4616</SRS>' +
+'      <SRS>EPSG:4617</SRS>' +
+'      <SRS>EPSG:4618</SRS>' +
+'      <SRS>EPSG:4619</SRS>' +
+'      <SRS>EPSG:4620</SRS>' +
+'      <SRS>EPSG:4621</SRS>' +
+'      <SRS>EPSG:4622</SRS>' +
+'      <SRS>EPSG:4623</SRS>' +
+'      <SRS>EPSG:4624</SRS>' +
+'      <SRS>EPSG:4625</SRS>' +
+'      <SRS>EPSG:4626</SRS>' +
+'      <SRS>EPSG:4627</SRS>' +
+'      <SRS>EPSG:4628</SRS>' +
+'      <SRS>EPSG:4629</SRS>' +
+'      <SRS>EPSG:4630</SRS>' +
+'      <SRS>EPSG:4631</SRS>' +
+'      <SRS>EPSG:4632</SRS>' +
+'      <SRS>EPSG:4633</SRS>' +
+'      <SRS>EPSG:4634</SRS>' +
+'      <SRS>EPSG:4635</SRS>' +
+'      <SRS>EPSG:4636</SRS>' +
+'      <SRS>EPSG:4637</SRS>' +
+'      <SRS>EPSG:4638</SRS>' +
+'      <SRS>EPSG:4639</SRS>' +
+'      <SRS>EPSG:4640</SRS>' +
+'      <SRS>EPSG:4641</SRS>' +
+'      <SRS>EPSG:4642</SRS>' +
+'      <SRS>EPSG:4643</SRS>' +
+'      <SRS>EPSG:4644</SRS>' +
+'      <SRS>EPSG:4645</SRS>' +
+'      <SRS>EPSG:4646</SRS>' +
+'      <SRS>EPSG:4657</SRS>' +
+'      <SRS>EPSG:4658</SRS>' +
+'      <SRS>EPSG:4659</SRS>' +
+'      <SRS>EPSG:4660</SRS>' +
+'      <SRS>EPSG:4661</SRS>' +
+'      <SRS>EPSG:4662</SRS>' +
+'      <SRS>EPSG:4663</SRS>' +
+'      <SRS>EPSG:4664</SRS>' +
+'      <SRS>EPSG:4665</SRS>' +
+'      <SRS>EPSG:4666</SRS>' +
+'      <SRS>EPSG:4667</SRS>' +
+'      <SRS>EPSG:4668</SRS>' +
+'      <SRS>EPSG:4669</SRS>' +
+'      <SRS>EPSG:4670</SRS>' +
+'      <SRS>EPSG:4671</SRS>' +
+'      <SRS>EPSG:4672</SRS>' +
+'      <SRS>EPSG:4673</SRS>' +
+'      <SRS>EPSG:4674</SRS>' +
+'      <SRS>EPSG:4675</SRS>' +
+'      <SRS>EPSG:4676</SRS>' +
+'      <SRS>EPSG:4677</SRS>' +
+'      <SRS>EPSG:4678</SRS>' +
+'      <SRS>EPSG:4679</SRS>' +
+'      <SRS>EPSG:4680</SRS>' +
+'      <SRS>EPSG:4681</SRS>' +
+'      <SRS>EPSG:4682</SRS>' +
+'      <SRS>EPSG:4683</SRS>' +
+'      <SRS>EPSG:4684</SRS>' +
+'      <SRS>EPSG:4685</SRS>' +
+'      <SRS>EPSG:4686</SRS>' +
+'      <SRS>EPSG:4687</SRS>' +
+'      <SRS>EPSG:4688</SRS>' +
+'      <SRS>EPSG:4689</SRS>' +
+'      <SRS>EPSG:4690</SRS>' +
+'      <SRS>EPSG:4691</SRS>' +
+'      <SRS>EPSG:4692</SRS>' +
+'      <SRS>EPSG:4693</SRS>' +
+'      <SRS>EPSG:4694</SRS>' +
+'      <SRS>EPSG:4695</SRS>' +
+'      <SRS>EPSG:4696</SRS>' +
+'      <SRS>EPSG:4697</SRS>' +
+'      <SRS>EPSG:4698</SRS>' +
+'      <SRS>EPSG:4699</SRS>' +
+'      <SRS>EPSG:4700</SRS>' +
+'      <SRS>EPSG:4701</SRS>' +
+'      <SRS>EPSG:4702</SRS>' +
+'      <SRS>EPSG:4703</SRS>' +
+'      <SRS>EPSG:4704</SRS>' +
+'      <SRS>EPSG:4705</SRS>' +
+'      <SRS>EPSG:4706</SRS>' +
+'      <SRS>EPSG:4707</SRS>' +
+'      <SRS>EPSG:4708</SRS>' +
+'      <SRS>EPSG:4709</SRS>' +
+'      <SRS>EPSG:4710</SRS>' +
+'      <SRS>EPSG:4711</SRS>' +
+'      <SRS>EPSG:4712</SRS>' +
+'      <SRS>EPSG:4713</SRS>' +
+'      <SRS>EPSG:4714</SRS>' +
+'      <SRS>EPSG:4715</SRS>' +
+'      <SRS>EPSG:4716</SRS>' +
+'      <SRS>EPSG:4717</SRS>' +
+'      <SRS>EPSG:4718</SRS>' +
+'      <SRS>EPSG:4719</SRS>' +
+'      <SRS>EPSG:4720</SRS>' +
+'      <SRS>EPSG:4721</SRS>' +
+'      <SRS>EPSG:4722</SRS>' +
+'      <SRS>EPSG:4723</SRS>' +
+'      <SRS>EPSG:4724</SRS>' +
+'      <SRS>EPSG:4725</SRS>' +
+'      <SRS>EPSG:4726</SRS>' +
+'      <SRS>EPSG:4727</SRS>' +
+'      <SRS>EPSG:4728</SRS>' +
+'      <SRS>EPSG:4729</SRS>' +
+'      <SRS>EPSG:4730</SRS>' +
+'      <SRS>EPSG:4731</SRS>' +
+'      <SRS>EPSG:4732</SRS>' +
+'      <SRS>EPSG:4733</SRS>' +
+'      <SRS>EPSG:4734</SRS>' +
+'      <SRS>EPSG:4735</SRS>' +
+'      <SRS>EPSG:4736</SRS>' +
+'      <SRS>EPSG:4737</SRS>' +
+'      <SRS>EPSG:4738</SRS>' +
+'      <SRS>EPSG:4739</SRS>' +
+'      <SRS>EPSG:4740</SRS>' +
+'      <SRS>EPSG:4741</SRS>' +
+'      <SRS>EPSG:4742</SRS>' +
+'      <SRS>EPSG:4743</SRS>' +
+'      <SRS>EPSG:4744</SRS>' +
+'      <SRS>EPSG:4745</SRS>' +
+'      <SRS>EPSG:4746</SRS>' +
+'      <SRS>EPSG:4747</SRS>' +
+'      <SRS>EPSG:4748</SRS>' +
+'      <SRS>EPSG:4749</SRS>' +
+'      <SRS>EPSG:4750</SRS>' +
+'      <SRS>EPSG:4751</SRS>' +
+'      <SRS>EPSG:4752</SRS>' +
+'      <SRS>EPSG:4753</SRS>' +
+'      <SRS>EPSG:4754</SRS>' +
+'      <SRS>EPSG:4755</SRS>' +
+'      <SRS>EPSG:4756</SRS>' +
+'      <SRS>EPSG:4757</SRS>' +
+'      <SRS>EPSG:4758</SRS>' +
+'      <SRS>EPSG:4801</SRS>' +
+'      <SRS>EPSG:4802</SRS>' +
+'      <SRS>EPSG:4803</SRS>' +
+'      <SRS>EPSG:4804</SRS>' +
+'      <SRS>EPSG:4805</SRS>' +
+'      <SRS>EPSG:4806</SRS>' +
+'      <SRS>EPSG:4807</SRS>' +
+'      <SRS>EPSG:4808</SRS>' +
+'      <SRS>EPSG:4809</SRS>' +
+'      <SRS>EPSG:4810</SRS>' +
+'      <SRS>EPSG:4811</SRS>' +
+'      <SRS>EPSG:4813</SRS>' +
+'      <SRS>EPSG:4814</SRS>' +
+'      <SRS>EPSG:4815</SRS>' +
+'      <SRS>EPSG:4816</SRS>' +
+'      <SRS>EPSG:4817</SRS>' +
+'      <SRS>EPSG:4818</SRS>' +
+'      <SRS>EPSG:4819</SRS>' +
+'      <SRS>EPSG:4820</SRS>' +
+'      <SRS>EPSG:4821</SRS>' +
+'      <SRS>EPSG:4894</SRS>' +
+'      <SRS>EPSG:4895</SRS>' +
+'      <SRS>EPSG:4896</SRS>' +
+'      <SRS>EPSG:4897</SRS>' +
+'      <SRS>EPSG:4898</SRS>' +
+'      <SRS>EPSG:4899</SRS>' +
+'      <SRS>EPSG:4900</SRS>' +
+'      <SRS>EPSG:4901</SRS>' +
+'      <SRS>EPSG:4902</SRS>' +
+'      <SRS>EPSG:4903</SRS>' +
+'      <SRS>EPSG:4904</SRS>' +
+'      <SRS>EPSG:4906</SRS>' +
+'      <SRS>EPSG:4907</SRS>' +
+'      <SRS>EPSG:4908</SRS>' +
+'      <SRS>EPSG:4909</SRS>' +
+'      <SRS>EPSG:4910</SRS>' +
+'      <SRS>EPSG:4911</SRS>' +
+'      <SRS>EPSG:4912</SRS>' +
+'      <SRS>EPSG:4913</SRS>' +
+'      <SRS>EPSG:4914</SRS>' +
+'      <SRS>EPSG:4915</SRS>' +
+'      <SRS>EPSG:4916</SRS>' +
+'      <SRS>EPSG:4917</SRS>' +
+'      <SRS>EPSG:4918</SRS>' +
+'      <SRS>EPSG:4919</SRS>' +
+'      <SRS>EPSG:4920</SRS>' +
+'      <SRS>EPSG:4921</SRS>' +
+'      <SRS>EPSG:4922</SRS>' +
+'      <SRS>EPSG:4923</SRS>' +
+'      <SRS>EPSG:4924</SRS>' +
+'      <SRS>EPSG:4925</SRS>' +
+'      <SRS>EPSG:4926</SRS>' +
+'      <SRS>EPSG:4927</SRS>' +
+'      <SRS>EPSG:4928</SRS>' +
+'      <SRS>EPSG:4929</SRS>' +
+'      <SRS>EPSG:4930</SRS>' +
+'      <SRS>EPSG:4931</SRS>' +
+'      <SRS>EPSG:4932</SRS>' +
+'      <SRS>EPSG:4933</SRS>' +
+'      <SRS>EPSG:4934</SRS>' +
+'      <SRS>EPSG:4935</SRS>' +
+'      <SRS>EPSG:4936</SRS>' +
+'      <SRS>EPSG:4937</SRS>' +
+'      <SRS>EPSG:4938</SRS>' +
+'      <SRS>EPSG:4939</SRS>' +
+'      <SRS>EPSG:4940</SRS>' +
+'      <SRS>EPSG:4941</SRS>' +
+'      <SRS>EPSG:4942</SRS>' +
+'      <SRS>EPSG:4943</SRS>' +
+'      <SRS>EPSG:4944</SRS>' +
+'      <SRS>EPSG:4945</SRS>' +
+'      <SRS>EPSG:4946</SRS>' +
+'      <SRS>EPSG:4947</SRS>' +
+'      <SRS>EPSG:4948</SRS>' +
+'      <SRS>EPSG:4949</SRS>' +
+'      <SRS>EPSG:4950</SRS>' +
+'      <SRS>EPSG:4951</SRS>' +
+'      <SRS>EPSG:4952</SRS>' +
+'      <SRS>EPSG:4953</SRS>' +
+'      <SRS>EPSG:4954</SRS>' +
+'      <SRS>EPSG:4955</SRS>' +
+'      <SRS>EPSG:4956</SRS>' +
+'      <SRS>EPSG:4957</SRS>' +
+'      <SRS>EPSG:4958</SRS>' +
+'      <SRS>EPSG:4959</SRS>' +
+'      <SRS>EPSG:4960</SRS>' +
+'      <SRS>EPSG:4961</SRS>' +
+'      <SRS>EPSG:4962</SRS>' +
+'      <SRS>EPSG:4963</SRS>' +
+'      <SRS>EPSG:4964</SRS>' +
+'      <SRS>EPSG:4965</SRS>' +
+'      <SRS>EPSG:4966</SRS>' +
+'      <SRS>EPSG:4967</SRS>' +
+'      <SRS>EPSG:4968</SRS>' +
+'      <SRS>EPSG:4969</SRS>' +
+'      <SRS>EPSG:4970</SRS>' +
+'      <SRS>EPSG:4971</SRS>' +
+'      <SRS>EPSG:4972</SRS>' +
+'      <SRS>EPSG:4973</SRS>' +
+'      <SRS>EPSG:4974</SRS>' +
+'      <SRS>EPSG:4975</SRS>' +
+'      <SRS>EPSG:4976</SRS>' +
+'      <SRS>EPSG:4977</SRS>' +
+'      <SRS>EPSG:4978</SRS>' +
+'      <SRS>EPSG:4979</SRS>' +
+'      <SRS>EPSG:4980</SRS>' +
+'      <SRS>EPSG:4981</SRS>' +
+'      <SRS>EPSG:4982</SRS>' +
+'      <SRS>EPSG:4983</SRS>' +
+'      <SRS>EPSG:4984</SRS>' +
+'      <SRS>EPSG:4985</SRS>' +
+'      <SRS>EPSG:4986</SRS>' +
+'      <SRS>EPSG:4987</SRS>' +
+'      <SRS>EPSG:4988</SRS>' +
+'      <SRS>EPSG:4989</SRS>' +
+'      <SRS>EPSG:4990</SRS>' +
+'      <SRS>EPSG:4991</SRS>' +
+'      <SRS>EPSG:4992</SRS>' +
+'      <SRS>EPSG:4993</SRS>' +
+'      <SRS>EPSG:4994</SRS>' +
+'      <SRS>EPSG:4995</SRS>' +
+'      <SRS>EPSG:4996</SRS>' +
+'      <SRS>EPSG:4997</SRS>' +
+'      <SRS>EPSG:4998</SRS>' +
+'      <SRS>EPSG:4999</SRS>' +
+'      <SRS>EPSG:5600</SRS>' +
+'      <SRS>EPSG:5601</SRS>' +
+'      <SRS>EPSG:5602</SRS>' +
+'      <SRS>EPSG:5603</SRS>' +
+'      <SRS>EPSG:5604</SRS>' +
+'      <SRS>EPSG:5605</SRS>' +
+'      <SRS>EPSG:5606</SRS>' +
+'      <SRS>EPSG:5607</SRS>' +
+'      <SRS>EPSG:5608</SRS>' +
+'      <SRS>EPSG:5609</SRS>' +
+'      <SRS>EPSG:5701</SRS>' +
+'      <SRS>EPSG:5702</SRS>' +
+'      <SRS>EPSG:5703</SRS>' +
+'      <SRS>EPSG:5704</SRS>' +
+'      <SRS>EPSG:5705</SRS>' +
+'      <SRS>EPSG:5706</SRS>' +
+'      <SRS>EPSG:5709</SRS>' +
+'      <SRS>EPSG:5710</SRS>' +
+'      <SRS>EPSG:5711</SRS>' +
+'      <SRS>EPSG:5712</SRS>' +
+'      <SRS>EPSG:5713</SRS>' +
+'      <SRS>EPSG:5714</SRS>' +
+'      <SRS>EPSG:5715</SRS>' +
+'      <SRS>EPSG:5716</SRS>' +
+'      <SRS>EPSG:5717</SRS>' +
+'      <SRS>EPSG:5718</SRS>' +
+'      <SRS>EPSG:5719</SRS>' +
+'      <SRS>EPSG:5720</SRS>' +
+'      <SRS>EPSG:5721</SRS>' +
+'      <SRS>EPSG:5722</SRS>' +
+'      <SRS>EPSG:5723</SRS>' +
+'      <SRS>EPSG:5724</SRS>' +
+'      <SRS>EPSG:5725</SRS>' +
+'      <SRS>EPSG:5726</SRS>' +
+'      <SRS>EPSG:5727</SRS>' +
+'      <SRS>EPSG:5728</SRS>' +
+'      <SRS>EPSG:5729</SRS>' +
+'      <SRS>EPSG:5730</SRS>' +
+'      <SRS>EPSG:5731</SRS>' +
+'      <SRS>EPSG:5732</SRS>' +
+'      <SRS>EPSG:5733</SRS>' +
+'      <SRS>EPSG:5734</SRS>' +
+'      <SRS>EPSG:5735</SRS>' +
+'      <SRS>EPSG:5736</SRS>' +
+'      <SRS>EPSG:5737</SRS>' +
+'      <SRS>EPSG:5738</SRS>' +
+'      <SRS>EPSG:5739</SRS>' +
+'      <SRS>EPSG:5740</SRS>' +
+'      <SRS>EPSG:5741</SRS>' +
+'      <SRS>EPSG:5742</SRS>' +
+'      <SRS>EPSG:5743</SRS>' +
+'      <SRS>EPSG:5744</SRS>' +
+'      <SRS>EPSG:5745</SRS>' +
+'      <SRS>EPSG:5746</SRS>' +
+'      <SRS>EPSG:5747</SRS>' +
+'      <SRS>EPSG:5748</SRS>' +
+'      <SRS>EPSG:5749</SRS>' +
+'      <SRS>EPSG:5750</SRS>' +
+'      <SRS>EPSG:5751</SRS>' +
+'      <SRS>EPSG:5752</SRS>' +
+'      <SRS>EPSG:5753</SRS>' +
+'      <SRS>EPSG:5754</SRS>' +
+'      <SRS>EPSG:5755</SRS>' +
+'      <SRS>EPSG:5756</SRS>' +
+'      <SRS>EPSG:5757</SRS>' +
+'      <SRS>EPSG:5758</SRS>' +
+'      <SRS>EPSG:5759</SRS>' +
+'      <SRS>EPSG:5760</SRS>' +
+'      <SRS>EPSG:5761</SRS>' +
+'      <SRS>EPSG:5762</SRS>' +
+'      <SRS>EPSG:5763</SRS>' +
+'      <SRS>EPSG:5764</SRS>' +
+'      <SRS>EPSG:5765</SRS>' +
+'      <SRS>EPSG:5766</SRS>' +
+'      <SRS>EPSG:5767</SRS>' +
+'      <SRS>EPSG:5768</SRS>' +
+'      <SRS>EPSG:5769</SRS>' +
+'      <SRS>EPSG:5770</SRS>' +
+'      <SRS>EPSG:5771</SRS>' +
+'      <SRS>EPSG:5772</SRS>' +
+'      <SRS>EPSG:5773</SRS>' +
+'      <SRS>EPSG:5774</SRS>' +
+'      <SRS>EPSG:5775</SRS>' +
+'      <SRS>EPSG:5776</SRS>' +
+'      <SRS>EPSG:5777</SRS>' +
+'      <SRS>EPSG:5778</SRS>' +
+'      <SRS>EPSG:5779</SRS>' +
+'      <SRS>EPSG:5780</SRS>' +
+'      <SRS>EPSG:5781</SRS>' +
+'      <SRS>EPSG:5782</SRS>' +
+'      <SRS>EPSG:5783</SRS>' +
+'      <SRS>EPSG:5784</SRS>' +
+'      <SRS>EPSG:5785</SRS>' +
+'      <SRS>EPSG:5786</SRS>' +
+'      <SRS>EPSG:5787</SRS>' +
+'      <SRS>EPSG:5788</SRS>' +
+'      <SRS>EPSG:5789</SRS>' +
+'      <SRS>EPSG:5790</SRS>' +
+'      <SRS>EPSG:5791</SRS>' +
+'      <SRS>EPSG:5792</SRS>' +
+'      <SRS>EPSG:5793</SRS>' +
+'      <SRS>EPSG:5794</SRS>' +
+'      <SRS>EPSG:5795</SRS>' +
+'      <SRS>EPSG:5796</SRS>' +
+'      <SRS>EPSG:5797</SRS>' +
+'      <SRS>EPSG:5798</SRS>' +
+'      <SRS>EPSG:5799</SRS>' +
+'      <SRS>EPSG:5800</SRS>' +
+'      <SRS>EPSG:5801</SRS>' +
+'      <SRS>EPSG:5802</SRS>' +
+'      <SRS>EPSG:5803</SRS>' +
+'      <SRS>EPSG:5804</SRS>' +
+'      <SRS>EPSG:5805</SRS>' +
+'      <SRS>EPSG:5806</SRS>' +
+'      <SRS>EPSG:5807</SRS>' +
+'      <SRS>EPSG:5808</SRS>' +
+'      <SRS>EPSG:5809</SRS>' +
+'      <SRS>EPSG:5810</SRS>' +
+'      <SRS>EPSG:5811</SRS>' +
+'      <SRS>EPSG:5812</SRS>' +
+'      <SRS>EPSG:5813</SRS>' +
+'      <SRS>EPSG:5814</SRS>' +
+'      <SRS>EPSG:5815</SRS>' +
+'      <SRS>EPSG:5816</SRS>' +
+'      <SRS>EPSG:5817</SRS>' +
+'      <SRS>EPSG:5818</SRS>' +
+'      <SRS>EPSG:7400</SRS>' +
+'      <SRS>EPSG:7401</SRS>' +
+'      <SRS>EPSG:7402</SRS>' +
+'      <SRS>EPSG:7403</SRS>' +
+'      <SRS>EPSG:7404</SRS>' +
+'      <SRS>EPSG:7405</SRS>' +
+'      <SRS>EPSG:7406</SRS>' +
+'      <SRS>EPSG:7407</SRS>' +
+'      <SRS>EPSG:7408</SRS>' +
+'      <SRS>EPSG:7409</SRS>' +
+'      <SRS>EPSG:7410</SRS>' +
+'      <SRS>EPSG:7411</SRS>' +
+'      <SRS>EPSG:7412</SRS>' +
+'      <SRS>EPSG:7413</SRS>' +
+'      <SRS>EPSG:7414</SRS>' +
+'      <SRS>EPSG:7415</SRS>' +
+'      <SRS>EPSG:7416</SRS>' +
+'      <SRS>EPSG:7417</SRS>' +
+'      <SRS>EPSG:7418</SRS>' +
+'      <SRS>EPSG:7419</SRS>' +
+'      <SRS>EPSG:7420</SRS>' +
+'      <SRS>EPSG:20004</SRS>' +
+'      <SRS>EPSG:20005</SRS>' +
+'      <SRS>EPSG:20006</SRS>' +
+'      <SRS>EPSG:20007</SRS>' +
+'      <SRS>EPSG:20008</SRS>' +
+'      <SRS>EPSG:20009</SRS>' +
+'      <SRS>EPSG:20010</SRS>' +
+'      <SRS>EPSG:20011</SRS>' +
+'      <SRS>EPSG:20012</SRS>' +
+'      <SRS>EPSG:20013</SRS>' +
+'      <SRS>EPSG:20014</SRS>' +
+'      <SRS>EPSG:20015</SRS>' +
+'      <SRS>EPSG:20016</SRS>' +
+'      <SRS>EPSG:20017</SRS>' +
+'      <SRS>EPSG:20018</SRS>' +
+'      <SRS>EPSG:20019</SRS>' +
+'      <SRS>EPSG:20020</SRS>' +
+'      <SRS>EPSG:20021</SRS>' +
+'      <SRS>EPSG:20022</SRS>' +
+'      <SRS>EPSG:20023</SRS>' +
+'      <SRS>EPSG:20024</SRS>' +
+'      <SRS>EPSG:20025</SRS>' +
+'      <SRS>EPSG:20026</SRS>' +
+'      <SRS>EPSG:20027</SRS>' +
+'      <SRS>EPSG:20028</SRS>' +
+'      <SRS>EPSG:20029</SRS>' +
+'      <SRS>EPSG:20030</SRS>' +
+'      <SRS>EPSG:20031</SRS>' +
+'      <SRS>EPSG:20032</SRS>' +
+'      <SRS>EPSG:20064</SRS>' +
+'      <SRS>EPSG:20065</SRS>' +
+'      <SRS>EPSG:20066</SRS>' +
+'      <SRS>EPSG:20067</SRS>' +
+'      <SRS>EPSG:20068</SRS>' +
+'      <SRS>EPSG:20069</SRS>' +
+'      <SRS>EPSG:20070</SRS>' +
+'      <SRS>EPSG:20071</SRS>' +
+'      <SRS>EPSG:20072</SRS>' +
+'      <SRS>EPSG:20073</SRS>' +
+'      <SRS>EPSG:20074</SRS>' +
+'      <SRS>EPSG:20075</SRS>' +
+'      <SRS>EPSG:20076</SRS>' +
+'      <SRS>EPSG:20077</SRS>' +
+'      <SRS>EPSG:20078</SRS>' +
+'      <SRS>EPSG:20079</SRS>' +
+'      <SRS>EPSG:20080</SRS>' +
+'      <SRS>EPSG:20081</SRS>' +
+'      <SRS>EPSG:20082</SRS>' +
+'      <SRS>EPSG:20083</SRS>' +
+'      <SRS>EPSG:20084</SRS>' +
+'      <SRS>EPSG:20085</SRS>' +
+'      <SRS>EPSG:20086</SRS>' +
+'      <SRS>EPSG:20087</SRS>' +
+'      <SRS>EPSG:20088</SRS>' +
+'      <SRS>EPSG:20089</SRS>' +
+'      <SRS>EPSG:20090</SRS>' +
+'      <SRS>EPSG:20091</SRS>' +
+'      <SRS>EPSG:20092</SRS>' +
+'      <SRS>EPSG:20135</SRS>' +
+'      <SRS>EPSG:20136</SRS>' +
+'      <SRS>EPSG:20137</SRS>' +
+'      <SRS>EPSG:20138</SRS>' +
+'      <SRS>EPSG:20248</SRS>' +
+'      <SRS>EPSG:20249</SRS>' +
+'      <SRS>EPSG:20250</SRS>' +
+'      <SRS>EPSG:20251</SRS>' +
+'      <SRS>EPSG:20252</SRS>' +
+'      <SRS>EPSG:20253</SRS>' +
+'      <SRS>EPSG:20254</SRS>' +
+'      <SRS>EPSG:20255</SRS>' +
+'      <SRS>EPSG:20256</SRS>' +
+'      <SRS>EPSG:20257</SRS>' +
+'      <SRS>EPSG:20258</SRS>' +
+'      <SRS>EPSG:20348</SRS>' +
+'      <SRS>EPSG:20349</SRS>' +
+'      <SRS>EPSG:20350</SRS>' +
+'      <SRS>EPSG:20351</SRS>' +
+'      <SRS>EPSG:20352</SRS>' +
+'      <SRS>EPSG:20353</SRS>' +
+'      <SRS>EPSG:20354</SRS>' +
+'      <SRS>EPSG:20355</SRS>' +
+'      <SRS>EPSG:20356</SRS>' +
+'      <SRS>EPSG:20357</SRS>' +
+'      <SRS>EPSG:20358</SRS>' +
+'      <SRS>EPSG:20436</SRS>' +
+'      <SRS>EPSG:20437</SRS>' +
+'      <SRS>EPSG:20438</SRS>' +
+'      <SRS>EPSG:20439</SRS>' +
+'      <SRS>EPSG:20440</SRS>' +
+'      <SRS>EPSG:20499</SRS>' +
+'      <SRS>EPSG:20538</SRS>' +
+'      <SRS>EPSG:20539</SRS>' +
+'      <SRS>EPSG:20790</SRS>' +
+'      <SRS>EPSG:20791</SRS>' +
+'      <SRS>EPSG:20822</SRS>' +
+'      <SRS>EPSG:20823</SRS>' +
+'      <SRS>EPSG:20824</SRS>' +
+'      <SRS>EPSG:20934</SRS>' +
+'      <SRS>EPSG:20935</SRS>' +
+'      <SRS>EPSG:20936</SRS>' +
+'      <SRS>EPSG:21035</SRS>' +
+'      <SRS>EPSG:21036</SRS>' +
+'      <SRS>EPSG:21037</SRS>' +
+'      <SRS>EPSG:21095</SRS>' +
+'      <SRS>EPSG:21096</SRS>' +
+'      <SRS>EPSG:21097</SRS>' +
+'      <SRS>EPSG:21100</SRS>' +
+'      <SRS>EPSG:21148</SRS>' +
+'      <SRS>EPSG:21149</SRS>' +
+'      <SRS>EPSG:21150</SRS>' +
+'      <SRS>EPSG:21291</SRS>' +
+'      <SRS>EPSG:21292</SRS>' +
+'      <SRS>EPSG:21413</SRS>' +
+'      <SRS>EPSG:21414</SRS>' +
+'      <SRS>EPSG:21415</SRS>' +
+'      <SRS>EPSG:21416</SRS>' +
+'      <SRS>EPSG:21417</SRS>' +
+'      <SRS>EPSG:21418</SRS>' +
+'      <SRS>EPSG:21419</SRS>' +
+'      <SRS>EPSG:21420</SRS>' +
+'      <SRS>EPSG:21421</SRS>' +
+'      <SRS>EPSG:21422</SRS>' +
+'      <SRS>EPSG:21423</SRS>' +
+'      <SRS>EPSG:21453</SRS>' +
+'      <SRS>EPSG:21454</SRS>' +
+'      <SRS>EPSG:21455</SRS>' +
+'      <SRS>EPSG:21456</SRS>' +
+'      <SRS>EPSG:21457</SRS>' +
+'      <SRS>EPSG:21458</SRS>' +
+'      <SRS>EPSG:21459</SRS>' +
+'      <SRS>EPSG:21460</SRS>' +
+'      <SRS>EPSG:21461</SRS>' +
+'      <SRS>EPSG:21462</SRS>' +
+'      <SRS>EPSG:21463</SRS>' +
+'      <SRS>EPSG:21473</SRS>' +
+'      <SRS>EPSG:21474</SRS>' +
+'      <SRS>EPSG:21475</SRS>' +
+'      <SRS>EPSG:21476</SRS>' +
+'      <SRS>EPSG:21477</SRS>' +
+'      <SRS>EPSG:21478</SRS>' +
+'      <SRS>EPSG:21479</SRS>' +
+'      <SRS>EPSG:21480</SRS>' +
+'      <SRS>EPSG:21481</SRS>' +
+'      <SRS>EPSG:21482</SRS>' +
+'      <SRS>EPSG:21483</SRS>' +
+'      <SRS>EPSG:21500</SRS>' +
+'      <SRS>EPSG:21780</SRS>' +
+'      <SRS>EPSG:21781</SRS>' +
+'      <SRS>EPSG:21817</SRS>' +
+'      <SRS>EPSG:21818</SRS>' +
+'      <SRS>EPSG:21891</SRS>' +
+'      <SRS>EPSG:21892</SRS>' +
+'      <SRS>EPSG:21893</SRS>' +
+'      <SRS>EPSG:21894</SRS>' +
+'      <SRS>EPSG:21896</SRS>' +
+'      <SRS>EPSG:21897</SRS>' +
+'      <SRS>EPSG:21898</SRS>' +
+'      <SRS>EPSG:21899</SRS>' +
+'      <SRS>EPSG:22032</SRS>' +
+'      <SRS>EPSG:22033</SRS>' +
+'      <SRS>EPSG:22091</SRS>' +
+'      <SRS>EPSG:22092</SRS>' +
+'      <SRS>EPSG:22171</SRS>' +
+'      <SRS>EPSG:22172</SRS>' +
+'      <SRS>EPSG:22173</SRS>' +
+'      <SRS>EPSG:22174</SRS>' +
+'      <SRS>EPSG:22175</SRS>' +
+'      <SRS>EPSG:22176</SRS>' +
+'      <SRS>EPSG:22177</SRS>' +
+'      <SRS>EPSG:22181</SRS>' +
+'      <SRS>EPSG:22182</SRS>' +
+'      <SRS>EPSG:22183</SRS>' +
+'      <SRS>EPSG:22184</SRS>' +
+'      <SRS>EPSG:22185</SRS>' +
+'      <SRS>EPSG:22186</SRS>' +
+'      <SRS>EPSG:22187</SRS>' +
+'      <SRS>EPSG:22191</SRS>' +
+'      <SRS>EPSG:22192</SRS>' +
+'      <SRS>EPSG:22193</SRS>' +
+'      <SRS>EPSG:22194</SRS>' +
+'      <SRS>EPSG:22195</SRS>' +
+'      <SRS>EPSG:22196</SRS>' +
+'      <SRS>EPSG:22197</SRS>' +
+'      <SRS>EPSG:22234</SRS>' +
+'      <SRS>EPSG:22235</SRS>' +
+'      <SRS>EPSG:22236</SRS>' +
+'      <SRS>EPSG:22275</SRS>' +
+'      <SRS>EPSG:22277</SRS>' +
+'      <SRS>EPSG:22279</SRS>' +
+'      <SRS>EPSG:22281</SRS>' +
+'      <SRS>EPSG:22283</SRS>' +
+'      <SRS>EPSG:22285</SRS>' +
+'      <SRS>EPSG:22287</SRS>' +
+'      <SRS>EPSG:22289</SRS>' +
+'      <SRS>EPSG:22291</SRS>' +
+'      <SRS>EPSG:22293</SRS>' +
+'      <SRS>EPSG:22300</SRS>' +
+'      <SRS>EPSG:22332</SRS>' +
+'      <SRS>EPSG:22391</SRS>' +
+'      <SRS>EPSG:22392</SRS>' +
+'      <SRS>EPSG:22521</SRS>' +
+'      <SRS>EPSG:22522</SRS>' +
+'      <SRS>EPSG:22523</SRS>' +
+'      <SRS>EPSG:22524</SRS>' +
+'      <SRS>EPSG:22525</SRS>' +
+'      <SRS>EPSG:22700</SRS>' +
+'      <SRS>EPSG:22770</SRS>' +
+'      <SRS>EPSG:22780</SRS>' +
+'      <SRS>EPSG:22832</SRS>' +
+'      <SRS>EPSG:22991</SRS>' +
+'      <SRS>EPSG:22992</SRS>' +
+'      <SRS>EPSG:22993</SRS>' +
+'      <SRS>EPSG:22994</SRS>' +
+'      <SRS>EPSG:23028</SRS>' +
+'      <SRS>EPSG:23029</SRS>' +
+'      <SRS>EPSG:23030</SRS>' +
+'      <SRS>EPSG:23031</SRS>' +
+'      <SRS>EPSG:23032</SRS>' +
+'      <SRS>EPSG:23033</SRS>' +
+'      <SRS>EPSG:23034</SRS>' +
+'      <SRS>EPSG:23035</SRS>' +
+'      <SRS>EPSG:23036</SRS>' +
+'      <SRS>EPSG:23037</SRS>' +
+'      <SRS>EPSG:23038</SRS>' +
+'      <SRS>EPSG:23090</SRS>' +
+'      <SRS>EPSG:23095</SRS>' +
+'      <SRS>EPSG:23239</SRS>' +
+'      <SRS>EPSG:23240</SRS>' +
+'      <SRS>EPSG:23433</SRS>' +
+'      <SRS>EPSG:23700</SRS>' +
+'      <SRS>EPSG:23846</SRS>' +
+'      <SRS>EPSG:23847</SRS>' +
+'      <SRS>EPSG:23848</SRS>' +
+'      <SRS>EPSG:23849</SRS>' +
+'      <SRS>EPSG:23850</SRS>' +
+'      <SRS>EPSG:23851</SRS>' +
+'      <SRS>EPSG:23852</SRS>' +
+'      <SRS>EPSG:23853</SRS>' +
+'      <SRS>EPSG:23866</SRS>' +
+'      <SRS>EPSG:23867</SRS>' +
+'      <SRS>EPSG:23868</SRS>' +
+'      <SRS>EPSG:23869</SRS>' +
+'      <SRS>EPSG:23870</SRS>' +
+'      <SRS>EPSG:23871</SRS>' +
+'      <SRS>EPSG:23872</SRS>' +
+'      <SRS>EPSG:23877</SRS>' +
+'      <SRS>EPSG:23878</SRS>' +
+'      <SRS>EPSG:23879</SRS>' +
+'      <SRS>EPSG:23880</SRS>' +
+'      <SRS>EPSG:23881</SRS>' +
+'      <SRS>EPSG:23882</SRS>' +
+'      <SRS>EPSG:23883</SRS>' +
+'      <SRS>EPSG:23884</SRS>' +
+'      <SRS>EPSG:23886</SRS>' +
+'      <SRS>EPSG:23887</SRS>' +
+'      <SRS>EPSG:23888</SRS>' +
+'      <SRS>EPSG:23889</SRS>' +
+'      <SRS>EPSG:23890</SRS>' +
+'      <SRS>EPSG:23891</SRS>' +
+'      <SRS>EPSG:23892</SRS>' +
+'      <SRS>EPSG:23893</SRS>' +
+'      <SRS>EPSG:23894</SRS>' +
+'      <SRS>EPSG:23946</SRS>' +
+'      <SRS>EPSG:23947</SRS>' +
+'      <SRS>EPSG:23948</SRS>' +
+'      <SRS>EPSG:24047</SRS>' +
+'      <SRS>EPSG:24048</SRS>' +
+'      <SRS>EPSG:24100</SRS>' +
+'      <SRS>EPSG:24200</SRS>' +
+'      <SRS>EPSG:24305</SRS>' +
+'      <SRS>EPSG:24306</SRS>' +
+'      <SRS>EPSG:24311</SRS>' +
+'      <SRS>EPSG:24312</SRS>' +
+'      <SRS>EPSG:24313</SRS>' +
+'      <SRS>EPSG:24342</SRS>' +
+'      <SRS>EPSG:24343</SRS>' +
+'      <SRS>EPSG:24344</SRS>' +
+'      <SRS>EPSG:24345</SRS>' +
+'      <SRS>EPSG:24346</SRS>' +
+'      <SRS>EPSG:24347</SRS>' +
+'      <SRS>EPSG:24370</SRS>' +
+'      <SRS>EPSG:24371</SRS>' +
+'      <SRS>EPSG:24372</SRS>' +
+'      <SRS>EPSG:24373</SRS>' +
+'      <SRS>EPSG:24374</SRS>' +
+'      <SRS>EPSG:24375</SRS>' +
+'      <SRS>EPSG:24376</SRS>' +
+'      <SRS>EPSG:24377</SRS>' +
+'      <SRS>EPSG:24378</SRS>' +
+'      <SRS>EPSG:24379</SRS>' +
+'      <SRS>EPSG:24380</SRS>' +
+'      <SRS>EPSG:24381</SRS>' +
+'      <SRS>EPSG:24382</SRS>' +
+'      <SRS>EPSG:24383</SRS>' +
+'      <SRS>EPSG:24500</SRS>' +
+'      <SRS>EPSG:24547</SRS>' +
+'      <SRS>EPSG:24548</SRS>' +
+'      <SRS>EPSG:24571</SRS>' +
+'      <SRS>EPSG:24600</SRS>' +
+'      <SRS>EPSG:24718</SRS>' +
+'      <SRS>EPSG:24719</SRS>' +
+'      <SRS>EPSG:24720</SRS>' +
+'      <SRS>EPSG:24817</SRS>' +
+'      <SRS>EPSG:24818</SRS>' +
+'      <SRS>EPSG:24819</SRS>' +
+'      <SRS>EPSG:24820</SRS>' +
+'      <SRS>EPSG:24821</SRS>' +
+'      <SRS>EPSG:24877</SRS>' +
+'      <SRS>EPSG:24878</SRS>' +
+'      <SRS>EPSG:24879</SRS>' +
+'      <SRS>EPSG:24880</SRS>' +
+'      <SRS>EPSG:24881</SRS>' +
+'      <SRS>EPSG:24882</SRS>' +
+'      <SRS>EPSG:24891</SRS>' +
+'      <SRS>EPSG:24892</SRS>' +
+'      <SRS>EPSG:24893</SRS>' +
+'      <SRS>EPSG:25000</SRS>' +
+'      <SRS>EPSG:25231</SRS>' +
+'      <SRS>EPSG:25391</SRS>' +
+'      <SRS>EPSG:25392</SRS>' +
+'      <SRS>EPSG:25393</SRS>' +
+'      <SRS>EPSG:25394</SRS>' +
+'      <SRS>EPSG:25395</SRS>' +
+'      <SRS>EPSG:25700</SRS>' +
+'      <SRS>EPSG:25828</SRS>' +
+'      <SRS>EPSG:25829</SRS>' +
+'      <SRS>EPSG:25830</SRS>' +
+'      <SRS>EPSG:25831</SRS>' +
+'      <SRS>EPSG:25832</SRS>' +
+'      <SRS>EPSG:25833</SRS>' +
+'      <SRS>EPSG:25834</SRS>' +
+'      <SRS>EPSG:25835</SRS>' +
+'      <SRS>EPSG:25836</SRS>' +
+'      <SRS>EPSG:25837</SRS>' +
+'      <SRS>EPSG:25838</SRS>' +
+'      <SRS>EPSG:25884</SRS>' +
+'      <SRS>EPSG:25932</SRS>' +
+'      <SRS>EPSG:26191</SRS>' +
+'      <SRS>EPSG:26192</SRS>' +
+'      <SRS>EPSG:26193</SRS>' +
+'      <SRS>EPSG:26194</SRS>' +
+'      <SRS>EPSG:26195</SRS>' +
+'      <SRS>EPSG:26237</SRS>' +
+'      <SRS>EPSG:26331</SRS>' +
+'      <SRS>EPSG:26332</SRS>' +
+'      <SRS>EPSG:26391</SRS>' +
+'      <SRS>EPSG:26392</SRS>' +
+'      <SRS>EPSG:26393</SRS>' +
+'      <SRS>EPSG:26432</SRS>' +
+'      <SRS>EPSG:26591</SRS>' +
+'      <SRS>EPSG:26592</SRS>' +
+'      <SRS>EPSG:26632</SRS>' +
+'      <SRS>EPSG:26692</SRS>' +
+'      <SRS>EPSG:26701</SRS>' +
+'      <SRS>EPSG:26702</SRS>' +
+'      <SRS>EPSG:26703</SRS>' +
+'      <SRS>EPSG:26704</SRS>' +
+'      <SRS>EPSG:26705</SRS>' +
+'      <SRS>EPSG:26706</SRS>' +
+'      <SRS>EPSG:26707</SRS>' +
+'      <SRS>EPSG:26708</SRS>' +
+'      <SRS>EPSG:26709</SRS>' +
+'      <SRS>EPSG:26710</SRS>' +
+'      <SRS>EPSG:26711</SRS>' +
+'      <SRS>EPSG:26712</SRS>' +
+'      <SRS>EPSG:26713</SRS>' +
+'      <SRS>EPSG:26714</SRS>' +
+'      <SRS>EPSG:26715</SRS>' +
+'      <SRS>EPSG:26716</SRS>' +
+'      <SRS>EPSG:26717</SRS>' +
+'      <SRS>EPSG:26718</SRS>' +
+'      <SRS>EPSG:26719</SRS>' +
+'      <SRS>EPSG:26720</SRS>' +
+'      <SRS>EPSG:26721</SRS>' +
+'      <SRS>EPSG:26722</SRS>' +
+'      <SRS>EPSG:26729</SRS>' +
+'      <SRS>EPSG:26730</SRS>' +
+'      <SRS>EPSG:26731</SRS>' +
+'      <SRS>EPSG:26732</SRS>' +
+'      <SRS>EPSG:26733</SRS>' +
+'      <SRS>EPSG:26734</SRS>' +
+'      <SRS>EPSG:26735</SRS>' +
+'      <SRS>EPSG:26736</SRS>' +
+'      <SRS>EPSG:26737</SRS>' +
+'      <SRS>EPSG:26738</SRS>' +
+'      <SRS>EPSG:26739</SRS>' +
+'      <SRS>EPSG:26740</SRS>' +
+'      <SRS>EPSG:26741</SRS>' +
+'      <SRS>EPSG:26742</SRS>' +
+'      <SRS>EPSG:26743</SRS>' +
+'      <SRS>EPSG:26744</SRS>' +
+'      <SRS>EPSG:26745</SRS>' +
+'      <SRS>EPSG:26746</SRS>' +
+'      <SRS>EPSG:26747</SRS>' +
+'      <SRS>EPSG:26748</SRS>' +
+'      <SRS>EPSG:26749</SRS>' +
+'      <SRS>EPSG:26750</SRS>' +
+'      <SRS>EPSG:26751</SRS>' +
+'      <SRS>EPSG:26752</SRS>' +
+'      <SRS>EPSG:26753</SRS>' +
+'      <SRS>EPSG:26754</SRS>' +
+'      <SRS>EPSG:26755</SRS>' +
+'      <SRS>EPSG:26756</SRS>' +
+'      <SRS>EPSG:26757</SRS>' +
+'      <SRS>EPSG:26758</SRS>' +
+'      <SRS>EPSG:26759</SRS>' +
+'      <SRS>EPSG:26760</SRS>' +
+'      <SRS>EPSG:26766</SRS>' +
+'      <SRS>EPSG:26767</SRS>' +
+'      <SRS>EPSG:26768</SRS>' +
+'      <SRS>EPSG:26769</SRS>' +
+'      <SRS>EPSG:26770</SRS>' +
+'      <SRS>EPSG:26771</SRS>' +
+'      <SRS>EPSG:26772</SRS>' +
+'      <SRS>EPSG:26773</SRS>' +
+'      <SRS>EPSG:26774</SRS>' +
+'      <SRS>EPSG:26775</SRS>' +
+'      <SRS>EPSG:26776</SRS>' +
+'      <SRS>EPSG:26777</SRS>' +
+'      <SRS>EPSG:26778</SRS>' +
+'      <SRS>EPSG:26779</SRS>' +
+'      <SRS>EPSG:26780</SRS>' +
+'      <SRS>EPSG:26781</SRS>' +
+'      <SRS>EPSG:26782</SRS>' +
+'      <SRS>EPSG:26783</SRS>' +
+'      <SRS>EPSG:26784</SRS>' +
+'      <SRS>EPSG:26785</SRS>' +
+'      <SRS>EPSG:26786</SRS>' +
+'      <SRS>EPSG:26787</SRS>' +
+'      <SRS>EPSG:26791</SRS>' +
+'      <SRS>EPSG:26792</SRS>' +
+'      <SRS>EPSG:26793</SRS>' +
+'      <SRS>EPSG:26794</SRS>' +
+'      <SRS>EPSG:26795</SRS>' +
+'      <SRS>EPSG:26796</SRS>' +
+'      <SRS>EPSG:26797</SRS>' +
+'      <SRS>EPSG:26798</SRS>' +
+'      <SRS>EPSG:26799</SRS>' +
+'      <SRS>EPSG:26801</SRS>' +
+'      <SRS>EPSG:26802</SRS>' +
+'      <SRS>EPSG:26803</SRS>' +
+'      <SRS>EPSG:26811</SRS>' +
+'      <SRS>EPSG:26812</SRS>' +
+'      <SRS>EPSG:26813</SRS>' +
+'      <SRS>EPSG:26901</SRS>' +
+'      <SRS>EPSG:26902</SRS>' +
+'      <SRS>EPSG:26903</SRS>' +
+'      <SRS>EPSG:26904</SRS>' +
+'      <SRS>EPSG:26905</SRS>' +
+'      <SRS>EPSG:26906</SRS>' +
+'      <SRS>EPSG:26907</SRS>' +
+'      <SRS>EPSG:26908</SRS>' +
+'      <SRS>EPSG:26909</SRS>' +
+'      <SRS>EPSG:26910</SRS>' +
+'      <SRS>EPSG:26911</SRS>' +
+'      <SRS>EPSG:26912</SRS>' +
+'      <SRS>EPSG:26913</SRS>' +
+'      <SRS>EPSG:26914</SRS>' +
+'      <SRS>EPSG:26915</SRS>' +
+'      <SRS>EPSG:26916</SRS>' +
+'      <SRS>EPSG:26917</SRS>' +
+'      <SRS>EPSG:26918</SRS>' +
+'      <SRS>EPSG:26919</SRS>' +
+'      <SRS>EPSG:26920</SRS>' +
+'      <SRS>EPSG:26921</SRS>' +
+'      <SRS>EPSG:26922</SRS>' +
+'      <SRS>EPSG:26923</SRS>' +
+'      <SRS>EPSG:26929</SRS>' +
+'      <SRS>EPSG:26930</SRS>' +
+'      <SRS>EPSG:26931</SRS>' +
+'      <SRS>EPSG:26932</SRS>' +
+'      <SRS>EPSG:26933</SRS>' +
+'      <SRS>EPSG:26934</SRS>' +
+'      <SRS>EPSG:26935</SRS>' +
+'      <SRS>EPSG:26936</SRS>' +
+'      <SRS>EPSG:26937</SRS>' +
+'      <SRS>EPSG:26938</SRS>' +
+'      <SRS>EPSG:26939</SRS>' +
+'      <SRS>EPSG:26940</SRS>' +
+'      <SRS>EPSG:26941</SRS>' +
+'      <SRS>EPSG:26942</SRS>' +
+'      <SRS>EPSG:26943</SRS>' +
+'      <SRS>EPSG:26944</SRS>' +
+'      <SRS>EPSG:26945</SRS>' +
+'      <SRS>EPSG:26946</SRS>' +
+'      <SRS>EPSG:26948</SRS>' +
+'      <SRS>EPSG:26949</SRS>' +
+'      <SRS>EPSG:26950</SRS>' +
+'      <SRS>EPSG:26951</SRS>' +
+'      <SRS>EPSG:26952</SRS>' +
+'      <SRS>EPSG:26953</SRS>' +
+'      <SRS>EPSG:26954</SRS>' +
+'      <SRS>EPSG:26955</SRS>' +
+'      <SRS>EPSG:26956</SRS>' +
+'      <SRS>EPSG:26957</SRS>' +
+'      <SRS>EPSG:26958</SRS>' +
+'      <SRS>EPSG:26959</SRS>' +
+'      <SRS>EPSG:26960</SRS>' +
+'      <SRS>EPSG:26961</SRS>' +
+'      <SRS>EPSG:26962</SRS>' +
+'      <SRS>EPSG:26963</SRS>' +
+'      <SRS>EPSG:26964</SRS>' +
+'      <SRS>EPSG:26965</SRS>' +
+'      <SRS>EPSG:26966</SRS>' +
+'      <SRS>EPSG:26967</SRS>' +
+'      <SRS>EPSG:26968</SRS>' +
+'      <SRS>EPSG:26969</SRS>' +
+'      <SRS>EPSG:26970</SRS>' +
+'      <SRS>EPSG:26971</SRS>' +
+'      <SRS>EPSG:26972</SRS>' +
+'      <SRS>EPSG:26973</SRS>' +
+'      <SRS>EPSG:26974</SRS>' +
+'      <SRS>EPSG:26975</SRS>' +
+'      <SRS>EPSG:26976</SRS>' +
+'      <SRS>EPSG:26977</SRS>' +
+'      <SRS>EPSG:26978</SRS>' +
+'      <SRS>EPSG:26979</SRS>' +
+'      <SRS>EPSG:26980</SRS>' +
+'      <SRS>EPSG:26981</SRS>' +
+'      <SRS>EPSG:26982</SRS>' +
+'      <SRS>EPSG:26983</SRS>' +
+'      <SRS>EPSG:26984</SRS>' +
+'      <SRS>EPSG:26985</SRS>' +
+'      <SRS>EPSG:26986</SRS>' +
+'      <SRS>EPSG:26987</SRS>' +
+'      <SRS>EPSG:26988</SRS>' +
+'      <SRS>EPSG:26989</SRS>' +
+'      <SRS>EPSG:26990</SRS>' +
+'      <SRS>EPSG:26991</SRS>' +
+'      <SRS>EPSG:26992</SRS>' +
+'      <SRS>EPSG:26993</SRS>' +
+'      <SRS>EPSG:26994</SRS>' +
+'      <SRS>EPSG:26995</SRS>' +
+'      <SRS>EPSG:26996</SRS>' +
+'      <SRS>EPSG:26997</SRS>' +
+'      <SRS>EPSG:26998</SRS>' +
+'      <SRS>EPSG:27037</SRS>' +
+'      <SRS>EPSG:27038</SRS>' +
+'      <SRS>EPSG:27039</SRS>' +
+'      <SRS>EPSG:27040</SRS>' +
+'      <SRS>EPSG:27120</SRS>' +
+'      <SRS>EPSG:27200</SRS>' +
+'      <SRS>EPSG:27205</SRS>' +
+'      <SRS>EPSG:27206</SRS>' +
+'      <SRS>EPSG:27207</SRS>' +
+'      <SRS>EPSG:27208</SRS>' +
+'      <SRS>EPSG:27209</SRS>' +
+'      <SRS>EPSG:27210</SRS>' +
+'      <SRS>EPSG:27211</SRS>' +
+'      <SRS>EPSG:27212</SRS>' +
+'      <SRS>EPSG:27213</SRS>' +
+'      <SRS>EPSG:27214</SRS>' +
+'      <SRS>EPSG:27215</SRS>' +
+'      <SRS>EPSG:27216</SRS>' +
+'      <SRS>EPSG:27217</SRS>' +
+'      <SRS>EPSG:27218</SRS>' +
+'      <SRS>EPSG:27219</SRS>' +
+'      <SRS>EPSG:27220</SRS>' +
+'      <SRS>EPSG:27221</SRS>' +
+'      <SRS>EPSG:27222</SRS>' +
+'      <SRS>EPSG:27223</SRS>' +
+'      <SRS>EPSG:27224</SRS>' +
+'      <SRS>EPSG:27225</SRS>' +
+'      <SRS>EPSG:27226</SRS>' +
+'      <SRS>EPSG:27227</SRS>' +
+'      <SRS>EPSG:27228</SRS>' +
+'      <SRS>EPSG:27229</SRS>' +
+'      <SRS>EPSG:27230</SRS>' +
+'      <SRS>EPSG:27231</SRS>' +
+'      <SRS>EPSG:27232</SRS>' +
+'      <SRS>EPSG:27258</SRS>' +
+'      <SRS>EPSG:27259</SRS>' +
+'      <SRS>EPSG:27260</SRS>' +
+'      <SRS>EPSG:27291</SRS>' +
+'      <SRS>EPSG:27292</SRS>' +
+'      <SRS>EPSG:27391</SRS>' +
+'      <SRS>EPSG:27392</SRS>' +
+'      <SRS>EPSG:27393</SRS>' +
+'      <SRS>EPSG:27394</SRS>' +
+'      <SRS>EPSG:27395</SRS>' +
+'      <SRS>EPSG:27396</SRS>' +
+'      <SRS>EPSG:27397</SRS>' +
+'      <SRS>EPSG:27398</SRS>' +
+'      <SRS>EPSG:27429</SRS>' +
+'      <SRS>EPSG:27492</SRS>' +
+'      <SRS>EPSG:27500</SRS>' +
+'      <SRS>EPSG:27561</SRS>' +
+'      <SRS>EPSG:27562</SRS>' +
+'      <SRS>EPSG:27563</SRS>' +
+'      <SRS>EPSG:27564</SRS>' +
+'      <SRS>EPSG:27571</SRS>' +
+'      <SRS>EPSG:27572</SRS>' +
+'      <SRS>EPSG:27573</SRS>' +
+'      <SRS>EPSG:27574</SRS>' +
+'      <SRS>EPSG:27581</SRS>' +
+'      <SRS>EPSG:27582</SRS>' +
+'      <SRS>EPSG:27583</SRS>' +
+'      <SRS>EPSG:27584</SRS>' +
+'      <SRS>EPSG:27591</SRS>' +
+'      <SRS>EPSG:27592</SRS>' +
+'      <SRS>EPSG:27593</SRS>' +
+'      <SRS>EPSG:27594</SRS>' +
+'      <SRS>EPSG:27700</SRS>' +
+'      <SRS>EPSG:28191</SRS>' +
+'      <SRS>EPSG:28192</SRS>' +
+'      <SRS>EPSG:28193</SRS>' +
+'      <SRS>EPSG:28232</SRS>' +
+'      <SRS>EPSG:28348</SRS>' +
+'      <SRS>EPSG:28349</SRS>' +
+'      <SRS>EPSG:28350</SRS>' +
+'      <SRS>EPSG:28351</SRS>' +
+'      <SRS>EPSG:28352</SRS>' +
+'      <SRS>EPSG:28353</SRS>' +
+'      <SRS>EPSG:28354</SRS>' +
+'      <SRS>EPSG:28355</SRS>' +
+'      <SRS>EPSG:28356</SRS>' +
+'      <SRS>EPSG:28357</SRS>' +
+'      <SRS>EPSG:28358</SRS>' +
+'      <SRS>EPSG:28402</SRS>' +
+'      <SRS>EPSG:28403</SRS>' +
+'      <SRS>EPSG:28404</SRS>' +
+'      <SRS>EPSG:28405</SRS>' +
+'      <SRS>EPSG:28406</SRS>' +
+'      <SRS>EPSG:28407</SRS>' +
+'      <SRS>EPSG:28408</SRS>' +
+'      <SRS>EPSG:28409</SRS>' +
+'      <SRS>EPSG:28410</SRS>' +
+'      <SRS>EPSG:28411</SRS>' +
+'      <SRS>EPSG:28412</SRS>' +
+'      <SRS>EPSG:28413</SRS>' +
+'      <SRS>EPSG:28414</SRS>' +
+'      <SRS>EPSG:28415</SRS>' +
+'      <SRS>EPSG:28416</SRS>' +
+'      <SRS>EPSG:28417</SRS>' +
+'      <SRS>EPSG:28418</SRS>' +
+'      <SRS>EPSG:28419</SRS>' +
+'      <SRS>EPSG:28420</SRS>' +
+'      <SRS>EPSG:28421</SRS>' +
+'      <SRS>EPSG:28422</SRS>' +
+'      <SRS>EPSG:28423</SRS>' +
+'      <SRS>EPSG:28424</SRS>' +
+'      <SRS>EPSG:28425</SRS>' +
+'      <SRS>EPSG:28426</SRS>' +
+'      <SRS>EPSG:28427</SRS>' +
+'      <SRS>EPSG:28428</SRS>' +
+'      <SRS>EPSG:28429</SRS>' +
+'      <SRS>EPSG:28430</SRS>' +
+'      <SRS>EPSG:28431</SRS>' +
+'      <SRS>EPSG:28432</SRS>' +
+'      <SRS>EPSG:28462</SRS>' +
+'      <SRS>EPSG:28463</SRS>' +
+'      <SRS>EPSG:28464</SRS>' +
+'      <SRS>EPSG:28465</SRS>' +
+'      <SRS>EPSG:28466</SRS>' +
+'      <SRS>EPSG:28467</SRS>' +
+'      <SRS>EPSG:28468</SRS>' +
+'      <SRS>EPSG:28469</SRS>' +
+'      <SRS>EPSG:28470</SRS>' +
+'      <SRS>EPSG:28471</SRS>' +
+'      <SRS>EPSG:28472</SRS>' +
+'      <SRS>EPSG:28473</SRS>' +
+'      <SRS>EPSG:28474</SRS>' +
+'      <SRS>EPSG:28475</SRS>' +
+'      <SRS>EPSG:28476</SRS>' +
+'      <SRS>EPSG:28477</SRS>' +
+'      <SRS>EPSG:28478</SRS>' +
+'      <SRS>EPSG:28479</SRS>' +
+'      <SRS>EPSG:28480</SRS>' +
+'      <SRS>EPSG:28481</SRS>' +
+'      <SRS>EPSG:28482</SRS>' +
+'      <SRS>EPSG:28483</SRS>' +
+'      <SRS>EPSG:28484</SRS>' +
+'      <SRS>EPSG:28485</SRS>' +
+'      <SRS>EPSG:28486</SRS>' +
+'      <SRS>EPSG:28487</SRS>' +
+'      <SRS>EPSG:28488</SRS>' +
+'      <SRS>EPSG:28489</SRS>' +
+'      <SRS>EPSG:28490</SRS>' +
+'      <SRS>EPSG:28491</SRS>' +
+'      <SRS>EPSG:28492</SRS>' +
+'      <SRS>EPSG:28600</SRS>' +
+'      <SRS>EPSG:28991</SRS>' +
+'      <SRS>EPSG:28992</SRS>' +
+'      <SRS>EPSG:29100</SRS>' +
+'      <SRS>EPSG:29101</SRS>' +
+'      <SRS>EPSG:29118</SRS>' +
+'      <SRS>EPSG:29119</SRS>' +
+'      <SRS>EPSG:29120</SRS>' +
+'      <SRS>EPSG:29121</SRS>' +
+'      <SRS>EPSG:29122</SRS>' +
+'      <SRS>EPSG:29168</SRS>' +
+'      <SRS>EPSG:29169</SRS>' +
+'      <SRS>EPSG:29170</SRS>' +
+'      <SRS>EPSG:29171</SRS>' +
+'      <SRS>EPSG:29172</SRS>' +
+'      <SRS>EPSG:29177</SRS>' +
+'      <SRS>EPSG:29178</SRS>' +
+'      <SRS>EPSG:29179</SRS>' +
+'      <SRS>EPSG:29180</SRS>' +
+'      <SRS>EPSG:29181</SRS>' +
+'      <SRS>EPSG:29182</SRS>' +
+'      <SRS>EPSG:29183</SRS>' +
+'      <SRS>EPSG:29184</SRS>' +
+'      <SRS>EPSG:29185</SRS>' +
+'      <SRS>EPSG:29187</SRS>' +
+'      <SRS>EPSG:29188</SRS>' +
+'      <SRS>EPSG:29189</SRS>' +
+'      <SRS>EPSG:29190</SRS>' +
+'      <SRS>EPSG:29191</SRS>' +
+'      <SRS>EPSG:29192</SRS>' +
+'      <SRS>EPSG:29193</SRS>' +
+'      <SRS>EPSG:29194</SRS>' +
+'      <SRS>EPSG:29195</SRS>' +
+'      <SRS>EPSG:29220</SRS>' +
+'      <SRS>EPSG:29221</SRS>' +
+'      <SRS>EPSG:29333</SRS>' +
+'      <SRS>EPSG:29371</SRS>' +
+'      <SRS>EPSG:29373</SRS>' +
+'      <SRS>EPSG:29375</SRS>' +
+'      <SRS>EPSG:29377</SRS>' +
+'      <SRS>EPSG:29379</SRS>' +
+'      <SRS>EPSG:29381</SRS>' +
+'      <SRS>EPSG:29383</SRS>' +
+'      <SRS>EPSG:29385</SRS>' +
+'      <SRS>EPSG:29635</SRS>' +
+'      <SRS>EPSG:29636</SRS>' +
+'      <SRS>EPSG:29700</SRS>' +
+'      <SRS>EPSG:29701</SRS>' +
+'      <SRS>EPSG:29702</SRS>' +
+'      <SRS>EPSG:29738</SRS>' +
+'      <SRS>EPSG:29739</SRS>' +
+'      <SRS>EPSG:29849</SRS>' +
+'      <SRS>EPSG:29850</SRS>' +
+'      <SRS>EPSG:29871</SRS>' +
+'      <SRS>EPSG:29872</SRS>' +
+'      <SRS>EPSG:29873</SRS>' +
+'      <SRS>EPSG:29900</SRS>' +
+'      <SRS>EPSG:29901</SRS>' +
+'      <SRS>EPSG:29902</SRS>' +
+'      <SRS>EPSG:29903</SRS>' +
+'      <SRS>EPSG:30161</SRS>' +
+'      <SRS>EPSG:30162</SRS>' +
+'      <SRS>EPSG:30163</SRS>' +
+'      <SRS>EPSG:30164</SRS>' +
+'      <SRS>EPSG:30165</SRS>' +
+'      <SRS>EPSG:30166</SRS>' +
+'      <SRS>EPSG:30167</SRS>' +
+'      <SRS>EPSG:30168</SRS>' +
+'      <SRS>EPSG:30169</SRS>' +
+'      <SRS>EPSG:30170</SRS>' +
+'      <SRS>EPSG:30171</SRS>' +
+'      <SRS>EPSG:30172</SRS>' +
+'      <SRS>EPSG:30173</SRS>' +
+'      <SRS>EPSG:30174</SRS>' +
+'      <SRS>EPSG:30175</SRS>' +
+'      <SRS>EPSG:30176</SRS>' +
+'      <SRS>EPSG:30177</SRS>' +
+'      <SRS>EPSG:30178</SRS>' +
+'      <SRS>EPSG:30179</SRS>' +
+'      <SRS>EPSG:30200</SRS>' +
+'      <SRS>EPSG:30339</SRS>' +
+'      <SRS>EPSG:30340</SRS>' +
+'      <SRS>EPSG:30491</SRS>' +
+'      <SRS>EPSG:30492</SRS>' +
+'      <SRS>EPSG:30493</SRS>' +
+'      <SRS>EPSG:30494</SRS>' +
+'      <SRS>EPSG:30729</SRS>' +
+'      <SRS>EPSG:30730</SRS>' +
+'      <SRS>EPSG:30731</SRS>' +
+'      <SRS>EPSG:30732</SRS>' +
+'      <SRS>EPSG:30791</SRS>' +
+'      <SRS>EPSG:30792</SRS>' +
+'      <SRS>EPSG:30800</SRS>' +
+'      <SRS>EPSG:31028</SRS>' +
+'      <SRS>EPSG:31121</SRS>' +
+'      <SRS>EPSG:31154</SRS>' +
+'      <SRS>EPSG:31170</SRS>' +
+'      <SRS>EPSG:31171</SRS>' +
+'      <SRS>EPSG:31251</SRS>' +
+'      <SRS>EPSG:31252</SRS>' +
+'      <SRS>EPSG:31253</SRS>' +
+'      <SRS>EPSG:31254</SRS>' +
+'      <SRS>EPSG:31255</SRS>' +
+'      <SRS>EPSG:31256</SRS>' +
+'      <SRS>EPSG:31257</SRS>' +
+'      <SRS>EPSG:31258</SRS>' +
+'      <SRS>EPSG:31259</SRS>' +
+'      <SRS>EPSG:31265</SRS>' +
+'      <SRS>EPSG:31266</SRS>' +
+'      <SRS>EPSG:31267</SRS>' +
+'      <SRS>EPSG:31268</SRS>' +
+'      <SRS>EPSG:31275</SRS>' +
+'      <SRS>EPSG:31276</SRS>' +
+'      <SRS>EPSG:31277</SRS>' +
+'      <SRS>EPSG:31278</SRS>' +
+'      <SRS>EPSG:31279</SRS>' +
+'      <SRS>EPSG:31281</SRS>' +
+'      <SRS>EPSG:31282</SRS>' +
+'      <SRS>EPSG:31283</SRS>' +
+'      <SRS>EPSG:31284</SRS>' +
+'      <SRS>EPSG:31285</SRS>' +
+'      <SRS>EPSG:31286</SRS>' +
+'      <SRS>EPSG:31287</SRS>' +
+'      <SRS>EPSG:31288</SRS>' +
+'      <SRS>EPSG:31289</SRS>' +
+'      <SRS>EPSG:31290</SRS>' +
+'      <SRS>EPSG:31291</SRS>' +
+'      <SRS>EPSG:31292</SRS>' +
+'      <SRS>EPSG:31293</SRS>' +
+'      <SRS>EPSG:31294</SRS>' +
+'      <SRS>EPSG:31295</SRS>' +
+'      <SRS>EPSG:31296</SRS>' +
+'      <SRS>EPSG:31297</SRS>' +
+'      <SRS>EPSG:31300</SRS>' +
+'      <SRS>EPSG:31370</SRS>' +
+'      <SRS>EPSG:31461</SRS>' +
+'      <SRS>EPSG:31462</SRS>' +
+'      <SRS>EPSG:31463</SRS>' +
+'      <SRS>EPSG:31464</SRS>' +
+'      <SRS>EPSG:31465</SRS>' +
+'      <SRS>EPSG:31466</SRS>' +
+'      <SRS>EPSG:31467</SRS>' +
+'      <SRS>EPSG:31468</SRS>' +
+'      <SRS>EPSG:31469</SRS>' +
+'      <SRS>EPSG:31528</SRS>' +
+'      <SRS>EPSG:31529</SRS>' +
+'      <SRS>EPSG:31600</SRS>' +
+'      <SRS>EPSG:31700</SRS>' +
+'      <SRS>EPSG:31838</SRS>' +
+'      <SRS>EPSG:31839</SRS>' +
+'      <SRS>EPSG:31900</SRS>' +
+'      <SRS>EPSG:31901</SRS>' +
+'      <SRS>EPSG:31965</SRS>' +
+'      <SRS>EPSG:31966</SRS>' +
+'      <SRS>EPSG:31967</SRS>' +
+'      <SRS>EPSG:31968</SRS>' +
+'      <SRS>EPSG:31969</SRS>' +
+'      <SRS>EPSG:31970</SRS>' +
+'      <SRS>EPSG:31971</SRS>' +
+'      <SRS>EPSG:31972</SRS>' +
+'      <SRS>EPSG:31973</SRS>' +
+'      <SRS>EPSG:31974</SRS>' +
+'      <SRS>EPSG:31975</SRS>' +
+'      <SRS>EPSG:31976</SRS>' +
+'      <SRS>EPSG:31977</SRS>' +
+'      <SRS>EPSG:31978</SRS>' +
+'      <SRS>EPSG:31979</SRS>' +
+'      <SRS>EPSG:31980</SRS>' +
+'      <SRS>EPSG:31981</SRS>' +
+'      <SRS>EPSG:31982</SRS>' +
+'      <SRS>EPSG:31983</SRS>' +
+'      <SRS>EPSG:31984</SRS>' +
+'      <SRS>EPSG:31985</SRS>' +
+'      <SRS>EPSG:31986</SRS>' +
+'      <SRS>EPSG:31987</SRS>' +
+'      <SRS>EPSG:31988</SRS>' +
+'      <SRS>EPSG:31989</SRS>' +
+'      <SRS>EPSG:31990</SRS>' +
+'      <SRS>EPSG:31991</SRS>' +
+'      <SRS>EPSG:31992</SRS>' +
+'      <SRS>EPSG:31993</SRS>' +
+'      <SRS>EPSG:31994</SRS>' +
+'      <SRS>EPSG:31995</SRS>' +
+'      <SRS>EPSG:31996</SRS>' +
+'      <SRS>EPSG:31997</SRS>' +
+'      <SRS>EPSG:31998</SRS>' +
+'      <SRS>EPSG:31999</SRS>' +
+'      <SRS>EPSG:32000</SRS>' +
+'      <SRS>EPSG:32001</SRS>' +
+'      <SRS>EPSG:32002</SRS>' +
+'      <SRS>EPSG:32003</SRS>' +
+'      <SRS>EPSG:32005</SRS>' +
+'      <SRS>EPSG:32006</SRS>' +
+'      <SRS>EPSG:32007</SRS>' +
+'      <SRS>EPSG:32008</SRS>' +
+'      <SRS>EPSG:32009</SRS>' +
+'      <SRS>EPSG:32010</SRS>' +
+'      <SRS>EPSG:32011</SRS>' +
+'      <SRS>EPSG:32012</SRS>' +
+'      <SRS>EPSG:32013</SRS>' +
+'      <SRS>EPSG:32014</SRS>' +
+'      <SRS>EPSG:32015</SRS>' +
+'      <SRS>EPSG:32016</SRS>' +
+'      <SRS>EPSG:32017</SRS>' +
+'      <SRS>EPSG:32018</SRS>' +
+'      <SRS>EPSG:32019</SRS>' +
+'      <SRS>EPSG:32020</SRS>' +
+'      <SRS>EPSG:32021</SRS>' +
+'      <SRS>EPSG:32022</SRS>' +
+'      <SRS>EPSG:32023</SRS>' +
+'      <SRS>EPSG:32024</SRS>' +
+'      <SRS>EPSG:32025</SRS>' +
+'      <SRS>EPSG:32026</SRS>' +
+'      <SRS>EPSG:32027</SRS>' +
+'      <SRS>EPSG:32028</SRS>' +
+'      <SRS>EPSG:32029</SRS>' +
+'      <SRS>EPSG:32030</SRS>' +
+'      <SRS>EPSG:32031</SRS>' +
+'      <SRS>EPSG:32033</SRS>' +
+'      <SRS>EPSG:32034</SRS>' +
+'      <SRS>EPSG:32035</SRS>' +
+'      <SRS>EPSG:32036</SRS>' +
+'      <SRS>EPSG:32037</SRS>' +
+'      <SRS>EPSG:32038</SRS>' +
+'      <SRS>EPSG:32039</SRS>' +
+'      <SRS>EPSG:32040</SRS>' +
+'      <SRS>EPSG:32041</SRS>' +
+'      <SRS>EPSG:32042</SRS>' +
+'      <SRS>EPSG:32043</SRS>' +
+'      <SRS>EPSG:32044</SRS>' +
+'      <SRS>EPSG:32045</SRS>' +
+'      <SRS>EPSG:32046</SRS>' +
+'      <SRS>EPSG:32047</SRS>' +
+'      <SRS>EPSG:32048</SRS>' +
+'      <SRS>EPSG:32049</SRS>' +
+'      <SRS>EPSG:32050</SRS>' +
+'      <SRS>EPSG:32051</SRS>' +
+'      <SRS>EPSG:32052</SRS>' +
+'      <SRS>EPSG:32053</SRS>' +
+'      <SRS>EPSG:32054</SRS>' +
+'      <SRS>EPSG:32055</SRS>' +
+'      <SRS>EPSG:32056</SRS>' +
+'      <SRS>EPSG:32057</SRS>' +
+'      <SRS>EPSG:32058</SRS>' +
+'      <SRS>EPSG:32061</SRS>' +
+'      <SRS>EPSG:32062</SRS>' +
+'      <SRS>EPSG:32064</SRS>' +
+'      <SRS>EPSG:32065</SRS>' +
+'      <SRS>EPSG:32066</SRS>' +
+'      <SRS>EPSG:32067</SRS>' +
+'      <SRS>EPSG:32074</SRS>' +
+'      <SRS>EPSG:32075</SRS>' +
+'      <SRS>EPSG:32076</SRS>' +
+'      <SRS>EPSG:32077</SRS>' +
+'      <SRS>EPSG:32081</SRS>' +
+'      <SRS>EPSG:32082</SRS>' +
+'      <SRS>EPSG:32083</SRS>' +
+'      <SRS>EPSG:32084</SRS>' +
+'      <SRS>EPSG:32085</SRS>' +
+'      <SRS>EPSG:32086</SRS>' +
+'      <SRS>EPSG:32098</SRS>' +
+'      <SRS>EPSG:32099</SRS>' +
+'      <SRS>EPSG:32100</SRS>' +
+'      <SRS>EPSG:32104</SRS>' +
+'      <SRS>EPSG:32107</SRS>' +
+'      <SRS>EPSG:32108</SRS>' +
+'      <SRS>EPSG:32109</SRS>' +
+'      <SRS>EPSG:32110</SRS>' +
+'      <SRS>EPSG:32111</SRS>' +
+'      <SRS>EPSG:32112</SRS>' +
+'      <SRS>EPSG:32113</SRS>' +
+'      <SRS>EPSG:32114</SRS>' +
+'      <SRS>EPSG:32115</SRS>' +
+'      <SRS>EPSG:32116</SRS>' +
+'      <SRS>EPSG:32117</SRS>' +
+'      <SRS>EPSG:32118</SRS>' +
+'      <SRS>EPSG:32119</SRS>' +
+'      <SRS>EPSG:32120</SRS>' +
+'      <SRS>EPSG:32121</SRS>' +
+'      <SRS>EPSG:32122</SRS>' +
+'      <SRS>EPSG:32123</SRS>' +
+'      <SRS>EPSG:32124</SRS>' +
+'      <SRS>EPSG:32125</SRS>' +
+'      <SRS>EPSG:32126</SRS>' +
+'      <SRS>EPSG:32127</SRS>' +
+'      <SRS>EPSG:32128</SRS>' +
+'      <SRS>EPSG:32129</SRS>' +
+'      <SRS>EPSG:32130</SRS>' +
+'      <SRS>EPSG:32133</SRS>' +
+'      <SRS>EPSG:32134</SRS>' +
+'      <SRS>EPSG:32135</SRS>' +
+'      <SRS>EPSG:32136</SRS>' +
+'      <SRS>EPSG:32137</SRS>' +
+'      <SRS>EPSG:32138</SRS>' +
+'      <SRS>EPSG:32139</SRS>' +
+'      <SRS>EPSG:32140</SRS>' +
+'      <SRS>EPSG:32141</SRS>' +
+'      <SRS>EPSG:32142</SRS>' +
+'      <SRS>EPSG:32143</SRS>' +
+'      <SRS>EPSG:32144</SRS>' +
+'      <SRS>EPSG:32145</SRS>' +
+'      <SRS>EPSG:32146</SRS>' +
+'      <SRS>EPSG:32147</SRS>' +
+'      <SRS>EPSG:32148</SRS>' +
+'      <SRS>EPSG:32149</SRS>' +
+'      <SRS>EPSG:32150</SRS>' +
+'      <SRS>EPSG:32151</SRS>' +
+'      <SRS>EPSG:32152</SRS>' +
+'      <SRS>EPSG:32153</SRS>' +
+'      <SRS>EPSG:32154</SRS>' +
+'      <SRS>EPSG:32155</SRS>' +
+'      <SRS>EPSG:32156</SRS>' +
+'      <SRS>EPSG:32157</SRS>' +
+'      <SRS>EPSG:32158</SRS>' +
+'      <SRS>EPSG:32161</SRS>' +
+'      <SRS>EPSG:32164</SRS>' +
+'      <SRS>EPSG:32165</SRS>' +
+'      <SRS>EPSG:32166</SRS>' +
+'      <SRS>EPSG:32167</SRS>' +
+'      <SRS>EPSG:32180</SRS>' +
+'      <SRS>EPSG:32181</SRS>' +
+'      <SRS>EPSG:32182</SRS>' +
+'      <SRS>EPSG:32183</SRS>' +
+'      <SRS>EPSG:32184</SRS>' +
+'      <SRS>EPSG:32185</SRS>' +
+'      <SRS>EPSG:32186</SRS>' +
+'      <SRS>EPSG:32187</SRS>' +
+'      <SRS>EPSG:32188</SRS>' +
+'      <SRS>EPSG:32189</SRS>' +
+'      <SRS>EPSG:32190</SRS>' +
+'      <SRS>EPSG:32191</SRS>' +
+'      <SRS>EPSG:32192</SRS>' +
+'      <SRS>EPSG:32193</SRS>' +
+'      <SRS>EPSG:32194</SRS>' +
+'      <SRS>EPSG:32195</SRS>' +
+'      <SRS>EPSG:32196</SRS>' +
+'      <SRS>EPSG:32197</SRS>' +
+'      <SRS>EPSG:32198</SRS>' +
+'      <SRS>EPSG:32199</SRS>' +
+'      <SRS>EPSG:32201</SRS>' +
+'      <SRS>EPSG:32202</SRS>' +
+'      <SRS>EPSG:32203</SRS>' +
+'      <SRS>EPSG:32204</SRS>' +
+'      <SRS>EPSG:32205</SRS>' +
+'      <SRS>EPSG:32206</SRS>' +
+'      <SRS>EPSG:32207</SRS>' +
+'      <SRS>EPSG:32208</SRS>' +
+'      <SRS>EPSG:32209</SRS>' +
+'      <SRS>EPSG:32210</SRS>' +
+'      <SRS>EPSG:32211</SRS>' +
+'      <SRS>EPSG:32212</SRS>' +
+'      <SRS>EPSG:32213</SRS>' +
+'      <SRS>EPSG:32214</SRS>' +
+'      <SRS>EPSG:32215</SRS>' +
+'      <SRS>EPSG:32216</SRS>' +
+'      <SRS>EPSG:32217</SRS>' +
+'      <SRS>EPSG:32218</SRS>' +
+'      <SRS>EPSG:32219</SRS>' +
+'      <SRS>EPSG:32220</SRS>' +
+'      <SRS>EPSG:32221</SRS>' +
+'      <SRS>EPSG:32222</SRS>' +
+'      <SRS>EPSG:32223</SRS>' +
+'      <SRS>EPSG:32224</SRS>' +
+'      <SRS>EPSG:32225</SRS>' +
+'      <SRS>EPSG:32226</SRS>' +
+'      <SRS>EPSG:32227</SRS>' +
+'      <SRS>EPSG:32228</SRS>' +
+'      <SRS>EPSG:32229</SRS>' +
+'      <SRS>EPSG:32230</SRS>' +
+'      <SRS>EPSG:32231</SRS>' +
+'      <SRS>EPSG:32232</SRS>' +
+'      <SRS>EPSG:32233</SRS>' +
+'      <SRS>EPSG:32234</SRS>' +
+'      <SRS>EPSG:32235</SRS>' +
+'      <SRS>EPSG:32236</SRS>' +
+'      <SRS>EPSG:32237</SRS>' +
+'      <SRS>EPSG:32238</SRS>' +
+'      <SRS>EPSG:32239</SRS>' +
+'      <SRS>EPSG:32240</SRS>' +
+'      <SRS>EPSG:32241</SRS>' +
+'      <SRS>EPSG:32242</SRS>' +
+'      <SRS>EPSG:32243</SRS>' +
+'      <SRS>EPSG:32244</SRS>' +
+'      <SRS>EPSG:32245</SRS>' +
+'      <SRS>EPSG:32246</SRS>' +
+'      <SRS>EPSG:32247</SRS>' +
+'      <SRS>EPSG:32248</SRS>' +
+'      <SRS>EPSG:32249</SRS>' +
+'      <SRS>EPSG:32250</SRS>' +
+'      <SRS>EPSG:32251</SRS>' +
+'      <SRS>EPSG:32252</SRS>' +
+'      <SRS>EPSG:32253</SRS>' +
+'      <SRS>EPSG:32254</SRS>' +
+'      <SRS>EPSG:32255</SRS>' +
+'      <SRS>EPSG:32256</SRS>' +
+'      <SRS>EPSG:32257</SRS>' +
+'      <SRS>EPSG:32258</SRS>' +
+'      <SRS>EPSG:32259</SRS>' +
+'      <SRS>EPSG:32260</SRS>' +
+'      <SRS>EPSG:32301</SRS>' +
+'      <SRS>EPSG:32302</SRS>' +
+'      <SRS>EPSG:32303</SRS>' +
+'      <SRS>EPSG:32304</SRS>' +
+'      <SRS>EPSG:32305</SRS>' +
+'      <SRS>EPSG:32306</SRS>' +
+'      <SRS>EPSG:32307</SRS>' +
+'      <SRS>EPSG:32308</SRS>' +
+'      <SRS>EPSG:32309</SRS>' +
+'      <SRS>EPSG:32310</SRS>' +
+'      <SRS>EPSG:32311</SRS>' +
+'      <SRS>EPSG:32312</SRS>' +
+'      <SRS>EPSG:32313</SRS>' +
+'      <SRS>EPSG:32314</SRS>' +
+'      <SRS>EPSG:32315</SRS>' +
+'      <SRS>EPSG:32316</SRS>' +
+'      <SRS>EPSG:32317</SRS>' +
+'      <SRS>EPSG:32318</SRS>' +
+'      <SRS>EPSG:32319</SRS>' +
+'      <SRS>EPSG:32320</SRS>' +
+'      <SRS>EPSG:32321</SRS>' +
+'      <SRS>EPSG:32322</SRS>' +
+'      <SRS>EPSG:32323</SRS>' +
+'      <SRS>EPSG:32324</SRS>' +
+'      <SRS>EPSG:32325</SRS>' +
+'      <SRS>EPSG:32326</SRS>' +
+'      <SRS>EPSG:32327</SRS>' +
+'      <SRS>EPSG:32328</SRS>' +
+'      <SRS>EPSG:32329</SRS>' +
+'      <SRS>EPSG:32330</SRS>' +
+'      <SRS>EPSG:32331</SRS>' +
+'      <SRS>EPSG:32332</SRS>' +
+'      <SRS>EPSG:32333</SRS>' +
+'      <SRS>EPSG:32334</SRS>' +
+'      <SRS>EPSG:32335</SRS>' +
+'      <SRS>EPSG:32336</SRS>' +
+'      <SRS>EPSG:32337</SRS>' +
+'      <SRS>EPSG:32338</SRS>' +
+'      <SRS>EPSG:32339</SRS>' +
+'      <SRS>EPSG:32340</SRS>' +
+'      <SRS>EPSG:32341</SRS>' +
+'      <SRS>EPSG:32342</SRS>' +
+'      <SRS>EPSG:32343</SRS>' +
+'      <SRS>EPSG:32344</SRS>' +
+'      <SRS>EPSG:32345</SRS>' +
+'      <SRS>EPSG:32346</SRS>' +
+'      <SRS>EPSG:32347</SRS>' +
+'      <SRS>EPSG:32348</SRS>' +
+'      <SRS>EPSG:32349</SRS>' +
+'      <SRS>EPSG:32350</SRS>' +
+'      <SRS>EPSG:32351</SRS>' +
+'      <SRS>EPSG:32352</SRS>' +
+'      <SRS>EPSG:32353</SRS>' +
+'      <SRS>EPSG:32354</SRS>' +
+'      <SRS>EPSG:32355</SRS>' +
+'      <SRS>EPSG:32356</SRS>' +
+'      <SRS>EPSG:32357</SRS>' +
+'      <SRS>EPSG:32358</SRS>' +
+'      <SRS>EPSG:32359</SRS>' +
+'      <SRS>EPSG:32360</SRS>' +
+'      <SRS>EPSG:32401</SRS>' +
+'      <SRS>EPSG:32402</SRS>' +
+'      <SRS>EPSG:32403</SRS>' +
+'      <SRS>EPSG:32404</SRS>' +
+'      <SRS>EPSG:32405</SRS>' +
+'      <SRS>EPSG:32406</SRS>' +
+'      <SRS>EPSG:32407</SRS>' +
+'      <SRS>EPSG:32408</SRS>' +
+'      <SRS>EPSG:32409</SRS>' +
+'      <SRS>EPSG:32410</SRS>' +
+'      <SRS>EPSG:32411</SRS>' +
+'      <SRS>EPSG:32412</SRS>' +
+'      <SRS>EPSG:32413</SRS>' +
+'      <SRS>EPSG:32414</SRS>' +
+'      <SRS>EPSG:32415</SRS>' +
+'      <SRS>EPSG:32416</SRS>' +
+'      <SRS>EPSG:32417</SRS>' +
+'      <SRS>EPSG:32418</SRS>' +
+'      <SRS>EPSG:32419</SRS>' +
+'      <SRS>EPSG:32420</SRS>' +
+'      <SRS>EPSG:32421</SRS>' +
+'      <SRS>EPSG:32422</SRS>' +
+'      <SRS>EPSG:32423</SRS>' +
+'      <SRS>EPSG:32424</SRS>' +
+'      <SRS>EPSG:32425</SRS>' +
+'      <SRS>EPSG:32426</SRS>' +
+'      <SRS>EPSG:32427</SRS>' +
+'      <SRS>EPSG:32428</SRS>' +
+'      <SRS>EPSG:32429</SRS>' +
+'      <SRS>EPSG:32430</SRS>' +
+'      <SRS>EPSG:32431</SRS>' +
+'      <SRS>EPSG:32432</SRS>' +
+'      <SRS>EPSG:32433</SRS>' +
+'      <SRS>EPSG:32434</SRS>' +
+'      <SRS>EPSG:32435</SRS>' +
+'      <SRS>EPSG:32436</SRS>' +
+'      <SRS>EPSG:32437</SRS>' +
+'      <SRS>EPSG:32438</SRS>' +
+'      <SRS>EPSG:32439</SRS>' +
+'      <SRS>EPSG:32440</SRS>' +
+'      <SRS>EPSG:32441</SRS>' +
+'      <SRS>EPSG:32442</SRS>' +
+'      <SRS>EPSG:32443</SRS>' +
+'      <SRS>EPSG:32444</SRS>' +
+'      <SRS>EPSG:32445</SRS>' +
+'      <SRS>EPSG:32446</SRS>' +
+'      <SRS>EPSG:32447</SRS>' +
+'      <SRS>EPSG:32448</SRS>' +
+'      <SRS>EPSG:32449</SRS>' +
+'      <SRS>EPSG:32450</SRS>' +
+'      <SRS>EPSG:32451</SRS>' +
+'      <SRS>EPSG:32452</SRS>' +
+'      <SRS>EPSG:32453</SRS>' +
+'      <SRS>EPSG:32454</SRS>' +
+'      <SRS>EPSG:32455</SRS>' +
+'      <SRS>EPSG:32456</SRS>' +
+'      <SRS>EPSG:32457</SRS>' +
+'      <SRS>EPSG:32458</SRS>' +
+'      <SRS>EPSG:32459</SRS>' +
+'      <SRS>EPSG:32460</SRS>' +
+'      <SRS>EPSG:32501</SRS>' +
+'      <SRS>EPSG:32502</SRS>' +
+'      <SRS>EPSG:32503</SRS>' +
+'      <SRS>EPSG:32504</SRS>' +
+'      <SRS>EPSG:32505</SRS>' +
+'      <SRS>EPSG:32506</SRS>' +
+'      <SRS>EPSG:32507</SRS>' +
+'      <SRS>EPSG:32508</SRS>' +
+'      <SRS>EPSG:32509</SRS>' +
+'      <SRS>EPSG:32510</SRS>' +
+'      <SRS>EPSG:32511</SRS>' +
+'      <SRS>EPSG:32512</SRS>' +
+'      <SRS>EPSG:32513</SRS>' +
+'      <SRS>EPSG:32514</SRS>' +
+'      <SRS>EPSG:32515</SRS>' +
+'      <SRS>EPSG:32516</SRS>' +
+'      <SRS>EPSG:32517</SRS>' +
+'      <SRS>EPSG:32518</SRS>' +
+'      <SRS>EPSG:32519</SRS>' +
+'      <SRS>EPSG:32520</SRS>' +
+'      <SRS>EPSG:32521</SRS>' +
+'      <SRS>EPSG:32522</SRS>' +
+'      <SRS>EPSG:32523</SRS>' +
+'      <SRS>EPSG:32524</SRS>' +
+'      <SRS>EPSG:32525</SRS>' +
+'      <SRS>EPSG:32526</SRS>' +
+'      <SRS>EPSG:32527</SRS>' +
+'      <SRS>EPSG:32528</SRS>' +
+'      <SRS>EPSG:32529</SRS>' +
+'      <SRS>EPSG:32530</SRS>' +
+'      <SRS>EPSG:32531</SRS>' +
+'      <SRS>EPSG:32532</SRS>' +
+'      <SRS>EPSG:32533</SRS>' +
+'      <SRS>EPSG:32534</SRS>' +
+'      <SRS>EPSG:32535</SRS>' +
+'      <SRS>EPSG:32536</SRS>' +
+'      <SRS>EPSG:32537</SRS>' +
+'      <SRS>EPSG:32538</SRS>' +
+'      <SRS>EPSG:32539</SRS>' +
+'      <SRS>EPSG:32540</SRS>' +
+'      <SRS>EPSG:32541</SRS>' +
+'      <SRS>EPSG:32542</SRS>' +
+'      <SRS>EPSG:32543</SRS>' +
+'      <SRS>EPSG:32544</SRS>' +
+'      <SRS>EPSG:32545</SRS>' +
+'      <SRS>EPSG:32546</SRS>' +
+'      <SRS>EPSG:32547</SRS>' +
+'      <SRS>EPSG:32548</SRS>' +
+'      <SRS>EPSG:32549</SRS>' +
+'      <SRS>EPSG:32550</SRS>' +
+'      <SRS>EPSG:32551</SRS>' +
+'      <SRS>EPSG:32552</SRS>' +
+'      <SRS>EPSG:32553</SRS>' +
+'      <SRS>EPSG:32554</SRS>' +
+'      <SRS>EPSG:32555</SRS>' +
+'      <SRS>EPSG:32556</SRS>' +
+'      <SRS>EPSG:32557</SRS>' +
+'      <SRS>EPSG:32558</SRS>' +
+'      <SRS>EPSG:32559</SRS>' +
+'      <SRS>EPSG:32560</SRS>' +
+'      <SRS>EPSG:32600</SRS>' +
+'      <SRS>EPSG:32601</SRS>' +
+'      <SRS>EPSG:32602</SRS>' +
+'      <SRS>EPSG:32603</SRS>' +
+'      <SRS>EPSG:32604</SRS>' +
+'      <SRS>EPSG:32605</SRS>' +
+'      <SRS>EPSG:32606</SRS>' +
+'      <SRS>EPSG:32607</SRS>' +
+'      <SRS>EPSG:32608</SRS>' +
+'      <SRS>EPSG:32609</SRS>' +
+'      <SRS>EPSG:32610</SRS>' +
+'      <SRS>EPSG:32611</SRS>' +
+'      <SRS>EPSG:32612</SRS>' +
+'      <SRS>EPSG:32613</SRS>' +
+'      <SRS>EPSG:32614</SRS>' +
+'      <SRS>EPSG:32615</SRS>' +
+'      <SRS>EPSG:32616</SRS>' +
+'      <SRS>EPSG:32617</SRS>' +
+'      <SRS>EPSG:32618</SRS>' +
+'      <SRS>EPSG:32619</SRS>' +
+'      <SRS>EPSG:32620</SRS>' +
+'      <SRS>EPSG:32621</SRS>' +
+'      <SRS>EPSG:32622</SRS>' +
+'      <SRS>EPSG:32623</SRS>' +
+'      <SRS>EPSG:32624</SRS>' +
+'      <SRS>EPSG:32625</SRS>' +
+'      <SRS>EPSG:32626</SRS>' +
+'      <SRS>EPSG:32627</SRS>' +
+'      <SRS>EPSG:32628</SRS>' +
+'      <SRS>EPSG:32629</SRS>' +
+'      <SRS>EPSG:32630</SRS>' +
+'      <SRS>EPSG:32631</SRS>' +
+'      <SRS>EPSG:32632</SRS>' +
+'      <SRS>EPSG:32633</SRS>' +
+'      <SRS>EPSG:32634</SRS>' +
+'      <SRS>EPSG:32635</SRS>' +
+'      <SRS>EPSG:32636</SRS>' +
+'      <SRS>EPSG:32637</SRS>' +
+'      <SRS>EPSG:32638</SRS>' +
+'      <SRS>EPSG:32639</SRS>' +
+'      <SRS>EPSG:32640</SRS>' +
+'      <SRS>EPSG:32641</SRS>' +
+'      <SRS>EPSG:32642</SRS>' +
+'      <SRS>EPSG:32643</SRS>' +
+'      <SRS>EPSG:32644</SRS>' +
+'      <SRS>EPSG:32645</SRS>' +
+'      <SRS>EPSG:32646</SRS>' +
+'      <SRS>EPSG:32647</SRS>' +
+'      <SRS>EPSG:32648</SRS>' +
+'      <SRS>EPSG:32649</SRS>' +
+'      <SRS>EPSG:32650</SRS>' +
+'      <SRS>EPSG:32651</SRS>' +
+'      <SRS>EPSG:32652</SRS>' +
+'      <SRS>EPSG:32653</SRS>' +
+'      <SRS>EPSG:32654</SRS>' +
+'      <SRS>EPSG:32655</SRS>' +
+'      <SRS>EPSG:32656</SRS>' +
+'      <SRS>EPSG:32657</SRS>' +
+'      <SRS>EPSG:32658</SRS>' +
+'      <SRS>EPSG:32659</SRS>' +
+'      <SRS>EPSG:32660</SRS>' +
+'      <SRS>EPSG:32661</SRS>' +
+'      <SRS>EPSG:32662</SRS>' +
+'      <SRS>EPSG:32664</SRS>' +
+'      <SRS>EPSG:32665</SRS>' +
+'      <SRS>EPSG:32666</SRS>' +
+'      <SRS>EPSG:32667</SRS>' +
+'      <SRS>EPSG:32700</SRS>' +
+'      <SRS>EPSG:32701</SRS>' +
+'      <SRS>EPSG:32702</SRS>' +
+'      <SRS>EPSG:32703</SRS>' +
+'      <SRS>EPSG:32704</SRS>' +
+'      <SRS>EPSG:32705</SRS>' +
+'      <SRS>EPSG:32706</SRS>' +
+'      <SRS>EPSG:32707</SRS>' +
+'      <SRS>EPSG:32708</SRS>' +
+'      <SRS>EPSG:32709</SRS>' +
+'      <SRS>EPSG:32710</SRS>' +
+'      <SRS>EPSG:32711</SRS>' +
+'      <SRS>EPSG:32712</SRS>' +
+'      <SRS>EPSG:32713</SRS>' +
+'      <SRS>EPSG:32714</SRS>' +
+'      <SRS>EPSG:32715</SRS>' +
+'      <SRS>EPSG:32716</SRS>' +
+'      <SRS>EPSG:32717</SRS>' +
+'      <SRS>EPSG:32718</SRS>' +
+'      <SRS>EPSG:32719</SRS>' +
+'      <SRS>EPSG:32720</SRS>' +
+'      <SRS>EPSG:32721</SRS>' +
+'      <SRS>EPSG:32722</SRS>' +
+'      <SRS>EPSG:32723</SRS>' +
+'      <SRS>EPSG:32724</SRS>' +
+'      <SRS>EPSG:32725</SRS>' +
+'      <SRS>EPSG:32726</SRS>' +
+'      <SRS>EPSG:32727</SRS>' +
+'      <SRS>EPSG:32728</SRS>' +
+'      <SRS>EPSG:32729</SRS>' +
+'      <SRS>EPSG:32730</SRS>' +
+'      <SRS>EPSG:32731</SRS>' +
+'      <SRS>EPSG:32732</SRS>' +
+'      <SRS>EPSG:32733</SRS>' +
+'      <SRS>EPSG:32734</SRS>' +
+'      <SRS>EPSG:32735</SRS>' +
+'      <SRS>EPSG:32736</SRS>' +
+'      <SRS>EPSG:32737</SRS>' +
+'      <SRS>EPSG:32738</SRS>' +
+'      <SRS>EPSG:32739</SRS>' +
+'      <SRS>EPSG:32740</SRS>' +
+'      <SRS>EPSG:32741</SRS>' +
+'      <SRS>EPSG:32742</SRS>' +
+'      <SRS>EPSG:32743</SRS>' +
+'      <SRS>EPSG:32744</SRS>' +
+'      <SRS>EPSG:32745</SRS>' +
+'      <SRS>EPSG:32746</SRS>' +
+'      <SRS>EPSG:32747</SRS>' +
+'      <SRS>EPSG:32748</SRS>' +
+'      <SRS>EPSG:32749</SRS>' +
+'      <SRS>EPSG:32750</SRS>' +
+'      <SRS>EPSG:32751</SRS>' +
+'      <SRS>EPSG:32752</SRS>' +
+'      <SRS>EPSG:32753</SRS>' +
+'      <SRS>EPSG:32754</SRS>' +
+'      <SRS>EPSG:32755</SRS>' +
+'      <SRS>EPSG:32756</SRS>' +
+'      <SRS>EPSG:32757</SRS>' +
+'      <SRS>EPSG:32758</SRS>' +
+'      <SRS>EPSG:32759</SRS>' +
+'      <SRS>EPSG:32760</SRS>' +
+'      <SRS>EPSG:32761</SRS>' +
+'      <SRS>EPSG:32766</SRS>' +
+'      <SRS>EPSG:61206405</SRS>' +
+'      <SRS>EPSG:61216405</SRS>' +
+'      <SRS>EPSG:61226405</SRS>' +
+'      <SRS>EPSG:61236405</SRS>' +
+'      <SRS>EPSG:61246405</SRS>' +
+'      <SRS>EPSG:61266405</SRS>' +
+'      <SRS>EPSG:61266413</SRS>' +
+'      <SRS>EPSG:61276405</SRS>' +
+'      <SRS>EPSG:61286405</SRS>' +
+'      <SRS>EPSG:61296405</SRS>' +
+'      <SRS>EPSG:61306405</SRS>' +
+'      <SRS>EPSG:61306413</SRS>' +
+'      <SRS>EPSG:61316405</SRS>' +
+'      <SRS>EPSG:61326405</SRS>' +
+'      <SRS>EPSG:61336405</SRS>' +
+'      <SRS>EPSG:61346405</SRS>' +
+'      <SRS>EPSG:61356405</SRS>' +
+'      <SRS>EPSG:61366405</SRS>' +
+'      <SRS>EPSG:61376405</SRS>' +
+'      <SRS>EPSG:61386405</SRS>' +
+'      <SRS>EPSG:61396405</SRS>' +
+'      <SRS>EPSG:61406405</SRS>' +
+'      <SRS>EPSG:61406413</SRS>' +
+'      <SRS>EPSG:61416405</SRS>' +
+'      <SRS>EPSG:61426405</SRS>' +
+'      <SRS>EPSG:61436405</SRS>' +
+'      <SRS>EPSG:61446405</SRS>' +
+'      <SRS>EPSG:61456405</SRS>' +
+'      <SRS>EPSG:61466405</SRS>' +
+'      <SRS>EPSG:61476405</SRS>' +
+'      <SRS>EPSG:61486405</SRS>' +
+'      <SRS>EPSG:61486413</SRS>' +
+'      <SRS>EPSG:61496405</SRS>' +
+'      <SRS>EPSG:61506405</SRS>' +
+'      <SRS>EPSG:61516405</SRS>' +
+'      <SRS>EPSG:61516413</SRS>' +
+'      <SRS>EPSG:61526405</SRS>' +
+'      <SRS>EPSG:61526413</SRS>' +
+'      <SRS>EPSG:61536405</SRS>' +
+'      <SRS>EPSG:61546405</SRS>' +
+'      <SRS>EPSG:61556405</SRS>' +
+'      <SRS>EPSG:61566405</SRS>' +
+'      <SRS>EPSG:61576405</SRS>' +
+'      <SRS>EPSG:61586405</SRS>' +
+'      <SRS>EPSG:61596405</SRS>' +
+'      <SRS>EPSG:61606405</SRS>' +
+'      <SRS>EPSG:61616405</SRS>' +
+'      <SRS>EPSG:61626405</SRS>' +
+'      <SRS>EPSG:61636405</SRS>' +
+'      <SRS>EPSG:61636413</SRS>' +
+'      <SRS>EPSG:61646405</SRS>' +
+'      <SRS>EPSG:61656405</SRS>' +
+'      <SRS>EPSG:61666405</SRS>' +
+'      <SRS>EPSG:61676405</SRS>' +
+'      <SRS>EPSG:61676413</SRS>' +
+'      <SRS>EPSG:61686405</SRS>' +
+'      <SRS>EPSG:61696405</SRS>' +
+'      <SRS>EPSG:61706405</SRS>' +
+'      <SRS>EPSG:61706413</SRS>' +
+'      <SRS>EPSG:61716405</SRS>' +
+'      <SRS>EPSG:61716413</SRS>' +
+'      <SRS>EPSG:61736405</SRS>' +
+'      <SRS>EPSG:61736413</SRS>' +
+'      <SRS>EPSG:61746405</SRS>' +
+'      <SRS>EPSG:61756405</SRS>' +
+'      <SRS>EPSG:61766405</SRS>' +
+'      <SRS>EPSG:61766413</SRS>' +
+'      <SRS>EPSG:61786405</SRS>' +
+'      <SRS>EPSG:61796405</SRS>' +
+'      <SRS>EPSG:61806405</SRS>' +
+'      <SRS>EPSG:61806413</SRS>' +
+'      <SRS>EPSG:61816405</SRS>' +
+'      <SRS>EPSG:61826405</SRS>' +
+'      <SRS>EPSG:61836405</SRS>' +
+'      <SRS>EPSG:61846405</SRS>' +
+'      <SRS>EPSG:61886405</SRS>' +
+'      <SRS>EPSG:61896405</SRS>' +
+'      <SRS>EPSG:61896413</SRS>' +
+'      <SRS>EPSG:61906405</SRS>' +
+'      <SRS>EPSG:61906413</SRS>' +
+'      <SRS>EPSG:61916405</SRS>' +
+'      <SRS>EPSG:61926405</SRS>' +
+'      <SRS>EPSG:61936405</SRS>' +
+'      <SRS>EPSG:61946405</SRS>' +
+'      <SRS>EPSG:61956405</SRS>' +
+'      <SRS>EPSG:61966405</SRS>' +
+'      <SRS>EPSG:61976405</SRS>' +
+'      <SRS>EPSG:61986405</SRS>' +
+'      <SRS>EPSG:61996405</SRS>' +
+'      <SRS>EPSG:62006405</SRS>' +
+'      <SRS>EPSG:62016405</SRS>' +
+'      <SRS>EPSG:62026405</SRS>' +
+'      <SRS>EPSG:62036405</SRS>' +
+'      <SRS>EPSG:62046405</SRS>' +
+'      <SRS>EPSG:62056405</SRS>' +
+'      <SRS>EPSG:62066405</SRS>' +
+'      <SRS>EPSG:62076405</SRS>' +
+'      <SRS>EPSG:62086405</SRS>' +
+'      <SRS>EPSG:62096405</SRS>' +
+'      <SRS>EPSG:62106405</SRS>' +
+'      <SRS>EPSG:62116405</SRS>' +
+'      <SRS>EPSG:62126405</SRS>' +
+'      <SRS>EPSG:62136405</SRS>' +
+'      <SRS>EPSG:62146405</SRS>' +
+'      <SRS>EPSG:62156405</SRS>' +
+'      <SRS>EPSG:62166405</SRS>' +
+'      <SRS>EPSG:62186405</SRS>' +
+'      <SRS>EPSG:62196405</SRS>' +
+'      <SRS>EPSG:62206405</SRS>' +
+'      <SRS>EPSG:62216405</SRS>' +
+'      <SRS>EPSG:62226405</SRS>' +
+'      <SRS>EPSG:62236405</SRS>' +
+'      <SRS>EPSG:62246405</SRS>' +
+'      <SRS>EPSG:62256405</SRS>' +
+'      <SRS>EPSG:62276405</SRS>' +
+'      <SRS>EPSG:62296405</SRS>' +
+'      <SRS>EPSG:62306405</SRS>' +
+'      <SRS>EPSG:62316405</SRS>' +
+'      <SRS>EPSG:62326405</SRS>' +
+'      <SRS>EPSG:62336405</SRS>' +
+'      <SRS>EPSG:62366405</SRS>' +
+'      <SRS>EPSG:62376405</SRS>' +
+'      <SRS>EPSG:62386405</SRS>' +
+'      <SRS>EPSG:62396405</SRS>' +
+'      <SRS>EPSG:62406405</SRS>' +
+'      <SRS>EPSG:62416405</SRS>' +
+'      <SRS>EPSG:62426405</SRS>' +
+'      <SRS>EPSG:62436405</SRS>' +
+'      <SRS>EPSG:62446405</SRS>' +
+'      <SRS>EPSG:62456405</SRS>' +
+'      <SRS>EPSG:62466405</SRS>' +
+'      <SRS>EPSG:62476405</SRS>' +
+'      <SRS>EPSG:62486405</SRS>' +
+'      <SRS>EPSG:62496405</SRS>' +
+'      <SRS>EPSG:62506405</SRS>' +
+'      <SRS>EPSG:62516405</SRS>' +
+'      <SRS>EPSG:62526405</SRS>' +
+'      <SRS>EPSG:62536405</SRS>' +
+'      <SRS>EPSG:62546405</SRS>' +
+'      <SRS>EPSG:62556405</SRS>' +
+'      <SRS>EPSG:62566405</SRS>' +
+'      <SRS>EPSG:62576405</SRS>' +
+'      <SRS>EPSG:62586405</SRS>' +
+'      <SRS>EPSG:62586413</SRS>' +
+'      <SRS>EPSG:62596405</SRS>' +
+'      <SRS>EPSG:62616405</SRS>' +
+'      <SRS>EPSG:62626405</SRS>' +
+'      <SRS>EPSG:62636405</SRS>' +
+'      <SRS>EPSG:62646405</SRS>' +
+'      <SRS>EPSG:62656405</SRS>' +
+'      <SRS>EPSG:62666405</SRS>' +
+'      <SRS>EPSG:62676405</SRS>' +
+'      <SRS>EPSG:62686405</SRS>' +
+'      <SRS>EPSG:62696405</SRS>' +
+'      <SRS>EPSG:62706405</SRS>' +
+'      <SRS>EPSG:62716405</SRS>' +
+'      <SRS>EPSG:62726405</SRS>' +
+'      <SRS>EPSG:62736405</SRS>' +
+'      <SRS>EPSG:62746405</SRS>' +
+'      <SRS>EPSG:62756405</SRS>' +
+'      <SRS>EPSG:62766405</SRS>' +
+'      <SRS>EPSG:62776405</SRS>' +
+'      <SRS>EPSG:62786405</SRS>' +
+'      <SRS>EPSG:62796405</SRS>' +
+'      <SRS>EPSG:62806405</SRS>' +
+'      <SRS>EPSG:62816405</SRS>' +
+'      <SRS>EPSG:62826405</SRS>' +
+'      <SRS>EPSG:62836405</SRS>' +
+'      <SRS>EPSG:62836413</SRS>' +
+'      <SRS>EPSG:62846405</SRS>' +
+'      <SRS>EPSG:62856405</SRS>' +
+'      <SRS>EPSG:62866405</SRS>' +
+'      <SRS>EPSG:62886405</SRS>' +
+'      <SRS>EPSG:62896405</SRS>' +
+'      <SRS>EPSG:62926405</SRS>' +
+'      <SRS>EPSG:62936405</SRS>' +
+'      <SRS>EPSG:62956405</SRS>' +
+'      <SRS>EPSG:62976405</SRS>' +
+'      <SRS>EPSG:62986405</SRS>' +
+'      <SRS>EPSG:62996405</SRS>' +
+'      <SRS>EPSG:63006405</SRS>' +
+'      <SRS>EPSG:63016405</SRS>' +
+'      <SRS>EPSG:63026405</SRS>' +
+'      <SRS>EPSG:63036405</SRS>' +
+'      <SRS>EPSG:63046405</SRS>' +
+'      <SRS>EPSG:63066405</SRS>' +
+'      <SRS>EPSG:63076405</SRS>' +
+'      <SRS>EPSG:63086405</SRS>' +
+'      <SRS>EPSG:63096405</SRS>' +
+'      <SRS>EPSG:63106405</SRS>' +
+'      <SRS>EPSG:63116405</SRS>' +
+'      <SRS>EPSG:63126405</SRS>' +
+'      <SRS>EPSG:63136405</SRS>' +
+'      <SRS>EPSG:63146405</SRS>' +
+'      <SRS>EPSG:63156405</SRS>' +
+'      <SRS>EPSG:63166405</SRS>' +
+'      <SRS>EPSG:63176405</SRS>' +
+'      <SRS>EPSG:63186405</SRS>' +
+'      <SRS>EPSG:63196405</SRS>' +
+'      <SRS>EPSG:63226405</SRS>' +
+'      <SRS>EPSG:63246405</SRS>' +
+'      <SRS>EPSG:63266405</SRS>' +
+'      <SRS>EPSG:63266406</SRS>' +
+'      <SRS>EPSG:63266407</SRS>' +
+'      <SRS>EPSG:63266408</SRS>' +
+'      <SRS>EPSG:63266409</SRS>' +
+'      <SRS>EPSG:63266410</SRS>' +
+'      <SRS>EPSG:63266411</SRS>' +
+'      <SRS>EPSG:63266412</SRS>' +
+'      <SRS>EPSG:63266413</SRS>' +
+'      <SRS>EPSG:63266414</SRS>' +
+'      <SRS>EPSG:63266415</SRS>' +
+'      <SRS>EPSG:63266416</SRS>' +
+'      <SRS>EPSG:63266417</SRS>' +
+'      <SRS>EPSG:63266418</SRS>' +
+'      <SRS>EPSG:63266419</SRS>' +
+'      <SRS>EPSG:63266420</SRS>' +
+'      <SRS>EPSG:66006405</SRS>' +
+'      <SRS>EPSG:66016405</SRS>' +
+'      <SRS>EPSG:66026405</SRS>' +
+'      <SRS>EPSG:66036405</SRS>' +
+'      <SRS>EPSG:66046405</SRS>' +
+'      <SRS>EPSG:66056405</SRS>' +
+'      <SRS>EPSG:66066405</SRS>' +
+'      <SRS>EPSG:66076405</SRS>' +
+'      <SRS>EPSG:66086405</SRS>' +
+'      <SRS>EPSG:66096405</SRS>' +
+'      <SRS>EPSG:66106405</SRS>' +
+'      <SRS>EPSG:66116405</SRS>' +
+'      <SRS>EPSG:66126405</SRS>' +
+'      <SRS>EPSG:66126413</SRS>' +
+'      <SRS>EPSG:66136405</SRS>' +
+'      <SRS>EPSG:66146405</SRS>' +
+'      <SRS>EPSG:66156405</SRS>' +
+'      <SRS>EPSG:66166405</SRS>' +
+'      <SRS>EPSG:66186405</SRS>' +
+'      <SRS>EPSG:66196405</SRS>' +
+'      <SRS>EPSG:66196413</SRS>' +
+'      <SRS>EPSG:66206405</SRS>' +
+'      <SRS>EPSG:66216405</SRS>' +
+'      <SRS>EPSG:66226405</SRS>' +
+'      <SRS>EPSG:66236405</SRS>' +
+'      <SRS>EPSG:66246405</SRS>' +
+'      <SRS>EPSG:66246413</SRS>' +
+'      <SRS>EPSG:66256405</SRS>' +
+'      <SRS>EPSG:66266405</SRS>' +
+'      <SRS>EPSG:66276405</SRS>' +
+'      <SRS>EPSG:66276413</SRS>' +
+'      <SRS>EPSG:66286405</SRS>' +
+'      <SRS>EPSG:66296405</SRS>' +
+'      <SRS>EPSG:66306405</SRS>' +
+'      <SRS>EPSG:66316405</SRS>' +
+'      <SRS>EPSG:66326405</SRS>' +
+'      <SRS>EPSG:66336405</SRS>' +
+'      <SRS>EPSG:66346405</SRS>' +
+'      <SRS>EPSG:66356405</SRS>' +
+'      <SRS>EPSG:66366405</SRS>' +
+'      <SRS>EPSG:66376405</SRS>' +
+'      <SRS>EPSG:66386405</SRS>' +
+'      <SRS>EPSG:66396405</SRS>' +
+'      <SRS>EPSG:66406405</SRS>' +
+'      <SRS>EPSG:66406413</SRS>' +
+'      <SRS>EPSG:66416405</SRS>' +
+'      <SRS>EPSG:66426405</SRS>' +
+'      <SRS>EPSG:66436405</SRS>' +
+'      <SRS>EPSG:66446405</SRS>' +
+'      <SRS>EPSG:66456405</SRS>' +
+'      <SRS>EPSG:66456413</SRS>' +
+'      <SRS>EPSG:66466405</SRS>' +
+'      <SRS>EPSG:66576405</SRS>' +
+'      <SRS>EPSG:66586405</SRS>' +
+'      <SRS>EPSG:66596405</SRS>' +
+'      <SRS>EPSG:66596413</SRS>' +
+'      <SRS>EPSG:66606405</SRS>' +
+'      <SRS>EPSG:66616405</SRS>' +
+'      <SRS>EPSG:66616413</SRS>' +
+'      <SRS>EPSG:66636405</SRS>' +
+'      <SRS>EPSG:66646405</SRS>' +
+'      <SRS>EPSG:66656405</SRS>' +
+'      <SRS>EPSG:66666405</SRS>' +
+'      <SRS>EPSG:66676405</SRS>' +
+'      <SRS>EPSG:68016405</SRS>' +
+'      <SRS>EPSG:68026405</SRS>' +
+'      <SRS>EPSG:68036405</SRS>' +
+'      <SRS>EPSG:68046405</SRS>' +
+'      <SRS>EPSG:68056405</SRS>' +
+'      <SRS>EPSG:68066405</SRS>' +
+'      <SRS>EPSG:68086405</SRS>' +
+'      <SRS>EPSG:68096405</SRS>' +
+'      <SRS>EPSG:68136405</SRS>' +
+'      <SRS>EPSG:68146405</SRS>' +
+'      <SRS>EPSG:68156405</SRS>' +
+'      <SRS>EPSG:68186405</SRS>' +
+'      <SRS>EPSG:68206405</SRS>' +
+'      <SRS>EPSG:69036405</SRS>' +
+'      <SRS>EPSG:42302</SRS>' +
+'      <SRS>EPSG:42301</SRS>' +
+'      <SRS>EPSG:900913</SRS>' +
+'      <SRS>EPSG:45556</SRS>' +
+'      <SRS>EPSG:45555</SRS>' +
+'      <SRS>EPSG:54004</SRS>' +
+'      <SRS>EPSG:41001</SRS>' +
+'      <SRS>EPSG:42311</SRS>' +
+'      <SRS>EPSG:42310</SRS>' +
+'      <SRS>EPSG:18001</SRS>' +
+'      <SRS>EPSG:100003</SRS>' +
+'      <SRS>EPSG:42106</SRS>' +
+'      <SRS>EPSG:100002</SRS>' +
+'      <SRS>EPSG:42105</SRS>' +
+'      <SRS>EPSG:100001</SRS>' +
+'      <SRS>EPSG:42309</SRS>' +
+'      <SRS>EPSG:42104</SRS>' +
+'      <SRS>EPSG:42308</SRS>' +
+'      <SRS>EPSG:42103</SRS>' +
+'      <SRS>EPSG:42307</SRS>' +
+'      <SRS>EPSG:42102</SRS>' +
+'      <SRS>EPSG:42306</SRS>' +
+'      <SRS>EPSG:42101</SRS>' +
+'      <SRS>EPSG:42305</SRS>' +
+'      <SRS>EPSG:42304</SRS>' +
+'      <SRS>EPSG:42303</SRS>' +
+'      <LatLonBoundingBox minx="-297176.16529836657" miny="-1.2694600326676274E7" maxx="3.0016785704606913E7" maxy="1.7619361543229006E7"/>' +
+'      <Layer queryable="1">' +
+'        <Name>og:bugsites</Name>' +
+'        <Title/>' +
+'        <Abstract>Sample data from GRASS, bug sites location, Spearfish, South Dakota, USA</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>spearfish</Keyword>' +
+'          <Keyword>sfBugsites</Keyword>' +
+'          <Keyword>insects</Keyword>' +
+'          <Keyword>bugsites</Keyword>' +
+'          <Keyword>tiger_beetles</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:26713</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'PROJCS["NAD27 / UTM zone 13N", ' +
+'  GEOGCS["NAD27", ' +
+'    DATUM["North American Datum 1927", ' +
+'      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], ' +
+'      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], ' +
+'      AUTHORITY["EPSG","6267"]], ' +
+'    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'    UNIT["degree", 0.017453292519943295], ' +
+'    AXIS["Geodetic longitude", EAST], ' +
+'    AXIS["Geodetic latitude", NORTH], ' +
+'    AUTHORITY["EPSG","4267"]], ' +
+'  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], ' +
+'  PARAMETER["central_meridian", -105.0], ' +
+'  PARAMETER["latitude_of_origin", 0.0], ' +
+'  PARAMETER["scale_factor", 0.9996], ' +
+'  PARAMETER["false_easting", 500000.0], ' +
+'  PARAMETER["false_northing", 0.0], ' +
+'  UNIT["m", 1.0], ' +
+'  AXIS["Easting", EAST], ' +
+'  AXIS["Northing", NORTH], ' +
+'  AUTHORITY["EPSG","26713"]]-->' +
+'        <LatLonBoundingBox minx="-103.8701581843142" miny="44.286540361238224" maxx="-103.63532819794625" maxy="44.52137034760618"/>' +
+'        <BoundingBox SRS="EPSG:26713" minx="590232.0" miny="4914096.0" maxx="608471.0" maxy="4920512.0"/>' +
+'        <Style>' +
+'          <Name>capitals</Name>' +
+'          <Title>Capital cities</Title>' +
+'          <Abstract/>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:bugsites"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>og:restricted</Name>' +
+'        <Title/>' +
+'        <Abstract>Sample data from GRASS, restricted areas, Spearfish, South Dakota, USA</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>spearfish</Keyword>' +
+'          <Keyword>restricted</Keyword>' +
+'          <Keyword>sfRestricted</Keyword>' +
+'          <Keyword>areas</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:26713</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'PROJCS["NAD27 / UTM zone 13N", ' +
+'  GEOGCS["NAD27", ' +
+'    DATUM["North American Datum 1927", ' +
+'      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], ' +
+'      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], ' +
+'      AUTHORITY["EPSG","6267"]], ' +
+'    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'    UNIT["degree", 0.017453292519943295], ' +
+'    AXIS["Geodetic longitude", EAST], ' +
+'    AXIS["Geodetic latitude", NORTH], ' +
+'    AUTHORITY["EPSG","4267"]], ' +
+'  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], ' +
+'  PARAMETER["central_meridian", -105.0], ' +
+'  PARAMETER["latitude_of_origin", 0.0], ' +
+'  PARAMETER["scale_factor", 0.9996], ' +
+'  PARAMETER["false_easting", 500000.0], ' +
+'  PARAMETER["false_northing", 0.0], ' +
+'  UNIT["m", 1.0], ' +
+'  AXIS["Easting", EAST], ' +
+'  AXIS["Northing", NORTH], ' +
+'  AUTHORITY["EPSG","26713"]]-->' +
+'        <LatLonBoundingBox minx="-104.36424600670885" miny="43.78798270975212" maxx="-103.06226503558304" maxy="45.089963680877936"/>' +
+'        <BoundingBox SRS="EPSG:26713" minx="551796.8125" miny="4901896.0" maxx="652788.5625" maxy="4940954.0"/>' +
+'        <Style>' +
+'          <Name>restricted</Name>' +
+'          <Title>Red, translucent style</Title>' +
+'          <Abstract>A sample style that just prints out a transparent red interior with a red outline</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:restricted"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>og:archsites</Name>' +
+'        <Title/>' +
+'        <Abstract>Sample data from GRASS, archeological sites location, Spearfish, South Dakota, USA</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>archsites</Keyword>' +
+'          <Keyword>spearfish</Keyword>' +
+'          <Keyword>sfArchsites</Keyword>' +
+'          <Keyword>archeology</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:26713</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'PROJCS["NAD27 / UTM zone 13N", ' +
+'  GEOGCS["NAD27", ' +
+'    DATUM["North American Datum 1927", ' +
+'      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], ' +
+'      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], ' +
+'      AUTHORITY["EPSG","6267"]], ' +
+'    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'    UNIT["degree", 0.017453292519943295], ' +
+'    AXIS["Geodetic longitude", EAST], ' +
+'    AXIS["Geodetic latitude", NORTH], ' +
+'    AUTHORITY["EPSG","4267"]], ' +
+'  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], ' +
+'  PARAMETER["central_meridian", -105.0], ' +
+'  PARAMETER["latitude_of_origin", 0.0], ' +
+'  PARAMETER["scale_factor", 0.9996], ' +
+'  PARAMETER["false_easting", 500000.0], ' +
+'  PARAMETER["false_northing", 0.0], ' +
+'  UNIT["m", 1.0], ' +
+'  AXIS["Easting", EAST], ' +
+'  AXIS["Northing", NORTH], ' +
+'  AUTHORITY["EPSG","26713"]]-->' +
+'        <LatLonBoundingBox minx="-103.87480459767542" miny="44.31295793136913" maxx="-103.63549073047534" maxy="44.55227179856921"/>' +
+'        <BoundingBox SRS="EPSG:26713" minx="589860.0" miny="4914479.0" maxx="608355.0" maxy="4926490.0"/>' +
+'        <Style>' +
+'          <Name>point</Name>' +
+'          <Title>Default point</Title>' +
+'          <Abstract>A sample style that just prints out a 6px wide red square</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:archsites"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>og:streams</Name>' +
+'        <Title/>' +
+'        <Abstract>Sample data from GRASS, streams, Spearfish, South Dakota, USA</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>spearfish</Keyword>' +
+'          <Keyword>sfStreams</Keyword>' +
+'          <Keyword>streams</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:26713</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'PROJCS["NAD27 / UTM zone 13N", ' +
+'  GEOGCS["NAD27", ' +
+'    DATUM["North American Datum 1927", ' +
+'      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], ' +
+'      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], ' +
+'      AUTHORITY["EPSG","6267"]], ' +
+'    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'    UNIT["degree", 0.017453292519943295], ' +
+'    AXIS["Geodetic longitude", EAST], ' +
+'    AXIS["Geodetic latitude", NORTH], ' +
+'    AUTHORITY["EPSG","4267"]], ' +
+'  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], ' +
+'  PARAMETER["central_meridian", -105.0], ' +
+'  PARAMETER["latitude_of_origin", 0.0], ' +
+'  PARAMETER["scale_factor", 0.9996], ' +
+'  PARAMETER["false_easting", 500000.0], ' +
+'  PARAMETER["false_northing", 0.0], ' +
+'  UNIT["m", 1.0], ' +
+'  AXIS["Easting", EAST], ' +
+'  AXIS["Northing", NORTH], ' +
+'  AUTHORITY["EPSG","26713"]]-->' +
+'        <LatLonBoundingBox minx="-103.88033574142051" miny="44.30711172484593" maxx="-103.62022283326024" maxy="44.5672246330062"/>' +
+'        <BoundingBox SRS="EPSG:26713" minx="589443.0" miny="4913935.0" maxx="609526.75" maxy="4928059.5"/>' +
+'        <Style>' +
+'          <Name>simple_streams</Name>' +
+'          <Title>Default Styler for streams segments</Title>' +
+'          <Abstract>Blue lines, 2px wide</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:streams"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>tiger:poly_landmarks</Name>' +
+'        <Title>Manhattan (NY) landmarks</Title>' +
+'        <Abstract>Manhattan landmarks, identifies water, lakes, parks, interesting buildilngs</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>DS_poly_landmarks</Keyword>' +
+'          <Keyword>landmarks</Keyword>' +
+'          <Keyword>manhattan</Keyword>' +
+'          <Keyword>poly_landmarks</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="-74.0828672737" miny="40.67246384130001" maxx="-73.8660689563" maxy="40.8892621587"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="-74.047185" miny="40.679648" maxx="-73.90782" maxy="40.882078"/>' +
+'        <Style>' +
+'          <Name>poly_landmarks</Name>' +
+'          <Title>Default Styler</Title>' +
+'          <Abstract/>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:poly_landmarks"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>tiger:poi</Name>' +
+'        <Title>Manhattan (NY) points of interest</Title>' +
+'        <Abstract>Points of interest in New York, New York (on Manhattan). One of the attributes contains the name of a file with a picture of the point of interest.</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>poi</Keyword>' +
+'          <Keyword>Manhattan</Keyword>' +
+'          <Keyword>DS_poi</Keyword>' +
+'          <Keyword>points_of_interest</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="-74.01244590356289" miny="40.70750285086222" maxx="-74.00795911725866" maxy="40.711989637166425"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="-74.0118315772888" miny="40.70754683896324" maxx="-74.00153046439813" maxy="40.719885123828675"/>' +
+'        <Style>' +
+'          <Name>poi</Name>' +
+'          <Title>Points of interest</Title>' +
+'          <Abstract>Manhattan points of interest</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:poi"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>tiger:tiger_roads</Name>' +
+'        <Title>Manhattan (NY) roads</Title>' +
+'        <Abstract>Highly simplified road layout of Manhattan in New York..</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>DS_tiger_roads</Keyword>' +
+'          <Keyword>tiger_roads</Keyword>' +
+'          <Keyword>roads</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="-74.06603057" miny="40.68228143" maxx="-73.86819443" maxy="40.880117569999996"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="-74.02722" miny="40.684221" maxx="-73.907005" maxy="40.878178"/>' +
+'        <Style>' +
+'          <Name>tiger_roads</Name>' +
+'          <Title>Default Styler</Title>' +
+'          <Abstract/>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:tiger_roads"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>za:za_natural</Name>' +
+'        <Title>Natural Landmarks in South Africa</Title>' +
+'        <Abstract>This layer describes natural features of South Africa such as forests and lakes.</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>water</Keyword>' +
+'          <Keyword>forests</Keyword>' +
+'          <Keyword>landmarks</Keyword>' +
+'          <Keyword>Africa</Keyword>' +
+'          <Keyword>South</Keyword>' +
+'          <Keyword>natural</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="16.779241142272962" miny="-36.53577846527099" maxx="32.70336002349853" maxy="-20.611659584045416"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="16.935359954834" miny="-34.3737831115723" maxx="32.5472412109375" maxy="-22.7736549377441"/>' +
+'        <Style>' +
+'          <Name>za_natural</Name>' +
+'          <Title>Default Styler</Title>' +
+'          <Abstract/>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=za:za_natural"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>za:za_points</Name>' +
+'        <Title>Points of Interest in South Africa</Title>' +
+'        <Abstract>Noteworthy locations such as hotels and tourist attractions in South Africa.</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>of</Keyword>' +
+'          <Keyword>tourist</Keyword>' +
+'          <Keyword>landmarks</Keyword>' +
+'          <Keyword>zoo</Keyword>' +
+'          <Keyword>cities</Keyword>' +
+'          <Keyword>interest</Keyword>' +
+'          <Keyword>attractions</Keyword>' +
+'          <Keyword>points</Keyword>' +
+'          <Keyword>hotel</Keyword>' +
+'          <Keyword>museum</Keyword>' +
+'          <Keyword>picnic</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="14.629095230102537" miny="-47.151258316040014" maxx="39.792314376831065" maxy="-21.988039169311488"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="16.4827766418457" miny="-46.9045600891113" maxx="37.9386329650879" maxy="-22.2347373962402"/>' +
+'        <Style>' +
+'          <Name>za_points</Name>' +
+'          <Title>Default Styler</Title>' +
+'          <Abstract/>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=za:za_points"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>za:za_roads</Name>' +
+'        <Title>South African Roads</Title>' +
+'        <Abstract>This layer describes roads in South Africa.</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>south</Keyword>' +
+'          <Keyword>africa</Keyword>' +
+'          <Keyword>roads</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="16.29388177871706" miny="-36.85438787460323" maxx="33.04232465744013" maxy="-20.10594499588016"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="16.4580821990967" miny="-34.8331336975098" maxx="32.8781242370605" maxy="-22.1271991729736"/>' +
+'        <Style>' +
+'          <Name>za_roads</Name>' +
+'          <Title>Default Styler</Title>' +
+'          <Abstract/>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=za:za_roads"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>za:za_vegetation</Name>' +
+'        <Title>South African Vegetation</Title>' +
+'        <Abstract>This layer describes vegetated areas in South Africa, categorized by biome.</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>south</Keyword>' +
+'          <Keyword>vegetation</Keyword>' +
+'          <Keyword>africa</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="16.30492322921758" miny="-36.855452365875216" maxx="33.05824930191042" maxy="-20.102126293182376"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="16.4691715240479" miny="-34.8336486816406" maxx="32.8940010070801" maxy="-22.123929977417"/>' +
+'        <Style>' +
+'          <Name>za_vegetation</Name>' +
+'          <Title>Default Styler</Title>' +
+'          <Abstract/>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=za:za_vegetation"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>topp:tasmania_cities</Name>' +
+'        <Title>Tasmania cities</Title>' +
+'        <Abstract>Cities in Tasmania (actually, just the capital)</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>cities</Keyword>' +
+'          <Keyword>Tasmania</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="145.1667856" miny="-43.706631400000006" maxx="148.30373440000002" maxy="-40.56968259999999"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="147.2910004483" miny="-42.851001816890005" maxx="147.2910004483" maxy="-42.851001816890005"/>' +
+'        <Style>' +
+'          <Name>capitals</Name>' +
+'          <Title>Capital cities</Title>' +
+'          <Abstract/>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_cities"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>topp:tasmania_roads</Name>' +
+'        <Title>Tasmania roads</Title>' +
+'        <Abstract>Main Tasmania roads</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>Roads</Keyword>' +
+'          <Keyword>Tasmania</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="145.1667856" miny="-43.706631400000006" maxx="148.30373440000002" maxy="-40.56968259999999"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="145.19754" miny="-43.423512" maxx="148.27298000000002" maxy="-40.852802"/>' +
+'        <Style>' +
+'          <Name>simple_roads</Name>' +
+'          <Title>Default Styler for simple road segments</Title>' +
+'          <Abstract>Light red line, 2px wide</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_roads"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>topp:tasmania_state_boundaries</Name>' +
+'        <Title>Tasmania state boundaries</Title>' +
+'        <Abstract>Tasmania state boundaries</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>boundaries</Keyword>' +
+'          <Keyword>tasmania_state_boundaries</Keyword>' +
+'          <Keyword>Tasmania</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="143.74100879660003" miny="-44.026947203400006" maxx="148.57295620340003" maxy="-39.194999796599994"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>' +
+'        <Style>' +
+'          <Name>green</Name>' +
+'          <Title>Green polygon</Title>' +
+'          <Abstract>Green fill with black outline</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_state_boundaries"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>topp:tasmania_water_bodies</Name>' +
+'        <Title>Tasmania water bodies</Title>' +
+'        <Abstract>Tasmania water bodies</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>Lakes</Keyword>' +
+'          <Keyword>Bodies</Keyword>' +
+'          <Keyword>Australia</Keyword>' +
+'          <Keyword>Water</Keyword>' +
+'          <Keyword>Tasmania</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="145.95490063999998" miny="-43.04450786" maxx="147.23641436" maxy="-41.762994139999996"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="145.97161899999998" miny="-43.031944" maxx="147.219696" maxy="-41.775558"/>' +
+'        <Style>' +
+'          <Name>cite_lakes</Name>' +
+'          <Title>Blue lake</Title>' +
+'          <Abstract>A blue fill, solid black outline style</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_water_bodies"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>topp:states</Name>' +
+'        <Title>USA Population</Title>' +
+'        <Abstract>This is some census data on the states.</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>census</Keyword>' +
+'          <Keyword>united</Keyword>' +
+'          <Keyword>boundaries</Keyword>' +
+'          <Keyword>state</Keyword>' +
+'          <Keyword>states</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="-125.30903773" miny="7.705448770000002" maxx="-66.39223326999999" maxy="66.62225323"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="-124.73142200000001" miny="24.955967" maxx="-66.969849" maxy="49.371735"/>' +
+'        <Style>' +
+'          <Name>population</Name>' +
+'          <Title>Population in the United States</Title>' +
+'          <Abstract>A sample filter that filters the United States into three' +
+'        categories of population, drawn in different colors</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>tike:waterways</Name>' +
+'        <Title>Waterways</Title>' +
+'        <Abstract>Waterways in Finland.</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>Finland</Keyword>' +
+'          <Keyword>waterways</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="19.530168895721403" miny="58.860618000030506" maxx="31.6566005897522" maxy="70.9870496940613"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="19.649055480957" miny="59.9357719421387" maxx="31.5377140045166" maxy="69.9118957519531"/>' +
+'        <Style>' +
+'          <Name>line</Name>' +
+'          <Title>1 px blue line</Title>' +
+'          <Abstract>Default line style, 1 pixel wide blue</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tike:waterways"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>tike:railways</Name>' +
+'        <Title>roads_Type</Title>' +
+'        <Abstract>Generated from tike</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>tike</Keyword>' +
+'          <Keyword>roads</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="-297176.16529836657" miny="-1.2694600326676274E7" maxx="3.0016785704606913E7" maxy="1.7619361543229006E7"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="19.5393085479736" miny="-2277.78344726562" maxx="2.971959E7" maxy="4927039.0"/>' +
+'        <Style>' +
+'          <Name>line</Name>' +
+'          <Title>1 px blue line</Title>' +
+'          <Abstract>Default line style, 1 pixel wide blue</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tike:railways"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>tike:roads</Name>' +
+'        <Title>roads_Type</Title>' +
+'        <Abstract>Generated from tike</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>tike</Keyword>' +
+'          <Keyword>roads</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="-297176.16529836657" miny="-1.2694600326676274E7" maxx="3.0016785704606913E7" maxy="1.7619361543229006E7"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="19.5393085479736" miny="-2277.78344726562" maxx="2.971959E7" maxy="4927039.0"/>' +
+'        <Style>' +
+'          <Name>line</Name>' +
+'          <Title>1 px blue line</Title>' +
+'          <Abstract>Default line style, 1 pixel wide blue</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tike:roads"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>og:roads</Name>' +
+'        <Title>roads_Type</Title>' +
+'        <Abstract>Generated from sf_reset</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>roads</Keyword>' +
+'          <Keyword>sf_reset</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:26713</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'PROJCS["NAD27 / UTM zone 13N", ' +
+'  GEOGCS["NAD27", ' +
+'    DATUM["North American Datum 1927", ' +
+'      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], ' +
+'      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], ' +
+'      AUTHORITY["EPSG","6267"]], ' +
+'    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'    UNIT["degree", 0.017453292519943295], ' +
+'    AXIS["Geodetic longitude", EAST], ' +
+'    AXIS["Geodetic latitude", NORTH], ' +
+'    AUTHORITY["EPSG","4267"]], ' +
+'  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], ' +
+'  PARAMETER["central_meridian", -105.0], ' +
+'  PARAMETER["latitude_of_origin", 0.0], ' +
+'  PARAMETER["scale_factor", 0.9996], ' +
+'  PARAMETER["false_easting", 500000.0], ' +
+'  PARAMETER["false_northing", 0.0], ' +
+'  UNIT["m", 1.0], ' +
+'  AXIS["Easting", EAST], ' +
+'  AXIS["Northing", NORTH], ' +
+'  AUTHORITY["EPSG","26713"]]-->' +
+'        <LatLonBoundingBox minx="-103.88042792817339" miny="44.308776913708805" maxx="-103.62014761945467" maxy="44.56905722242751"/>' +
+'        <BoundingBox SRS="EPSG:26713" minx="589434.8125" miny="4914006.0" maxx="609527.25" maxy="4928377.0"/>' +
+'        <Style>' +
+'          <Name>simple_roads</Name>' +
+'          <Title>Default Styler for simple road segments</Title>' +
+'          <Abstract>Light red line, 2px wide</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:roads"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>tike:points</Name>' +
+'        <Title>roads_Type</Title>' +
+'        <Abstract>Generated from tike</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>tike</Keyword>' +
+'          <Keyword>roads</Keyword>' +
+'        </KeywordList>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <LatLonBoundingBox minx="19.73377216339108" miny="59.107116584777835" maxx="31.40053188323972" maxy="70.77387630462647"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="19.8481521606445" miny="59.8213005065918" maxx="31.2861518859863" maxy="70.0596923828125"/>' +
+'        <Style>' +
+'          <Name>line</Name>' +
+'          <Title>1 px blue line</Title>' +
+'          <Abstract>Default line style, 1 pixel wide blue</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tike:points"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>topp:bluemarble</Name>' +
+'        <Title>Blue Marble Imagery</Title>' +
+'        <Abstract>Blue Marble NG global bathymetry and topography data from NASA.  More information about the Blue Marble NG project is available from http://earthobservatory.nasa.gov/Features/BlueMarble .</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>WCS</Keyword>' +
+'          <Keyword>bluemarble</Keyword>' +
+'          <Keyword>bluemarble</Keyword>' +
+'        </KeywordList>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <LatLonBoundingBox minx="-180.00000003333" miny="-89.99999996486703" maxx="179.99999993067" maxy="90.000000033333"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="-180.00000003333" miny="-89.99999996486703" maxx="179.99999993067" maxy="90.000000033333"/>' +
+'        <Style>' +
+'          <Name>raster</Name>' +
+'          <Title>Raster</Title>' +
+'          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:bluemarble"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>nurc:Arc_Sample</Name>' +
+'        <Title>Global annual rainfall</Title>' +
+'        <Abstract>Global annual rainfall in ArcGrid format</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>WCS</Keyword>' +
+'          <Keyword>arcGridSample</Keyword>' +
+'          <Keyword>arcGridSample_Coverage</Keyword>' +
+'        </KeywordList>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <LatLonBoundingBox minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>' +
+'        <Style>' +
+'          <Name>raster</Name>' +
+'          <Title>Raster</Title>' +
+'          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=nurc:Arc_Sample"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>nurc:Img_Sample</Name>' +
+'        <Title>North America sample imagery</Title>' +
+'        <Abstract>A very rough imagery of North America</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>WCS</Keyword>' +
+'          <Keyword>worldImageSample</Keyword>' +
+'          <Keyword>worldImageSample_Coverage</Keyword>' +
+'        </KeywordList>' +
+'        <!--WKT definition of this CRS:' +
+'GEOGCS["WGS 84", ' +
+'  DATUM["World Geodetic System 1984", ' +
+'    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], ' +
+'    AUTHORITY["EPSG","6326"]], ' +
+'  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'  UNIT["degree", 0.017453292519943295], ' +
+'  AXIS["Geodetic longitude", EAST], ' +
+'  AXIS["Geodetic latitude", NORTH], ' +
+'  AUTHORITY["EPSG","4326"]]-->' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <LatLonBoundingBox minx="-130.85168" miny="20.7052" maxx="-62.0054" maxy="54.1141"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="-130.85168" miny="20.7052" maxx="-62.0054" maxy="54.1141"/>' +
+'        <Style>' +
+'          <Name>raster</Name>' +
+'          <Title>Raster</Title>' +
+'          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=nurc:Img_Sample"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="1">' +
+'        <Name>sf:sfdem</Name>' +
+'        <Title>Spearfish DEM</Title>' +
+'        <Abstract>Digital Elevation Model data for Spearfish, South Dakota</Abstract>' +
+'        <KeywordList>' +
+'          <Keyword>WCS</Keyword>' +
+'          <Keyword>sf</Keyword>' +
+'          <Keyword>dem</Keyword>' +
+'          <Keyword>digital</Keyword>' +
+'          <Keyword>elevation</Keyword>' +
+'          <Keyword>model</Keyword>' +
+'        </KeywordList>' +
+'        <!--WKT definition of this CRS:' +
+'PROJCS["NAD27 / UTM zone 13N", ' +
+'  GEOGCS["NAD27", ' +
+'    DATUM["North American Datum 1927", ' +
+'      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], ' +
+'      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], ' +
+'      AUTHORITY["EPSG","6267"]], ' +
+'    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], ' +
+'    UNIT["degree", 0.017453292519943295], ' +
+'    AXIS["Geodetic longitude", EAST], ' +
+'    AXIS["Geodetic latitude", NORTH], ' +
+'    AUTHORITY["EPSG","4267"]], ' +
+'  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], ' +
+'  PARAMETER["central_meridian", -105.0], ' +
+'  PARAMETER["latitude_of_origin", 0.0], ' +
+'  PARAMETER["scale_factor", 0.9996], ' +
+'  PARAMETER["false_easting", 500000.0], ' +
+'  PARAMETER["false_northing", 0.0], ' +
+'  UNIT["m", 1.0], ' +
+'  AXIS["Easting", EAST], ' +
+'  AXIS["Northing", NORTH], ' +
+'  AUTHORITY["EPSG","26713"]]-->' +
+'        <SRS>EPSG:26713</SRS>' +
+'        <LatLonBoundingBox minx="-103.87108701853181" miny="44.370187074132616" maxx="-103.62940739432703" maxy="44.5016011535299"/>' +
+'        <BoundingBox SRS="EPSG:26713" minx="589980.0" miny="4913700.0" maxx="609000.0" maxy="4928010.0"/>' +
+'        <Style>' +
+'          <Name>dem</Name>' +
+'          <Title>Simple DEM style</Title>' +
+'          <Abstract>Classic elevation color progression</Abstract>' +
+'          <LegendURL width="20" height="20">' +
+'            <Format>image/png</Format>' +
+'            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=sf:sfdem"/>' +
+'          </LegendURL>' +
+'        </Style>' +
+'      </Layer>' +
+'      <Layer queryable="0">' +
+'        <Name>tasmania</Name>' +
+'        <Title>tasmania</Title>' +
+'        <Abstract>Layer-Group type layer: tasmania</Abstract>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <LatLonBoundingBox minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>' +
+'      </Layer>' +
+'      <Layer queryable="0">' +
+'        <Name>tiger-ny</Name>' +
+'        <Title>tiger-ny</Title>' +
+'        <Abstract>Layer-Group type layer: tiger-ny</Abstract>' +
+'        <SRS>EPSG:4326</SRS>' +
+'        <LatLonBoundingBox minx="-74.047185" miny="40.679648" maxx="-73.907005" maxy="40.882078"/>' +
+'        <BoundingBox SRS="EPSG:4326" minx="-74.047185" miny="40.679648" maxx="-73.907005" maxy="40.882078"/>' +
+'      </Layer>' +
+'    </Layer>' +
+'  </Capability>' +
+'</WMT_MS_Capabilities>';
+
diff --git a/tests/speed/wmscaps.xml b/tests/speed/wmscaps.xml
new file mode 100644
index 0000000..885f712
--- /dev/null
+++ b/tests/speed/wmscaps.xml
@@ -0,0 +1,4954 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE WMT_MS_Capabilities SYSTEM "http://demo.opengeo.org/geoserver/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd">
+<WMT_MS_Capabilities version="1.1.1" updateSequence="145">
+  <Service>
+    <Name>OGC:WMS</Name>
+    <Title>GeoServer Web Map Service</Title>
+    <Abstract>A compliant implementation of WMS 1.1.1 plus most of the SLD 1.0 extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS</Abstract>
+    <KeywordList>
+      <Keyword>WFS</Keyword>
+      <Keyword>WMS</Keyword>
+      <Keyword>GEOSERVER</Keyword>
+    </KeywordList>
+    <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms"/>
+    <ContactInformation>
+      <ContactPersonPrimary>
+        <ContactPerson>Claudius Ptolomaeus</ContactPerson>
+        <ContactOrganization>The ancient geographes INC</ContactOrganization>
+      </ContactPersonPrimary>
+      <ContactPosition>Chief geographer</ContactPosition>
+      <ContactAddress>
+        <AddressType>Work</AddressType>
+        <Address/>
+        <City>Alexandria</City>
+        <StateOrProvince/>
+        <PostCode/>
+        <Country>Egypt</Country>
+      </ContactAddress>
+      <ContactVoiceTelephone/>
+      <ContactFacsimileTelephone/>
+      <ContactElectronicMailAddress>claudius.ptolomaeus at gmail.com</ContactElectronicMailAddress>
+    </ContactInformation>
+    <Fees>NONE</Fees>
+    <AccessConstraints>NONE</AccessConstraints>
+  </Service>
+  <Capability>
+    <Request>
+      <GetCapabilities>
+        <Format>application/vnd.ogc.wms_xml</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+            <Post>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>
+            </Post>
+          </HTTP>
+        </DCPType>
+      </GetCapabilities>
+      <GetMap>
+        <Format>image/png</Format>
+        <Format>application/atom xml</Format>
+        <Format>application/atom+xml</Format>
+        <Format>application/openlayers</Format>
+        <Format>application/pdf</Format>
+        <Format>application/rss xml</Format>
+        <Format>application/rss+xml</Format>
+        <Format>application/vnd.google-earth.kml</Format>
+        <Format>application/vnd.google-earth.kml xml</Format>
+        <Format>application/vnd.google-earth.kml+xml</Format>
+        <Format>application/vnd.google-earth.kmz</Format>
+        <Format>application/vnd.google-earth.kmz xml</Format>
+        <Format>application/vnd.google-earth.kmz+xml</Format>
+        <Format>atom</Format>
+        <Format>image/geotiff</Format>
+        <Format>image/geotiff8</Format>
+        <Format>image/gif</Format>
+        <Format>image/jpeg</Format>
+        <Format>image/png8</Format>
+        <Format>image/svg</Format>
+        <Format>image/svg xml</Format>
+        <Format>image/svg+xml</Format>
+        <Format>image/tiff</Format>
+        <Format>image/tiff8</Format>
+        <Format>kml</Format>
+        <Format>kmz</Format>
+        <Format>openlayers</Format>
+        <Format>rss</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+          </HTTP>
+        </DCPType>
+      </GetMap>
+      <GetFeatureInfo>
+        <Format>text/plain</Format>
+        <Format>text/html</Format>
+        <Format>application/vnd.ogc.gml</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+            <Post>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>
+            </Post>
+          </HTTP>
+        </DCPType>
+      </GetFeatureInfo>
+      <DescribeLayer>
+        <Format>application/vnd.ogc.wms_xml</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+          </HTTP>
+        </DCPType>
+      </DescribeLayer>
+      <GetLegendGraphic>
+        <Format>image/png</Format>
+        <Format>image/jpeg</Format>
+        <Format>image/gif</Format>
+        <DCPType>
+          <HTTP>
+            <Get>
+              <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms?SERVICE=WMS&"/>
+            </Get>
+          </HTTP>
+        </DCPType>
+      </GetLegendGraphic>
+    </Request>
+    <Exception>
+      <Format>application/vnd.ogc.se_xml</Format>
+    </Exception>
+    <UserDefinedSymbolization SupportSLD="1" UserLayer="1" UserStyle="1" RemoteWFS="1"/>
+    <Layer>
+      <Title>GeoServer Web Map Service</Title>
+      <Abstract>A compliant implementation of WMS 1.1.1 plus most of the SLD 1.0 extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS</Abstract>
+      <!--All supported EPSG projections:-->
+      <SRS>EPSG:WGS84(DD)</SRS>
+      <SRS>EPSG:2000</SRS>
+      <SRS>EPSG:2001</SRS>
+      <SRS>EPSG:2002</SRS>
+      <SRS>EPSG:2003</SRS>
+      <SRS>EPSG:2004</SRS>
+      <SRS>EPSG:2005</SRS>
+      <SRS>EPSG:2006</SRS>
+      <SRS>EPSG:2007</SRS>
+      <SRS>EPSG:2008</SRS>
+      <SRS>EPSG:2009</SRS>
+      <SRS>EPSG:2010</SRS>
+      <SRS>EPSG:2011</SRS>
+      <SRS>EPSG:2012</SRS>
+      <SRS>EPSG:2013</SRS>
+      <SRS>EPSG:2014</SRS>
+      <SRS>EPSG:2015</SRS>
+      <SRS>EPSG:2016</SRS>
+      <SRS>EPSG:2017</SRS>
+      <SRS>EPSG:2018</SRS>
+      <SRS>EPSG:2019</SRS>
+      <SRS>EPSG:2020</SRS>
+      <SRS>EPSG:2021</SRS>
+      <SRS>EPSG:2022</SRS>
+      <SRS>EPSG:2023</SRS>
+      <SRS>EPSG:2024</SRS>
+      <SRS>EPSG:2025</SRS>
+      <SRS>EPSG:2026</SRS>
+      <SRS>EPSG:2027</SRS>
+      <SRS>EPSG:2028</SRS>
+      <SRS>EPSG:2029</SRS>
+      <SRS>EPSG:2030</SRS>
+      <SRS>EPSG:2031</SRS>
+      <SRS>EPSG:2032</SRS>
+      <SRS>EPSG:2033</SRS>
+      <SRS>EPSG:2034</SRS>
+      <SRS>EPSG:2035</SRS>
+      <SRS>EPSG:2036</SRS>
+      <SRS>EPSG:2037</SRS>
+      <SRS>EPSG:2038</SRS>
+      <SRS>EPSG:2039</SRS>
+      <SRS>EPSG:2040</SRS>
+      <SRS>EPSG:2041</SRS>
+      <SRS>EPSG:2042</SRS>
+      <SRS>EPSG:2043</SRS>
+      <SRS>EPSG:2044</SRS>
+      <SRS>EPSG:2045</SRS>
+      <SRS>EPSG:2046</SRS>
+      <SRS>EPSG:2047</SRS>
+      <SRS>EPSG:2048</SRS>
+      <SRS>EPSG:2049</SRS>
+      <SRS>EPSG:2050</SRS>
+      <SRS>EPSG:2051</SRS>
+      <SRS>EPSG:2052</SRS>
+      <SRS>EPSG:2053</SRS>
+      <SRS>EPSG:2054</SRS>
+      <SRS>EPSG:2055</SRS>
+      <SRS>EPSG:2056</SRS>
+      <SRS>EPSG:2057</SRS>
+      <SRS>EPSG:2058</SRS>
+      <SRS>EPSG:2059</SRS>
+      <SRS>EPSG:2060</SRS>
+      <SRS>EPSG:2061</SRS>
+      <SRS>EPSG:2062</SRS>
+      <SRS>EPSG:2063</SRS>
+      <SRS>EPSG:2064</SRS>
+      <SRS>EPSG:2065</SRS>
+      <SRS>EPSG:2066</SRS>
+      <SRS>EPSG:2067</SRS>
+      <SRS>EPSG:2068</SRS>
+      <SRS>EPSG:2069</SRS>
+      <SRS>EPSG:2070</SRS>
+      <SRS>EPSG:2071</SRS>
+      <SRS>EPSG:2072</SRS>
+      <SRS>EPSG:2073</SRS>
+      <SRS>EPSG:2074</SRS>
+      <SRS>EPSG:2075</SRS>
+      <SRS>EPSG:2076</SRS>
+      <SRS>EPSG:2077</SRS>
+      <SRS>EPSG:2078</SRS>
+      <SRS>EPSG:2079</SRS>
+      <SRS>EPSG:2080</SRS>
+      <SRS>EPSG:2081</SRS>
+      <SRS>EPSG:2082</SRS>
+      <SRS>EPSG:2083</SRS>
+      <SRS>EPSG:2084</SRS>
+      <SRS>EPSG:2085</SRS>
+      <SRS>EPSG:2086</SRS>
+      <SRS>EPSG:2087</SRS>
+      <SRS>EPSG:2088</SRS>
+      <SRS>EPSG:2089</SRS>
+      <SRS>EPSG:2090</SRS>
+      <SRS>EPSG:2091</SRS>
+      <SRS>EPSG:2092</SRS>
+      <SRS>EPSG:2093</SRS>
+      <SRS>EPSG:2094</SRS>
+      <SRS>EPSG:2095</SRS>
+      <SRS>EPSG:2096</SRS>
+      <SRS>EPSG:2097</SRS>
+      <SRS>EPSG:2098</SRS>
+      <SRS>EPSG:2099</SRS>
+      <SRS>EPSG:2100</SRS>
+      <SRS>EPSG:2101</SRS>
+      <SRS>EPSG:2102</SRS>
+      <SRS>EPSG:2103</SRS>
+      <SRS>EPSG:2104</SRS>
+      <SRS>EPSG:2105</SRS>
+      <SRS>EPSG:2106</SRS>
+      <SRS>EPSG:2107</SRS>
+      <SRS>EPSG:2108</SRS>
+      <SRS>EPSG:2109</SRS>
+      <SRS>EPSG:2110</SRS>
+      <SRS>EPSG:2111</SRS>
+      <SRS>EPSG:2112</SRS>
+      <SRS>EPSG:2113</SRS>
+      <SRS>EPSG:2114</SRS>
+      <SRS>EPSG:2115</SRS>
+      <SRS>EPSG:2116</SRS>
+      <SRS>EPSG:2117</SRS>
+      <SRS>EPSG:2118</SRS>
+      <SRS>EPSG:2119</SRS>
+      <SRS>EPSG:2120</SRS>
+      <SRS>EPSG:2121</SRS>
+      <SRS>EPSG:2122</SRS>
+      <SRS>EPSG:2123</SRS>
+      <SRS>EPSG:2124</SRS>
+      <SRS>EPSG:2125</SRS>
+      <SRS>EPSG:2126</SRS>
+      <SRS>EPSG:2127</SRS>
+      <SRS>EPSG:2128</SRS>
+      <SRS>EPSG:2129</SRS>
+      <SRS>EPSG:2130</SRS>
+      <SRS>EPSG:2131</SRS>
+      <SRS>EPSG:2132</SRS>
+      <SRS>EPSG:2133</SRS>
+      <SRS>EPSG:2134</SRS>
+      <SRS>EPSG:2135</SRS>
+      <SRS>EPSG:2136</SRS>
+      <SRS>EPSG:2137</SRS>
+      <SRS>EPSG:2138</SRS>
+      <SRS>EPSG:2139</SRS>
+      <SRS>EPSG:2140</SRS>
+      <SRS>EPSG:2141</SRS>
+      <SRS>EPSG:2142</SRS>
+      <SRS>EPSG:2143</SRS>
+      <SRS>EPSG:2144</SRS>
+      <SRS>EPSG:2145</SRS>
+      <SRS>EPSG:2146</SRS>
+      <SRS>EPSG:2147</SRS>
+      <SRS>EPSG:2148</SRS>
+      <SRS>EPSG:2149</SRS>
+      <SRS>EPSG:2150</SRS>
+      <SRS>EPSG:2151</SRS>
+      <SRS>EPSG:2152</SRS>
+      <SRS>EPSG:2153</SRS>
+      <SRS>EPSG:2154</SRS>
+      <SRS>EPSG:2155</SRS>
+      <SRS>EPSG:2156</SRS>
+      <SRS>EPSG:2157</SRS>
+      <SRS>EPSG:2158</SRS>
+      <SRS>EPSG:2159</SRS>
+      <SRS>EPSG:2160</SRS>
+      <SRS>EPSG:2161</SRS>
+      <SRS>EPSG:2162</SRS>
+      <SRS>EPSG:2163</SRS>
+      <SRS>EPSG:2164</SRS>
+      <SRS>EPSG:2165</SRS>
+      <SRS>EPSG:2166</SRS>
+      <SRS>EPSG:2167</SRS>
+      <SRS>EPSG:2168</SRS>
+      <SRS>EPSG:2169</SRS>
+      <SRS>EPSG:2170</SRS>
+      <SRS>EPSG:2171</SRS>
+      <SRS>EPSG:2172</SRS>
+      <SRS>EPSG:2173</SRS>
+      <SRS>EPSG:2174</SRS>
+      <SRS>EPSG:2175</SRS>
+      <SRS>EPSG:2176</SRS>
+      <SRS>EPSG:2177</SRS>
+      <SRS>EPSG:2178</SRS>
+      <SRS>EPSG:2179</SRS>
+      <SRS>EPSG:2180</SRS>
+      <SRS>EPSG:2188</SRS>
+      <SRS>EPSG:2189</SRS>
+      <SRS>EPSG:2190</SRS>
+      <SRS>EPSG:2191</SRS>
+      <SRS>EPSG:2192</SRS>
+      <SRS>EPSG:2193</SRS>
+      <SRS>EPSG:2194</SRS>
+      <SRS>EPSG:2195</SRS>
+      <SRS>EPSG:2196</SRS>
+      <SRS>EPSG:2197</SRS>
+      <SRS>EPSG:2198</SRS>
+      <SRS>EPSG:2199</SRS>
+      <SRS>EPSG:2200</SRS>
+      <SRS>EPSG:2201</SRS>
+      <SRS>EPSG:2202</SRS>
+      <SRS>EPSG:2203</SRS>
+      <SRS>EPSG:2204</SRS>
+      <SRS>EPSG:2205</SRS>
+      <SRS>EPSG:2206</SRS>
+      <SRS>EPSG:2207</SRS>
+      <SRS>EPSG:2208</SRS>
+      <SRS>EPSG:2209</SRS>
+      <SRS>EPSG:2210</SRS>
+      <SRS>EPSG:2211</SRS>
+      <SRS>EPSG:2212</SRS>
+      <SRS>EPSG:2213</SRS>
+      <SRS>EPSG:2214</SRS>
+      <SRS>EPSG:2215</SRS>
+      <SRS>EPSG:2216</SRS>
+      <SRS>EPSG:2217</SRS>
+      <SRS>EPSG:2218</SRS>
+      <SRS>EPSG:2219</SRS>
+      <SRS>EPSG:2220</SRS>
+      <SRS>EPSG:2221</SRS>
+      <SRS>EPSG:2222</SRS>
+      <SRS>EPSG:2223</SRS>
+      <SRS>EPSG:2224</SRS>
+      <SRS>EPSG:2225</SRS>
+      <SRS>EPSG:2226</SRS>
+      <SRS>EPSG:2227</SRS>
+      <SRS>EPSG:2228</SRS>
+      <SRS>EPSG:2229</SRS>
+      <SRS>EPSG:2230</SRS>
+      <SRS>EPSG:2231</SRS>
+      <SRS>EPSG:2232</SRS>
+      <SRS>EPSG:2233</SRS>
+      <SRS>EPSG:2234</SRS>
+      <SRS>EPSG:2235</SRS>
+      <SRS>EPSG:2236</SRS>
+      <SRS>EPSG:2237</SRS>
+      <SRS>EPSG:2238</SRS>
+      <SRS>EPSG:2239</SRS>
+      <SRS>EPSG:2240</SRS>
+      <SRS>EPSG:2241</SRS>
+      <SRS>EPSG:2242</SRS>
+      <SRS>EPSG:2243</SRS>
+      <SRS>EPSG:2244</SRS>
+      <SRS>EPSG:2245</SRS>
+      <SRS>EPSG:2246</SRS>
+      <SRS>EPSG:2247</SRS>
+      <SRS>EPSG:2248</SRS>
+      <SRS>EPSG:2249</SRS>
+      <SRS>EPSG:2250</SRS>
+      <SRS>EPSG:2251</SRS>
+      <SRS>EPSG:2252</SRS>
+      <SRS>EPSG:2253</SRS>
+      <SRS>EPSG:2254</SRS>
+      <SRS>EPSG:2255</SRS>
+      <SRS>EPSG:2256</SRS>
+      <SRS>EPSG:2257</SRS>
+      <SRS>EPSG:2258</SRS>
+      <SRS>EPSG:2259</SRS>
+      <SRS>EPSG:2260</SRS>
+      <SRS>EPSG:2261</SRS>
+      <SRS>EPSG:2262</SRS>
+      <SRS>EPSG:2263</SRS>
+      <SRS>EPSG:2264</SRS>
+      <SRS>EPSG:2265</SRS>
+      <SRS>EPSG:2266</SRS>
+      <SRS>EPSG:2267</SRS>
+      <SRS>EPSG:2268</SRS>
+      <SRS>EPSG:2269</SRS>
+      <SRS>EPSG:2270</SRS>
+      <SRS>EPSG:2271</SRS>
+      <SRS>EPSG:2272</SRS>
+      <SRS>EPSG:2273</SRS>
+      <SRS>EPSG:2274</SRS>
+      <SRS>EPSG:2275</SRS>
+      <SRS>EPSG:2276</SRS>
+      <SRS>EPSG:2277</SRS>
+      <SRS>EPSG:2278</SRS>
+      <SRS>EPSG:2279</SRS>
+      <SRS>EPSG:2280</SRS>
+      <SRS>EPSG:2281</SRS>
+      <SRS>EPSG:2282</SRS>
+      <SRS>EPSG:2283</SRS>
+      <SRS>EPSG:2284</SRS>
+      <SRS>EPSG:2285</SRS>
+      <SRS>EPSG:2286</SRS>
+      <SRS>EPSG:2287</SRS>
+      <SRS>EPSG:2288</SRS>
+      <SRS>EPSG:2289</SRS>
+      <SRS>EPSG:2290</SRS>
+      <SRS>EPSG:2291</SRS>
+      <SRS>EPSG:2292</SRS>
+      <SRS>EPSG:2294</SRS>
+      <SRS>EPSG:2295</SRS>
+      <SRS>EPSG:2296</SRS>
+      <SRS>EPSG:2297</SRS>
+      <SRS>EPSG:2298</SRS>
+      <SRS>EPSG:2299</SRS>
+      <SRS>EPSG:2300</SRS>
+      <SRS>EPSG:2301</SRS>
+      <SRS>EPSG:2302</SRS>
+      <SRS>EPSG:2303</SRS>
+      <SRS>EPSG:2304</SRS>
+      <SRS>EPSG:2305</SRS>
+      <SRS>EPSG:2306</SRS>
+      <SRS>EPSG:2307</SRS>
+      <SRS>EPSG:2308</SRS>
+      <SRS>EPSG:2309</SRS>
+      <SRS>EPSG:2310</SRS>
+      <SRS>EPSG:2311</SRS>
+      <SRS>EPSG:2312</SRS>
+      <SRS>EPSG:2313</SRS>
+      <SRS>EPSG:2314</SRS>
+      <SRS>EPSG:2315</SRS>
+      <SRS>EPSG:2316</SRS>
+      <SRS>EPSG:2317</SRS>
+      <SRS>EPSG:2318</SRS>
+      <SRS>EPSG:2319</SRS>
+      <SRS>EPSG:2320</SRS>
+      <SRS>EPSG:2321</SRS>
+      <SRS>EPSG:2322</SRS>
+      <SRS>EPSG:2323</SRS>
+      <SRS>EPSG:2324</SRS>
+      <SRS>EPSG:2325</SRS>
+      <SRS>EPSG:2326</SRS>
+      <SRS>EPSG:2327</SRS>
+      <SRS>EPSG:2328</SRS>
+      <SRS>EPSG:2329</SRS>
+      <SRS>EPSG:2330</SRS>
+      <SRS>EPSG:2331</SRS>
+      <SRS>EPSG:2332</SRS>
+      <SRS>EPSG:2333</SRS>
+      <SRS>EPSG:2334</SRS>
+      <SRS>EPSG:2335</SRS>
+      <SRS>EPSG:2336</SRS>
+      <SRS>EPSG:2337</SRS>
+      <SRS>EPSG:2338</SRS>
+      <SRS>EPSG:2339</SRS>
+      <SRS>EPSG:2340</SRS>
+      <SRS>EPSG:2341</SRS>
+      <SRS>EPSG:2342</SRS>
+      <SRS>EPSG:2343</SRS>
+      <SRS>EPSG:2344</SRS>
+      <SRS>EPSG:2345</SRS>
+      <SRS>EPSG:2346</SRS>
+      <SRS>EPSG:2347</SRS>
+      <SRS>EPSG:2348</SRS>
+      <SRS>EPSG:2349</SRS>
+      <SRS>EPSG:2350</SRS>
+      <SRS>EPSG:2351</SRS>
+      <SRS>EPSG:2352</SRS>
+      <SRS>EPSG:2353</SRS>
+      <SRS>EPSG:2354</SRS>
+      <SRS>EPSG:2355</SRS>
+      <SRS>EPSG:2356</SRS>
+      <SRS>EPSG:2357</SRS>
+      <SRS>EPSG:2358</SRS>
+      <SRS>EPSG:2359</SRS>
+      <SRS>EPSG:2360</SRS>
+      <SRS>EPSG:2361</SRS>
+      <SRS>EPSG:2362</SRS>
+      <SRS>EPSG:2363</SRS>
+      <SRS>EPSG:2364</SRS>
+      <SRS>EPSG:2365</SRS>
+      <SRS>EPSG:2366</SRS>
+      <SRS>EPSG:2367</SRS>
+      <SRS>EPSG:2368</SRS>
+      <SRS>EPSG:2369</SRS>
+      <SRS>EPSG:2370</SRS>
+      <SRS>EPSG:2371</SRS>
+      <SRS>EPSG:2372</SRS>
+      <SRS>EPSG:2373</SRS>
+      <SRS>EPSG:2374</SRS>
+      <SRS>EPSG:2375</SRS>
+      <SRS>EPSG:2376</SRS>
+      <SRS>EPSG:2377</SRS>
+      <SRS>EPSG:2378</SRS>
+      <SRS>EPSG:2379</SRS>
+      <SRS>EPSG:2380</SRS>
+      <SRS>EPSG:2381</SRS>
+      <SRS>EPSG:2382</SRS>
+      <SRS>EPSG:2383</SRS>
+      <SRS>EPSG:2384</SRS>
+      <SRS>EPSG:2385</SRS>
+      <SRS>EPSG:2386</SRS>
+      <SRS>EPSG:2387</SRS>
+      <SRS>EPSG:2388</SRS>
+      <SRS>EPSG:2389</SRS>
+      <SRS>EPSG:2390</SRS>
+      <SRS>EPSG:2391</SRS>
+      <SRS>EPSG:2392</SRS>
+      <SRS>EPSG:2393</SRS>
+      <SRS>EPSG:2394</SRS>
+      <SRS>EPSG:2395</SRS>
+      <SRS>EPSG:2396</SRS>
+      <SRS>EPSG:2397</SRS>
+      <SRS>EPSG:2398</SRS>
+      <SRS>EPSG:2399</SRS>
+      <SRS>EPSG:2400</SRS>
+      <SRS>EPSG:2401</SRS>
+      <SRS>EPSG:2402</SRS>
+      <SRS>EPSG:2403</SRS>
+      <SRS>EPSG:2404</SRS>
+      <SRS>EPSG:2405</SRS>
+      <SRS>EPSG:2406</SRS>
+      <SRS>EPSG:2407</SRS>
+      <SRS>EPSG:2408</SRS>
+      <SRS>EPSG:2409</SRS>
+      <SRS>EPSG:2410</SRS>
+      <SRS>EPSG:2411</SRS>
+      <SRS>EPSG:2412</SRS>
+      <SRS>EPSG:2413</SRS>
+      <SRS>EPSG:2414</SRS>
+      <SRS>EPSG:2415</SRS>
+      <SRS>EPSG:2416</SRS>
+      <SRS>EPSG:2417</SRS>
+      <SRS>EPSG:2418</SRS>
+      <SRS>EPSG:2419</SRS>
+      <SRS>EPSG:2420</SRS>
+      <SRS>EPSG:2421</SRS>
+      <SRS>EPSG:2422</SRS>
+      <SRS>EPSG:2423</SRS>
+      <SRS>EPSG:2424</SRS>
+      <SRS>EPSG:2425</SRS>
+      <SRS>EPSG:2426</SRS>
+      <SRS>EPSG:2427</SRS>
+      <SRS>EPSG:2428</SRS>
+      <SRS>EPSG:2429</SRS>
+      <SRS>EPSG:2430</SRS>
+      <SRS>EPSG:2431</SRS>
+      <SRS>EPSG:2432</SRS>
+      <SRS>EPSG:2433</SRS>
+      <SRS>EPSG:2434</SRS>
+      <SRS>EPSG:2435</SRS>
+      <SRS>EPSG:2436</SRS>
+      <SRS>EPSG:2437</SRS>
+      <SRS>EPSG:2438</SRS>
+      <SRS>EPSG:2439</SRS>
+      <SRS>EPSG:2440</SRS>
+      <SRS>EPSG:2441</SRS>
+      <SRS>EPSG:2442</SRS>
+      <SRS>EPSG:2443</SRS>
+      <SRS>EPSG:2444</SRS>
+      <SRS>EPSG:2445</SRS>
+      <SRS>EPSG:2446</SRS>
+      <SRS>EPSG:2447</SRS>
+      <SRS>EPSG:2448</SRS>
+      <SRS>EPSG:2449</SRS>
+      <SRS>EPSG:2450</SRS>
+      <SRS>EPSG:2451</SRS>
+      <SRS>EPSG:2452</SRS>
+      <SRS>EPSG:2453</SRS>
+      <SRS>EPSG:2454</SRS>
+      <SRS>EPSG:2455</SRS>
+      <SRS>EPSG:2456</SRS>
+      <SRS>EPSG:2457</SRS>
+      <SRS>EPSG:2458</SRS>
+      <SRS>EPSG:2459</SRS>
+      <SRS>EPSG:2460</SRS>
+      <SRS>EPSG:2461</SRS>
+      <SRS>EPSG:2462</SRS>
+      <SRS>EPSG:2463</SRS>
+      <SRS>EPSG:2464</SRS>
+      <SRS>EPSG:2465</SRS>
+      <SRS>EPSG:2466</SRS>
+      <SRS>EPSG:2467</SRS>
+      <SRS>EPSG:2468</SRS>
+      <SRS>EPSG:2469</SRS>
+      <SRS>EPSG:2470</SRS>
+      <SRS>EPSG:2471</SRS>
+      <SRS>EPSG:2472</SRS>
+      <SRS>EPSG:2473</SRS>
+      <SRS>EPSG:2474</SRS>
+      <SRS>EPSG:2475</SRS>
+      <SRS>EPSG:2476</SRS>
+      <SRS>EPSG:2477</SRS>
+      <SRS>EPSG:2478</SRS>
+      <SRS>EPSG:2479</SRS>
+      <SRS>EPSG:2480</SRS>
+      <SRS>EPSG:2481</SRS>
+      <SRS>EPSG:2482</SRS>
+      <SRS>EPSG:2483</SRS>
+      <SRS>EPSG:2484</SRS>
+      <SRS>EPSG:2485</SRS>
+      <SRS>EPSG:2486</SRS>
+      <SRS>EPSG:2487</SRS>
+      <SRS>EPSG:2488</SRS>
+      <SRS>EPSG:2489</SRS>
+      <SRS>EPSG:2490</SRS>
+      <SRS>EPSG:2491</SRS>
+      <SRS>EPSG:2492</SRS>
+      <SRS>EPSG:2493</SRS>
+      <SRS>EPSG:2494</SRS>
+      <SRS>EPSG:2495</SRS>
+      <SRS>EPSG:2496</SRS>
+      <SRS>EPSG:2497</SRS>
+      <SRS>EPSG:2498</SRS>
+      <SRS>EPSG:2499</SRS>
+      <SRS>EPSG:2500</SRS>
+      <SRS>EPSG:2501</SRS>
+      <SRS>EPSG:2502</SRS>
+      <SRS>EPSG:2503</SRS>
+      <SRS>EPSG:2504</SRS>
+      <SRS>EPSG:2505</SRS>
+      <SRS>EPSG:2506</SRS>
+      <SRS>EPSG:2507</SRS>
+      <SRS>EPSG:2508</SRS>
+      <SRS>EPSG:2509</SRS>
+      <SRS>EPSG:2510</SRS>
+      <SRS>EPSG:2511</SRS>
+      <SRS>EPSG:2512</SRS>
+      <SRS>EPSG:2513</SRS>
+      <SRS>EPSG:2514</SRS>
+      <SRS>EPSG:2515</SRS>
+      <SRS>EPSG:2516</SRS>
+      <SRS>EPSG:2517</SRS>
+      <SRS>EPSG:2518</SRS>
+      <SRS>EPSG:2519</SRS>
+      <SRS>EPSG:2520</SRS>
+      <SRS>EPSG:2521</SRS>
+      <SRS>EPSG:2522</SRS>
+      <SRS>EPSG:2523</SRS>
+      <SRS>EPSG:2524</SRS>
+      <SRS>EPSG:2525</SRS>
+      <SRS>EPSG:2526</SRS>
+      <SRS>EPSG:2527</SRS>
+      <SRS>EPSG:2528</SRS>
+      <SRS>EPSG:2529</SRS>
+      <SRS>EPSG:2530</SRS>
+      <SRS>EPSG:2531</SRS>
+      <SRS>EPSG:2532</SRS>
+      <SRS>EPSG:2533</SRS>
+      <SRS>EPSG:2534</SRS>
+      <SRS>EPSG:2535</SRS>
+      <SRS>EPSG:2536</SRS>
+      <SRS>EPSG:2537</SRS>
+      <SRS>EPSG:2538</SRS>
+      <SRS>EPSG:2539</SRS>
+      <SRS>EPSG:2540</SRS>
+      <SRS>EPSG:2541</SRS>
+      <SRS>EPSG:2542</SRS>
+      <SRS>EPSG:2543</SRS>
+      <SRS>EPSG:2544</SRS>
+      <SRS>EPSG:2545</SRS>
+      <SRS>EPSG:2546</SRS>
+      <SRS>EPSG:2547</SRS>
+      <SRS>EPSG:2548</SRS>
+      <SRS>EPSG:2549</SRS>
+      <SRS>EPSG:2550</SRS>
+      <SRS>EPSG:2551</SRS>
+      <SRS>EPSG:2552</SRS>
+      <SRS>EPSG:2553</SRS>
+      <SRS>EPSG:2554</SRS>
+      <SRS>EPSG:2555</SRS>
+      <SRS>EPSG:2556</SRS>
+      <SRS>EPSG:2557</SRS>
+      <SRS>EPSG:2558</SRS>
+      <SRS>EPSG:2559</SRS>
+      <SRS>EPSG:2560</SRS>
+      <SRS>EPSG:2561</SRS>
+      <SRS>EPSG:2562</SRS>
+      <SRS>EPSG:2563</SRS>
+      <SRS>EPSG:2564</SRS>
+      <SRS>EPSG:2565</SRS>
+      <SRS>EPSG:2566</SRS>
+      <SRS>EPSG:2567</SRS>
+      <SRS>EPSG:2568</SRS>
+      <SRS>EPSG:2569</SRS>
+      <SRS>EPSG:2570</SRS>
+      <SRS>EPSG:2571</SRS>
+      <SRS>EPSG:2572</SRS>
+      <SRS>EPSG:2573</SRS>
+      <SRS>EPSG:2574</SRS>
+      <SRS>EPSG:2575</SRS>
+      <SRS>EPSG:2576</SRS>
+      <SRS>EPSG:2577</SRS>
+      <SRS>EPSG:2578</SRS>
+      <SRS>EPSG:2579</SRS>
+      <SRS>EPSG:2580</SRS>
+      <SRS>EPSG:2581</SRS>
+      <SRS>EPSG:2582</SRS>
+      <SRS>EPSG:2583</SRS>
+      <SRS>EPSG:2584</SRS>
+      <SRS>EPSG:2585</SRS>
+      <SRS>EPSG:2586</SRS>
+      <SRS>EPSG:2587</SRS>
+      <SRS>EPSG:2588</SRS>
+      <SRS>EPSG:2589</SRS>
+      <SRS>EPSG:2590</SRS>
+      <SRS>EPSG:2591</SRS>
+      <SRS>EPSG:2592</SRS>
+      <SRS>EPSG:2593</SRS>
+      <SRS>EPSG:2594</SRS>
+      <SRS>EPSG:2595</SRS>
+      <SRS>EPSG:2596</SRS>
+      <SRS>EPSG:2597</SRS>
+      <SRS>EPSG:2598</SRS>
+      <SRS>EPSG:2599</SRS>
+      <SRS>EPSG:2600</SRS>
+      <SRS>EPSG:2601</SRS>
+      <SRS>EPSG:2602</SRS>
+      <SRS>EPSG:2603</SRS>
+      <SRS>EPSG:2604</SRS>
+      <SRS>EPSG:2605</SRS>
+      <SRS>EPSG:2606</SRS>
+      <SRS>EPSG:2607</SRS>
+      <SRS>EPSG:2608</SRS>
+      <SRS>EPSG:2609</SRS>
+      <SRS>EPSG:2610</SRS>
+      <SRS>EPSG:2611</SRS>
+      <SRS>EPSG:2612</SRS>
+      <SRS>EPSG:2613</SRS>
+      <SRS>EPSG:2614</SRS>
+      <SRS>EPSG:2615</SRS>
+      <SRS>EPSG:2616</SRS>
+      <SRS>EPSG:2617</SRS>
+      <SRS>EPSG:2618</SRS>
+      <SRS>EPSG:2619</SRS>
+      <SRS>EPSG:2620</SRS>
+      <SRS>EPSG:2621</SRS>
+      <SRS>EPSG:2622</SRS>
+      <SRS>EPSG:2623</SRS>
+      <SRS>EPSG:2624</SRS>
+      <SRS>EPSG:2625</SRS>
+      <SRS>EPSG:2626</SRS>
+      <SRS>EPSG:2627</SRS>
+      <SRS>EPSG:2628</SRS>
+      <SRS>EPSG:2629</SRS>
+      <SRS>EPSG:2630</SRS>
+      <SRS>EPSG:2631</SRS>
+      <SRS>EPSG:2632</SRS>
+      <SRS>EPSG:2633</SRS>
+      <SRS>EPSG:2634</SRS>
+      <SRS>EPSG:2635</SRS>
+      <SRS>EPSG:2636</SRS>
+      <SRS>EPSG:2637</SRS>
+      <SRS>EPSG:2638</SRS>
+      <SRS>EPSG:2639</SRS>
+      <SRS>EPSG:2640</SRS>
+      <SRS>EPSG:2641</SRS>
+      <SRS>EPSG:2642</SRS>
+      <SRS>EPSG:2643</SRS>
+      <SRS>EPSG:2644</SRS>
+      <SRS>EPSG:2645</SRS>
+      <SRS>EPSG:2646</SRS>
+      <SRS>EPSG:2647</SRS>
+      <SRS>EPSG:2648</SRS>
+      <SRS>EPSG:2649</SRS>
+      <SRS>EPSG:2650</SRS>
+      <SRS>EPSG:2651</SRS>
+      <SRS>EPSG:2652</SRS>
+      <SRS>EPSG:2653</SRS>
+      <SRS>EPSG:2654</SRS>
+      <SRS>EPSG:2655</SRS>
+      <SRS>EPSG:2656</SRS>
+      <SRS>EPSG:2657</SRS>
+      <SRS>EPSG:2658</SRS>
+      <SRS>EPSG:2659</SRS>
+      <SRS>EPSG:2660</SRS>
+      <SRS>EPSG:2661</SRS>
+      <SRS>EPSG:2662</SRS>
+      <SRS>EPSG:2663</SRS>
+      <SRS>EPSG:2664</SRS>
+      <SRS>EPSG:2665</SRS>
+      <SRS>EPSG:2666</SRS>
+      <SRS>EPSG:2667</SRS>
+      <SRS>EPSG:2668</SRS>
+      <SRS>EPSG:2669</SRS>
+      <SRS>EPSG:2670</SRS>
+      <SRS>EPSG:2671</SRS>
+      <SRS>EPSG:2672</SRS>
+      <SRS>EPSG:2673</SRS>
+      <SRS>EPSG:2674</SRS>
+      <SRS>EPSG:2675</SRS>
+      <SRS>EPSG:2676</SRS>
+      <SRS>EPSG:2677</SRS>
+      <SRS>EPSG:2678</SRS>
+      <SRS>EPSG:2679</SRS>
+      <SRS>EPSG:2680</SRS>
+      <SRS>EPSG:2681</SRS>
+      <SRS>EPSG:2682</SRS>
+      <SRS>EPSG:2683</SRS>
+      <SRS>EPSG:2684</SRS>
+      <SRS>EPSG:2685</SRS>
+      <SRS>EPSG:2686</SRS>
+      <SRS>EPSG:2687</SRS>
+      <SRS>EPSG:2688</SRS>
+      <SRS>EPSG:2689</SRS>
+      <SRS>EPSG:2690</SRS>
+      <SRS>EPSG:2691</SRS>
+      <SRS>EPSG:2692</SRS>
+      <SRS>EPSG:2693</SRS>
+      <SRS>EPSG:2694</SRS>
+      <SRS>EPSG:2695</SRS>
+      <SRS>EPSG:2696</SRS>
+      <SRS>EPSG:2697</SRS>
+      <SRS>EPSG:2698</SRS>
+      <SRS>EPSG:2699</SRS>
+      <SRS>EPSG:2700</SRS>
+      <SRS>EPSG:2701</SRS>
+      <SRS>EPSG:2702</SRS>
+      <SRS>EPSG:2703</SRS>
+      <SRS>EPSG:2704</SRS>
+      <SRS>EPSG:2705</SRS>
+      <SRS>EPSG:2706</SRS>
+      <SRS>EPSG:2707</SRS>
+      <SRS>EPSG:2708</SRS>
+      <SRS>EPSG:2709</SRS>
+      <SRS>EPSG:2710</SRS>
+      <SRS>EPSG:2711</SRS>
+      <SRS>EPSG:2712</SRS>
+      <SRS>EPSG:2713</SRS>
+      <SRS>EPSG:2714</SRS>
+      <SRS>EPSG:2715</SRS>
+      <SRS>EPSG:2716</SRS>
+      <SRS>EPSG:2717</SRS>
+      <SRS>EPSG:2718</SRS>
+      <SRS>EPSG:2719</SRS>
+      <SRS>EPSG:2720</SRS>
+      <SRS>EPSG:2721</SRS>
+      <SRS>EPSG:2722</SRS>
+      <SRS>EPSG:2723</SRS>
+      <SRS>EPSG:2724</SRS>
+      <SRS>EPSG:2725</SRS>
+      <SRS>EPSG:2726</SRS>
+      <SRS>EPSG:2727</SRS>
+      <SRS>EPSG:2728</SRS>
+      <SRS>EPSG:2729</SRS>
+      <SRS>EPSG:2730</SRS>
+      <SRS>EPSG:2731</SRS>
+      <SRS>EPSG:2732</SRS>
+      <SRS>EPSG:2733</SRS>
+      <SRS>EPSG:2734</SRS>
+      <SRS>EPSG:2735</SRS>
+      <SRS>EPSG:2736</SRS>
+      <SRS>EPSG:2737</SRS>
+      <SRS>EPSG:2738</SRS>
+      <SRS>EPSG:2739</SRS>
+      <SRS>EPSG:2740</SRS>
+      <SRS>EPSG:2741</SRS>
+      <SRS>EPSG:2742</SRS>
+      <SRS>EPSG:2743</SRS>
+      <SRS>EPSG:2744</SRS>
+      <SRS>EPSG:2745</SRS>
+      <SRS>EPSG:2746</SRS>
+      <SRS>EPSG:2747</SRS>
+      <SRS>EPSG:2748</SRS>
+      <SRS>EPSG:2749</SRS>
+      <SRS>EPSG:2750</SRS>
+      <SRS>EPSG:2751</SRS>
+      <SRS>EPSG:2752</SRS>
+      <SRS>EPSG:2753</SRS>
+      <SRS>EPSG:2754</SRS>
+      <SRS>EPSG:2755</SRS>
+      <SRS>EPSG:2756</SRS>
+      <SRS>EPSG:2757</SRS>
+      <SRS>EPSG:2758</SRS>
+      <SRS>EPSG:2759</SRS>
+      <SRS>EPSG:2760</SRS>
+      <SRS>EPSG:2761</SRS>
+      <SRS>EPSG:2762</SRS>
+      <SRS>EPSG:2763</SRS>
+      <SRS>EPSG:2764</SRS>
+      <SRS>EPSG:2765</SRS>
+      <SRS>EPSG:2766</SRS>
+      <SRS>EPSG:2767</SRS>
+      <SRS>EPSG:2768</SRS>
+      <SRS>EPSG:2769</SRS>
+      <SRS>EPSG:2770</SRS>
+      <SRS>EPSG:2771</SRS>
+      <SRS>EPSG:2772</SRS>
+      <SRS>EPSG:2773</SRS>
+      <SRS>EPSG:2774</SRS>
+      <SRS>EPSG:2775</SRS>
+      <SRS>EPSG:2776</SRS>
+      <SRS>EPSG:2777</SRS>
+      <SRS>EPSG:2778</SRS>
+      <SRS>EPSG:2779</SRS>
+      <SRS>EPSG:2780</SRS>
+      <SRS>EPSG:2781</SRS>
+      <SRS>EPSG:2782</SRS>
+      <SRS>EPSG:2783</SRS>
+      <SRS>EPSG:2784</SRS>
+      <SRS>EPSG:2785</SRS>
+      <SRS>EPSG:2786</SRS>
+      <SRS>EPSG:2787</SRS>
+      <SRS>EPSG:2788</SRS>
+      <SRS>EPSG:2789</SRS>
+      <SRS>EPSG:2790</SRS>
+      <SRS>EPSG:2791</SRS>
+      <SRS>EPSG:2792</SRS>
+      <SRS>EPSG:2793</SRS>
+      <SRS>EPSG:2794</SRS>
+      <SRS>EPSG:2795</SRS>
+      <SRS>EPSG:2796</SRS>
+      <SRS>EPSG:2797</SRS>
+      <SRS>EPSG:2798</SRS>
+      <SRS>EPSG:2799</SRS>
+      <SRS>EPSG:2800</SRS>
+      <SRS>EPSG:2801</SRS>
+      <SRS>EPSG:2802</SRS>
+      <SRS>EPSG:2803</SRS>
+      <SRS>EPSG:2804</SRS>
+      <SRS>EPSG:2805</SRS>
+      <SRS>EPSG:2806</SRS>
+      <SRS>EPSG:2807</SRS>
+      <SRS>EPSG:2808</SRS>
+      <SRS>EPSG:2809</SRS>
+      <SRS>EPSG:2810</SRS>
+      <SRS>EPSG:2811</SRS>
+      <SRS>EPSG:2812</SRS>
+      <SRS>EPSG:2813</SRS>
+      <SRS>EPSG:2814</SRS>
+      <SRS>EPSG:2815</SRS>
+      <SRS>EPSG:2816</SRS>
+      <SRS>EPSG:2817</SRS>
+      <SRS>EPSG:2818</SRS>
+      <SRS>EPSG:2819</SRS>
+      <SRS>EPSG:2820</SRS>
+      <SRS>EPSG:2821</SRS>
+      <SRS>EPSG:2822</SRS>
+      <SRS>EPSG:2823</SRS>
+      <SRS>EPSG:2824</SRS>
+      <SRS>EPSG:2825</SRS>
+      <SRS>EPSG:2826</SRS>
+      <SRS>EPSG:2827</SRS>
+      <SRS>EPSG:2828</SRS>
+      <SRS>EPSG:2829</SRS>
+      <SRS>EPSG:2830</SRS>
+      <SRS>EPSG:2831</SRS>
+      <SRS>EPSG:2832</SRS>
+      <SRS>EPSG:2833</SRS>
+      <SRS>EPSG:2834</SRS>
+      <SRS>EPSG:2835</SRS>
+      <SRS>EPSG:2836</SRS>
+      <SRS>EPSG:2837</SRS>
+      <SRS>EPSG:2838</SRS>
+      <SRS>EPSG:2839</SRS>
+      <SRS>EPSG:2840</SRS>
+      <SRS>EPSG:2841</SRS>
+      <SRS>EPSG:2842</SRS>
+      <SRS>EPSG:2843</SRS>
+      <SRS>EPSG:2844</SRS>
+      <SRS>EPSG:2845</SRS>
+      <SRS>EPSG:2846</SRS>
+      <SRS>EPSG:2847</SRS>
+      <SRS>EPSG:2848</SRS>
+      <SRS>EPSG:2849</SRS>
+      <SRS>EPSG:2850</SRS>
+      <SRS>EPSG:2851</SRS>
+      <SRS>EPSG:2852</SRS>
+      <SRS>EPSG:2853</SRS>
+      <SRS>EPSG:2854</SRS>
+      <SRS>EPSG:2855</SRS>
+      <SRS>EPSG:2856</SRS>
+      <SRS>EPSG:2857</SRS>
+      <SRS>EPSG:2858</SRS>
+      <SRS>EPSG:2859</SRS>
+      <SRS>EPSG:2860</SRS>
+      <SRS>EPSG:2861</SRS>
+      <SRS>EPSG:2862</SRS>
+      <SRS>EPSG:2863</SRS>
+      <SRS>EPSG:2864</SRS>
+      <SRS>EPSG:2865</SRS>
+      <SRS>EPSG:2866</SRS>
+      <SRS>EPSG:2867</SRS>
+      <SRS>EPSG:2868</SRS>
+      <SRS>EPSG:2869</SRS>
+      <SRS>EPSG:2870</SRS>
+      <SRS>EPSG:2871</SRS>
+      <SRS>EPSG:2872</SRS>
+      <SRS>EPSG:2873</SRS>
+      <SRS>EPSG:2874</SRS>
+      <SRS>EPSG:2875</SRS>
+      <SRS>EPSG:2876</SRS>
+      <SRS>EPSG:2877</SRS>
+      <SRS>EPSG:2878</SRS>
+      <SRS>EPSG:2879</SRS>
+      <SRS>EPSG:2880</SRS>
+      <SRS>EPSG:2881</SRS>
+      <SRS>EPSG:2882</SRS>
+      <SRS>EPSG:2883</SRS>
+      <SRS>EPSG:2884</SRS>
+      <SRS>EPSG:2885</SRS>
+      <SRS>EPSG:2886</SRS>
+      <SRS>EPSG:2887</SRS>
+      <SRS>EPSG:2888</SRS>
+      <SRS>EPSG:2889</SRS>
+      <SRS>EPSG:2890</SRS>
+      <SRS>EPSG:2891</SRS>
+      <SRS>EPSG:2892</SRS>
+      <SRS>EPSG:2893</SRS>
+      <SRS>EPSG:2894</SRS>
+      <SRS>EPSG:2895</SRS>
+      <SRS>EPSG:2896</SRS>
+      <SRS>EPSG:2897</SRS>
+      <SRS>EPSG:2898</SRS>
+      <SRS>EPSG:2899</SRS>
+      <SRS>EPSG:2900</SRS>
+      <SRS>EPSG:2901</SRS>
+      <SRS>EPSG:2902</SRS>
+      <SRS>EPSG:2903</SRS>
+      <SRS>EPSG:2904</SRS>
+      <SRS>EPSG:2905</SRS>
+      <SRS>EPSG:2906</SRS>
+      <SRS>EPSG:2907</SRS>
+      <SRS>EPSG:2908</SRS>
+      <SRS>EPSG:2909</SRS>
+      <SRS>EPSG:2910</SRS>
+      <SRS>EPSG:2911</SRS>
+      <SRS>EPSG:2912</SRS>
+      <SRS>EPSG:2913</SRS>
+      <SRS>EPSG:2914</SRS>
+      <SRS>EPSG:2915</SRS>
+      <SRS>EPSG:2916</SRS>
+      <SRS>EPSG:2917</SRS>
+      <SRS>EPSG:2918</SRS>
+      <SRS>EPSG:2919</SRS>
+      <SRS>EPSG:2920</SRS>
+      <SRS>EPSG:2921</SRS>
+      <SRS>EPSG:2922</SRS>
+      <SRS>EPSG:2923</SRS>
+      <SRS>EPSG:2924</SRS>
+      <SRS>EPSG:2925</SRS>
+      <SRS>EPSG:2926</SRS>
+      <SRS>EPSG:2927</SRS>
+      <SRS>EPSG:2928</SRS>
+      <SRS>EPSG:2929</SRS>
+      <SRS>EPSG:2930</SRS>
+      <SRS>EPSG:2931</SRS>
+      <SRS>EPSG:2932</SRS>
+      <SRS>EPSG:2933</SRS>
+      <SRS>EPSG:2934</SRS>
+      <SRS>EPSG:2935</SRS>
+      <SRS>EPSG:2936</SRS>
+      <SRS>EPSG:2937</SRS>
+      <SRS>EPSG:2938</SRS>
+      <SRS>EPSG:2939</SRS>
+      <SRS>EPSG:2940</SRS>
+      <SRS>EPSG:2941</SRS>
+      <SRS>EPSG:2942</SRS>
+      <SRS>EPSG:2943</SRS>
+      <SRS>EPSG:2944</SRS>
+      <SRS>EPSG:2945</SRS>
+      <SRS>EPSG:2946</SRS>
+      <SRS>EPSG:2947</SRS>
+      <SRS>EPSG:2948</SRS>
+      <SRS>EPSG:2949</SRS>
+      <SRS>EPSG:2950</SRS>
+      <SRS>EPSG:2951</SRS>
+      <SRS>EPSG:2952</SRS>
+      <SRS>EPSG:2953</SRS>
+      <SRS>EPSG:2954</SRS>
+      <SRS>EPSG:2955</SRS>
+      <SRS>EPSG:2956</SRS>
+      <SRS>EPSG:2957</SRS>
+      <SRS>EPSG:2958</SRS>
+      <SRS>EPSG:2959</SRS>
+      <SRS>EPSG:2960</SRS>
+      <SRS>EPSG:2961</SRS>
+      <SRS>EPSG:2962</SRS>
+      <SRS>EPSG:2963</SRS>
+      <SRS>EPSG:2964</SRS>
+      <SRS>EPSG:2965</SRS>
+      <SRS>EPSG:2966</SRS>
+      <SRS>EPSG:2967</SRS>
+      <SRS>EPSG:2968</SRS>
+      <SRS>EPSG:2969</SRS>
+      <SRS>EPSG:2970</SRS>
+      <SRS>EPSG:2971</SRS>
+      <SRS>EPSG:2972</SRS>
+      <SRS>EPSG:2973</SRS>
+      <SRS>EPSG:2975</SRS>
+      <SRS>EPSG:2976</SRS>
+      <SRS>EPSG:2977</SRS>
+      <SRS>EPSG:2978</SRS>
+      <SRS>EPSG:2979</SRS>
+      <SRS>EPSG:2980</SRS>
+      <SRS>EPSG:2981</SRS>
+      <SRS>EPSG:2982</SRS>
+      <SRS>EPSG:2983</SRS>
+      <SRS>EPSG:2984</SRS>
+      <SRS>EPSG:2985</SRS>
+      <SRS>EPSG:2986</SRS>
+      <SRS>EPSG:2987</SRS>
+      <SRS>EPSG:2988</SRS>
+      <SRS>EPSG:2989</SRS>
+      <SRS>EPSG:2990</SRS>
+      <SRS>EPSG:2991</SRS>
+      <SRS>EPSG:2992</SRS>
+      <SRS>EPSG:2993</SRS>
+      <SRS>EPSG:2994</SRS>
+      <SRS>EPSG:2995</SRS>
+      <SRS>EPSG:2996</SRS>
+      <SRS>EPSG:2997</SRS>
+      <SRS>EPSG:2998</SRS>
+      <SRS>EPSG:2999</SRS>
+      <SRS>EPSG:3000</SRS>
+      <SRS>EPSG:3001</SRS>
+      <SRS>EPSG:3002</SRS>
+      <SRS>EPSG:3003</SRS>
+      <SRS>EPSG:3004</SRS>
+      <SRS>EPSG:3005</SRS>
+      <SRS>EPSG:3006</SRS>
+      <SRS>EPSG:3007</SRS>
+      <SRS>EPSG:3008</SRS>
+      <SRS>EPSG:3009</SRS>
+      <SRS>EPSG:3010</SRS>
+      <SRS>EPSG:3011</SRS>
+      <SRS>EPSG:3012</SRS>
+      <SRS>EPSG:3013</SRS>
+      <SRS>EPSG:3014</SRS>
+      <SRS>EPSG:3015</SRS>
+      <SRS>EPSG:3016</SRS>
+      <SRS>EPSG:3017</SRS>
+      <SRS>EPSG:3018</SRS>
+      <SRS>EPSG:3019</SRS>
+      <SRS>EPSG:3020</SRS>
+      <SRS>EPSG:3021</SRS>
+      <SRS>EPSG:3022</SRS>
+      <SRS>EPSG:3023</SRS>
+      <SRS>EPSG:3024</SRS>
+      <SRS>EPSG:3025</SRS>
+      <SRS>EPSG:3026</SRS>
+      <SRS>EPSG:3027</SRS>
+      <SRS>EPSG:3028</SRS>
+      <SRS>EPSG:3029</SRS>
+      <SRS>EPSG:3030</SRS>
+      <SRS>EPSG:3031</SRS>
+      <SRS>EPSG:3032</SRS>
+      <SRS>EPSG:3033</SRS>
+      <SRS>EPSG:3034</SRS>
+      <SRS>EPSG:3035</SRS>
+      <SRS>EPSG:3036</SRS>
+      <SRS>EPSG:3037</SRS>
+      <SRS>EPSG:3038</SRS>
+      <SRS>EPSG:3039</SRS>
+      <SRS>EPSG:3040</SRS>
+      <SRS>EPSG:3041</SRS>
+      <SRS>EPSG:3042</SRS>
+      <SRS>EPSG:3043</SRS>
+      <SRS>EPSG:3044</SRS>
+      <SRS>EPSG:3045</SRS>
+      <SRS>EPSG:3046</SRS>
+      <SRS>EPSG:3047</SRS>
+      <SRS>EPSG:3048</SRS>
+      <SRS>EPSG:3049</SRS>
+      <SRS>EPSG:3050</SRS>
+      <SRS>EPSG:3051</SRS>
+      <SRS>EPSG:3052</SRS>
+      <SRS>EPSG:3053</SRS>
+      <SRS>EPSG:3054</SRS>
+      <SRS>EPSG:3055</SRS>
+      <SRS>EPSG:3056</SRS>
+      <SRS>EPSG:3057</SRS>
+      <SRS>EPSG:3058</SRS>
+      <SRS>EPSG:3059</SRS>
+      <SRS>EPSG:3060</SRS>
+      <SRS>EPSG:3061</SRS>
+      <SRS>EPSG:3062</SRS>
+      <SRS>EPSG:3063</SRS>
+      <SRS>EPSG:3064</SRS>
+      <SRS>EPSG:3065</SRS>
+      <SRS>EPSG:3066</SRS>
+      <SRS>EPSG:3067</SRS>
+      <SRS>EPSG:3068</SRS>
+      <SRS>EPSG:3069</SRS>
+      <SRS>EPSG:3070</SRS>
+      <SRS>EPSG:3071</SRS>
+      <SRS>EPSG:3072</SRS>
+      <SRS>EPSG:3073</SRS>
+      <SRS>EPSG:3074</SRS>
+      <SRS>EPSG:3075</SRS>
+      <SRS>EPSG:3076</SRS>
+      <SRS>EPSG:3077</SRS>
+      <SRS>EPSG:3078</SRS>
+      <SRS>EPSG:3079</SRS>
+      <SRS>EPSG:3080</SRS>
+      <SRS>EPSG:3081</SRS>
+      <SRS>EPSG:3082</SRS>
+      <SRS>EPSG:3083</SRS>
+      <SRS>EPSG:3084</SRS>
+      <SRS>EPSG:3085</SRS>
+      <SRS>EPSG:3086</SRS>
+      <SRS>EPSG:3087</SRS>
+      <SRS>EPSG:3088</SRS>
+      <SRS>EPSG:3089</SRS>
+      <SRS>EPSG:3090</SRS>
+      <SRS>EPSG:3091</SRS>
+      <SRS>EPSG:3092</SRS>
+      <SRS>EPSG:3093</SRS>
+      <SRS>EPSG:3094</SRS>
+      <SRS>EPSG:3095</SRS>
+      <SRS>EPSG:3096</SRS>
+      <SRS>EPSG:3097</SRS>
+      <SRS>EPSG:3098</SRS>
+      <SRS>EPSG:3099</SRS>
+      <SRS>EPSG:3100</SRS>
+      <SRS>EPSG:3101</SRS>
+      <SRS>EPSG:3102</SRS>
+      <SRS>EPSG:3103</SRS>
+      <SRS>EPSG:3104</SRS>
+      <SRS>EPSG:3105</SRS>
+      <SRS>EPSG:3106</SRS>
+      <SRS>EPSG:3107</SRS>
+      <SRS>EPSG:3108</SRS>
+      <SRS>EPSG:3109</SRS>
+      <SRS>EPSG:3110</SRS>
+      <SRS>EPSG:3111</SRS>
+      <SRS>EPSG:3112</SRS>
+      <SRS>EPSG:3113</SRS>
+      <SRS>EPSG:3114</SRS>
+      <SRS>EPSG:3115</SRS>
+      <SRS>EPSG:3116</SRS>
+      <SRS>EPSG:3117</SRS>
+      <SRS>EPSG:3118</SRS>
+      <SRS>EPSG:3119</SRS>
+      <SRS>EPSG:3120</SRS>
+      <SRS>EPSG:3121</SRS>
+      <SRS>EPSG:3122</SRS>
+      <SRS>EPSG:3123</SRS>
+      <SRS>EPSG:3124</SRS>
+      <SRS>EPSG:3125</SRS>
+      <SRS>EPSG:3126</SRS>
+      <SRS>EPSG:3127</SRS>
+      <SRS>EPSG:3128</SRS>
+      <SRS>EPSG:3129</SRS>
+      <SRS>EPSG:3130</SRS>
+      <SRS>EPSG:3131</SRS>
+      <SRS>EPSG:3132</SRS>
+      <SRS>EPSG:3133</SRS>
+      <SRS>EPSG:3134</SRS>
+      <SRS>EPSG:3135</SRS>
+      <SRS>EPSG:3136</SRS>
+      <SRS>EPSG:3137</SRS>
+      <SRS>EPSG:3138</SRS>
+      <SRS>EPSG:3139</SRS>
+      <SRS>EPSG:3140</SRS>
+      <SRS>EPSG:3141</SRS>
+      <SRS>EPSG:3142</SRS>
+      <SRS>EPSG:3143</SRS>
+      <SRS>EPSG:3144</SRS>
+      <SRS>EPSG:3145</SRS>
+      <SRS>EPSG:3146</SRS>
+      <SRS>EPSG:3147</SRS>
+      <SRS>EPSG:3148</SRS>
+      <SRS>EPSG:3149</SRS>
+      <SRS>EPSG:3150</SRS>
+      <SRS>EPSG:3151</SRS>
+      <SRS>EPSG:3152</SRS>
+      <SRS>EPSG:3153</SRS>
+      <SRS>EPSG:3154</SRS>
+      <SRS>EPSG:3155</SRS>
+      <SRS>EPSG:3156</SRS>
+      <SRS>EPSG:3157</SRS>
+      <SRS>EPSG:3158</SRS>
+      <SRS>EPSG:3159</SRS>
+      <SRS>EPSG:3160</SRS>
+      <SRS>EPSG:3161</SRS>
+      <SRS>EPSG:3162</SRS>
+      <SRS>EPSG:3163</SRS>
+      <SRS>EPSG:3164</SRS>
+      <SRS>EPSG:3165</SRS>
+      <SRS>EPSG:3166</SRS>
+      <SRS>EPSG:3167</SRS>
+      <SRS>EPSG:3168</SRS>
+      <SRS>EPSG:3169</SRS>
+      <SRS>EPSG:3170</SRS>
+      <SRS>EPSG:3171</SRS>
+      <SRS>EPSG:3172</SRS>
+      <SRS>EPSG:3173</SRS>
+      <SRS>EPSG:3174</SRS>
+      <SRS>EPSG:3175</SRS>
+      <SRS>EPSG:3176</SRS>
+      <SRS>EPSG:3177</SRS>
+      <SRS>EPSG:3178</SRS>
+      <SRS>EPSG:3179</SRS>
+      <SRS>EPSG:3180</SRS>
+      <SRS>EPSG:3181</SRS>
+      <SRS>EPSG:3182</SRS>
+      <SRS>EPSG:3183</SRS>
+      <SRS>EPSG:3184</SRS>
+      <SRS>EPSG:3185</SRS>
+      <SRS>EPSG:3186</SRS>
+      <SRS>EPSG:3187</SRS>
+      <SRS>EPSG:3188</SRS>
+      <SRS>EPSG:3189</SRS>
+      <SRS>EPSG:3190</SRS>
+      <SRS>EPSG:3191</SRS>
+      <SRS>EPSG:3192</SRS>
+      <SRS>EPSG:3193</SRS>
+      <SRS>EPSG:3194</SRS>
+      <SRS>EPSG:3195</SRS>
+      <SRS>EPSG:3196</SRS>
+      <SRS>EPSG:3197</SRS>
+      <SRS>EPSG:3198</SRS>
+      <SRS>EPSG:3199</SRS>
+      <SRS>EPSG:3200</SRS>
+      <SRS>EPSG:3201</SRS>
+      <SRS>EPSG:3202</SRS>
+      <SRS>EPSG:3203</SRS>
+      <SRS>EPSG:3204</SRS>
+      <SRS>EPSG:3205</SRS>
+      <SRS>EPSG:3206</SRS>
+      <SRS>EPSG:3207</SRS>
+      <SRS>EPSG:3208</SRS>
+      <SRS>EPSG:3209</SRS>
+      <SRS>EPSG:3210</SRS>
+      <SRS>EPSG:3211</SRS>
+      <SRS>EPSG:3212</SRS>
+      <SRS>EPSG:3213</SRS>
+      <SRS>EPSG:3214</SRS>
+      <SRS>EPSG:3215</SRS>
+      <SRS>EPSG:3216</SRS>
+      <SRS>EPSG:3217</SRS>
+      <SRS>EPSG:3218</SRS>
+      <SRS>EPSG:3219</SRS>
+      <SRS>EPSG:3220</SRS>
+      <SRS>EPSG:3221</SRS>
+      <SRS>EPSG:3222</SRS>
+      <SRS>EPSG:3223</SRS>
+      <SRS>EPSG:3224</SRS>
+      <SRS>EPSG:3225</SRS>
+      <SRS>EPSG:3226</SRS>
+      <SRS>EPSG:3227</SRS>
+      <SRS>EPSG:3228</SRS>
+      <SRS>EPSG:3229</SRS>
+      <SRS>EPSG:3230</SRS>
+      <SRS>EPSG:3231</SRS>
+      <SRS>EPSG:3232</SRS>
+      <SRS>EPSG:3233</SRS>
+      <SRS>EPSG:3234</SRS>
+      <SRS>EPSG:3235</SRS>
+      <SRS>EPSG:3236</SRS>
+      <SRS>EPSG:3237</SRS>
+      <SRS>EPSG:3238</SRS>
+      <SRS>EPSG:3239</SRS>
+      <SRS>EPSG:3240</SRS>
+      <SRS>EPSG:3241</SRS>
+      <SRS>EPSG:3242</SRS>
+      <SRS>EPSG:3243</SRS>
+      <SRS>EPSG:3244</SRS>
+      <SRS>EPSG:3245</SRS>
+      <SRS>EPSG:3246</SRS>
+      <SRS>EPSG:3247</SRS>
+      <SRS>EPSG:3248</SRS>
+      <SRS>EPSG:3249</SRS>
+      <SRS>EPSG:3250</SRS>
+      <SRS>EPSG:3251</SRS>
+      <SRS>EPSG:3252</SRS>
+      <SRS>EPSG:3253</SRS>
+      <SRS>EPSG:3254</SRS>
+      <SRS>EPSG:3255</SRS>
+      <SRS>EPSG:3256</SRS>
+      <SRS>EPSG:3257</SRS>
+      <SRS>EPSG:3258</SRS>
+      <SRS>EPSG:3259</SRS>
+      <SRS>EPSG:3260</SRS>
+      <SRS>EPSG:3261</SRS>
+      <SRS>EPSG:3262</SRS>
+      <SRS>EPSG:3263</SRS>
+      <SRS>EPSG:3264</SRS>
+      <SRS>EPSG:3265</SRS>
+      <SRS>EPSG:3266</SRS>
+      <SRS>EPSG:3267</SRS>
+      <SRS>EPSG:3268</SRS>
+      <SRS>EPSG:3269</SRS>
+      <SRS>EPSG:3270</SRS>
+      <SRS>EPSG:3271</SRS>
+      <SRS>EPSG:3272</SRS>
+      <SRS>EPSG:3273</SRS>
+      <SRS>EPSG:3274</SRS>
+      <SRS>EPSG:3275</SRS>
+      <SRS>EPSG:3276</SRS>
+      <SRS>EPSG:3277</SRS>
+      <SRS>EPSG:3278</SRS>
+      <SRS>EPSG:3279</SRS>
+      <SRS>EPSG:3280</SRS>
+      <SRS>EPSG:3281</SRS>
+      <SRS>EPSG:3282</SRS>
+      <SRS>EPSG:3283</SRS>
+      <SRS>EPSG:3284</SRS>
+      <SRS>EPSG:3285</SRS>
+      <SRS>EPSG:3286</SRS>
+      <SRS>EPSG:3287</SRS>
+      <SRS>EPSG:3288</SRS>
+      <SRS>EPSG:3289</SRS>
+      <SRS>EPSG:3290</SRS>
+      <SRS>EPSG:3291</SRS>
+      <SRS>EPSG:3292</SRS>
+      <SRS>EPSG:3293</SRS>
+      <SRS>EPSG:3294</SRS>
+      <SRS>EPSG:3295</SRS>
+      <SRS>EPSG:3296</SRS>
+      <SRS>EPSG:3297</SRS>
+      <SRS>EPSG:3298</SRS>
+      <SRS>EPSG:3299</SRS>
+      <SRS>EPSG:3300</SRS>
+      <SRS>EPSG:3301</SRS>
+      <SRS>EPSG:3302</SRS>
+      <SRS>EPSG:3303</SRS>
+      <SRS>EPSG:3304</SRS>
+      <SRS>EPSG:3305</SRS>
+      <SRS>EPSG:3306</SRS>
+      <SRS>EPSG:3307</SRS>
+      <SRS>EPSG:3308</SRS>
+      <SRS>EPSG:3309</SRS>
+      <SRS>EPSG:3310</SRS>
+      <SRS>EPSG:3311</SRS>
+      <SRS>EPSG:3312</SRS>
+      <SRS>EPSG:3313</SRS>
+      <SRS>EPSG:3314</SRS>
+      <SRS>EPSG:3315</SRS>
+      <SRS>EPSG:3316</SRS>
+      <SRS>EPSG:3317</SRS>
+      <SRS>EPSG:3318</SRS>
+      <SRS>EPSG:3319</SRS>
+      <SRS>EPSG:3320</SRS>
+      <SRS>EPSG:3321</SRS>
+      <SRS>EPSG:3322</SRS>
+      <SRS>EPSG:3323</SRS>
+      <SRS>EPSG:3324</SRS>
+      <SRS>EPSG:3325</SRS>
+      <SRS>EPSG:3326</SRS>
+      <SRS>EPSG:3327</SRS>
+      <SRS>EPSG:3328</SRS>
+      <SRS>EPSG:3329</SRS>
+      <SRS>EPSG:3330</SRS>
+      <SRS>EPSG:3331</SRS>
+      <SRS>EPSG:3332</SRS>
+      <SRS>EPSG:3333</SRS>
+      <SRS>EPSG:3334</SRS>
+      <SRS>EPSG:3335</SRS>
+      <SRS>EPSG:3336</SRS>
+      <SRS>EPSG:3337</SRS>
+      <SRS>EPSG:3338</SRS>
+      <SRS>EPSG:3339</SRS>
+      <SRS>EPSG:3340</SRS>
+      <SRS>EPSG:3341</SRS>
+      <SRS>EPSG:3342</SRS>
+      <SRS>EPSG:3343</SRS>
+      <SRS>EPSG:3344</SRS>
+      <SRS>EPSG:3345</SRS>
+      <SRS>EPSG:3346</SRS>
+      <SRS>EPSG:3347</SRS>
+      <SRS>EPSG:3348</SRS>
+      <SRS>EPSG:3349</SRS>
+      <SRS>EPSG:3350</SRS>
+      <SRS>EPSG:3351</SRS>
+      <SRS>EPSG:3352</SRS>
+      <SRS>EPSG:3353</SRS>
+      <SRS>EPSG:3354</SRS>
+      <SRS>EPSG:3355</SRS>
+      <SRS>EPSG:3356</SRS>
+      <SRS>EPSG:3357</SRS>
+      <SRS>EPSG:3358</SRS>
+      <SRS>EPSG:3359</SRS>
+      <SRS>EPSG:3360</SRS>
+      <SRS>EPSG:3361</SRS>
+      <SRS>EPSG:3362</SRS>
+      <SRS>EPSG:3363</SRS>
+      <SRS>EPSG:3364</SRS>
+      <SRS>EPSG:3365</SRS>
+      <SRS>EPSG:3366</SRS>
+      <SRS>EPSG:3367</SRS>
+      <SRS>EPSG:3368</SRS>
+      <SRS>EPSG:3369</SRS>
+      <SRS>EPSG:3370</SRS>
+      <SRS>EPSG:3371</SRS>
+      <SRS>EPSG:3372</SRS>
+      <SRS>EPSG:3373</SRS>
+      <SRS>EPSG:3374</SRS>
+      <SRS>EPSG:3375</SRS>
+      <SRS>EPSG:3376</SRS>
+      <SRS>EPSG:3377</SRS>
+      <SRS>EPSG:3378</SRS>
+      <SRS>EPSG:3379</SRS>
+      <SRS>EPSG:3380</SRS>
+      <SRS>EPSG:3381</SRS>
+      <SRS>EPSG:3382</SRS>
+      <SRS>EPSG:3383</SRS>
+      <SRS>EPSG:3384</SRS>
+      <SRS>EPSG:3385</SRS>
+      <SRS>EPSG:3386</SRS>
+      <SRS>EPSG:3387</SRS>
+      <SRS>EPSG:3388</SRS>
+      <SRS>EPSG:3389</SRS>
+      <SRS>EPSG:3390</SRS>
+      <SRS>EPSG:3391</SRS>
+      <SRS>EPSG:3392</SRS>
+      <SRS>EPSG:3393</SRS>
+      <SRS>EPSG:3394</SRS>
+      <SRS>EPSG:3395</SRS>
+      <SRS>EPSG:3396</SRS>
+      <SRS>EPSG:3397</SRS>
+      <SRS>EPSG:3398</SRS>
+      <SRS>EPSG:3399</SRS>
+      <SRS>EPSG:3400</SRS>
+      <SRS>EPSG:3401</SRS>
+      <SRS>EPSG:3402</SRS>
+      <SRS>EPSG:3403</SRS>
+      <SRS>EPSG:3404</SRS>
+      <SRS>EPSG:3405</SRS>
+      <SRS>EPSG:3406</SRS>
+      <SRS>EPSG:3407</SRS>
+      <SRS>EPSG:3408</SRS>
+      <SRS>EPSG:3409</SRS>
+      <SRS>EPSG:3410</SRS>
+      <SRS>EPSG:3411</SRS>
+      <SRS>EPSG:3412</SRS>
+      <SRS>EPSG:3413</SRS>
+      <SRS>EPSG:3414</SRS>
+      <SRS>EPSG:3415</SRS>
+      <SRS>EPSG:3416</SRS>
+      <SRS>EPSG:3417</SRS>
+      <SRS>EPSG:3418</SRS>
+      <SRS>EPSG:3419</SRS>
+      <SRS>EPSG:3420</SRS>
+      <SRS>EPSG:3421</SRS>
+      <SRS>EPSG:3422</SRS>
+      <SRS>EPSG:3423</SRS>
+      <SRS>EPSG:3424</SRS>
+      <SRS>EPSG:3425</SRS>
+      <SRS>EPSG:3426</SRS>
+      <SRS>EPSG:3427</SRS>
+      <SRS>EPSG:3428</SRS>
+      <SRS>EPSG:3429</SRS>
+      <SRS>EPSG:3430</SRS>
+      <SRS>EPSG:3431</SRS>
+      <SRS>EPSG:3432</SRS>
+      <SRS>EPSG:3433</SRS>
+      <SRS>EPSG:3434</SRS>
+      <SRS>EPSG:3435</SRS>
+      <SRS>EPSG:3436</SRS>
+      <SRS>EPSG:3437</SRS>
+      <SRS>EPSG:3438</SRS>
+      <SRS>EPSG:3439</SRS>
+      <SRS>EPSG:3440</SRS>
+      <SRS>EPSG:3441</SRS>
+      <SRS>EPSG:3442</SRS>
+      <SRS>EPSG:3443</SRS>
+      <SRS>EPSG:3444</SRS>
+      <SRS>EPSG:3445</SRS>
+      <SRS>EPSG:3446</SRS>
+      <SRS>EPSG:3447</SRS>
+      <SRS>EPSG:3448</SRS>
+      <SRS>EPSG:3449</SRS>
+      <SRS>EPSG:3450</SRS>
+      <SRS>EPSG:3451</SRS>
+      <SRS>EPSG:3452</SRS>
+      <SRS>EPSG:3453</SRS>
+      <SRS>EPSG:3454</SRS>
+      <SRS>EPSG:3455</SRS>
+      <SRS>EPSG:3456</SRS>
+      <SRS>EPSG:3457</SRS>
+      <SRS>EPSG:3458</SRS>
+      <SRS>EPSG:3459</SRS>
+      <SRS>EPSG:3460</SRS>
+      <SRS>EPSG:3461</SRS>
+      <SRS>EPSG:3462</SRS>
+      <SRS>EPSG:3463</SRS>
+      <SRS>EPSG:3464</SRS>
+      <SRS>EPSG:3560</SRS>
+      <SRS>EPSG:3561</SRS>
+      <SRS>EPSG:3562</SRS>
+      <SRS>EPSG:3563</SRS>
+      <SRS>EPSG:3564</SRS>
+      <SRS>EPSG:3565</SRS>
+      <SRS>EPSG:3566</SRS>
+      <SRS>EPSG:3567</SRS>
+      <SRS>EPSG:3568</SRS>
+      <SRS>EPSG:3569</SRS>
+      <SRS>EPSG:3570</SRS>
+      <SRS>EPSG:3571</SRS>
+      <SRS>EPSG:3572</SRS>
+      <SRS>EPSG:3573</SRS>
+      <SRS>EPSG:3574</SRS>
+      <SRS>EPSG:3575</SRS>
+      <SRS>EPSG:3576</SRS>
+      <SRS>EPSG:3577</SRS>
+      <SRS>EPSG:3920</SRS>
+      <SRS>EPSG:3991</SRS>
+      <SRS>EPSG:3992</SRS>
+      <SRS>EPSG:3993</SRS>
+      <SRS>EPSG:4001</SRS>
+      <SRS>EPSG:4002</SRS>
+      <SRS>EPSG:4003</SRS>
+      <SRS>EPSG:4004</SRS>
+      <SRS>EPSG:4005</SRS>
+      <SRS>EPSG:4006</SRS>
+      <SRS>EPSG:4007</SRS>
+      <SRS>EPSG:4008</SRS>
+      <SRS>EPSG:4009</SRS>
+      <SRS>EPSG:4010</SRS>
+      <SRS>EPSG:4011</SRS>
+      <SRS>EPSG:4012</SRS>
+      <SRS>EPSG:4013</SRS>
+      <SRS>EPSG:4014</SRS>
+      <SRS>EPSG:4015</SRS>
+      <SRS>EPSG:4016</SRS>
+      <SRS>EPSG:4018</SRS>
+      <SRS>EPSG:4019</SRS>
+      <SRS>EPSG:4020</SRS>
+      <SRS>EPSG:4021</SRS>
+      <SRS>EPSG:4022</SRS>
+      <SRS>EPSG:4024</SRS>
+      <SRS>EPSG:4025</SRS>
+      <SRS>EPSG:4027</SRS>
+      <SRS>EPSG:4028</SRS>
+      <SRS>EPSG:4029</SRS>
+      <SRS>EPSG:4030</SRS>
+      <SRS>EPSG:4031</SRS>
+      <SRS>EPSG:4032</SRS>
+      <SRS>EPSG:4033</SRS>
+      <SRS>EPSG:4034</SRS>
+      <SRS>EPSG:4035</SRS>
+      <SRS>EPSG:4036</SRS>
+      <SRS>EPSG:4041</SRS>
+      <SRS>EPSG:4042</SRS>
+      <SRS>EPSG:4043</SRS>
+      <SRS>EPSG:4044</SRS>
+      <SRS>EPSG:4045</SRS>
+      <SRS>EPSG:4047</SRS>
+      <SRS>EPSG:4052</SRS>
+      <SRS>EPSG:4053</SRS>
+      <SRS>EPSG:4054</SRS>
+      <SRS>EPSG:4120</SRS>
+      <SRS>EPSG:4121</SRS>
+      <SRS>EPSG:4122</SRS>
+      <SRS>EPSG:4123</SRS>
+      <SRS>EPSG:4124</SRS>
+      <SRS>EPSG:4125</SRS>
+      <SRS>EPSG:4126</SRS>
+      <SRS>EPSG:4127</SRS>
+      <SRS>EPSG:4128</SRS>
+      <SRS>EPSG:4129</SRS>
+      <SRS>EPSG:4130</SRS>
+      <SRS>EPSG:4131</SRS>
+      <SRS>EPSG:4132</SRS>
+      <SRS>EPSG:4133</SRS>
+      <SRS>EPSG:4134</SRS>
+      <SRS>EPSG:4135</SRS>
+      <SRS>EPSG:4136</SRS>
+      <SRS>EPSG:4137</SRS>
+      <SRS>EPSG:4138</SRS>
+      <SRS>EPSG:4139</SRS>
+      <SRS>EPSG:4140</SRS>
+      <SRS>EPSG:4141</SRS>
+      <SRS>EPSG:4142</SRS>
+      <SRS>EPSG:4143</SRS>
+      <SRS>EPSG:4144</SRS>
+      <SRS>EPSG:4145</SRS>
+      <SRS>EPSG:4146</SRS>
+      <SRS>EPSG:4147</SRS>
+      <SRS>EPSG:4148</SRS>
+      <SRS>EPSG:4149</SRS>
+      <SRS>EPSG:4150</SRS>
+      <SRS>EPSG:4151</SRS>
+      <SRS>EPSG:4152</SRS>
+      <SRS>EPSG:4153</SRS>
+      <SRS>EPSG:4154</SRS>
+      <SRS>EPSG:4155</SRS>
+      <SRS>EPSG:4156</SRS>
+      <SRS>EPSG:4157</SRS>
+      <SRS>EPSG:4158</SRS>
+      <SRS>EPSG:4159</SRS>
+      <SRS>EPSG:4160</SRS>
+      <SRS>EPSG:4161</SRS>
+      <SRS>EPSG:4162</SRS>
+      <SRS>EPSG:4163</SRS>
+      <SRS>EPSG:4164</SRS>
+      <SRS>EPSG:4165</SRS>
+      <SRS>EPSG:4166</SRS>
+      <SRS>EPSG:4167</SRS>
+      <SRS>EPSG:4168</SRS>
+      <SRS>EPSG:4169</SRS>
+      <SRS>EPSG:4170</SRS>
+      <SRS>EPSG:4171</SRS>
+      <SRS>EPSG:4172</SRS>
+      <SRS>EPSG:4173</SRS>
+      <SRS>EPSG:4174</SRS>
+      <SRS>EPSG:4175</SRS>
+      <SRS>EPSG:4176</SRS>
+      <SRS>EPSG:4178</SRS>
+      <SRS>EPSG:4179</SRS>
+      <SRS>EPSG:4180</SRS>
+      <SRS>EPSG:4181</SRS>
+      <SRS>EPSG:4182</SRS>
+      <SRS>EPSG:4183</SRS>
+      <SRS>EPSG:4184</SRS>
+      <SRS>EPSG:4185</SRS>
+      <SRS>EPSG:4188</SRS>
+      <SRS>EPSG:4189</SRS>
+      <SRS>EPSG:4190</SRS>
+      <SRS>EPSG:4191</SRS>
+      <SRS>EPSG:4192</SRS>
+      <SRS>EPSG:4193</SRS>
+      <SRS>EPSG:4194</SRS>
+      <SRS>EPSG:4195</SRS>
+      <SRS>EPSG:4196</SRS>
+      <SRS>EPSG:4197</SRS>
+      <SRS>EPSG:4198</SRS>
+      <SRS>EPSG:4199</SRS>
+      <SRS>EPSG:4200</SRS>
+      <SRS>EPSG:4201</SRS>
+      <SRS>EPSG:4202</SRS>
+      <SRS>EPSG:4203</SRS>
+      <SRS>EPSG:4204</SRS>
+      <SRS>EPSG:4205</SRS>
+      <SRS>EPSG:4206</SRS>
+      <SRS>EPSG:4207</SRS>
+      <SRS>EPSG:4208</SRS>
+      <SRS>EPSG:4209</SRS>
+      <SRS>EPSG:4210</SRS>
+      <SRS>EPSG:4211</SRS>
+      <SRS>EPSG:4212</SRS>
+      <SRS>EPSG:4213</SRS>
+      <SRS>EPSG:4214</SRS>
+      <SRS>EPSG:4215</SRS>
+      <SRS>EPSG:4216</SRS>
+      <SRS>EPSG:4218</SRS>
+      <SRS>EPSG:4219</SRS>
+      <SRS>EPSG:4220</SRS>
+      <SRS>EPSG:4221</SRS>
+      <SRS>EPSG:4222</SRS>
+      <SRS>EPSG:4223</SRS>
+      <SRS>EPSG:4224</SRS>
+      <SRS>EPSG:4225</SRS>
+      <SRS>EPSG:4226</SRS>
+      <SRS>EPSG:4227</SRS>
+      <SRS>EPSG:4228</SRS>
+      <SRS>EPSG:4229</SRS>
+      <SRS>EPSG:4230</SRS>
+      <SRS>EPSG:4231</SRS>
+      <SRS>EPSG:4232</SRS>
+      <SRS>EPSG:4233</SRS>
+      <SRS>EPSG:4234</SRS>
+      <SRS>EPSG:4235</SRS>
+      <SRS>EPSG:4236</SRS>
+      <SRS>EPSG:4237</SRS>
+      <SRS>EPSG:4238</SRS>
+      <SRS>EPSG:4239</SRS>
+      <SRS>EPSG:4240</SRS>
+      <SRS>EPSG:4241</SRS>
+      <SRS>EPSG:4242</SRS>
+      <SRS>EPSG:4243</SRS>
+      <SRS>EPSG:4244</SRS>
+      <SRS>EPSG:4245</SRS>
+      <SRS>EPSG:4246</SRS>
+      <SRS>EPSG:4247</SRS>
+      <SRS>EPSG:4248</SRS>
+      <SRS>EPSG:4249</SRS>
+      <SRS>EPSG:4250</SRS>
+      <SRS>EPSG:4251</SRS>
+      <SRS>EPSG:4252</SRS>
+      <SRS>EPSG:4253</SRS>
+      <SRS>EPSG:4254</SRS>
+      <SRS>EPSG:4255</SRS>
+      <SRS>EPSG:4256</SRS>
+      <SRS>EPSG:4257</SRS>
+      <SRS>EPSG:4258</SRS>
+      <SRS>EPSG:4259</SRS>
+      <SRS>EPSG:4260</SRS>
+      <SRS>EPSG:4261</SRS>
+      <SRS>EPSG:4262</SRS>
+      <SRS>EPSG:4263</SRS>
+      <SRS>EPSG:4264</SRS>
+      <SRS>EPSG:4265</SRS>
+      <SRS>EPSG:4266</SRS>
+      <SRS>EPSG:4267</SRS>
+      <SRS>EPSG:4268</SRS>
+      <SRS>EPSG:4269</SRS>
+      <SRS>EPSG:4270</SRS>
+      <SRS>EPSG:4271</SRS>
+      <SRS>EPSG:4272</SRS>
+      <SRS>EPSG:4273</SRS>
+      <SRS>EPSG:4274</SRS>
+      <SRS>EPSG:4275</SRS>
+      <SRS>EPSG:4276</SRS>
+      <SRS>EPSG:4277</SRS>
+      <SRS>EPSG:4278</SRS>
+      <SRS>EPSG:4279</SRS>
+      <SRS>EPSG:4280</SRS>
+      <SRS>EPSG:4281</SRS>
+      <SRS>EPSG:4282</SRS>
+      <SRS>EPSG:4283</SRS>
+      <SRS>EPSG:4284</SRS>
+      <SRS>EPSG:4285</SRS>
+      <SRS>EPSG:4286</SRS>
+      <SRS>EPSG:4287</SRS>
+      <SRS>EPSG:4288</SRS>
+      <SRS>EPSG:4289</SRS>
+      <SRS>EPSG:4291</SRS>
+      <SRS>EPSG:4292</SRS>
+      <SRS>EPSG:4293</SRS>
+      <SRS>EPSG:4294</SRS>
+      <SRS>EPSG:4295</SRS>
+      <SRS>EPSG:4296</SRS>
+      <SRS>EPSG:4297</SRS>
+      <SRS>EPSG:4298</SRS>
+      <SRS>EPSG:4299</SRS>
+      <SRS>EPSG:4300</SRS>
+      <SRS>EPSG:4301</SRS>
+      <SRS>EPSG:4302</SRS>
+      <SRS>EPSG:4303</SRS>
+      <SRS>EPSG:4304</SRS>
+      <SRS>EPSG:4306</SRS>
+      <SRS>EPSG:4307</SRS>
+      <SRS>EPSG:4308</SRS>
+      <SRS>EPSG:4309</SRS>
+      <SRS>EPSG:4310</SRS>
+      <SRS>EPSG:4311</SRS>
+      <SRS>EPSG:4312</SRS>
+      <SRS>EPSG:4313</SRS>
+      <SRS>EPSG:4314</SRS>
+      <SRS>EPSG:4315</SRS>
+      <SRS>EPSG:4316</SRS>
+      <SRS>EPSG:4317</SRS>
+      <SRS>EPSG:4318</SRS>
+      <SRS>EPSG:4319</SRS>
+      <SRS>EPSG:4322</SRS>
+      <SRS>EPSG:4324</SRS>
+      <SRS>EPSG:4326</SRS>
+      <SRS>EPSG:4327</SRS>
+      <SRS>EPSG:4328</SRS>
+      <SRS>EPSG:4329</SRS>
+      <SRS>EPSG:4330</SRS>
+      <SRS>EPSG:4331</SRS>
+      <SRS>EPSG:4332</SRS>
+      <SRS>EPSG:4333</SRS>
+      <SRS>EPSG:4334</SRS>
+      <SRS>EPSG:4335</SRS>
+      <SRS>EPSG:4336</SRS>
+      <SRS>EPSG:4337</SRS>
+      <SRS>EPSG:4338</SRS>
+      <SRS>EPSG:4339</SRS>
+      <SRS>EPSG:4340</SRS>
+      <SRS>EPSG:4341</SRS>
+      <SRS>EPSG:4342</SRS>
+      <SRS>EPSG:4343</SRS>
+      <SRS>EPSG:4344</SRS>
+      <SRS>EPSG:4345</SRS>
+      <SRS>EPSG:4346</SRS>
+      <SRS>EPSG:4347</SRS>
+      <SRS>EPSG:4348</SRS>
+      <SRS>EPSG:4349</SRS>
+      <SRS>EPSG:4350</SRS>
+      <SRS>EPSG:4351</SRS>
+      <SRS>EPSG:4352</SRS>
+      <SRS>EPSG:4353</SRS>
+      <SRS>EPSG:4354</SRS>
+      <SRS>EPSG:4355</SRS>
+      <SRS>EPSG:4356</SRS>
+      <SRS>EPSG:4357</SRS>
+      <SRS>EPSG:4358</SRS>
+      <SRS>EPSG:4359</SRS>
+      <SRS>EPSG:4360</SRS>
+      <SRS>EPSG:4361</SRS>
+      <SRS>EPSG:4362</SRS>
+      <SRS>EPSG:4363</SRS>
+      <SRS>EPSG:4364</SRS>
+      <SRS>EPSG:4365</SRS>
+      <SRS>EPSG:4366</SRS>
+      <SRS>EPSG:4367</SRS>
+      <SRS>EPSG:4368</SRS>
+      <SRS>EPSG:4369</SRS>
+      <SRS>EPSG:4370</SRS>
+      <SRS>EPSG:4371</SRS>
+      <SRS>EPSG:4372</SRS>
+      <SRS>EPSG:4373</SRS>
+      <SRS>EPSG:4374</SRS>
+      <SRS>EPSG:4375</SRS>
+      <SRS>EPSG:4376</SRS>
+      <SRS>EPSG:4377</SRS>
+      <SRS>EPSG:4378</SRS>
+      <SRS>EPSG:4379</SRS>
+      <SRS>EPSG:4380</SRS>
+      <SRS>EPSG:4381</SRS>
+      <SRS>EPSG:4382</SRS>
+      <SRS>EPSG:4383</SRS>
+      <SRS>EPSG:4384</SRS>
+      <SRS>EPSG:4385</SRS>
+      <SRS>EPSG:4386</SRS>
+      <SRS>EPSG:4387</SRS>
+      <SRS>EPSG:4388</SRS>
+      <SRS>EPSG:4389</SRS>
+      <SRS>EPSG:4600</SRS>
+      <SRS>EPSG:4601</SRS>
+      <SRS>EPSG:4602</SRS>
+      <SRS>EPSG:4603</SRS>
+      <SRS>EPSG:4604</SRS>
+      <SRS>EPSG:4605</SRS>
+      <SRS>EPSG:4606</SRS>
+      <SRS>EPSG:4607</SRS>
+      <SRS>EPSG:4608</SRS>
+      <SRS>EPSG:4609</SRS>
+      <SRS>EPSG:4610</SRS>
+      <SRS>EPSG:4611</SRS>
+      <SRS>EPSG:4612</SRS>
+      <SRS>EPSG:4613</SRS>
+      <SRS>EPSG:4614</SRS>
+      <SRS>EPSG:4615</SRS>
+      <SRS>EPSG:4616</SRS>
+      <SRS>EPSG:4617</SRS>
+      <SRS>EPSG:4618</SRS>
+      <SRS>EPSG:4619</SRS>
+      <SRS>EPSG:4620</SRS>
+      <SRS>EPSG:4621</SRS>
+      <SRS>EPSG:4622</SRS>
+      <SRS>EPSG:4623</SRS>
+      <SRS>EPSG:4624</SRS>
+      <SRS>EPSG:4625</SRS>
+      <SRS>EPSG:4626</SRS>
+      <SRS>EPSG:4627</SRS>
+      <SRS>EPSG:4628</SRS>
+      <SRS>EPSG:4629</SRS>
+      <SRS>EPSG:4630</SRS>
+      <SRS>EPSG:4631</SRS>
+      <SRS>EPSG:4632</SRS>
+      <SRS>EPSG:4633</SRS>
+      <SRS>EPSG:4634</SRS>
+      <SRS>EPSG:4635</SRS>
+      <SRS>EPSG:4636</SRS>
+      <SRS>EPSG:4637</SRS>
+      <SRS>EPSG:4638</SRS>
+      <SRS>EPSG:4639</SRS>
+      <SRS>EPSG:4640</SRS>
+      <SRS>EPSG:4641</SRS>
+      <SRS>EPSG:4642</SRS>
+      <SRS>EPSG:4643</SRS>
+      <SRS>EPSG:4644</SRS>
+      <SRS>EPSG:4645</SRS>
+      <SRS>EPSG:4646</SRS>
+      <SRS>EPSG:4657</SRS>
+      <SRS>EPSG:4658</SRS>
+      <SRS>EPSG:4659</SRS>
+      <SRS>EPSG:4660</SRS>
+      <SRS>EPSG:4661</SRS>
+      <SRS>EPSG:4662</SRS>
+      <SRS>EPSG:4663</SRS>
+      <SRS>EPSG:4664</SRS>
+      <SRS>EPSG:4665</SRS>
+      <SRS>EPSG:4666</SRS>
+      <SRS>EPSG:4667</SRS>
+      <SRS>EPSG:4668</SRS>
+      <SRS>EPSG:4669</SRS>
+      <SRS>EPSG:4670</SRS>
+      <SRS>EPSG:4671</SRS>
+      <SRS>EPSG:4672</SRS>
+      <SRS>EPSG:4673</SRS>
+      <SRS>EPSG:4674</SRS>
+      <SRS>EPSG:4675</SRS>
+      <SRS>EPSG:4676</SRS>
+      <SRS>EPSG:4677</SRS>
+      <SRS>EPSG:4678</SRS>
+      <SRS>EPSG:4679</SRS>
+      <SRS>EPSG:4680</SRS>
+      <SRS>EPSG:4681</SRS>
+      <SRS>EPSG:4682</SRS>
+      <SRS>EPSG:4683</SRS>
+      <SRS>EPSG:4684</SRS>
+      <SRS>EPSG:4685</SRS>
+      <SRS>EPSG:4686</SRS>
+      <SRS>EPSG:4687</SRS>
+      <SRS>EPSG:4688</SRS>
+      <SRS>EPSG:4689</SRS>
+      <SRS>EPSG:4690</SRS>
+      <SRS>EPSG:4691</SRS>
+      <SRS>EPSG:4692</SRS>
+      <SRS>EPSG:4693</SRS>
+      <SRS>EPSG:4694</SRS>
+      <SRS>EPSG:4695</SRS>
+      <SRS>EPSG:4696</SRS>
+      <SRS>EPSG:4697</SRS>
+      <SRS>EPSG:4698</SRS>
+      <SRS>EPSG:4699</SRS>
+      <SRS>EPSG:4700</SRS>
+      <SRS>EPSG:4701</SRS>
+      <SRS>EPSG:4702</SRS>
+      <SRS>EPSG:4703</SRS>
+      <SRS>EPSG:4704</SRS>
+      <SRS>EPSG:4705</SRS>
+      <SRS>EPSG:4706</SRS>
+      <SRS>EPSG:4707</SRS>
+      <SRS>EPSG:4708</SRS>
+      <SRS>EPSG:4709</SRS>
+      <SRS>EPSG:4710</SRS>
+      <SRS>EPSG:4711</SRS>
+      <SRS>EPSG:4712</SRS>
+      <SRS>EPSG:4713</SRS>
+      <SRS>EPSG:4714</SRS>
+      <SRS>EPSG:4715</SRS>
+      <SRS>EPSG:4716</SRS>
+      <SRS>EPSG:4717</SRS>
+      <SRS>EPSG:4718</SRS>
+      <SRS>EPSG:4719</SRS>
+      <SRS>EPSG:4720</SRS>
+      <SRS>EPSG:4721</SRS>
+      <SRS>EPSG:4722</SRS>
+      <SRS>EPSG:4723</SRS>
+      <SRS>EPSG:4724</SRS>
+      <SRS>EPSG:4725</SRS>
+      <SRS>EPSG:4726</SRS>
+      <SRS>EPSG:4727</SRS>
+      <SRS>EPSG:4728</SRS>
+      <SRS>EPSG:4729</SRS>
+      <SRS>EPSG:4730</SRS>
+      <SRS>EPSG:4731</SRS>
+      <SRS>EPSG:4732</SRS>
+      <SRS>EPSG:4733</SRS>
+      <SRS>EPSG:4734</SRS>
+      <SRS>EPSG:4735</SRS>
+      <SRS>EPSG:4736</SRS>
+      <SRS>EPSG:4737</SRS>
+      <SRS>EPSG:4738</SRS>
+      <SRS>EPSG:4739</SRS>
+      <SRS>EPSG:4740</SRS>
+      <SRS>EPSG:4741</SRS>
+      <SRS>EPSG:4742</SRS>
+      <SRS>EPSG:4743</SRS>
+      <SRS>EPSG:4744</SRS>
+      <SRS>EPSG:4745</SRS>
+      <SRS>EPSG:4746</SRS>
+      <SRS>EPSG:4747</SRS>
+      <SRS>EPSG:4748</SRS>
+      <SRS>EPSG:4749</SRS>
+      <SRS>EPSG:4750</SRS>
+      <SRS>EPSG:4751</SRS>
+      <SRS>EPSG:4752</SRS>
+      <SRS>EPSG:4753</SRS>
+      <SRS>EPSG:4754</SRS>
+      <SRS>EPSG:4755</SRS>
+      <SRS>EPSG:4756</SRS>
+      <SRS>EPSG:4757</SRS>
+      <SRS>EPSG:4758</SRS>
+      <SRS>EPSG:4801</SRS>
+      <SRS>EPSG:4802</SRS>
+      <SRS>EPSG:4803</SRS>
+      <SRS>EPSG:4804</SRS>
+      <SRS>EPSG:4805</SRS>
+      <SRS>EPSG:4806</SRS>
+      <SRS>EPSG:4807</SRS>
+      <SRS>EPSG:4808</SRS>
+      <SRS>EPSG:4809</SRS>
+      <SRS>EPSG:4810</SRS>
+      <SRS>EPSG:4811</SRS>
+      <SRS>EPSG:4813</SRS>
+      <SRS>EPSG:4814</SRS>
+      <SRS>EPSG:4815</SRS>
+      <SRS>EPSG:4816</SRS>
+      <SRS>EPSG:4817</SRS>
+      <SRS>EPSG:4818</SRS>
+      <SRS>EPSG:4819</SRS>
+      <SRS>EPSG:4820</SRS>
+      <SRS>EPSG:4821</SRS>
+      <SRS>EPSG:4894</SRS>
+      <SRS>EPSG:4895</SRS>
+      <SRS>EPSG:4896</SRS>
+      <SRS>EPSG:4897</SRS>
+      <SRS>EPSG:4898</SRS>
+      <SRS>EPSG:4899</SRS>
+      <SRS>EPSG:4900</SRS>
+      <SRS>EPSG:4901</SRS>
+      <SRS>EPSG:4902</SRS>
+      <SRS>EPSG:4903</SRS>
+      <SRS>EPSG:4904</SRS>
+      <SRS>EPSG:4906</SRS>
+      <SRS>EPSG:4907</SRS>
+      <SRS>EPSG:4908</SRS>
+      <SRS>EPSG:4909</SRS>
+      <SRS>EPSG:4910</SRS>
+      <SRS>EPSG:4911</SRS>
+      <SRS>EPSG:4912</SRS>
+      <SRS>EPSG:4913</SRS>
+      <SRS>EPSG:4914</SRS>
+      <SRS>EPSG:4915</SRS>
+      <SRS>EPSG:4916</SRS>
+      <SRS>EPSG:4917</SRS>
+      <SRS>EPSG:4918</SRS>
+      <SRS>EPSG:4919</SRS>
+      <SRS>EPSG:4920</SRS>
+      <SRS>EPSG:4921</SRS>
+      <SRS>EPSG:4922</SRS>
+      <SRS>EPSG:4923</SRS>
+      <SRS>EPSG:4924</SRS>
+      <SRS>EPSG:4925</SRS>
+      <SRS>EPSG:4926</SRS>
+      <SRS>EPSG:4927</SRS>
+      <SRS>EPSG:4928</SRS>
+      <SRS>EPSG:4929</SRS>
+      <SRS>EPSG:4930</SRS>
+      <SRS>EPSG:4931</SRS>
+      <SRS>EPSG:4932</SRS>
+      <SRS>EPSG:4933</SRS>
+      <SRS>EPSG:4934</SRS>
+      <SRS>EPSG:4935</SRS>
+      <SRS>EPSG:4936</SRS>
+      <SRS>EPSG:4937</SRS>
+      <SRS>EPSG:4938</SRS>
+      <SRS>EPSG:4939</SRS>
+      <SRS>EPSG:4940</SRS>
+      <SRS>EPSG:4941</SRS>
+      <SRS>EPSG:4942</SRS>
+      <SRS>EPSG:4943</SRS>
+      <SRS>EPSG:4944</SRS>
+      <SRS>EPSG:4945</SRS>
+      <SRS>EPSG:4946</SRS>
+      <SRS>EPSG:4947</SRS>
+      <SRS>EPSG:4948</SRS>
+      <SRS>EPSG:4949</SRS>
+      <SRS>EPSG:4950</SRS>
+      <SRS>EPSG:4951</SRS>
+      <SRS>EPSG:4952</SRS>
+      <SRS>EPSG:4953</SRS>
+      <SRS>EPSG:4954</SRS>
+      <SRS>EPSG:4955</SRS>
+      <SRS>EPSG:4956</SRS>
+      <SRS>EPSG:4957</SRS>
+      <SRS>EPSG:4958</SRS>
+      <SRS>EPSG:4959</SRS>
+      <SRS>EPSG:4960</SRS>
+      <SRS>EPSG:4961</SRS>
+      <SRS>EPSG:4962</SRS>
+      <SRS>EPSG:4963</SRS>
+      <SRS>EPSG:4964</SRS>
+      <SRS>EPSG:4965</SRS>
+      <SRS>EPSG:4966</SRS>
+      <SRS>EPSG:4967</SRS>
+      <SRS>EPSG:4968</SRS>
+      <SRS>EPSG:4969</SRS>
+      <SRS>EPSG:4970</SRS>
+      <SRS>EPSG:4971</SRS>
+      <SRS>EPSG:4972</SRS>
+      <SRS>EPSG:4973</SRS>
+      <SRS>EPSG:4974</SRS>
+      <SRS>EPSG:4975</SRS>
+      <SRS>EPSG:4976</SRS>
+      <SRS>EPSG:4977</SRS>
+      <SRS>EPSG:4978</SRS>
+      <SRS>EPSG:4979</SRS>
+      <SRS>EPSG:4980</SRS>
+      <SRS>EPSG:4981</SRS>
+      <SRS>EPSG:4982</SRS>
+      <SRS>EPSG:4983</SRS>
+      <SRS>EPSG:4984</SRS>
+      <SRS>EPSG:4985</SRS>
+      <SRS>EPSG:4986</SRS>
+      <SRS>EPSG:4987</SRS>
+      <SRS>EPSG:4988</SRS>
+      <SRS>EPSG:4989</SRS>
+      <SRS>EPSG:4990</SRS>
+      <SRS>EPSG:4991</SRS>
+      <SRS>EPSG:4992</SRS>
+      <SRS>EPSG:4993</SRS>
+      <SRS>EPSG:4994</SRS>
+      <SRS>EPSG:4995</SRS>
+      <SRS>EPSG:4996</SRS>
+      <SRS>EPSG:4997</SRS>
+      <SRS>EPSG:4998</SRS>
+      <SRS>EPSG:4999</SRS>
+      <SRS>EPSG:5600</SRS>
+      <SRS>EPSG:5601</SRS>
+      <SRS>EPSG:5602</SRS>
+      <SRS>EPSG:5603</SRS>
+      <SRS>EPSG:5604</SRS>
+      <SRS>EPSG:5605</SRS>
+      <SRS>EPSG:5606</SRS>
+      <SRS>EPSG:5607</SRS>
+      <SRS>EPSG:5608</SRS>
+      <SRS>EPSG:5609</SRS>
+      <SRS>EPSG:5701</SRS>
+      <SRS>EPSG:5702</SRS>
+      <SRS>EPSG:5703</SRS>
+      <SRS>EPSG:5704</SRS>
+      <SRS>EPSG:5705</SRS>
+      <SRS>EPSG:5706</SRS>
+      <SRS>EPSG:5709</SRS>
+      <SRS>EPSG:5710</SRS>
+      <SRS>EPSG:5711</SRS>
+      <SRS>EPSG:5712</SRS>
+      <SRS>EPSG:5713</SRS>
+      <SRS>EPSG:5714</SRS>
+      <SRS>EPSG:5715</SRS>
+      <SRS>EPSG:5716</SRS>
+      <SRS>EPSG:5717</SRS>
+      <SRS>EPSG:5718</SRS>
+      <SRS>EPSG:5719</SRS>
+      <SRS>EPSG:5720</SRS>
+      <SRS>EPSG:5721</SRS>
+      <SRS>EPSG:5722</SRS>
+      <SRS>EPSG:5723</SRS>
+      <SRS>EPSG:5724</SRS>
+      <SRS>EPSG:5725</SRS>
+      <SRS>EPSG:5726</SRS>
+      <SRS>EPSG:5727</SRS>
+      <SRS>EPSG:5728</SRS>
+      <SRS>EPSG:5729</SRS>
+      <SRS>EPSG:5730</SRS>
+      <SRS>EPSG:5731</SRS>
+      <SRS>EPSG:5732</SRS>
+      <SRS>EPSG:5733</SRS>
+      <SRS>EPSG:5734</SRS>
+      <SRS>EPSG:5735</SRS>
+      <SRS>EPSG:5736</SRS>
+      <SRS>EPSG:5737</SRS>
+      <SRS>EPSG:5738</SRS>
+      <SRS>EPSG:5739</SRS>
+      <SRS>EPSG:5740</SRS>
+      <SRS>EPSG:5741</SRS>
+      <SRS>EPSG:5742</SRS>
+      <SRS>EPSG:5743</SRS>
+      <SRS>EPSG:5744</SRS>
+      <SRS>EPSG:5745</SRS>
+      <SRS>EPSG:5746</SRS>
+      <SRS>EPSG:5747</SRS>
+      <SRS>EPSG:5748</SRS>
+      <SRS>EPSG:5749</SRS>
+      <SRS>EPSG:5750</SRS>
+      <SRS>EPSG:5751</SRS>
+      <SRS>EPSG:5752</SRS>
+      <SRS>EPSG:5753</SRS>
+      <SRS>EPSG:5754</SRS>
+      <SRS>EPSG:5755</SRS>
+      <SRS>EPSG:5756</SRS>
+      <SRS>EPSG:5757</SRS>
+      <SRS>EPSG:5758</SRS>
+      <SRS>EPSG:5759</SRS>
+      <SRS>EPSG:5760</SRS>
+      <SRS>EPSG:5761</SRS>
+      <SRS>EPSG:5762</SRS>
+      <SRS>EPSG:5763</SRS>
+      <SRS>EPSG:5764</SRS>
+      <SRS>EPSG:5765</SRS>
+      <SRS>EPSG:5766</SRS>
+      <SRS>EPSG:5767</SRS>
+      <SRS>EPSG:5768</SRS>
+      <SRS>EPSG:5769</SRS>
+      <SRS>EPSG:5770</SRS>
+      <SRS>EPSG:5771</SRS>
+      <SRS>EPSG:5772</SRS>
+      <SRS>EPSG:5773</SRS>
+      <SRS>EPSG:5774</SRS>
+      <SRS>EPSG:5775</SRS>
+      <SRS>EPSG:5776</SRS>
+      <SRS>EPSG:5777</SRS>
+      <SRS>EPSG:5778</SRS>
+      <SRS>EPSG:5779</SRS>
+      <SRS>EPSG:5780</SRS>
+      <SRS>EPSG:5781</SRS>
+      <SRS>EPSG:5782</SRS>
+      <SRS>EPSG:5783</SRS>
+      <SRS>EPSG:5784</SRS>
+      <SRS>EPSG:5785</SRS>
+      <SRS>EPSG:5786</SRS>
+      <SRS>EPSG:5787</SRS>
+      <SRS>EPSG:5788</SRS>
+      <SRS>EPSG:5789</SRS>
+      <SRS>EPSG:5790</SRS>
+      <SRS>EPSG:5791</SRS>
+      <SRS>EPSG:5792</SRS>
+      <SRS>EPSG:5793</SRS>
+      <SRS>EPSG:5794</SRS>
+      <SRS>EPSG:5795</SRS>
+      <SRS>EPSG:5796</SRS>
+      <SRS>EPSG:5797</SRS>
+      <SRS>EPSG:5798</SRS>
+      <SRS>EPSG:5799</SRS>
+      <SRS>EPSG:5800</SRS>
+      <SRS>EPSG:5801</SRS>
+      <SRS>EPSG:5802</SRS>
+      <SRS>EPSG:5803</SRS>
+      <SRS>EPSG:5804</SRS>
+      <SRS>EPSG:5805</SRS>
+      <SRS>EPSG:5806</SRS>
+      <SRS>EPSG:5807</SRS>
+      <SRS>EPSG:5808</SRS>
+      <SRS>EPSG:5809</SRS>
+      <SRS>EPSG:5810</SRS>
+      <SRS>EPSG:5811</SRS>
+      <SRS>EPSG:5812</SRS>
+      <SRS>EPSG:5813</SRS>
+      <SRS>EPSG:5814</SRS>
+      <SRS>EPSG:5815</SRS>
+      <SRS>EPSG:5816</SRS>
+      <SRS>EPSG:5817</SRS>
+      <SRS>EPSG:5818</SRS>
+      <SRS>EPSG:7400</SRS>
+      <SRS>EPSG:7401</SRS>
+      <SRS>EPSG:7402</SRS>
+      <SRS>EPSG:7403</SRS>
+      <SRS>EPSG:7404</SRS>
+      <SRS>EPSG:7405</SRS>
+      <SRS>EPSG:7406</SRS>
+      <SRS>EPSG:7407</SRS>
+      <SRS>EPSG:7408</SRS>
+      <SRS>EPSG:7409</SRS>
+      <SRS>EPSG:7410</SRS>
+      <SRS>EPSG:7411</SRS>
+      <SRS>EPSG:7412</SRS>
+      <SRS>EPSG:7413</SRS>
+      <SRS>EPSG:7414</SRS>
+      <SRS>EPSG:7415</SRS>
+      <SRS>EPSG:7416</SRS>
+      <SRS>EPSG:7417</SRS>
+      <SRS>EPSG:7418</SRS>
+      <SRS>EPSG:7419</SRS>
+      <SRS>EPSG:7420</SRS>
+      <SRS>EPSG:20004</SRS>
+      <SRS>EPSG:20005</SRS>
+      <SRS>EPSG:20006</SRS>
+      <SRS>EPSG:20007</SRS>
+      <SRS>EPSG:20008</SRS>
+      <SRS>EPSG:20009</SRS>
+      <SRS>EPSG:20010</SRS>
+      <SRS>EPSG:20011</SRS>
+      <SRS>EPSG:20012</SRS>
+      <SRS>EPSG:20013</SRS>
+      <SRS>EPSG:20014</SRS>
+      <SRS>EPSG:20015</SRS>
+      <SRS>EPSG:20016</SRS>
+      <SRS>EPSG:20017</SRS>
+      <SRS>EPSG:20018</SRS>
+      <SRS>EPSG:20019</SRS>
+      <SRS>EPSG:20020</SRS>
+      <SRS>EPSG:20021</SRS>
+      <SRS>EPSG:20022</SRS>
+      <SRS>EPSG:20023</SRS>
+      <SRS>EPSG:20024</SRS>
+      <SRS>EPSG:20025</SRS>
+      <SRS>EPSG:20026</SRS>
+      <SRS>EPSG:20027</SRS>
+      <SRS>EPSG:20028</SRS>
+      <SRS>EPSG:20029</SRS>
+      <SRS>EPSG:20030</SRS>
+      <SRS>EPSG:20031</SRS>
+      <SRS>EPSG:20032</SRS>
+      <SRS>EPSG:20064</SRS>
+      <SRS>EPSG:20065</SRS>
+      <SRS>EPSG:20066</SRS>
+      <SRS>EPSG:20067</SRS>
+      <SRS>EPSG:20068</SRS>
+      <SRS>EPSG:20069</SRS>
+      <SRS>EPSG:20070</SRS>
+      <SRS>EPSG:20071</SRS>
+      <SRS>EPSG:20072</SRS>
+      <SRS>EPSG:20073</SRS>
+      <SRS>EPSG:20074</SRS>
+      <SRS>EPSG:20075</SRS>
+      <SRS>EPSG:20076</SRS>
+      <SRS>EPSG:20077</SRS>
+      <SRS>EPSG:20078</SRS>
+      <SRS>EPSG:20079</SRS>
+      <SRS>EPSG:20080</SRS>
+      <SRS>EPSG:20081</SRS>
+      <SRS>EPSG:20082</SRS>
+      <SRS>EPSG:20083</SRS>
+      <SRS>EPSG:20084</SRS>
+      <SRS>EPSG:20085</SRS>
+      <SRS>EPSG:20086</SRS>
+      <SRS>EPSG:20087</SRS>
+      <SRS>EPSG:20088</SRS>
+      <SRS>EPSG:20089</SRS>
+      <SRS>EPSG:20090</SRS>
+      <SRS>EPSG:20091</SRS>
+      <SRS>EPSG:20092</SRS>
+      <SRS>EPSG:20135</SRS>
+      <SRS>EPSG:20136</SRS>
+      <SRS>EPSG:20137</SRS>
+      <SRS>EPSG:20138</SRS>
+      <SRS>EPSG:20248</SRS>
+      <SRS>EPSG:20249</SRS>
+      <SRS>EPSG:20250</SRS>
+      <SRS>EPSG:20251</SRS>
+      <SRS>EPSG:20252</SRS>
+      <SRS>EPSG:20253</SRS>
+      <SRS>EPSG:20254</SRS>
+      <SRS>EPSG:20255</SRS>
+      <SRS>EPSG:20256</SRS>
+      <SRS>EPSG:20257</SRS>
+      <SRS>EPSG:20258</SRS>
+      <SRS>EPSG:20348</SRS>
+      <SRS>EPSG:20349</SRS>
+      <SRS>EPSG:20350</SRS>
+      <SRS>EPSG:20351</SRS>
+      <SRS>EPSG:20352</SRS>
+      <SRS>EPSG:20353</SRS>
+      <SRS>EPSG:20354</SRS>
+      <SRS>EPSG:20355</SRS>
+      <SRS>EPSG:20356</SRS>
+      <SRS>EPSG:20357</SRS>
+      <SRS>EPSG:20358</SRS>
+      <SRS>EPSG:20436</SRS>
+      <SRS>EPSG:20437</SRS>
+      <SRS>EPSG:20438</SRS>
+      <SRS>EPSG:20439</SRS>
+      <SRS>EPSG:20440</SRS>
+      <SRS>EPSG:20499</SRS>
+      <SRS>EPSG:20538</SRS>
+      <SRS>EPSG:20539</SRS>
+      <SRS>EPSG:20790</SRS>
+      <SRS>EPSG:20791</SRS>
+      <SRS>EPSG:20822</SRS>
+      <SRS>EPSG:20823</SRS>
+      <SRS>EPSG:20824</SRS>
+      <SRS>EPSG:20934</SRS>
+      <SRS>EPSG:20935</SRS>
+      <SRS>EPSG:20936</SRS>
+      <SRS>EPSG:21035</SRS>
+      <SRS>EPSG:21036</SRS>
+      <SRS>EPSG:21037</SRS>
+      <SRS>EPSG:21095</SRS>
+      <SRS>EPSG:21096</SRS>
+      <SRS>EPSG:21097</SRS>
+      <SRS>EPSG:21100</SRS>
+      <SRS>EPSG:21148</SRS>
+      <SRS>EPSG:21149</SRS>
+      <SRS>EPSG:21150</SRS>
+      <SRS>EPSG:21291</SRS>
+      <SRS>EPSG:21292</SRS>
+      <SRS>EPSG:21413</SRS>
+      <SRS>EPSG:21414</SRS>
+      <SRS>EPSG:21415</SRS>
+      <SRS>EPSG:21416</SRS>
+      <SRS>EPSG:21417</SRS>
+      <SRS>EPSG:21418</SRS>
+      <SRS>EPSG:21419</SRS>
+      <SRS>EPSG:21420</SRS>
+      <SRS>EPSG:21421</SRS>
+      <SRS>EPSG:21422</SRS>
+      <SRS>EPSG:21423</SRS>
+      <SRS>EPSG:21453</SRS>
+      <SRS>EPSG:21454</SRS>
+      <SRS>EPSG:21455</SRS>
+      <SRS>EPSG:21456</SRS>
+      <SRS>EPSG:21457</SRS>
+      <SRS>EPSG:21458</SRS>
+      <SRS>EPSG:21459</SRS>
+      <SRS>EPSG:21460</SRS>
+      <SRS>EPSG:21461</SRS>
+      <SRS>EPSG:21462</SRS>
+      <SRS>EPSG:21463</SRS>
+      <SRS>EPSG:21473</SRS>
+      <SRS>EPSG:21474</SRS>
+      <SRS>EPSG:21475</SRS>
+      <SRS>EPSG:21476</SRS>
+      <SRS>EPSG:21477</SRS>
+      <SRS>EPSG:21478</SRS>
+      <SRS>EPSG:21479</SRS>
+      <SRS>EPSG:21480</SRS>
+      <SRS>EPSG:21481</SRS>
+      <SRS>EPSG:21482</SRS>
+      <SRS>EPSG:21483</SRS>
+      <SRS>EPSG:21500</SRS>
+      <SRS>EPSG:21780</SRS>
+      <SRS>EPSG:21781</SRS>
+      <SRS>EPSG:21817</SRS>
+      <SRS>EPSG:21818</SRS>
+      <SRS>EPSG:21891</SRS>
+      <SRS>EPSG:21892</SRS>
+      <SRS>EPSG:21893</SRS>
+      <SRS>EPSG:21894</SRS>
+      <SRS>EPSG:21896</SRS>
+      <SRS>EPSG:21897</SRS>
+      <SRS>EPSG:21898</SRS>
+      <SRS>EPSG:21899</SRS>
+      <SRS>EPSG:22032</SRS>
+      <SRS>EPSG:22033</SRS>
+      <SRS>EPSG:22091</SRS>
+      <SRS>EPSG:22092</SRS>
+      <SRS>EPSG:22171</SRS>
+      <SRS>EPSG:22172</SRS>
+      <SRS>EPSG:22173</SRS>
+      <SRS>EPSG:22174</SRS>
+      <SRS>EPSG:22175</SRS>
+      <SRS>EPSG:22176</SRS>
+      <SRS>EPSG:22177</SRS>
+      <SRS>EPSG:22181</SRS>
+      <SRS>EPSG:22182</SRS>
+      <SRS>EPSG:22183</SRS>
+      <SRS>EPSG:22184</SRS>
+      <SRS>EPSG:22185</SRS>
+      <SRS>EPSG:22186</SRS>
+      <SRS>EPSG:22187</SRS>
+      <SRS>EPSG:22191</SRS>
+      <SRS>EPSG:22192</SRS>
+      <SRS>EPSG:22193</SRS>
+      <SRS>EPSG:22194</SRS>
+      <SRS>EPSG:22195</SRS>
+      <SRS>EPSG:22196</SRS>
+      <SRS>EPSG:22197</SRS>
+      <SRS>EPSG:22234</SRS>
+      <SRS>EPSG:22235</SRS>
+      <SRS>EPSG:22236</SRS>
+      <SRS>EPSG:22275</SRS>
+      <SRS>EPSG:22277</SRS>
+      <SRS>EPSG:22279</SRS>
+      <SRS>EPSG:22281</SRS>
+      <SRS>EPSG:22283</SRS>
+      <SRS>EPSG:22285</SRS>
+      <SRS>EPSG:22287</SRS>
+      <SRS>EPSG:22289</SRS>
+      <SRS>EPSG:22291</SRS>
+      <SRS>EPSG:22293</SRS>
+      <SRS>EPSG:22300</SRS>
+      <SRS>EPSG:22332</SRS>
+      <SRS>EPSG:22391</SRS>
+      <SRS>EPSG:22392</SRS>
+      <SRS>EPSG:22521</SRS>
+      <SRS>EPSG:22522</SRS>
+      <SRS>EPSG:22523</SRS>
+      <SRS>EPSG:22524</SRS>
+      <SRS>EPSG:22525</SRS>
+      <SRS>EPSG:22700</SRS>
+      <SRS>EPSG:22770</SRS>
+      <SRS>EPSG:22780</SRS>
+      <SRS>EPSG:22832</SRS>
+      <SRS>EPSG:22991</SRS>
+      <SRS>EPSG:22992</SRS>
+      <SRS>EPSG:22993</SRS>
+      <SRS>EPSG:22994</SRS>
+      <SRS>EPSG:23028</SRS>
+      <SRS>EPSG:23029</SRS>
+      <SRS>EPSG:23030</SRS>
+      <SRS>EPSG:23031</SRS>
+      <SRS>EPSG:23032</SRS>
+      <SRS>EPSG:23033</SRS>
+      <SRS>EPSG:23034</SRS>
+      <SRS>EPSG:23035</SRS>
+      <SRS>EPSG:23036</SRS>
+      <SRS>EPSG:23037</SRS>
+      <SRS>EPSG:23038</SRS>
+      <SRS>EPSG:23090</SRS>
+      <SRS>EPSG:23095</SRS>
+      <SRS>EPSG:23239</SRS>
+      <SRS>EPSG:23240</SRS>
+      <SRS>EPSG:23433</SRS>
+      <SRS>EPSG:23700</SRS>
+      <SRS>EPSG:23846</SRS>
+      <SRS>EPSG:23847</SRS>
+      <SRS>EPSG:23848</SRS>
+      <SRS>EPSG:23849</SRS>
+      <SRS>EPSG:23850</SRS>
+      <SRS>EPSG:23851</SRS>
+      <SRS>EPSG:23852</SRS>
+      <SRS>EPSG:23853</SRS>
+      <SRS>EPSG:23866</SRS>
+      <SRS>EPSG:23867</SRS>
+      <SRS>EPSG:23868</SRS>
+      <SRS>EPSG:23869</SRS>
+      <SRS>EPSG:23870</SRS>
+      <SRS>EPSG:23871</SRS>
+      <SRS>EPSG:23872</SRS>
+      <SRS>EPSG:23877</SRS>
+      <SRS>EPSG:23878</SRS>
+      <SRS>EPSG:23879</SRS>
+      <SRS>EPSG:23880</SRS>
+      <SRS>EPSG:23881</SRS>
+      <SRS>EPSG:23882</SRS>
+      <SRS>EPSG:23883</SRS>
+      <SRS>EPSG:23884</SRS>
+      <SRS>EPSG:23886</SRS>
+      <SRS>EPSG:23887</SRS>
+      <SRS>EPSG:23888</SRS>
+      <SRS>EPSG:23889</SRS>
+      <SRS>EPSG:23890</SRS>
+      <SRS>EPSG:23891</SRS>
+      <SRS>EPSG:23892</SRS>
+      <SRS>EPSG:23893</SRS>
+      <SRS>EPSG:23894</SRS>
+      <SRS>EPSG:23946</SRS>
+      <SRS>EPSG:23947</SRS>
+      <SRS>EPSG:23948</SRS>
+      <SRS>EPSG:24047</SRS>
+      <SRS>EPSG:24048</SRS>
+      <SRS>EPSG:24100</SRS>
+      <SRS>EPSG:24200</SRS>
+      <SRS>EPSG:24305</SRS>
+      <SRS>EPSG:24306</SRS>
+      <SRS>EPSG:24311</SRS>
+      <SRS>EPSG:24312</SRS>
+      <SRS>EPSG:24313</SRS>
+      <SRS>EPSG:24342</SRS>
+      <SRS>EPSG:24343</SRS>
+      <SRS>EPSG:24344</SRS>
+      <SRS>EPSG:24345</SRS>
+      <SRS>EPSG:24346</SRS>
+      <SRS>EPSG:24347</SRS>
+      <SRS>EPSG:24370</SRS>
+      <SRS>EPSG:24371</SRS>
+      <SRS>EPSG:24372</SRS>
+      <SRS>EPSG:24373</SRS>
+      <SRS>EPSG:24374</SRS>
+      <SRS>EPSG:24375</SRS>
+      <SRS>EPSG:24376</SRS>
+      <SRS>EPSG:24377</SRS>
+      <SRS>EPSG:24378</SRS>
+      <SRS>EPSG:24379</SRS>
+      <SRS>EPSG:24380</SRS>
+      <SRS>EPSG:24381</SRS>
+      <SRS>EPSG:24382</SRS>
+      <SRS>EPSG:24383</SRS>
+      <SRS>EPSG:24500</SRS>
+      <SRS>EPSG:24547</SRS>
+      <SRS>EPSG:24548</SRS>
+      <SRS>EPSG:24571</SRS>
+      <SRS>EPSG:24600</SRS>
+      <SRS>EPSG:24718</SRS>
+      <SRS>EPSG:24719</SRS>
+      <SRS>EPSG:24720</SRS>
+      <SRS>EPSG:24817</SRS>
+      <SRS>EPSG:24818</SRS>
+      <SRS>EPSG:24819</SRS>
+      <SRS>EPSG:24820</SRS>
+      <SRS>EPSG:24821</SRS>
+      <SRS>EPSG:24877</SRS>
+      <SRS>EPSG:24878</SRS>
+      <SRS>EPSG:24879</SRS>
+      <SRS>EPSG:24880</SRS>
+      <SRS>EPSG:24881</SRS>
+      <SRS>EPSG:24882</SRS>
+      <SRS>EPSG:24891</SRS>
+      <SRS>EPSG:24892</SRS>
+      <SRS>EPSG:24893</SRS>
+      <SRS>EPSG:25000</SRS>
+      <SRS>EPSG:25231</SRS>
+      <SRS>EPSG:25391</SRS>
+      <SRS>EPSG:25392</SRS>
+      <SRS>EPSG:25393</SRS>
+      <SRS>EPSG:25394</SRS>
+      <SRS>EPSG:25395</SRS>
+      <SRS>EPSG:25700</SRS>
+      <SRS>EPSG:25828</SRS>
+      <SRS>EPSG:25829</SRS>
+      <SRS>EPSG:25830</SRS>
+      <SRS>EPSG:25831</SRS>
+      <SRS>EPSG:25832</SRS>
+      <SRS>EPSG:25833</SRS>
+      <SRS>EPSG:25834</SRS>
+      <SRS>EPSG:25835</SRS>
+      <SRS>EPSG:25836</SRS>
+      <SRS>EPSG:25837</SRS>
+      <SRS>EPSG:25838</SRS>
+      <SRS>EPSG:25884</SRS>
+      <SRS>EPSG:25932</SRS>
+      <SRS>EPSG:26191</SRS>
+      <SRS>EPSG:26192</SRS>
+      <SRS>EPSG:26193</SRS>
+      <SRS>EPSG:26194</SRS>
+      <SRS>EPSG:26195</SRS>
+      <SRS>EPSG:26237</SRS>
+      <SRS>EPSG:26331</SRS>
+      <SRS>EPSG:26332</SRS>
+      <SRS>EPSG:26391</SRS>
+      <SRS>EPSG:26392</SRS>
+      <SRS>EPSG:26393</SRS>
+      <SRS>EPSG:26432</SRS>
+      <SRS>EPSG:26591</SRS>
+      <SRS>EPSG:26592</SRS>
+      <SRS>EPSG:26632</SRS>
+      <SRS>EPSG:26692</SRS>
+      <SRS>EPSG:26701</SRS>
+      <SRS>EPSG:26702</SRS>
+      <SRS>EPSG:26703</SRS>
+      <SRS>EPSG:26704</SRS>
+      <SRS>EPSG:26705</SRS>
+      <SRS>EPSG:26706</SRS>
+      <SRS>EPSG:26707</SRS>
+      <SRS>EPSG:26708</SRS>
+      <SRS>EPSG:26709</SRS>
+      <SRS>EPSG:26710</SRS>
+      <SRS>EPSG:26711</SRS>
+      <SRS>EPSG:26712</SRS>
+      <SRS>EPSG:26713</SRS>
+      <SRS>EPSG:26714</SRS>
+      <SRS>EPSG:26715</SRS>
+      <SRS>EPSG:26716</SRS>
+      <SRS>EPSG:26717</SRS>
+      <SRS>EPSG:26718</SRS>
+      <SRS>EPSG:26719</SRS>
+      <SRS>EPSG:26720</SRS>
+      <SRS>EPSG:26721</SRS>
+      <SRS>EPSG:26722</SRS>
+      <SRS>EPSG:26729</SRS>
+      <SRS>EPSG:26730</SRS>
+      <SRS>EPSG:26731</SRS>
+      <SRS>EPSG:26732</SRS>
+      <SRS>EPSG:26733</SRS>
+      <SRS>EPSG:26734</SRS>
+      <SRS>EPSG:26735</SRS>
+      <SRS>EPSG:26736</SRS>
+      <SRS>EPSG:26737</SRS>
+      <SRS>EPSG:26738</SRS>
+      <SRS>EPSG:26739</SRS>
+      <SRS>EPSG:26740</SRS>
+      <SRS>EPSG:26741</SRS>
+      <SRS>EPSG:26742</SRS>
+      <SRS>EPSG:26743</SRS>
+      <SRS>EPSG:26744</SRS>
+      <SRS>EPSG:26745</SRS>
+      <SRS>EPSG:26746</SRS>
+      <SRS>EPSG:26747</SRS>
+      <SRS>EPSG:26748</SRS>
+      <SRS>EPSG:26749</SRS>
+      <SRS>EPSG:26750</SRS>
+      <SRS>EPSG:26751</SRS>
+      <SRS>EPSG:26752</SRS>
+      <SRS>EPSG:26753</SRS>
+      <SRS>EPSG:26754</SRS>
+      <SRS>EPSG:26755</SRS>
+      <SRS>EPSG:26756</SRS>
+      <SRS>EPSG:26757</SRS>
+      <SRS>EPSG:26758</SRS>
+      <SRS>EPSG:26759</SRS>
+      <SRS>EPSG:26760</SRS>
+      <SRS>EPSG:26766</SRS>
+      <SRS>EPSG:26767</SRS>
+      <SRS>EPSG:26768</SRS>
+      <SRS>EPSG:26769</SRS>
+      <SRS>EPSG:26770</SRS>
+      <SRS>EPSG:26771</SRS>
+      <SRS>EPSG:26772</SRS>
+      <SRS>EPSG:26773</SRS>
+      <SRS>EPSG:26774</SRS>
+      <SRS>EPSG:26775</SRS>
+      <SRS>EPSG:26776</SRS>
+      <SRS>EPSG:26777</SRS>
+      <SRS>EPSG:26778</SRS>
+      <SRS>EPSG:26779</SRS>
+      <SRS>EPSG:26780</SRS>
+      <SRS>EPSG:26781</SRS>
+      <SRS>EPSG:26782</SRS>
+      <SRS>EPSG:26783</SRS>
+      <SRS>EPSG:26784</SRS>
+      <SRS>EPSG:26785</SRS>
+      <SRS>EPSG:26786</SRS>
+      <SRS>EPSG:26787</SRS>
+      <SRS>EPSG:26791</SRS>
+      <SRS>EPSG:26792</SRS>
+      <SRS>EPSG:26793</SRS>
+      <SRS>EPSG:26794</SRS>
+      <SRS>EPSG:26795</SRS>
+      <SRS>EPSG:26796</SRS>
+      <SRS>EPSG:26797</SRS>
+      <SRS>EPSG:26798</SRS>
+      <SRS>EPSG:26799</SRS>
+      <SRS>EPSG:26801</SRS>
+      <SRS>EPSG:26802</SRS>
+      <SRS>EPSG:26803</SRS>
+      <SRS>EPSG:26811</SRS>
+      <SRS>EPSG:26812</SRS>
+      <SRS>EPSG:26813</SRS>
+      <SRS>EPSG:26901</SRS>
+      <SRS>EPSG:26902</SRS>
+      <SRS>EPSG:26903</SRS>
+      <SRS>EPSG:26904</SRS>
+      <SRS>EPSG:26905</SRS>
+      <SRS>EPSG:26906</SRS>
+      <SRS>EPSG:26907</SRS>
+      <SRS>EPSG:26908</SRS>
+      <SRS>EPSG:26909</SRS>
+      <SRS>EPSG:26910</SRS>
+      <SRS>EPSG:26911</SRS>
+      <SRS>EPSG:26912</SRS>
+      <SRS>EPSG:26913</SRS>
+      <SRS>EPSG:26914</SRS>
+      <SRS>EPSG:26915</SRS>
+      <SRS>EPSG:26916</SRS>
+      <SRS>EPSG:26917</SRS>
+      <SRS>EPSG:26918</SRS>
+      <SRS>EPSG:26919</SRS>
+      <SRS>EPSG:26920</SRS>
+      <SRS>EPSG:26921</SRS>
+      <SRS>EPSG:26922</SRS>
+      <SRS>EPSG:26923</SRS>
+      <SRS>EPSG:26929</SRS>
+      <SRS>EPSG:26930</SRS>
+      <SRS>EPSG:26931</SRS>
+      <SRS>EPSG:26932</SRS>
+      <SRS>EPSG:26933</SRS>
+      <SRS>EPSG:26934</SRS>
+      <SRS>EPSG:26935</SRS>
+      <SRS>EPSG:26936</SRS>
+      <SRS>EPSG:26937</SRS>
+      <SRS>EPSG:26938</SRS>
+      <SRS>EPSG:26939</SRS>
+      <SRS>EPSG:26940</SRS>
+      <SRS>EPSG:26941</SRS>
+      <SRS>EPSG:26942</SRS>
+      <SRS>EPSG:26943</SRS>
+      <SRS>EPSG:26944</SRS>
+      <SRS>EPSG:26945</SRS>
+      <SRS>EPSG:26946</SRS>
+      <SRS>EPSG:26948</SRS>
+      <SRS>EPSG:26949</SRS>
+      <SRS>EPSG:26950</SRS>
+      <SRS>EPSG:26951</SRS>
+      <SRS>EPSG:26952</SRS>
+      <SRS>EPSG:26953</SRS>
+      <SRS>EPSG:26954</SRS>
+      <SRS>EPSG:26955</SRS>
+      <SRS>EPSG:26956</SRS>
+      <SRS>EPSG:26957</SRS>
+      <SRS>EPSG:26958</SRS>
+      <SRS>EPSG:26959</SRS>
+      <SRS>EPSG:26960</SRS>
+      <SRS>EPSG:26961</SRS>
+      <SRS>EPSG:26962</SRS>
+      <SRS>EPSG:26963</SRS>
+      <SRS>EPSG:26964</SRS>
+      <SRS>EPSG:26965</SRS>
+      <SRS>EPSG:26966</SRS>
+      <SRS>EPSG:26967</SRS>
+      <SRS>EPSG:26968</SRS>
+      <SRS>EPSG:26969</SRS>
+      <SRS>EPSG:26970</SRS>
+      <SRS>EPSG:26971</SRS>
+      <SRS>EPSG:26972</SRS>
+      <SRS>EPSG:26973</SRS>
+      <SRS>EPSG:26974</SRS>
+      <SRS>EPSG:26975</SRS>
+      <SRS>EPSG:26976</SRS>
+      <SRS>EPSG:26977</SRS>
+      <SRS>EPSG:26978</SRS>
+      <SRS>EPSG:26979</SRS>
+      <SRS>EPSG:26980</SRS>
+      <SRS>EPSG:26981</SRS>
+      <SRS>EPSG:26982</SRS>
+      <SRS>EPSG:26983</SRS>
+      <SRS>EPSG:26984</SRS>
+      <SRS>EPSG:26985</SRS>
+      <SRS>EPSG:26986</SRS>
+      <SRS>EPSG:26987</SRS>
+      <SRS>EPSG:26988</SRS>
+      <SRS>EPSG:26989</SRS>
+      <SRS>EPSG:26990</SRS>
+      <SRS>EPSG:26991</SRS>
+      <SRS>EPSG:26992</SRS>
+      <SRS>EPSG:26993</SRS>
+      <SRS>EPSG:26994</SRS>
+      <SRS>EPSG:26995</SRS>
+      <SRS>EPSG:26996</SRS>
+      <SRS>EPSG:26997</SRS>
+      <SRS>EPSG:26998</SRS>
+      <SRS>EPSG:27037</SRS>
+      <SRS>EPSG:27038</SRS>
+      <SRS>EPSG:27039</SRS>
+      <SRS>EPSG:27040</SRS>
+      <SRS>EPSG:27120</SRS>
+      <SRS>EPSG:27200</SRS>
+      <SRS>EPSG:27205</SRS>
+      <SRS>EPSG:27206</SRS>
+      <SRS>EPSG:27207</SRS>
+      <SRS>EPSG:27208</SRS>
+      <SRS>EPSG:27209</SRS>
+      <SRS>EPSG:27210</SRS>
+      <SRS>EPSG:27211</SRS>
+      <SRS>EPSG:27212</SRS>
+      <SRS>EPSG:27213</SRS>
+      <SRS>EPSG:27214</SRS>
+      <SRS>EPSG:27215</SRS>
+      <SRS>EPSG:27216</SRS>
+      <SRS>EPSG:27217</SRS>
+      <SRS>EPSG:27218</SRS>
+      <SRS>EPSG:27219</SRS>
+      <SRS>EPSG:27220</SRS>
+      <SRS>EPSG:27221</SRS>
+      <SRS>EPSG:27222</SRS>
+      <SRS>EPSG:27223</SRS>
+      <SRS>EPSG:27224</SRS>
+      <SRS>EPSG:27225</SRS>
+      <SRS>EPSG:27226</SRS>
+      <SRS>EPSG:27227</SRS>
+      <SRS>EPSG:27228</SRS>
+      <SRS>EPSG:27229</SRS>
+      <SRS>EPSG:27230</SRS>
+      <SRS>EPSG:27231</SRS>
+      <SRS>EPSG:27232</SRS>
+      <SRS>EPSG:27258</SRS>
+      <SRS>EPSG:27259</SRS>
+      <SRS>EPSG:27260</SRS>
+      <SRS>EPSG:27291</SRS>
+      <SRS>EPSG:27292</SRS>
+      <SRS>EPSG:27391</SRS>
+      <SRS>EPSG:27392</SRS>
+      <SRS>EPSG:27393</SRS>
+      <SRS>EPSG:27394</SRS>
+      <SRS>EPSG:27395</SRS>
+      <SRS>EPSG:27396</SRS>
+      <SRS>EPSG:27397</SRS>
+      <SRS>EPSG:27398</SRS>
+      <SRS>EPSG:27429</SRS>
+      <SRS>EPSG:27492</SRS>
+      <SRS>EPSG:27500</SRS>
+      <SRS>EPSG:27561</SRS>
+      <SRS>EPSG:27562</SRS>
+      <SRS>EPSG:27563</SRS>
+      <SRS>EPSG:27564</SRS>
+      <SRS>EPSG:27571</SRS>
+      <SRS>EPSG:27572</SRS>
+      <SRS>EPSG:27573</SRS>
+      <SRS>EPSG:27574</SRS>
+      <SRS>EPSG:27581</SRS>
+      <SRS>EPSG:27582</SRS>
+      <SRS>EPSG:27583</SRS>
+      <SRS>EPSG:27584</SRS>
+      <SRS>EPSG:27591</SRS>
+      <SRS>EPSG:27592</SRS>
+      <SRS>EPSG:27593</SRS>
+      <SRS>EPSG:27594</SRS>
+      <SRS>EPSG:27700</SRS>
+      <SRS>EPSG:28191</SRS>
+      <SRS>EPSG:28192</SRS>
+      <SRS>EPSG:28193</SRS>
+      <SRS>EPSG:28232</SRS>
+      <SRS>EPSG:28348</SRS>
+      <SRS>EPSG:28349</SRS>
+      <SRS>EPSG:28350</SRS>
+      <SRS>EPSG:28351</SRS>
+      <SRS>EPSG:28352</SRS>
+      <SRS>EPSG:28353</SRS>
+      <SRS>EPSG:28354</SRS>
+      <SRS>EPSG:28355</SRS>
+      <SRS>EPSG:28356</SRS>
+      <SRS>EPSG:28357</SRS>
+      <SRS>EPSG:28358</SRS>
+      <SRS>EPSG:28402</SRS>
+      <SRS>EPSG:28403</SRS>
+      <SRS>EPSG:28404</SRS>
+      <SRS>EPSG:28405</SRS>
+      <SRS>EPSG:28406</SRS>
+      <SRS>EPSG:28407</SRS>
+      <SRS>EPSG:28408</SRS>
+      <SRS>EPSG:28409</SRS>
+      <SRS>EPSG:28410</SRS>
+      <SRS>EPSG:28411</SRS>
+      <SRS>EPSG:28412</SRS>
+      <SRS>EPSG:28413</SRS>
+      <SRS>EPSG:28414</SRS>
+      <SRS>EPSG:28415</SRS>
+      <SRS>EPSG:28416</SRS>
+      <SRS>EPSG:28417</SRS>
+      <SRS>EPSG:28418</SRS>
+      <SRS>EPSG:28419</SRS>
+      <SRS>EPSG:28420</SRS>
+      <SRS>EPSG:28421</SRS>
+      <SRS>EPSG:28422</SRS>
+      <SRS>EPSG:28423</SRS>
+      <SRS>EPSG:28424</SRS>
+      <SRS>EPSG:28425</SRS>
+      <SRS>EPSG:28426</SRS>
+      <SRS>EPSG:28427</SRS>
+      <SRS>EPSG:28428</SRS>
+      <SRS>EPSG:28429</SRS>
+      <SRS>EPSG:28430</SRS>
+      <SRS>EPSG:28431</SRS>
+      <SRS>EPSG:28432</SRS>
+      <SRS>EPSG:28462</SRS>
+      <SRS>EPSG:28463</SRS>
+      <SRS>EPSG:28464</SRS>
+      <SRS>EPSG:28465</SRS>
+      <SRS>EPSG:28466</SRS>
+      <SRS>EPSG:28467</SRS>
+      <SRS>EPSG:28468</SRS>
+      <SRS>EPSG:28469</SRS>
+      <SRS>EPSG:28470</SRS>
+      <SRS>EPSG:28471</SRS>
+      <SRS>EPSG:28472</SRS>
+      <SRS>EPSG:28473</SRS>
+      <SRS>EPSG:28474</SRS>
+      <SRS>EPSG:28475</SRS>
+      <SRS>EPSG:28476</SRS>
+      <SRS>EPSG:28477</SRS>
+      <SRS>EPSG:28478</SRS>
+      <SRS>EPSG:28479</SRS>
+      <SRS>EPSG:28480</SRS>
+      <SRS>EPSG:28481</SRS>
+      <SRS>EPSG:28482</SRS>
+      <SRS>EPSG:28483</SRS>
+      <SRS>EPSG:28484</SRS>
+      <SRS>EPSG:28485</SRS>
+      <SRS>EPSG:28486</SRS>
+      <SRS>EPSG:28487</SRS>
+      <SRS>EPSG:28488</SRS>
+      <SRS>EPSG:28489</SRS>
+      <SRS>EPSG:28490</SRS>
+      <SRS>EPSG:28491</SRS>
+      <SRS>EPSG:28492</SRS>
+      <SRS>EPSG:28600</SRS>
+      <SRS>EPSG:28991</SRS>
+      <SRS>EPSG:28992</SRS>
+      <SRS>EPSG:29100</SRS>
+      <SRS>EPSG:29101</SRS>
+      <SRS>EPSG:29118</SRS>
+      <SRS>EPSG:29119</SRS>
+      <SRS>EPSG:29120</SRS>
+      <SRS>EPSG:29121</SRS>
+      <SRS>EPSG:29122</SRS>
+      <SRS>EPSG:29168</SRS>
+      <SRS>EPSG:29169</SRS>
+      <SRS>EPSG:29170</SRS>
+      <SRS>EPSG:29171</SRS>
+      <SRS>EPSG:29172</SRS>
+      <SRS>EPSG:29177</SRS>
+      <SRS>EPSG:29178</SRS>
+      <SRS>EPSG:29179</SRS>
+      <SRS>EPSG:29180</SRS>
+      <SRS>EPSG:29181</SRS>
+      <SRS>EPSG:29182</SRS>
+      <SRS>EPSG:29183</SRS>
+      <SRS>EPSG:29184</SRS>
+      <SRS>EPSG:29185</SRS>
+      <SRS>EPSG:29187</SRS>
+      <SRS>EPSG:29188</SRS>
+      <SRS>EPSG:29189</SRS>
+      <SRS>EPSG:29190</SRS>
+      <SRS>EPSG:29191</SRS>
+      <SRS>EPSG:29192</SRS>
+      <SRS>EPSG:29193</SRS>
+      <SRS>EPSG:29194</SRS>
+      <SRS>EPSG:29195</SRS>
+      <SRS>EPSG:29220</SRS>
+      <SRS>EPSG:29221</SRS>
+      <SRS>EPSG:29333</SRS>
+      <SRS>EPSG:29371</SRS>
+      <SRS>EPSG:29373</SRS>
+      <SRS>EPSG:29375</SRS>
+      <SRS>EPSG:29377</SRS>
+      <SRS>EPSG:29379</SRS>
+      <SRS>EPSG:29381</SRS>
+      <SRS>EPSG:29383</SRS>
+      <SRS>EPSG:29385</SRS>
+      <SRS>EPSG:29635</SRS>
+      <SRS>EPSG:29636</SRS>
+      <SRS>EPSG:29700</SRS>
+      <SRS>EPSG:29701</SRS>
+      <SRS>EPSG:29702</SRS>
+      <SRS>EPSG:29738</SRS>
+      <SRS>EPSG:29739</SRS>
+      <SRS>EPSG:29849</SRS>
+      <SRS>EPSG:29850</SRS>
+      <SRS>EPSG:29871</SRS>
+      <SRS>EPSG:29872</SRS>
+      <SRS>EPSG:29873</SRS>
+      <SRS>EPSG:29900</SRS>
+      <SRS>EPSG:29901</SRS>
+      <SRS>EPSG:29902</SRS>
+      <SRS>EPSG:29903</SRS>
+      <SRS>EPSG:30161</SRS>
+      <SRS>EPSG:30162</SRS>
+      <SRS>EPSG:30163</SRS>
+      <SRS>EPSG:30164</SRS>
+      <SRS>EPSG:30165</SRS>
+      <SRS>EPSG:30166</SRS>
+      <SRS>EPSG:30167</SRS>
+      <SRS>EPSG:30168</SRS>
+      <SRS>EPSG:30169</SRS>
+      <SRS>EPSG:30170</SRS>
+      <SRS>EPSG:30171</SRS>
+      <SRS>EPSG:30172</SRS>
+      <SRS>EPSG:30173</SRS>
+      <SRS>EPSG:30174</SRS>
+      <SRS>EPSG:30175</SRS>
+      <SRS>EPSG:30176</SRS>
+      <SRS>EPSG:30177</SRS>
+      <SRS>EPSG:30178</SRS>
+      <SRS>EPSG:30179</SRS>
+      <SRS>EPSG:30200</SRS>
+      <SRS>EPSG:30339</SRS>
+      <SRS>EPSG:30340</SRS>
+      <SRS>EPSG:30491</SRS>
+      <SRS>EPSG:30492</SRS>
+      <SRS>EPSG:30493</SRS>
+      <SRS>EPSG:30494</SRS>
+      <SRS>EPSG:30729</SRS>
+      <SRS>EPSG:30730</SRS>
+      <SRS>EPSG:30731</SRS>
+      <SRS>EPSG:30732</SRS>
+      <SRS>EPSG:30791</SRS>
+      <SRS>EPSG:30792</SRS>
+      <SRS>EPSG:30800</SRS>
+      <SRS>EPSG:31028</SRS>
+      <SRS>EPSG:31121</SRS>
+      <SRS>EPSG:31154</SRS>
+      <SRS>EPSG:31170</SRS>
+      <SRS>EPSG:31171</SRS>
+      <SRS>EPSG:31251</SRS>
+      <SRS>EPSG:31252</SRS>
+      <SRS>EPSG:31253</SRS>
+      <SRS>EPSG:31254</SRS>
+      <SRS>EPSG:31255</SRS>
+      <SRS>EPSG:31256</SRS>
+      <SRS>EPSG:31257</SRS>
+      <SRS>EPSG:31258</SRS>
+      <SRS>EPSG:31259</SRS>
+      <SRS>EPSG:31265</SRS>
+      <SRS>EPSG:31266</SRS>
+      <SRS>EPSG:31267</SRS>
+      <SRS>EPSG:31268</SRS>
+      <SRS>EPSG:31275</SRS>
+      <SRS>EPSG:31276</SRS>
+      <SRS>EPSG:31277</SRS>
+      <SRS>EPSG:31278</SRS>
+      <SRS>EPSG:31279</SRS>
+      <SRS>EPSG:31281</SRS>
+      <SRS>EPSG:31282</SRS>
+      <SRS>EPSG:31283</SRS>
+      <SRS>EPSG:31284</SRS>
+      <SRS>EPSG:31285</SRS>
+      <SRS>EPSG:31286</SRS>
+      <SRS>EPSG:31287</SRS>
+      <SRS>EPSG:31288</SRS>
+      <SRS>EPSG:31289</SRS>
+      <SRS>EPSG:31290</SRS>
+      <SRS>EPSG:31291</SRS>
+      <SRS>EPSG:31292</SRS>
+      <SRS>EPSG:31293</SRS>
+      <SRS>EPSG:31294</SRS>
+      <SRS>EPSG:31295</SRS>
+      <SRS>EPSG:31296</SRS>
+      <SRS>EPSG:31297</SRS>
+      <SRS>EPSG:31300</SRS>
+      <SRS>EPSG:31370</SRS>
+      <SRS>EPSG:31461</SRS>
+      <SRS>EPSG:31462</SRS>
+      <SRS>EPSG:31463</SRS>
+      <SRS>EPSG:31464</SRS>
+      <SRS>EPSG:31465</SRS>
+      <SRS>EPSG:31466</SRS>
+      <SRS>EPSG:31467</SRS>
+      <SRS>EPSG:31468</SRS>
+      <SRS>EPSG:31469</SRS>
+      <SRS>EPSG:31528</SRS>
+      <SRS>EPSG:31529</SRS>
+      <SRS>EPSG:31600</SRS>
+      <SRS>EPSG:31700</SRS>
+      <SRS>EPSG:31838</SRS>
+      <SRS>EPSG:31839</SRS>
+      <SRS>EPSG:31900</SRS>
+      <SRS>EPSG:31901</SRS>
+      <SRS>EPSG:31965</SRS>
+      <SRS>EPSG:31966</SRS>
+      <SRS>EPSG:31967</SRS>
+      <SRS>EPSG:31968</SRS>
+      <SRS>EPSG:31969</SRS>
+      <SRS>EPSG:31970</SRS>
+      <SRS>EPSG:31971</SRS>
+      <SRS>EPSG:31972</SRS>
+      <SRS>EPSG:31973</SRS>
+      <SRS>EPSG:31974</SRS>
+      <SRS>EPSG:31975</SRS>
+      <SRS>EPSG:31976</SRS>
+      <SRS>EPSG:31977</SRS>
+      <SRS>EPSG:31978</SRS>
+      <SRS>EPSG:31979</SRS>
+      <SRS>EPSG:31980</SRS>
+      <SRS>EPSG:31981</SRS>
+      <SRS>EPSG:31982</SRS>
+      <SRS>EPSG:31983</SRS>
+      <SRS>EPSG:31984</SRS>
+      <SRS>EPSG:31985</SRS>
+      <SRS>EPSG:31986</SRS>
+      <SRS>EPSG:31987</SRS>
+      <SRS>EPSG:31988</SRS>
+      <SRS>EPSG:31989</SRS>
+      <SRS>EPSG:31990</SRS>
+      <SRS>EPSG:31991</SRS>
+      <SRS>EPSG:31992</SRS>
+      <SRS>EPSG:31993</SRS>
+      <SRS>EPSG:31994</SRS>
+      <SRS>EPSG:31995</SRS>
+      <SRS>EPSG:31996</SRS>
+      <SRS>EPSG:31997</SRS>
+      <SRS>EPSG:31998</SRS>
+      <SRS>EPSG:31999</SRS>
+      <SRS>EPSG:32000</SRS>
+      <SRS>EPSG:32001</SRS>
+      <SRS>EPSG:32002</SRS>
+      <SRS>EPSG:32003</SRS>
+      <SRS>EPSG:32005</SRS>
+      <SRS>EPSG:32006</SRS>
+      <SRS>EPSG:32007</SRS>
+      <SRS>EPSG:32008</SRS>
+      <SRS>EPSG:32009</SRS>
+      <SRS>EPSG:32010</SRS>
+      <SRS>EPSG:32011</SRS>
+      <SRS>EPSG:32012</SRS>
+      <SRS>EPSG:32013</SRS>
+      <SRS>EPSG:32014</SRS>
+      <SRS>EPSG:32015</SRS>
+      <SRS>EPSG:32016</SRS>
+      <SRS>EPSG:32017</SRS>
+      <SRS>EPSG:32018</SRS>
+      <SRS>EPSG:32019</SRS>
+      <SRS>EPSG:32020</SRS>
+      <SRS>EPSG:32021</SRS>
+      <SRS>EPSG:32022</SRS>
+      <SRS>EPSG:32023</SRS>
+      <SRS>EPSG:32024</SRS>
+      <SRS>EPSG:32025</SRS>
+      <SRS>EPSG:32026</SRS>
+      <SRS>EPSG:32027</SRS>
+      <SRS>EPSG:32028</SRS>
+      <SRS>EPSG:32029</SRS>
+      <SRS>EPSG:32030</SRS>
+      <SRS>EPSG:32031</SRS>
+      <SRS>EPSG:32033</SRS>
+      <SRS>EPSG:32034</SRS>
+      <SRS>EPSG:32035</SRS>
+      <SRS>EPSG:32036</SRS>
+      <SRS>EPSG:32037</SRS>
+      <SRS>EPSG:32038</SRS>
+      <SRS>EPSG:32039</SRS>
+      <SRS>EPSG:32040</SRS>
+      <SRS>EPSG:32041</SRS>
+      <SRS>EPSG:32042</SRS>
+      <SRS>EPSG:32043</SRS>
+      <SRS>EPSG:32044</SRS>
+      <SRS>EPSG:32045</SRS>
+      <SRS>EPSG:32046</SRS>
+      <SRS>EPSG:32047</SRS>
+      <SRS>EPSG:32048</SRS>
+      <SRS>EPSG:32049</SRS>
+      <SRS>EPSG:32050</SRS>
+      <SRS>EPSG:32051</SRS>
+      <SRS>EPSG:32052</SRS>
+      <SRS>EPSG:32053</SRS>
+      <SRS>EPSG:32054</SRS>
+      <SRS>EPSG:32055</SRS>
+      <SRS>EPSG:32056</SRS>
+      <SRS>EPSG:32057</SRS>
+      <SRS>EPSG:32058</SRS>
+      <SRS>EPSG:32061</SRS>
+      <SRS>EPSG:32062</SRS>
+      <SRS>EPSG:32064</SRS>
+      <SRS>EPSG:32065</SRS>
+      <SRS>EPSG:32066</SRS>
+      <SRS>EPSG:32067</SRS>
+      <SRS>EPSG:32074</SRS>
+      <SRS>EPSG:32075</SRS>
+      <SRS>EPSG:32076</SRS>
+      <SRS>EPSG:32077</SRS>
+      <SRS>EPSG:32081</SRS>
+      <SRS>EPSG:32082</SRS>
+      <SRS>EPSG:32083</SRS>
+      <SRS>EPSG:32084</SRS>
+      <SRS>EPSG:32085</SRS>
+      <SRS>EPSG:32086</SRS>
+      <SRS>EPSG:32098</SRS>
+      <SRS>EPSG:32099</SRS>
+      <SRS>EPSG:32100</SRS>
+      <SRS>EPSG:32104</SRS>
+      <SRS>EPSG:32107</SRS>
+      <SRS>EPSG:32108</SRS>
+      <SRS>EPSG:32109</SRS>
+      <SRS>EPSG:32110</SRS>
+      <SRS>EPSG:32111</SRS>
+      <SRS>EPSG:32112</SRS>
+      <SRS>EPSG:32113</SRS>
+      <SRS>EPSG:32114</SRS>
+      <SRS>EPSG:32115</SRS>
+      <SRS>EPSG:32116</SRS>
+      <SRS>EPSG:32117</SRS>
+      <SRS>EPSG:32118</SRS>
+      <SRS>EPSG:32119</SRS>
+      <SRS>EPSG:32120</SRS>
+      <SRS>EPSG:32121</SRS>
+      <SRS>EPSG:32122</SRS>
+      <SRS>EPSG:32123</SRS>
+      <SRS>EPSG:32124</SRS>
+      <SRS>EPSG:32125</SRS>
+      <SRS>EPSG:32126</SRS>
+      <SRS>EPSG:32127</SRS>
+      <SRS>EPSG:32128</SRS>
+      <SRS>EPSG:32129</SRS>
+      <SRS>EPSG:32130</SRS>
+      <SRS>EPSG:32133</SRS>
+      <SRS>EPSG:32134</SRS>
+      <SRS>EPSG:32135</SRS>
+      <SRS>EPSG:32136</SRS>
+      <SRS>EPSG:32137</SRS>
+      <SRS>EPSG:32138</SRS>
+      <SRS>EPSG:32139</SRS>
+      <SRS>EPSG:32140</SRS>
+      <SRS>EPSG:32141</SRS>
+      <SRS>EPSG:32142</SRS>
+      <SRS>EPSG:32143</SRS>
+      <SRS>EPSG:32144</SRS>
+      <SRS>EPSG:32145</SRS>
+      <SRS>EPSG:32146</SRS>
+      <SRS>EPSG:32147</SRS>
+      <SRS>EPSG:32148</SRS>
+      <SRS>EPSG:32149</SRS>
+      <SRS>EPSG:32150</SRS>
+      <SRS>EPSG:32151</SRS>
+      <SRS>EPSG:32152</SRS>
+      <SRS>EPSG:32153</SRS>
+      <SRS>EPSG:32154</SRS>
+      <SRS>EPSG:32155</SRS>
+      <SRS>EPSG:32156</SRS>
+      <SRS>EPSG:32157</SRS>
+      <SRS>EPSG:32158</SRS>
+      <SRS>EPSG:32161</SRS>
+      <SRS>EPSG:32164</SRS>
+      <SRS>EPSG:32165</SRS>
+      <SRS>EPSG:32166</SRS>
+      <SRS>EPSG:32167</SRS>
+      <SRS>EPSG:32180</SRS>
+      <SRS>EPSG:32181</SRS>
+      <SRS>EPSG:32182</SRS>
+      <SRS>EPSG:32183</SRS>
+      <SRS>EPSG:32184</SRS>
+      <SRS>EPSG:32185</SRS>
+      <SRS>EPSG:32186</SRS>
+      <SRS>EPSG:32187</SRS>
+      <SRS>EPSG:32188</SRS>
+      <SRS>EPSG:32189</SRS>
+      <SRS>EPSG:32190</SRS>
+      <SRS>EPSG:32191</SRS>
+      <SRS>EPSG:32192</SRS>
+      <SRS>EPSG:32193</SRS>
+      <SRS>EPSG:32194</SRS>
+      <SRS>EPSG:32195</SRS>
+      <SRS>EPSG:32196</SRS>
+      <SRS>EPSG:32197</SRS>
+      <SRS>EPSG:32198</SRS>
+      <SRS>EPSG:32199</SRS>
+      <SRS>EPSG:32201</SRS>
+      <SRS>EPSG:32202</SRS>
+      <SRS>EPSG:32203</SRS>
+      <SRS>EPSG:32204</SRS>
+      <SRS>EPSG:32205</SRS>
+      <SRS>EPSG:32206</SRS>
+      <SRS>EPSG:32207</SRS>
+      <SRS>EPSG:32208</SRS>
+      <SRS>EPSG:32209</SRS>
+      <SRS>EPSG:32210</SRS>
+      <SRS>EPSG:32211</SRS>
+      <SRS>EPSG:32212</SRS>
+      <SRS>EPSG:32213</SRS>
+      <SRS>EPSG:32214</SRS>
+      <SRS>EPSG:32215</SRS>
+      <SRS>EPSG:32216</SRS>
+      <SRS>EPSG:32217</SRS>
+      <SRS>EPSG:32218</SRS>
+      <SRS>EPSG:32219</SRS>
+      <SRS>EPSG:32220</SRS>
+      <SRS>EPSG:32221</SRS>
+      <SRS>EPSG:32222</SRS>
+      <SRS>EPSG:32223</SRS>
+      <SRS>EPSG:32224</SRS>
+      <SRS>EPSG:32225</SRS>
+      <SRS>EPSG:32226</SRS>
+      <SRS>EPSG:32227</SRS>
+      <SRS>EPSG:32228</SRS>
+      <SRS>EPSG:32229</SRS>
+      <SRS>EPSG:32230</SRS>
+      <SRS>EPSG:32231</SRS>
+      <SRS>EPSG:32232</SRS>
+      <SRS>EPSG:32233</SRS>
+      <SRS>EPSG:32234</SRS>
+      <SRS>EPSG:32235</SRS>
+      <SRS>EPSG:32236</SRS>
+      <SRS>EPSG:32237</SRS>
+      <SRS>EPSG:32238</SRS>
+      <SRS>EPSG:32239</SRS>
+      <SRS>EPSG:32240</SRS>
+      <SRS>EPSG:32241</SRS>
+      <SRS>EPSG:32242</SRS>
+      <SRS>EPSG:32243</SRS>
+      <SRS>EPSG:32244</SRS>
+      <SRS>EPSG:32245</SRS>
+      <SRS>EPSG:32246</SRS>
+      <SRS>EPSG:32247</SRS>
+      <SRS>EPSG:32248</SRS>
+      <SRS>EPSG:32249</SRS>
+      <SRS>EPSG:32250</SRS>
+      <SRS>EPSG:32251</SRS>
+      <SRS>EPSG:32252</SRS>
+      <SRS>EPSG:32253</SRS>
+      <SRS>EPSG:32254</SRS>
+      <SRS>EPSG:32255</SRS>
+      <SRS>EPSG:32256</SRS>
+      <SRS>EPSG:32257</SRS>
+      <SRS>EPSG:32258</SRS>
+      <SRS>EPSG:32259</SRS>
+      <SRS>EPSG:32260</SRS>
+      <SRS>EPSG:32301</SRS>
+      <SRS>EPSG:32302</SRS>
+      <SRS>EPSG:32303</SRS>
+      <SRS>EPSG:32304</SRS>
+      <SRS>EPSG:32305</SRS>
+      <SRS>EPSG:32306</SRS>
+      <SRS>EPSG:32307</SRS>
+      <SRS>EPSG:32308</SRS>
+      <SRS>EPSG:32309</SRS>
+      <SRS>EPSG:32310</SRS>
+      <SRS>EPSG:32311</SRS>
+      <SRS>EPSG:32312</SRS>
+      <SRS>EPSG:32313</SRS>
+      <SRS>EPSG:32314</SRS>
+      <SRS>EPSG:32315</SRS>
+      <SRS>EPSG:32316</SRS>
+      <SRS>EPSG:32317</SRS>
+      <SRS>EPSG:32318</SRS>
+      <SRS>EPSG:32319</SRS>
+      <SRS>EPSG:32320</SRS>
+      <SRS>EPSG:32321</SRS>
+      <SRS>EPSG:32322</SRS>
+      <SRS>EPSG:32323</SRS>
+      <SRS>EPSG:32324</SRS>
+      <SRS>EPSG:32325</SRS>
+      <SRS>EPSG:32326</SRS>
+      <SRS>EPSG:32327</SRS>
+      <SRS>EPSG:32328</SRS>
+      <SRS>EPSG:32329</SRS>
+      <SRS>EPSG:32330</SRS>
+      <SRS>EPSG:32331</SRS>
+      <SRS>EPSG:32332</SRS>
+      <SRS>EPSG:32333</SRS>
+      <SRS>EPSG:32334</SRS>
+      <SRS>EPSG:32335</SRS>
+      <SRS>EPSG:32336</SRS>
+      <SRS>EPSG:32337</SRS>
+      <SRS>EPSG:32338</SRS>
+      <SRS>EPSG:32339</SRS>
+      <SRS>EPSG:32340</SRS>
+      <SRS>EPSG:32341</SRS>
+      <SRS>EPSG:32342</SRS>
+      <SRS>EPSG:32343</SRS>
+      <SRS>EPSG:32344</SRS>
+      <SRS>EPSG:32345</SRS>
+      <SRS>EPSG:32346</SRS>
+      <SRS>EPSG:32347</SRS>
+      <SRS>EPSG:32348</SRS>
+      <SRS>EPSG:32349</SRS>
+      <SRS>EPSG:32350</SRS>
+      <SRS>EPSG:32351</SRS>
+      <SRS>EPSG:32352</SRS>
+      <SRS>EPSG:32353</SRS>
+      <SRS>EPSG:32354</SRS>
+      <SRS>EPSG:32355</SRS>
+      <SRS>EPSG:32356</SRS>
+      <SRS>EPSG:32357</SRS>
+      <SRS>EPSG:32358</SRS>
+      <SRS>EPSG:32359</SRS>
+      <SRS>EPSG:32360</SRS>
+      <SRS>EPSG:32401</SRS>
+      <SRS>EPSG:32402</SRS>
+      <SRS>EPSG:32403</SRS>
+      <SRS>EPSG:32404</SRS>
+      <SRS>EPSG:32405</SRS>
+      <SRS>EPSG:32406</SRS>
+      <SRS>EPSG:32407</SRS>
+      <SRS>EPSG:32408</SRS>
+      <SRS>EPSG:32409</SRS>
+      <SRS>EPSG:32410</SRS>
+      <SRS>EPSG:32411</SRS>
+      <SRS>EPSG:32412</SRS>
+      <SRS>EPSG:32413</SRS>
+      <SRS>EPSG:32414</SRS>
+      <SRS>EPSG:32415</SRS>
+      <SRS>EPSG:32416</SRS>
+      <SRS>EPSG:32417</SRS>
+      <SRS>EPSG:32418</SRS>
+      <SRS>EPSG:32419</SRS>
+      <SRS>EPSG:32420</SRS>
+      <SRS>EPSG:32421</SRS>
+      <SRS>EPSG:32422</SRS>
+      <SRS>EPSG:32423</SRS>
+      <SRS>EPSG:32424</SRS>
+      <SRS>EPSG:32425</SRS>
+      <SRS>EPSG:32426</SRS>
+      <SRS>EPSG:32427</SRS>
+      <SRS>EPSG:32428</SRS>
+      <SRS>EPSG:32429</SRS>
+      <SRS>EPSG:32430</SRS>
+      <SRS>EPSG:32431</SRS>
+      <SRS>EPSG:32432</SRS>
+      <SRS>EPSG:32433</SRS>
+      <SRS>EPSG:32434</SRS>
+      <SRS>EPSG:32435</SRS>
+      <SRS>EPSG:32436</SRS>
+      <SRS>EPSG:32437</SRS>
+      <SRS>EPSG:32438</SRS>
+      <SRS>EPSG:32439</SRS>
+      <SRS>EPSG:32440</SRS>
+      <SRS>EPSG:32441</SRS>
+      <SRS>EPSG:32442</SRS>
+      <SRS>EPSG:32443</SRS>
+      <SRS>EPSG:32444</SRS>
+      <SRS>EPSG:32445</SRS>
+      <SRS>EPSG:32446</SRS>
+      <SRS>EPSG:32447</SRS>
+      <SRS>EPSG:32448</SRS>
+      <SRS>EPSG:32449</SRS>
+      <SRS>EPSG:32450</SRS>
+      <SRS>EPSG:32451</SRS>
+      <SRS>EPSG:32452</SRS>
+      <SRS>EPSG:32453</SRS>
+      <SRS>EPSG:32454</SRS>
+      <SRS>EPSG:32455</SRS>
+      <SRS>EPSG:32456</SRS>
+      <SRS>EPSG:32457</SRS>
+      <SRS>EPSG:32458</SRS>
+      <SRS>EPSG:32459</SRS>
+      <SRS>EPSG:32460</SRS>
+      <SRS>EPSG:32501</SRS>
+      <SRS>EPSG:32502</SRS>
+      <SRS>EPSG:32503</SRS>
+      <SRS>EPSG:32504</SRS>
+      <SRS>EPSG:32505</SRS>
+      <SRS>EPSG:32506</SRS>
+      <SRS>EPSG:32507</SRS>
+      <SRS>EPSG:32508</SRS>
+      <SRS>EPSG:32509</SRS>
+      <SRS>EPSG:32510</SRS>
+      <SRS>EPSG:32511</SRS>
+      <SRS>EPSG:32512</SRS>
+      <SRS>EPSG:32513</SRS>
+      <SRS>EPSG:32514</SRS>
+      <SRS>EPSG:32515</SRS>
+      <SRS>EPSG:32516</SRS>
+      <SRS>EPSG:32517</SRS>
+      <SRS>EPSG:32518</SRS>
+      <SRS>EPSG:32519</SRS>
+      <SRS>EPSG:32520</SRS>
+      <SRS>EPSG:32521</SRS>
+      <SRS>EPSG:32522</SRS>
+      <SRS>EPSG:32523</SRS>
+      <SRS>EPSG:32524</SRS>
+      <SRS>EPSG:32525</SRS>
+      <SRS>EPSG:32526</SRS>
+      <SRS>EPSG:32527</SRS>
+      <SRS>EPSG:32528</SRS>
+      <SRS>EPSG:32529</SRS>
+      <SRS>EPSG:32530</SRS>
+      <SRS>EPSG:32531</SRS>
+      <SRS>EPSG:32532</SRS>
+      <SRS>EPSG:32533</SRS>
+      <SRS>EPSG:32534</SRS>
+      <SRS>EPSG:32535</SRS>
+      <SRS>EPSG:32536</SRS>
+      <SRS>EPSG:32537</SRS>
+      <SRS>EPSG:32538</SRS>
+      <SRS>EPSG:32539</SRS>
+      <SRS>EPSG:32540</SRS>
+      <SRS>EPSG:32541</SRS>
+      <SRS>EPSG:32542</SRS>
+      <SRS>EPSG:32543</SRS>
+      <SRS>EPSG:32544</SRS>
+      <SRS>EPSG:32545</SRS>
+      <SRS>EPSG:32546</SRS>
+      <SRS>EPSG:32547</SRS>
+      <SRS>EPSG:32548</SRS>
+      <SRS>EPSG:32549</SRS>
+      <SRS>EPSG:32550</SRS>
+      <SRS>EPSG:32551</SRS>
+      <SRS>EPSG:32552</SRS>
+      <SRS>EPSG:32553</SRS>
+      <SRS>EPSG:32554</SRS>
+      <SRS>EPSG:32555</SRS>
+      <SRS>EPSG:32556</SRS>
+      <SRS>EPSG:32557</SRS>
+      <SRS>EPSG:32558</SRS>
+      <SRS>EPSG:32559</SRS>
+      <SRS>EPSG:32560</SRS>
+      <SRS>EPSG:32600</SRS>
+      <SRS>EPSG:32601</SRS>
+      <SRS>EPSG:32602</SRS>
+      <SRS>EPSG:32603</SRS>
+      <SRS>EPSG:32604</SRS>
+      <SRS>EPSG:32605</SRS>
+      <SRS>EPSG:32606</SRS>
+      <SRS>EPSG:32607</SRS>
+      <SRS>EPSG:32608</SRS>
+      <SRS>EPSG:32609</SRS>
+      <SRS>EPSG:32610</SRS>
+      <SRS>EPSG:32611</SRS>
+      <SRS>EPSG:32612</SRS>
+      <SRS>EPSG:32613</SRS>
+      <SRS>EPSG:32614</SRS>
+      <SRS>EPSG:32615</SRS>
+      <SRS>EPSG:32616</SRS>
+      <SRS>EPSG:32617</SRS>
+      <SRS>EPSG:32618</SRS>
+      <SRS>EPSG:32619</SRS>
+      <SRS>EPSG:32620</SRS>
+      <SRS>EPSG:32621</SRS>
+      <SRS>EPSG:32622</SRS>
+      <SRS>EPSG:32623</SRS>
+      <SRS>EPSG:32624</SRS>
+      <SRS>EPSG:32625</SRS>
+      <SRS>EPSG:32626</SRS>
+      <SRS>EPSG:32627</SRS>
+      <SRS>EPSG:32628</SRS>
+      <SRS>EPSG:32629</SRS>
+      <SRS>EPSG:32630</SRS>
+      <SRS>EPSG:32631</SRS>
+      <SRS>EPSG:32632</SRS>
+      <SRS>EPSG:32633</SRS>
+      <SRS>EPSG:32634</SRS>
+      <SRS>EPSG:32635</SRS>
+      <SRS>EPSG:32636</SRS>
+      <SRS>EPSG:32637</SRS>
+      <SRS>EPSG:32638</SRS>
+      <SRS>EPSG:32639</SRS>
+      <SRS>EPSG:32640</SRS>
+      <SRS>EPSG:32641</SRS>
+      <SRS>EPSG:32642</SRS>
+      <SRS>EPSG:32643</SRS>
+      <SRS>EPSG:32644</SRS>
+      <SRS>EPSG:32645</SRS>
+      <SRS>EPSG:32646</SRS>
+      <SRS>EPSG:32647</SRS>
+      <SRS>EPSG:32648</SRS>
+      <SRS>EPSG:32649</SRS>
+      <SRS>EPSG:32650</SRS>
+      <SRS>EPSG:32651</SRS>
+      <SRS>EPSG:32652</SRS>
+      <SRS>EPSG:32653</SRS>
+      <SRS>EPSG:32654</SRS>
+      <SRS>EPSG:32655</SRS>
+      <SRS>EPSG:32656</SRS>
+      <SRS>EPSG:32657</SRS>
+      <SRS>EPSG:32658</SRS>
+      <SRS>EPSG:32659</SRS>
+      <SRS>EPSG:32660</SRS>
+      <SRS>EPSG:32661</SRS>
+      <SRS>EPSG:32662</SRS>
+      <SRS>EPSG:32664</SRS>
+      <SRS>EPSG:32665</SRS>
+      <SRS>EPSG:32666</SRS>
+      <SRS>EPSG:32667</SRS>
+      <SRS>EPSG:32700</SRS>
+      <SRS>EPSG:32701</SRS>
+      <SRS>EPSG:32702</SRS>
+      <SRS>EPSG:32703</SRS>
+      <SRS>EPSG:32704</SRS>
+      <SRS>EPSG:32705</SRS>
+      <SRS>EPSG:32706</SRS>
+      <SRS>EPSG:32707</SRS>
+      <SRS>EPSG:32708</SRS>
+      <SRS>EPSG:32709</SRS>
+      <SRS>EPSG:32710</SRS>
+      <SRS>EPSG:32711</SRS>
+      <SRS>EPSG:32712</SRS>
+      <SRS>EPSG:32713</SRS>
+      <SRS>EPSG:32714</SRS>
+      <SRS>EPSG:32715</SRS>
+      <SRS>EPSG:32716</SRS>
+      <SRS>EPSG:32717</SRS>
+      <SRS>EPSG:32718</SRS>
+      <SRS>EPSG:32719</SRS>
+      <SRS>EPSG:32720</SRS>
+      <SRS>EPSG:32721</SRS>
+      <SRS>EPSG:32722</SRS>
+      <SRS>EPSG:32723</SRS>
+      <SRS>EPSG:32724</SRS>
+      <SRS>EPSG:32725</SRS>
+      <SRS>EPSG:32726</SRS>
+      <SRS>EPSG:32727</SRS>
+      <SRS>EPSG:32728</SRS>
+      <SRS>EPSG:32729</SRS>
+      <SRS>EPSG:32730</SRS>
+      <SRS>EPSG:32731</SRS>
+      <SRS>EPSG:32732</SRS>
+      <SRS>EPSG:32733</SRS>
+      <SRS>EPSG:32734</SRS>
+      <SRS>EPSG:32735</SRS>
+      <SRS>EPSG:32736</SRS>
+      <SRS>EPSG:32737</SRS>
+      <SRS>EPSG:32738</SRS>
+      <SRS>EPSG:32739</SRS>
+      <SRS>EPSG:32740</SRS>
+      <SRS>EPSG:32741</SRS>
+      <SRS>EPSG:32742</SRS>
+      <SRS>EPSG:32743</SRS>
+      <SRS>EPSG:32744</SRS>
+      <SRS>EPSG:32745</SRS>
+      <SRS>EPSG:32746</SRS>
+      <SRS>EPSG:32747</SRS>
+      <SRS>EPSG:32748</SRS>
+      <SRS>EPSG:32749</SRS>
+      <SRS>EPSG:32750</SRS>
+      <SRS>EPSG:32751</SRS>
+      <SRS>EPSG:32752</SRS>
+      <SRS>EPSG:32753</SRS>
+      <SRS>EPSG:32754</SRS>
+      <SRS>EPSG:32755</SRS>
+      <SRS>EPSG:32756</SRS>
+      <SRS>EPSG:32757</SRS>
+      <SRS>EPSG:32758</SRS>
+      <SRS>EPSG:32759</SRS>
+      <SRS>EPSG:32760</SRS>
+      <SRS>EPSG:32761</SRS>
+      <SRS>EPSG:32766</SRS>
+      <SRS>EPSG:61206405</SRS>
+      <SRS>EPSG:61216405</SRS>
+      <SRS>EPSG:61226405</SRS>
+      <SRS>EPSG:61236405</SRS>
+      <SRS>EPSG:61246405</SRS>
+      <SRS>EPSG:61266405</SRS>
+      <SRS>EPSG:61266413</SRS>
+      <SRS>EPSG:61276405</SRS>
+      <SRS>EPSG:61286405</SRS>
+      <SRS>EPSG:61296405</SRS>
+      <SRS>EPSG:61306405</SRS>
+      <SRS>EPSG:61306413</SRS>
+      <SRS>EPSG:61316405</SRS>
+      <SRS>EPSG:61326405</SRS>
+      <SRS>EPSG:61336405</SRS>
+      <SRS>EPSG:61346405</SRS>
+      <SRS>EPSG:61356405</SRS>
+      <SRS>EPSG:61366405</SRS>
+      <SRS>EPSG:61376405</SRS>
+      <SRS>EPSG:61386405</SRS>
+      <SRS>EPSG:61396405</SRS>
+      <SRS>EPSG:61406405</SRS>
+      <SRS>EPSG:61406413</SRS>
+      <SRS>EPSG:61416405</SRS>
+      <SRS>EPSG:61426405</SRS>
+      <SRS>EPSG:61436405</SRS>
+      <SRS>EPSG:61446405</SRS>
+      <SRS>EPSG:61456405</SRS>
+      <SRS>EPSG:61466405</SRS>
+      <SRS>EPSG:61476405</SRS>
+      <SRS>EPSG:61486405</SRS>
+      <SRS>EPSG:61486413</SRS>
+      <SRS>EPSG:61496405</SRS>
+      <SRS>EPSG:61506405</SRS>
+      <SRS>EPSG:61516405</SRS>
+      <SRS>EPSG:61516413</SRS>
+      <SRS>EPSG:61526405</SRS>
+      <SRS>EPSG:61526413</SRS>
+      <SRS>EPSG:61536405</SRS>
+      <SRS>EPSG:61546405</SRS>
+      <SRS>EPSG:61556405</SRS>
+      <SRS>EPSG:61566405</SRS>
+      <SRS>EPSG:61576405</SRS>
+      <SRS>EPSG:61586405</SRS>
+      <SRS>EPSG:61596405</SRS>
+      <SRS>EPSG:61606405</SRS>
+      <SRS>EPSG:61616405</SRS>
+      <SRS>EPSG:61626405</SRS>
+      <SRS>EPSG:61636405</SRS>
+      <SRS>EPSG:61636413</SRS>
+      <SRS>EPSG:61646405</SRS>
+      <SRS>EPSG:61656405</SRS>
+      <SRS>EPSG:61666405</SRS>
+      <SRS>EPSG:61676405</SRS>
+      <SRS>EPSG:61676413</SRS>
+      <SRS>EPSG:61686405</SRS>
+      <SRS>EPSG:61696405</SRS>
+      <SRS>EPSG:61706405</SRS>
+      <SRS>EPSG:61706413</SRS>
+      <SRS>EPSG:61716405</SRS>
+      <SRS>EPSG:61716413</SRS>
+      <SRS>EPSG:61736405</SRS>
+      <SRS>EPSG:61736413</SRS>
+      <SRS>EPSG:61746405</SRS>
+      <SRS>EPSG:61756405</SRS>
+      <SRS>EPSG:61766405</SRS>
+      <SRS>EPSG:61766413</SRS>
+      <SRS>EPSG:61786405</SRS>
+      <SRS>EPSG:61796405</SRS>
+      <SRS>EPSG:61806405</SRS>
+      <SRS>EPSG:61806413</SRS>
+      <SRS>EPSG:61816405</SRS>
+      <SRS>EPSG:61826405</SRS>
+      <SRS>EPSG:61836405</SRS>
+      <SRS>EPSG:61846405</SRS>
+      <SRS>EPSG:61886405</SRS>
+      <SRS>EPSG:61896405</SRS>
+      <SRS>EPSG:61896413</SRS>
+      <SRS>EPSG:61906405</SRS>
+      <SRS>EPSG:61906413</SRS>
+      <SRS>EPSG:61916405</SRS>
+      <SRS>EPSG:61926405</SRS>
+      <SRS>EPSG:61936405</SRS>
+      <SRS>EPSG:61946405</SRS>
+      <SRS>EPSG:61956405</SRS>
+      <SRS>EPSG:61966405</SRS>
+      <SRS>EPSG:61976405</SRS>
+      <SRS>EPSG:61986405</SRS>
+      <SRS>EPSG:61996405</SRS>
+      <SRS>EPSG:62006405</SRS>
+      <SRS>EPSG:62016405</SRS>
+      <SRS>EPSG:62026405</SRS>
+      <SRS>EPSG:62036405</SRS>
+      <SRS>EPSG:62046405</SRS>
+      <SRS>EPSG:62056405</SRS>
+      <SRS>EPSG:62066405</SRS>
+      <SRS>EPSG:62076405</SRS>
+      <SRS>EPSG:62086405</SRS>
+      <SRS>EPSG:62096405</SRS>
+      <SRS>EPSG:62106405</SRS>
+      <SRS>EPSG:62116405</SRS>
+      <SRS>EPSG:62126405</SRS>
+      <SRS>EPSG:62136405</SRS>
+      <SRS>EPSG:62146405</SRS>
+      <SRS>EPSG:62156405</SRS>
+      <SRS>EPSG:62166405</SRS>
+      <SRS>EPSG:62186405</SRS>
+      <SRS>EPSG:62196405</SRS>
+      <SRS>EPSG:62206405</SRS>
+      <SRS>EPSG:62216405</SRS>
+      <SRS>EPSG:62226405</SRS>
+      <SRS>EPSG:62236405</SRS>
+      <SRS>EPSG:62246405</SRS>
+      <SRS>EPSG:62256405</SRS>
+      <SRS>EPSG:62276405</SRS>
+      <SRS>EPSG:62296405</SRS>
+      <SRS>EPSG:62306405</SRS>
+      <SRS>EPSG:62316405</SRS>
+      <SRS>EPSG:62326405</SRS>
+      <SRS>EPSG:62336405</SRS>
+      <SRS>EPSG:62366405</SRS>
+      <SRS>EPSG:62376405</SRS>
+      <SRS>EPSG:62386405</SRS>
+      <SRS>EPSG:62396405</SRS>
+      <SRS>EPSG:62406405</SRS>
+      <SRS>EPSG:62416405</SRS>
+      <SRS>EPSG:62426405</SRS>
+      <SRS>EPSG:62436405</SRS>
+      <SRS>EPSG:62446405</SRS>
+      <SRS>EPSG:62456405</SRS>
+      <SRS>EPSG:62466405</SRS>
+      <SRS>EPSG:62476405</SRS>
+      <SRS>EPSG:62486405</SRS>
+      <SRS>EPSG:62496405</SRS>
+      <SRS>EPSG:62506405</SRS>
+      <SRS>EPSG:62516405</SRS>
+      <SRS>EPSG:62526405</SRS>
+      <SRS>EPSG:62536405</SRS>
+      <SRS>EPSG:62546405</SRS>
+      <SRS>EPSG:62556405</SRS>
+      <SRS>EPSG:62566405</SRS>
+      <SRS>EPSG:62576405</SRS>
+      <SRS>EPSG:62586405</SRS>
+      <SRS>EPSG:62586413</SRS>
+      <SRS>EPSG:62596405</SRS>
+      <SRS>EPSG:62616405</SRS>
+      <SRS>EPSG:62626405</SRS>
+      <SRS>EPSG:62636405</SRS>
+      <SRS>EPSG:62646405</SRS>
+      <SRS>EPSG:62656405</SRS>
+      <SRS>EPSG:62666405</SRS>
+      <SRS>EPSG:62676405</SRS>
+      <SRS>EPSG:62686405</SRS>
+      <SRS>EPSG:62696405</SRS>
+      <SRS>EPSG:62706405</SRS>
+      <SRS>EPSG:62716405</SRS>
+      <SRS>EPSG:62726405</SRS>
+      <SRS>EPSG:62736405</SRS>
+      <SRS>EPSG:62746405</SRS>
+      <SRS>EPSG:62756405</SRS>
+      <SRS>EPSG:62766405</SRS>
+      <SRS>EPSG:62776405</SRS>
+      <SRS>EPSG:62786405</SRS>
+      <SRS>EPSG:62796405</SRS>
+      <SRS>EPSG:62806405</SRS>
+      <SRS>EPSG:62816405</SRS>
+      <SRS>EPSG:62826405</SRS>
+      <SRS>EPSG:62836405</SRS>
+      <SRS>EPSG:62836413</SRS>
+      <SRS>EPSG:62846405</SRS>
+      <SRS>EPSG:62856405</SRS>
+      <SRS>EPSG:62866405</SRS>
+      <SRS>EPSG:62886405</SRS>
+      <SRS>EPSG:62896405</SRS>
+      <SRS>EPSG:62926405</SRS>
+      <SRS>EPSG:62936405</SRS>
+      <SRS>EPSG:62956405</SRS>
+      <SRS>EPSG:62976405</SRS>
+      <SRS>EPSG:62986405</SRS>
+      <SRS>EPSG:62996405</SRS>
+      <SRS>EPSG:63006405</SRS>
+      <SRS>EPSG:63016405</SRS>
+      <SRS>EPSG:63026405</SRS>
+      <SRS>EPSG:63036405</SRS>
+      <SRS>EPSG:63046405</SRS>
+      <SRS>EPSG:63066405</SRS>
+      <SRS>EPSG:63076405</SRS>
+      <SRS>EPSG:63086405</SRS>
+      <SRS>EPSG:63096405</SRS>
+      <SRS>EPSG:63106405</SRS>
+      <SRS>EPSG:63116405</SRS>
+      <SRS>EPSG:63126405</SRS>
+      <SRS>EPSG:63136405</SRS>
+      <SRS>EPSG:63146405</SRS>
+      <SRS>EPSG:63156405</SRS>
+      <SRS>EPSG:63166405</SRS>
+      <SRS>EPSG:63176405</SRS>
+      <SRS>EPSG:63186405</SRS>
+      <SRS>EPSG:63196405</SRS>
+      <SRS>EPSG:63226405</SRS>
+      <SRS>EPSG:63246405</SRS>
+      <SRS>EPSG:63266405</SRS>
+      <SRS>EPSG:63266406</SRS>
+      <SRS>EPSG:63266407</SRS>
+      <SRS>EPSG:63266408</SRS>
+      <SRS>EPSG:63266409</SRS>
+      <SRS>EPSG:63266410</SRS>
+      <SRS>EPSG:63266411</SRS>
+      <SRS>EPSG:63266412</SRS>
+      <SRS>EPSG:63266413</SRS>
+      <SRS>EPSG:63266414</SRS>
+      <SRS>EPSG:63266415</SRS>
+      <SRS>EPSG:63266416</SRS>
+      <SRS>EPSG:63266417</SRS>
+      <SRS>EPSG:63266418</SRS>
+      <SRS>EPSG:63266419</SRS>
+      <SRS>EPSG:63266420</SRS>
+      <SRS>EPSG:66006405</SRS>
+      <SRS>EPSG:66016405</SRS>
+      <SRS>EPSG:66026405</SRS>
+      <SRS>EPSG:66036405</SRS>
+      <SRS>EPSG:66046405</SRS>
+      <SRS>EPSG:66056405</SRS>
+      <SRS>EPSG:66066405</SRS>
+      <SRS>EPSG:66076405</SRS>
+      <SRS>EPSG:66086405</SRS>
+      <SRS>EPSG:66096405</SRS>
+      <SRS>EPSG:66106405</SRS>
+      <SRS>EPSG:66116405</SRS>
+      <SRS>EPSG:66126405</SRS>
+      <SRS>EPSG:66126413</SRS>
+      <SRS>EPSG:66136405</SRS>
+      <SRS>EPSG:66146405</SRS>
+      <SRS>EPSG:66156405</SRS>
+      <SRS>EPSG:66166405</SRS>
+      <SRS>EPSG:66186405</SRS>
+      <SRS>EPSG:66196405</SRS>
+      <SRS>EPSG:66196413</SRS>
+      <SRS>EPSG:66206405</SRS>
+      <SRS>EPSG:66216405</SRS>
+      <SRS>EPSG:66226405</SRS>
+      <SRS>EPSG:66236405</SRS>
+      <SRS>EPSG:66246405</SRS>
+      <SRS>EPSG:66246413</SRS>
+      <SRS>EPSG:66256405</SRS>
+      <SRS>EPSG:66266405</SRS>
+      <SRS>EPSG:66276405</SRS>
+      <SRS>EPSG:66276413</SRS>
+      <SRS>EPSG:66286405</SRS>
+      <SRS>EPSG:66296405</SRS>
+      <SRS>EPSG:66306405</SRS>
+      <SRS>EPSG:66316405</SRS>
+      <SRS>EPSG:66326405</SRS>
+      <SRS>EPSG:66336405</SRS>
+      <SRS>EPSG:66346405</SRS>
+      <SRS>EPSG:66356405</SRS>
+      <SRS>EPSG:66366405</SRS>
+      <SRS>EPSG:66376405</SRS>
+      <SRS>EPSG:66386405</SRS>
+      <SRS>EPSG:66396405</SRS>
+      <SRS>EPSG:66406405</SRS>
+      <SRS>EPSG:66406413</SRS>
+      <SRS>EPSG:66416405</SRS>
+      <SRS>EPSG:66426405</SRS>
+      <SRS>EPSG:66436405</SRS>
+      <SRS>EPSG:66446405</SRS>
+      <SRS>EPSG:66456405</SRS>
+      <SRS>EPSG:66456413</SRS>
+      <SRS>EPSG:66466405</SRS>
+      <SRS>EPSG:66576405</SRS>
+      <SRS>EPSG:66586405</SRS>
+      <SRS>EPSG:66596405</SRS>
+      <SRS>EPSG:66596413</SRS>
+      <SRS>EPSG:66606405</SRS>
+      <SRS>EPSG:66616405</SRS>
+      <SRS>EPSG:66616413</SRS>
+      <SRS>EPSG:66636405</SRS>
+      <SRS>EPSG:66646405</SRS>
+      <SRS>EPSG:66656405</SRS>
+      <SRS>EPSG:66666405</SRS>
+      <SRS>EPSG:66676405</SRS>
+      <SRS>EPSG:68016405</SRS>
+      <SRS>EPSG:68026405</SRS>
+      <SRS>EPSG:68036405</SRS>
+      <SRS>EPSG:68046405</SRS>
+      <SRS>EPSG:68056405</SRS>
+      <SRS>EPSG:68066405</SRS>
+      <SRS>EPSG:68086405</SRS>
+      <SRS>EPSG:68096405</SRS>
+      <SRS>EPSG:68136405</SRS>
+      <SRS>EPSG:68146405</SRS>
+      <SRS>EPSG:68156405</SRS>
+      <SRS>EPSG:68186405</SRS>
+      <SRS>EPSG:68206405</SRS>
+      <SRS>EPSG:69036405</SRS>
+      <SRS>EPSG:42302</SRS>
+      <SRS>EPSG:42301</SRS>
+      <SRS>EPSG:900913</SRS>
+      <SRS>EPSG:45556</SRS>
+      <SRS>EPSG:45555</SRS>
+      <SRS>EPSG:54004</SRS>
+      <SRS>EPSG:41001</SRS>
+      <SRS>EPSG:42311</SRS>
+      <SRS>EPSG:42310</SRS>
+      <SRS>EPSG:18001</SRS>
+      <SRS>EPSG:100003</SRS>
+      <SRS>EPSG:42106</SRS>
+      <SRS>EPSG:100002</SRS>
+      <SRS>EPSG:42105</SRS>
+      <SRS>EPSG:100001</SRS>
+      <SRS>EPSG:42309</SRS>
+      <SRS>EPSG:42104</SRS>
+      <SRS>EPSG:42308</SRS>
+      <SRS>EPSG:42103</SRS>
+      <SRS>EPSG:42307</SRS>
+      <SRS>EPSG:42102</SRS>
+      <SRS>EPSG:42306</SRS>
+      <SRS>EPSG:42101</SRS>
+      <SRS>EPSG:42305</SRS>
+      <SRS>EPSG:42304</SRS>
+      <SRS>EPSG:42303</SRS>
+      <LatLonBoundingBox minx="-297176.16529836657" miny="-1.2694600326676274E7" maxx="3.0016785704606913E7" maxy="1.7619361543229006E7"/>
+      <Layer queryable="1">
+        <Name>og:bugsites</Name>
+        <Title/>
+        <Abstract>Sample data from GRASS, bug sites location, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>spearfish</Keyword>
+          <Keyword>sfBugsites</Keyword>
+          <Keyword>insects</Keyword>
+          <Keyword>bugsites</Keyword>
+          <Keyword>tiger_beetles</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <!--WKT definition of this CRS:
+PROJCS["NAD27 / UTM zone 13N", 
+  GEOGCS["NAD27", 
+    DATUM["North American Datum 1927", 
+      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], 
+      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], 
+      AUTHORITY["EPSG","6267"]], 
+    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+    UNIT["degree", 0.017453292519943295], 
+    AXIS["Geodetic longitude", EAST], 
+    AXIS["Geodetic latitude", NORTH], 
+    AUTHORITY["EPSG","4267"]], 
+  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], 
+  PARAMETER["central_meridian", -105.0], 
+  PARAMETER["latitude_of_origin", 0.0], 
+  PARAMETER["scale_factor", 0.9996], 
+  PARAMETER["false_easting", 500000.0], 
+  PARAMETER["false_northing", 0.0], 
+  UNIT["m", 1.0], 
+  AXIS["Easting", EAST], 
+  AXIS["Northing", NORTH], 
+  AUTHORITY["EPSG","26713"]]-->
+        <LatLonBoundingBox minx="-103.8701581843142" miny="44.286540361238224" maxx="-103.63532819794625" maxy="44.52137034760618"/>
+        <BoundingBox SRS="EPSG:26713" minx="590232.0" miny="4914096.0" maxx="608471.0" maxy="4920512.0"/>
+        <Style>
+          <Name>capitals</Name>
+          <Title>Capital cities</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:bugsites"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>og:restricted</Name>
+        <Title/>
+        <Abstract>Sample data from GRASS, restricted areas, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>spearfish</Keyword>
+          <Keyword>restricted</Keyword>
+          <Keyword>sfRestricted</Keyword>
+          <Keyword>areas</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <!--WKT definition of this CRS:
+PROJCS["NAD27 / UTM zone 13N", 
+  GEOGCS["NAD27", 
+    DATUM["North American Datum 1927", 
+      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], 
+      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], 
+      AUTHORITY["EPSG","6267"]], 
+    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+    UNIT["degree", 0.017453292519943295], 
+    AXIS["Geodetic longitude", EAST], 
+    AXIS["Geodetic latitude", NORTH], 
+    AUTHORITY["EPSG","4267"]], 
+  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], 
+  PARAMETER["central_meridian", -105.0], 
+  PARAMETER["latitude_of_origin", 0.0], 
+  PARAMETER["scale_factor", 0.9996], 
+  PARAMETER["false_easting", 500000.0], 
+  PARAMETER["false_northing", 0.0], 
+  UNIT["m", 1.0], 
+  AXIS["Easting", EAST], 
+  AXIS["Northing", NORTH], 
+  AUTHORITY["EPSG","26713"]]-->
+        <LatLonBoundingBox minx="-104.36424600670885" miny="43.78798270975212" maxx="-103.06226503558304" maxy="45.089963680877936"/>
+        <BoundingBox SRS="EPSG:26713" minx="551796.8125" miny="4901896.0" maxx="652788.5625" maxy="4940954.0"/>
+        <Style>
+          <Name>restricted</Name>
+          <Title>Red, translucent style</Title>
+          <Abstract>A sample style that just prints out a transparent red interior with a red outline</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:restricted"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>og:archsites</Name>
+        <Title/>
+        <Abstract>Sample data from GRASS, archeological sites location, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>archsites</Keyword>
+          <Keyword>spearfish</Keyword>
+          <Keyword>sfArchsites</Keyword>
+          <Keyword>archeology</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <!--WKT definition of this CRS:
+PROJCS["NAD27 / UTM zone 13N", 
+  GEOGCS["NAD27", 
+    DATUM["North American Datum 1927", 
+      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], 
+      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], 
+      AUTHORITY["EPSG","6267"]], 
+    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+    UNIT["degree", 0.017453292519943295], 
+    AXIS["Geodetic longitude", EAST], 
+    AXIS["Geodetic latitude", NORTH], 
+    AUTHORITY["EPSG","4267"]], 
+  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], 
+  PARAMETER["central_meridian", -105.0], 
+  PARAMETER["latitude_of_origin", 0.0], 
+  PARAMETER["scale_factor", 0.9996], 
+  PARAMETER["false_easting", 500000.0], 
+  PARAMETER["false_northing", 0.0], 
+  UNIT["m", 1.0], 
+  AXIS["Easting", EAST], 
+  AXIS["Northing", NORTH], 
+  AUTHORITY["EPSG","26713"]]-->
+        <LatLonBoundingBox minx="-103.87480459767542" miny="44.31295793136913" maxx="-103.63549073047534" maxy="44.55227179856921"/>
+        <BoundingBox SRS="EPSG:26713" minx="589860.0" miny="4914479.0" maxx="608355.0" maxy="4926490.0"/>
+        <Style>
+          <Name>point</Name>
+          <Title>Default point</Title>
+          <Abstract>A sample style that just prints out a 6px wide red square</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:archsites"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>og:streams</Name>
+        <Title/>
+        <Abstract>Sample data from GRASS, streams, Spearfish, South Dakota, USA</Abstract>
+        <KeywordList>
+          <Keyword>spearfish</Keyword>
+          <Keyword>sfStreams</Keyword>
+          <Keyword>streams</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <!--WKT definition of this CRS:
+PROJCS["NAD27 / UTM zone 13N", 
+  GEOGCS["NAD27", 
+    DATUM["North American Datum 1927", 
+      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], 
+      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], 
+      AUTHORITY["EPSG","6267"]], 
+    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+    UNIT["degree", 0.017453292519943295], 
+    AXIS["Geodetic longitude", EAST], 
+    AXIS["Geodetic latitude", NORTH], 
+    AUTHORITY["EPSG","4267"]], 
+  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], 
+  PARAMETER["central_meridian", -105.0], 
+  PARAMETER["latitude_of_origin", 0.0], 
+  PARAMETER["scale_factor", 0.9996], 
+  PARAMETER["false_easting", 500000.0], 
+  PARAMETER["false_northing", 0.0], 
+  UNIT["m", 1.0], 
+  AXIS["Easting", EAST], 
+  AXIS["Northing", NORTH], 
+  AUTHORITY["EPSG","26713"]]-->
+        <LatLonBoundingBox minx="-103.88033574142051" miny="44.30711172484593" maxx="-103.62022283326024" maxy="44.5672246330062"/>
+        <BoundingBox SRS="EPSG:26713" minx="589443.0" miny="4913935.0" maxx="609526.75" maxy="4928059.5"/>
+        <Style>
+          <Name>simple_streams</Name>
+          <Title>Default Styler for streams segments</Title>
+          <Abstract>Blue lines, 2px wide</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:streams"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tiger:poly_landmarks</Name>
+        <Title>Manhattan (NY) landmarks</Title>
+        <Abstract>Manhattan landmarks, identifies water, lakes, parks, interesting buildilngs</Abstract>
+        <KeywordList>
+          <Keyword>DS_poly_landmarks</Keyword>
+          <Keyword>landmarks</Keyword>
+          <Keyword>manhattan</Keyword>
+          <Keyword>poly_landmarks</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="-74.0828672737" miny="40.67246384130001" maxx="-73.8660689563" maxy="40.8892621587"/>
+        <BoundingBox SRS="EPSG:4326" minx="-74.047185" miny="40.679648" maxx="-73.90782" maxy="40.882078"/>
+        <Style>
+          <Name>poly_landmarks</Name>
+          <Title>Default Styler</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:poly_landmarks"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tiger:poi</Name>
+        <Title>Manhattan (NY) points of interest</Title>
+        <Abstract>Points of interest in New York, New York (on Manhattan). One of the attributes contains the name of a file with a picture of the point of interest.</Abstract>
+        <KeywordList>
+          <Keyword>poi</Keyword>
+          <Keyword>Manhattan</Keyword>
+          <Keyword>DS_poi</Keyword>
+          <Keyword>points_of_interest</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="-74.01244590356289" miny="40.70750285086222" maxx="-74.00795911725866" maxy="40.711989637166425"/>
+        <BoundingBox SRS="EPSG:4326" minx="-74.0118315772888" miny="40.70754683896324" maxx="-74.00153046439813" maxy="40.719885123828675"/>
+        <Style>
+          <Name>poi</Name>
+          <Title>Points of interest</Title>
+          <Abstract>Manhattan points of interest</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:poi"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tiger:tiger_roads</Name>
+        <Title>Manhattan (NY) roads</Title>
+        <Abstract>Highly simplified road layout of Manhattan in New York..</Abstract>
+        <KeywordList>
+          <Keyword>DS_tiger_roads</Keyword>
+          <Keyword>tiger_roads</Keyword>
+          <Keyword>roads</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="-74.06603057" miny="40.68228143" maxx="-73.86819443" maxy="40.880117569999996"/>
+        <BoundingBox SRS="EPSG:4326" minx="-74.02722" miny="40.684221" maxx="-73.907005" maxy="40.878178"/>
+        <Style>
+          <Name>tiger_roads</Name>
+          <Title>Default Styler</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tiger:tiger_roads"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>za:za_natural</Name>
+        <Title>Natural Landmarks in South Africa</Title>
+        <Abstract>This layer describes natural features of South Africa such as forests and lakes.</Abstract>
+        <KeywordList>
+          <Keyword>water</Keyword>
+          <Keyword>forests</Keyword>
+          <Keyword>landmarks</Keyword>
+          <Keyword>Africa</Keyword>
+          <Keyword>South</Keyword>
+          <Keyword>natural</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="16.779241142272962" miny="-36.53577846527099" maxx="32.70336002349853" maxy="-20.611659584045416"/>
+        <BoundingBox SRS="EPSG:4326" minx="16.935359954834" miny="-34.3737831115723" maxx="32.5472412109375" maxy="-22.7736549377441"/>
+        <Style>
+          <Name>za_natural</Name>
+          <Title>Default Styler</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=za:za_natural"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>za:za_points</Name>
+        <Title>Points of Interest in South Africa</Title>
+        <Abstract>Noteworthy locations such as hotels and tourist attractions in South Africa.</Abstract>
+        <KeywordList>
+          <Keyword>of</Keyword>
+          <Keyword>tourist</Keyword>
+          <Keyword>landmarks</Keyword>
+          <Keyword>zoo</Keyword>
+          <Keyword>cities</Keyword>
+          <Keyword>interest</Keyword>
+          <Keyword>attractions</Keyword>
+          <Keyword>points</Keyword>
+          <Keyword>hotel</Keyword>
+          <Keyword>museum</Keyword>
+          <Keyword>picnic</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="14.629095230102537" miny="-47.151258316040014" maxx="39.792314376831065" maxy="-21.988039169311488"/>
+        <BoundingBox SRS="EPSG:4326" minx="16.4827766418457" miny="-46.9045600891113" maxx="37.9386329650879" maxy="-22.2347373962402"/>
+        <Style>
+          <Name>za_points</Name>
+          <Title>Default Styler</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=za:za_points"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>za:za_roads</Name>
+        <Title>South African Roads</Title>
+        <Abstract>This layer describes roads in South Africa.</Abstract>
+        <KeywordList>
+          <Keyword>south</Keyword>
+          <Keyword>africa</Keyword>
+          <Keyword>roads</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="16.29388177871706" miny="-36.85438787460323" maxx="33.04232465744013" maxy="-20.10594499588016"/>
+        <BoundingBox SRS="EPSG:4326" minx="16.4580821990967" miny="-34.8331336975098" maxx="32.8781242370605" maxy="-22.1271991729736"/>
+        <Style>
+          <Name>za_roads</Name>
+          <Title>Default Styler</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=za:za_roads"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>za:za_vegetation</Name>
+        <Title>South African Vegetation</Title>
+        <Abstract>This layer describes vegetated areas in South Africa, categorized by biome.</Abstract>
+        <KeywordList>
+          <Keyword>south</Keyword>
+          <Keyword>vegetation</Keyword>
+          <Keyword>africa</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="16.30492322921758" miny="-36.855452365875216" maxx="33.05824930191042" maxy="-20.102126293182376"/>
+        <BoundingBox SRS="EPSG:4326" minx="16.4691715240479" miny="-34.8336486816406" maxx="32.8940010070801" maxy="-22.123929977417"/>
+        <Style>
+          <Name>za_vegetation</Name>
+          <Title>Default Styler</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=za:za_vegetation"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:tasmania_cities</Name>
+        <Title>Tasmania cities</Title>
+        <Abstract>Cities in Tasmania (actually, just the capital)</Abstract>
+        <KeywordList>
+          <Keyword>cities</Keyword>
+          <Keyword>Tasmania</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="145.1667856" miny="-43.706631400000006" maxx="148.30373440000002" maxy="-40.56968259999999"/>
+        <BoundingBox SRS="EPSG:4326" minx="147.2910004483" miny="-42.851001816890005" maxx="147.2910004483" maxy="-42.851001816890005"/>
+        <Style>
+          <Name>capitals</Name>
+          <Title>Capital cities</Title>
+          <Abstract/>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_cities"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:tasmania_roads</Name>
+        <Title>Tasmania roads</Title>
+        <Abstract>Main Tasmania roads</Abstract>
+        <KeywordList>
+          <Keyword>Roads</Keyword>
+          <Keyword>Tasmania</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="145.1667856" miny="-43.706631400000006" maxx="148.30373440000002" maxy="-40.56968259999999"/>
+        <BoundingBox SRS="EPSG:4326" minx="145.19754" miny="-43.423512" maxx="148.27298000000002" maxy="-40.852802"/>
+        <Style>
+          <Name>simple_roads</Name>
+          <Title>Default Styler for simple road segments</Title>
+          <Abstract>Light red line, 2px wide</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_roads"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:tasmania_state_boundaries</Name>
+        <Title>Tasmania state boundaries</Title>
+        <Abstract>Tasmania state boundaries</Abstract>
+        <KeywordList>
+          <Keyword>boundaries</Keyword>
+          <Keyword>tasmania_state_boundaries</Keyword>
+          <Keyword>Tasmania</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="143.74100879660003" miny="-44.026947203400006" maxx="148.57295620340003" maxy="-39.194999796599994"/>
+        <BoundingBox SRS="EPSG:4326" minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>
+        <Style>
+          <Name>green</Name>
+          <Title>Green polygon</Title>
+          <Abstract>Green fill with black outline</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_state_boundaries"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:tasmania_water_bodies</Name>
+        <Title>Tasmania water bodies</Title>
+        <Abstract>Tasmania water bodies</Abstract>
+        <KeywordList>
+          <Keyword>Lakes</Keyword>
+          <Keyword>Bodies</Keyword>
+          <Keyword>Australia</Keyword>
+          <Keyword>Water</Keyword>
+          <Keyword>Tasmania</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="145.95490063999998" miny="-43.04450786" maxx="147.23641436" maxy="-41.762994139999996"/>
+        <BoundingBox SRS="EPSG:4326" minx="145.97161899999998" miny="-43.031944" maxx="147.219696" maxy="-41.775558"/>
+        <Style>
+          <Name>cite_lakes</Name>
+          <Title>Blue lake</Title>
+          <Abstract>A blue fill, solid black outline style</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:tasmania_water_bodies"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:states</Name>
+        <Title>USA Population</Title>
+        <Abstract>This is some census data on the states.</Abstract>
+        <KeywordList>
+          <Keyword>census</Keyword>
+          <Keyword>united</Keyword>
+          <Keyword>boundaries</Keyword>
+          <Keyword>state</Keyword>
+          <Keyword>states</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="-125.30903773" miny="7.705448770000002" maxx="-66.39223326999999" maxy="66.62225323"/>
+        <BoundingBox SRS="EPSG:4326" minx="-124.73142200000001" miny="24.955967" maxx="-66.969849" maxy="49.371735"/>
+        <Style>
+          <Name>population</Name>
+          <Title>Population in the United States</Title>
+          <Abstract>A sample filter that filters the United States into three
+        categories of population, drawn in different colors</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tike:waterways</Name>
+        <Title>Waterways</Title>
+        <Abstract>Waterways in Finland.</Abstract>
+        <KeywordList>
+          <Keyword>Finland</Keyword>
+          <Keyword>waterways</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="19.530168895721403" miny="58.860618000030506" maxx="31.6566005897522" maxy="70.9870496940613"/>
+        <BoundingBox SRS="EPSG:4326" minx="19.649055480957" miny="59.9357719421387" maxx="31.5377140045166" maxy="69.9118957519531"/>
+        <Style>
+          <Name>line</Name>
+          <Title>1 px blue line</Title>
+          <Abstract>Default line style, 1 pixel wide blue</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tike:waterways"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tike:railways</Name>
+        <Title>roads_Type</Title>
+        <Abstract>Generated from tike</Abstract>
+        <KeywordList>
+          <Keyword>tike</Keyword>
+          <Keyword>roads</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="-297176.16529836657" miny="-1.2694600326676274E7" maxx="3.0016785704606913E7" maxy="1.7619361543229006E7"/>
+        <BoundingBox SRS="EPSG:4326" minx="19.5393085479736" miny="-2277.78344726562" maxx="2.971959E7" maxy="4927039.0"/>
+        <Style>
+          <Name>line</Name>
+          <Title>1 px blue line</Title>
+          <Abstract>Default line style, 1 pixel wide blue</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tike:railways"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tike:roads</Name>
+        <Title>roads_Type</Title>
+        <Abstract>Generated from tike</Abstract>
+        <KeywordList>
+          <Keyword>tike</Keyword>
+          <Keyword>roads</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="-297176.16529836657" miny="-1.2694600326676274E7" maxx="3.0016785704606913E7" maxy="1.7619361543229006E7"/>
+        <BoundingBox SRS="EPSG:4326" minx="19.5393085479736" miny="-2277.78344726562" maxx="2.971959E7" maxy="4927039.0"/>
+        <Style>
+          <Name>line</Name>
+          <Title>1 px blue line</Title>
+          <Abstract>Default line style, 1 pixel wide blue</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tike:roads"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>og:roads</Name>
+        <Title>roads_Type</Title>
+        <Abstract>Generated from sf_reset</Abstract>
+        <KeywordList>
+          <Keyword>roads</Keyword>
+          <Keyword>sf_reset</Keyword>
+        </KeywordList>
+        <SRS>EPSG:26713</SRS>
+        <!--WKT definition of this CRS:
+PROJCS["NAD27 / UTM zone 13N", 
+  GEOGCS["NAD27", 
+    DATUM["North American Datum 1927", 
+      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], 
+      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], 
+      AUTHORITY["EPSG","6267"]], 
+    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+    UNIT["degree", 0.017453292519943295], 
+    AXIS["Geodetic longitude", EAST], 
+    AXIS["Geodetic latitude", NORTH], 
+    AUTHORITY["EPSG","4267"]], 
+  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], 
+  PARAMETER["central_meridian", -105.0], 
+  PARAMETER["latitude_of_origin", 0.0], 
+  PARAMETER["scale_factor", 0.9996], 
+  PARAMETER["false_easting", 500000.0], 
+  PARAMETER["false_northing", 0.0], 
+  UNIT["m", 1.0], 
+  AXIS["Easting", EAST], 
+  AXIS["Northing", NORTH], 
+  AUTHORITY["EPSG","26713"]]-->
+        <LatLonBoundingBox minx="-103.88042792817339" miny="44.308776913708805" maxx="-103.62014761945467" maxy="44.56905722242751"/>
+        <BoundingBox SRS="EPSG:26713" minx="589434.8125" miny="4914006.0" maxx="609527.25" maxy="4928377.0"/>
+        <Style>
+          <Name>simple_roads</Name>
+          <Title>Default Styler for simple road segments</Title>
+          <Abstract>Light red line, 2px wide</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=og:roads"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>tike:points</Name>
+        <Title>roads_Type</Title>
+        <Abstract>Generated from tike</Abstract>
+        <KeywordList>
+          <Keyword>tike</Keyword>
+          <Keyword>roads</Keyword>
+        </KeywordList>
+        <SRS>EPSG:4326</SRS>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <LatLonBoundingBox minx="19.73377216339108" miny="59.107116584777835" maxx="31.40053188323972" maxy="70.77387630462647"/>
+        <BoundingBox SRS="EPSG:4326" minx="19.8481521606445" miny="59.8213005065918" maxx="31.2861518859863" maxy="70.0596923828125"/>
+        <Style>
+          <Name>line</Name>
+          <Title>1 px blue line</Title>
+          <Abstract>Default line style, 1 pixel wide blue</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=tike:points"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>topp:bluemarble</Name>
+        <Title>Blue Marble Imagery</Title>
+        <Abstract>Blue Marble NG global bathymetry and topography data from NASA.  More information about the Blue Marble NG project is available from http://earthobservatory.nasa.gov/Features/BlueMarble .</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>bluemarble</Keyword>
+          <Keyword>bluemarble</Keyword>
+        </KeywordList>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-180.00000003333" miny="-89.99999996486703" maxx="179.99999993067" maxy="90.000000033333"/>
+        <BoundingBox SRS="EPSG:4326" minx="-180.00000003333" miny="-89.99999996486703" maxx="179.99999993067" maxy="90.000000033333"/>
+        <Style>
+          <Name>raster</Name>
+          <Title>Raster</Title>
+          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:bluemarble"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>nurc:Arc_Sample</Name>
+        <Title>Global annual rainfall</Title>
+        <Abstract>Global annual rainfall in ArcGrid format</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>arcGridSample</Keyword>
+          <Keyword>arcGridSample_Coverage</Keyword>
+        </KeywordList>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
+        <BoundingBox SRS="EPSG:4326" minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
+        <Style>
+          <Name>raster</Name>
+          <Title>Raster</Title>
+          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=nurc:Arc_Sample"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>nurc:Img_Sample</Name>
+        <Title>North America sample imagery</Title>
+        <Abstract>A very rough imagery of North America</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>worldImageSample</Keyword>
+          <Keyword>worldImageSample_Coverage</Keyword>
+        </KeywordList>
+        <!--WKT definition of this CRS:
+GEOGCS["WGS 84", 
+  DATUM["World Geodetic System 1984", 
+    SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], 
+    AUTHORITY["EPSG","6326"]], 
+  PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+  UNIT["degree", 0.017453292519943295], 
+  AXIS["Geodetic longitude", EAST], 
+  AXIS["Geodetic latitude", NORTH], 
+  AUTHORITY["EPSG","4326"]]-->
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-130.85168" miny="20.7052" maxx="-62.0054" maxy="54.1141"/>
+        <BoundingBox SRS="EPSG:4326" minx="-130.85168" miny="20.7052" maxx="-62.0054" maxy="54.1141"/>
+        <Style>
+          <Name>raster</Name>
+          <Title>Raster</Title>
+          <Abstract>A sample style for rasters, good for displaying imagery</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=nurc:Img_Sample"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>sf:sfdem</Name>
+        <Title>Spearfish DEM</Title>
+        <Abstract>Digital Elevation Model data for Spearfish, South Dakota</Abstract>
+        <KeywordList>
+          <Keyword>WCS</Keyword>
+          <Keyword>sf</Keyword>
+          <Keyword>dem</Keyword>
+          <Keyword>digital</Keyword>
+          <Keyword>elevation</Keyword>
+          <Keyword>model</Keyword>
+        </KeywordList>
+        <!--WKT definition of this CRS:
+PROJCS["NAD27 / UTM zone 13N", 
+  GEOGCS["NAD27", 
+    DATUM["North American Datum 1927", 
+      SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], 
+      TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], 
+      AUTHORITY["EPSG","6267"]], 
+    PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], 
+    UNIT["degree", 0.017453292519943295], 
+    AXIS["Geodetic longitude", EAST], 
+    AXIS["Geodetic latitude", NORTH], 
+    AUTHORITY["EPSG","4267"]], 
+  PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], 
+  PARAMETER["central_meridian", -105.0], 
+  PARAMETER["latitude_of_origin", 0.0], 
+  PARAMETER["scale_factor", 0.9996], 
+  PARAMETER["false_easting", 500000.0], 
+  PARAMETER["false_northing", 0.0], 
+  UNIT["m", 1.0], 
+  AXIS["Easting", EAST], 
+  AXIS["Northing", NORTH], 
+  AUTHORITY["EPSG","26713"]]-->
+        <SRS>EPSG:26713</SRS>
+        <LatLonBoundingBox minx="-103.87108701853181" miny="44.370187074132616" maxx="-103.62940739432703" maxy="44.5016011535299"/>
+        <BoundingBox SRS="EPSG:26713" minx="589980.0" miny="4913700.0" maxx="609000.0" maxy="4928010.0"/>
+        <Style>
+          <Name>dem</Name>
+          <Title>Simple DEM style</Title>
+          <Abstract>Classic elevation color progression</Abstract>
+          <LegendURL width="20" height="20">
+            <Format>image/png</Format>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://demo.opengeo.org/geoserver/wms/GetLegendGraphic?VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=sf:sfdem"/>
+          </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="0">
+        <Name>tasmania</Name>
+        <Title>tasmania</Title>
+        <Abstract>Layer-Group type layer: tasmania</Abstract>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>
+        <BoundingBox SRS="EPSG:4326" minx="143.83482400000003" miny="-43.648056" maxx="148.47914100000003" maxy="-39.573891"/>
+      </Layer>
+      <Layer queryable="0">
+        <Name>tiger-ny</Name>
+        <Title>tiger-ny</Title>
+        <Abstract>Layer-Group type layer: tiger-ny</Abstract>
+        <SRS>EPSG:4326</SRS>
+        <LatLonBoundingBox minx="-74.047185" miny="40.679648" maxx="-73.907005" maxy="40.882078"/>
+        <BoundingBox SRS="EPSG:4326" minx="-74.047185" miny="40.679648" maxx="-73.907005" maxy="40.882078"/>
+      </Layer>
+    </Layer>
+  </Capability>
+</WMT_MS_Capabilities>
diff --git a/tests/throws.js b/tests/throws.js
new file mode 100644
index 0000000..0e2ac9a
--- /dev/null
+++ b/tests/throws.js
@@ -0,0 +1,82 @@
+/*
+
+  throws.js -- Adds a `throws_` method to AnotherWay test objects.
+
+  Copyright 2005 OpenLayers Contributors. released under the BSD License.
+
+
+  A reference to this file needs to be added to `run-tests.html` in the
+  head element after the AnotherWay classes are created:
+
+    <script type="text/javascript" src="throws.js"></script>
+
+  Then, it can be used just like the `ok`, `fail` and other such methods
+  in your unit tests.
+
+  e.g. 
+
+   t.throws_(function () {new OpenLayers.View.Map.Dynamic();},
+             ReferenceError("No container supplied."),
+             "OpenLayers.View.Map.Dynamic instantiation with no container "
+             + "must throw.");
+
+  This was inspired by the `assertRaises` method of Python's unittest
+  library.
+
+  Possible future enhancements:
+
+    * Contribute to official AnotherWay distribution.
+    * Use `apply` rather than require a inner function (or as an option).
+    * Preserve the stack fields.
+
+ */
+
+Test.AnotherWay._test_object_t.prototype.throws_ = 
+function (fn, expectedException, doc) {
+    /*
+      
+       Executes the supplied function object catching any exception(s)
+       thrown, then verifies the supplied expected exception occurred.
+      
+       If no exception is thrown the test fails.
+
+       If an exception is thrown and it does not match the supplied
+       expected exception the test fails.
+
+       If the exception thrown matches the supplied expected exception
+       the test passes.
+
+       Two exceptions "match" if Test.AnotherWay's `eq` method considers
+       the two equal when their respective stacks are ignored.
+
+                      fn - The function object to be executed
+       expectedException - The exception object expected to result
+                     doc - Description of the test
+
+       Note: The name of this method is `throws_` (with a trailing
+             underscore) as `throws` is a reserved identifier and can
+             not be used as a method name.
+
+       Note: This function does not preserve the stack field associated
+             with either exception.
+
+     */
+    var theCaughtException = null;
+
+    try {
+        fn();
+    } catch (innerCaughtException) {
+        // As `innerCaughtException` is not visible outside the scope
+        // of this `catch` block we need to make it visible explicitly. 
+        theCaughtException = innerCaughtException;
+    }
+
+    if (theCaughtException) {
+        // We delete the stacks before comparison as they will never match.
+        delete theCaughtException.stack;
+        delete expectedException.stack;
+        this.eq(theCaughtException, expectedException, doc);
+    } else {
+        this.fail(doc);
+    }
+};
diff --git a/tests/xml_eq.js b/tests/xml_eq.js
new file mode 100644
index 0000000..47084cd
--- /dev/null
+++ b/tests/xml_eq.js
@@ -0,0 +1,311 @@
+/**
+ * File: xml_eq.js
+ * Adds a xml_eq method to AnotherWay test objects.
+ *
+ */
+
+(function() {
+
+    /**
+     * Function: createNode
+     * Given a string, try to create an XML DOM node.  Throws string messages
+     *     on failure.
+     * 
+     * Parameters:
+     * text - {String} An XML string.
+     *
+     * Returns:
+     * {DOMElement} An element node.
+     */
+    function createNode(text) {
+        
+        var index = text.indexOf('<');
+        if(index > 0) {
+            text = text.substring(index);
+        }
+        
+        var doc;
+        if(window.ActiveXObject && !this.xmldom) {
+            doc = new ActiveXObject("Microsoft.XMLDOM");
+            try {
+                doc.loadXML(text);
+            } catch(err) {
+                throw "ActiveXObject loadXML failed: " + err;
+            }
+        } else if(window.DOMParser) {
+            try {
+                doc = new DOMParser().parseFromString(text, 'text/xml');
+            } catch(err) {
+                throw "DOMParser.parseFromString failed";
+            }
+            if(doc.documentElement && doc.documentElement.nodeName == "parsererror") {
+                throw "DOMParser.parseFromString returned parsererror";
+            }
+        } else {
+            var req = new XMLHttpRequest();
+            req.open("GET", "data:text/xml;charset=utf-8," +
+                     encodeURIComponent(text), false);
+            if(req.overrideMimeType) {
+                req.overrideMimeType("text/xml");
+            }
+            req.send(null);
+            doc = req.responseXML;
+        }
+        
+        var root = doc.documentElement;
+        if(!root) {
+            throw "no documentElement";
+        }
+        return root;
+    }
+    
+    /**
+     * Function assertEqual
+     * Test two objects for equivalence (based on ==).  Throw an exception
+     *     if not equivalent.
+     * 
+     * Parameters:
+     * got - {Object}
+     * expected - {Object}
+     * msg - {String} The message to be thrown.  This message will be appended
+     *     with ": got {got} but expected {expected}" where got and expected are
+     *     replaced with string representations of the above arguments.
+     */
+    function assertEqual(got, expected, msg) {
+        if(got === undefined) {
+            got = "undefined";
+        } else if (got === null) {
+            got = "null";
+        }
+        if(expected === undefined) {
+            expected = "undefined";
+        } else if (expected === null) {
+            expected = "null";
+        }
+        if(got != expected) {
+            throw msg + ": got '" + got + "' but expected '" + expected + "'";
+        }
+    }
+    
+    /**
+     * Function assertElementNodesEqual
+     * Test two element nodes for equivalence.  Nodes are considered equivalent
+     *     if they are of the same type, have the same name, have the same
+     *     namespace prefix and uri, and if all child nodes are equivalent.
+     *     Throws a message as exception if not equivalent.
+     * 
+     * Parameters:
+     * got - {DOMElement}
+     * expected - {DOMElement}
+     * options - {Object} Optional object for configuring test options.
+     *
+     * Valid options:
+     * prefix - {Boolean} Compare element and attribute
+     *     prefixes (namespace uri always tested).  Default is false.
+     * includeWhiteSpace - {Boolean} Include whitespace only nodes when
+     *     comparing child nodes.  Default is false.
+     */
+    function assertElementNodesEqual(got, expected, options) {
+        var testPrefix = (options && options.prefix === true);
+        
+        // compare types
+        assertEqual(got.nodeType, expected.nodeType, "Node type mismatch");
+        
+        // compare names
+        var gotName = testPrefix ?
+            got.nodeName : got.nodeName.split(":").pop();
+        var expName = testPrefix ?
+            expected.nodeName : expected.nodeName.split(":").pop();
+        assertEqual(gotName, expName, "Node name mismatch");
+        
+        // for text nodes compare value
+        if(got.nodeType == 3) {
+            assertEqual(
+                got.nodeValue, expected.nodeValue, "Node value mismatch"
+            );
+        }
+        // for element type nodes compare namespace, attributes, and children
+        else if(got.nodeType == 1) {
+            
+            // test namespace alias and uri
+            if(got.prefix || expected.prefix) {
+                if(testPrefix) {
+                    assertEqual(
+                        got.prefix, expected.prefix,
+                        "Bad prefix for " + got.nodeName
+                    );
+                }
+            }
+            if(got.namespaceURI || expected.namespaceURI) {
+                assertEqual(
+                    got.namespaceURI, expected.namespaceURI,
+                    "Bad namespaceURI for " + got.nodeName
+                );
+            }
+            
+            // compare attributes - disregard xmlns given namespace handling above
+            var gotAttrLen = 0;
+            var gotAttr = {};
+            var expAttrLen = 0;
+            var expAttr = {};
+            var ga, ea, gn, en;
+            for(var i=0; i<got.attributes.length; ++i) {
+                ga = got.attributes[i];
+                if(ga.specified === undefined || ga.specified === true) {
+                    if(ga.name.split(":").shift() != "xmlns") {
+                        gn = testPrefix ? ga.name : ga.name.split(":").pop();
+                        gotAttr[gn] = ga;
+                        ++gotAttrLen;
+                    }
+                }
+            }
+            for(var i=0; i<expected.attributes.length; ++i) {
+                ea = expected.attributes[i];
+                if(ea.specified === undefined || ea.specified === true) {
+                    if(ea.name.split(":").shift() != "xmlns") {
+                        en = testPrefix ? ea.name : ea.name.split(":").pop();
+                        expAttr[en] = ea;
+                        ++expAttrLen;
+                    }
+                }
+            }
+            assertEqual(
+                gotAttrLen, expAttrLen,
+                "Attributes length mismatch for " + got.nodeName
+            );
+            var gv, ev;
+            for(var name in gotAttr) {
+                if(expAttr[name] == undefined) {
+                    throw "Attribute name " + gotAttr[name].name + " expected for element " + got.nodeName;
+                }
+                // test attribute namespace
+                assertEqual(
+                    gotAttr[name].namespaceURI, expAttr[name].namespaceURI,
+                    "Attribute namespace mismatch for element " +
+                    got.nodeName + " attribute name " + gotAttr[name].name
+                );
+                // test attribute value
+                assertEqual(
+                    gotAttr[name].value, expAttr[name].value,
+                    "Attribute value mismatch for element " + got.nodeName +
+                    " attribute name " + gotAttr[name].name
+                );
+            }
+            
+            // compare children
+            var gotChildNodes = getChildNodes(got, options);
+            var expChildNodes = getChildNodes(expected, options);
+
+            assertEqual(
+                gotChildNodes.length, expChildNodes.length,
+                "Children length mismatch for " + got.nodeName
+            );
+            for(var j=0; j<gotChildNodes.length; ++j) {
+                try {
+                    assertElementNodesEqual(
+                        gotChildNodes[j], expChildNodes[j], options
+                    );
+                } catch(err) {
+                    throw "Bad child " + j + " for element " + got.nodeName + ": " + err;
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Function getChildNodes
+     * Returns the child nodes of the specified nodes. By default this method
+     *     will ignore child text nodes which are made up of whitespace content.
+     *     The 'includeWhiteSpace' option is used to control this behaviour.
+     * 
+     * Parameters:
+     * node - {DOMElement}
+     * options - {Object} Optional object for test configuration.
+     * 
+     * Valid options:
+     * includeWhiteSpace - {Boolean} Include whitespace only nodes when
+     *     comparing child nodes.  Default is false.
+     * 
+     * Returns:
+     * {Array} of {DOMElement}
+     */
+    function getChildNodes(node, options) {
+        //check whitespace
+        if (options && options.includeWhiteSpace) {
+            return node.childNodes;
+        }
+        else {
+           nodes = [];
+           for (var i = 0; i < node.childNodes.length; i++ ) {
+              var child = node.childNodes[i];
+              if (child.nodeType == 1) {
+                 //element node, add it 
+                 nodes.push(child);
+              }
+              else if (child.nodeType == 3) {
+                 //text node, add if non empty
+                 if (child.nodeValue && 
+                       child.nodeValue.replace(/^\s*(.*?)\s*$/, "$1") != "" ) { 
+
+                    nodes.push(child);
+                 }
+              }
+           }
+  
+           return nodes;
+        }
+    } 
+    
+    /**
+     * Function: Test.AnotherWay._test_object_t.xml_eq
+     * Test if two XML nodes are equivalent.  Tests for same node types, same
+     *     node names, same namespace URI, same attributes, and recursively
+     *     tests child nodes for same criteria.
+     *
+     * (code)
+     * t.xml_eq(got, expected, message);
+     * (end)
+     * 
+     * Parameters:
+     * got - {DOMElement | String} A DOM node or XML string to test.
+     * expected - {DOMElement | String} The expected DOM node or XML string.
+     * msg - {String} A message to print with test output.
+     * options - {Object} Optional object for configuring test.
+     *
+     * Valid options:
+     * prefix - {Boolean} Compare element and attribute
+     *     prefixes (namespace uri always tested).  Default is false.
+     * includeWhiteSpace - {Boolean} Include whitespace only nodes when
+     *     comparing child nodes.  Default is false.
+     */
+    var proto = Test.AnotherWay._test_object_t.prototype;
+    proto.xml_eq = function(got, expected, msg, options) {
+        // convert arguments to nodes if string
+        if(typeof got == "string") {
+            try {
+                got = createNode(got);
+            } catch(err) {
+                this.fail(msg + ": got argument could not be converted to an XML node: " + err);
+                return;
+            }
+        }
+        if(typeof expected == "string") {
+            try {
+                expected = createNode(expected);
+            } catch(err) {
+                this.fail(msg + ": expected argument could not be converted to an XML node: " + err);
+                return;
+            }
+        }
+        
+        // test nodes for equivalence
+        try {
+            assertElementNodesEqual(got, expected, options);
+            this.ok(true, msg);
+        } catch(err) {
+            this.fail(msg + ": " + err);
+        }
+    }
+    
+})();
diff --git a/theme/default/framedCloud.css b/theme/default/framedCloud.css
new file mode 100644
index 0000000..e69de29
diff --git a/theme/default/google.css b/theme/default/google.css
new file mode 100644
index 0000000..3c1c187
--- /dev/null
+++ b/theme/default/google.css
@@ -0,0 +1,10 @@
+.olLayerGoogleCopyright {
+    right: 3px;
+    bottom: 2px;
+    left: auto;  
+}
+.olLayerGooglePoweredBy {
+    left: 2px;
+    bottom: 2px;   
+}
+
diff --git a/theme/default/ie6-style.css b/theme/default/ie6-style.css
new file mode 100644
index 0000000..65f6b19
--- /dev/null
+++ b/theme/default/ie6-style.css
@@ -0,0 +1,7 @@
+.olControlZoomPanel div {
+    background-image: url(img/zoom-panel-NOALPHA.png);
+}
+.olControlPanPanel div {
+    background-image: url(img/pan-panel-NOALPHA.png);
+}
+
diff --git a/theme/default/img/add_point_off.png b/theme/default/img/add_point_off.png
new file mode 100644
index 0000000..aefd09c
Binary files /dev/null and b/theme/default/img/add_point_off.png differ
diff --git a/theme/default/img/add_point_on.png b/theme/default/img/add_point_on.png
new file mode 100644
index 0000000..1294a2c
Binary files /dev/null and b/theme/default/img/add_point_on.png differ
diff --git a/theme/default/img/blank.gif b/theme/default/img/blank.gif
new file mode 100644
index 0000000..4bcc753
Binary files /dev/null and b/theme/default/img/blank.gif differ
diff --git a/theme/default/img/close.gif b/theme/default/img/close.gif
new file mode 100644
index 0000000..a8958de
Binary files /dev/null and b/theme/default/img/close.gif differ
diff --git a/theme/default/img/drag-rectangle-off.png b/theme/default/img/drag-rectangle-off.png
new file mode 100644
index 0000000..fc6daf4
Binary files /dev/null and b/theme/default/img/drag-rectangle-off.png differ
diff --git a/theme/default/img/drag-rectangle-on.png b/theme/default/img/drag-rectangle-on.png
new file mode 100644
index 0000000..7f783ce
Binary files /dev/null and b/theme/default/img/drag-rectangle-on.png differ
diff --git a/theme/default/img/draw_line_off.png b/theme/default/img/draw_line_off.png
new file mode 100644
index 0000000..7f15612
Binary files /dev/null and b/theme/default/img/draw_line_off.png differ
diff --git a/theme/default/img/draw_line_on.png b/theme/default/img/draw_line_on.png
new file mode 100644
index 0000000..ba09186
Binary files /dev/null and b/theme/default/img/draw_line_on.png differ
diff --git a/theme/default/img/draw_point_off.png b/theme/default/img/draw_point_off.png
new file mode 100644
index 0000000..fde94bd
Binary files /dev/null and b/theme/default/img/draw_point_off.png differ
diff --git a/theme/default/img/draw_point_on.png b/theme/default/img/draw_point_on.png
new file mode 100644
index 0000000..8804221
Binary files /dev/null and b/theme/default/img/draw_point_on.png differ
diff --git a/theme/default/img/draw_polygon_off.png b/theme/default/img/draw_polygon_off.png
new file mode 100644
index 0000000..53ce9d7
Binary files /dev/null and b/theme/default/img/draw_polygon_off.png differ
diff --git a/theme/default/img/draw_polygon_on.png b/theme/default/img/draw_polygon_on.png
new file mode 100644
index 0000000..2a33376
Binary files /dev/null and b/theme/default/img/draw_polygon_on.png differ
diff --git a/theme/default/img/editing_tool_bar.png b/theme/default/img/editing_tool_bar.png
new file mode 100644
index 0000000..464340e
Binary files /dev/null and b/theme/default/img/editing_tool_bar.png differ
diff --git a/theme/default/img/move_feature_off.png b/theme/default/img/move_feature_off.png
new file mode 100644
index 0000000..9f588db
Binary files /dev/null and b/theme/default/img/move_feature_off.png differ
diff --git a/theme/default/img/move_feature_on.png b/theme/default/img/move_feature_on.png
new file mode 100644
index 0000000..072f066
Binary files /dev/null and b/theme/default/img/move_feature_on.png differ
diff --git a/theme/default/img/navigation_history.png b/theme/default/img/navigation_history.png
new file mode 100644
index 0000000..053d1e0
Binary files /dev/null and b/theme/default/img/navigation_history.png differ
diff --git a/theme/default/img/overview_replacement.gif b/theme/default/img/overview_replacement.gif
new file mode 100644
index 0000000..a82cf5f
Binary files /dev/null and b/theme/default/img/overview_replacement.gif differ
diff --git a/theme/default/img/pan-panel-NOALPHA.png b/theme/default/img/pan-panel-NOALPHA.png
new file mode 100644
index 0000000..2740d8b
Binary files /dev/null and b/theme/default/img/pan-panel-NOALPHA.png differ
diff --git a/theme/default/img/pan-panel.png b/theme/default/img/pan-panel.png
new file mode 100644
index 0000000..9910121
Binary files /dev/null and b/theme/default/img/pan-panel.png differ
diff --git a/theme/default/img/pan_off.png b/theme/default/img/pan_off.png
new file mode 100644
index 0000000..30b2aed
Binary files /dev/null and b/theme/default/img/pan_off.png differ
diff --git a/theme/default/img/pan_on.png b/theme/default/img/pan_on.png
new file mode 100644
index 0000000..d73e7dd
Binary files /dev/null and b/theme/default/img/pan_on.png differ
diff --git a/theme/default/img/panning-hand-off.png b/theme/default/img/panning-hand-off.png
new file mode 100644
index 0000000..4c912ac
Binary files /dev/null and b/theme/default/img/panning-hand-off.png differ
diff --git a/theme/default/img/panning-hand-on.png b/theme/default/img/panning-hand-on.png
new file mode 100644
index 0000000..6094c64
Binary files /dev/null and b/theme/default/img/panning-hand-on.png differ
diff --git a/theme/default/img/remove_point_off.png b/theme/default/img/remove_point_off.png
new file mode 100644
index 0000000..76c8606
Binary files /dev/null and b/theme/default/img/remove_point_off.png differ
diff --git a/theme/default/img/remove_point_on.png b/theme/default/img/remove_point_on.png
new file mode 100644
index 0000000..0ff28fc
Binary files /dev/null and b/theme/default/img/remove_point_on.png differ
diff --git a/theme/default/img/ruler.png b/theme/default/img/ruler.png
new file mode 100644
index 0000000..aa4883b
Binary files /dev/null and b/theme/default/img/ruler.png differ
diff --git a/theme/default/img/save_features_off.png b/theme/default/img/save_features_off.png
new file mode 100644
index 0000000..2bf2906
Binary files /dev/null and b/theme/default/img/save_features_off.png differ
diff --git a/theme/default/img/save_features_on.png b/theme/default/img/save_features_on.png
new file mode 100644
index 0000000..93c8f08
Binary files /dev/null and b/theme/default/img/save_features_on.png differ
diff --git a/theme/default/img/view_next_off.png b/theme/default/img/view_next_off.png
new file mode 100644
index 0000000..23c5ac1
Binary files /dev/null and b/theme/default/img/view_next_off.png differ
diff --git a/theme/default/img/view_next_on.png b/theme/default/img/view_next_on.png
new file mode 100644
index 0000000..e41fb7b
Binary files /dev/null and b/theme/default/img/view_next_on.png differ
diff --git a/theme/default/img/view_previous_off.png b/theme/default/img/view_previous_off.png
new file mode 100644
index 0000000..b9c230f
Binary files /dev/null and b/theme/default/img/view_previous_off.png differ
diff --git a/theme/default/img/view_previous_on.png b/theme/default/img/view_previous_on.png
new file mode 100644
index 0000000..c009c25
Binary files /dev/null and b/theme/default/img/view_previous_on.png differ
diff --git a/theme/default/img/zoom-panel-NOALPHA.png b/theme/default/img/zoom-panel-NOALPHA.png
new file mode 100644
index 0000000..cdde6fc
Binary files /dev/null and b/theme/default/img/zoom-panel-NOALPHA.png differ
diff --git a/theme/default/img/zoom-panel.png b/theme/default/img/zoom-panel.png
new file mode 100644
index 0000000..f2c7c51
Binary files /dev/null and b/theme/default/img/zoom-panel.png differ
diff --git a/theme/default/style.css b/theme/default/style.css
new file mode 100644
index 0000000..0627f0e
--- /dev/null
+++ b/theme/default/style.css
@@ -0,0 +1,397 @@
+div.olMap {
+    z-index: 0;
+    padding: 0px!important;
+    margin: 0px!important;
+    cursor: default;
+}
+
+div.olMapViewport {
+    text-align: left;
+}
+
+div.olLayerDiv {
+   -moz-user-select: none;
+}
+
+.olLayerGoogleCopyright {
+    left: 2px;
+    bottom: 2px;  
+}
+.olLayerGooglePoweredBy {
+    left: 2px;
+    bottom: 15px;   
+}
+.olControlAttribution {
+    font-size: smaller; 
+    right: 3px; 
+    bottom: 4.5em; 
+    position: absolute; 
+    display: block;
+}
+.olControlScale {
+    right: 3px;
+    bottom: 3em;
+    display: block;
+    position: absolute;
+    font-size: smaller;
+}
+.olControlScaleLine {
+   display: block;
+   position: absolute;
+   left: 10px;
+   bottom: 15px;
+   font-size: xx-small;
+}
+.olControlScaleLineBottom {
+   border: solid 2px black;
+   border-bottom: none;
+   margin-top:-2px;
+   text-align: center;
+}
+.olControlScaleLineTop {
+   border: solid 2px black;
+   border-top: none;
+   text-align: center;
+}
+
+.olControlPermalink {
+    right: 3px;
+    bottom: 1.5em;
+    display: block;
+    position: absolute;
+    font-size: smaller;
+} 
+
+div.olControlMousePosition {
+    bottom: 0em;
+    right: 3px;
+    display: block;
+    position: absolute;
+    font-family: Arial;
+    font-size: smaller;
+}
+
+.olControlOverviewMapContainer {
+    position: absolute;
+    bottom: 0px;
+    right: 0px;
+}
+
+.olControlOverviewMapElement {
+    padding: 10px 18px 10px 10px;
+    background-color: #00008B;
+    -moz-border-radius: 1em 0 0 0;
+}
+
+.olControlOverviewMapMinimizeButton {
+    right: 0px;
+    bottom: 80px;
+}    
+
+.olControlOverviewMapMaximizeButton {
+    right: 0px;
+    bottom: 80px;
+}
+
+.olControlOverviewMapExtentRectangle {
+    overflow: hidden;
+    background-image: url("img/blank.gif");
+    cursor: move;
+    border: 2px dotted red;
+}
+.olControlOverviewMapRectReplacement {
+    overflow: hidden;
+    cursor: move;
+    background-image: url("img/overview_replacement.gif");
+    background-repeat: no-repeat;
+    background-position: center;
+}
+
+.olLayerGeoRSSDescription {
+    float:left;
+    width:100%;
+    overflow:auto;
+    font-size:1.0em;
+}
+.olLayerGeoRSSClose {
+    float:right;
+    color:gray;
+    font-size:1.2em;
+    margin-right:6px;
+    font-family:sans-serif;
+}
+.olLayerGeoRSSTitle {
+    float:left;font-size:1.2em;
+}
+
+.olPopupContent {
+    padding:5px;
+    overflow: auto;
+}    
+.olControlNavToolbar { 
+    width:0px;
+    height:0px;
+}    
+.olControlNavToolbar div { 
+  display:block;
+  width:  28px;
+  height: 28px;
+  top: 300px;
+  left: 6px;
+  position: relative;
+}
+
+.olControlNavigationHistory {
+   background-image: url("img/navigation_history.png");
+   background-repeat: no-repeat;
+   width:  24px;
+   height: 24px;
+
+}
+.olControlNavigationHistoryPreviousItemActive { 
+  background-position: 0px 0px;
+}
+.olControlNavigationHistoryPreviousItemInactive { 
+   background-position: 0px -24px;
+}
+.olControlNavigationHistoryNextItemActive { 
+   background-position: -24px 0px;
+}
+.olControlNavigationHistoryNextItemInactive { 
+   background-position: -24px -24px;
+}
+
+.olControlNavToolbar .olControlNavigationItemActive { 
+  background-image: url("img/panning-hand-on.png");
+  background-repeat: no-repeat;
+}
+.olControlNavToolbar .olControlNavigationItemInactive { 
+  background-image: url("img/panning-hand-off.png");
+  background-repeat: no-repeat;
+}
+.olControlNavToolbar .olControlZoomBoxItemActive { 
+  background-image: url("img/drag-rectangle-on.png");
+  background-color: orange;
+  background-repeat: no-repeat;
+}
+.olControlNavToolbar .olControlZoomBoxItemInactive { 
+  background-image: url("img/drag-rectangle-off.png");
+  background-repeat: no-repeat;
+}
+.olControlEditingToolbar  {
+    float:right;
+    right: 0px;
+    height: 30px; 
+    width: 200px;
+}
+.olControlEditingToolbar div { 
+  background-image: url("img/editing_tool_bar.png");
+  background-repeat: no-repeat;
+  float:right;
+  width:  24px;
+  height: 24px;
+  margin: 5px;
+}
+.olControlEditingToolbar .olControlNavigationItemActive { 
+  background-position: -103px -23px; 
+}
+.olControlEditingToolbar .olControlNavigationItemInactive { 
+  background-position: -103px -0px; 
+}
+.olControlEditingToolbar .olControlDrawFeaturePointItemActive { 
+  background-position: -77px -23px; 
+}
+.olControlEditingToolbar .olControlDrawFeaturePointItemInactive { 
+  background-position: -77px -0px; 
+}
+.olControlEditingToolbar .olControlDrawFeaturePathItemInactive { 
+  background-position: -51px 0px; 
+}
+.olControlEditingToolbar .olControlDrawFeaturePathItemActive { 
+  background-position: -51px -23px; 
+}
+.olControlEditingToolbar .olControlDrawFeaturePolygonItemInactive { 
+  background-position: -26px 0px; 
+}
+.olControlEditingToolbar .olControlDrawFeaturePolygonItemActive { 
+  background-position: -26px -23px ;                                                                   
+}
+div.olControlSaveFeaturesItemActive { 
+    background-image: url(img/save_features_on.png);
+    background-repeat: no-repeat;
+    background-position: 0px 1px;
+}
+div.olControlSaveFeaturesItemInactive { 
+    background-image: url(img/save_features_off.png);
+    background-repeat: no-repeat;
+    background-position: 0px 1px;
+}
+
+.olHandlerBoxZoomBox {
+    border: 2px solid red;
+    position: absolute;
+    background-color: white;
+    opacity: 0.50;
+    font-size: 1px;
+    filter: alpha(opacity=50);
+}
+.olHandlerBoxSelectFeature {
+    border: 2px solid blue;
+    position: absolute;
+    background-color: white;
+    opacity: 0.50;
+    font-size: 1px;
+    filter: alpha(opacity=50);
+}   
+
+.olControlPanPanel {
+    top: 10px;
+    left: 5px;
+}  
+
+.olControlPanPanel div {
+    background-image: url(img/pan-panel.png);
+    height: 18px;
+    width: 18px;
+    cursor: pointer;
+    position: absolute;
+}
+
+.olControlPanPanel .olControlPanNorthItemInactive {
+    top: 0px;
+    left: 9px;
+    background-position: 0px 0px;
+}
+.olControlPanPanel .olControlPanSouthItemInactive {
+    top: 36px;
+    left: 9px;
+    background-position: 18px 0px;
+}
+.olControlPanPanel .olControlPanWestItemInactive {
+    position: absolute;
+    top: 18px;
+    left: 0px;
+    background-position: 0px 18px;
+}
+.olControlPanPanel .olControlPanEastItemInactive {
+    top: 18px;
+    left: 18px;
+    background-position: 18px 18px;
+}
+
+.olControlZoomPanel {
+    top: 71px;
+    left: 14px;
+} 
+
+.olControlZoomPanel div {
+    background-image: url(img/zoom-panel.png);
+    position: absolute;
+    height: 18px;
+    width: 18px;
+    cursor: pointer;
+}
+
+.olControlZoomPanel .olControlZoomInItemInactive {
+    top: 0px;
+    left: 0px;
+    background-position: 0px 0px;
+}
+
+.olControlZoomPanel .olControlZoomToMaxExtentItemInactive {
+    top: 18px;
+    left: 0px;
+    background-position: 0px -18px;
+}
+
+.olControlZoomPanel .olControlZoomOutItemInactive {
+    top: 36px;
+    left: 0px;
+    background-position: 0px 18px;
+}
+
+.olPopupCloseBox {
+  background: url("img/close.gif") no-repeat;
+  cursor: pointer;
+}
+
+.olFramedCloudPopupContent {
+    padding: 5px;
+    overflow: auto;
+}
+
+.olControlNoSelect {
+ -moz-user-select: none;
+}
+
+.olImageLoadError {
+    background-color: pink;
+    opacity: 0.5;
+    filter: alpha(opacity=50); /* IE */
+}
+
+/**
+ * Cursor styles
+ */
+
+.olCursorWait {
+    cursor: wait;
+}
+.olDragDown {
+    cursor: move;
+}
+.olDrawBox {
+    cursor: crosshair;
+}
+.olControlDragFeatureOver {
+    cursor: move;
+}
+.olControlDragFeatureActive.olControlDragFeatureOver.olDragDown {
+    cursor: -moz-grabbing;
+}
+
+/**
+ * Layer switcher
+ */
+.olControlLayerSwitcher {
+    position: absolute;
+    top: 25px;
+    right: 0px;
+    width: 20em;
+    font-family: sans-serif;
+    font-weight: bold;
+    margin-top: 3px;
+    margin-left: 3px;
+    margin-bottom: 3px;
+    font-size: smaller;
+    color: white;
+    background-color: transparent;
+}
+
+.olControlLayerSwitcher .layersDiv {
+    padding-top: 5px;
+    padding-left: 10px;
+    padding-bottom: 5px;
+    padding-right: 75px;
+    background-color: darkblue;
+    width: 100%;
+    height: 100%;
+}
+
+.olControlLayerSwitcher .layersDiv .baseLbl,
+.olControlLayerSwitcher .layersDiv .dataLbl {
+    margin-top: 3px;
+    margin-left: 3px;
+    margin-bottom: 3px;
+}
+
+.olControlLayerSwitcher .layersDiv .baseLayersDiv,
+.olControlLayerSwitcher .layersDiv .dataLayersDiv {
+    padding-left: 10px;
+}
+
+.olControlLayerSwitcher .maximizeDiv,
+.olControlLayerSwitcher .minimizeDiv {
+    top: 5px;
+    right: 0px;
+}
diff --git a/tools/README.txt b/tools/README.txt
new file mode 100644
index 0000000..cee5121
--- /dev/null
+++ b/tools/README.txt
@@ -0,0 +1,14 @@
+This directory contains tools used in the packaging or deployment of OpenLayers.
+
+Javascript minimizing tools:
+
+ * jsmin.c, jsmin.py:
+   jsmin.py is a direct translation of the jsmin.c code into Python. jsmin.py
+   will therefore run anyplace Python runs... but at significantly slower speed.
+ 
+ * shrinksafe.py
+   shrinksafe.py calls out to a third party javascript shrinking service. This 
+   creates file sizes about 4% smaller (as of commit 501) of the OpenLayers 
+   code. However, this also has the side effect of making you dependant on the 
+   web service -- and since that service sometimes goes dead, it's risky to 
+   depend on it.
diff --git a/tools/mergejs.py b/tools/mergejs.py
new file mode 100755
index 0000000..865081e
--- /dev/null
+++ b/tools/mergejs.py
@@ -0,0 +1,252 @@
+#!/usr/bin/env python
+#
+# Merge multiple JavaScript source code files into one.
+#
+# Usage:
+# This script requires source files to have dependencies specified in them.
+#
+# Dependencies are specified with a comment of the form:
+#
+#     // @requires <file path>
+#
+#  e.g.
+#
+#    // @requires Geo/DataSource.js
+#
+# This script should be executed like so:
+#
+#     mergejs.py <output.js> <directory> [...]
+#
+# e.g.
+#
+#     mergejs.py openlayers.js Geo/ CrossBrowser/
+#
+#  This example will cause the script to walk the `Geo` and
+#  `CrossBrowser` directories--and subdirectories thereof--and import
+#  all `*.js` files encountered. The dependency declarations will be extracted
+#  and then the source code from imported files will be output to 
+#  a file named `openlayers.js` in an order which fulfils the dependencies
+#  specified.
+#
+#
+# Note: This is a very rough initial version of this code.
+#
+# -- Copyright 2005-2010 OpenLayers contributors / OpenLayers project --
+#
+
+# TODO: Allow files to be excluded. e.g. `Crossbrowser/DebugMode.js`?
+# TODO: Report error when dependency can not be found rather than KeyError.
+
+import re
+import os
+import sys
+
+SUFFIX_JAVASCRIPT = ".js"
+
+RE_REQUIRE = "@requires:? (.*)\n" # TODO: Ensure in comment?
+class SourceFile:
+    """
+    Represents a Javascript source code file.
+    """
+
+    def __init__(self, filepath, source):
+        """
+        """
+        self.filepath = filepath
+        self.source = source
+
+        self.requiredBy = []
+
+
+    def _getRequirements(self):
+        """
+        Extracts the dependencies specified in the source code and returns
+        a list of them.
+        """
+        # TODO: Cache?
+        return re.findall(RE_REQUIRE, self.source)
+
+    requires = property(fget=_getRequirements, doc="")
+
+
+
+def usage(filename):
+    """
+    Displays a usage message.
+    """
+    print "%s [-c <config file>] <output.js> <directory> [...]" % filename
+
+
+class Config:
+    """
+    Represents a parsed configuration file.
+
+    A configuration file should be of the following form:
+
+        [first]
+        3rd/prototype.js
+        core/application.js
+        core/params.js
+        # A comment
+
+        [last]
+        core/api.js # Another comment
+
+        [exclude]
+        3rd/logger.js
+
+    All headings are required.
+
+    The files listed in the `first` section will be forced to load
+    *before* all other files (in the order listed). The files in `last`
+    section will be forced to load *after* all the other files (in the
+    order listed).
+
+    The files list in the `exclude` section will not be imported.
+
+    Any text appearing after a # symbol indicates a comment.
+    
+    """
+
+    def __init__(self, filename):
+        """
+        Parses the content of the named file and stores the values.
+        """
+        lines = [re.sub("#.*?$", "", line).strip() # Assumes end-of-line character is present
+                 for line in open(filename)
+                 if line.strip() and not line.strip().startswith("#")] # Skip blank lines and comments
+
+        self.forceFirst = lines[lines.index("[first]") + 1:lines.index("[last]")]
+
+        self.forceLast = lines[lines.index("[last]") + 1:lines.index("[include]")]
+        self.include =  lines[lines.index("[include]") + 1:lines.index("[exclude]")]
+        self.exclude =  lines[lines.index("[exclude]") + 1:]
+
+def run (sourceDirectory, outputFilename = None, configFile = None):
+    cfg = None
+    if configFile:
+        cfg = Config(configFile)
+
+    allFiles = []
+
+    ## Find all the Javascript source files
+    for root, dirs, files in os.walk(sourceDirectory):
+        for filename in files:
+            if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
+                filepath = os.path.join(root, filename)[len(sourceDirectory)+1:]
+                filepath = filepath.replace("\\", "/")
+                if cfg and cfg.include:
+                    if filepath in cfg.include or filepath in cfg.forceFirst:
+                        allFiles.append(filepath)
+                elif (not cfg) or (filepath not in cfg.exclude):
+                    allFiles.append(filepath)
+
+    ## Header inserted at the start of each file in the output
+    HEADER = "/* " + "=" * 70 + "\n    %s\n" + "   " + "=" * 70 + " */\n\n"
+
+    files = {}
+
+    order = [] # List of filepaths to output, in a dependency satisfying order 
+
+    ## Import file source code
+    ## TODO: Do import when we walk the directories above?
+    for filepath in allFiles:
+        print "Importing: %s" % filepath
+        fullpath = os.path.join(sourceDirectory, filepath).strip()
+        content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
+        files[filepath] = SourceFile(filepath, content) # TODO: Chop path?
+
+    print
+
+    from toposort import toposort
+
+    complete = False
+    resolution_pass = 1
+
+    while not complete:
+        order = [] # List of filepaths to output, in a dependency satisfying order 
+        nodes = []
+        routes = []
+        ## Resolve the dependencies
+        print "Resolution pass %s... " % resolution_pass
+        resolution_pass += 1 
+
+        for filepath, info in files.items():
+            nodes.append(filepath)
+            for neededFilePath in info.requires:
+                routes.append((neededFilePath, filepath))
+
+        for dependencyLevel in toposort(nodes, routes):
+            for filepath in dependencyLevel:
+                order.append(filepath)
+                if not files.has_key(filepath):
+                    print "Importing: %s" % filepath
+                    fullpath = os.path.join(sourceDirectory, filepath).strip()
+                    content = open(fullpath, "U").read() # TODO: Ensure end of line @ EOF?
+                    files[filepath] = SourceFile(filepath, content) # TODO: Chop path?
+        
+
+
+        # Double check all dependencies have been met
+        complete = True
+        try:
+            for fp in order:
+                if max([order.index(rfp) for rfp in files[fp].requires] +
+                       [order.index(fp)]) != order.index(fp):
+                    complete = False
+        except:
+            complete = False
+        
+        print    
+
+
+    ## Move forced first and last files to the required position
+    if cfg:
+        print "Re-ordering files..."
+        order = cfg.forceFirst + [item
+                     for item in order
+                     if ((item not in cfg.forceFirst) and
+                         (item not in cfg.forceLast))] + cfg.forceLast
+    
+    print
+    ## Output the files in the determined order
+    result = []
+
+    for fp in order:
+        f = files[fp]
+        print "Exporting: ", f.filepath
+        result.append(HEADER % f.filepath)
+        source = f.source
+        result.append(source)
+        if not source.endswith("\n"):
+            result.append("\n")
+
+    print "\nTotal files merged: %d " % len(files)
+
+    if outputFilename:
+        print "\nGenerating: %s" % (outputFilename)
+        open(outputFilename, "w").write("".join(result))
+    return "".join(result)
+
+if __name__ == "__main__":
+    import getopt
+
+    options, args = getopt.getopt(sys.argv[1:], "-c:")
+    
+    try:
+        outputFilename = args[0]
+    except IndexError:
+        usage(sys.argv[0])
+        raise SystemExit
+    else:
+        sourceDirectory = args[1]
+        if not sourceDirectory:
+            usage(sys.argv[0])
+            raise SystemExit
+
+    configFile = None
+    if options and options[0][0] == "-c":
+        configFile = options[0][1]
+        print "Parsing configuration file: %s" % filename
+
+    run( sourceDirectory, outputFilename, configFile )
diff --git a/tools/oldot.py b/tools/oldot.py
new file mode 100644
index 0000000..396fb17
--- /dev/null
+++ b/tools/oldot.py
@@ -0,0 +1,43 @@
+import re
+import os    
+def run():
+    sourceDirectory = "../lib/OpenLayers"    
+    allFiles = []
+    SUFFIX_JAVASCRIPT = ".js"
+    ## Find all the Javascript source files
+    for root, dirs, files in os.walk(sourceDirectory):
+        for filename in files:
+            if filename.endswith(SUFFIX_JAVASCRIPT) and not filename.startswith("."):
+                filepath = os.path.join(root, filename)[len(sourceDirectory)+1:]
+                filepath = filepath.replace("\\", "/")
+                data = open(os.path.join(sourceDirectory, filepath)).read()
+                parents = re.search("OpenLayers.Class\((.*?){", data, 
+                      re.DOTALL)
+                if parents:
+                    parents = [x.strip() for x in parents.group(1).strip().strip(",").split(",")]
+                else: 
+                    parents = []
+                cls = "OpenLayers.%s" % filepath.strip(".js").replace("/", ".")
+                allFiles.append([cls, parents])
+    return allFiles
+print """
+digraph name {
+  fontname = "Helvetica"
+  fontsize = 8
+  K = 0.6
+
+  node [
+    fontname = "Helvetica"
+    fontsize = 8
+    shape = "plaintext"
+  ]
+"""
+
+for i in run():
+    print i[0].replace(".", "_")
+    for item in i[1]:
+        if not item: continue
+        print "%s -> %s" % (i[0].replace(".","_"), item.replace(".", "_"))
+    print "; "
+
+print """}"""
diff --git a/tools/release.sh b/tools/release.sh
new file mode 100755
index 0000000..6a227dd
--- /dev/null
+++ b/tools/release.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+VERSION=$1
+
+svn export http://svn.openlayers.org/tags/openlayers/release-$VERSION OpenLayers-$VERSION
+cd OpenLayers-$VERSION/build
+./build.py full
+cp OpenLayers.js ..
+
+cd ..
+
+mkdir doc/devdocs
+mkdir doc/apidocs
+rm tools/*.pyc
+
+mkdir /www/openlayers/htdocs/api/$VERSION
+cp OpenLayers.js /www/openlayers/htdocs/api/$VERSION
+cp -a img/ /www/openlayers/htdocs/api/$VERSION
+cp -a theme/ /www/openlayers/htdocs/api/$VERSION
+
+cd ..
+
+~/nd/NaturalDocs -i OpenLayers-$VERSION/lib -o HTML OpenLayers-$VERSION/doc/devdocs -p OpenLayers-$VERSION/doc_config -s Small OL
+~/nd/NaturalDocs -i OpenLayers-$VERSION/lib -o HTML OpenLayers-$VERSION/doc/apidocs -p OpenLayers-$VERSION/apidoc_config -s Small OL
+
+tar cvfz OpenLayers-$VERSION.tar.gz OpenLayers-$VERSION/
+zip -9r OpenLayers-$VERSION.zip OpenLayers-$VERSION/
+
+cp OpenLayers-$VERSION.* /www/openlayers/htdocs/download 
diff --git a/tools/toposort.py b/tools/toposort.py
new file mode 100644
index 0000000..c3b1be6
--- /dev/null
+++ b/tools/toposort.py
@@ -0,0 +1,260 @@
+#
+# According to <http://www.vrplumber.com/programming/> this file
+# is licensed under a BSD-style license. We only use the section
+# originally by Tim Peters.
+#
+# TODO: The use of this code needs to be okayed by someone.
+#
+
+class RecursionError( OverflowError, ValueError ):
+    '''Unable to calculate result because of recursive structure'''
+    
+
+def sort(nodes, routes, noRecursion=1):
+    '''Passed a list of node IDs and a list of source,dest ID routes
+    attempt to create a list of stages where each sub list
+    is one stage in a process.
+    '''
+    children, parents = _buildChildrenLists(routes)
+    # first stage is those nodes
+    # having no incoming routes...
+    stage = []
+    stages = [stage]
+    taken = []
+    for node in nodes:
+        if (not parents.get(node)):
+            stage.append (node)
+    if nodes and not stage:
+        # there is no element which does not depend on
+        # some other element!!!
+        stage.append( nodes[0])
+    taken.extend( stage )
+    nodes = filter ( lambda x, l=stage: x not in l, nodes )
+    while nodes:
+        previousStageChildren = []
+        nodelen = len(nodes)
+        # second stage are those nodes
+        # which are direct children of the first stage
+        for node in stage:
+            for child in children.get (node, []):
+                if child not in previousStageChildren and child not in taken:
+                    previousStageChildren.append(child)
+                elif child in taken and noRecursion:
+                    raise RecursionError( (child, node) )
+        # unless they are children of other direct children...
+        # TODO, actually do that...
+        stage = previousStageChildren
+        removes = []
+        for current in stage:
+            currentParents = parents.get( current, [] )
+            for parent in currentParents:
+                if parent in stage and parent != current:
+                    # might wind up removing current...
+                    if not current in parents.get(parent, []):
+                        # is not mutually dependent...
+                        removes.append( current )
+        for remove in removes:
+            while remove in stage:
+                stage.remove( remove )
+        stages.append( stage)
+        taken.extend( stage )
+        nodes = filter ( lambda x, l=stage: x not in l, nodes )
+        if nodelen == len(nodes):
+            if noRecursion:
+                raise RecursionError( nodes )
+            else:
+                stages.append( nodes[:] )
+                nodes = []
+    return stages
+
+def _buildChildrenLists (routes):
+    childrenTable = {}
+    parentTable = {}
+    for sourceID,destinationID in routes:
+        currentChildren = childrenTable.get( sourceID, [])
+        currentParents = parentTable.get( destinationID, [])
+        if not destinationID in currentChildren:
+            currentChildren.append ( destinationID)
+        if not sourceID in currentParents:
+            currentParents.append ( sourceID)
+        childrenTable[sourceID] = currentChildren
+        parentTable[destinationID] = currentParents
+    return childrenTable, parentTable
+
+
+def toposort (nodes, routes, noRecursion=1):
+    '''Topological sort from Tim Peters, fairly efficient
+    in comparison (it seems).'''
+    #first calculate the recursion depth
+    
+    dependencies = {}
+    inversedependencies = {}
+    if not nodes:
+        return []
+    if not routes:
+        return [nodes]
+    for node in nodes:
+        dependencies[ node ] = (0, node)
+        inversedependencies[ node ] = []
+    
+    
+    for depended, depends in routes:
+        # is it a null rule
+        try:
+            newdependencylevel, object = dependencies.get ( depends, (0, depends))
+        except TypeError:
+            print depends
+            raise
+        dependencies[ depends ] = (newdependencylevel + 1,  depends)
+        # "dependency (existence) of depended-on"
+        newdependencylevel,object = dependencies.get ( depended, (0, depended) )
+        dependencies[ depended ] = (newdependencylevel, depended)
+        # Inverse dependency set up
+        dependencieslist = inversedependencies.get ( depended, [])
+        dependencieslist.append (depends)
+        inversedependencies[depended] = dependencieslist
+    ### Now we do the actual sorting
+    # The first task is to create the sortable
+    # list of dependency-levels
+    sortinglist = dependencies.values()
+    sortinglist.sort ()
+    output = []
+    while sortinglist:
+        deletelist = []
+        generation = []
+        output.append( generation)
+        while sortinglist and sortinglist[0][0] == 0:
+            number, object = sortinglist[0]
+            generation.append ( object )
+            deletelist.append( object )
+            for inverse in inversedependencies.get(object, () ):
+                try:
+                    oldcount, inverse = dependencies [ inverse]
+                    if oldcount > 0:
+                        # will be dealt with on later pass
+                        dependencies [ inverse] = (oldcount-1, inverse)
+                    else:
+                        # will be dealt with on this pass,
+                        # so needs not to be in the sorting list next time
+                        deletelist.append( inverse )
+                    # just in case a loop comes through
+                    inversedependencies[object] = []
+                except KeyError:
+                    # dealing with a recursion-breaking run...
+                    pass
+            del sortinglist [0]
+        # if no elements could be deleted, then
+        # there is something which depends upon itself
+        if not deletelist:
+            if noRecursion:
+                raise RecursionError( sortinglist )
+            else:
+                # hack so that something gets deleted...
+##                import pdb
+##                pdb.set_trace()
+                dependencies[sortinglist[0][1]] = (0,sortinglist[0][1])
+        # delete the items that were dealt with
+        for item in deletelist:
+            try:
+                del dependencies [ item ]
+            except KeyError:
+                pass
+        # need to recreate the sortinglist
+        sortinglist = dependencies.values()
+        if not generation:
+            output.remove( generation )
+        sortinglist.sort ()
+    return output
+
+
+
+
+
+if __name__ == "__main__":
+
+    nodes = ['a', 'b', 'c', 'd', 'e', 'f']
+    route = [('a', 'b'), ('b', 'c'), ('b', 'd'), ('e','f')]
+
+    for x in  toposort( nodes, route):
+        for a in x:
+            print a
+
+    raise SystemExit
+
+
+
+    import pprint, traceback
+    nodes= [ 0,1,2,3,4,5 ]
+    testingValues = [
+        [ (0,1),(1,2),(2,3),(3,4),(4,5)],
+        [ (0,1),(0,2),(1,2),(3,4),(4,5)],
+        [
+        (0,1),
+        (0,2),
+        (0,2),
+                    (2,4),
+                    (2,5),
+                (3,2),
+        (0,3)],
+        [
+        (0,1), # 3-element cycle test, no orphan nodes
+        (1,2),
+        (2,0),
+                    (2,4),
+                    (2,5),
+                (3,2),
+        (0,3)],
+        [
+        (0,1),
+        (1,1),
+        (1,1),
+                (1,4),
+                (1,5),
+                (1,2),
+        (3,1),
+        (2,1),
+        (2,0)],
+        [
+            (0,1),
+            (1,0),
+            (0,2),
+            (0,3),
+        ],
+        [
+            (0,1),
+            (1,0),
+            (0,2),
+            (3,1),
+        ],
+    ]
+    print 'sort, no recursion allowed'
+    for index in range(len(testingValues)):
+##        print '    %s -- %s'%( index, testingValues[index])
+        try:
+            print '        ', sort( nodes, testingValues[index] )
+        except:
+            print 'exception raised'
+    print 'toposort, no recursion allowed'
+    for index in range(len(testingValues)):
+##        print '    %s -- %s'%( index, testingValues[index])
+        try:
+            print '        ', toposort( nodes, testingValues[index] )
+        except:
+            print 'exception raised'
+    print 'sort, recursion allowed'
+    for index in range(len(testingValues)):
+##        print '    %s -- %s'%( index, testingValues[index])
+        try:
+            print '        ', sort( nodes, testingValues[index],0 )
+        except:
+            print 'exception raised'
+    print 'toposort, recursion allowed'
+    for index in range(len(testingValues)):
+##        print '    %s -- %s'%( index, testingValues[index])
+        try:
+            print '        ', toposort( nodes, testingValues[index],0 )
+        except:
+            print 'exception raised'
+        
+        
+    

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/openlayers.git



More information about the Pkg-grass-devel mailing list